cocoapods-core 0.39.0 → 1.0.0.beta.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/cocoapods-core/dependency.rb +46 -32
- data/lib/cocoapods-core/gem_version.rb +1 -1
- data/lib/cocoapods-core/lockfile.rb +18 -15
- data/lib/cocoapods-core/platform.rb +8 -0
- data/lib/cocoapods-core/podfile.rb +20 -18
- data/lib/cocoapods-core/podfile/dsl.rb +179 -90
- data/lib/cocoapods-core/podfile/target_definition.rb +85 -70
- data/lib/cocoapods-core/source.rb +50 -1
- data/lib/cocoapods-core/source/aggregate.rb +55 -58
- data/lib/cocoapods-core/specification.rb +6 -14
- data/lib/cocoapods-core/specification/dsl.rb +10 -22
- data/lib/cocoapods-core/specification/dsl/deprecations.rb +0 -6
- data/lib/cocoapods-core/specification/json.rb +4 -9
- data/lib/cocoapods-core/specification/root_attribute_accessors.rb +0 -6
- data/lib/cocoapods-core/version.rb +67 -38
- data/lib/cocoapods-core/yaml_helper.rb +1 -1
- metadata +13 -13
@@ -19,17 +19,11 @@ module Pod
|
|
19
19
|
# @param [TargetDefinition] parent
|
20
20
|
# @see parent
|
21
21
|
#
|
22
|
-
# @option options [Bool] :exclusive
|
23
|
-
# @see exclusive?
|
24
|
-
#
|
25
22
|
def initialize(name, parent, internal_hash = nil)
|
26
23
|
@internal_hash = internal_hash || {}
|
27
24
|
@parent = parent
|
28
25
|
@children = []
|
29
|
-
|
30
|
-
unless internal_hash
|
31
|
-
self.name = name
|
32
|
-
end
|
26
|
+
self.name ||= name
|
33
27
|
if parent.is_a?(TargetDefinition)
|
34
28
|
parent.children << self
|
35
29
|
end
|
@@ -73,13 +67,25 @@ module Pod
|
|
73
67
|
# definition including the inherited ones.
|
74
68
|
#
|
75
69
|
def dependencies
|
76
|
-
if exclusive?
|
70
|
+
if exclusive?
|
77
71
|
non_inherited_dependencies
|
78
72
|
else
|
79
73
|
non_inherited_dependencies + parent.dependencies
|
80
74
|
end
|
81
75
|
end
|
82
76
|
|
77
|
+
# @return [Array<TargetDefinition>] the targets from which this target
|
78
|
+
# definition should inherit only search paths.
|
79
|
+
#
|
80
|
+
def targets_to_inherit_search_paths
|
81
|
+
return [] unless inheritance == 'search_paths'
|
82
|
+
if root? || !matches_platform?(parent)
|
83
|
+
raise StandardError, "Non-sensical to have search_paths inheritance for #{name} when there is no parent."
|
84
|
+
else
|
85
|
+
parent.targets_to_inherit_search_paths << parent
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
83
89
|
# @return [Array] The list of the dependencies of the target definition,
|
84
90
|
# excluding inherited ones.
|
85
91
|
#
|
@@ -142,83 +148,81 @@ module Pod
|
|
142
148
|
|
143
149
|
#--------------------------------------#
|
144
150
|
|
145
|
-
#
|
146
|
-
# of the parent.
|
151
|
+
# @return [Boolean] whether this target definition is abstract.
|
147
152
|
#
|
148
|
-
|
149
|
-
|
150
|
-
# @note A target is always `exclusive` if the `platform` does
|
151
|
-
# not match the parent's `platform`.
|
152
|
-
#
|
153
|
-
# @return [Bool] whether is exclusive.
|
154
|
-
#
|
155
|
-
def exclusive?
|
156
|
-
if root?
|
157
|
-
true
|
158
|
-
elsif get_hash_value('exclusive')
|
159
|
-
true
|
160
|
-
else
|
161
|
-
platform && parent && parent.platform != platform
|
162
|
-
end
|
153
|
+
def abstract?
|
154
|
+
get_hash_value('abstract', false)
|
163
155
|
end
|
164
156
|
|
165
|
-
# Sets whether
|
157
|
+
# Sets whether this target definition is abstract.
|
166
158
|
#
|
167
|
-
# @param [
|
168
|
-
#
|
159
|
+
# @param [Boolean] abstract
|
160
|
+
# whether this target definition is abstract.
|
169
161
|
#
|
170
162
|
# @return [void]
|
171
163
|
#
|
172
|
-
def
|
173
|
-
set_hash_value('
|
164
|
+
def abstract=(abstract)
|
165
|
+
set_hash_value('abstract', abstract)
|
174
166
|
end
|
175
167
|
|
176
168
|
#--------------------------------------#
|
177
169
|
|
178
|
-
# @return [
|
179
|
-
# which this target definition should be linked with.
|
170
|
+
# @return [String] the inheritance mode for this target definition.
|
180
171
|
#
|
181
|
-
def
|
182
|
-
|
183
|
-
value unless value.nil? || value.empty?
|
172
|
+
def inheritance
|
173
|
+
get_hash_value('inheritance', 'complete')
|
184
174
|
end
|
185
175
|
|
186
|
-
# Sets the
|
176
|
+
# Sets the inheritance mode for this target definition.
|
177
|
+
#
|
178
|
+
# @param [#to_s] inheritance
|
179
|
+
# the inheritance mode for this target definition.
|
187
180
|
#
|
188
|
-
# @
|
189
|
-
#
|
181
|
+
# @raise [Informative] if this target definition is a root target
|
182
|
+
# definition or if the `inheritance` value is unknown.
|
190
183
|
#
|
191
184
|
# @return [void]
|
192
185
|
#
|
193
|
-
def
|
194
|
-
|
186
|
+
def inheritance=(inheritance)
|
187
|
+
inheritance = inheritance.to_s
|
188
|
+
unless %w(none search_paths complete).include?(inheritance)
|
189
|
+
raise Informative, "Unrecognized inheritance option `#{inheritance}` specified for target `#{name}`."
|
190
|
+
end
|
191
|
+
if root?
|
192
|
+
raise Informative, 'Cannot set inheritance for the root target definition.'
|
193
|
+
end
|
194
|
+
set_hash_value('inheritance', inheritance)
|
195
195
|
end
|
196
196
|
|
197
197
|
#--------------------------------------#
|
198
198
|
|
199
|
-
# Returns whether the target definition should
|
200
|
-
# of the
|
199
|
+
# Returns whether the target definition should inherit the dependencies
|
200
|
+
# of the parent.
|
201
|
+
#
|
202
|
+
# @note A target is always `exclusive` if it is root.
|
201
203
|
#
|
202
|
-
# @note
|
204
|
+
# @note A target is always `exclusive` if the `platform` does
|
205
|
+
# not match the parent's `platform`.
|
203
206
|
#
|
204
207
|
# @return [Bool] whether is exclusive.
|
205
208
|
#
|
206
|
-
def
|
207
|
-
|
209
|
+
def exclusive?
|
210
|
+
if root?
|
211
|
+
true
|
212
|
+
else
|
213
|
+
!matches_platform?(parent) || (inheritance != 'complete')
|
214
|
+
end
|
208
215
|
end
|
209
216
|
|
210
|
-
#
|
211
|
-
#
|
212
|
-
#
|
213
|
-
# @note This option is ignored if {link_with} is set.
|
217
|
+
# @param [TargetDefinition, Nil] target_definition
|
218
|
+
# the target definition to check for platform compatibility.
|
214
219
|
#
|
215
|
-
# @
|
216
|
-
#
|
217
|
-
#
|
218
|
-
# @return [void]
|
220
|
+
# @return [Boolean]
|
221
|
+
# whether this target definition matches the platform of
|
222
|
+
# `target_definition`.
|
219
223
|
#
|
220
|
-
def
|
221
|
-
|
224
|
+
def matches_platform?(target_definition)
|
225
|
+
target_definition && target_definition.platform == platform
|
222
226
|
end
|
223
227
|
|
224
228
|
#--------------------------------------#
|
@@ -229,7 +233,7 @@ module Pod
|
|
229
233
|
def user_project_path
|
230
234
|
path = get_hash_value('user_project_path')
|
231
235
|
if path
|
232
|
-
|
236
|
+
Pathname(path).sub_ext('.xcodeproj').to_path
|
233
237
|
else
|
234
238
|
parent.user_project_path unless root?
|
235
239
|
end
|
@@ -368,7 +372,7 @@ module Pod
|
|
368
372
|
end
|
369
373
|
end
|
370
374
|
end
|
371
|
-
!found
|
375
|
+
!found && (root? || (inheritance != 'none' && parent.pod_whitelisted_for_configuration?(pod_name, configuration_name)))
|
372
376
|
end
|
373
377
|
|
374
378
|
# Whitelists a pod for a specific configuration. If a pod is whitelisted
|
@@ -396,7 +400,8 @@ module Pod
|
|
396
400
|
# pods have been whitelisted.
|
397
401
|
#
|
398
402
|
def all_whitelisted_configurations
|
399
|
-
|
403
|
+
parent_configurations = (root? || inheritance == 'none') ? [] : parent.all_whitelisted_configurations
|
404
|
+
(configuration_pod_whitelist.keys + parent_configurations).uniq
|
400
405
|
end
|
401
406
|
|
402
407
|
#--------------------------------------#
|
@@ -496,7 +501,7 @@ module Pod
|
|
496
501
|
# @note The storage of this information is optimized for YAML
|
497
502
|
# readability.
|
498
503
|
#
|
499
|
-
# @todo This needs
|
504
|
+
# @todo This urgently needs a rename.
|
500
505
|
#
|
501
506
|
# @return [void]
|
502
507
|
#
|
@@ -535,6 +540,8 @@ module Pod
|
|
535
540
|
children
|
536
541
|
configuration_pod_whitelist
|
537
542
|
uses_frameworks
|
543
|
+
inheritance
|
544
|
+
abstract
|
538
545
|
).freeze
|
539
546
|
|
540
547
|
# @return [Hash] The hash representation of the target definition.
|
@@ -588,7 +595,7 @@ module Pod
|
|
588
595
|
# @param [Object] value
|
589
596
|
# The value to store.
|
590
597
|
#
|
591
|
-
# @raise If the key is not recognized.
|
598
|
+
# @raise [StandardError] If the key is not recognized.
|
592
599
|
#
|
593
600
|
# @return [void]
|
594
601
|
#
|
@@ -608,7 +615,7 @@ module Pod
|
|
608
615
|
# @param [Object] base_value
|
609
616
|
# The value to set if they key is nil. Useful for collections.
|
610
617
|
#
|
611
|
-
# @raise If the key is not recognized.
|
618
|
+
# @raise [StandardError] If the key is not recognized.
|
612
619
|
#
|
613
620
|
# @return [Object] The value for the key.
|
614
621
|
#
|
@@ -625,7 +632,12 @@ module Pod
|
|
625
632
|
# warnings, and :for_pods key for inhibiting warnings per Pod.
|
626
633
|
#
|
627
634
|
def inhibit_warnings_hash
|
628
|
-
get_hash_value('inhibit_warnings', {})
|
635
|
+
inhibit_hash = get_hash_value('inhibit_warnings', {})
|
636
|
+
if exclusive?
|
637
|
+
inhibit_hash
|
638
|
+
else
|
639
|
+
parent.send(:inhibit_warnings_hash).merge(inhibit_hash) { |l, r| (l + r).uniq }
|
640
|
+
end
|
629
641
|
end
|
630
642
|
|
631
643
|
# Returns the configuration_pod_whitelist hash
|
@@ -635,7 +647,12 @@ module Pod
|
|
635
647
|
# as value.
|
636
648
|
#
|
637
649
|
def configuration_pod_whitelist
|
638
|
-
get_hash_value('configuration_pod_whitelist', {})
|
650
|
+
whitelist_hash = get_hash_value('configuration_pod_whitelist', {})
|
651
|
+
if exclusive?
|
652
|
+
whitelist_hash
|
653
|
+
else
|
654
|
+
parent.send(:configuration_pod_whitelist).merge(whitelist_hash) { |l, r| (l + r).uniq }
|
655
|
+
end
|
639
656
|
end
|
640
657
|
|
641
658
|
# @return [Array<Dependency>] The dependencies specified by the user for
|
@@ -656,8 +673,8 @@ module Pod
|
|
656
673
|
|
657
674
|
# @return [Array<Dependency>] The dependencies inherited by the podspecs.
|
658
675
|
#
|
659
|
-
# @note The podspec directive is intended include the dependencies of
|
660
|
-
# spec in the project where it is developed. For this reason the
|
676
|
+
# @note The podspec directive is intended to include the dependencies of
|
677
|
+
# a spec in the project where it is developed. For this reason the
|
661
678
|
# spec, or any of it subspecs, cannot be included in the
|
662
679
|
# dependencies. Otherwise it would generate a chicken-and-egg
|
663
680
|
# problem.
|
@@ -744,15 +761,13 @@ module Pod
|
|
744
761
|
|
745
762
|
configurations = options.delete(:configurations)
|
746
763
|
configurations ||= options.delete(:configuration)
|
747
|
-
|
748
|
-
|
749
|
-
whitelist_pod_for_configuration(name, configuration)
|
750
|
-
end
|
764
|
+
Array(configurations).each do |configuration|
|
765
|
+
whitelist_pod_for_configuration(name, configuration)
|
751
766
|
end
|
752
767
|
requirements.pop if options.empty?
|
753
768
|
end
|
754
769
|
|
755
|
-
# Removes :subspecs
|
770
|
+
# Removes :subspecs from the requirements list, and stores the pods
|
756
771
|
# with the given subspecs as dependencies.
|
757
772
|
#
|
758
773
|
# @param [String] name
|
@@ -93,6 +93,22 @@ module Pod
|
|
93
93
|
end.sort
|
94
94
|
end
|
95
95
|
|
96
|
+
# Returns pod names for given array of specification paths.
|
97
|
+
#
|
98
|
+
# @param [Array<String>] spec_paths
|
99
|
+
# Array of file path names for specifications. Path strings should be relative to the source path.
|
100
|
+
#
|
101
|
+
# @return [Array<String>] the list of the name of Pods corresponding to specification paths.
|
102
|
+
#
|
103
|
+
def pods_for_specification_paths(spec_paths)
|
104
|
+
spec_paths.map do |path|
|
105
|
+
absolute_path = repo + path
|
106
|
+
relative_path = absolute_path.relative_path_from(specs_dir)
|
107
|
+
# The first file name returned by 'each_filename' is the pod name
|
108
|
+
relative_path.each_filename.first
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
96
112
|
# @return [Array<Version>] all the available versions for the Pod, sorted
|
97
113
|
# from highest to lowest.
|
98
114
|
#
|
@@ -259,6 +275,26 @@ module Pod
|
|
259
275
|
end
|
260
276
|
end
|
261
277
|
|
278
|
+
# @!group Updating the source
|
279
|
+
#-------------------------------------------------------------------------#
|
280
|
+
|
281
|
+
# Updates the local clone of the source repo.
|
282
|
+
#
|
283
|
+
# @param [Bool] show_output
|
284
|
+
#
|
285
|
+
# @return [Array<String>] changed_spec_paths
|
286
|
+
# Returns the list of changed spec paths.
|
287
|
+
#
|
288
|
+
def update(show_output)
|
289
|
+
changed_spec_paths = []
|
290
|
+
Dir.chdir(repo) do
|
291
|
+
prev_commit_hash = git_commit_hash
|
292
|
+
update_git_repo(show_output)
|
293
|
+
changed_spec_paths = diff_until_commit_hash(prev_commit_hash)
|
294
|
+
end
|
295
|
+
changed_spec_paths
|
296
|
+
end
|
297
|
+
|
262
298
|
public
|
263
299
|
|
264
300
|
# @!group Representations
|
@@ -312,7 +348,7 @@ module Pod
|
|
312
348
|
#
|
313
349
|
# @note In previous versions of CocoaPods they used to be stored in
|
314
350
|
# the root of the repo. This lead to issues, especially with
|
315
|
-
# the GitHub interface and now
|
351
|
+
# the GitHub interface and now they are stored in a dedicated
|
316
352
|
# folder.
|
317
353
|
#
|
318
354
|
def specs_dir
|
@@ -326,6 +362,19 @@ module Pod
|
|
326
362
|
end
|
327
363
|
end
|
328
364
|
|
365
|
+
def git_commit_hash
|
366
|
+
(`git rev-parse HEAD` || '').strip
|
367
|
+
end
|
368
|
+
|
369
|
+
def update_git_repo(show_output = false)
|
370
|
+
output = `git pull --ff-only 2>&1`
|
371
|
+
CoreUI.puts output if show_output
|
372
|
+
end
|
373
|
+
|
374
|
+
def diff_until_commit_hash(commit_hash)
|
375
|
+
(`git diff --name-only #{commit_hash}..HEAD` || '').strip.split("\n")
|
376
|
+
end
|
377
|
+
|
329
378
|
#-------------------------------------------------------------------------#
|
330
379
|
end
|
331
380
|
end
|
@@ -53,7 +53,7 @@ module Pod
|
|
53
53
|
# The name of the Pod.
|
54
54
|
#
|
55
55
|
# @return [Set] The most representative set for the Pod with the given
|
56
|
-
# name.
|
56
|
+
# name. Returns nil if no representative source found containing a pod with given name.
|
57
57
|
#
|
58
58
|
def representative_set(name)
|
59
59
|
representative_source = nil
|
@@ -68,7 +68,7 @@ module Pod
|
|
68
68
|
end
|
69
69
|
end
|
70
70
|
end
|
71
|
-
Specification::Set.new(name, representative_source)
|
71
|
+
representative_source ? Specification::Set.new(name, representative_source) : nil
|
72
72
|
end
|
73
73
|
|
74
74
|
public
|
@@ -129,57 +129,35 @@ module Pod
|
|
129
129
|
# @!group Search Index
|
130
130
|
#-----------------------------------------------------------------------#
|
131
131
|
|
132
|
-
# Generates from scratch the search data for
|
133
|
-
#
|
132
|
+
# Generates from scratch the search data for given source.
|
133
|
+
# This operation can take a considerable amount of time
|
134
134
|
# (seconds) as it needs to evaluate the most representative podspec
|
135
135
|
# for each Pod.
|
136
136
|
#
|
137
|
-
# @
|
138
|
-
#
|
137
|
+
# @param [Source] source
|
138
|
+
# The source from which a search index will be generated.
|
139
139
|
#
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
end
|
145
|
-
result
|
140
|
+
# @return [Hash{String=>Hash}] The search data for the source.
|
141
|
+
#
|
142
|
+
def generate_search_index_for_source(source)
|
143
|
+
generate_search_index_for_sets(source.pod_sets)
|
146
144
|
end
|
147
145
|
|
148
|
-
#
|
149
|
-
#
|
150
|
-
#
|
151
|
-
#
|
152
|
-
#
|
153
|
-
#
|
154
|
-
#
|
155
|
-
#
|
156
|
-
#
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
enumerated_names = []
|
162
|
-
all_sets.each do |set|
|
163
|
-
enumerated_names << set.name
|
164
|
-
set_data = search_data[set.name]
|
165
|
-
has_data = set_data && set_data['version']
|
166
|
-
if has_data
|
167
|
-
stored_version = Version.new(set_data['version'])
|
168
|
-
if stored_version < set.highest_version
|
169
|
-
search_data[set.name] = search_data_from_set(set)
|
170
|
-
end
|
171
|
-
else
|
172
|
-
search_data[set.name] = search_data_from_set(set)
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
stored_names = search_data.keys
|
177
|
-
delted_names = stored_names - enumerated_names
|
178
|
-
delted_names.each do |name|
|
179
|
-
search_data.delete(name)
|
146
|
+
# Generates from scratch the search data for changed specifications in given source.
|
147
|
+
#
|
148
|
+
# @param [Source] source
|
149
|
+
# The source from which a search index will be generated.
|
150
|
+
# @param [Array<String>] spec_paths
|
151
|
+
# Array of file path names for corresponding changed specifications.
|
152
|
+
#
|
153
|
+
# @return [Hash{String=>Hash}] The search data for changed specifications.
|
154
|
+
#
|
155
|
+
def generate_search_index_for_changes_in_source(source, spec_paths)
|
156
|
+
pods = source.pods_for_specification_paths(spec_paths)
|
157
|
+
sets = pods.map do |pod|
|
158
|
+
Specification::Set.new(pod, source)
|
180
159
|
end
|
181
|
-
|
182
|
-
search_data
|
160
|
+
generate_search_index_for_sets(sets)
|
183
161
|
end
|
184
162
|
|
185
163
|
private
|
@@ -187,8 +165,19 @@ module Pod
|
|
187
165
|
# @!group Private helpers
|
188
166
|
#-----------------------------------------------------------------------#
|
189
167
|
|
190
|
-
#
|
191
|
-
|
168
|
+
# Generates search data for given array of sets.
|
169
|
+
def generate_search_index_for_sets(sets)
|
170
|
+
result = {}
|
171
|
+
sets.each do |set|
|
172
|
+
word_list_from_set(set).each do |w|
|
173
|
+
(result[w] ||= []).push(set.name.to_sym)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
result
|
177
|
+
end
|
178
|
+
|
179
|
+
# Returns the vocabulary extracted from the most representative
|
180
|
+
# specification of the set. Vocabulary contains words from following information:
|
192
181
|
#
|
193
182
|
# - version
|
194
183
|
# - summary
|
@@ -198,26 +187,34 @@ module Pod
|
|
198
187
|
# @param [Set] set
|
199
188
|
# The set for which the information is needed.
|
200
189
|
#
|
201
|
-
# @note If the specification can't load an empty
|
190
|
+
# @note If the specification can't load an empty array is returned and
|
202
191
|
# a warning is printed.
|
203
192
|
#
|
204
193
|
# @note For compatibility with non Ruby clients a strings are used
|
205
194
|
# instead of symbols for the keys.
|
206
195
|
#
|
207
|
-
# @return [
|
196
|
+
# @return [Array<String>] An array of words contained by the set's search related information.
|
208
197
|
#
|
209
|
-
def
|
210
|
-
result = {}
|
198
|
+
def word_list_from_set(set)
|
211
199
|
spec = set.specification
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
200
|
+
word_list = [set.name.dup]
|
201
|
+
if spec.summary
|
202
|
+
word_list += spec.summary.split
|
203
|
+
end
|
204
|
+
if spec.description
|
205
|
+
word_list += spec.description.split
|
206
|
+
end
|
207
|
+
if spec.authors
|
208
|
+
spec.authors.each_pair do |k, v|
|
209
|
+
word_list += k.split if k
|
210
|
+
word_list += v.split if v
|
211
|
+
end
|
212
|
+
end
|
213
|
+
word_list.uniq
|
217
214
|
rescue
|
218
215
|
CoreUI.warn "Skipping `#{set.name}` because the podspec contains " \
|
219
216
|
'errors.'
|
220
|
-
|
217
|
+
[]
|
221
218
|
end
|
222
219
|
|
223
220
|
#-----------------------------------------------------------------------#
|