summaryrefslogtreecommitdiff
path: root/lib/rubygems/dependency.rb
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-02-22 02:52:35 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-02-22 02:52:35 +0000
commitb551e8c8b36766651be4e782e09e3b02e7d14a10 (patch)
treee164a1ef908bd4451568abf05b688f1593915b81 /lib/rubygems/dependency.rb
parent65544f575b25b18dc27f9364f973556ddb48538f (diff)
* lib/rubygems: update to 1.3.6.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26728 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/rubygems/dependency.rb')
-rw-r--r--lib/rubygems/dependency.rb208
1 files changed, 133 insertions, 75 deletions
diff --git a/lib/rubygems/dependency.rb b/lib/rubygems/dependency.rb
index d142265c5d..351991067d 100644
--- a/lib/rubygems/dependency.rb
+++ b/lib/rubygems/dependency.rb
@@ -1,14 +1,22 @@
-#--
-# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
-# All rights reserved.
-# See LICENSE.txt for permissions.
-#++
+require "rubygems/requirement"
##
-# The Dependency class holds a Gem name and a Gem::Requirement
+# The Dependency class holds a Gem name and a Gem::Requirement.
class Gem::Dependency
+ # :stopdoc:
+ @warned_version_requirement = false
+
+ def self.warned_version_requirement
+ @warned_version_requirement
+ end
+
+ def self.warned_version_requirement= value
+ @warned_version_requirement = value
+ end
+ # :startdoc:
+
##
# Valid dependency types.
#--
@@ -16,9 +24,9 @@ class Gem::Dependency
# Gem::Specification::CURRENT_SPECIFICATION_VERSION as well.
TYPES = [
- :development,
- :runtime,
- ]
+ :development,
+ :runtime,
+ ]
##
# Dependency name or regular expression.
@@ -26,122 +34,172 @@ class Gem::Dependency
attr_accessor :name
##
- # Dependency type.
+ # Allows you to force this dependency to be a prerelease.
- attr_reader :type
+ attr_writer :prerelease
##
- # Dependent versions.
-
- attr_writer :version_requirements
-
- ##
- # Orders dependencies by name only.
+ # Dependency type.
- def <=>(other)
- [@name] <=> [other.name]
- end
+ attr_reader :type
##
- # Constructs a dependency with +name+ and +requirements+.
+ # Constructs a dependency with +name+ and +requirements+. The last
+ # argument can optionally be the dependency type, which defaults to
+ # <tt>:runtime</tt>.
- def initialize(name, version_requirements, type=:runtime)
- @name = name
+ def initialize name, *requirements
+ type = Symbol === requirements.last ? requirements.pop : :runtime
+ requirements = requirements.first if 1 == requirements.length # unpack
unless TYPES.include? type
- raise ArgumentError, "Valid types are #{TYPES.inspect}, not #{@type.inspect}"
+ raise ArgumentError, "Valid types are #{TYPES.inspect}, "
+ + "not #{@type.inspect}"
end
- @type = type
+ @name = name
+ @requirement = Gem::Requirement.create requirements
+ @type = type
+ @prerelease = false
- @version_requirements = Gem::Requirement.create version_requirements
- @version_requirement = nil # Avoid warnings.
- end
+ # This is for Marshal backwards compatability. See the comments in
+ # +requirement+ for the dirty details.
- def version_requirements
- normalize if defined? @version_requirement and @version_requirement
- @version_requirements
+ @version_requirements = @requirement
end
- def requirement_list
- version_requirements.as_list
- end
+ ##
+ # What does this dependency require?
- alias requirements_list requirement_list
+ ##
+ # A dependency's hash is the XOR of the hashes of +name+, +type+,
+ # and +requirement+.
- def normalize
- ver = @version_requirement.instance_variable_get :@version
- @version_requirements = Gem::Requirement.new([ver])
- @version_requirement = nil
+ def hash # :nodoc:
+ name.hash ^ type.hash ^ requirement.hash
end
- def to_s # :nodoc:
- "#{name} (#{version_requirements}, #{@type || :runtime})"
+ def inspect # :nodoc:
+ "<%s type=%p name=%p requirements=%p>" %
+ [self.class, @type, @name, requirement.to_s]
+ end
+
+ ##
+ # Does this dependency require a prerelease?
+
+ def prerelease?
+ @prerelease || requirement.prerelease?
end
def pretty_print(q) # :nodoc:
q.group 1, 'Gem::Dependency.new(', ')' do
- q.pp @name
+ q.pp name
q.text ','
q.breakable
- q.pp @version_requirements
+ q.pp requirement
q.text ','
q.breakable
- q.pp @type
+ q.pp type
end
end
- def ==(other) # :nodoc:
- self.class === other &&
- self.name == other.name &&
- self.type == other.type &&
- self.version_requirements == other.version_requirements
+ def requirement
+ return @requirement if defined?(@requirement) and @requirement
+
+ # @version_requirements and @version_requirement are legacy ivar
+ # names, and supported here because older gems need to keep
+ # working and Dependency doesn't implement marshal_dump and
+ # marshal_load. In a happier world, this would be an
+ # attr_accessor. The horrifying instance_variable_get you see
+ # below is also the legacy of some old restructurings.
+ #
+ # Note also that because of backwards compatibility (loading new
+ # gems in an old RubyGems installation), we can't add explicit
+ # marshaling to this class until we want to make a big
+ # break. Maybe 2.0.
+ #
+ # Children, define explicit marshal and unmarshal behavior for
+ # public classes. Marshal formats are part of your public API.
+
+ if defined?(@version_requirement) && @version_requirement
+ version = @version_requirement.instance_variable_get :@version
+ @version_requirement = nil
+ @version_requirements = Gem::Requirement.new version
+ end
+
+ @requirement = @version_requirements if defined?(@version_requirements)
end
##
- # Uses this dependency as a pattern to compare to +other+. This dependency
- # will match if the name matches the other's name, and other has only an
- # equal version requirement that satisfies this dependency.
+ # Rails subclasses Gem::Dependency and uses this method, so we'll hack
+ # around it.
- def =~(other)
- other = if self.class === other then
- other
- else
- return false unless other.respond_to? :name and
- other.respond_to? :version
+ alias __requirement requirement # :nodoc:
- Gem::Dependency.new other.name, other.version
- end
+ def requirements_list
+ requirement.as_list
+ end
- pattern = @name
- pattern = /\A#{Regexp.escape @name}\Z/ unless Regexp === pattern
+ def to_s # :nodoc:
+ "#{name} (#{requirement}, #{type})"
+ end
- return false unless pattern =~ other.name
+ def version_requirements # :nodoc:
+ unless Gem::Dependency.warned_version_requirement then
+ warn "#{Gem.location_of_caller.join ':'}:Warning: " \
+ "Gem::Dependency#version_requirements is deprecated " \
+ "and will be removed on or after August 2010. " \
+ "Use #requirement"
- reqs = other.version_requirements.requirements
+ Gem::Dependency.warned_version_requirement = true
+ end
- return false unless reqs.length == 1
- return false unless reqs.first.first == '='
+ __requirement
+ end
- version = reqs.first.last
+ alias_method :version_requirement, :version_requirements
- version_requirements.satisfied_by? version
+ def == other # :nodoc:
+ Gem::Dependency === other &&
+ self.name == other.name &&
+ self.type == other.type &&
+ self.requirement == other.requirement
end
##
- # A dependency's hash is the sum of the hash of the #name, #type and
- # #version_requirements
+ # Dependencies are ordered by name.
- def hash
- name.hash + type.hash + version_requirements.hash
+ def <=> other
+ [@name] <=> [other.name]
end
- def inspect # :nodoc:
- "<%s type=%p name=%p requirements=%p>" % [self.class, @type, @name,
- version_requirements.to_s]
+ ##
+ # Uses this dependency as a pattern to compare to +other+. This
+ # dependency will match if the name matches the other's name, and
+ # other has only an equal version requirement that satisfies this
+ # dependency.
+
+ def =~ other
+ unless Gem::Dependency === other
+ other = Gem::Dependency.new other.name, other.version rescue return false
+ end
+
+ pattern = name
+ pattern = /\A#{Regexp.escape pattern}\Z/ unless Regexp === pattern
+
+ return false unless pattern =~ other.name
+
+ reqs = other.requirement.requirements
+
+ return false unless reqs.length == 1
+ return false unless reqs.first.first == '='
+
+ version = reqs.first.last
+
+ requirement.satisfied_by? version
end
end