Sha256: 5b9ab09fd9269ae084e14effff994419a4c1208b004bf484584a5ea5b86ccfcb

Contents?: true

Size: 1.78 KB

Versions: 1

Compression:

Stored size: 1.78 KB

Contents

require 'bundler'
require 'net/http'
require 'uri'
require 'json'

module Lock
  module Gemfile
    class Report
      def self.generate
        new.generate
      end

      def generate
        total_gems = gem_count
        local_gems = locally_available_gemspec_count
        remote_gems = remotely_available_gemspec_count

        puts "Total gems: #{total_gems}"
        puts "Matching gems locally available: #{local_gems} (#{pct_of(local_gems - total_gems, total_gems)} extra)"
        puts "Matching gems remotely available: #{remote_gems} (#{pct_of(remote_gems - total_gems, total_gems)} extra)"
      end

      private

      def gem_count
        @gem_count ||= local_gemfile_dependencies.length
      end

      def locally_available_gemspec_count
        local_gemfile_dependencies.sum do |dep|
          local_versions_for(dep.name).count do |version|
            dep.requirement.satisfied_by?(version)
          end
        end
      end

      def remotely_available_gemspec_count
        local_gemfile_dependencies.sum do |dependency|
          constraint = dependency.requirement
          versions = remote_versions_for(dependency.name)

          versions.count do |version_data|
            constraint.satisfied_by?(Gem::Version.new(version_data['number']))
          end
        end
      end

      def remote_versions_for(gem_name)
        uri = URI("https://rubygems.org/api/v1/versions/#{gem_name}.json")
        response = Net::HTTP.get(uri)
        JSON.parse(response)
      end

      def local_versions_for(gem_name)
        Gem::Specification.find_all_by_name(gem_name).map(&:version)
      end


      def local_gemfile_dependencies
        Bundler.definition.dependencies
      end

      def pct_of(a, b)
        (((a.to_f / b.to_f) * 100)).round(2).to_s + '%'
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
lock-gemfile-0.1.5 lib/lock/gemfile/report.rb