Class: Gemcompat::CompatibilityChecker

Inherits:
Object
  • Object
show all
Defined in:
lib/gemcompat/compatibility_checker.rb

Overview

Check a lockfile for compatibility

Constant Summary collapse

DATA_DIR =
Pathname.new(__FILE__).join('../../../data')

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(package_name:, target_version:) ⇒ CompatibilityChecker

Returns a new instance of CompatibilityChecker.



9
10
11
12
13
# File 'lib/gemcompat/compatibility_checker.rb', line 9

def initialize(package_name:, target_version:)
  @package_name = package_name
  @target_version = target_version
  load_package_data!(package_name: package_name, target_version: target_version)
end

Instance Attribute Details

#found_incompatibilitiesObject (readonly)

Returns the value of attribute found_incompatibilities.



6
7
8
# File 'lib/gemcompat/compatibility_checker.rb', line 6

def found_incompatibilities
  @found_incompatibilities
end

#package_incompatibilitiesObject (readonly)

Returns the value of attribute package_incompatibilities.



6
7
8
# File 'lib/gemcompat/compatibility_checker.rb', line 6

def package_incompatibilities
  @package_incompatibilities
end

#package_nameObject (readonly)

Returns the value of attribute package_name.



6
7
8
# File 'lib/gemcompat/compatibility_checker.rb', line 6

def package_name
  @package_name
end

#target_versionObject (readonly)

Returns the value of attribute target_version.



6
7
8
# File 'lib/gemcompat/compatibility_checker.rb', line 6

def target_version
  @target_version
end

Instance Method Details

#incompatibility_datafile(package_name:, target_version:) ⇒ Object



23
24
25
# File 'lib/gemcompat/compatibility_checker.rb', line 23

def incompatibility_datafile(package_name:, target_version:)
  DATA_DIR.join("#{package_name}/#{package_version_to_path_part(target_version)}.yaml")
end

#load_package_data!(package_name:, target_version:) ⇒ Object



27
28
29
30
31
32
33
34
35
# File 'lib/gemcompat/compatibility_checker.rb', line 27

def load_package_data!(package_name:, target_version:)
  path = incompatibility_datafile(package_name: package_name, target_version: target_version)
  @package_incompatibilities = YAML.load_file(path).then do |data|
    data.transform_values { |entry| Gem::Version.new(entry[:first_compatible_version]) }
  end
rescue Errno::ENOENT
  puts "#{package_name} v#{target_version} not supported yet"
  exit(1)
end

#package_version_to_path_part(version) ⇒ Object



19
20
21
# File 'lib/gemcompat/compatibility_checker.rb', line 19

def package_version_to_path_part(version)
  version&.gsub('.', '_')
end

#parse_lockfile!(lockfile:) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/gemcompat/compatibility_checker.rb', line 49

def parse_lockfile!(lockfile:)
  @found_incompatibilities = []
  Bundler::LockfileParser.new(lockfile).specs.each do |spec|
    next unless (required_version = package_incompatibilities[spec.name]) && required_version > spec.version

    found_incompatibilities << {
      name: spec.name,
      using_version: spec.version.to_s,
      required_version: required_version.to_s,
    }
  end
end

#report(found_incompatibilities: @found_incompatibilities) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
# File 'lib/gemcompat/compatibility_checker.rb', line 37

def report(found_incompatibilities: @found_incompatibilities)
  welcome(package_name: package_name, target_version: target_version)

  if found_incompatibilities.empty?
    puts 'No incompatibilities found'
  else
    found_incompatibilities.each do |i|
      puts "#{i[:name]}: Using #{i[:using_version]}. Upgrade to #{i[:required_version]}"
    end
  end
end

#welcome(package_name:, target_version:) ⇒ Object



15
16
17
# File 'lib/gemcompat/compatibility_checker.rb', line 15

def welcome(package_name:, target_version:)
  puts "Checking for undocumented incompatibilities with #{package_name} v#{target_version}\n\n"
end