Class: Pod::Vendor::Gem::Requirement

Inherits:
Object
  • Object
show all
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

Requirement

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

Class Method Summary collapse

Instance Method Summary collapse

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".


124
125
126
127
128
129
130
131
132
133
134
# File 'lib/cocoapods-core/vendor/requirement.rb', line 124

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

#requirementsObject (readonly)

An array of requirement pairs. The first element of the pair is the op, and the second is the Gem::Version.


116
117
118
# File 'lib/cocoapods-core/vendor/requirement.rb', line 116

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.


55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/cocoapods-core/vendor/requirement.rb', line 55

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

.defaultObject

A default "version requirement" can surely only be '>= 0'.


75
76
77
# File 'lib/cocoapods-core/vendor/requirement.rb', line 75

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")                 # => [">", "1.0"]
parse("1.0")                   # => ["=", "1.0"]
parse(Gem::Version.new("1.0")) # => ["=,  "1.0"]

98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/cocoapods-core/vendor/requirement.rb', line 98

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_setObject

A source set requirement, used for Gemfiles and lockfiles


82
83
84
# File 'lib/cocoapods-core/vendor/requirement.rb', line 82

def self.source_set # :nodoc:
  SOURCE_SET_REQUIREMENT
end

Instance Method Details

#==(other) ⇒ Object

:nodoc:


263
264
265
# File 'lib/cocoapods-core/vendor/requirement.rb', line 263

def == other # :nodoc:
  Gem::Requirement === other and to_s == other.to_s
end

#as_listObject

:nodoc:


182
183
184
# File 'lib/cocoapods-core/vendor/requirement.rb', line 182

def as_list # :nodoc:
  requirements.map { |op, version| "#{op} #{version}" }.sort
end

#concat(new) ⇒ Object

Concatenates the +new+ requirements onto this requirement.


139
140
141
142
143
144
145
146
# File 'lib/cocoapods-core/vendor/requirement.rb', line 139

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:


219
220
221
# File 'lib/cocoapods-core/vendor/requirement.rb', line 219

def encode_with coder # :nodoc:
  coder.add 'requirements', @requirements
end

#exact?Boolean

true if the requirement is for only an exact version


177
178
179
180
# File 'lib/cocoapods-core/vendor/requirement.rb', line 177

def exact?
  return false unless @requirements.size == 1
  @requirements[0][0] == "="
end

#fix_syck_default_key_in_requirementsObject (private)

:nodoc:


269
270
271
272
273
274
275
276
277
278
# File 'lib/cocoapods-core/vendor/requirement.rb', line 269

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_lockfileObject

Formats this requirement for use in a Gem::RequestSet::Lockfile.


151
152
153
154
155
156
157
158
159
160
161
# File 'lib/cocoapods-core/vendor/requirement.rb', line 151

def for_lockfile # :nodoc:
  return if [DefaultRequirement] == @requirements

  list = requirements.sort_by { |_, version|
    version
  }.map { |op, version|
    "#{op} #{version}"
  }.uniq

  " (#{list.join ', '})"
end

#hashObject

:nodoc:


186
187
188
# File 'lib/cocoapods-core/vendor/requirement.rb', line 186

def hash # :nodoc:
  requirements.sort.hash
end

#init_with(coder) ⇒ Object

:nodoc:


211
212
213
# File 'lib/cocoapods-core/vendor/requirement.rb', line 211

def init_with coder # :nodoc:
  yaml_initialize coder.tag, coder.map
end

#marshal_dumpObject

:nodoc:


190
191
192
193
194
# File 'lib/cocoapods-core/vendor/requirement.rb', line 190

def marshal_dump # :nodoc:
  fix_syck_default_key_in_requirements

  [@requirements]
end

#marshal_load(array) ⇒ Object

:nodoc:


196
197
198
199
200
# File 'lib/cocoapods-core/vendor/requirement.rb', line 196

def marshal_load array # :nodoc:
  @requirements = array[0]

  fix_syck_default_key_in_requirements
end

#none?Boolean

true if this gem has no requirements.


166
167
168
169
170
171
172
# File 'lib/cocoapods-core/vendor/requirement.rb', line 166

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


227
228
229
# File 'lib/cocoapods-core/vendor/requirement.rb', line 227

def prerelease?
  requirements.any? { |r| r.last.prerelease? }
end

#pretty_print(q) ⇒ Object

:nodoc:


231
232
233
234
235
# File 'lib/cocoapods-core/vendor/requirement.rb', line 231

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.

Raises:

  • (ArgumentError)

240
241
242
243
244
245
# File 'lib/cocoapods-core/vendor/requirement.rb', line 240

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.


253
254
255
256
257
# File 'lib/cocoapods-core/vendor/requirement.rb', line 253

def specific?
  return true if @requirements.length > 1 # GIGO, > 1, > 2 is silly

  not %w[> >=].include? @requirements.first.first # grab the operator
end

#to_sObject

:nodoc:


259
260
261
# File 'lib/cocoapods-core/vendor/requirement.rb', line 259

def to_s # :nodoc:
  as_list.join ", "
end

#to_yaml_propertiesObject

:nodoc:


215
216
217
# File 'lib/cocoapods-core/vendor/requirement.rb', line 215

def to_yaml_properties # :nodoc:
  ["@requirements"]
end

#yaml_initialize(tag, vals) ⇒ Object

:nodoc:


202
203
204
205
206
207
208
209
# File 'lib/cocoapods-core/vendor/requirement.rb', line 202

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