cocoapods-generate 2.0.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ea3b44ab5fbc8842aebc11de2fc54cfc3767a27a5295495ddc4ee615a992ad08
4
- data.tar.gz: 2e59a2c711cd98ee9c7ce4f6c25d80c88f4bc0a88ade7402fe67ebd0c241df7a
3
+ metadata.gz: ee3258545cab5bd0ed207d266668ab48b3dbe581d0a77591e5eb357b954ddc47
4
+ data.tar.gz: 16aea52165bfa4fb4c90fd9e031821ccde0e65e1468817e00163e6c26050fbe4
5
5
  SHA512:
6
- metadata.gz: dae3e8cedabed45368ad1642409929363e101e25fb156d2e684ccf158fd01627381aa10558611e7a0f0380e924b83f681a571f742e7397be5f08304040fb2b86
7
- data.tar.gz: 4acc9aa5dcba8768e7fe33f3c0c3cb564e088505d513f9692f2efd6a944a80d216e417409f91a13f6373fb1b1d0596fd395ea449559051f5418ae4ff1aac43af
6
+ metadata.gz: e7f5c160b8deba03d38b31ab82100a5c5f55494970a0edbef3967a73392323ad60b00efef92a3d05f4477411bc9a9dd99c641795cb6195cc3f1642160ef7d755
7
+ data.tar.gz: b117590d517859c8207428b4328ad5785f2e4e53c5bd1802e53eee35e8700af01c547c7f53d174a2a9733da82c73922a8ac2f1f32d1a582c1ba4b78519dfc049
data/README.md CHANGED
@@ -47,6 +47,7 @@ Usage:
47
47
 
48
48
  Options:
49
49
 
50
+ --allow-root Allows CocoaPods to run as root
50
51
  --silent Show nothing
51
52
  --verbose Show more debugging information
52
53
  --no-ansi Show output without ANSI codes
@@ -88,6 +89,9 @@ Options:
88
89
  default plugins
89
90
  --deterministic-uuids Whether installation should use
90
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)
91
95
  --share-schemes-for-development-pods Whether installation should share schemes
92
96
  for development pods
93
97
  --warn-for-multiple-pod-sources Whether installation should warn when a pod
@@ -97,6 +101,10 @@ Options:
97
101
  modules, as if `use_modular_headers!` were
98
102
  specified. Will error if both this option
99
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
100
108
  ```
101
109
  <!-- end cli usage -->
102
110
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.0.0
1
+ 2.2.1
@@ -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,7 +362,7 @@ 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?('..') }
355
366
  next StandardError.new "no specs found in #{UI.path path}" if glob.empty?
356
367
  glob.map { |f| Pod::Specification.from_file(f) }.sort_by(&:name)
357
368
  else
@@ -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
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- if Pod::VERSION >= '1.5.0'
3
+ if Gem::Version.new(Pod::VERSION) >= Gem::Version.new('1.5.0')
4
4
  require 'cocoapods/command/gen'
5
5
  else
6
6
  Pod::UI.warn 'cocoapods-generate requires CocoaPods >= 1.5.0'
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.0
4
+ version: 2.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Giddins
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-04-16 00:00:00.000000000 Z
11
+ date: 2021-01-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cocoapods-disable-podfile-validations
@@ -86,7 +86,7 @@ homepage: https://github.com/square/cocoapods-generate
86
86
  licenses:
87
87
  - MIT
88
88
  metadata: {}
89
- post_install_message:
89
+ post_install_message:
90
90
  rdoc_options: []
91
91
  require_paths:
92
92
  - lib
@@ -101,9 +101,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
101
101
  - !ruby/object:Gem::Version
102
102
  version: '0'
103
103
  requirements: []
104
- rubyforge_project:
105
- rubygems_version: 2.7.7
106
- signing_key:
104
+ rubygems_version: 3.0.3
105
+ signing_key:
107
106
  specification_version: 4
108
107
  summary: Generates Xcode workspaces from a podspec.
109
108
  test_files: []