cocoapods-core 0.17.2 → 0.18.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 947ec8b96eb3185b766c593bb593b2581c52b638
4
- data.tar.gz: 4a98493b105f0b2992122ece671512f3d479097a
3
+ metadata.gz: b8cd1d3394fab84bd79670bad3389820b40a6110
4
+ data.tar.gz: 064af0e2916d74b5ea2db298397198e9a06c204a
5
5
  SHA512:
6
- metadata.gz: 0eea0f9b451e7ece86fdcfb637a91b82517bb623d14a505c73f470b1826d9929672c15cd83c1fa7b027e85b797611beac28686f958b9ae2ffe0ab80f31895138
7
- data.tar.gz: da57b1c31ee3fa64a5ea3948497307bb65812b9b50117a61cd0ebe4be3986d7ba19af02ca04d2296d34be31c2e5cd19849e4555548e79ce869755276d8bf2e17
6
+ metadata.gz: 8445099953c499685134515408e0c1640e46509181b9b3a743b47716bcbfa9004b9b7b6063e2dde0261d4c842a945a6649f953d678f5e9bda0b7cf86ceb974f3
7
+ data.tar.gz: b6e932b7c370d35f851683cd79ebafb3152eea3349dcc1f27bc46697da0cd88633854e15c3b06f151bd7d027bcfe63967b6bc14e3779b4db6fc00149346e4883
@@ -4,10 +4,16 @@ module Pod
4
4
  # {Specification} on a Pod. It stores the name of the dependency, version
5
5
  # requirements and external sources information.
6
6
  #
7
- # This class leverages the RubyGems dependency class with minor extension to
8
- # support CocoaPods specific features like subspecs.
7
+ # This class is based on the dependency class of RubyGems and mimics its
8
+ # implementation with adjustments specific to CocoaPods. RubyGems is
9
+ # available under the
10
+ # [MIT license](https://github.com/rubygems/rubygems/blob/master/MIT.txt).
9
11
  #
10
- class Dependency < Pod::Vendor::Gem::Dependency
12
+ class Dependency
13
+
14
+ # @return [String] The name of the Pod described by this dependency.
15
+ #
16
+ attr_accessor :name
11
17
 
12
18
  # @return [Hash{Symbol=>String}] a hash describing the external source
13
19
  # where the pod should be fetched. The external source has to
@@ -27,7 +33,7 @@ module Pod
27
33
  # @param [String] name
28
34
  # the name of the Pod.
29
35
  #
30
- # @param [Array] requirements
36
+ # @param [Array, Version, String, Requirement] requirements
31
37
  # an array specifying the version requirements of the
32
38
  # dependency.
33
39
  #
@@ -78,7 +84,11 @@ module Pod
78
84
  end
79
85
  end
80
86
 
81
- super(name, *requirements)
87
+ if requirements.length == 1 && requirements.first.is_a?(Requirement)
88
+ requirements = requirements.first
89
+ end
90
+ @name = name
91
+ @requirement = Requirement.create(requirements)
82
92
  end
83
93
 
84
94
  # @return [Version] whether the dependency points to a specific version.
@@ -94,7 +104,7 @@ module Pod
94
104
  #
95
105
  def requirement
96
106
  return Requirement.new(Version.new(specific_version.version)) if specific_version
97
- super
107
+ @requirement
98
108
  end
99
109
 
100
110
  # @return [Bool] whether the dependency points to a subspec.
@@ -117,6 +127,9 @@ module Pod
117
127
  # what particular specification (subspecs or top level) is
118
128
  # required.
119
129
  #
130
+ # @todo This should not use `dup`. The `name` property should be an
131
+ # attr_reader.
132
+ #
120
133
  # @return [Dependency] a dependency with the same versions requirements
121
134
  # that is guaranteed to point to a top level specification.
122
135
  #
@@ -165,10 +178,28 @@ module Pod
165
178
  # external source.
166
179
  #
167
180
  def ==(other)
168
- super && head? == other.head? && @external_source == other.external_source
181
+ Dependency === other &&
182
+ name == other.name &&
183
+ requirement == other.requirement &&
184
+ head? == other.head? &&
185
+ external_source == other.external_source
169
186
  end
170
187
  alias :eql? :==
171
188
 
