class Bundler::LazySpecification
def ==(other)
def ==(other) identifier == other.identifier end
def __materialize__
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 = ruby_platform_materializes_to_ruby_platform? ? Gem::Platform.new(platform) : Gem::Platform.local 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?(StubSpecification) || (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
def eql?(other)
def eql?(other) identifier.eql?(other.identifier) end
def full_name
def full_name if platform == Gem::Platform::RUBY || platform.nil? "#{@name}-#{@version}" else "#{@name}-#{@version}-#{platform}" end end
def git_version
def git_version return unless source.is_a?(Bundler::Source::Git) " #{source.revision[0..6]}" end
def hash
def hash identifier.hash end
def identifier
def identifier @__identifier ||= [name, version, platform_string] end
def initialize(name, version, platform, source = nil)
def initialize(name, version, platform, source = nil) @name = name @version = version @dependencies = [] @platform = platform || Gem::Platform::RUBY @source = source @specification = nil end
def method_missing(method, *args, &blk)
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
def platform_string
def platform_string platform_string = platform.to_s platform_string == Index::RUBY ? Index::NULL : platform_string end
def respond_to?(*args)
def respond_to?(*args) super || @specification ? @specification.respond_to?(*args) : nil end
def ruby_platform_materializes_to_ruby_platform?
explicitly add a more specific platform.
on newer bundlers unless users generate the lockfile from scratch or
only included non-ruby platforms), but we're also keeping this behaviour
versions (before 2.2.0) this was always the case (except when the lockfile
best platform variant at materiliazation time. For previous bundler
locked platform is RUBY, we keep the previous behaviour of resolving the
For backwards compatibility with existing lockfiles, if the most specific
def ruby_platform_materializes_to_ruby_platform? !Bundler.most_specific_locked_platform?(generic_local_platform) || Bundler.settings[:force_ruby_platform] end
def satisfies?(dependency)
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
def to_ary
def to_ary nil end
def to_lock
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
def to_s
def to_s @__to_s ||= if platform == Gem::Platform::RUBY || platform.nil? "#{name} (#{version})" else "#{name} (#{version}-#{platform})" end end