Class: Pod::Vendor::Gem::Requirement
- Inherits:
-
Object
- Object
- Pod::Vendor::Gem::Requirement
- Defined in:
- lib/cocoapods-core/vendor/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.
Direct Known Subclasses
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 } }
- SOURCE_SET_REQUIREMENT =
:nodoc:
Struct.new(:for_lockfile).new "!"
- PATTERN_RAW =
:nodoc:
"\\s*(#{quoted})?\\s*(#{Gem::Version::VERSION_PATTERN})\\s*"
- PATTERN =
A regular expression that matches a requirement
/\A#{PATTERN_RAW}\z/
- DefaultRequirement =
The default requirement matches any version
[">=", Gem::Version.new(0)]
Instance Attribute Summary collapse
-
#requirements ⇒ Object
readonly
An array of requirement pairs.
Class Method Summary collapse
-
.create(input) ⇒ Object
Factory method to create a Gem::Requirement object.
-
.default ⇒ Object
A default "version requirement" can surely only be '>= 0'.
-
.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.
-
#fix_syck_default_key_in_requirements ⇒ Object
private
:nodoc:.
-
#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".
125 126 127 128 129 130 131 132 133 134 135 |
# File 'lib/cocoapods-core/vendor/requirement.rb', line 125 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.
117 118 119 |
# File 'lib/cocoapods-core/vendor/requirement.rb', line 117 def requirements @requirements end |
Class Method Details
.create(input) ⇒ 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.
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/cocoapods-core/vendor/requirement.rb', line 56 def self.create input 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 then new [input.to_str] else default end end end |
.default ⇒ Object
A default "version requirement" can surely only be '>= 0'.
76 77 78 |
# File 'lib/cocoapods-core/vendor/requirement.rb', line 76 def self.default new '>= 0' 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")]
99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/cocoapods-core/vendor/requirement.rb', line 99 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 else [$1 || "=", Gem::Version.new($2)] end end |
.source_set ⇒ Object
A source set requirement, used for Gemfiles and lockfiles
83 84 85 |
# File 'lib/cocoapods-core/vendor/requirement.rb', line 83 def self.source_set # :nodoc: SOURCE_SET_REQUIREMENT end |
Instance Method Details
#==(other) ⇒ Object
:nodoc:
264 265 266 |
# File 'lib/cocoapods-core/vendor/requirement.rb', line 264 def == other # :nodoc: Gem::Requirement === other and to_s == other.to_s end |
#as_list ⇒ Object
:nodoc:
183 184 185 |
# File 'lib/cocoapods-core/vendor/requirement.rb', line 183 def as_list # :nodoc: requirements.map { |op, version| "#{op} #{version}" }.sort end |
#concat(new) ⇒ Object
Concatenates the +new+ requirements onto this requirement.
140 141 142 143 144 145 146 147 |
# File 'lib/cocoapods-core/vendor/requirement.rb', line 140 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:
220 221 222 |
# File 'lib/cocoapods-core/vendor/requirement.rb', line 220 def encode_with coder # :nodoc: coder.add 'requirements', @requirements end |
#exact? ⇒ Boolean
true if the requirement is for only an exact version
178 179 180 181 |
# File 'lib/cocoapods-core/vendor/requirement.rb', line 178 def exact? return false unless @requirements.size == 1 @requirements[0][0] == "=" end |
#fix_syck_default_key_in_requirements ⇒ Object (private)
:nodoc:
270 271 272 273 274 275 276 277 278 279 |
# File 'lib/cocoapods-core/vendor/requirement.rb', line 270 def fix_syck_default_key_in_requirements # :nodoc: Gem.load_yaml # Fixup the Syck DefaultKey bug @requirements.each do |r| if r[0].kind_of? Gem::SyckDefaultKey r[0] = "=" end end end |
#for_lockfile ⇒ Object
Formats this requirement for use in a Gem::RequestSet::Lockfile.
152 153 154 155 156 157 158 159 160 161 162 |
# File 'lib/cocoapods-core/vendor/requirement.rb', line 152 def for_lockfile # :nodoc: return if [DefaultRequirement] == @requirements list = requirements.sort_by { |_, version| version }.map { |op, version| "#{op} #{version}" }.uniq " (#{list.join ', '})" end |
#hash ⇒ Object
:nodoc:
187 188 189 |
# File 'lib/cocoapods-core/vendor/requirement.rb', line 187 def hash # :nodoc: requirements.sort.hash end |
#init_with(coder) ⇒ Object
:nodoc:
212 213 214 |
# File 'lib/cocoapods-core/vendor/requirement.rb', line 212 def init_with coder # :nodoc: yaml_initialize coder.tag, coder.map end |
#marshal_dump ⇒ Object
:nodoc:
191 192 193 194 195 |
# File 'lib/cocoapods-core/vendor/requirement.rb', line 191 def marshal_dump # :nodoc: fix_syck_default_key_in_requirements [@requirements] end |
#marshal_load(array) ⇒ Object
:nodoc:
197 198 199 200 201 |
# File 'lib/cocoapods-core/vendor/requirement.rb', line 197 def marshal_load array # :nodoc: @requirements = array[0] fix_syck_default_key_in_requirements end |
#none? ⇒ Boolean
true if this gem has no requirements.
167 168 169 170 171 172 173 |
# File 'lib/cocoapods-core/vendor/requirement.rb', line 167 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
228 229 230 |
# File 'lib/cocoapods-core/vendor/requirement.rb', line 228 def prerelease? requirements.any? { |r| r.last.prerelease? } end |
#pretty_print(q) ⇒ Object
:nodoc:
232 233 234 235 236 |
# File 'lib/cocoapods-core/vendor/requirement.rb', line 232 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.
241 242 243 244 245 246 |
# File 'lib/cocoapods-core/vendor/requirement.rb', line 241 def satisfied_by? version raise ArgumentError, "Need a Gem::Version: #{version.inspect}" unless Gem::Version === version # #28965: syck has a bug with unquoted '=' YAML.loading as YAML::DefaultKey requirements.all? { |op, rv| (OPS[op] || OPS["="]).call version, rv } end |
#specific? ⇒ Boolean
True if the requirement will not always match the latest version.
254 255 256 257 258 |
# File 'lib/cocoapods-core/vendor/requirement.rb', line 254 def specific? return true if @requirements.length > 1 # GIGO, > 1, > 2 is silly not %w[> >=].include? @requirements.first.first # grab the operator end |
#to_s ⇒ Object
:nodoc:
260 261 262 |
# File 'lib/cocoapods-core/vendor/requirement.rb', line 260 def to_s # :nodoc: as_list.join ", " end |
#to_yaml_properties ⇒ Object
:nodoc:
216 217 218 |
# File 'lib/cocoapods-core/vendor/requirement.rb', line 216 def to_yaml_properties # :nodoc: ["@requirements"] end |
#yaml_initialize(tag, vals) ⇒ Object
:nodoc:
203 204 205 206 207 208 209 210 |
# File 'lib/cocoapods-core/vendor/requirement.rb', line 203 def yaml_initialize(tag, vals) # :nodoc: vals.each do |ivar, val| instance_variable_set "@#{ivar}", val end Gem.load_yaml fix_syck_default_key_in_requirements end |