189
+ # @return [Fixnum] The hash value based on the name and on the
190
+ # requirements.
191
+ #
192
+ def hash
193
+ name.hash ^ requirement.hash
194
+ end
195
+
196
+ # @return [Fixnum] How the dependency should be sorted respect to another
197
+ # one according to its name.
198
+ #
199
+ def <=> other
200
+ self.name <=> other.name
201
+ end
202
+
172
203
  # Merges the version requirements of the dependency with another one.
173
204
  #
174
205
  # @param [Dependency] other
@@ -181,7 +212,21 @@ module Pod
181
212
  # includes also the version requirements of the given one.
182
213
  #
183
214
  def merge(other)
184
- dep = super
215
+ unless name == other.name then
216
+ raise ArgumentError, "#{self} and #{other} have different names"
217
+ end
218
+ default = Requirement.default
219
+ self_req = self.requirement
220
+ other_req = other.requirement
221
+
222
+ if other_req == default
223
+ dep = self.class.new(name, self_req)
224
+ elsif self_req == default
225
+ dep = self.class.new(name, other_req)
226
+ else
227
+ dep = self.class.new(name, self_req.as_list.concat(other_req.as_list))
228
+ end
229
+
185
230
  dep.head = head? || other.head?
186
231
  if external_source || other.external_source
187
232
  self_external_source = external_source || {}
@@ -191,6 +236,23 @@ module Pod
191
236
  dep
192
237
  end
193
238
 
239
+ # Checks whether the dependency would be satisfied by the specification
240
+ # with the given name and version.
241
+ #
242
+ # @param [String]
243
+ # The proposed name.
244
+ #
245
+ # @param [String, Version] version
246
+ # The proposed version.
247
+ #
248
+ # @return [Bool] Whether the dependency is satisfied.
249
+ #
250
+ def match?(name, version)
251
+ return false unless self.name === name
252
+ return true if requirement.none?
253
+ requirement.satisfied_by?(Version.new(version))
254
+ end
255
+
194
256
  #-------------------------------------------------------------------------#
195
257
 
196
258
  # !@group String representation
@@ -220,8 +282,8 @@ module Pod
220
282
  version << external_source_description(external_source)
221
283
  elsif head?
222
284
  version << 'HEAD'
223
- elsif @version_requirements != Requirement.default
224
- version << @version_requirements.to_s
285
+ elsif requirement != Requirement.default
286
+ version << requirement.to_s
225
287
  end
226
288
  result = @name.dup
227
289
  result << " (#{version})" unless version.empty?
@@ -2,5 +2,5 @@ module Pod
2
2
 
3
3
  # The version of the cocoapods-core.
4
4
  #
5
- CORE_VERSION = '0.17.2' unless defined? Pod::CORE_VERSION
5
+ CORE_VERSION = '0.18.0' unless defined? Pod::CORE_VERSION
6
6
  end
@@ -88,6 +88,26 @@ module Pod
88
88
  #
89
89
  # Dependencies can be obtained also from external sources.
90
90
  #
91
+ #
92
+ # ### Using the files from a folder local to the machine.
93
+ #
94
+ # If you wold like to use develop a Pod in tandem with its client
95
+ # project you can use the `local` option.
96
+ #
97
+ # pod 'AFNetworking', :local => '~/Documents/AFNetworking'
98
+ #
99
+ # Using this option CocoaPods will assume the given folder to be the
100
+ # root of the Pod and will link the files directly from there in the
101
+ # Pods project. This means that your edits will persist to CocoaPods
102
+ # installations.
103
+ #
104
+ # The referenced folder can be a checkout of your your favorite SCM or
105
+ # even a git submodule of the current repo.
106
+ #
107
+ # Note that the `podspec` of the Pod file is expected to be in the
108
+ # folder.
109
+ #
110
+ #
91
111
  # ### From a podspec in the root of a library repo.
92
112
  #
93
113
  # Sometimes you may want to use the bleeding edge version of a Pod. Or a
@@ -103,16 +123,9 @@ module Pod
103
123
  #
104
124
  # pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :commit => '082f8319af'
105
125
  #
106
- #
107
- # Or specify a local folder in the machine:
108
- #
109
- # pod 'AFNetworking', :local => '~/Documents/AFNetworking'
110
- #
111
- #
112
126
  # It is important to note, though, that this means that the version will
