class GemFresh::Outdated

Attributes

gem_info[R]

Public Class Methods

new() click to toggle source
# File lib/gem_fresh/outdated.rb, line 6
def initialize
  @bundler_version = GemVersion.new(::Bundler::VERSION)
  figure_out_outdated_gems
end

Private Instance Methods

extract_newer_bundler_data(version_data) click to toggle source
# File lib/gem_fresh/outdated.rb, line 35
def extract_newer_bundler_data(version_data)
  #
  # Sample lines from `bundle outdated` look like this (without the leading * in some versions):
  #
  # * rspec-rails (newest 3.4.0, installed 3.2.3, requested ~> 3.2.3) in groups "development, test"
  # * zeus (newest 0.15.4, installed 0.13.3) in group "test"
  # * websocket-driver (newest 0.6.3, installed 0.5.4)
  #
  return false if version_data.nil? || version_data.strip.blank?
  versions = version_data.split(', ').map(&:strip).map(&:split) # [["newest", "4.2.5"], ["installed", "3.2.22"], ["requested", "=", "3.2.22"]]
  version_hash = {}
  versions.each { |v| version_hash[v.first.to_sym] = v.last unless v.size > 2 }
  return { available_version: GemVersion.new(version_hash[:newest]),
            current_version: GemVersion.new(version_hash[:installed]) }
end
extract_older_bundler_data(version_data) click to toggle source
# File lib/gem_fresh/outdated.rb, line 51
def extract_older_bundler_data(version_data)
  #
  # Sample lines from `bundle outdated` look like this:
  #
  #   * airbrake (4.1.0 > 3.1.3)
  #   * annotate (2.6.5 > 2.6.0.beta2) Gemfile specifies "= 2.6.0.beta2"
  #   * bootstrap-multiselect-rails (0.9.5 > 0.0.4)
  #   * byebug (3.5.1 > 2.5.0)
  #   * enum_field (0.2.0 bff7873 > 0.2.0)
  #
  versions = version_data.split(" > ").map(&:strip)  # ["0.2.0 bff7873", "0.2.0"]
  versions = versions.map{|v| v.split(/\s/).first} # ["0.2.0", "0.2.0"]
  return { available_version: GemVersion.new(versions.first),
            current_version: GemVersion.new(versions.last) }
end
figure_out_outdated_gems() click to toggle source
# File lib/gem_fresh/outdated.rb, line 13
def figure_out_outdated_gems
  @gem_info ={}
  raw_gem_info_from_bundler.each do |line|
    if @bundler_version.major <= 1 && @bundler_version.minor < 12
      line =~ /\A\s*\*\s+(\S+)\s+\((.+)\).*\Z/
      gem_name = $1
      version_data = $2
      if @bundler_version.minor < 10
        @gem_info[gem_name] = extract_older_bundler_data(version_data)
      else
        @gem_info[gem_name] = extract_newer_bundler_data(version_data)
      end
    else
      # Output from the --porcelain flag is simpler
      line =~ /\A(\S+)\s+\((.+)\).*\Z/
      gem_name = $1
      version_data = $2
      @gem_info[gem_name] = extract_newer_bundler_data(version_data)
    end
  end
end
raw_gem_info_from_bundler() click to toggle source
# File lib/gem_fresh/outdated.rb, line 67
def raw_gem_info_from_bundler
  if @bundler_version.major > 1 || (@bundler_version.major == 1 && @bundler_version.minor >= 12)
    # All lines are useful when using the --porcelain flag
    return %x{ bundle outdated --porcelain }.split("\n").map(&:strip)
  end
  just_the_gem_lines = %x{ bundle outdated }.split("\n").map(&:strip).select do |line|
    line =~ /\A\s*\*\s+\w/
  end
  just_the_gem_lines
end