aboutsummaryrefslogtreecommitdiffstats
path: root/lib/rubygems/specification.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rubygems/specification.rb')
-rw-r--r--lib/rubygems/specification.rb24
1 files changed, 19 insertions, 5 deletions
diff --git a/lib/rubygems/specification.rb b/lib/rubygems/specification.rb
index 1be285e4ef..50c27aa272 100644
--- a/lib/rubygems/specification.rb
+++ b/lib/rubygems/specification.rb
@@ -175,6 +175,11 @@ class Gem::Specification < Gem::BasicSpecification
@@stubs_by_name = {}
+ # Sentinel object to represent "not found" stubs
+ NOT_FOUND = Struct.new(:to_spec, :this).new # :nodoc:
+ @@spec_with_requirable_file = {}
+ @@active_stub_with_requirable_file = {}
+
######################################################################
# :section: Required gemspec attributes
@@ -1027,10 +1032,10 @@ class Gem::Specification < Gem::BasicSpecification
def self.find_by_path path
path = path.dup.freeze
- stub = stubs.find { |spec|
- spec.contains_requirable_file? path
- }
- stub && stub.to_spec
+ spec = @@spec_with_requirable_file[path] ||= (stubs.find { |s|
+ s.contains_requirable_file? path
+ } || NOT_FOUND)
+ spec.to_spec
end
##
@@ -1044,6 +1049,13 @@ class Gem::Specification < Gem::BasicSpecification
stub && stub.to_spec
end
+ def self.find_active_stub_by_path path
+ stub = @@active_stub_with_requirable_file[path] ||= (stubs.find { |s|
+ s.activated? and s.contains_requirable_file? path
+ } || NOT_FOUND)
+ stub.this
+ end
+
##
# Return currently unresolved specs that contain the file matching +path+.
@@ -1261,6 +1273,8 @@ class Gem::Specification < Gem::BasicSpecification
@@all = nil
@@stubs = nil
@@stubs_by_name = {}
+ @@spec_with_requirable_file = {}
+ @@active_stub_with_requirable_file = {}
_clear_load_cache
unresolved = unresolved_deps
unless unresolved.empty? then
@@ -2847,7 +2861,7 @@ duplicate dependency on #{dep}, (#{prev.requirement}) use:
end
warning_messages << "prerelease dependency on #{dep} is not recommended" if
- prerelease_dep
+ prerelease_dep && !version.prerelease?
overly_strict = dep.requirement.requirements.length == 1 &&
dep.requirement.requirements.any? do |op, version|