113
127
  # have to satisfy any other dependencies on the Pod by other Pods.
114
128
  #
115
- #
116
129
  # The `podspec` file is expected to be in the root of the repo, if this
117
130
  # library does not have a `podspec` file in its repo yet, you will have
118
131
  # to use one of the approaches outlined in the sections below.
@@ -125,6 +138,7 @@ module Pod
125
138
  #
126
139
  # pod 'JSONKit', :podspec => 'https://raw.github.com/gist/1346394/1d26570f68ca27377a27430c65841a0880395d72/JSONKit.podspec'
127
140
  #
141
+ #
128
142
  # @note This method allow a nil name and the raises to be more
129
143
  # informative.
130
144
  #
@@ -351,6 +365,11 @@ module Pod
351
365
  #
352
366
  # This attribute is inherited by child target definitions.
353
367
  #
368
+ # If you would like to inhibit warnings per Pod you can use the
369
+ # following syntax:
370
+ #
371
+ # pod 'SSZipArchive', :inhibit_warnings => true
372
+ #
354
373
  def inhibit_all_warnings!
355
374
  current_target_definition.inhibit_all_warnings = true
356
375
  end
@@ -267,15 +267,19 @@ module Pod
267
267
 
268
268
  #--------------------------------------#
269
269
 
270
- # @return [Bool] whether the target definition should silence all the
271
- # warnings with a compiler flag.
270
+ # @return [Bool] whether the target definition should inhibit warnings
271
+ # for a single pod. If inhibit_all_warnings is true, it will
272
+ # return true for any asked pod.
272
273
  #
273
- def inhibit_all_warnings?
274
- get_hash_value('inhibit_all_warnings') || (parent.inhibit_all_warnings? unless root?)
274
+ def inhibits_warnings_for_pod?(pod_name)
275
+ return true if inhibit_warnings_hash['all'] || (parent.inhibits_warnings_for_pod?(name) unless root?)
276
+
277
+ inhibit_warnings_hash['for_pods'] ||= []
278
+ inhibit_warnings_hash['for_pods'].include? pod_name
275
279
  end
276
280
 
277
281
  # Sets whether the target definition should inhibit the warnings during
278
- # compilation.
282
+ # compilation for all pods.
279
283
  #
280
284
  # @param [Bool] flag
281
285
  # Whether the warnings should be suppressed.
@@ -283,7 +287,19 @@ module Pod
283
287
  # @return [void]
284
288
  #
285
289
  def inhibit_all_warnings=(flag)
286
- set_hash_value('inhibit_all_warnings', flag)
290
+ inhibit_warnings_hash['all'] = flag
291
+ end
292
+
293
+ # Inhibits warnings for a specific pod during compilation.
294
+ #
295
+ # @param [String] pod name
296
+ # Whether the warnings should be suppressed.
297
+ #
298
+ # @return [void]
299
+ #
300
+ def inhibit_warnings_for_pod(pod_name)
301
+ inhibit_warnings_hash['for_pods'] ||= []
302
+ inhibit_warnings_hash['for_pods'] << pod_name
287
303
  end
288
304
 
289
305
  #--------------------------------------#
@@ -354,11 +370,14 @@ module Pod
354
370
  # @return [void]
355
371
  #
356
372
  def store_pod(name, *requirements)
373
+ parse_inhibit_warnings(name, requirements)
374
+
357
375
  if requirements && !requirements.empty?
358
376
  pod = { name => requirements }
359
377
  else
360
378
  pod = name
361
379
  end
380
+
362
381
  get_hash_value('dependencies', []) << pod
363
382
  end
364
383
 
@@ -406,7 +425,7 @@ module Pod
406
425
  'exclusive',
407
426
  'link_with',
408
427
  'link_with_first_target',
409
- 'inhibit_all_warnings',
428
+ 'inhibit_warnings',
410
429
  'user_project_path',
411
430
  'build_configurations',
412
431
  'dependencies',
@@ -491,6 +510,16 @@ module Pod
491
510
  internal_hash[key] ||= base_value
492
511
  end
493
512
 
513
+ # Returns the inhibit_warnings hash prepopulated with default values
514
+ #
515
+ # @return [Hash<String, Array>] Hash with :all key for inhibiting all warnings,
516
+ # and :for_pods key for inhibiting warnings per pod
517
+ #
518
+ def inhibit_warnings_hash
519
+ get_hash_value('inhibit_warnings', {})
520
+ end
521
+
522
+
494
523
  # @return [Array<Dependency>] The dependencies specified by the user for
