Class: Gem::Requirement
- Inherits:
-
Object
- Object
- Gem::Requirement
- Defined in:
- lib/rubygems/requirement.rb
Overview
A Requirement is a set of one or more version restrictions. It supports a few (=, !=, >, <, >=, <=, ~>
) different restriction operators.
See Gem::Version for a description on how versions and requirements work together in RubyGems.
Defined Under Namespace
Classes: BadRequirementError
Constant Summary collapse
- OPS =
:nodoc:
{ # :nodoc: "=" => lambda {|v, r| v == r }, "!=" => lambda {|v, r| v != r }, ">" => lambda {|v, r| v > r }, "<" => lambda {|v, r| v < r }, ">=" => lambda {|v, r| v >= r }, "<=" => lambda {|v, r| v <= r }, "~>" => lambda {|v, r| v >= r && v.release < r.bump }, }.freeze
- SOURCE_SET_REQUIREMENT =
:nodoc:
Struct.new(:for_lockfile).new "!"
- PATTERN_RAW =
:nodoc:
"\\s*(#{quoted})?\\s*(#{Gem::Version::VERSION_PATTERN})\\s*".freeze
- PATTERN =
A regular expression that matches a requirement
/\A#{PATTERN_RAW}\z/
- DefaultRequirement =
The default requirement matches any non-prerelease version
[">=", Gem::Version.new(0)].freeze
- DefaultPrereleaseRequirement =
The default requirement matches any version
[">=", Gem::Version.new("0.a")].freeze
Instance Attribute Summary collapse
-
#requirements ⇒ Object
readonly
An array of requirement pairs.
Class Method Summary collapse
-
.create(*inputs) ⇒ Object
Factory method to create a Gem::Requirement object.
- .default ⇒ Object
- .default_prerelease ⇒ Object
-
.parse(obj) ⇒ Object
Parse
obj
, returning an[op, version]
pair. -
.source_set ⇒ Object
A source set requirement, used for Gemfiles and lockfiles.
Instance Method Summary collapse
-
#==(other) ⇒ Object
:nodoc:.
-
#as_list ⇒ Object
:nodoc:.
-
#concat(new) ⇒ Object
Concatenates the
new
requirements onto this requirement. -
#encode_with(coder) ⇒ Object
:nodoc:.
-
#exact? ⇒ Boolean
true if the requirement is for only an exact version.
-
#for_lockfile ⇒ Object
Formats this requirement for use in a Gem::RequestSet::Lockfile.
-
#hash ⇒ Object
:nodoc:.
-
#init_with(coder) ⇒ Object
:nodoc:.
-
#initialize(*requirements) ⇒ Requirement
constructor
Constructs a requirement from
requirements
. -
#marshal_dump ⇒ Object
:nodoc:.
-
#marshal_load(array) ⇒ Object
:nodoc:.
-
#none? ⇒ Boolean
true if this gem has no requirements.
-
#prerelease? ⇒ Boolean
A requirement is a prerelease if any of the versions inside of it are prereleases.
-
#pretty_print(q) ⇒ Object
:nodoc:.
-
#satisfied_by?(version) ⇒ Boolean
(also: #===, #=~)
True if
version
satisfies this Requirement. -
#specific? ⇒ Boolean
True if the requirement will not always match the latest version.
-
#to_s ⇒ Object
:nodoc:.
-
#to_yaml_properties ⇒ Object
:nodoc:.
-
#yaml_initialize(tag, vals) ⇒ Object
:nodoc:.
Constructor Details
#initialize(*requirements) ⇒ Requirement
Constructs a requirement from requirements
. Requirements can be Strings, Gem::Versions, or Arrays of those. nil
and duplicate requirements are ignored. An empty set of requirements
is the same as ">= 0"
.
131 132 133 134 135 136 137 138 139 140 141 |
# File 'lib/rubygems/requirement.rb', line 131 def initialize(*requirements) requirements = requirements.flatten requirements.compact! requirements.uniq! if requirements.empty? @requirements = [DefaultRequirement] else @requirements = requirements.map! {|r| self.class.parse r } end end |
Instance Attribute Details
#requirements ⇒ Object (readonly)
An array of requirement pairs. The first element of the pair is the op, and the second is the Gem::Version.
123 124 125 |
# File 'lib/rubygems/requirement.rb', line 123 def requirements @requirements end |
Class Method Details
.create(*inputs) ⇒ Object
Factory method to create a Gem::Requirement object. Input may be a Version, a String, or nil. Intended to simplify client code.
If the input is “weird”, the default version requirement is returned.
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/rubygems/requirement.rb', line 55 def self.create(*inputs) return new inputs if inputs.length > 1 input = inputs.shift case input when Gem::Requirement then input when Gem::Version, Array then new input when "!" then source_set else if input.respond_to? :to_str new [input.to_str] else default end end end |
.default ⇒ Object
76 77 78 |
# File 'lib/rubygems/requirement.rb', line 76 def self.default new ">= 0" end |
.default_prerelease ⇒ Object
80 81 82 |
# File 'lib/rubygems/requirement.rb', line 80 def self.default_prerelease new ">= 0.a" end |
.parse(obj) ⇒ Object
Parse obj
, returning an [op, version]
pair. obj
can be a String or a Gem::Version.
If obj
is a String, it can be either a full requirement specification, like ">= 1.2"
, or a simple version number, like "1.2"
.
parse("> 1.0") # => [">", Gem::Version.new("1.0")]
parse("1.0") # => ["=", Gem::Version.new("1.0")]
parse(Gem::Version.new("1.0")) # => ["=, Gem::Version.new("1.0")]
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
# File 'lib/rubygems/requirement.rb', line 103 def self.parse(obj) return ["=", obj] if Gem::Version === obj unless PATTERN =~ obj.to_s raise BadRequirementError, "Illformed requirement [#{obj.inspect}]" end if $1 == ">=" && $2 == "0" DefaultRequirement elsif $1 == ">=" && $2 == "0.a" DefaultPrereleaseRequirement else [-($1 || "="), Gem::Version.new($2)] end end |
.source_set ⇒ Object
A source set requirement, used for Gemfiles and lockfiles
87 88 89 |
# File 'lib/rubygems/requirement.rb', line 87 def self.source_set # :nodoc: SOURCE_SET_REQUIREMENT end |
Instance Method Details
#==(other) ⇒ Object
:nodoc:
264 265 266 267 268 269 270 271 272 273 274 275 276 |
# File 'lib/rubygems/requirement.rb', line 264 def ==(other) # :nodoc: return unless Gem::Requirement === other # An == check is always necessary return false unless _sorted_requirements == other._sorted_requirements # An == check is sufficient unless any requirements use ~> return true unless _tilde_requirements.any? # If any requirements use ~> we use the stricter `#eql?` that also checks # that version precision is the same _tilde_requirements.eql?(other._tilde_requirements) end |
#as_list ⇒ Object
:nodoc:
189 190 191 |
# File 'lib/rubygems/requirement.rb', line 189 def as_list # :nodoc: requirements.map {|op, version| "#{op} #{version}" } end |
#concat(new) ⇒ Object
Concatenates the new
requirements onto this requirement.
146 147 148 149 150 151 152 153 |
# File 'lib/rubygems/requirement.rb', line 146 def concat(new) new = new.flatten new.compact! new.uniq! new = new.map {|r| self.class.parse r } @requirements.concat new end |
#encode_with(coder) ⇒ Object
:nodoc:
221 222 223 |
# File 'lib/rubygems/requirement.rb', line 221 def encode_with(coder) # :nodoc: coder.add "requirements", @requirements end |
#exact? ⇒ Boolean
true if the requirement is for only an exact version
184 185 186 187 |
# File 'lib/rubygems/requirement.rb', line 184 def exact? return false unless @requirements.size == 1 @requirements[0][0] == "=" end |
#for_lockfile ⇒ Object
Formats this requirement for use in a Gem::RequestSet::Lockfile.
158 159 160 161 162 163 164 165 166 167 168 |
# File 'lib/rubygems/requirement.rb', line 158 def for_lockfile # :nodoc: return if @requirements == [DefaultRequirement] list = requirements.sort_by do |_, version| version end.map do |op, version| "#{op} #{version}" end.uniq " (#{list.join ", "})" end |
#hash ⇒ Object
:nodoc:
193 194 195 |
# File 'lib/rubygems/requirement.rb', line 193 def hash # :nodoc: requirements.map {|r| r.first == "~>" ? [r[0], r[1].to_s] : r }.sort.hash end |
#init_with(coder) ⇒ Object
:nodoc:
213 214 215 |
# File 'lib/rubygems/requirement.rb', line 213 def init_with(coder) # :nodoc: yaml_initialize coder.tag, coder.map end |
#marshal_dump ⇒ Object
:nodoc:
197 198 199 |
# File 'lib/rubygems/requirement.rb', line 197 def marshal_dump # :nodoc: [@requirements] end |
#marshal_load(array) ⇒ Object
:nodoc:
201 202 203 204 205 |
# File 'lib/rubygems/requirement.rb', line 201 def marshal_load(array) # :nodoc: @requirements = array[0] raise TypeError, "wrong @requirements" unless Array === @requirements end |
#none? ⇒ Boolean
true if this gem has no requirements.
173 174 175 176 177 178 179 |
# File 'lib/rubygems/requirement.rb', line 173 def none? if @requirements.size == 1 @requirements[0] == DefaultRequirement else false end end |
#prerelease? ⇒ Boolean
A requirement is a prerelease if any of the versions inside of it are prereleases
229 230 231 |
# File 'lib/rubygems/requirement.rb', line 229 def prerelease? requirements.any? {|r| r.last.prerelease? } end |
#pretty_print(q) ⇒ Object
:nodoc:
233 234 235 236 237 |
# File 'lib/rubygems/requirement.rb', line 233 def pretty_print(q) # :nodoc: q.group 1, "Gem::Requirement.new(", ")" do q.pp as_list end end |
#satisfied_by?(version) ⇒ Boolean Also known as: ===, =~
True if version
satisfies this Requirement.
242 243 244 245 246 |
# File 'lib/rubygems/requirement.rb', line 242 def satisfied_by?(version) raise ArgumentError, "Need a Gem::Version: #{version.inspect}" unless Gem::Version === version requirements.all? {|op, rv| OPS[op].call version, rv } end |
#specific? ⇒ Boolean
True if the requirement will not always match the latest version.
254 255 256 257 258 |
# File 'lib/rubygems/requirement.rb', line 254 def specific? return true if @requirements.length > 1 # GIGO, > 1, > 2 is silly !%w[> >=].include? @requirements.first.first # grab the operator end |
#to_s ⇒ Object
:nodoc:
260 261 262 |
# File 'lib/rubygems/requirement.rb', line 260 def to_s # :nodoc: as_list.join ", " end |
#to_yaml_properties ⇒ Object
:nodoc:
217 218 219 |
# File 'lib/rubygems/requirement.rb', line 217 def to_yaml_properties # :nodoc: ["@requirements"] end |
#yaml_initialize(tag, vals) ⇒ Object
:nodoc:
207 208 209 210 211 |
# File 'lib/rubygems/requirement.rb', line 207 def yaml_initialize(tag, vals) # :nodoc: vals.each do |ivar, val| instance_variable_set "@#{ivar}", val end end |