plasmo_xcodeproj 1.21.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +19 -0
  3. data/README.md +95 -0
  4. data/bin/xcodeproj +10 -0
  5. data/lib/xcodeproj/command/config_dump.rb +91 -0
  6. data/lib/xcodeproj/command/project_diff.rb +56 -0
  7. data/lib/xcodeproj/command/show.rb +60 -0
  8. data/lib/xcodeproj/command/sort.rb +44 -0
  9. data/lib/xcodeproj/command/target_diff.rb +43 -0
  10. data/lib/xcodeproj/command.rb +63 -0
  11. data/lib/xcodeproj/config/other_linker_flags_parser.rb +73 -0
  12. data/lib/xcodeproj/config.rb +386 -0
  13. data/lib/xcodeproj/constants.rb +465 -0
  14. data/lib/xcodeproj/differ.rb +239 -0
  15. data/lib/xcodeproj/gem_version.rb +5 -0
  16. data/lib/xcodeproj/helper.rb +30 -0
  17. data/lib/xcodeproj/plist.rb +94 -0
  18. data/lib/xcodeproj/project/case_converter.rb +90 -0
  19. data/lib/xcodeproj/project/object/build_configuration.rb +255 -0
  20. data/lib/xcodeproj/project/object/build_file.rb +84 -0
  21. data/lib/xcodeproj/project/object/build_phase.rb +369 -0
  22. data/lib/xcodeproj/project/object/build_rule.rb +109 -0
  23. data/lib/xcodeproj/project/object/configuration_list.rb +117 -0
  24. data/lib/xcodeproj/project/object/container_item_proxy.rb +116 -0
  25. data/lib/xcodeproj/project/object/file_reference.rb +338 -0
  26. data/lib/xcodeproj/project/object/group.rb +506 -0
  27. data/lib/xcodeproj/project/object/helpers/build_settings_array_settings_by_object_version.rb +72 -0
  28. data/lib/xcodeproj/project/object/helpers/file_references_factory.rb +245 -0
  29. data/lib/xcodeproj/project/object/helpers/groupable_helper.rb +260 -0
  30. data/lib/xcodeproj/project/object/native_target.rb +751 -0
  31. data/lib/xcodeproj/project/object/reference_proxy.rb +86 -0
  32. data/lib/xcodeproj/project/object/root_object.rb +100 -0
  33. data/lib/xcodeproj/project/object/swift_package_product_dependency.rb +29 -0
  34. data/lib/xcodeproj/project/object/swift_package_remote_reference.rb +33 -0
  35. data/lib/xcodeproj/project/object/target_dependency.rb +94 -0
  36. data/lib/xcodeproj/project/object.rb +534 -0
  37. data/lib/xcodeproj/project/object_attributes.rb +522 -0
  38. data/lib/xcodeproj/project/object_dictionary.rb +210 -0
  39. data/lib/xcodeproj/project/object_list.rb +223 -0
  40. data/lib/xcodeproj/project/project_helper.rb +341 -0
  41. data/lib/xcodeproj/project/uuid_generator.rb +132 -0
  42. data/lib/xcodeproj/project.rb +874 -0
  43. data/lib/xcodeproj/scheme/abstract_scheme_action.rb +100 -0
  44. data/lib/xcodeproj/scheme/analyze_action.rb +19 -0
  45. data/lib/xcodeproj/scheme/archive_action.rb +59 -0
  46. data/lib/xcodeproj/scheme/build_action.rb +298 -0
  47. data/lib/xcodeproj/scheme/buildable_product_runnable.rb +55 -0
  48. data/lib/xcodeproj/scheme/buildable_reference.rb +129 -0
  49. data/lib/xcodeproj/scheme/command_line_arguments.rb +162 -0
  50. data/lib/xcodeproj/scheme/environment_variables.rb +170 -0
  51. data/lib/xcodeproj/scheme/execution_action.rb +86 -0
  52. data/lib/xcodeproj/scheme/launch_action.rb +179 -0
  53. data/lib/xcodeproj/scheme/location_scenario_reference.rb +49 -0
  54. data/lib/xcodeproj/scheme/macro_expansion.rb +34 -0
  55. data/lib/xcodeproj/scheme/profile_action.rb +57 -0
  56. data/lib/xcodeproj/scheme/remote_runnable.rb +92 -0
  57. data/lib/xcodeproj/scheme/send_email_action_content.rb +84 -0
  58. data/lib/xcodeproj/scheme/shell_script_action_content.rb +77 -0
  59. data/lib/xcodeproj/scheme/test_action.rb +394 -0
  60. data/lib/xcodeproj/scheme/xml_element_wrapper.rb +82 -0
  61. data/lib/xcodeproj/scheme.rb +375 -0
  62. data/lib/xcodeproj/user_interface.rb +22 -0
  63. data/lib/xcodeproj/workspace/file_reference.rb +79 -0
  64. data/lib/xcodeproj/workspace/group_reference.rb +67 -0
  65. data/lib/xcodeproj/workspace/reference.rb +40 -0
  66. data/lib/xcodeproj/workspace.rb +277 -0
  67. data/lib/xcodeproj/xcodebuild_helper.rb +108 -0
  68. data/lib/xcodeproj.rb +29 -0
  69. metadata +208 -0
