Skip to content

Instantly share code, notes, and snippets.

@tleish
Forked from borama/ruby_gems_age.rb
Created August 15, 2019 21:43
Show Gist options
  • Select an option

  • Save tleish/b7271f1dbd43b1db873476b4538c4af8 to your computer and use it in GitHub Desktop.

Select an option

Save tleish/b7271f1dbd43b1db873476b4538c4af8 to your computer and use it in GitHub Desktop.

Revisions

  1. tleish revised this gist Aug 15, 2019. 1 changed file with 37 additions and 10 deletions.
    47 changes: 37 additions & 10 deletions ruby_gems_age.rb
    Original file line number Diff line number Diff line change
    @@ -5,6 +5,8 @@
    require "json"
    require "date"

    # Dir.chdir '...'

    bundle = `bundle list`

    yearly_stats = {}
    @@ -14,23 +16,48 @@
    gem_name, gem_version = /\s+\*\s+([^ ]+)\s+\((.*)\)/.match(line).to_a[1..-1]

    begin
    gem_json = `curl -s https://rubygems.org/api/v2/rubygems/#{gem_name}/versions/#{gem_version}.json`
    built_at = JSON.parse(gem_json)["built_at"]
    release_date = Date.parse(built_at).to_date
    gem_releases = JSON.parse(`curl -s https://rubygems.org/api/v1/versions/#{gem_name}.json`)

    gem = gem_releases.find { |gem_release| gem_release['number'] == gem_version }
    release_date = Date.parse(gem["built_at"]).to_date
    puts "Current: #{gem_name}, #{gem['number']}, #{release_date.strftime("%Y-%m-%d")}"

    release_year = release_date.strftime("%Y")
    yearly_stats[release_year] ||= {}
    yearly_stats[release_year][:current_count] ||= 0
    yearly_stats[release_year][:current_gems] ||= []

    yearly_stats[release_year][:current_count] += 1
    yearly_stats[release_year][:current_gems] << gem_name

    puts "#{gem_name},#{gem_version},#{release_date.strftime("%Y-%m-%d")}"
    gem = gem_releases.find { |gem_release| gem_release['prerelease'] == false }
    release_date = Date.parse(gem["built_at"]).to_date
    puts "Latest: #{gem_name}, #{gem['number']}, #{release_date.strftime("%Y-%m-%d")}" unless gem['number'] == gem_version

    release_year = release_date.strftime("%Y")
    yearly_stats[release_year] ||= { count: 0, gems: [] }
    yearly_stats[release_year][:count] += 1
    yearly_stats[release_year][:gems] << gem_name
    rescue => e
    puts "#{gem_name},#{gem_version},???"
    yearly_stats[release_year] ||= {}
    yearly_stats[release_year][:latest_count] ||= 0
    yearly_stats[release_year][:latest_gems] ||= []

    yearly_stats[release_year][:latest_count] += 1
    yearly_stats[release_year][:latest_gems] << gem_name

    puts ''
    rescue => e
    puts "Current: #{gem_name}, #{gem_version}, ???\n\n"
    end
    end

    puts
    puts "Yearly summary:"
    puts 'Year, Current, Latest, Current Gems, Latest Gems, Diff'
    yearly_stats.sort.each do |year, data|
    puts "#{year},#{data[:count]},#{data[:gems].join(' ')}"
    puts [
    year,
    data[:current_count].to_i,
    data[:latest_count].to_i,
    Array(data[:current_gems]).join(' '),
    Array(data[:latest_gems]).join(' '),
    (Array(data[:latest_gems]) - Array(data[:current_gems])).join(' ')
    ].join(", ")
    end
  2. @borama borama revised this gist Aug 10, 2019. No changes.
  3. @borama borama revised this gist Aug 7, 2019. No changes.
  4. @borama borama created this gist Aug 7, 2019.
    36 changes: 36 additions & 0 deletions ruby_gems_age.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,36 @@
    #!/bin/env ruby
    #
    # Collects info about the age of all gems in the project
    #
    require "json"
    require "date"

    bundle = `bundle list`

    yearly_stats = {}
    bundle.split(/\n/).each do |line|
    next unless line =~ /\s+\*\s+[^ ]+\s+\(.*\)/

    gem_name, gem_version = /\s+\*\s+([^ ]+)\s+\((.*)\)/.match(line).to_a[1..-1]

    begin
    gem_json = `curl -s https://rubygems.org/api/v2/rubygems/#{gem_name}/versions/#{gem_version}.json`
    built_at = JSON.parse(gem_json)["built_at"]
    release_date = Date.parse(built_at).to_date

    puts "#{gem_name},#{gem_version},#{release_date.strftime("%Y-%m-%d")}"

    release_year = release_date.strftime("%Y")
    yearly_stats[release_year] ||= { count: 0, gems: [] }
    yearly_stats[release_year][:count] += 1
    yearly_stats[release_year][:gems] << gem_name
    rescue => e
    puts "#{gem_name},#{gem_version},???"
    end
    end

    puts
    puts "Yearly summary:"
    yearly_stats.sort.each do |year, data|
    puts "#{year},#{data[:count]},#{data[:gems].join(' ')}"
    end