summaryrefslogtreecommitdiff
path: root/lib/rubygems/resolver/lock_specification.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rubygems/resolver/lock_specification.rb')
-rw-r--r--lib/rubygems/resolver/lock_specification.rb86
1 files changed, 86 insertions, 0 deletions
diff --git a/lib/rubygems/resolver/lock_specification.rb b/lib/rubygems/resolver/lock_specification.rb
new file mode 100644
index 0000000000..06f912dd85
--- /dev/null
+++ b/lib/rubygems/resolver/lock_specification.rb
@@ -0,0 +1,86 @@
+# frozen_string_literal: true
+
+##
+# The LockSpecification comes from a lockfile (Gem::RequestSet::Lockfile).
+#
+# A LockSpecification's dependency information is pre-filled from the
+# lockfile.
+
+class Gem::Resolver::LockSpecification < Gem::Resolver::Specification
+ attr_reader :sources
+
+ def initialize(set, name, version, sources, platform)
+ super()
+
+ @name = name
+ @platform = platform
+ @set = set
+ @source = sources.first
+ @sources = sources
+ @version = version
+
+ @dependencies = []
+ @spec = nil
+ end
+
+ ##
+ # This is a null install as a locked specification is considered installed.
+ # +options+ are ignored.
+
+ def install(options = {})
+ destination = options[:install_dir] || Gem.dir
+
+ if File.exist? File.join(destination, "specifications", spec.spec_name)
+ yield nil
+ return
+ end
+
+ super
+ end
+
+ ##
+ # Adds +dependency+ from the lockfile to this specification
+
+ def add_dependency(dependency) # :nodoc:
+ @dependencies << dependency
+ end
+
+ def pretty_print(q) # :nodoc:
+ q.group 2, "[LockSpecification", "]" do
+ q.breakable
+ q.text "name: #{@name}"
+
+ q.breakable
+ q.text "version: #{@version}"
+
+ unless @platform == Gem::Platform::RUBY
+ q.breakable
+ q.text "platform: #{@platform}"
+ end
+
+ unless @dependencies.empty?
+ q.breakable
+ q.text "dependencies:"
+ q.breakable
+ q.pp @dependencies
+ end
+ end
+ end
+
+ ##
+ # A specification constructed from the lockfile is returned
+
+ def spec
+ @spec ||= Gem::Specification.find do |spec|
+ spec.name == @name && spec.version == @version
+ end
+
+ @spec ||= Gem::Specification.new do |s|
+ s.name = @name
+ s.version = @version
+ s.platform = @platform
+
+ s.dependencies.concat @dependencies
+ end
+ end
+end