Get all dependencies of a specific version of a Gem

Gauthier P.'s Avatar

Gauthier P.

06 Jul, 2015 08:26 AM

Hi,

Using RubyGems API, I need to request all versions of a gem (with api/v1/versions/[gem].json), and after that, for each versions, list all dependencies, like the result of api/v1/gems/[gem].json . The problem is that this way only give info about the last version of the gem.

I looked, and the best way I found is to call api/v1/versions/[gem]-[version].json on a specific version, but it doesn't provide the dependencies for this version.

Is there another way to get all dependencies of a gem for a specific version ?

Thank you i advance for your answer.

Sincerely,

  1. Support Staff 1 Posted by André Medeiros on 06 Jul, 2015 08:36 AM

    André Medeiros's Avatar

    Hi Gauthier,

    Can I ask how frequently you need to do this? Maybe a better suited option would be to use data dumps, which you can find here: https://rubygems.org/pages/data

    These are weekly, of course, but if it's not enough there are other ways we can explore.

  2. 2 Posted by Gauthier P. on 06 Jul, 2015 08:57 AM

    Gauthier P.'s Avatar

    Hi,

    To explain a little what is to be done, I'll parse Gemfiles and retrieve all version of each gems and from this, create a dependency tree for all versions of, for example, Rails.

    We have a core that makes requests on the ruby crawler (their is multiple languages and package managers managed) to get information about a gem. After that, the crawler does a series of request for each of the gem' dependencies (the first to recover all versions of the dependance and then, for each version, get information and dependencies, ...).

    We use the JSON format now (I read the file, and I return a new JSON file with the desired information). Keeping this format would be easier for us.

  3. Support Staff 3 Posted by André Medeiros on 06 Jul, 2015 09:00 AM

    André Medeiros's Avatar

    Could http://production.cf.rubygems.org/specs.4.8.gz give you what you need as a baseline for all versions of a gem?

  4. 4 Posted by Gauthier P. on 06 Jul, 2015 09:52 AM

    Gauthier P.'s Avatar

    What's exactly this file ? (I can't open it).

    To illustrate our application and way of working, I just pushed a version of our crawler.
    This is the json for all versions of a gem : http://app-5b1cd150-249e-487e-880b-6582cbfa8bea.cleverapps.io/projects//rails
    For that, all is okay.

    For a specific version, this is the result : http://app-5b1cd150-249e-487e-880b-6582cbfa8bea.cleverapps.io/projects//rails/version
    I want to replace "version" by the number, but actually, it's not possible because rubygems only provide info for the last version (currently, the request is : "https://rubygems.org/api/v1/gems/#{params[:gem]}.json".

    I saw that on the website it's possible to have the same result but for previous versions (like https://rubygems.org/gems/rails/versions/4.1.0). I think that it would not be too hard to add to the API the version management. Do you plan to do it ? Or maybe can I help to do it ? I'm a beginner in ruby but ...

  5. Support Staff 5 Posted by André Medeiros on 06 Jul, 2015 10:32 AM

    André Medeiros's Avatar

    OK, this is super simple.

    ~/Source/sandbox
    ❯ curl -O http://production.cf.rubygems.org/specs.4.8.gz
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100 2392k  100 2392k    0     0  1912k      0  0:00:01  0:00:01 --:--:-- 1912k
    ~/Source/sandbox
    ❯ gunzip specs.4.8.gz
    ~/Source/sandbox
    ❯ irb
    irb(main):001:0> specs = Marshal.load(File.read('specs.4.8')); nil
    => nil
    irb(main):002:0> rails = specs.select { |s| s.first == 'rails' }
    => [["rails", #<Gem::Version "0.8.0">, "ruby"], ["rails", #<Gem::Version "0.8.5">, "ruby"], ["rails", #<Gem::Version "0.9.0">, "ruby"], ["rails", #<Gem::Version "0.9.1">, "ruby"], ["rails", #<Gem::Version "0.9.2">, "ruby"], ["rails", #<Gem::Version "0.9.3">, "ruby"], ["rails", #<Gem::Version "0.9.4">, "ruby"], ["rails", #<Gem::Version "0.9.4.1">, "ruby"], ["rails", #<Gem::Version "0.9.5">, "ruby"], ["rails", #<Gem::Version "0.10.0">, "ruby"], ["rails", #<Gem::Version "0.10.1">, "ruby"], ["rails", #<Gem::Version "0.11.0">, "ruby"], ["rails", #<Gem::Version "0.11.1">, "ruby"], ["rails", #<Gem::Version "0.12.0">, "ruby"], ["rails", #<Gem::Version "0.12.1">, "ruby"], ["rails", #<Gem::Version "0.13.0">, "ruby"], ["rails", #<Gem::Version "0.13.1">, "ruby"], ["rails", #<Gem::Version "0.14.1">, "ruby"], ["rails", #<Gem::Version "0.14.2">, "ruby"], ["rails", #<Gem::Version "0.14.3">, "ruby"], ["rails", #<Gem::Version "0.14.4">, "ruby"], ["rails", #<Gem::Version "1.0.0">, "ruby"], ["rails", #<Gem::Version "1.1.0">, "ruby"], ["rails", #<Gem::Version "1.1.1">, "ruby"], ["rails", #<Gem::Version "1.1.2">, "ruby"], ["rails", #<Gem::Version "1.1.3">, "ruby"], ["rails", #<Gem::Version "1.1.4">, "ruby"], ["rails", #<Gem::Version "1.1.5">, "ruby"], ["rails", #<Gem::Version "1.1.6">, "ruby"], ["rails", #<Gem::Version "1.2.0">, "ruby"], ["rails", #<Gem::Version "1.2.1">, "ruby"], ["rails", #<Gem::Version "1.2.2">, "ruby"], ["rails", #<Gem::Version "1.2.3">, "ruby"], ["rails", #<Gem::Version "1.2.4">, "ruby"], ["rails", #<Gem::Version "1.2.5">, "ruby"], ["rails", #<Gem::Version "1.2.6">, "ruby"], ["rails", #<Gem::Version "2.0.0">, "ruby"], ["rails", #<Gem::Version "2.0.1">, "ruby"], ["rails", #<Gem::Version "2.0.2">, "ruby"], ["rails", #<Gem::Version "2.0.4">, "ruby"], ["rails", #<Gem::Version "2.0.5">, "ruby"], ["rails", #<Gem::Version "2.1.0">, "ruby"], ["rails", #<Gem::Version "2.1.1">, "ruby"], ["rails", #<Gem::Version "2.1.2">, "ruby"], ["rails", #<Gem::Version "2.2.2">, "ruby"], ["rails", #<Gem::Version "2.2.3">, "ruby"], ["rails", #<Gem::Version "2.3.2">, "ruby"], ["rails", #<Gem::Version "2.3.3">, "ruby"], ["rails", #<Gem::Version "2.3.4">, "ruby"], ["rails", #<Gem::Version "2.3.5">, "ruby"], ["rails", #<Gem::Version "2.3.6">, "ruby"], ["rails", #<Gem::Version "2.3.7">, "ruby"], ["rails", #<Gem::Version "2.3.8">, "ruby"], ["rails", #<Gem::Version "2.3.9">, "ruby"], ["rails", #<Gem::Version "2.3.10">, "ruby"], ["rails", #<Gem::Version "2.3.11">, "ruby"], ["rails", #<Gem::Version "2.3.12">, "ruby"], ["rails", #<Gem::Version "2.3.14">, "ruby"], ["rails", #<Gem::Version "2.3.15">, "ruby"], ["rails", #<Gem::Version "2.3.16">, "ruby"], ["rails", #<Gem::Version "2.3.17">, "ruby"], ["rails", #<Gem::Version "2.3.18">, "ruby"], ["rails", #<Gem::Version "3.0.0">, "ruby"], ["rails", #<Gem::Version "3.0.1">, "ruby"], ["rails", #<Gem::Version "3.0.2">, "ruby"], ["rails", #<Gem::Version "3.0.3">, "ruby"], ["rails", #<Gem::Version "3.0.4">, "ruby"], ["rails", #<Gem::Version "3.0.5">, "ruby"], ["rails", #<Gem::Version "3.0.6">, "ruby"], ["rails", #<Gem::Version "3.0.7">, "ruby"], ["rails", #<Gem::Version "3.0.8">, "ruby"], ["rails", #<Gem::Version "3.0.9">, "ruby"], ["rails", #<Gem::Version "3.0.10">, "ruby"], ["rails", #<Gem::Version "3.0.11">, "ruby"], ["rails", #<Gem::Version "3.0.12">, "ruby"], ["rails", #<Gem::Version "3.0.13">, "ruby"], ["rails", #<Gem::Version "3.0.14">, "ruby"], ["rails", #<Gem::Version "3.0.15">, "ruby"], ["rails", #<Gem::Version "3.0.16">, "ruby"], ["rails", #<Gem::Version "3.0.17">, "ruby"], ["rails", #<Gem::Version "3.0.18">, "ruby"], ["rails", #<Gem::Version "3.0.19">, "ruby"], ["rails", #<Gem::Version "3.0.20">, "ruby"], ["rails", #<Gem::Version "3.1.0">, "ruby"], ["rails", #<Gem::Version "3.1.1">, "ruby"], ["rails", #<Gem::Version "3.1.2">, "ruby"], ["rails", #<Gem::Version "3.1.3">, "ruby"], ["rails", #<Gem::Version "3.1.4">, "ruby"], ["rails", #<Gem::Version "3.1.5">, "ruby"], ["rails", #<Gem::Version "3.1.6">, "ruby"], ["rails", #<Gem::Version "3.1.7">, "ruby"], ["rails", #<Gem::Version "3.1.8">, "ruby"], ["rails", #<Gem::Version "3.1.9">, "ruby"], ["rails", #<Gem::Version "3.1.10">, "ruby"], ["rails", #<Gem::Version "3.1.11">, "ruby"], ["rails", #<Gem::Version "3.1.12">, "ruby"], ["rails", #<Gem::Version "3.2.0">, "ruby"], ["rails", #<Gem::Version "3.2.1">, "ruby"], ["rails", #<Gem::Version "3.2.2">, "ruby"], ["rails", #<Gem::Version "3.2.3">, "ruby"], ["rails", #<Gem::Version "3.2.4">, "ruby"], ["rails", #<Gem::Version "3.2.5">, "ruby"], ["rails", #<Gem::Version "3.2.6">, "ruby"], ["rails", #<Gem::Version "3.2.7">, "ruby"], ["rails", #<Gem::Version "3.2.8">, "ruby"], ["rails", #<Gem::Version "3.2.9">, "ruby"], ["rails", #<Gem::Version "3.2.10">, "ruby"], ["rails", #<Gem::Version "3.2.11">, "ruby"], ["rails", #<Gem::Version "3.2.12">, "ruby"], ["rails", #<Gem::Version "3.2.13">, "ruby"], ["rails", #<Gem::Version "3.2.14">, "ruby"], ["rails", #<Gem::Version "3.2.15">, "ruby"], ["rails", #<Gem::Version "3.2.16">, "ruby"], ["rails", #<Gem::Version "3.2.17">, "ruby"], ["rails", #<Gem::Version "3.2.18">, "ruby"], ["rails", #<Gem::Version "3.2.19">, "ruby"], ["rails", #<Gem::Version "3.2.20">, "ruby"], ["rails", #<Gem::Version "3.2.21">, "ruby"], ["rails", #<Gem::Version "3.2.22">, "ruby"], ["rails", #<Gem::Version "4.0.0">, "ruby"], ["rails", #<Gem::Version "4.0.1">, "ruby"], ["rails", #<Gem::Version "4.0.2">, "ruby"], ["rails", #<Gem::Version "4.0.3">, "ruby"], ["rails", #<Gem::Version "4.0.4">, "ruby"], ["rails", #<Gem::Version "4.0.5">, "ruby"], ["rails", #<Gem::Version "4.0.6">, "ruby"], ["rails", #<Gem::Version "4.0.7">, "ruby"], ["rails", #<Gem::Version "4.0.8">, "ruby"], ["rails", #<Gem::Version "4.0.9">, "ruby"], ["rails", #<Gem::Version "4.0.10">, "ruby"], ["rails", #<Gem::Version "4.0.11">, "ruby"], ["rails", #<Gem::Version "4.0.11.1">, "ruby"], ["rails", #<Gem::Version "4.0.12">, "ruby"], ["rails", #<Gem::Version "4.0.13">, "ruby"], ["rails", #<Gem::Version "4.1.0">, "ruby"], ["rails", #<Gem::Version "4.1.1">, "ruby"], ["rails", #<Gem::Version "4.1.2">, "ruby"], ["rails", #<Gem::Version "4.1.3">, "ruby"], ["rails", #<Gem::Version "4.1.4">, "ruby"], ["rails", #<Gem::Version "4.1.5">, "ruby"], ["rails", #<Gem::Version "4.1.6">, "ruby"], ["rails", #<Gem::Version "4.1.7">, "ruby"], ["rails", #<Gem::Version "4.1.7.1">, "ruby"], ["rails", #<Gem::Version "4.1.8">, "ruby"], ["rails", #<Gem::Version "4.1.9">, "ruby"], ["rails", #<Gem::Version "4.1.10">, "ruby"], ["rails", #<Gem::Version "4.1.11">, "ruby"], ["rails", #<Gem::Version "4.1.12">, "ruby"], ["rails", #<Gem::Version "4.2.0">, "ruby"], ["rails", #<Gem::Version "4.2.1">, "ruby"], ["rails", #<Gem::Version "4.2.2">, "ruby"], ["rails", #<Gem::Version "4.2.3">, "ruby"]]
    

    I think this gives you what you need, right?

  6. 6 Posted by Gauthier P. on 06 Jul, 2015 11:28 AM

    Gauthier P.'s Avatar

    Maybe i just bad understand, but what you gave me list only major version of the specified gem (here, rails). The first url I gave in the previous message already do that (you can change the name of the gem in the URL, it'll list all version of the gem). Now, I need the dependencies of a specific version. For example, for Rails 4.2.3, the dependencies are :

    actionmailer = 4.2.3
    actionpack = 4.2.3
    actionview = 4.2.3
    activejob = 4.2.3
    activemodel = 4.2.3
    activerecord = 4.2.3
    activesupport = 4.2.3
    bundler < 2.0, >= 1.3.0
    railties = 4.2.3
    sprockets-rails >= 0

    I can get all dependencies with the api/v1/gems/rails.json url, but it only for the last version. I can't do api/v1/gems/rails-4.0.0.json for example, and it's what i need : the dependencies of a specific version of the gem.

  7. Support Staff 7 Posted by André Medeiros on 06 Jul, 2015 02:12 PM

    André Medeiros's Avatar
  8. 8 Posted by Gauthier P. on 06 Jul, 2015 02:20 PM

    Gauthier P.'s Avatar

    Yeah, I just found that and added it to the application. Well, it take a lot of data for nothing (because it get all dependencies for all version in one request) but it's okay.

    Thank you for your help !

  9. Support Staff 9 Posted by André Medeiros on 06 Jul, 2015 02:25 PM

    André Medeiros's Avatar

    You're welcome. Good luck!

  10. André Medeiros closed this discussion on 06 Jul, 2015 02:25 PM.

Comments are currently closed for this discussion. You can start a new one.

Keyboard shortcuts

Generic

? Show this help
ESC Blurs the current field

Comment Form

r Focus the comment reply box
^ + ↩ Submit the comment

You can use Command ⌘ instead of Control ^ on Mac