cocoapods-modularization 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (27) hide show
  1. checksums.yaml +7 -0
  2. data/lib/cocoapods-modularization/command/install.rb +98 -0
  3. data/lib/cocoapods-modularization/command/mod/add.rb +97 -0
  4. data/lib/cocoapods-modularization/command/mod/base.rb +35 -0
  5. data/lib/cocoapods-modularization/command/mod/binary.rb +82 -0
  6. data/lib/cocoapods-modularization/command/mod/config.rb +51 -0
  7. data/lib/cocoapods-modularization/command/mod/create.rb +34 -0
  8. data/lib/cocoapods-modularization/command/mod/inspect.rb +26 -0
  9. data/lib/cocoapods-modularization/command/mod/source.rb +81 -0
  10. data/lib/cocoapods-modularization/command/mod/sync.rb +29 -0
  11. data/lib/cocoapods-modularization/command/mod/update.rb +64 -0
  12. data/lib/cocoapods-modularization/command/mod.rb +28 -0
  13. data/lib/cocoapods-modularization/command.rb +2 -0
  14. data/lib/cocoapods-modularization/gem_version.rb +3 -0
  15. data/lib/cocoapods-modularization/generate/configuration.rb +364 -0
  16. data/lib/cocoapods-modularization/generate/installer.rb +388 -0
  17. data/lib/cocoapods-modularization/generate/podfile_generator.rb +398 -0
  18. data/lib/cocoapods-modularization/generate.rb +7 -0
  19. data/lib/cocoapods-modularization/meta/meta_accessor.rb +134 -0
  20. data/lib/cocoapods-modularization/meta/meta_constants.rb +135 -0
  21. data/lib/cocoapods-modularization/meta/meta_reference.rb +255 -0
  22. data/lib/cocoapods-modularization/meta.rb +7 -0
  23. data/lib/cocoapods-modularization/private/private_cache.rb +277 -0
  24. data/lib/cocoapods-modularization/private.rb +5 -0
  25. data/lib/cocoapods-modularization.rb +1 -0
  26. data/lib/cocoapods_plugin.rb +1 -0
  27. metadata +96 -0