@@ -0,0 +1,245 @@
1
+ # frozen_string_literal: true
2
+ require 'xcodeproj/project/object/helpers/groupable_helper'
3
+
4
+ module Xcodeproj
5
+ class Project
6
+ module Object
7
+ class FileReferencesFactory
8
+ class << self
9
+ # Creates a new reference with the given path and adds it to the
10
+ # given group. The reference is configured according to the extension
11
+ # of the path.
12
+ #
13
+ # @param [PBXGroup] group
14
+ # The group to which to add the reference.
15
+ #
16
+ # @param [#to_s] path
17
+ # The, preferably absolute, path of the reference.
18
+ #
19
+ # @param [Symbol] source_tree
20
+ # The source tree key to use to configure the path (@see
21
+ # GroupableHelper::SOURCE_TREES_BY_KEY).
22
+ #
23
+ # @return [PBXFileReference, XCVersionGroup] The new reference.
24
+ #
25
+ def new_reference(group, path, source_tree)
26
+ ref = case File.extname(path).downcase
27
+ when '.xcdatamodeld'
28
+ new_xcdatamodeld(group, path, source_tree)
29
+ when '.xcodeproj'
30
+ new_subproject(group, path, source_tree)
31
+ else
32
+ new_file_reference(group, path, source_tree)
33
+ end
34
+
35
+ configure_defaults_for_file_reference(ref)
36
+ ref
37
+ end
38
+
39
+ # Creates a file reference to a static library and adds it to the
40
+ # given group.
41
+ #
42
+ # @param [PBXGroup] group
43
+ # The group to which to add the reference.
44
+ #
45
+ # @param [#to_s] product_basename
46
+ # The name of the static library.
47
+ #
48
+ # @return [PBXFileReference] The new file reference.
49
+ #
50
+ def new_product_ref_for_target(group, product_basename, product_type)
51
+ if product_type == :static_library
52
+ prefix = 'lib'
53
+ end
54
+ extension = Constants::PRODUCT_UTI_EXTENSIONS[product_type]
55
+ path = "#{prefix}#{product_basename}"
56
+ path += ".#{extension}" if extension
57
+ ref = new_reference(group, path, :built_products)
58
+ ref.include_in_index = '0'
59
+ ref.set_explicit_file_type
60
+ ref
61
+ end
62
+
63
+ # Creates a file reference to a new bundle and adds it to the given
64
+ # group.
65
+ #
66
+ # @param [PBXGroup] group
67
+ # The group to which to add the reference.
68
+ #
69
+ # @param [#to_s] product_basename
70
+ # The name of the bundle.
71
+ #
72
+ # @return [PBXFileReference] The new file reference.
73
+ #
74
+ def new_bundle(group, product_basename)
75
+ ref = new_reference(group, "#{product_basename}.bundle", :built_products)
76
+ ref.include_in_index = '0'
77
+ ref.set_explicit_file_type('wrapper.cfbundle')
78
+ ref
79
+ end
80
+
81
+ private
82
+
83
+ # @group Private Helpers
84
+ #-------------------------------------------------------------------#
85
+
86
+ # Creates a new file reference with the given path and adds it to the
87
+ # given group.
88
+ #
89
+ # @param [PBXGroup] group
90
+ # The group to which to add the reference.
91
+ #
92
+ # @param [#to_s] path
93
+ # The, preferably absolute, path of the reference.
94
+ #
95
+ # @param [Symbol] source_tree
96
+ # The source tree key to use to configure the path (@see
97
+ # GroupableHelper::SOURCE_TREES_BY_KEY).
98
+ #
99
+ # @return [PBXFileReference] The new file reference.
100
+ #
101
+ def new_file_reference(group, path, source_tree)
102
+ path = Pathname.new(path)
103
+ ref = group.project.new(PBXFileReference)
104
+ group.children << ref
105
+ GroupableHelper.set_path_with_source_tree(ref, path, source_tree)
106
+ ref.set_last_known_file_type
107
+ ref
108
+ end
109
+
110
+ # Creates a new version group reference to an xcdatamodeled adding
111
+ # the xcdatamodel files included in the wrapper as children file
112
+ # references.
113
+ #
114
+ # @param [PBXGroup] group
115
+ # The group to which to add the reference.
116
+ #
117
+ # @param [#to_s] path
118
+ # The, preferably absolute, path of the reference.
119
+ #
120
+ # @param [Symbol] source_tree
121
+ # The source tree key to use to configure the path (@see
122
+ # GroupableHelper::SOURCE_TREES_BY_KEY).
123
+ #
124
+ # @note To match Xcode behaviour the current version is read from
125
+ # the .xccurrentversion file, if it doesn't exist the last
126
+ # xcdatamodel according to its path is set as the current
127
+ # version.
128
+ #
129
+ # @return [XCVersionGroup] The new reference.
130
+ #
131
+ def new_xcdatamodeld(group, path, source_tree)
132
+ path = Pathname.new(path)
133
+ ref = group.project.new(XCVersionGroup)
134
+ group.children << ref
135
+ GroupableHelper.set_path_with_source_tree(ref, path, source_tree)
136
+ ref.version_group_type = 'wrapper.xcdatamodel'
137
+
138
+ real_path = group.real_path.join(path)
139
+ current_version_name = nil
140
+ if real_path.exist?
141
+ real_path.children.each do |child_path|
142
+ if File.extname(child_path) == '.xcdatamodel'
143
+ new_file_reference(ref, child_path, :group)
144
+ elsif File.basename(child_path) == '.xccurrentversion'
145
+ full_path = real_path + File.basename(child_path)
146
+ xccurrentversion = Plist.read_from_path(full_path)
147
+ current_version_name = xccurrentversion['_XCCurrentVersionName']
148
+ end
149
+ end
150
+
151
+ if current_version_name
152
+ ref.current_version = ref.children.find do |obj|
153
+ obj.path.split('/').last == current_version_name
154
+ end
155
+ end
156
+ end
157
+
158
+ ref
159
+ end
160
+
161
+ # Creates a file reference to another Xcode subproject and setups the
162
+ # proxies to the targets.
163
+ #
164
+ # @param [PBXGroup] group
165
+ # The group to which to add the reference.
166
+ #
167
+ # @param [#to_s] path
168
+ # The, preferably absolute, path of the reference.
169
+ #
170
+ # @param [Symbol] source_tree
171
+ # The source tree key to use to configure the path (@see
172
+ # GroupableHelper::SOURCE_TREES_BY_KEY).
173
+ #
174
+ # @note To analyze the targets the given project is read and thus
175
+ # it should already exist in the disk.
176
+ #
177
+ # @return [PBXFileReference] The new file reference.
178
+ #
179
+ def new_subproject(group, path, source_tree)
180
+ ref = new_file_reference(group, path, source_tree)
181
+ ref.include_in_index = nil
182
+
183
+ product_group_ref = find_products_group_ref(group, true)
184
+
185
+ subproj = Project.open(path)
186
+ subproj.products_group.files.each do |product_reference|
187
+ container_proxy = group.project.new(PBXContainerItemProxy)
188
+ container_proxy.container_portal = ref.uuid
189
+ container_proxy.proxy_type = Constants::PROXY_TYPES[:reference]
190
+ container_proxy.remote_global_id_string = product_reference.uuid
191
+ container_proxy.remote_info = 'Subproject'
192
+
193
+ reference_proxy = group.project.new(PBXReferenceProxy)
194
+ extension = File.extname(product_reference.path)[1..-1]
195
+ reference_proxy.file_type = Constants::FILE_TYPES_BY_EXTENSION[extension]
196
+ reference_proxy.path = product_reference.path
197
+ reference_proxy.remote_ref = container_proxy
198
+ reference_proxy.source_tree = 'BUILT_PRODUCTS_DIR'
199
+
200
+ product_group_ref << reference_proxy
201
+ end
202
+
203
+ attribute = PBXProject.references_by_keys_attributes.find { |attrb| attrb.name == :project_references }
204
+ project_reference = ObjectDictionary.new(attribute, group.project.root_object)
205
+ project_reference[:project_ref] = ref
206
+ project_reference[:product_group] = product_group_ref
207
+ group.project.root_object.project_references << project_reference
208
+
209
+ ref
210
+ end
211
+
212
+ # Configures a file reference according to the extension to math
213
+ # Xcode behaviour.
214
+ #
215
+ # @param [PBXFileReference] ref
216
+ # The file reference to configure.
217
+ #
218
+ # @note To closely match the Xcode behaviour the name attribute of
219
+ # the file reference is set only if the path of the file is
220
+ # not equal to the path of the group.
221
+ #
222
+ # @return [void]
223
+ #
224
+ def configure_defaults_for_file_reference(ref)
225
+ if ref.path.include?('/')
226
+ ref.name = ref.path.split('/').last
227
+ end
228
+
229
+ if File.extname(ref.path).downcase == '.framework'
230
+ ref.include_in_index = nil
231
+ end
232
+ end
233
+
234
+ def find_products_group_ref(group, should_create = false)
235
+ product_group_ref =
236
+ (group.project.root_object.product_ref_group ||= group.project.main_group.find_subpath('Products', should_create))
237
+ product_group_ref
238
+ end
239
+
240
+ #-------------------------------------------------------------------#
241
+ end
242
+ end
243
+ end
244
+ end
245
+ end
@@ -0,0 +1,260 @@
1
+ # frozen_string_literal: true
2
+ module Xcodeproj
3
+ class Project
4
+ module Object
5
+ class GroupableHelper
6
+ class << self
7
+ # @param [PBXGroup, PBXFileReference] object
8
+ # The object to analyze.
9
+ #
10
+ # @return [PBXGroup, PBXProject] The parent of the object.
11
+ #
12
+ def parent(object)
13
+ referrers = object.referrers.uniq
14
+ if referrers.count > 1
15
+ referrers = referrers.grep(PBXGroup)
16
+ end
17
+
18
+ if referrers.count == 0
19
+ raise '[Xcodeproj] Consistency issue: no parent ' \
20
+ "for object `#{object.display_name}`: "\
21
+ "`#{object.referrers.join('`, `')}`"
22
+ elsif referrers.count > 1
23
+ raise '[Xcodeproj] Consistency issue: unexpected multiple parents ' \
24
+ "for object `#{object.display_name}`: "\
25
+ "#{object.referrers}"
26
+ end
27
+ referrers.first
28
+ end
29
+
30
+ # @param [PBXGroup, PBXFileReference] object
31
+ # The object to analyze.
32
+ #
33
+ # @return [Array<PBXGroup, PBXProject>] The parents of the object.
34
+ #
35
+ def parents(object)
36
+ if main_group?(object)
37
+ []
38
+ else
39
+ parent = parent(object)
40
+ parents(parent).push(parent)
41
+ end
42
+ end
43
+
44
+ # @param [PBXGroup, PBXFileReference] object
45
+ # The object to analyze.
46
+ #
47
+ # @return [String] A representation of the group hierarchy.
48
+ #
49
+ def hierarchy_path(object)
50
+ unless main_group?(object)
51
+ parent = parent(object)
52
+ parent = parent.hierarchy_path if parent.respond_to?(:hierarchy_path)
53
+ "#{parent}/#{object.display_name}"
54
+ end
55
+ end
56
+
57
+ # @param [PBXGroup, PBXFileReference] object
58
+ # The object to analyze.
59
+ #
60
+ # @return [Bool] Wether the object is the main group of the project.
61
+ #
62
+ def main_group?(object)
63
+ object.equal?(object.project.main_group)
64
+ end
65
+
66
+ # Moves the object to a new parent.
67
+ #
68
+ # @param [PBXGroup, PBXFileReference] object
69
+ # The object to move.
70
+ #
71
+ # @param [PBXGroup] new_parent
72
+ # The new parent.
73
+ #
74
+ # @return [void]
75
+ #
76
+ def move(object, new_parent)
77
+ unless object
78
+ raise "[Xcodeproj] Attempt to move nil object to `#{new_parent}`."
79
+ end
80
+ unless new_parent
81
+ raise "[Xcodeproj] Attempt to move object `#{object}` to nil parent."
82
+ end
83
+ if new_parent.equal?(object)
84
+ raise "[Xcodeproj] Attempt to move object `#{object}` to itself."
85
+ end
86
+ if parents(new_parent).include?(object)
87
+ raise "[Xcodeproj] Attempt to move object `#{object}` to a child object `#{new_parent}`."
88
+ end
89
+
90
+ object.parent.children.delete(object)
91
+ new_parent << object
92
+ end
93
+
94
+ # @param [PBXGroup, PBXFileReference] object
95
+ # The object to analyze.
96
+ #
97
+ # @return [Pathname] The absolute path of the object resolving the
98
+ # source tree.
99
+ #
100
+ def real_path(object)
101
+ source_tree = source_tree_real_path(object)
102
+ path = object.path || ''.freeze
103
+ if source_tree
104
+ source_tree + path
105
+ else
106
+ Pathname(path)
107
+ end
108
+ end
109
+
110
+ # @param [PBXGroup, PBXFileReference] object
111
+ # The object to analyze.
112
+ #
113
+ # @return [Pathname] The path of the object without resolving the
114
+ # source tree.
115
+ #
116
+ def full_path(object)
117
+ folder = case object.source_tree
118
+ when '<group>'
119
+ object_parent = parent(object)
120
+ if object_parent.isa == 'PBXProject'.freeze
121
+ nil
122
+ else
123
+ full_path(object_parent)
124
+ end
125
+ when 'SOURCE_ROOT'
126
+ nil
127
+ when '<absolute>'
128
+ Pathname.new('/'.freeze)
129
+ else
130
+ Pathname.new("${#{object.source_tree}}")
131
+ end
132
+ folder ||= Pathname.new('')
133
+ if object.path
134
+ folder + object.path
135
+ else
136
+ folder
137
+ end
138
+ end
139
+
140
+ # @param [PBXGroup, PBXFileReference] object
141
+ # The object to analyze.
142
+ #
143
+ # @return [Pathname] The absolute path of the source tree of the
144
+ # object.
145
+ #
146
+ def source_tree_real_path(object)
147
+ case object.source_tree
148
+ when '<group>'
149
+ object_parent = parent(object)
150
+ if object_parent.isa == 'PBXProject'.freeze
151
+ object.project.project_dir + object.project.root_object.project_dir_path
152
+ else
153
+ real_path(object_parent)
154
+ end
155
+ when 'SOURCE_ROOT'
156
+ object.project.project_dir
157
+ when '<absolute>'
158
+ nil
159
+ else
160
+ Pathname.new("${#{object.source_tree}}")
161
+ end
162
+ end
163
+
164
+ # @return [Hash{Symbol => String}] The source tree values by they
165
+ # symbol representation.
166
+ #
167
+ SOURCE_TREES_BY_KEY = {
168
+ :absolute => '<absolute>',
169
+ :group => '<group>',
170
+ :project => 'SOURCE_ROOT',
171
+ :built_products => 'BUILT_PRODUCTS_DIR',
172
+ :developer_dir => 'DEVELOPER_DIR',
173
+ :sdk_root => 'SDKROOT',
174
+ }.freeze
175
+
176
+ # Sets the source tree of the given object.
177
+ #
178
+ # @param [Symbol, String] source_tree
179
+ # The source tree, either a string or a key for
180
+ # {SOURCE_TREES_BY_KEY}.
181
+ #
182
+ # @return [void]
183
+ #
184
+ def set_source_tree(object, source_tree)
185
+ source_tree = normalize_source_tree(source_tree)
186
+ object.source_tree = source_tree
187
+ end
188
+
189
+ # Sets the path of the given object according to the provided source
190
+ # tree key. The path is converted to relative according to the real
191
+ # path of the source tree for group and project source trees, if both
192
+ # paths are relative or absolute. Otherwise the path is set as
193
+ # provided.
194
+ #
195
+ # @param [PBXGroup, PBXFileReference] object
196
+ # The object whose path needs to be set.
197
+ #
198
+ # @param [#to_s] path
199
+ # The path.
200
+ #
201
+ # @param [Symbol, String] source_tree
202
+ # The source tree, either a string or a key for
203
+ # {SOURCE_TREES_BY_KEY}.
204
+ #
205
+ # @return [void]
206
+ #
207
+ def set_path_with_source_tree(object, path, source_tree)
208
+ path = Pathname(path)
209
+ source_tree = normalize_source_tree(source_tree)
210
+ object.source_tree = source_tree
211
+
212
+ if source_tree == SOURCE_TREES_BY_KEY[:absolute]
213
+ unless path.absolute?
214
+ raise '[Xcodeproj] Attempt to set a relative path with an ' \
215
+ "absolute source tree: `#{path}`"
216
+ end
217
+ object.path = path.to_s
218
+ elsif source_tree == SOURCE_TREES_BY_KEY[:group] || source_tree == SOURCE_TREES_BY_KEY[:project]
219
+ source_tree_real_path = GroupableHelper.source_tree_real_path(object)
220
+ if source_tree_real_path && source_tree_real_path.absolute? == path.absolute?
221
+ relative_path = path.relative_path_from(source_tree_real_path)
222
+ object.path = relative_path.to_s
223
+ else
224
+ object.path = path.to_s
225
+ end
226
+ else
227
+ object.path = path.to_s
228
+ end
229
+ end
230
+
231
+ private
232
+
233
+ # @group Helpers
234
+ #-------------------------------------------------------------------#
235
+
236
+ # Converts the given source tree to its string value.
237
+ #
238
+ # @param [Symbol, String] source_tree
239
+ # The source tree, either a string or a key for
240
+ # {SOURCE_TREES_BY_KEY}.
241
+ #
242
+ # @return [String] the string value of the source tree.
243
+ #
244
+ def normalize_source_tree(source_tree)
245
+ if source_tree.is_a?(Symbol)
246
+ source_tree = SOURCE_TREES_BY_KEY[source_tree]
247
+ end
248
+
249
+ unless SOURCE_TREES_BY_KEY.values.include?(source_tree)
250
+ raise "[Xcodeproj] Unrecognized source tree option `#{source_tree}`"
251
+ end
252
+ source_tree
253
+ end
254
+
255
+ #-------------------------------------------------------------------#
256
+ end
257
+ end
258
+ end
259
+ end
260
+ end