aboutsummaryrefslogtreecommitdiffstats
path: root/lib/rubygems/dependency_resolver
diff options
context:
space:
mode:
authordrbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-11-10 17:51:40 +0000
committerdrbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-11-10 17:51:40 +0000
commit4f6779bac7b4e294bc473782d60cbd071f0d0f8d (patch)
treed37b54da20f8c0adf2d98e810aacc8259b0602ff /lib/rubygems/dependency_resolver
parent31d355aaa9436e2b24efd5e6501cabd876267c46 (diff)
downloadruby-4f6779bac7b4e294bc473782d60cbd071f0d0f8d.tar.gz
* lib/rubygems: Update to RubyGems master 4bdc4f2. Important changes
in this commit: RubyGems now chooses the test server port reliably. Patch by akr. Partial implementation of bundler's Gemfile format. Refactorings to improve the new resolver. Fixes bugs in the resolver. * test/rubygems: Tests for the above. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43643 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/rubygems/dependency_resolver')
-rw-r--r--lib/rubygems/dependency_resolver/activation_request.rb49
-rw-r--r--lib/rubygems/dependency_resolver/api_set.rb18
-rw-r--r--lib/rubygems/dependency_resolver/api_specification.rb27
-rw-r--r--lib/rubygems/dependency_resolver/best_set.rb21
-rw-r--r--lib/rubygems/dependency_resolver/composed_set.rb4
-rw-r--r--lib/rubygems/dependency_resolver/current_set.rb5
-rw-r--r--lib/rubygems/dependency_resolver/dependency_conflict.rb11
-rw-r--r--lib/rubygems/dependency_resolver/dependency_request.rb20
-rw-r--r--lib/rubygems/dependency_resolver/index_set.rb34
-rw-r--r--lib/rubygems/dependency_resolver/index_specification.rb38
-rw-r--r--lib/rubygems/dependency_resolver/installed_specification.rb40
-rw-r--r--lib/rubygems/dependency_resolver/installer_set.rb22
-rw-r--r--lib/rubygems/dependency_resolver/lock_set.rb60
-rw-r--r--lib/rubygems/dependency_resolver/set.rb28
-rw-r--r--lib/rubygems/dependency_resolver/spec_specification.rb58
-rw-r--r--lib/rubygems/dependency_resolver/specification.rb60
-rw-r--r--lib/rubygems/dependency_resolver/vendor_set.rb23
-rw-r--r--lib/rubygems/dependency_resolver/vendor_specification.rb42
18 files changed, 403 insertions, 157 deletions
diff --git a/lib/rubygems/dependency_resolver/activation_request.rb b/lib/rubygems/dependency_resolver/activation_request.rb
index 25af6378ac..c5d1e24d85 100644
--- a/lib/rubygems/dependency_resolver/activation_request.rb
+++ b/lib/rubygems/dependency_resolver/activation_request.rb
@@ -47,11 +47,21 @@ class Gem::DependencyResolver::ActivationRequest
end
def inspect # :nodoc:
- others_possible = nil
- others_possible = ' (others possible)' if @others_possible
+ others =
+ case @others_possible
+ when true then # TODO remove at RubyGems 3
+ ' (others possible)'
+ when false then # TODO remove at RubyGems 3
+ nil
+ else
+ unless @others_possible.empty? then
+ others = @others_possible.map { |s| s.full_name }
+ " (others possible: #{others.join ', '})"
+ end
+ end
'#<%s for %p from %s%s>' % [
- self.class, @spec, @request, others_possible
+ self.class, @spec, @request, others
]
end
@@ -59,10 +69,15 @@ class Gem::DependencyResolver::ActivationRequest
# Indicates if the requested gem has already been installed.
def installed?
- this_spec = full_spec
+ case @spec
+ when Gem::DependencyResolver::VendorSpecification then
+ true
+ else
+ this_spec = full_spec
- Gem::Specification.any? do |s|
- s == this_spec
+ Gem::Specification.any? do |s|
+ s == this_spec
+ end
end
end
@@ -75,7 +90,12 @@ class Gem::DependencyResolver::ActivationRequest
# requests for the same Dependency request.
def others_possible?
- @others_possible
+ case @others_possible
+ when true, false then
+ @others_possible
+ else
+ not @others_possible.empty?
+ end
end
##
@@ -95,9 +115,18 @@ class Gem::DependencyResolver::ActivationRequest
q.text ' for '
q.pp @request
-
- q.breakable
- q.text ' (other possible)' if @others_possible
+ case @others_possible
+ when false then
+ when true then
+ q.breakable
+ q.text 'others possible'
+ else
+ unless @others_possible.empty? then
+ q.breakable
+ q.text 'others '
+ q.pp @others_possible.map { |s| s.full_name }
+ end
+ end
end
end
diff --git a/lib/rubygems/dependency_resolver/api_set.rb b/lib/rubygems/dependency_resolver/api_set.rb
index 469c005a09..9dd34562b1 100644
--- a/lib/rubygems/dependency_resolver/api_set.rb
+++ b/lib/rubygems/dependency_resolver/api_set.rb
@@ -2,11 +2,21 @@
# The global rubygems pool, available via the rubygems.org API.
# Returns instances of APISpecification.
-class Gem::DependencyResolver::APISet
+class Gem::DependencyResolver::APISet < Gem::DependencyResolver::Set
- def initialize
+ ##
+ # The URI for the dependency API this APISet uses.
+
+ attr_reader :dep_uri # :nodoc:
+
+ ##
+ # Creates a new APISet that will retrieve gems from +uri+ using the RubyGems
+ # API described at http://guides.rubygems.org/rubygems-org-api
+
+ def initialize uri = 'https://rubygems.org/api/v1/dependencies'
+ uri = URI uri unless URI === uri # for ruby 1.8
@data = Hash.new { |h,k| h[k] = [] }
- @dep_uri = URI 'https://rubygems.org/api/v1/dependencies'
+ @dep_uri = uri
end
##
@@ -46,7 +56,7 @@ class Gem::DependencyResolver::APISet
##
# Return data for all versions of the gem +name+.
- def versions name
+ def versions name # :nodoc:
if @data.key?(name)
return @data[name]
end
diff --git a/lib/rubygems/dependency_resolver/api_specification.rb b/lib/rubygems/dependency_resolver/api_specification.rb
index ae688780dd..5178d7c28e 100644
--- a/lib/rubygems/dependency_resolver/api_specification.rb
+++ b/lib/rubygems/dependency_resolver/api_specification.rb
@@ -1,18 +1,21 @@
##
-# Represents a specification retrieved via the rubygems.org
-# API. This is used to avoid having to load the full
-# Specification object when all we need is the name, version,
-# and dependencies.
+# Represents a specification retrieved via the rubygems.org API.
+#
+# This is used to avoid loading the full Specification object when all we need
+# is the name, version, and dependencies.
-class Gem::DependencyResolver::APISpecification
+class Gem::DependencyResolver::APISpecification < Gem::DependencyResolver::Specification
- attr_reader :dependencies
- attr_reader :name
- attr_reader :platform
- attr_reader :set # :nodoc:
- attr_reader :version
+ ##
+ # Creates an APISpecification for the given +set+ from the rubygems.org
+ # +api_data+.
+ #
+ # See http://guides.rubygems.org/rubygems-org-api/#misc_methods for the
+ # format of the +api_data+.
def initialize(set, api_data)
+ super()
+
@set = set
@name = api_data[:name]
@version = Gem::Version.new api_data[:number]
@@ -31,9 +34,5 @@ class Gem::DependencyResolver::APISpecification
@dependencies == other.dependencies
end
- def full_name
- "#{@name}-#{@version}"
- end
-
end
diff --git a/lib/rubygems/dependency_resolver/best_set.rb b/lib/rubygems/dependency_resolver/best_set.rb
new file mode 100644
index 0000000000..987eea552e
--- /dev/null
+++ b/lib/rubygems/dependency_resolver/best_set.rb
@@ -0,0 +1,21 @@
+##
+# The BestSet chooses the best available method to query a remote index.
+#
+# It combines IndexSet and APISet
+
+class Gem::DependencyResolver::BestSet < Gem::DependencyResolver::ComposedSet
+
+ ##
+ # Creates a BestSet for the given +sources+ or Gem::sources if none are
+ # specified. +sources+ must be a Gem::SourceList.
+
+ def initialize sources = Gem.sources
+ super()
+
+ sources.each_source do |source|
+ @sets << source.dependency_resolver_set
+ end
+ end
+
+end
+
diff --git a/lib/rubygems/dependency_resolver/composed_set.rb b/lib/rubygems/dependency_resolver/composed_set.rb
index fb38128bb0..aeecf047b8 100644
--- a/lib/rubygems/dependency_resolver/composed_set.rb
+++ b/lib/rubygems/dependency_resolver/composed_set.rb
@@ -1,4 +1,6 @@
-class Gem::DependencyResolver::ComposedSet
+class Gem::DependencyResolver::ComposedSet < Gem::DependencyResolver::Set
+
+ attr_reader :sets # :nodoc:
def initialize *sets
@sets = sets
diff --git a/lib/rubygems/dependency_resolver/current_set.rb b/lib/rubygems/dependency_resolver/current_set.rb
index 13bc490e9e..ef15c9d7f3 100644
--- a/lib/rubygems/dependency_resolver/current_set.rb
+++ b/lib/rubygems/dependency_resolver/current_set.rb
@@ -3,14 +3,11 @@
# all the normal settings that control where to look
# for installed gems.
-class Gem::DependencyResolver::CurrentSet
+class Gem::DependencyResolver::CurrentSet < Gem::DependencyResolver::Set
def find_all req
req.dependency.matching_specs
end
- def prefetch gems
- end
-
end
diff --git a/lib/rubygems/dependency_resolver/dependency_conflict.rb b/lib/rubygems/dependency_resolver/dependency_conflict.rb
index 1755d910c3..092f000cdb 100644
--- a/lib/rubygems/dependency_resolver/dependency_conflict.rb
+++ b/lib/rubygems/dependency_resolver/dependency_conflict.rb
@@ -8,12 +8,21 @@ class Gem::DependencyResolver::DependencyConflict
attr_reader :dependency
+ attr_reader :failed_dep # :nodoc:
+
def initialize(dependency, activated, failed_dep=dependency)
@dependency = dependency
@activated = activated
@failed_dep = failed_dep
end
+ def == other
+ self.class === other and
+ @dependency == other.dependency and
+ @activated == other.activated and
+ @failed_dep == other.failed_dep
+ end
+
##
# Return the 2 dependency objects that conflicted
@@ -71,6 +80,8 @@ class Gem::DependencyResolver::DependencyConflict
current = current.request.requester
end
+ path = ['user request (gem command or Gemfile)'] if path.empty?
+
path
end
diff --git a/lib/rubygems/dependency_resolver/dependency_request.rb b/lib/rubygems/dependency_resolver/dependency_request.rb
index 05e447c3be..36b77ab558 100644
--- a/lib/rubygems/dependency_resolver/dependency_request.rb
+++ b/lib/rubygems/dependency_resolver/dependency_request.rb
@@ -32,6 +32,22 @@ class Gem::DependencyResolver::DependencyRequest
@dependency.name
end
+ # Indicate that the request is for a gem explicitly requested by the user
+ def explicit?
+ @requester.nil?
+ end
+
+ # Indicate that the requset is for a gem requested as a dependency of another gem
+ def implicit?
+ !explicit?
+ end
+
+ # Return a String indicating who caused this request to be added (only
+ # valid for implicit requests)
+ def request_context
+ @requester ? @requester.request : "(unknown)"
+ end
+
def pretty_print q # :nodoc:
q.group 2, '[Dependency request ', ']' do
q.breakable
@@ -43,6 +59,10 @@ class Gem::DependencyResolver::DependencyRequest
end
end
+ def requirement
+ @dependency.requirement
+ end
+
def to_s # :nodoc:
@dependency.to_s
end
diff --git a/lib/rubygems/dependency_resolver/index_set.rb b/lib/rubygems/dependency_resolver/index_set.rb
index 8c8bc4319d..04d6ec816f 100644
--- a/lib/rubygems/dependency_resolver/index_set.rb
+++ b/lib/rubygems/dependency_resolver/index_set.rb
@@ -2,10 +2,17 @@
# The global rubygems pool represented via the traditional
# source index.
-class Gem::DependencyResolver::IndexSet
+class Gem::DependencyResolver::IndexSet < Gem::DependencyResolver::Set
- def initialize
- @f = Gem::SpecFetcher.fetcher
+ def initialize source = nil # :nodoc:
+ @f =
+ if source then
+ sources = Gem::SourceList.from [source]
+
+ Gem::SpecFetcher.new sources
+ else
+ Gem::SpecFetcher.fetcher
+ end
@all = Hash.new { |h,k| h[k] = [] }
@@ -39,26 +46,5 @@ class Gem::DependencyResolver::IndexSet
res
end
- ##
- # Called from IndexSpecification to get a true Specification
- # object.
-
- def load_spec name, ver, platform, source
- key = "#{name}-#{ver}-#{platform}"
-
- @specs.fetch key do
- tuple = Gem::NameTuple.new name, ver, platform
-
- @specs[key] = source.fetch_spec tuple
- end
- end
-
- ##
- # No prefetching needed since we load the whole index in
- # initially.
-
- def prefetch gems
- end
-
end
diff --git a/lib/rubygems/dependency_resolver/index_specification.rb b/lib/rubygems/dependency_resolver/index_specification.rb
index 6cf267dac1..9b4057f0c8 100644
--- a/lib/rubygems/dependency_resolver/index_specification.rb
+++ b/lib/rubygems/dependency_resolver/index_specification.rb
@@ -3,17 +3,20 @@
# delay needed to download full Specification objects when only the +name+
# and +version+ are needed.
-class Gem::DependencyResolver::IndexSpecification
+class Gem::DependencyResolver::IndexSpecification < Gem::DependencyResolver::Specification
- attr_reader :name
-
- attr_reader :platform
-
- attr_reader :source
-
- attr_reader :version
+ ##
+ # An IndexSpecification is created from the index format described in `gem
+ # help generate_index`.
+ #
+ # The +set+ contains other specifications for this (URL) +source+.
+ #
+ # The +name+, +version+ and +platform+ are the name, version and platform of
+ # the gem.
def initialize set, name, version, source, platform
+ super()
+
@set = set
@name = name
@version = version
@@ -23,14 +26,13 @@ class Gem::DependencyResolver::IndexSpecification
@spec = nil
end
+ ##
+ # The dependencies of the gem for this specification
+
def dependencies
spec.dependencies
end
- def full_name
- "#{@name}-#{@version}"
- end
-
def inspect # :nodoc:
'#<%s %s source %s>' % [self.class, full_name, @source]
end
@@ -51,8 +53,16 @@ class Gem::DependencyResolver::IndexSpecification
end
end
- def spec
- @spec ||= @set.load_spec(@name, @version, @platform, @source)
+ ##
+ # Fetches a Gem::Specification for this IndexSpecification from the #source.
+
+ def spec # :nodoc:
+ @spec ||=
+ begin
+ tuple = Gem::NameTuple.new @name, @version, @platform
+
+ @source.fetch_spec tuple
+ end
end
end
diff --git a/lib/rubygems/dependency_resolver/installed_specification.rb b/lib/rubygems/dependency_resolver/installed_specification.rb
index ca20ace61e..4b591661a8 100644
--- a/lib/rubygems/dependency_resolver/installed_specification.rb
+++ b/lib/rubygems/dependency_resolver/installed_specification.rb
@@ -1,12 +1,8 @@
-class Gem::DependencyResolver::InstalledSpecification
+##
+# An InstalledSpecification represents a gem that is already installed
+# locally.
- attr_reader :spec
-
- def initialize set, spec, source=nil
- @set = set
- @source = source
- @spec = spec
- end
+class Gem::DependencyResolver::InstalledSpecification < Gem::DependencyResolver::SpecSpecification
def == other # :nodoc:
self.class === other and
@@ -14,29 +10,25 @@ class Gem::DependencyResolver::InstalledSpecification
@spec == other.spec
end
- def dependencies
- @spec.dependencies
- end
-
- def full_name
- "#{@spec.name}-#{@spec.version}"
- end
+ ##
+ # Returns +true+ if this gem is installable for the current platform.
- def name
- @spec.name
+ def installable_platform?
+ # BACKCOMPAT If the file is coming out of a specified file, then we
+ # ignore the platform. This code can be removed in RG 3.0.
+ if @source.kind_of? Gem::Source::SpecificFile
+ return true
+ else
+ Gem::Platform.match @spec.platform
+ end
end
- def platform
- @spec.platform
- end
+ ##
+ # The source for this specification
def source
@source ||= Gem::Source::Installed.new
end
- def version
- @spec.version
- end
-
end
diff --git a/lib/rubygems/dependency_resolver/installer_set.rb b/lib/rubygems/dependency_resolver/installer_set.rb
index 2993766d3a..801b60a8bb 100644
--- a/lib/rubygems/dependency_resolver/installer_set.rb
+++ b/lib/rubygems/dependency_resolver/installer_set.rb
@@ -2,23 +2,23 @@
# A set of gems for installation sourced from remote sources and local .gem
# files
-class Gem::DependencyResolver::InstallerSet
+class Gem::DependencyResolver::InstallerSet < Gem::DependencyResolver::Set
##
# List of Gem::Specification objects that must always be installed.
- attr_reader :always_install
+ attr_reader :always_install # :nodoc:
##
# Only install gems in the always_install list
- attr_accessor :ignore_dependencies
+ attr_accessor :ignore_dependencies # :nodoc:
##
# Do not look in the installed set when finding specifications. This is
# used by the --install-dir option to `gem install`
- attr_accessor :ignore_installed
+ attr_accessor :ignore_installed # :nodoc:
def initialize domain
@domain = domain
@@ -36,14 +36,14 @@ class Gem::DependencyResolver::InstallerSet
##
# Should local gems should be considered?
- def consider_local?
+ def consider_local? # :nodoc:
@domain == :both or @domain == :local
end
##
# Should remote gems should be considered?
- def consider_remote?
+ def consider_remote? # :nodoc:
@domain == :both or @domain == :remote
end
@@ -101,7 +101,7 @@ class Gem::DependencyResolver::InstallerSet
##
# Loads remote prerelease specs if +dep+ is a prerelease dependency
- def load_remote_specs dep
+ def load_remote_specs dep # :nodoc:
types = [:released]
types << :prerelease if dep.prerelease?
@@ -123,7 +123,7 @@ class Gem::DependencyResolver::InstallerSet
# Called from IndexSpecification to get a true Specification
# object.
- def load_spec name, ver, platform, source
+ def load_spec name, ver, platform, source # :nodoc:
key = "#{name}-#{ver}-#{platform}"
@specs.fetch key do
@@ -133,12 +133,6 @@ class Gem::DependencyResolver::InstallerSet
end
end
- ##
- # No prefetching needed since we load the whole index in initially.
-
- def prefetch(reqs)
- end
-
def pretty_print q # :nodoc:
q.group 2, '[InstallerSet', ']' do
q.breakable
diff --git a/lib/rubygems/dependency_resolver/lock_set.rb b/lib/rubygems/dependency_resolver/lock_set.rb
new file mode 100644
index 0000000000..f95c7f0fd6
--- /dev/null
+++ b/lib/rubygems/dependency_resolver/lock_set.rb
@@ -0,0 +1,60 @@
+##
+# A set of gems from a gem dependencies lockfile.
+
+class Gem::DependencyResolver::LockSet < Gem::DependencyResolver::Set
+
+ attr_reader :specs # :nodoc:
+
+ ##
+ # Creates a new LockSet from the given +source+
+
+ def initialize source
+ @source = source
+ @specs = []
+ end
+
+ ##
+ # Creates a new IndexSpecification in this set using the given +name+,
+ # +version+ and +platform+.
+ #
+ # The specification's set will be the current set, and the source will be
+ # the current set's source.
+
+ def add name, version, platform # :nodoc:
+ version = Gem::Version.new version
+
+ spec =
+ Gem::DependencyResolver::IndexSpecification.new self, name, version,
+ @source, platform
+
+ @specs << spec
+ end
+
+ ##
+ # Returns an Array of IndexSpecification objects matching the
+ # DependencyRequest +req+.
+
+ def find_all req
+ @specs.select do |spec|
+ req.matches_spec? spec
+ end
+ end
+
+ ##
+ # Loads a Gem::Specification with the given +name+, +version+ and
+ # +platform+. +source+ is ignored.
+
+ def load_spec name, version, platform, source # :nodoc:
+ dep = Gem::Dependency.new name, version
+
+ found = @specs.find do |spec|
+ dep.matches_spec? spec and spec.platform == platform
+ end
+
+ tuple = Gem::NameTuple.new found.name, found.version, found.platform
+
+ found.source.fetch_spec tuple
+ end
+
+end
+
diff --git a/lib/rubygems/dependency_resolver/set.rb b/lib/rubygems/dependency_resolver/set.rb
new file mode 100644
index 0000000000..65801871ac
--- /dev/null
+++ b/lib/rubygems/dependency_resolver/set.rb
@@ -0,0 +1,28 @@
+##
+# DependencyResolver sets are used to look up specifications (and their
+# dependencies) used in resolution. This set is abstract.
+
+class Gem::DependencyResolver::Set
+
+ ##
+ # The find_all method must be implemented. It returns all
+ # DependencyResolver Specification objects matching the given
+ # DependencyRequest +req+.
+
+ def find_all req
+ raise NotImplementedError
+ end
+
+ ##
+ # The #prefetch method may be overridden, but this is not necessary. This
+ # default implementation does nothing, which is suitable for sets where
+ # looking up a specification is cheap (such as installed gems).
+ #
+ # When overridden, the #prefetch method should look up specifications
+ # matching +reqs+.
+
+ def prefetch reqs
+ end
+
+end
+
diff --git a/lib/rubygems/dependency_resolver/spec_specification.rb b/lib/rubygems/dependency_resolver/spec_specification.rb
new file mode 100644
index 0000000000..cca1d58b9f
--- /dev/null
+++ b/lib/rubygems/dependency_resolver/spec_specification.rb
@@ -0,0 +1,58 @@
+##
+# The DependencyResolver::SpecSpecification contains common functionality for
+# DependencyResolver specifications that are backed by a Gem::Specification.
+
+class Gem::DependencyResolver::SpecSpecification < Gem::DependencyResolver::Specification
+
+ attr_reader :spec # :nodoc:
+
+ ##
+ # A SpecSpecification is created for a +set+ for a Gem::Specification in
+ # +spec+. The +source+ is either where the +spec+ came from, or should be
+ # loaded from.
+
+ def initialize set, spec, source = nil
+ @set = set
+ @source = source
+ @spec = spec
+ end
+
+ ##
+ # The dependencies of the gem for this specification
+
+ def dependencies
+ spec.dependencies
+ end
+
+ ##
+ # The name and version of the specification.
+ #
+ # Unlike Gem::Specification#full_name, the platform is not included.
+
+ def full_name
+ "#{spec.name}-#{spec.version}"
+ end
+
+ ##
+ # The name of the gem for this specification
+
+ def name
+ spec.name
+ end
+
+ ##
+ # The platform this gem works on.
+
+ def platform
+ spec.platform
+ end
+
+ ##
+ # The version of the gem for this specification.
+
+ def version
+ spec.version
+ end
+
+end
+
diff --git a/lib/rubygems/dependency_resolver/specification.rb b/lib/rubygems/dependency_resolver/specification.rb
new file mode 100644
index 0000000000..6fbd241316
--- /dev/null
+++ b/lib/rubygems/dependency_resolver/specification.rb
@@ -0,0 +1,60 @@
+##
+# A DependencyResolver::Specification contains a subset of the information
+# contained in a Gem::Specification. Only the information necessary for
+# dependency resolution in the resolver is included.
+
+class Gem::DependencyResolver::Specification
+
+ ##
+ # The dependencies of the gem for this specification
+
+ attr_reader :dependencies
+
+ ##
+ # The name of the gem for this specification
+
+ attr_reader :name
+
+ ##
+ # The platform this gem works on.
+
+ attr_reader :platform
+
+ ##
+ # The set this specification came from.
+
+ attr_reader :set
+
+ ##
+ # The source for this specification
+
+ attr_reader :source
+
+ ##
+ # The version of the gem for this specification.
+
+ attr_reader :version
+
+ ##
+ # Sets default instance variables for the specification.
+
+ def initialize
+ @dependencies = nil
+ @name = nil
+ @platform = nil
+ @set = nil
+ @source = nil
+ @version = nil
+ end
+
+ ##
+ # The name and version of the specification.
+ #
+ # Unlike Gem::Specification#full_name, the platform is not included.
+
+ def full_name
+ "#{@name}-#{@version}"
+ end
+
+end
+
diff --git a/lib/rubygems/dependency_resolver/vendor_set.rb b/lib/rubygems/dependency_resolver/vendor_set.rb
index 716c2a8e26..87eb6fd818 100644
--- a/lib/rubygems/dependency_resolver/vendor_set.rb
+++ b/lib/rubygems/dependency_resolver/vendor_set.rb
@@ -13,17 +13,18 @@
# The directory vendor/rake must contain an unpacked rake gem along with a
# rake.gemspec (watching the given name).
-class Gem::DependencyResolver::VendorSet
+class Gem::DependencyResolver::VendorSet < Gem::DependencyResolver::Set
- def initialize
- @specs = {}
+ def initialize # :nodoc:
+ @directories = {}
+ @specs = {}
end
##
# Adds a specification to the set with the given +name+ which has been
# unpacked into the given +directory+.
- def add_vendor_gem name, directory
+ def add_vendor_gem name, directory # :nodoc:
gemspec = File.join directory, "#{name}.gemspec"
spec = Gem::Specification.load gemspec
@@ -33,7 +34,8 @@ class Gem::DependencyResolver::VendorSet
key = "#{spec.name}-#{spec.version}-#{spec.platform}"
- @specs[key] = spec
+ @specs[key] = spec
+ @directories[spec] = directory
end
##
@@ -44,7 +46,8 @@ class Gem::DependencyResolver::VendorSet
@specs.values.select do |spec|
req.matches_spec? spec
end.map do |spec|
- Gem::DependencyResolver::VendorSpecification.new self, spec, nil
+ source = Gem::Source::Vendor.new @directories[spec]
+ Gem::DependencyResolver::VendorSpecification.new self, spec, source
end
end
@@ -53,17 +56,11 @@ class Gem::DependencyResolver::VendorSet
# +source+ is defined when the specification was added to index it is not
# used.
- def load_spec name, version, platform, source
+ def load_spec name, version, platform, source # :nodoc:
key = "#{name}-#{version}-#{platform}"
@specs.fetch key
end
- ##
- # No prefetch is needed as the index is loaded at creation time.
-
- def prefetch gems
- end
-
end
diff --git a/lib/rubygems/dependency_resolver/vendor_specification.rb b/lib/rubygems/dependency_resolver/vendor_specification.rb
index 2f18fab4ce..27b2fd6df2 100644
--- a/lib/rubygems/dependency_resolver/vendor_specification.rb
+++ b/lib/rubygems/dependency_resolver/vendor_specification.rb
@@ -1,43 +1,15 @@
-class Gem::DependencyResolver::VendorSpecification
+##
+# A VendorSpecification represents a gem that has been unpacked into a project
+# and is being loaded through a gem dependencies file through the +path:+
+# option.
- attr_reader :spec
-
- attr_reader :set
-
- def initialize set, spec, source=nil
- @set = set
- @source = source
- @spec = spec
- end
+class Gem::DependencyResolver::VendorSpecification < Gem::DependencyResolver::SpecSpecification
def == other # :nodoc:
self.class === other and
@set == other.set and
- @spec == other.spec
- end
-
- def dependencies
- @spec.dependencies
- end
-
- def full_name
- "#{@spec.name}-#{@spec.version}"
- end
-
- def name
- @spec.name
- end
-
- def platform
- @spec.platform
- end
-
- def source
- @source ||= Gem::Source::Vendor.new
- end
-
- def version
- @spec.version
+ @spec == other.spec and
+ @source == other.source
end
end