Class: Bundler::GemVersionPromoter
- Inherits:
-
Object
- Object
- Bundler::GemVersionPromoter
- Defined in:
- lib/bundler/gem_version_promoter.rb
Overview
This class contains all of the logic for determining the next version of a Gem to update to based on the requested level (patch, minor, major). Primarily designed to work with Resolver which will provide it the list of available dependency versions as found in its index, before returning it to to the resolution engine to select the best version.
Constant Summary collapse
- DEBUG =
ENV["BUNDLER_DEBUG_RESOLVER"] || ENV["DEBUG_RESOLVER"]
Instance Attribute Summary collapse
-
#level ⇒ Object
Returns the value of attribute level.
-
#locked_specs ⇒ Object
readonly
Returns the value of attribute locked_specs.
-
#prerelease_specified ⇒ Object
Returns the value of attribute prerelease_specified.
-
#strict ⇒ Object
By default, strict is false, meaning every available version of a gem is returned from sort_versions.
-
#unlock_gems ⇒ Object
readonly
Returns the value of attribute unlock_gems.
Instance Method Summary collapse
-
#initialize(locked_specs = SpecSet.new([]), unlock_gems = []) ⇒ GemVersionPromoter
constructor
Given a list of locked_specs and a list of gems to unlock creates a GemVersionPromoter instance.
-
#major? ⇒ bool
Convenience method for testing value of level variable.
-
#minor? ⇒ bool
Convenience method for testing value of level variable.
-
#sort_versions(dep, spec_groups) ⇒ SpecGroup
Given a Dependency and an Array of SpecGroups of available versions for a gem, this method will return the Array of SpecGroups sorted (and possibly truncated if strict is true) in an order to give preference to the current level (:major, :minor or :patch) when resolution is deciding what versions best resolve all dependencies in the bundle.
Constructor Details
#initialize(locked_specs = SpecSet.new([]), unlock_gems = []) ⇒ GemVersionPromoter
Given a list of locked_specs and a list of gems to unlock creates a GemVersionPromoter instance.
38 39 40 41 42 43 44 45 |
# File 'lib/bundler/gem_version_promoter.rb', line 38 def initialize(locked_specs = SpecSet.new([]), unlock_gems = []) @level = :major @strict = false @locked_specs = locked_specs @unlock_gems = unlock_gems @sort_versions = {} @prerelease_specified = {} end |
Instance Attribute Details
#level ⇒ Object
Returns the value of attribute level.
12 13 14 |
# File 'lib/bundler/gem_version_promoter.rb', line 12 def level @level end |
#locked_specs ⇒ Object (readonly)
Returns the value of attribute locked_specs.
12 13 14 |
# File 'lib/bundler/gem_version_promoter.rb', line 12 def locked_specs @locked_specs end |
#prerelease_specified ⇒ Object
Returns the value of attribute prerelease_specified.
27 28 29 |
# File 'lib/bundler/gem_version_promoter.rb', line 27 def prerelease_specified @prerelease_specified end |
#strict ⇒ Object
By default, strict is false, meaning every available version of a gem is returned from sort_versions. The order gives preference to the requested level (:patch, :minor, :major) but in complicated requirement cases some gems will by necessity by promoted past the requested level, or even reverted to older versions.
If strict is set to true, the results from sort_versions will be truncated, eliminating any version outside the current level scope. This can lead to unexpected outcomes or even VersionConflict exceptions that report a version of a gem not existing for versions that indeed do existing in the referenced source.
25 26 27 |
# File 'lib/bundler/gem_version_promoter.rb', line 25 def strict @strict end |
#unlock_gems ⇒ Object (readonly)
Returns the value of attribute unlock_gems.
12 13 14 |
# File 'lib/bundler/gem_version_promoter.rb', line 12 def unlock_gems @unlock_gems end |
Instance Method Details
#major? ⇒ bool
Returns Convenience method for testing value of level variable.
92 93 94 |
# File 'lib/bundler/gem_version_promoter.rb', line 92 def major? level == :major end |
#minor? ⇒ bool
Returns Convenience method for testing value of level variable.
97 98 99 |
# File 'lib/bundler/gem_version_promoter.rb', line 97 def minor? level == :minor end |
#sort_versions(dep, spec_groups) ⇒ SpecGroup
Given a Dependency and an Array of SpecGroups of available versions for a gem, this method will return the Array of SpecGroups sorted (and possibly truncated if strict is true) in an order to give preference to the current level (:major, :minor or :patch) when resolution is deciding what versions best resolve all dependencies in the bundle.
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/bundler/gem_version_promoter.rb', line 68 def sort_versions(dep, spec_groups) before_result = "before sort_versions: #{debug_format_result(dep, spec_groups).inspect}" if DEBUG @sort_versions[dep] ||= begin gem_name = dep.name # An Array per version returned, different entries for different platforms. # We only need the version here so it's ok to hard code this to the first instance. locked_spec = locked_specs[gem_name].first if strict filter_dep_specs(spec_groups, locked_spec) else sort_dep_specs(spec_groups, locked_spec) end.tap do |specs| if DEBUG warn before_result warn " after sort_versions: #{debug_format_result(dep, specs).inspect}" end end end end |