@@ -0,0 +1,398 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pod
4
+ module Generate
5
+ # Generates podfiles for pod specifications given a configuration.
6
+ #
7
+ class PodfileGenerator
8
+ # @return [Configuration]
9
+ # the configuration used when generating podfiles
10
+ #
11
+ attr_reader :configuration
12
+
13
+ def initialize(configuration)
14
+ @configuration = configuration
15
+ end
16
+
17
+ # @return [Hash<Specification, Podfile>]
18
+ # a hash of specifications to generated podfiles
19
+ #
20
+ def podfiles_by_spec
21
+ Hash[configuration.podspecs.map do |spec|
22
+ [spec, podfile_for_spec(spec)]
23
+ end]
24
+ end
25
+
26
+ # @return [Podfile] a podfile suitable for installing the given spec
27
+ #
28
+ # @param [Specification] spec
29
+ #
30
+ def podfile_for_spec(spec)
31
+ generator = self
32
+ dir = configuration.gen_dir_for_pod(spec.name)
33
+ project_name = configuration.project_name_for_spec(spec)
34
+
35
+ Pod::Podfile.new do
36
+ project "#{project_name}.xcodeproj"
37
+ workspace "#{spec.name}.xcworkspace"
38
+
39
+ plugin 'cocoapods-modularization'
40
+
41
+ install! 'cocoapods', generator.installation_options
42
+
43
+ generator.podfile_plugins.each do |name, options|
44
+ plugin(*[name, options].compact)
45
+ end
46
+
47
+ use_frameworks!(generator.use_frameworks_value)
48
+
49
+ if (supported_swift_versions = generator.supported_swift_versions)
50
+ supports_swift_versions(supported_swift_versions)
51
+ end
52
+
53
+ # Explicitly set sources
54
+ generator.configuration.sources.each do |source_url|
55
+ source(source_url)
56
+ end
57
+
58
+ self.defined_in_file = dir.join('CocoaPods.podfile.yaml')
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
66
+
67
+ # Stick all of the transitive dependencies in an abstract target.
68
+ # This allows us to force CocoaPods to use the versions / sources / external sources
69
+ # that we want.
70
+ # By using an abstract target,
71
+ 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) })
77
+
78
+ dependencies = generator
79
+ .transitive_dependencies_by_pod
80
+ .values_at(*pods_for_transitive_dependencies)
81
+ .compact
82
+ .flatten(1)
83
+ .uniq
84
+ .sort_by(&:name)
85
+ .reject { |d| d.root_name == spec.root.name }
86
+
87
+ dependencies.each do |dependency|
88
+ pod_args = generator.pod_args_for_dependency(self, dependency)
89
+ pod(*pod_args)
90
+ end
91
+ end
92
+
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|
96
+ !generator.configuration.platforms.nil? && !generator.configuration.platforms.include?(platform_name.downcase)
97
+ end
98
+
99
+ spec_platform_names.sort.each do |platform_name|
100
+ target "App-#{platform_name}" do
101
+ current_target_definition.swift_version = generator.swift_version if generator.swift_version
102
+ end
103
+ end
104
+
105
+ # this block has to come _before_ inhibit_all_warnings! / use_modular_headers!,
106
+ # and the local `pod` declaration
107
+ current_target_definition.instance_exec do
108
+ transitive_dependencies = children.find { |c| c.name == 'Transitive Dependencies' }
109
+
110
+ %w[use_modular_headers inhibit_warnings].each do |key|
111
+ value = transitive_dependencies.send(:internal_hash).delete(key)
112
+ next if value.blank?
113
+ set_hash_value(key, value)
114
+ end
115
+ end
116
+
117
+ inhibit_all_warnings! if generator.inhibit_all_warnings?
118
+ use_modular_headers! if generator.use_modular_headers?
119
+
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
+
128
+ pod spec.name, **pod_options
129
+
130
+ # Implement local-sources option to set up dependencies to podspecs in the local filesystem.
131
+ 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
140
+ end
141
+ end
142
+ end
143
+
144
+ def transitive_local_dependencies(spec, paths, found_podspecs: {}, include_non_library_subspecs: true)
145
+ if include_non_library_subspecs
146
+ non_library_specs = spec.recursive_subspecs.select do |ss|
147
+ ss.test_specification? || (ss.respond_to?(:app_specification?) && ss.app_specification?)
148
+ end
149
+ non_library_specs.each do |subspec|
150
+ transitive_local_dependencies(subspec, paths, found_podspecs: found_podspecs, include_non_library_subspecs: false)
151
+ end
152
+ end
153
+ spec.dependencies.each do |dependency|
154
+ next if found_podspecs.key?(dependency)
155
+ found_podspec_file = nil
156
+ name = dependency.name.split('/')[0]
157
+ paths.each do |path|
158
+ podspec_file = File.join(path, name + '.podspec')
159
+ next unless File.file?(podspec_file)
160
+ found_podspec_file = podspec_file
161
+ break
162
+ end
163
+ next unless found_podspec_file
164
+ found_podspecs[dependency] = found_podspec_file.sub(%r{\A\./}, '')
165
+ transitive_local_dependencies(Pod::Specification.from_file(found_podspec_file), paths, found_podspecs: found_podspecs)
166
+ end
167
+ found_podspecs
168
+ end
169
+
170
+ # @return [Boolean]
171
+ # whether all warnings should be inhibited
172
+ #
173
+ def inhibit_all_warnings?
174
+ return false unless configuration.use_podfile?
175
+ target_definition_list.all? do |target_definition|
176
+ target_definition.send(:inhibit_warnings_hash)['all']
177
+ end
178
+ end
179
+
180
+ # @return [Boolean]
181
+ # whether all pods should use modular headers
182
+ #
183
+ def use_modular_headers?
184
+ if configuration.use_podfile? && configuration.use_modular_headers?
185
+ raise Informative, 'Conflicting `use_modular_headers` option. Cannot specify both `--use-modular-headers` and `--use-podfile`.'
186
+ end
187
+
188
+ if configuration.use_podfile?
189
+ target_definition_list.all? do |target_definition|
190
+ target_definition.use_modular_headers_hash['all']
191
+ end
192
+ else
193
+ configuration.use_modular_headers?
194
+ end
195
+ end
196
+
197
+ # @return [Boolean, Hash]
198
+ # the value to use for `use_frameworks!` DSL directive
199
+ #
200
+ def use_frameworks_value
201
+ return configuration.use_frameworks? unless configuration.use_podfile?
202
+ use_framework_values = target_definition_list.map do |target_definition|
203
+ if target_definition.respond_to?(:build_type) # CocoaPods >= 1.9
204
+ build_type = target_definition.build_type
205
+ if build_type.static_library?
206
+ false
207
+ else
208
+ { linkage: build_type == BuildType.dynamic_framework ? :dynamic : :static }
209
+ end
210
+ else
211
+ target_definition.uses_frameworks?
212
+ end
213
+ end.uniq
214
+ raise Informative, 'Multiple use_frameworks! values detected in user Podfile.' unless use_framework_values.count == 1
215
+ use_framework_values.first
216
+ end
217
+
218
+ # @return [Hash]
219
+ # a hash with "compilation"-related dependency options for the `pod` DSL method
220
+ #
221
+ # @param [String] pod_name
222
+ #
223
+ def dependency_compilation_kwargs(pod_name)
224
+ options = {}
225
+ options[:inhibit_warnings] = inhibit_warnings?(pod_name) if inhibit_warnings?(pod_name) != inhibit_all_warnings?
226
+ options[:modular_headers] = modular_headers?(pod_name) if modular_headers?(pod_name) != use_modular_headers?
227
+ options
228
+ end
229
+
230
+ # @return [Hash<String,Array<Dependency>>]
231
+ # the transitive dependency objects dependency upon by each pod
232
+ #
233
+ def transitive_dependencies_by_pod
234
+ return {} unless configuration.use_lockfile?
235
+ @transitive_dependencies_by_pod ||= begin
236
+ lda = ::Pod::Installer::Analyzer::LockingDependencyAnalyzer
237
+ dependency_graph = Molinillo::DependencyGraph.new
238
+ configuration.lockfile.dependencies.each do |dependency|
239
+ dependency_graph.add_vertex(dependency.name, dependency, true)
240
+ end
241
+ add_to_dependency_graph = if lda.method(:add_to_dependency_graph).parameters.size == 4 # CocoaPods < 1.6.0
242
+ ->(pod) { lda.add_to_dependency_graph(pod, [], dependency_graph, []) }
243
+ else
244
+ ->(pod) { lda.add_to_dependency_graph(pod, [], dependency_graph, [], Set.new) }
245
+ end
246
+ configuration.lockfile.internal_data['PODS'].each(&add_to_dependency_graph)
247
+
248
+ transitive_dependencies_by_pod = Hash.new { |hash, key| hash[key] = [] }
249
+ dependency_graph.each do |v|
250
+ transitive_dependencies_by_pod[v.name].concat v.recursive_successors.map(&:payload) << v.payload
251
+ end
252
+
253
+ transitive_dependencies_by_pod.each_value(&:uniq!)
254
+ transitive_dependencies_by_pod
255
+ end
256
+ end
257
+
258
+ # @return [Hash<String,Array<Dependency>>]
259
+ # dependencies in the podfile grouped by root name
260
+ #
261
+ def podfile_dependencies
262
+ return {} unless configuration.use_podfile?
263
+ @podfile_dependencies ||= configuration.podfile.dependencies.group_by(&:root_name).tap { |h| h.default = [] }
264
+ end
265
+
266
+ # @return [Hash<String,String>]
267
+ # versions in the lockfile keyed by pod name
268
+ #
269
+ def lockfile_versions
270
+ return {} unless configuration.use_lockfile_versions?
271
+ @lockfile_versions ||= Hash[configuration.lockfile.pod_names.map { |name| [name, "= #{configuration.lockfile.version(name)}"] }]
272
+ end
273
+
274
+ # @return [Hash<String,Array<Dependency>>]
275
+ # returns the arguments that should be passed to the Podfile DSL's
276
+ # `pod` method for the given podfile and dependency
277
+ #
278
+ # @param [Podfile] podfile
279
+ #
280
+ # @param [Dependency] dependency
281
+ #
282
+ def pod_args_for_dependency(podfile, dependency)
283
+ dependency = podfile_dependencies[dependency.root_name]
284
+ .map { |dep| dep.dup.tap { |d| d.name = dependency.name } }
285
+ .push(dependency)
286
+ .reduce(&:merge)
287
+
288
+ options = dependency_compilation_kwargs(dependency.name)
289
+ options[:source] = dependency.podspec_repo if dependency.podspec_repo
290
+ options.update(dependency.external_source) if dependency.external_source
291
+ %i[path podspec].each do |key|
292
+ next unless (path = options[key])
293
+ options[key] = Pathname(path)
294
+ .expand_path(configuration.podfile.defined_in_file.dirname)
295
+ .relative_path_from(podfile.defined_in_file.dirname)
296
+ .to_s
297
+ end
298
+ args = [dependency.name]
299
+ if dependency.external_source.nil?
300
+ requirements = dependency.requirement.as_list
301
+ if (version = lockfile_versions[dependency.name])
302
+ requirements << version
303
+ end
304
+ args.concat requirements.uniq
305
+ end
306
+ args << options unless options.empty?
307
+ args
308
+ end
309
+
310
+ def swift_version
311
+ @swift_version ||= target_definition_list.map(&:swift_version).compact.max
312
+ end
313
+
314
+ def supported_swift_versions
315
+ return unless configuration.use_podfile?
316
+ return if target_definition_list.empty?
317
+ return unless target_definition_list.first.respond_to?(:swift_version_requirements)
318
+ target_definition_list.reduce(nil) do |supported_swift_versions, target_definition|
319
+ target_swift_versions = target_definition.swift_version_requirements
320
+ next supported_swift_versions unless target_swift_versions
321
+ Array(target_swift_versions) | Array(supported_swift_versions)
322
+ end
323
+ end
324
+
325
+ def installation_options
326
+ installation_options = {
327
+ deterministic_uuids: configuration.deterministic_uuids?,
328
+ share_schemes_for_development_pods: configuration.share_schemes_for_development_pods?,
329
+ warn_for_multiple_pod_sources: configuration.warn_for_multiple_pod_sources?
330
+ }
331
+
332
+ if Pod::Installer::InstallationOptions.all_options.include?('generate_multiple_pod_projects')
333
+ installation_options[:generate_multiple_pod_projects] = configuration.generate_multiple_pod_projects?
334
+ end
335
+
336
+ if Pod::Installer::InstallationOptions.all_options.include?('incremental_installation')
337
+ installation_options[:incremental_installation] = configuration.incremental_installation?
338
+ end
339
+
340
+ installation_options
341
+ end
342
+
343
+ def podfile_plugins
344
+ configuration.podfile_plugins.merge('cocoapods-disable-podfile-validations' => { 'no_abstract_only_pods' => true }) do |_key, old_value, new_value|
345
+ old_value.merge(new_value)
346
+ end
347
+ end
348
+
349
+ private
350
+
351
+ # @return [Array<Podfile::TargetDefinition>]
352
+ # a list of all target definitions to consider from the podfile
353
+ #
354
+ def target_definition_list
355
+ return [] unless configuration.use_podfile?
356
+ @target_definition_list ||= begin
357
+ list = configuration.podfile.target_definition_list
358
+ list.reject!(&:abstract?) unless list.all?(&:abstract?)
359
+ list
360
+ end
361
+ end
362
+
363
+ # @return [Boolean]
364
+ # whether warnings should be inhibited for the given pod
365
+ #
366
+ # @param [String] pod_name
367
+ #
368
+ def inhibit_warnings?(pod_name)
369
+ return false unless configuration.use_podfile?
370
+ target_definitions_for_pod(pod_name).all? do |target_definition|
371
+ target_definition.inhibits_warnings_for_pod?(pod_name)
372
+ end
373
+ end
374
+
375
+ # @return [Boolean]
376
+ # whether modular headers should be enabled for the given pod
377
+ #
378
+ # @param [String] pod_name
379
+ #
380
+ def modular_headers?(pod_name)
381
+ return true if configuration.use_modular_headers?
382
+ return false unless configuration.use_podfile?
383
+ target_definitions_for_pod(pod_name).all? do |target_definition|
384
+ target_definition.build_pod_as_module?(pod_name)
385
+ end
386
+ end
387
+
388
+ # @return [Podfile::TargetDefinition]
389
+ #
390
+ # @param [String] pod_name
391
+ #
392
+ def target_definitions_for_pod(pod_name)
393
+ target_definitions = target_definition_list.reject { |td| td.dependencies.none? { |d| d.name == pod_name } }
394
+ target_definitions.empty? ? target_definition_list : target_definitions
395
+ end
396
+ end
397
+ end
398
+ end
@@ -0,0 +1,7 @@
1
+ module Pod
2
+ module Generate
3
+ autoload :Configuration, 'cocoapods-modularization/generate/configuration'
4
+ autoload :Installer, 'cocoapods-modularization/generate/installer'
5
+ autoload :PodfileGenerator, 'cocoapods-modularization/generate/podfile_generator'
6
+ end
7
+ end
@@ -0,0 +1,134 @@
1
+ require 'json'
2
+ require 'cocoapods-modularization/private'
3
+
4
+ module Pod
5
+ module Meta
6
+ module MetaAccessor
7
+ class << self
8
+ def edit_meta
9
+ meta_hash = YAML.load_file(MetaConstants.meta_path)
10
+
11
+ yield meta_hash
12
+
13
+ File::open(MetaConstants.meta_path, "w") { |io| io.puts meta_hash.to_yaml }
14
+ end
15
+
16
+ def set_dep(key, binary, version)
17
+ edit_data(key) do |meta|
18
+ dep_map = Hash[
19
+ MetaConstants.version_key => version,
20
+ MetaConstants.binary_key => binary || true,
21
+ MetaConstants.source_key => binary ? Private::PrivateCache.binary_repo_url : Private::PrivateCache.source_repo_url,
22
+ ]
23
+ end
24
+
25
+ edit_podfile_local(key) do |meta|
26
+ dep_map = Hash[
27
+ MetaConstants.binary_key => binary || true,
28
+ MetaConstants.local_key => false,
29
+ MetaConstants.local_path_key => Private::PrivateCache.read_local_path(key)
30
+ ]
31
+ end
32
+ end
33
+
34
+ def update_dep(key, version)
35
+ edit_data(key) { |meta_data| meta_data[MetaConstants.version_key] = version }
36
+ end
37
+
38
+ def remove_dep(key)
39
+ edit_data(key) do |meta|
40
+ meta.delete(key)
41
+ end
42
+
43
+ edit_podfile_local(nil) do |meta|
44
+ meta.delete(key)
45
+ end
46
+ end
47
+
48
+ def set_source(key)
49
+ edit_podfile_local(key) { |meta_data| meta_data[MetaConstants.binary_key] = false }
50
+ end
51
+
52
+ def remove_source(key)
53
+ edit_podfile_local(key) { |meta_data| meta_data[MetaConstants.binary_key] = true }
54
+ end
55
+
56
+ def set_binary(key)
57
+ edit_podfile_local(key) { |meta_data| meta_data[MetaConstants.binary_key] = true }
58
+ end
59
+
60
+ def remove_binary(key)
61
+ edit_podfile_local(key) { |meta_data| meta_data[MetaConstants.binary_key] = false }
62
+ end
63
+
64
+ def sources
65
+ MetaConstants.read_data.select { |key, value| !value[MetaConstants.binary_key] }.keys if MetaConstants.read_data.kind_of?(Hash)
66
+ end
67
+
68
+ def binaries
69
+ MetaConstants.read_data.select { |key, value| value[MetaConstants.binary_key] }.keys if MetaConstants.read_data.kind_of?(Hash)
70
+ end
71
+
72
+ def dependencies
73
+ MetaConstants.dependencies
74
+ end
75
+
76
+ def local_path(key)
77
+ meta_data = MetaConstants.read_data[key] if MetaConstants.read_data.kind_of?(Hash)
78
+ return meta_data[MetaConstants.local_path_key] if meta_data.kind_of?(Hash)
79
+ end
80
+
81
+ def version(key)
82
+ meta_data = MetaConstants.read_data[key] if MetaConstants.read_data.kind_of?(Hash)
83
+ return meta_data[MetaConstants.version_key] if meta_data.kind_of?(Hash)
84
+ end
85
+
86
+ def set_local_path(key, value)
87
+ # edit data
88
+ edit_podfile_local(key) do |meta_data|
89
+ meta_data[MetaConstants.local_key] = true
90
+ meta_data[MetaConstants.local_path_key] = value
91
+ end
92
+ end
93
+
94
+ def cache_local_path(key, value)
95
+ edit_podfile_local(key) do |meta_data|
96
+ meta_data[MetaConstants.local_path_key] = value
97
+ end
98
+ end
99
+
100
+ def remove_local_path(key)
101
+ edit_podfile_local(key) do |meta_data|
102
+ meta_data[MetaConstants.local_key] = false
103
+ end
104
+ end
105
+
106
+ def edit_podfile_local(key)
107
+ _edit_data(key, MetaConstants.podfile_local_path) { |e| yield e }
108
+ end
109
+
110
+ def edit_data(key)
111
+ _edit_data(key, MetaConstants.data_path) { |e| yield e }
112
+ end
113
+
114
+ private
115
+ def _edit_data(key, path)
116
+ raise "#{path} not found" unless File.exists?(path)
117
+
118
+ data_hash = MetaConstants.generate_yml_to_hash(path)
119
+ raise "#{key} illegal" unless key.kind_of?(String)
120
+
121
+ meta_data = data_hash[key]
122
+
123
+ if meta_data.kind_of?(Hash)
124
+ yield meta_data
125
+ else
126
+ data_hash[key] = yield Hash.new
127
+ end
128
+
129
+ File::open(path, "w") { |io| io.puts data_hash.to_yaml }
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,135 @@
1
+ module Pod
2
+ module Meta
3
+ class MetaConstants
4
+ class << self
5
+ require 'yaml'
6
+ require 'json'
7
+
8
+ def generate_yml_to_hash(path)
9
+ return Hash.new unless File.exists?(path)
10
+ _hash = YAML.load_file(path)
11
+ if _hash.kind_of?(Hash)
12
+ _hash
13
+ else
14
+ Hash.new
15
+ end
16
+ end
17
+
18
+ def dependencies
19
+ generate_yml_to_hash(data_path).keys
20
+ end
21
+
22
+ def read_data(enable_branch = false)
23
+ # read data
24
+ data_hash = generate_yml_to_hash(data_path)
25
+
26
+ # read Podfile.yml
27
+ podfile_local_hash = generate_yml_to_hash(podfile_local_path)
28
+
29
+ # cache branch if local_path is set
30
+ unless enable_branch
31
+ branch_caches = Array.new
32
+ podfile_local_hash.each do |key, value|
33
+ next unless value.kind_of?(Hash)
34
+ local = value[local_key]
35
+ next unless local
36
+
37
+ local_path = value[local_path_key]
38
+ next unless local_path.kind_of?(String)
39
+
40
+ branch_cache = Pod::Private::PrivateCache::BranchCache.new(key, local_path)
41
+ branch_caches << branch_cache
42
+ end
43
+
44
+ Pod::Private::PrivateCache.cache_branch(branch_caches)
45
+ end
46
+
47
+ # merge local data and remote data
48
+ merged_data = Hash.new
49
+ data_hash.each do |key, value|
50
+ # check value
51
+ unless value.kind_of?(Hash)
52
+ UI.puts "data not found in data.yaml with key: #{key}"
53
+ next
54
+ end
55
+
56
+ # check value in local podfile
57
+ local_data_value = podfile_local_hash[key]
58
+ unless value.kind_of?(Hash)
59
+ UI.puts "data not found in Podfile.yaml with key: #{key}"
60
+ next
61
+ end
62
+
63
+ if local_data_value.kind_of?(Hash)
64
+ merged_data[key] = value.merge(local_data_value)
65
+ else
66
+ merged_data[key] = value
67
+ end
68
+ end
69
+
70
+ merged_data
71
+ end
72
+
73
+ def pods_scripts_path
74
+ 'pods-scripts'
75
+ end
76
+
77
+ def pods_generator_path
78
+ "#{pods_scripts_path}/PodfileGenerator"
79
+ end
80
+
81
+ def branch_cache_path
82
+ "#{pods_generator_path}/branch_cache.yml"
83
+ end
84
+
85
+ def meta_path
86
+ "#{pods_generator_path}/meta.yml"
87
+ end
88
+
89
+ def data_path
90
+ "#{pods_generator_path}/data.yml"
91
+ end
92
+
93
+ def post_install_hooks_path
94
+ "#{pods_scripts_path}/PostInstallHooks"
95
+ end
96
+
97
+ def podfile_local_path
98
+ 'Podfile.yml'
99
+ end
100
+
101
+ def branch_key
102
+ 'branch'
103
+ end
104
+
105
+ def git_key
106
+ 'git'
107
+ end
108
+
109
+ def version_key
110
+ 'version'
111
+ end
112
+
113
+ def source_key
114
+ 'source'
115
+ end
116
+
117
+ def binary_key
118
+ 'binary'
119
+ end
120
+
121
+ def local_key
122
+ 'local'
123
+ end
124
+
125
+ def local_path_key
126
+ 'local_path'
127
+ end
128
+
129
+ def branch_key
130
+ 'branch'
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end