Class: Bundler::LazySpecification
Relationships & Source Files | |
Super Chains via Extension / Inclusion / Inheritance | |
Instance Chain:
self,
MatchPlatform ,
GemHelpers
|
|
Inherits: | Object |
Defined in: | lib/bundler/lazy_specification.rb |
Constant Summary
GemHelpers
- Included
Class Method Summary
Instance Attribute Summary
- #dependencies readonly
- #name readonly
- #platform readonly
- #remote rw
- #source rw
- #version readonly
-
#ruby_platform_materializes_to_ruby_platform? ⇒ Boolean
readonly
private
For backwards compatibility with existing lockfiles, if the most specific locked platform is RUBY, we keep the previous behaviour of resolving the best platform variant at materiliazation time.
Instance Method Summary
- #==(other)
- #__materialize__
- #eql?(other) ⇒ Boolean
- #full_name
- #git_version
- #hash
- #identifier
- #respond_to?(*args) ⇒ Boolean
-
#satisfies?(dependency) ⇒ Boolean
Does this locked specification satisfy
dependency
? - #to_lock
- #to_s
- #platform_string protected
- #method_missing(method, *args, &blk) private
- #to_ary private
MatchPlatform
- Included
GemHelpers
- Included
Constructor Details
.new(name, version, platform, source = nil) ⇒ LazySpecification
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method, *args, &blk) (private)
[ GitHub ]# File 'lib/bundler/lazy_specification.rb', line 137
def method_missing(method, *args, &blk) raise "LazySpecification has not been materialized yet (calling :#{method} #{args.inspect})" unless @specification return super unless respond_to?(method) @specification.send(method, *args, &blk) end
Instance Attribute Details
#dependencies (readonly)
[ GitHub ]#name (readonly)
[ GitHub ]# File 'lib/bundler/lazy_specification.rb', line 9
attr_reader :name, :version, :dependencies, :platform
#platform (readonly)
[ GitHub ]# File 'lib/bundler/lazy_specification.rb', line 9
attr_reader :name, :version, :dependencies, :platform
#remote (rw)
[ GitHub ]# File 'lib/bundler/lazy_specification.rb', line 10
attr_accessor :source, :remote
#ruby_platform_materializes_to_ruby_platform? ⇒ Boolean
(readonly, private)
For backwards compatibility with existing lockfiles, if the most specific locked platform is RUBY, we keep the previous behaviour of resolving the best platform variant at materiliazation time. For previous bundler versions (before 2.2.0) this was always the case (except when the lockfile only included non-ruby platforms), but we’re also keeping this behaviour on newer bundlers unless users generate the lockfile from scratch or explicitly add a more specific platform.
#source (rw)
[ GitHub ]# File 'lib/bundler/lazy_specification.rb', line 10
attr_accessor :source, :remote
#version (readonly)
[ GitHub ]# File 'lib/bundler/lazy_specification.rb', line 9
attr_reader :name, :version, :dependencies, :platform
Instance Method Details
#==(other)
[ GitHub ]# File 'lib/bundler/lazy_specification.rb', line 29
def ==(other) identifier == other.identifier end
#__materialize__
[ GitHub ]# File 'lib/bundler/lazy_specification.rb', line 78
def __materialize__ @specification = if source.is_a?(Source::Gemspec) && source.gemspec.name == name source.gemspec.tap {|s| s.source = source } else search_object = if source.is_a?(Source::Path) Dependency.new(name, version) else ruby_platform_materializes_to_ruby_platform? ? self : Dependency.new(name, version) end platform_object = Gem::Platform.new(platform) candidates = source.specs.search(search_object) same_platform_candidates = candidates.select do |spec| MatchPlatform.platforms_match?(spec.platform, platform_object) end installable_candidates = same_platform_candidates.select do |spec| !spec.is_a?(EndpointSpecification) || (spec.required_ruby_version.satisfied_by?(Gem.ruby_version) && spec.required_rubygems_version.satisfied_by?(Gem.rubygems_version)) end search = installable_candidates.last || same_platform_candidates.last search.dependencies = dependencies if search && (search.is_a?(RemoteSpecification) || search.is_a?(EndpointSpecification)) search end end
#eql?(other) ⇒ Boolean
# File 'lib/bundler/lazy_specification.rb', line 33
def eql?(other) identifier.eql?(other.identifier) end
#full_name
[ GitHub ]#git_version
[ GitHub ]#hash
[ GitHub ]# File 'lib/bundler/lazy_specification.rb', line 37
def hash identifier.hash end
#identifier
[ GitHub ]# File 'lib/bundler/lazy_specification.rb', line 115
def identifier @__identifier ||= [name, version, platform_string] end
#platform_string (protected)
[ GitHub ]
#respond_to?(*args) ⇒ Boolean
# File 'lib/bundler/lazy_specification.rb', line 103
def respond_to?(*args) super || @specification ? @specification.respond_to?(*args) : nil end
#satisfies?(dependency) ⇒ Boolean
Does this locked specification satisfy dependency
?
NOTE: Rubygems default requirement is “>= 0”, which doesn’t match prereleases of 0 versions, like “0.0.0.dev” or “0.0.0.SNAPSHOT”. However, bundler users expect those to work. We need to make sure that Gemfile dependencies without explicit requirements (which use “>= 0” under the hood by default) are still valid for locked specs using this kind of versions. The method implements an ad-hoc fix for that. A better solution might be to change default rubygems requirement of dependencies to be “>= 0.A” but that’s a major refactoring likely to break things. Hopefully we can attempt it in the future.
# File 'lib/bundler/lazy_specification.rb', line 55
def satisfies?(dependency) effective_requirement = dependency.requirement == Gem::Requirement.default ? Gem::Requirement.new(">= 0.A") : dependency.requirement @name == dependency.name && effective_requirement.satisfied_by?(Gem::Version.new(@version)) end
#to_ary (private)
[ GitHub ]# File 'lib/bundler/lazy_specification.rb', line 133
def to_ary nil end
#to_lock
[ GitHub ]# File 'lib/bundler/lazy_specification.rb', line 61
def to_lock out = String.new if platform == Gem::Platform::RUBY || platform.nil? out << " #{name} (#{version})\n" else out << " #{name} (#{version}-#{platform})\n" end dependencies.sort_by(&:to_s).uniq.each do |dep| next if dep.type == :development out << " #{dep.to_lock}\n" end out end