/tools/Ruby/lib/ruby/site_ruby/1.8/rubygems/requirement.rb

http://github.com/agross/netopenspace · Ruby · 154 lines · 81 code · 31 blank · 42 comment · 10 complexity · b33754cfcfed33949bc421e43c1def4e MD5 · raw file

  1. require "rubygems/version"
  2. ##
  3. # A Requirement is a set of one or more version restrictions. It supports a
  4. # few (<tt>=, !=, >, <, >=, <=, ~></tt>) different restriction operators.
  5. class Gem::Requirement
  6. include Comparable
  7. OPS = { #:nodoc:
  8. "=" => lambda { |v, r| v == r },
  9. "!=" => lambda { |v, r| v != r },
  10. ">" => lambda { |v, r| v > r },
  11. "<" => lambda { |v, r| v < r },
  12. ">=" => lambda { |v, r| v >= r },
  13. "<=" => lambda { |v, r| v <= r },
  14. "~>" => lambda { |v, r| v >= r && v.release < r.bump }
  15. }
  16. quoted = OPS.keys.map { |k| Regexp.quote k }.join "|"
  17. PATTERN = /\A\s*(#{quoted})?\s*(#{Gem::Version::VERSION_PATTERN})\s*\z/
  18. ##
  19. # Factory method to create a Gem::Requirement object. Input may be
  20. # a Version, a String, or nil. Intended to simplify client code.
  21. #
  22. # If the input is "weird", the default version requirement is
  23. # returned.
  24. def self.create input
  25. case input
  26. when Gem::Requirement then
  27. input
  28. when Gem::Version, Array then
  29. new input
  30. else
  31. if input.respond_to? :to_str then
  32. new [input.to_str]
  33. else
  34. default
  35. end
  36. end
  37. end
  38. ##
  39. # A default "version requirement" can surely _only_ be '>= 0'.
  40. #--
  41. # This comment once said:
  42. #
  43. # "A default "version requirement" can surely _only_ be '> 0'."
  44. def self.default
  45. new '>= 0'
  46. end
  47. ##
  48. # Parse +obj+, returning an <tt>[op, version]</tt> pair. +obj+ can
  49. # be a String or a Gem::Version.
  50. #
  51. # If +obj+ is a String, it can be either a full requirement
  52. # specification, like <tt>">= 1.2"</tt>, or a simple version number,
  53. # like <tt>"1.2"</tt>.
  54. #
  55. # parse("> 1.0") # => [">", "1.0"]
  56. # parse("1.0") # => ["=", "1.0"]
  57. # parse(Gem::Version.new("1.0")) # => ["=, "1.0"]
  58. def self.parse obj
  59. return ["=", obj] if Gem::Version === obj
  60. unless PATTERN =~ obj.to_s
  61. raise ArgumentError, "Illformed requirement [#{obj.inspect}]"
  62. end
  63. [$1 || "=", Gem::Version.new($2)]
  64. end
  65. ##
  66. # An array of requirement pairs. The first element of the pair is
  67. # the op, and the second is the Gem::Version.
  68. attr_reader :requirements #:nodoc:
  69. ##
  70. # Constructs a requirement from +requirements+. Requirements can be
  71. # Strings, Gem::Versions, or Arrays of those. +nil+ and duplicate
  72. # requirements are ignored. An empty set of +requirements+ is the
  73. # same as <tt>">= 0"</tt>.
  74. def initialize *requirements
  75. requirements = requirements.flatten
  76. requirements.compact!
  77. requirements.uniq!
  78. requirements << ">= 0" if requirements.empty?
  79. @none = (requirements == ">= 0")
  80. @requirements = requirements.map! { |r| self.class.parse r }
  81. end
  82. def none?
  83. @none ||= (to_s == ">= 0")
  84. end
  85. def as_list # :nodoc:
  86. requirements.map { |op, version| "#{op} #{version}" }.sort
  87. end
  88. def hash # :nodoc:
  89. requirements.hash
  90. end
  91. def marshal_dump # :nodoc:
  92. [@requirements]
  93. end
  94. def marshal_load array # :nodoc:
  95. @requirements = array[0]
  96. end
  97. def prerelease?
  98. requirements.any? { |r| r.last.prerelease? }
  99. end
  100. def pretty_print q # :nodoc:
  101. q.group 1, 'Gem::Requirement.new(', ')' do
  102. q.pp as_list
  103. end
  104. end
  105. ##
  106. # True if +version+ satisfies this Requirement.
  107. def satisfied_by? version
  108. # #28965: syck has a bug with unquoted '=' YAML.loading as YAML::DefaultKey
  109. requirements.all? { |op, rv| (OPS[op] || OPS["="]).call version, rv }
  110. end
  111. def to_s # :nodoc:
  112. as_list.join ", "
  113. end
  114. def <=> other # :nodoc:
  115. to_s <=> other.to_s
  116. end
  117. end
  118. # :stopdoc:
  119. # Gem::Version::Requirement is used in a lot of old YAML specs. It's aliased
  120. # here for backwards compatibility. I'd like to remove this, maybe in RubyGems
  121. # 2.0.
  122. ::Gem::Version::Requirement = ::Gem::Requirement
  123. # :startdoc: