cocoapods-generate 2.0.1 → 2.2.2

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
  SHA256:
3
- metadata.gz: 1ff4789b445c0e00d7e00d2808dd4ed69e0d02f5e43547ef710d83bcc0dbce62
4
- data.tar.gz: cc8ab4c9925c136e06706ced54b25b419327a4d9b4625bfac7e17ed02b5f58a2
3
+ metadata.gz: 8ec807085c21de2232ba62daad8b1a5cb014904ac95082163de14e1ee46cc9fc
4
+ data.tar.gz: f03150d21af7d856c665e421ea98a37ec5114d622f0d775dc9e674a2c72ff5b3
5
5
  SHA512:
6
- metadata.gz: 3bf5669db86616bdc81af45c12d51a7a4fc10b1f7168173394290632522a5e1e4a65c2c9f100573018022fd3feaac3599ec80f853f62b24384d0f6a5f77d0c3b
7
- data.tar.gz: 003a8045475b4fc18dbf57e2c4bc12e2ade7b07da9d62b129870c52984f2ba2a27ce5eec00b6e7fa4f66e1cec43b149f433265422a3c194227ace7429c0b427f
6
+ metadata.gz: 620f5d4fb25024442f8e697b47bfa1d30f47933e06d5467ade270b25a00fdce9f2de492bbbd3706674893ae30cf4c9633d25420e356933cbb83df7cff9820d94
7
+ data.tar.gz: 5470965cdcdc8a68dba3bd14051ec0d6a819363b19440e2f1ad9ef42622036e839bb188a3e4eb2655b1a7d2739eda697382c1053d17a2078c71f02bbb3ff9d1c
data/README.md CHANGED
@@ -89,6 +89,9 @@ Options:
89
89
  default plugins
90
90
  --deterministic-uuids Whether installation should use
91
91
  deterministic UUIDs for pods projects
92
+ --disable-input-output-paths Whether to disable the input & output paths
93
+ of the CocoaPods script phases (Copy
94
+ Frameworks & Copy Resources)
92
95
  --share-schemes-for-development-pods Whether installation should share schemes
93
96
  for development pods
94
97
  --warn-for-multiple-pod-sources Whether installation should warn when a pod
@@ -98,6 +101,10 @@ Options:
98
101
  modules, as if `use_modular_headers!` were
99
102
  specified. Will error if both this option
100
103
  and a podfile are specified
104
+ --single-workspace Whether to produce a single workspace for
105
+ all podspecs specified.
106
+ --xcode-version=xcode_version The Xcode version to use for producing the
107
+ consumer sample project
101
108
  ```
102
109
  <!-- end cli usage -->
103
110
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.0.1
1
+ 2.2.2
@@ -64,8 +64,8 @@ module Pod
64
64
  # even if there are multiple podspecs
65
65
  update_sources if configuration.repo_update?
66
66
 
67
- Generate::PodfileGenerator.new(configuration).podfiles_by_spec.each do |spec, podfile|
68
- Generate::Installer.new(configuration, spec, podfile).install!
67
+ Generate::PodfileGenerator.new(configuration).podfiles_by_specs.each do |specs, podfile|
68
+ Generate::Installer.new(configuration, specs, podfile).install!
69
69
  end
70
70
 
71
71
  remove_warnings(UI.warnings)
@@ -123,6 +123,10 @@ module Pod
123
123
  value
124
124
  end
125
125
 
126
+ coerce_to_version = lambda do |value|
127
+ Pod::Version.new(value)
128
+ end
129
+
126
130
  coerce_to_pathname = lambda do |path|
127
131
  path && Pathname(path).expand_path
128
132
  end
@@ -169,7 +173,7 @@ module Pod
169
173
  ->(paths) { ('paths do not exist' unless paths.all? { |p| p.is_a?(URI) || p.exist? }) },
170
174
  ->(paths) { paths && paths.map { |path| path.to_s =~ %r{https?://} ? URI(path) : Pathname(path).expand_path } }
171
175
  option :podspecs, ArrayOf.new(Pod::Specification),
172
- 'self.class.podspecs_from_paths(podspec_paths)',
176
+ 'self.class.podspecs_from_paths(podspec_paths, gen_directory)',
173
177
  nil,
174
178
  nil,
175
179
  ->(specs) { 'no podspecs found' if specs.empty? },
@@ -199,10 +203,13 @@ module Pod
199
203
  ->(platforms) { Array(platforms).flat_map { |s| s.split(',') } }
200
204
  option :repo_update, BOOLEAN, 'false', 'Force running `pod repo update` before install', nil, nil, coerce_to_bool
201
205
  option :use_default_plugins, BOOLEAN, 'false', 'Whether installation should activate default plugins', nil, nil, coerce_to_bool
202
- option :deterministic_uuids, BOOLEAN, 'false', 'Whether installation should use deterministic UUIDs for pods projects', nil, nil, coerce_to_bool
203
- option :share_schemes_for_development_pods, BOOLEAN, 'true', 'Whether installation should share schemes for development pods', nil, nil, coerce_to_bool
204
- option :warn_for_multiple_pod_sources, BOOLEAN, 'false', 'Whether installation should warn when a pod is found in multiple sources', nil, nil, coerce_to_bool
206
+ option :deterministic_uuids, BOOLEAN, '(use_podfile && podfile) ? podfile.installation_options.deterministic_uuids : false', 'Whether installation should use deterministic UUIDs for pods projects', nil, nil, coerce_to_bool
207
+ option :disable_input_output_paths, BOOLEAN, '(use_podfile && podfile) ? podfile.installation_options.disable_input_output_paths : false', 'Whether to disable the input & output paths of the CocoaPods script phases (Copy Frameworks & Copy Resources)', nil, nil, coerce_to_bool
208
+ option :share_schemes_for_development_pods, [TrueClass, FalseClass, Array], '(use_podfile && podfile) ? podfile.installation_options.share_schemes_for_development_pods : true', 'Whether installation should share schemes for development pods', nil, nil
209
+ option :warn_for_multiple_pod_sources, BOOLEAN, '(use_podfile && podfile) ? podfile.installation_options.warn_for_multiple_pod_sources : false', 'Whether installation should warn when a pod is found in multiple sources', nil, nil, coerce_to_bool
205
210
  option :use_modular_headers, BOOLEAN, 'false', 'Whether the target should be generated as a clang module, treating dependencies as modules, as if `use_modular_headers!` were specified. Will error if both this option and a podfile are specified', nil, nil, coerce_to_bool
211
+ option :single_workspace, BOOLEAN, 'false', 'Whether to produce a single workspace for all podspecs specified.', nil, nil, coerce_to_bool
212
+ option :xcode_version, Pod::Version, 'Pod::Version.new(\'9.3\')', 'The Xcode version to use for producing the consumer sample project', 'xcode_version', nil, coerce_to_version
206
213
 
207
214
  options.freeze
208
215
  options.each do |o|
@@ -302,12 +309,13 @@ module Pod
302
309
  end << ' }'
303
310
  end
304
311
 
305
- # @return [Pathname] the directory for installation of the generated workspace
312
+ # @return [Pathname] the directory for installation of the generated workspace.
306
313
  #
307
- # @param [String] name the name of the pod
314
+ # @param [Array<Specification>] specs The specs to get a directory name for.
308
315
  #
309
- def gen_dir_for_pod(name)
310
- gen_directory.join(name)
316
+ def gen_dir_for_specs(specs)
317
+ basename = specs.count == 1 ? specs.first.name : 'Workspace'
318
+ gen_directory.join(basename)
311
319
  end
312
320
 
313
321
  # @return [Boolean] whether gen should install with dynamic frameworks
@@ -318,14 +326,14 @@ module Pod
318
326
 
319
327
  # @return [String] The project name to use for generating this workspace.
320
328
  #
321
- # @param [Specification] spec
322
- # the specification to generate project name for.
329
+ # @param [Array<Specification>] specs
330
+ # the specifications to generate project name for.
323
331
  #
324
- def project_name_for_spec(spec)
325
- project_name = spec.name.dup
332
+ def project_name_for_specs(specs)
333
+ project_name = specs.count == 1 ? +specs.first.name.dup : +'Workspace'
326
334
  # When using multiple Xcode project the project name will collide with the actual .xcodeproj meant for the pod
327
335
  # that we are generating the workspace for.
328
- project_name << 'Sample' if generate_multiple_pod_projects?
336
+ project_name << 'Sample' if generate_multiple_pod_projects? && specs.count == 1
329
337
  project_name
330
338
  end
331
339
 
@@ -335,7 +343,10 @@ module Pod
335
343
  # @param [Array<Pathname,URI>] paths
336
344
  # the paths to search for podspecs
337
345
  #
338
- def self.podspecs_from_paths(paths)
346
+ # @param [Pathname] gen_directory
347
+ # the directory that the gen installation would occur into.
348
+ #
349
+ def self.podspecs_from_paths(paths, gen_directory)
339
350
  paths = [Pathname('.')] if paths.empty?
340
351
  paths.flat_map do |path|
341
352
  if path.is_a?(URI)
@@ -351,9 +362,16 @@ module Pod
351
362
  $ERROR_INFO
352
363
  end
353
364
  elsif path.directory?
354
- glob = Pathname.glob(path + '*.podspec{.json,}')
365
+ glob = Pathname.glob(path.expand_path + '**/*.podspec{.json,}').select { |f| f.relative_path_from(gen_directory).to_s.start_with?('..') }
366
+ glob.reject! { |f| File.basename(f.dirname) == 'Local Podspecs' && f.parent.parent.join('Manifest.lock').file? }
355
367
  next StandardError.new "no specs found in #{UI.path path}" if glob.empty?
356
- glob.map { |f| Pod::Specification.from_file(f) }.sort_by(&:name)
368
+ podspecs = glob.map { |f| Pod::Specification.from_file(f) }
369
+ podspecs.group_by(&:name).sort_by(&:first).flat_map do |name, specs|
370
+ if specs.size != 1
371
+ Pod::UI.warn("Multiple podspecs found for pod #{name}, which one will be used is undefined:#{specs.map { |s| "\n - #{s.defined_in_file}" }.join}")
372
+ end
373
+ specs
374
+ end
357
375
  else
358
376
  Pod::Specification.from_file(path)
359
377
  end
@@ -4,24 +4,38 @@ module Pod
4
4
  # given a configuration and a generated podfile.
5
5
  #
6
6
  class Installer
7
+ DEFAULT_XCODE_VERSION = '9.3'.freeze
8
+
9
+ XCODE_VERSION_TO_OBJECT_VERSION = {
10
+ '12.0' => 54,
11
+ '11.4' => 53,
12
+ '11.0' => 52,
13
+ '10.0' => 51,
14
+ '9.3' => 50,
15
+ '8.0' => 48,
16
+ '6.3' => 47,
17
+ '3.2' => 46,
18
+ '3.1' => 45
19
+ }.freeze
20
+
7
21
  # @return [Configuration]
8
22
  # the configuration to use when installing
9
23
  #
10
24
  attr_reader :configuration
11
25
 
12
- # @return [Specification]
26
+ # @return [Array<Specification>]
13
27
  # the spec whose workspace is being created
14
28
  #
15
- attr_reader :spec
29
+ attr_reader :specs
16
30
 
17
31
  # @return [Podfile]
18
32
  # the podfile to install
19
33
  #
20
34
  attr_reader :podfile
21
35
 
22
- def initialize(configuration, spec, podfile)
36
+ def initialize(configuration, specs, podfile)
23
37
  @configuration = configuration
24
- @spec = spec
38
+ @specs = specs
25
39
  @podfile = podfile
26
40
  end
27
41
 
@@ -37,7 +51,7 @@ module Pod
37
51
  # @return [void]
38
52
  #
39
53
  def install!
40
- UI.title "Generating #{spec.name} in #{UI.path install_directory}" do
54
+ UI.title "Generating workspace in #{UI.path install_directory}" do
41
55
  clean! if configuration.clean?
42
56
  install_directory.mkpath
43
57
 
@@ -89,11 +103,15 @@ module Pod
89
103
  end
90
104
 
91
105
  def open_app_project(recreate: false)
92
- app_project_path = install_directory.join("#{configuration.project_name_for_spec(spec)}.xcodeproj")
106
+ app_project_path = install_directory.join("#{configuration.project_name_for_specs(specs)}.xcodeproj")
93
107
  if !recreate && app_project_path.exist?
94
108
  Xcodeproj::Project.open(app_project_path)
95
109
  else
96
- Xcodeproj::Project.new(app_project_path)
110
+ version_key = XCODE_VERSION_TO_OBJECT_VERSION.keys.find do |k|
111
+ configuration.xcode_version >= Pod::Version.new(k)
112
+ end || DEFAULT_XCODE_VERSION
113
+ object_version = XCODE_VERSION_TO_OBJECT_VERSION[version_key]
114
+ Xcodeproj::Project.new(app_project_path, false, object_version)
97
115
  end
98
116
  end
99
117
 
@@ -104,27 +122,32 @@ module Pod
104
122
  def create_app_project
105
123
  app_project = open_app_project(recreate: !configuration.incremental_installation?)
106
124
 
107
- spec_platforms = spec.available_platforms.flatten.reject do |platform|
108
- !configuration.platforms.nil? && !configuration.platforms.include?(platform.string_name.downcase)
109
- end
125
+ platforms_by_spec = Hash[specs.map do |spec|
126
+ platforms = spec.available_platforms.flatten.reject do |platform|
127
+ !configuration.platforms.nil? && !configuration.platforms.include?(platform.string_name.downcase)
128
+ end
129
+ [spec, platforms]
130
+ end]
110
131
 
111
- if spec_platforms.empty?
112
- Pod::Command::Gen.help! Pod::StandardError.new "No available platforms in #{spec.name}.podspec match requested platforms: #{configuration.platforms}"
132
+ if platforms_by_spec.values.all?(&:empty?)
133
+ Pod::Command::Gen.help! Pod::StandardError.new "No available platforms for podspecs #{specs.map(&:name).to_sentence} match requested platforms: #{configuration.platforms}"
113
134
  end
114
135
 
115
- spec_platforms
116
- .map do |platform|
117
- consumer = spec.consumer(platform)
118
- target_name = "App-#{Platform.string_name(consumer.platform_name)}"
119
- next if app_project.targets.map(&:name).include? target_name
120
- native_app_target = Pod::Generator::AppTargetHelper.add_app_target(app_project, consumer.platform_name,
121
- deployment_target(consumer), target_name)
122
- # Temporarily set Swift version to pass validator checks for pods which do not specify Swift version.
123
- # It will then be re-set again within #perform_post_install_steps.
124
- Pod::Generator::AppTargetHelper.add_swift_version(native_app_target, Pod::Validator::DEFAULT_SWIFT_VERSION)
125
- native_app_target
136
+ platforms_by_spec
137
+ .flat_map do |spec, platforms|
138
+ platforms.map do |platform|
139
+ consumer = spec.consumer(platform)
140
+ target_name = "App-#{Platform.string_name(consumer.platform_name)}"
141
+ next if app_project.targets.map(&:name).include? target_name
142
+ native_app_target = Pod::Generator::AppTargetHelper.add_app_target(app_project, consumer.platform_name,
143
+ deployment_target(consumer), target_name)
144
+ # Temporarily set Swift version to pass validator checks for pods which do not specify Swift version.
145
+ # It will then be re-set again within #perform_post_install_steps.
146
+ Pod::Generator::AppTargetHelper.add_swift_version(native_app_target, Pod::Validator::DEFAULT_SWIFT_VERSION)
147
+ native_app_target
148
+ end
126
149
  end
127
- .compact.tap do
150
+ .compact.uniq.tap do
128
151
  app_project.recreate_user_schemes do |scheme, target|
129
152
  installation_result = installation_result_from_target(target)
130
153
  next unless installation_result
@@ -134,9 +157,10 @@ module Pod
134
157
  end
135
158
  end
136
159
  .each do |target|
137
- Xcodeproj::XCScheme.share_scheme(app_project.path, target.name) if target
160
+ Xcodeproj::XCScheme.share_scheme(app_project.path.to_s, target.name) if target
138
161
  end
139
162
  app_project.save
163
+ app_project
140
164
  end
141
165
 
142
166
  def deployment_target(consumer)
@@ -152,8 +176,10 @@ module Pod
152
176
  app_project.native_targets.each do |native_app_target|
153
177
  remove_script_phase_from_target(native_app_target, 'Check Pods Manifest.lock')
154
178
 
155
- pod_target = installer.pod_targets.find { |pt| pt.platform.name == native_app_target.platform_name && pt.pod_name == spec.name }
156
- raise "Unable to find a pod target for #{native_app_target} / #{spec}" unless pod_target
179
+ spec_names = specs.map(&:name)
180
+ pod_targets = installer.pod_targets.select do |pt|
181
+ pt.platform.name == native_app_target.platform_name && spec_names.include?(pt.pod_name)
182
+ end
157
183
 
158
184
  native_app_target.source_build_phase.clear
159
185
  native_app_target.resources_build_phase.clear
@@ -189,22 +215,18 @@ module Pod
189
215
  source_file_ref = group.new_file(file.basename)
190
216
  native_app_target.add_file_references([source_file_ref])
191
217
  end
192
- elsif Pod::Generator::AppTargetHelper.method(:add_app_project_import).arity == -5 # CocoaPods >= 1.6
193
- # If we are doing incremental installation then the file might already be there.
218
+ else
194
219
  platform_name = Platform.string_name(native_app_target.platform_name)
195
220
  group = group_for_platform_name(app_project, platform_name)
196
221
  main_file_ref = group.files.find { |f| f.display_name == 'main.m' }
197
222
  if main_file_ref.nil?
198
- Pod::Generator::AppTargetHelper.add_app_project_import(app_project, native_app_target, pod_target,
199
- pod_target.platform.name, native_app_target.name)
223
+ source_file = create_main_source_file(app_project, pod_targets, native_app_target.name)
224
+ group = app_project[group.name] || app_project.new_group(group.name, group.name)
225
+ source_file_ref = group.new_file(source_file)
226
+ native_app_target.add_file_references([source_file_ref])
200
227
  else
201
228
  native_app_target.add_file_references([main_file_ref])
202
229
  end
203
- else
204
- Pod::Generator::AppTargetHelper.add_app_project_import(app_project, native_app_target, pod_target,
205
- pod_target.platform.name,
206
- pod_target.requires_frameworks?,
207
- native_app_target.name)
208
230
  end
209
231
 
210
232
  # Set `PRODUCT_BUNDLE_IDENTIFIER`
@@ -217,18 +239,23 @@ module Pod
217
239
  make_ios_app_launchable(app_project, native_app_target)
218
240
  end
219
241
 
220
- Pod::Generator::AppTargetHelper.add_swift_version(native_app_target, pod_target.swift_version) unless pod_target.swift_version.blank?
242
+ swift_version = pod_targets.map { |pt| Pod::Version.new(pt.swift_version) }.max.to_s
243
+
244
+ Pod::Generator::AppTargetHelper.add_swift_version(native_app_target, swift_version) unless swift_version.blank?
221
245
  if installer.pod_targets.any? { |pt| pt.spec_consumers.any? { |c| c.frameworks.include?('XCTest') } }
222
246
  Pod::Generator::AppTargetHelper.add_xctest_search_paths(native_app_target)
223
247
  end
224
248
 
225
- # Share the pods xcscheme only if it exists. For pre-built vendored pods there is no xcscheme generated.
226
- if installer.respond_to?(:generated_projects) # CocoaPods 1.7.0
227
- installer.generated_projects.each do |project|
228
- Xcodeproj::XCScheme.share_scheme(project.path, pod_target.label) if File.exist?(project.path + pod_target.label)
249
+ pod_targets.each do |pod_target|
250
+ result = installer.target_installation_results.pod_target_installation_results[pod_target.name]
251
+ next unless result
252
+ share_scheme(result.native_target.project, pod_target.label)
253
+ pod_target.test_specs.each do |test_spec|
254
+ share_scheme(result.native_target.project, pod_target.test_target_label(test_spec))
255
+ end
256
+ pod_target.app_specs.each do |app_spec|
257
+ share_scheme(result.native_target.project, pod_target.app_target_label(app_spec))
229
258
  end
230
- elsif File.exist?(installer.pods_project.path + pod_target.label)
231
- Xcodeproj::XCScheme.share_scheme(installer.pods_project.path, pod_target.label)
232
259
  end
233
260
 
234
261
  add_test_spec_schemes_to_app_scheme(installer, app_project)
@@ -252,23 +279,19 @@ module Pod
252
279
  end
253
280
 
254
281
  def add_test_spec_schemes_to_app_scheme(installer, app_project)
282
+ spec_root_names = Set.new(specs.map { |s| s.root.name })
283
+
255
284
  test_native_targets =
256
- if installer.respond_to?(:target_installation_results) # CocoaPods >= 1.6
257
- installer
258
- .target_installation_results
259
- .pod_target_installation_results
260
- .values
261
- .flatten(1)
262
- .select { |installation_result| installation_result.target.pod_name == spec.root.name }
263
- else
264
- installer
265
- .pod_targets
266
- .select { |pod_target| pod_target.pod_name == spec.root.name }
267
- end
285
+ installer
286
+ .target_installation_results
287
+ .pod_target_installation_results
288
+ .values
289
+ .flatten(1)
290
+ .select { |installation_result| spec_root_names.include?(installation_result.target.pod_name) }
268
291
  .flat_map(&:test_native_targets)
269
292
  .group_by(&:platform_name)
270
293
 
271
- workspace_path = install_directory + "#{spec.name}.xcworkspace"
294
+ workspace_path = install_directory + (configuration.project_name_for_specs(specs) + '.xcworkspace')
272
295
  Xcodeproj::Plist.write_to_path(
273
296
  { 'IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded' => false },
274
297
  workspace_path.join('xcshareddata').tap(&:mkpath).join('WorkspaceSettings.xcsettings')
@@ -287,7 +310,7 @@ module Pod
287
310
 
288
311
  testable = Xcodeproj::XCScheme::TestAction::TestableReference.new(target)
289
312
  testable.buildable_references.each do |buildable|
290
- buildable.xml_element.attributes['ReferencedContainer'] = 'container:Pods.xcodeproj'
313
+ buildable.xml_element.attributes['ReferencedContainer'] = "container:Pods/#{File.basename(target.project.path)}"
291
314
  end
292
315
  test_action.add_testable(testable)
293
316
  end
@@ -380,9 +403,37 @@ module Pod
380
403
  Executable.execute_command 'open', [workspace_path]
381
404
  end
382
405
  else
383
- UI.info "Open #{UI.path workspace_path} to work on #{spec.name}"
406
+ UI.info "Open #{UI.path workspace_path} to work on it!"
384
407
  end
385
408
  end
409
+
410
+ def share_scheme(project, scheme_name)
411
+ scheme = Xcodeproj::XCScheme.user_data_dir(project.path) + "#{scheme_name}.xcscheme"
412
+ return unless File.exist?(scheme)
413
+ Xcodeproj::XCScheme.share_scheme(project.path, scheme_name)
414
+ end
415
+
416
+ def create_main_source_file(project, pod_targets, name)
417
+ source_file = project.path.dirname.+("#{name}/main.m")
418
+ source_file.parent.mkpath
419
+
420
+ import_statements = pod_targets.map do |pod_target|
421
+ if pod_target.should_build? && pod_target.defines_module?
422
+ "@import #{pod_target.product_module_name};"
423
+ else
424
+ header_name = "#{pod_target.product_module_name}/#{pod_target.product_module_name}.h"
425
+ "#import <#{header_name}>" if pod_target.sandbox.public_headers.root.+(header_name).file?
426
+ end
427
+ end.compact
428
+
429
+ source_file.open('w') do |f|
430
+ f << import_statements.join("\n")
431
+ f << "\n" unless import_statements.empty?
432
+ f << "int main() { return 0; }\n"
433
+ end
434
+
435
+ source_file
436
+ end
386
437
  end
387
438
  end
388
439
  end
@@ -14,27 +14,27 @@ module Pod
14
14
  @configuration = configuration
15
15
  end
16
16
 
17
- # @return [Hash<Specification, Podfile>]
18
- # a hash of specifications to generated podfiles
17
+ # @return [Hash<Array<Specification>, Podfile>] the podfiles keyed by the specs that are part of each.
19
18
  #
20
- def podfiles_by_spec
19
+ def podfiles_by_specs
20
+ return { configuration.podspecs => podfile_for_specs(configuration.podspecs) } if configuration.single_workspace?
21
21
  Hash[configuration.podspecs.map do |spec|
22
- [spec, podfile_for_spec(spec)]
22
+ [[spec], podfile_for_specs([spec])]
23
23
  end]
24
24
  end
25
25
 
26
26
  # @return [Podfile] a podfile suitable for installing the given spec
27
27
  #
28
- # @param [Specification] spec
28
+ # @param [Array<Specification>] specs
29
29
  #
30
- def podfile_for_spec(spec)
30
+ def podfile_for_specs(specs)
31
31
  generator = self
32
- dir = configuration.gen_dir_for_pod(spec.name)
33
- project_name = configuration.project_name_for_spec(spec)
32
+ dir = configuration.gen_dir_for_specs(specs)
33
+ project_name = configuration.project_name_for_specs(specs)
34
34
 
35
35
  Pod::Podfile.new do
36
36
  project "#{project_name}.xcodeproj"
37
- workspace "#{spec.name}.xcworkspace"
37
+ workspace "#{project_name}.xcworkspace"
38
38
 
39
39
  plugin 'cocoapods-generate'
40
40
 
@@ -57,24 +57,32 @@ module Pod
57
57
 
58
58
  self.defined_in_file = dir.join('CocoaPods.podfile.yaml')
59
59
 
60
- test_specs = spec.recursive_subspecs.select(&:test_specification?)
61
- app_specs = if spec.respond_to?(:app_specification?)
62
- spec.recursive_subspecs.select(&:app_specification?)
63
- else
64
- []
65
- end
60
+ test_specs_by_spec = Hash[specs.map do |spec|
61
+ [spec, spec.recursive_subspecs.select(&:test_specification?)]
62
+ end]
63
+ app_specs_by_spec = Hash[specs.map do |spec|
64
+ app_specs = if spec.respond_to?(:app_specification?)
65
+ spec.recursive_subspecs.select(&:app_specification?)
66
+ else
67
+ []
68
+ end
69
+ [spec, app_specs]
70
+ end]
66
71
 
67
72
  # Stick all of the transitive dependencies in an abstract target.
68
73
  # This allows us to force CocoaPods to use the versions / sources / external sources
69
74
  # that we want.
70
- # By using an abstract target,
71
75
  abstract_target 'Transitive Dependencies' do
72
- pods_for_transitive_dependencies = [spec.name]
73
- .concat(test_specs.map(&:name))
74
- .concat(test_specs.flat_map { |ts| ts.dependencies.flat_map(&:name) })
75
- .concat(app_specs.map(&:name))
76
- .concat(app_specs.flat_map { |as| as.dependencies.flat_map(&:name) })
76
+ pods_for_transitive_dependencies = specs.flat_map do |spec|
77
+ [spec.name]
78
+ .concat(test_specs_by_spec.keys.map(&:name))
79
+ .concat(test_specs_by_spec.values.flatten.flat_map { |ts| ts.dependencies.flat_map(&:name) })
80
+ .concat(app_specs_by_spec.keys.map(&:name))
81
+ .concat(app_specs_by_spec.values.flatten.flat_map { |as| as.dependencies.flat_map(&:name) })
82
+ end
83
+ pods_for_transitive_dependencies.uniq!
77
84
 
85
+ spec_names = specs.map { |s| s.root.name }.to_set
78
86
  dependencies = generator
79
87
  .transitive_dependencies_by_pod
80
88
  .values_at(*pods_for_transitive_dependencies)
@@ -82,7 +90,7 @@ module Pod
82
90
  .flatten(1)
83
91
  .uniq
84
92
  .sort_by(&:name)
85
- .reject { |d| d.root_name == spec.root.name }
93
+ .reject { |d| spec_names.include?(d.root_name) }
86
94
 
87
95
  dependencies.each do |dependency|
88
96
  pod_args = generator.pod_args_for_dependency(self, dependency)
@@ -90,9 +98,8 @@ module Pod
90
98
  end
91
99
  end
92
100
 
93
- # Add platform-specific concrete targets that inherit the
94
- # `pod` declaration for the local pod.
95
- spec_platform_names = spec.available_platforms.map(&:string_name).flatten.each.reject do |platform_name|
101
+ # Add platform-specific concrete targets that inherit the `pod` declaration for the local pod.
102
+ spec_platform_names = specs.flat_map { |s| s.available_platforms.map(&:string_name) }.uniq.each.reject do |platform_name|
96
103
  !generator.configuration.platforms.nil? && !generator.configuration.platforms.include?(platform_name.downcase)
97
104
  end
98
105
 
@@ -117,26 +124,31 @@ module Pod
117
124
  inhibit_all_warnings! if generator.inhibit_all_warnings?
118
125
  use_modular_headers! if generator.use_modular_headers?
119
126
 
120
- # This is the pod declaration for the local pod,
121
- # it will be inherited by the concrete target definitions below
122
- pod_options = generator.dependency_compilation_kwargs(spec.name)
123
- pod_options[:path] = spec.defined_in_file.relative_path_from(dir).to_s
124
- { testspecs: test_specs, appspecs: app_specs }.each do |key, specs|
125
- pod_options[key] = specs.map { |s| s.name.sub(%r{^#{Regexp.escape spec.root.name}/}, '') }.sort unless specs.empty?
126
- end
127
+ specs.each do |spec|
128
+ # This is the pod declaration for the local pod,
129
+ # it will be inherited by the concrete target definitions below
130
+ pod_options = generator.dependency_compilation_kwargs(spec.name)
127
131
 
128
- pod spec.name, **pod_options
132
+ path = spec.defined_in_file.relative_path_from(dir).to_s
133
+ pod_options[:path] = path
134
+ { testspecs: test_specs_by_spec[spec], appspecs: app_specs_by_spec[spec] }.each do |key, subspecs|
135
+ pod_options[key] = subspecs.map { |s| s.name.sub(%r{^#{Regexp.escape spec.root.name}/}, '') }.sort unless subspecs.blank?
136
+ end
137
+ pod spec.name, **pod_options
138
+ end
129
139
 
130
140
  # Implement local-sources option to set up dependencies to podspecs in the local filesystem.
131
141
  next if generator.configuration.local_sources.empty?
132
- generator.transitive_local_dependencies(spec, generator.configuration.local_sources).sort_by(&:first).each do |dependency, podspec_file|
133
- pod_options = generator.dependency_compilation_kwargs(dependency.name)
134
- pod_options[:path] = if podspec_file[0] == '/' # absolute path
135
- podspec_file
136
- else
137
- '../../' + podspec_file
138
- end
139
- pod dependency.name, **pod_options
142
+ specs.each do |spec|
143
+ generator.transitive_local_dependencies(spec, generator.configuration.local_sources).sort_by(&:first).each do |dependency, podspec_file|
144
+ pod_options = generator.dependency_compilation_kwargs(dependency.name)
145
+ pod_options[:path] = if podspec_file[0] == '/' # absolute path
146
+ podspec_file
147
+ else
148
+ '../../' + podspec_file
149
+ end
150
+ pod dependency.name, **pod_options
151
+ end
140
152
  end
141
153
  end
142
154
  end
@@ -325,7 +337,7 @@ module Pod
325
337
  def installation_options
326
338
  installation_options = {
327
339
  deterministic_uuids: configuration.deterministic_uuids?,
328
- share_schemes_for_development_pods: configuration.share_schemes_for_development_pods?,
340
+ share_schemes_for_development_pods: configuration.share_schemes_for_development_pods,
329
341
  warn_for_multiple_pod_sources: configuration.warn_for_multiple_pod_sources?
330
342
  }
331
343
 
@@ -337,6 +349,10 @@ module Pod
337
349
  installation_options[:incremental_installation] = configuration.incremental_installation?
338
350
  end
339
351
 
352
+ if Pod::Installer::InstallationOptions.all_options.include?('disable_input_output_paths')
353
+ installation_options[:disable_input_output_paths] = configuration.disable_input_output_paths
354
+ end
355
+
340
356
  installation_options
341
357
  end
342
358
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cocoapods-generate
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Giddins
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-11-03 00:00:00.000000000 Z
11
+ date: 2021-02-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cocoapods-disable-podfile-validations