diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-02-22 02:52:35 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-02-22 02:52:35 +0000 |
commit | b551e8c8b36766651be4e782e09e3b02e7d14a10 (patch) | |
tree | e164a1ef908bd4451568abf05b688f1593915b81 /lib/rubygems/dependency.rb | |
parent | 65544f575b25b18dc27f9364f973556ddb48538f (diff) | |
download | ruby-b551e8c8b36766651be4e782e09e3b02e7d14a10.tar.gz |
* 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.rb | 208 |
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 |