xcodeproj 0.9.0 → 0.10.0
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 +4 -4
- data/ext/xcodeproj/extconf.rb +8 -0
- data/lib/xcodeproj.rb +2 -2
- data/lib/xcodeproj/config.rb +3 -3
- data/lib/xcodeproj/constants.rb +1 -1
- data/lib/xcodeproj/gem_version.rb +6 -0
- data/lib/xcodeproj/project.rb +163 -90
- data/lib/xcodeproj/project/object.rb +17 -4
- data/lib/xcodeproj/project/object/configuration_list.rb +15 -2
- data/lib/xcodeproj/project/object/file_reference.rb +60 -14
- data/lib/xcodeproj/project/object/group.rb +100 -168
- data/lib/xcodeproj/project/object/helpers/file_references_factory.rb +182 -0
- data/lib/xcodeproj/project/object/helpers/groupable_helper.rb +210 -0
- data/lib/xcodeproj/project/object/native_target.rb +23 -0
- data/lib/xcodeproj/project/project_helper.rb +44 -43
- data/lib/xcodeproj/project/xcproj_helper.rb +55 -0
- metadata +8 -4
@@ -32,6 +32,18 @@ module Xcodeproj
|
|
32
32
|
|
33
33
|
# @!group Helpers
|
34
34
|
|
35
|
+
# Returns the build configuration with the given name.
|
36
|
+
#
|
37
|
+
# @param [String] name
|
38
|
+
# The name of the build configuration.
|
39
|
+
#
|
40
|
+
# @return [XCBuildConfiguration] The build configuration.
|
41
|
+
# @return [Nil] If not build configuration with the given name is found.
|
42
|
+
#
|
43
|
+
def [](name)
|
44
|
+
build_configurations.find { |bc| bc.name == name }
|
45
|
+
end
|
46
|
+
|
35
47
|
# Returns the build settings of the build configuration with
|
36
48
|
# the given name.
|
37
49
|
#
|
@@ -41,8 +53,9 @@ module Xcodeproj
|
|
41
53
|
# @return [Hash {String=>String}] the build settings
|
42
54
|
#
|
43
55
|
def build_settings(build_configuration_name)
|
44
|
-
config =
|
45
|
-
|
56
|
+
if config = self[build_configuration_name]
|
57
|
+
config.build_settings
|
58
|
+
end
|
46
59
|
end
|
47
60
|
|
48
61
|
#---------------------------------------------------------------------#
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'xcodeproj/project/object/helpers/groupable_helper'
|
2
|
+
|
1
3
|
module Xcodeproj
|
2
4
|
class Project
|
3
5
|
module Object
|
@@ -16,10 +18,17 @@ module Xcodeproj
|
|
16
18
|
#
|
17
19
|
attribute :path, String
|
18
20
|
|
19
|
-
# @return [String] the
|
21
|
+
# @return [String] the directory to which the path is relative.
|
20
22
|
#
|
21
|
-
# @note
|
22
|
-
#
|
23
|
+
# @note The accepted values are:
|
24
|
+
# - `<absolute>` for absolute paths
|
25
|
+
# - `<group>` for paths relative to the group
|
26
|
+
# - `SOURCE_ROOT` for paths relative to the project
|
27
|
+
# - `DEVELOPER_DIR` for paths relative to the developer
|
28
|
+
# directory.
|
29
|
+
# - `BUILT_PRODUCTS_DIR` for paths relative to the build
|
30
|
+
# products directory.
|
31
|
+
# - `SDKROOT` for paths relative to the SDK directory.
|
23
32
|
#
|
24
33
|
attribute :source_tree, String, 'SOURCE_ROOT'
|
25
34
|
|
@@ -92,7 +101,6 @@ module Xcodeproj
|
|
92
101
|
#
|
93
102
|
attribute :wraps_lines, String
|
94
103
|
|
95
|
-
|
96
104
|
# @return [String] Apparently whether Xcode should add, if needed, a
|
97
105
|
# new line feed before saving the file.
|
98
106
|
#
|
@@ -117,19 +125,37 @@ module Xcodeproj
|
|
117
125
|
# needed.
|
118
126
|
#
|
119
127
|
def display_name
|
120
|
-
name || File.basename(path)
|
128
|
+
name || (File.basename(path) if path)
|
129
|
+
end
|
130
|
+
|
131
|
+
# @return [PBXGroup, PBXProject] the parent of the file.
|
132
|
+
#
|
133
|
+
def parent
|
134
|
+
GroupableHelper.parent(self)
|
135
|
+
end
|
136
|
+
|
137
|
+
# @return [String] A representation of the reference hierarchy.
|
138
|
+
#
|
139
|
+
def hierarchy_path
|
140
|
+
GroupableHelper.hierarchy_path(self)
|
121
141
|
end
|
122
142
|
|
123
|
-
#
|
143
|
+
# Moves the reference to a new parent.
|
144
|
+
#
|
145
|
+
# @param [PBXGroup] new_parent
|
146
|
+
# The new parent.
|
124
147
|
#
|
125
|
-
|
126
|
-
|
148
|
+
# @return [void]
|
149
|
+
#
|
150
|
+
def move(new_parent)
|
151
|
+
GroupableHelper.move(self, new_parent)
|
127
152
|
end
|
128
153
|
|
129
|
-
# @return [
|
154
|
+
# @return [Pathname] the absolute path of the file resolving the
|
155
|
+
# source tree.
|
130
156
|
#
|
131
|
-
def
|
132
|
-
|
157
|
+
def real_path
|
158
|
+
GroupableHelper.real_path(self)
|
133
159
|
end
|
134
160
|
|
135
161
|
# @return [Array<PBXBuildFile>] the build files associated with the
|
@@ -141,10 +167,30 @@ module Xcodeproj
|
|
141
167
|
|
142
168
|
# Sets the last known file type according to the extension of the path.
|
143
169
|
#
|
144
|
-
# @return [
|
170
|
+
# @return [void]
|
171
|
+
#
|
172
|
+
def set_last_known_file_type(type = nil)
|
173
|
+
if type
|
174
|
+
self.last_known_file_type = type
|
175
|
+
elsif path
|
176
|
+
extension = Pathname(path).extname[1..-1]
|
177
|
+
self.last_known_file_type = Constants::FILE_TYPES_BY_EXTENSION[extension]
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
# Sets the explicit file type according to the extension of the path,
|
182
|
+
# and clears the last known file type.
|
183
|
+
#
|
184
|
+
# @return [void]
|
145
185
|
#
|
146
|
-
def
|
147
|
-
self.last_known_file_type =
|
186
|
+
def set_explicit_file_type(type = nil)
|
187
|
+
self.last_known_file_type = nil
|
188
|
+
if type
|
189
|
+
self.explicit_file_type = type
|
190
|
+
elsif path
|
191
|
+
extension = Pathname(path).extname[1..-1]
|
192
|
+
self.explicit_file_type = Constants::FILE_TYPES_BY_EXTENSION[extension]
|
193
|
+
end
|
148
194
|
end
|
149
195
|
|
150
196
|
# Checks whether the reference is a proxy.
|
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'xcodeproj/project/object/helpers/groupable_helper'
|
2
|
+
require 'xcodeproj/project/object/helpers/file_references_factory'
|
3
|
+
|
1
4
|
module Xcodeproj
|
2
5
|
class Project
|
3
6
|
module Object
|
@@ -14,9 +17,17 @@ module Xcodeproj
|
|
14
17
|
#
|
15
18
|
has_many :children, [PBXGroup, PBXFileReference, PBXReferenceProxy]
|
16
19
|
|
17
|
-
# @return [String] the
|
20
|
+
# @return [String] the directory to which the path is relative.
|
18
21
|
#
|
19
|
-
# @note
|
22
|
+
# @note The accepted values are:
|
23
|
+
# - `<absolute>` for absolute paths
|
24
|
+
# - `<group>` for paths relative to the group
|
25
|
+
# - `SOURCE_ROOT` for paths relative to the project
|
26
|
+
# - `DEVELOPER_DIR` for paths relative to the developer
|
27
|
+
# directory.
|
28
|
+
# - `BUILT_PRODUCTS_DIR` for paths relative to the build
|
29
|
+
# products directory.
|
30
|
+
# - `SDKROOT` for paths relative to the SDK directory.
|
20
31
|
#
|
21
32
|
attribute :source_tree, String, '<group>'
|
22
33
|
|
@@ -86,6 +97,36 @@ module Xcodeproj
|
|
86
97
|
end
|
87
98
|
end
|
88
99
|
|
100
|
+
# @return [PBXGroup, PBXProject] The parent of the group.
|
101
|
+
#
|
102
|
+
def parent
|
103
|
+
GroupableHelper.parent(self)
|
104
|
+
end
|
105
|
+
|
106
|
+
# @return [String] A representation of the group hierarchy.
|
107
|
+
#
|
108
|
+
def hierarchy_path
|
109
|
+
GroupableHelper.hierarchy_path(self)
|
110
|
+
end
|
111
|
+
|
112
|
+
# Moves the group to a new parent.
|
113
|
+
#
|
114
|
+
# @param [PBXGroup] new_parent
|
115
|
+
# The new parent.
|
116
|
+
#
|
117
|
+
# @return [void]
|
118
|
+
#
|
119
|
+
def move(new_parent)
|
120
|
+
GroupableHelper.move(self, new_parent)
|
121
|
+
end
|
122
|
+
|
123
|
+
# @return [Pathname] the absolute path of the group resolving the
|
124
|
+
# source tree.
|
125
|
+
#
|
126
|
+
def real_path
|
127
|
+
GroupableHelper.real_path(self)
|
128
|
+
end
|
129
|
+
|
89
130
|
# @return [Array<PBXFileReference>] the files references in the group
|
90
131
|
# children.
|
91
132
|
#
|
@@ -99,6 +140,13 @@ module Xcodeproj
|
|
99
140
|
children.select { |obj| obj.class == PBXGroup }
|
100
141
|
end
|
101
142
|
|
143
|
+
# @return [Array<XCVersionGroup>] the version groups in the group
|
144
|
+
# children.
|
145
|
+
#
|
146
|
+
def version_groups
|
147
|
+
children.select { |obj| obj.class == XCVersionGroup }
|
148
|
+
end
|
149
|
+
|
102
150
|
# @return [Array<PBXGroup,PBXFileReference,PBXReferenceProxy>] the
|
103
151
|
# recursive children of the group.
|
104
152
|
#
|
@@ -111,198 +159,74 @@ module Xcodeproj
|
|
111
159
|
result
|
112
160
|
end
|
113
161
|
|
114
|
-
# @return [
|
115
|
-
# children.
|
162
|
+
# @return [Bool] Whether the group is empty.
|
116
163
|
#
|
117
|
-
def
|
118
|
-
children.
|
164
|
+
def empty?
|
165
|
+
children.count.zero?
|
119
166
|
end
|
120
167
|
|
121
|
-
# Creates a new
|
122
|
-
# group
|
123
|
-
#
|
124
|
-
# @note The subpath is created if needed, similar to the UNIX command
|
125
|
-
# `mkdir -p`
|
126
|
-
#
|
127
|
-
# @note To closely match the Xcode behaviour the name attribute of
|
128
|
-
# the file reference is set only if the path of the file is not
|
129
|
-
# equal to the path of the group.
|
168
|
+
# Creates a new reference with the given path and adds it to the
|
169
|
+
# group. The reference is configured according to the extension
|
170
|
+
# of the path.
|
130
171
|
#
|
131
172
|
# @param [#to_s] path
|
132
|
-
#
|
133
|
-
#
|
134
|
-
# @param [String] sub_group_path
|
135
|
-
# an optional subgroup path indicating the groups separated by
|
136
|
-
# a `/`.
|
137
|
-
#
|
138
|
-
# @return [PBXFileReference] the new file reference.
|
139
|
-
#
|
140
|
-
def new_file(path, sub_group_path = nil)
|
141
|
-
extname = File.extname(path)
|
142
|
-
case
|
143
|
-
when extname == '.framework' then new_framework(path, sub_group_path)
|
144
|
-
when extname == '.xcdatamodeld' then new_xcdatamodeld(path, sub_group_path)
|
145
|
-
else new_file_reference(path, sub_group_path)
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
# Creates a new file reference with the given path and adds it to the
|
150
|
-
# group or to an optional subpath.
|
151
|
-
#
|
152
|
-
# @note @see #new_file
|
173
|
+
# The, preferably absolute, path of the reference.
|
153
174
|
#
|
154
|
-
# @param
|
175
|
+
# @param [Symbol] source_tree
|
176
|
+
# The source tree key to use to configure the path (@see
|
177
|
+
# GroupableHelper::SOURCE_TREES_BY_KEY).
|
155
178
|
#
|
156
|
-
# @return [PBXFileReference]
|
179
|
+
# @return [PBXFileReference, XCVersionGroup] The new reference.
|
157
180
|
#
|
158
|
-
def
|
159
|
-
|
160
|
-
ref.path = path.to_s
|
161
|
-
ref.update_last_known_file_type
|
162
|
-
|
163
|
-
parent_group = find_subpath(sub_group_path, true)
|
164
|
-
parent_group.children << ref
|
165
|
-
set_file_refenrece_name_if_needed(ref, parent_group)
|
166
|
-
ref
|
181
|
+
def new_reference(path, source_tree = :group)
|
182
|
+
FileReferencesFactory.new_reference(self, path, source_tree)
|
167
183
|
end
|
184
|
+
alias :new_file :new_reference
|
168
185
|
|
169
|
-
#
|
170
|
-
#
|
171
|
-
# @param [PBXFileReference, XCVersionGroup] ref
|
172
|
-
# the reference which needs the name optionally set.
|
173
|
-
#
|
174
|
-
# @return [void]
|
175
|
-
#
|
176
|
-
def set_file_refenrece_name_if_needed(ref, parent_group)
|
177
|
-
same_path_of_group = (parent_group.path == Pathname(ref.path).dirname.to_s)
|
178
|
-
same_path_project = (Pathname(ref.path).dirname.to_s == '.' && parent_group.path.nil?)
|
179
|
-
unless same_path_of_group || same_path_project
|
180
|
-
ref.name = Pathname(ref.path).basename.to_s
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
|
-
# Creates a new file reference to a framework bundle.
|
185
|
-
#
|
186
|
-
# @note @see #new_file
|
186
|
+
# Creates a file reference to a static library and adds it to the
|
187
|
+
# group.
|
187
188
|
#
|
188
|
-
# @param
|
189
|
+
# @param [#to_s] product_name
|
190
|
+
# The name of the static library.
|
189
191
|
#
|
190
|
-
# @return [PBXFileReference]
|
192
|
+
# @return [PBXFileReference] The new file reference.
|
191
193
|
#
|
192
|
-
def
|
193
|
-
|
194
|
-
ref.include_in_index = nil
|
195
|
-
ref
|
194
|
+
def new_static_library(product_name)
|
195
|
+
FileReferencesFactory.new_static_library(self, product_name)
|
196
196
|
end
|
197
197
|
|
198
|
-
# Creates a
|
199
|
-
# xcdatamodel files included in the wrapper as chidren file references.
|
200
|
-
#
|
201
|
-
# @note To match Xcode behaviour the last xcdatamodel according to its
|
202
|
-
# path is set as the current version.
|
203
|
-
#
|
204
|
-
# @note @see #new_file
|
198
|
+
# Creates a file reference to a new bundle.
|
205
199
|
#
|
206
|
-
# @param
|
200
|
+
# @param [#to_s] product_name
|
201
|
+
# The name of the bundle.
|
207
202
|
#
|
208
|
-
# @return [
|
203
|
+
# @return [PBXFileReference] The new file reference.
|
209
204
|
#
|
210
|
-
def
|
211
|
-
|
212
|
-
ref = project.new(XCVersionGroup)
|
213
|
-
ref.path = path.to_s
|
214
|
-
ref.source_tree = '<group>'
|
215
|
-
ref.version_group_type = 'wrapper.xcdatamodel'
|
216
|
-
|
217
|
-
last_child_ref = nil
|
218
|
-
if path.exist?
|
219
|
-
path.children.each do |child_path|
|
220
|
-
if File.extname(child_path) == '.xcdatamodel'
|
221
|
-
child_ref = ref.new_file_reference(child_path)
|
222
|
-
child_ref.source_tree = '<group>'
|
223
|
-
last_child_ref = child_ref
|
224
|
-
end
|
225
|
-
end
|
226
|
-
ref.current_version = last_child_ref
|
227
|
-
end
|
228
|
-
|
229
|
-
parent_group = find_subpath(sub_group_path, true)
|
230
|
-
parent_group.children << ref
|
231
|
-
set_file_refenrece_name_if_needed(ref, parent_group)
|
232
|
-
ref
|
205
|
+
def new_bundle(product_name)
|
206
|
+
FileReferencesFactory.new_bundle(self, product_name)
|
233
207
|
end
|
234
208
|
|
235
|
-
# Creates a
|
236
|
-
# of the group.
|
209
|
+
# Creates a file reference to a new bundle and adds it to the group.
|
237
210
|
#
|
238
|
-
# @note @see
|
211
|
+
# @note @see new_reference
|
239
212
|
#
|
240
213
|
# @param [#to_s] name
|
241
214
|
# the name of the new group.
|
242
215
|
#
|
243
|
-
# @param [String] sub_group_path @see new_file
|
244
|
-
#
|
245
216
|
# @return [PBXGroup] the new group.
|
246
217
|
#
|
247
|
-
def new_group(name,
|
218
|
+
def new_group(name, path = nil, source_tree = :group)
|
248
219
|
group = project.new(PBXGroup)
|
220
|
+
children << group
|
249
221
|
group.name = name
|
250
|
-
|
251
|
-
|
252
|
-
|
222
|
+
if path
|
223
|
+
GroupableHelper.set_path_with_source_tree(group, path, source_tree)
|
224
|
+
else
|
225
|
+
group.source_tree = '<group>'
|
226
|
+
end
|
253
227
|
group
|
254
228
|
end
|
255
229
|
|
256
|
-
# Creates a file reference to a static library and adds it to the
|
257
|
-
# children of the group.
|
258
|
-
#
|
259
|
-
# @note @see new_file
|
260
|
-
#
|
261
|
-
# @param [#to_s] product_name
|
262
|
-
# the name of the new static library.
|
263
|
-
#
|
264
|
-
# @param [String] sub_group_path @see new_file
|
265
|
-
#
|
266
|
-
# @return [PBXFileReference] the new file reference.
|
267
|
-
#
|
268
|
-
def new_static_library(product_name, sub_group_path = nil)
|
269
|
-
file = new_file("lib#{product_name}.a", sub_group_path)
|
270
|
-
file.include_in_index = '0'
|
271
|
-
file.source_tree = 'BUILT_PRODUCTS_DIR'
|
272
|
-
file.explicit_file_type = file.last_known_file_type
|
273
|
-
file.last_known_file_type = nil
|
274
|
-
file
|
275
|
-
end
|
276
|
-
|
277
|
-
# Creates a file reference to a new bundle.
|
278
|
-
#
|
279
|
-
# @param [#to_s] product_name
|
280
|
-
# the name of the bundle.
|
281
|
-
#
|
282
|
-
# @return [PBXFileReference] the new file reference.
|
283
|
-
#
|
284
|
-
def new_bundle(product_name)
|
285
|
-
file = new_file("#{product_name}.bundle")
|
286
|
-
file.explicit_file_type = 'wrapper.cfbundle'
|
287
|
-
file.include_in_index = '0'
|
288
|
-
file.source_tree = 'BUILT_PRODUCTS_DIR'
|
289
|
-
file.last_known_file_type = nil
|
290
|
-
file
|
291
|
-
end
|
292
|
-
|
293
|
-
# Creates a new group to represent a `xcdatamodel` file.
|
294
|
-
#
|
295
|
-
# @return [XCVersionGroup] The new group.
|
296
|
-
#
|
297
|
-
def new_xcdatamodel_group(xcdatamodel_path)
|
298
|
-
g = @project.new(XCVersionGroup)
|
299
|
-
g.path = xcdatamodel_path
|
300
|
-
g.version_group_type = 'wrapper.xcdatamodel'
|
301
|
-
file = g.new_file(xcdatamodel_path.sub(/xcdatamodeld$/, 'xcdatamodel'))
|
302
|
-
g.current_version = file
|
303
|
-
g
|
304
|
-
end
|
305
|
-
|
306
230
|
# Traverses the children groups and finds the group with the given
|
307
231
|
# path, if exists.
|
308
232
|
#
|
@@ -314,12 +238,10 @@ module Xcodeproj
|
|
314
238
|
|
315
239
|
# Removes children files and groups under this group.
|
316
240
|
#
|
241
|
+
# @TODO: remove from project should suffice.
|
242
|
+
#
|
317
243
|
def remove_children_recursively
|
318
|
-
|
319
|
-
g.remove_children_recursively
|
320
|
-
g.remove_from_project
|
321
|
-
end
|
322
|
-
files.each { |f| f.remove_from_project }
|
244
|
+
children.objects.each(&:remove_from_project)
|
323
245
|
end
|
324
246
|
|
325
247
|
# Traverses the children groups and finds the children with the given
|
@@ -379,7 +301,7 @@ module Xcodeproj
|
|
379
301
|
#
|
380
302
|
# @return [void]
|
381
303
|
#
|
382
|
-
def sort_by_type
|
304
|
+
def sort_by_type
|
383
305
|
children.sort! do |x, y|
|
384
306
|
if x.is_a?(PBXGroup) && y.is_a?(PBXFileReference)
|
385
307
|
-1
|
@@ -390,6 +312,15 @@ module Xcodeproj
|
|
390
312
|
end
|
391
313
|
end
|
392
314
|
end
|
315
|
+
|
316
|
+
# Sorts the group by type recursively.
|
317
|
+
#
|
318
|
+
# @return [void]
|
319
|
+
#
|
320
|
+
def recursively_sort_by_type
|
321
|
+
groups.each { |group| group.recursively_sort_by_type }
|
322
|
+
sort_by_type
|
323
|
+
end
|
393
324
|
end
|
394
325
|
|
395
326
|
#-----------------------------------------------------------------------#
|
@@ -403,6 +334,7 @@ module Xcodeproj
|
|
403
334
|
# @return [String] the file type guessed by Xcode.
|
404
335
|
#
|
405
336
|
attribute :last_known_file_type, String
|
337
|
+
|
406
338
|
end
|
407
339
|
|
408
340
|
#-----------------------------------------------------------------------#
|