495
524
  # this target definition.
496
525
  #
@@ -547,6 +576,27 @@ module Pod
547
576
  end
548
577
  end
549
578
 
579
+ # Removes :inhibit_warnings from the requirements list, and adds
580
+ # the pod's name into internal hash for disabling warnings.
581
+ #
582
+ # @param [String] pod name
583
+ #
584
+ # @param [Array] requirements
585
+ # If :inhibit_warnings is the only key in the hash, the hash
586
+ # should be destroyed because it confuses Gem::Dependency.
587
+ #
588
+ # @return [void]
589
+ #
590
+ def parse_inhibit_warnings(name, requirements)
591
+ options = requirements.last
592
+ return requirements unless options.is_a?(Hash)
593
+
594
+ should_inhibit = options.delete(:inhibit_warnings)
595
+ inhibit_warnings_for_pod(name) if should_inhibit
596
+
597
+ requirements.pop if options.empty?
598
+ end
599
+
550
600
  #-----------------------------------------------------------------------#
551
601
 
552
602
  end
@@ -10,6 +10,66 @@ module Pod
10
10
  # the Dependency class.
11
11
  #
12
12
  class Requirement < Pod::Vendor::Gem::Requirement
13
+
14
+ quoted_operators = OPS.keys.map { |k| Regexp.quote k }.join "|"
15
+
16
+ # @return [Regexp] The regular expression used to validate input strings.
17
+ #
18
+ PATTERN = /\A\s*(#{quoted_operators})?\s*(#{Version::VERSION_PATTERN})\s*\z/
19
+
20
+ #-------------------------------------------------------------------------#
21
+
22
+ # Factory method to create a new requirement.
23
+ #
24
+ # @param [Requirement, Version, Array<Version>, String, Nil] input
25
+ # The input used to create the requirement.
26
+ #
27
+ # @return [Requirement] A new requirement.
28
+ #
29
+ def self.create(input)
30
+ case input
31
+ when Requirement
32
+ input
33
+ when Version, Array
34
+ new(input)
35
+ else
36
+ if input.respond_to? :to_str
37
+ new([input.to_str])
38
+ else
39
+ default
40
+ end
41
+ end
42
+ end
43
+
44
+ # @return [Requirement] The default requirement.
45
+ #
46
+ def self.default
47
+ new('>= 0')
48
+ end
49
+
50
+ # Parses the given object returning an tuple where the first entry is an
51
+ # operator and the second a version. If not operator is provided it
52
+ # defaults to `=`.
53
+ #
54
+ # @param [String, Version] input
55
+ # The input passed to create the requirement.
56
+ #
57
+ # @return [Array] A tuple representing the requirement.
58
+ #
59
+ def self.parse(input)
60
+ return ["=", input] if input.is_a?(Version)
61
+
62
+ unless PATTERN =~ input.to_s
63
+ raise ArgumentError, "Illformed requirement `#{input.inspect}`"
64
+ end
65
+
66
+ operator = $1 || "="
67
+ version = Version.new($2)
68
+ [operator, version]
69
+ end
70
+
71
+ #-------------------------------------------------------------------------#
72
+
13
73
  end
14
74
 
15
75
  end
@@ -29,7 +29,7 @@ module Pod
29
29
  # @return [String] the name of the source.
30
30
  #
31
31
  def name
32
- @repo.basename.to_s
32
+ repo.basename.to_s
33
33
  end
34
34
 
35
35
  alias_method :to_s, :name
@@ -53,7 +53,7 @@ module Pod
53
53
  # @return [Array<String>] the list of the name of all the Pods.
54
54
  #
55
55
  def pods
56
- @repo.children.map do |child|
56
+ specs_dir.children.map do |child|
57
57
  child.basename.to_s if child.directory? && child.basename.to_s != '.git'
58
58
  end.compact
59
59
  end
@@ -71,7 +71,7 @@ module Pod
71
71
  # the name of the Pod.
72
72
  #
73
73
  def versions(name)
74
- pod_dir = repo + name
74
+ pod_dir = specs_dir + name
75
75
  return unless pod_dir.exist?
76
76
  pod_dir.children.map do |v|
77
77
  basename = v.basename.to_s
@@ -98,7 +98,7 @@ module Pod
98
98
  # @return [Pathname] The path of the specification.
99
99
  #
100
100
  def specification_path(name, version)
101
- path = repo + name + version.to_s
101
+ path = specs_dir + name + version.to_s
102
102
  specification_path = path + "#{name}.podspec.yaml"
103
103
  unless specification_path.exist?
104
104
  specification_path = path + "#{name}.podspec"
@@ -194,6 +194,31 @@ module Pod
194
194
  to_hash.to_yaml
195
195
  end
196
196
 
197
+ private
198
+
199
+ #-------------------------------------------------------------------------#
200
+
201
+ # @group Private Helpers
202
+
203
+ # @return [Pathname] The directory where the specs are stored.
204
+ #
205
+ # @note In previous versions of CocoaPods they used to be stored in
206
+ # the root of the repo. This lead to issues, especially with
207
+ # the GitHub interface and now the are stored in a dedicated
208
+ # folder.
209
+ #
210
+ def specs_dir
211
+ unless @specs_dir
212
+ specs_sub_dir = repo + 'Specs'
213
+ if repo.children.include?(specs_sub_dir)
214
+ @specs_dir = repo + 'Specs'
215
+ else
216
+ @specs_dir = repo
217
+ end
218
+ end
219
+ @specs_dir
220
+ end
221
+
197
222
  #-------------------------------------------------------------------------#
198
223
 
199
224
  end
@@ -111,7 +111,7 @@ module Pod
111
111
  #
112
112
  def check_spec_path(name, version, spec)
113
113
  unless spec.name == name && spec.version.to_s == version.to_s
114
- report.add_message(:error, "Incorrect path", name, spec.version)
114
+ report.add_message(:error, "Incorrect path #{ spec.defined_in_file }", name, spec.version)
115
115
  end
116
116
  end
117
117
 
@@ -21,9 +21,33 @@ module Pod
21
21
  # without loss of information.
22
22
  #
23
23
  def safe_to_hash?
24
- pre_install_callback.nil? && post_install_callback.nil?
24
+ !has_file_list(self) && pre_install_callback.nil? && post_install_callback.nil?
25
25
  end
26
26
 
27
+ # @return [Bool] If any of the specs uses the FileList class.
28
+ #
29
+ def has_file_list(spec)
30
+ result = false
31
+ all_specs = [ spec, *spec.recursive_subspecs ]
32
+ all_specs.each do |current_spec|
33
+ current_spec.available_platforms.each do |platform|
34
+ consumer = Specification::Consumer.new(current_spec, platform)
35
+ attributes = DSL.attributes.values.select(&:file_patterns?)
36
+ attributes.each do |attrb|
37
+ patterns = consumer.send(attrb.name)
38
+ if patterns.is_a?(Hash)
39
+ patterns = patterns.values.flatten(1)
40
+ end
41
+ patterns.each do |pattern|
42
+ if pattern.is_a?(Rake::FileList)
43
+ result = true
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ result
50
+ end
27
51
  end
28
52
 
29
53
  # Configures a new specification from the given hash.
@@ -39,7 +63,7 @@ module Pod
39
63
  subspecs = attributes_hash.delete('subspecs')
40
64
  spec.attributes_hash = attributes_hash
41
65
  if subspecs
42
- spec.subspecs = subspecs.map { |hash| Specification.from_hash(hash) }
66
+ spec.subspecs = subspecs.map { |s_hash| Specification.from_hash(s_hash) }
43
67
  end
44
68
  spec
45
69
  end
@@ -22,11 +22,10 @@ module Pod
22
22
 
23
23
  require 'cocoapods-core/vendor/version'
24
24
  require 'cocoapods-core/vendor/requirement'
25
- require 'cocoapods-core/vendor/dependency'
26
25
 
27
26
  #-----------------------------------------------------------------------#
28
27
  # RubyGems License #
29
- # https://github.com/rubygems/rubygems/blob/master/MIT.txt
28
+ # https://github.com/rubygems/rubygems/blob/master/MIT.txt #
30
29
  #-----------------------------------------------------------------------#
31
30
 
32
31
  # Copyright (c) Chad Fowler, Rich Kilmer, Jim Weirich and others.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cocoapods-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.17.2
4
+ version: 0.18.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eloy Duran
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-03 00:00:00.000000000 Z
12
+ date: 2013-04-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -119,7 +119,6 @@ files:
119
119
  - lib/cocoapods-core/specification/yaml.rb
120
120
  - lib/cocoapods-core/specification.rb
121
121
  - lib/cocoapods-core/standard_error.rb
122
- - lib/cocoapods-core/vendor/dependency.rb
123
122
  - lib/cocoapods-core/vendor/requirement.rb
124
123
  - lib/cocoapods-core/vendor/version.rb
125
124
  - lib/cocoapods-core/vendor.rb
@@ -1,264 +0,0 @@
1
- module Pod::Vendor
2
-
3
- # require "rubygems/requirement"
4
-
5
- ##
6
- # The Dependency class holds a Gem name and a Gem::Requirement.
7
-
8
- class Gem::Dependency
9
-
10
- ##
11
- # Valid dependency types.
12
- #--
13
- # When this list is updated, be sure to change
14
- # Gem::Specification::CURRENT_SPECIFICATION_VERSION as well.
15
-
16
- TYPES = [
17
- :development,
18
- :runtime,
19
- ]
20
-
21
- ##
22
- # Dependency name or regular expression.
23
-
24
- attr_accessor :name
25
-
26
- ##
27
- # Allows you to force this dependency to be a prerelease.
28
-
29
- attr_writer :prerelease
30
-
31
- ##
32
- # Constructs a dependency with +name+ and +requirements+. The last
33
- # argument can optionally be the dependency type, which defaults to
34
- # <tt>:runtime</tt>.
35
-
36
- def initialize name, *requirements
37
- if Regexp === name then
38
- msg = ["NOTE: Dependency.new w/ a regexp is deprecated.",
39
- "Dependency.new called from #{Gem.location_of_caller.join(":")}"]
40
- warn msg.join("\n") unless Gem::Deprecate.skip
41
- end
42
-
43
- type = Symbol === requirements.last ? requirements.pop : :runtime
44
- requirements = requirements.first if 1 == requirements.length # unpack
45
-
46
- unless TYPES.include? type
47
- raise ArgumentError, "Valid types are #{TYPES.inspect}, "
48
- + "not #{type.inspect}"
49
- end
50
-
51
- @name = name
52
- @requirement = Gem::Requirement.create requirements
53
- @type = type
54
- @prerelease = false
55
-
56
- # This is for Marshal backwards compatibility. See the comments in
57
- # +requirement+ for the dirty details.
58
-
59
- @version_requirements = @requirement
60
- end
61
-
62
- ##
63
- # A dependency's hash is the XOR of the hashes of +name+, +type+,
64
- # and +requirement+.
65
-
66
- def hash # :nodoc:
67
- name.hash ^ type.hash ^ requirement.hash
68
- end
69
-
70
- def inspect # :nodoc:
71
- "<%s type=%p name=%p requirements=%p>" %
72
- [self.class, self.type, self.name, requirement.to_s]
73
- end
74
-
75
- ##
76
- # Does this dependency require a prerelease?
77
-
78
- def prerelease?
79
- @prerelease || requirement.prerelease?
80
- end
81
-
82
- def pretty_print q # :nodoc:
83
- q.group 1, 'Gem::Dependency.new(', ')' do
84
- q.pp name
85
- q.text ','
86
- q.breakable
87
-
88
- q.pp requirement
89
-
90
- q.text ','
91
- q.breakable
92
-
93
- q.pp type
94
- end
95
- end
96
-
97
- ##
98
- # What does this dependency require?
99
-
100
- def requirement
101
- return @requirement if defined?(@requirement) and @requirement
102
-
103
- # @version_requirements and @version_requirement are legacy ivar
104
- # names, and supported here because older gems need to keep
105
- # working and Dependency doesn't implement marshal_dump and
106
- # marshal_load. In a happier world, this would be an
107
- # attr_accessor. The horrifying instance_variable_get you see
108
- # below is also the legacy of some old restructurings.
109
- #
110
- # Note also that because of backwards compatibility (loading new
111
- # gems in an old RubyGems installation), we can't add explicit
112
- # marshaling to this class until we want to make a big
113
- # break. Maybe 2.0.
114
- #
115
- # Children, define explicit marshal and unmarshal behavior for
116
- # public classes. Marshal formats are part of your public API.
117
-
118
- if defined?(@version_requirement) && @version_requirement
119
- version = @version_requirement.instance_variable_get :@version
120
- @version_requirement = nil
121
- @version_requirements = Gem::Requirement.new version
122
- end
123
-
124
- @requirement = @version_requirements if defined?(@version_requirements)
125
- end
126
-
127
- def requirements_list
128
- requirement.as_list
129
- end
130
-
131
- def to_s # :nodoc:
132
- if type != :runtime then
133
- "#{name} (#{requirement}, #{type})"
134
- else
135
- "#{name} (#{requirement})"
136
- end
137
- end
138
-
139
- ##
140
- # Dependency type.
141
-
142
- def type
143
- @type ||= :runtime
144
- end
145
-
146
- def == other # :nodoc:
147
- Gem::Dependency === other &&
148
- self.name == other.name &&
149
- self.type == other.type &&
150
- self.requirement == other.requirement
151
- end
152
-
153
- ##
154
- # Dependencies are ordered by name.
155
-
156
- def <=> other
157
- self.name <=> other.name
158
- end
159
-
160
- ##
161
- # Uses this dependency as a pattern to compare to +other+. This
162
- # dependency will match if the name matches the other's name, and
163
- # other has only an equal version requirement that satisfies this
164
- # dependency.
165
-
166
- def =~ other
167
- unless Gem::Dependency === other
168
- return unless other.respond_to?(:name) && other.respond_to?(:version)
169
- other = Gem::Dependency.new other.name, other.version
170
- end
171
-
172
- return false unless name === other.name
173
-
174
- reqs = other.requirement.requirements
175
-
176
- return false unless reqs.length == 1
177
- return false unless reqs.first.first == '='
178
-
179
- version = reqs.first.last
180
-
181
- requirement.satisfied_by? version
182
- end
183
-
184
- def match? name, version
185
- return false unless self.name === name
186
- return true if requirement.none?
187
-
188
- requirement.satisfied_by? Gem::Version.new(version)
189
- end
190
-
191
- def matches_spec? spec
192
- return false unless name === spec.name
193
- return true if requirement.none?
194
-
195
- requirement.satisfied_by?(spec.version)
196
- end
197
-
198
- ##
199
- # Merges the requirements of +other+ into this dependency
200
-
201
- def merge other
202
- unless name == other.name then
203
- raise ArgumentError,
204
- "#{self} and #{other} have different names"
205
- end
206
-
207
- default = Gem::Requirement.default
208
- self_req = self.requirement
209
- other_req = other.requirement
210
-
211
- return self.class.new name, self_req if other_req == default
212
- return self.class.new name, other_req if self_req == default
213
-
214
- self.class.new name, self_req.as_list.concat(other_req.as_list)
215
- end
216
-
217
- def matching_specs platform_only = false
218
- matches = Gem::Specification.find_all { |spec|
219
- self.name === spec.name and # TODO: == instead of ===
220
- requirement.satisfied_by? spec.version
221
- }
222
-
223
- if platform_only
224
- matches.reject! { |spec|
225
- not Gem::Platform.match spec.platform
226
- }
227
- end
228
-
229
- matches = matches.sort_by { |s| s.sort_obj } # HACK: shouldn't be needed
230
- end
231
-
232
- ##
233
- # True if the dependency will not always match the latest version.
234
-
235
- def specific?
236
- @requirement.specific?
237
- end
238
-
239
- def to_specs
240
- matches = matching_specs true
241
-
242
- # TODO: check Gem.activated_spec[self.name] in case matches falls outside
243
-
244
- if matches.empty? then
245
- specs = Gem::Specification.all_names.join ", "
246
- error = Gem::LoadError.new "Could not find #{name} (#{requirement}) amongst [#{specs}]"
247
- error.name = self.name
248
- error.requirement = self.requirement
249
- raise error
250
- end
251
-
252
- # TODO: any other resolver validations should go here
253
-
254
- matches
255
- end
256
-
257
- def to_spec
258
- matches = self.to_specs
259
-
260
- matches.find { |spec| spec.activated? } or matches.last
261
- end
262
- end
263
-
264
- end