module Outdated::CLI

Public Class Methods

run() click to toggle source
# File lib/outdated/cli.rb, line 5
def self.run
  filename = '.outdated.json'
  options = File.exist?(filename) ? JSON.parse(File.read(filename)) : {}
  exclusions = options["exclusions"] || []

  Bundler.ui = Bundler::UI::Shell.new
  current_specs = Bundler.definition.resolve
  definition = Bundler.definition(true)
  definition.resolve_remotely!
  exit_status = 0

  # Bundler.load.dependencies does not include non dev dependencies, not
  # sure why. TODO figure out.
  # current_dependencies = Bundler.load.dependencies.map { |dep| [dep.name, dep] }.to_h
  gemfile_specs = current_specs # .select { |spec| current_dependencies.key? spec.name }

  print "Inspecting gem versions"

  gemfile_specs.sort_by(&:name).each do |used|
    name = used.name
    gem_exclusions = exclusions.find { |exc| exc['gem'] == name } || {}
    excluded_rules = gem_exclusions['rules'] || []

    gem = Outdated::RubyGems.gem(name)
    next if gem.specs.empty?

    used = gem.get(used.version)
    next unless used

    recommended_spec, code = gem.recommend(used, 1.week.ago)

    if code == Outdated::OUTDATED
      next if excluded_rules.include? Outdated::OUTDATED

      puts "\n#{name} #{used.version} is outdated. " \
           "#{recommended_spec.version} published #{recommended_spec.created_at}."
      exit_status = 1
      next
    end

    if code == Outdated::IMMATURE
      next if excluded_rules.include? Outdated::IMMATURE

      puts "\n#{name} #{used.version} is too new and may contain bugs or " \
           'vulnerabilities that are as yet unknown. It was published ' \
           "#{used.created_at}."
      puts " For now use #{recommended_spec.version} instead." if recommended_spec.present?
      exit_status = 1
      next
    end

    putc '.'
  end

  puts "\nGem versions deemed to be sufficiently up-to-date." if exit_status.zero?
  exit_status
end