xcodeproj 0.19.2 → 0.19.3
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/README.md +0 -4
- data/ext/xcodeproj/xcodeproj_ext.bundle +0 -0
- data/lib/xcodeproj.rb +2 -9
- data/lib/xcodeproj/config.rb +8 -3
- data/lib/xcodeproj/config/other_linker_flags_parser.rb +3 -0
- data/lib/xcodeproj/ext.rb +12 -1
- data/lib/xcodeproj/gem_version.rb +1 -1
- data/lib/xcodeproj/plist_helper.rb +385 -77
- data/lib/xcodeproj/project.rb +3 -3
- data/lib/xcodeproj/project/object/helpers/file_references_factory.rb +1 -1
- metadata +3 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b11e16ee772fb9a6ff3bbd07499cb06885df731b
|
4
|
+
data.tar.gz: c735f33b3e62c3401d7ef35dd916dcae3275a540
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ba65247e5b10b9cd78af4a7f455b267aae9baef88d71aec7eccc502f56be2cb4b2ae26dc4acdb643acd2bab68d2791b8fb54617fe85f2ee7cda483077b1fe311
|
7
|
+
data.tar.gz: 9473e5e8c751dab5aedf06638c111394e6fe71ec2e855199637e31aee1b57b61986126eae88eb0c972e7f7bce15568156d842a513c9ef9f33f402e21f5c53966
|
data/README.md
CHANGED
@@ -20,10 +20,6 @@ by performing the following command:
|
|
20
20
|
|
21
21
|
$ [sudo] gem install xcodeproj
|
22
22
|
|
23
|
-
To improve the performance of Xcodeproj it is possible to install [LibXML Ruby](http://xml4r.github.io/libxml-ruby/):
|
24
|
-
|
25
|
-
$ [sudo] gem install libxml-ruby
|
26
|
-
|
27
23
|
To make Xcodeproj output projects in the same format of Xcode (deprecated ASCII Plists format) in order to reduce the SCM noise it is possible to install [xcproj](https://github.com/0xced/xcproj):
|
28
24
|
|
29
25
|
$ brew install xcproj
|
Binary file
|
data/lib/xcodeproj.rb
CHANGED
@@ -20,13 +20,6 @@ module Xcodeproj
|
|
20
20
|
autoload :Workspace, 'xcodeproj/workspace'
|
21
21
|
autoload :XCScheme, 'xcodeproj/scheme'
|
22
22
|
autoload :XcodebuildHelper, 'xcodeproj/xcodebuild_helper'
|
23
|
-
|
24
|
-
# TODO: Delete me (compatibility with CocoaPods 0.33.1)
|
25
|
-
def self.read_plist(path)
|
26
|
-
PlistHelper.read(path)
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.write_plist(hash, path)
|
30
|
-
PlistHelper.write(hash, path)
|
31
|
-
end
|
32
23
|
end
|
24
|
+
|
25
|
+
require 'xcodeproj/ext'
|
data/lib/xcodeproj/config.rb
CHANGED
@@ -31,7 +31,7 @@ module Xcodeproj
|
|
31
31
|
@attributes = {}
|
32
32
|
@includes = []
|
33
33
|
@other_linker_flags = {}
|
34
|
-
[:simple, :frameworks, :weak_frameworks, :libraries].each do |key|
|
34
|
+
[:simple, :frameworks, :weak_frameworks, :libraries, :force_load].each do |key|
|
35
35
|
@other_linker_flags[key] = Set.new
|
36
36
|
end
|
37
37
|
merge!(extract_hash(xcconfig_hash_or_file))
|
@@ -94,11 +94,16 @@ module Xcodeproj
|
|
94
94
|
:frameworks => '-framework ',
|
95
95
|
:weak_frameworks => '-weak_framework ',
|
96
96
|
:libraries => '-l',
|
97
|
+
:force_load => '-force_load',
|
97
98
|
}
|
98
|
-
[:libraries, :frameworks, :weak_frameworks].each do |key|
|
99
|
+
[:libraries, :frameworks, :weak_frameworks, :force_load].each do |key|
|
99
100
|
modifier = modifiers[key]
|
100
101
|
sorted = other_linker_flags[key].to_a.sort
|
101
|
-
|
102
|
+
if key == :force_load
|
103
|
+
list += sorted.map { |l| %(#{modifier} #{l}) }
|
104
|
+
else
|
105
|
+
list += sorted.map { |l| %(#{modifier}"#{l}") }
|
106
|
+
end
|
102
107
|
end
|
103
108
|
|
104
109
|
result = attributes.dup
|
@@ -17,6 +17,7 @@ module Xcodeproj
|
|
17
17
|
:weak_frameworks => [],
|
18
18
|
:libraries => [],
|
19
19
|
:simple => [],
|
20
|
+
:force_load => [],
|
20
21
|
}
|
21
22
|
|
22
23
|
key = nil
|
@@ -28,6 +29,8 @@ module Xcodeproj
|
|
28
29
|
key = :weak_frameworks
|
29
30
|
when '-l'
|
30
31
|
key = :libraries
|
32
|
+
when '-force_load'
|
33
|
+
key = :force_load
|
31
34
|
else
|
32
35
|
if key
|
33
36
|
result[key] << token
|
data/lib/xcodeproj/ext.rb
CHANGED
@@ -1 +1,12 @@
|
|
1
|
-
|
1
|
+
begin
|
2
|
+
require 'xcodeproj/plist_helper'
|
3
|
+
rescue LoadError
|
4
|
+
require 'rbconfig'
|
5
|
+
if RUBY_VERSION == '1.8.7' && RbConfig::CONFIG['prefix'] =~ %r{^/System/Library/Frameworks/Ruby.framework/}
|
6
|
+
$:.unshift(File.expand_path('../../../ext', __FILE__))
|
7
|
+
require 'xcodeproj/xcodeproj_ext'
|
8
|
+
else
|
9
|
+
raise 'The xcodeproj gem is only supported on Ruby versions that include' \
|
10
|
+
'the Fiddle API or with Ruby 1.8.7 that came with OS X 10.8.x.'
|
11
|
+
end
|
12
|
+
end
|
@@ -1,15 +1,19 @@
|
|
1
|
-
require '
|
2
|
-
require 'open3'
|
1
|
+
require 'fiddle'
|
3
2
|
|
4
3
|
module Xcodeproj
|
4
|
+
# TODO: Delete me (compatibility with Ruby 1.8.7 C ext bundle)
|
5
|
+
def self.read_plist(path)
|
6
|
+
PlistHelper.read(path)
|
7
|
+
end
|
8
|
+
|
9
|
+
# TODO: Delete me (compatibility with Ruby 1.8.7 C ext bundle)
|
10
|
+
def self.write_plist(hash, path)
|
11
|
+
PlistHelper.write(hash, path)
|
12
|
+
end
|
13
|
+
|
5
14
|
# Provides support for loading and serializing property list files.
|
6
15
|
#
|
7
|
-
# @note CFPropertyList will automatically pick up the `libxml` strategy or
|
8
|
-
# other faster strategies, if their dependencies are available.
|
9
|
-
#
|
10
16
|
module PlistHelper
|
11
|
-
PLUTIL_BIN = '/usr/bin/plutil'
|
12
|
-
|
13
17
|
class << self
|
14
18
|
# Serializes a hash as an XML property list file.
|
15
19
|
#
|
@@ -24,100 +28,404 @@ module Xcodeproj
|
|
24
28
|
if hash.respond_to?(:to_hash)
|
25
29
|
hash = hash.to_hash
|
26
30
|
else
|
27
|
-
raise TypeError, "The given `#{hash}
|
28
|
-
|
31
|
+
raise TypeError, "The given `#{hash.inspect}` must be a hash or " \
|
32
|
+
"respond to #to_hash'."
|
29
33
|
end
|
30
34
|
end
|
31
35
|
|
32
36
|
unless path.is_a?(String) || path.is_a?(Pathname)
|
33
|
-
raise TypeError, "The given `#{path}
|
34
|
-
'pathname'
|
35
|
-
end
|
36
|
-
plist = CFPropertyList::List.new
|
37
|
-
options = { :convert_unknown_to_string => true }
|
38
|
-
plist.value = CFPropertyList.guess(hash, options)
|
39
|
-
|
40
|
-
if plutil_available?
|
41
|
-
contents = plist.to_str(CFPropertyList::List::FORMAT_XML)
|
42
|
-
plutil_save(contents, path)
|
43
|
-
else
|
44
|
-
plist.save(path, CFPropertyList::List::FORMAT_XML)
|
37
|
+
raise TypeError, "The given `#{path}` must be a string or 'pathname'."
|
45
38
|
end
|
39
|
+
path = path.to_s
|
40
|
+
|
41
|
+
CoreFoundation.RubyHashPropertyListWrite(hash, path)
|
46
42
|
end
|
47
43
|
|
48
|
-
# @return [
|
44
|
+
# @return [Hash] Returns the native objects loaded from a property list
|
49
45
|
# file.
|
50
46
|
#
|
51
47
|
# @param [#to_s] path
|
52
48
|
# The path of the file.
|
53
49
|
#
|
54
50
|
def read(path)
|
51
|
+
path = path.to_s
|
55
52
|
unless File.exist?(path)
|
56
|
-
raise ArgumentError, "The file `#{path}` doesn't
|
53
|
+
raise ArgumentError, "The plist file at path `#{path}` doesn't exist."
|
57
54
|
end
|
58
|
-
|
59
|
-
plist = CFPropertyList::List.new
|
60
|
-
plist.load_xml_str(xml)
|
61
|
-
CFPropertyList.native_types(plist.value)
|
55
|
+
CoreFoundation.RubyHashPropertyListRead(path)
|
62
56
|
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
63
60
|
|
64
|
-
|
61
|
+
# This module provides an interface to the CoreFoundation OS X framework.
|
62
|
+
# Specifically it bridges the functions required to be able to read and write
|
63
|
+
# property lists.
|
64
|
+
#
|
65
|
+
# Everything in here should be considered an implementation detail and thus is
|
66
|
+
# not further documented.
|
67
|
+
#
|
68
|
+
# @todo Move this out into its own gem.
|
69
|
+
#
|
70
|
+
module CoreFoundation
|
71
|
+
PATH = '/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation'
|
65
72
|
|
66
|
-
|
67
|
-
|
73
|
+
# rubocop:disable Style/MethodName
|
74
|
+
# rubocop:disable Style/VariableName
|
68
75
|
|
69
|
-
|
70
|
-
|
71
|
-
# available.
|
72
|
-
#
|
73
|
-
# @param [#to_s] path
|
74
|
-
# The path of the file.
|
75
|
-
#
|
76
|
-
def plist_xml_contents(path)
|
77
|
-
contents = File.read(path)
|
78
|
-
if contents.include?('?xml')
|
79
|
-
contents
|
80
|
-
elsif plutil_available?
|
81
|
-
plutil_contents(path)
|
82
|
-
else
|
83
|
-
raise "Unable to convert the `#{path}` plist file to XML"
|
84
|
-
end
|
85
|
-
end
|
76
|
+
# @!group Ruby hash as property list (de)serialization
|
77
|
+
#---------------------------------------------------------------------------#
|
86
78
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
`#{PLUTIL_BIN} -convert xml1 "#{path}" -o -`
|
97
|
-
end
|
79
|
+
def self.RubyHashPropertyListWrite(hash, path)
|
80
|
+
url = CFURLCreateFromFileSystemRepresentation(NULL,
|
81
|
+
path,
|
82
|
+
path.bytesize,
|
83
|
+
FALSE)
|
84
|
+
stream = CFWriteStreamCreateWithFile(NULL, url)
|
85
|
+
unless CFWriteStreamOpen(stream) == TRUE
|
86
|
+
raise IOError, 'Unable to open stream.'
|
87
|
+
end
|
98
88
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
89
|
+
plist = RubyHashToCFDictionary(hash)
|
90
|
+
|
91
|
+
error_ptr = CFTypeRefPointer()
|
92
|
+
result = CFPropertyListWrite(plist,
|
93
|
+
stream,
|
94
|
+
KCFPropertyListXMLFormat_v1_0,
|
95
|
+
0,
|
96
|
+
error_ptr)
|
97
|
+
CFWriteStreamClose(stream)
|
98
|
+
|
99
|
+
if result == 0
|
100
|
+
description = CFCopyDescription(error_ptr.ptr)
|
101
|
+
raise IOError, "Unable to write plist data: #{description}"
|
102
|
+
end
|
103
|
+
result
|
104
|
+
end
|
105
|
+
|
106
|
+
def self.RubyHashPropertyListRead(path)
|
107
|
+
url = CFURLCreateFromFileSystemRepresentation(NULL,
|
108
|
+
path,
|
109
|
+
path.bytesize,
|
110
|
+
FALSE)
|
111
|
+
stream = CFReadStreamCreateWithFile(NULL, url)
|
112
|
+
unless CFReadStreamOpen(stream) == TRUE
|
113
|
+
raise IOError, 'Unable to open stream.'
|
114
|
+
end
|
115
|
+
|
116
|
+
error_ptr = CFTypeRefPointer()
|
117
|
+
plist = CFPropertyListCreateWithStream(NULL,
|
118
|
+
stream,
|
119
|
+
0,
|
120
|
+
KCFPropertyListImmutable,
|
121
|
+
NULL,
|
122
|
+
error_ptr)
|
123
|
+
CFReadStreamClose(stream)
|
124
|
+
|
125
|
+
if plist.null?
|
126
|
+
description = CFCopyDescription(error_ptr.ptr)
|
127
|
+
raise IOError, "Unable to read plist data: #{description}"
|
128
|
+
elsif CFGetTypeID(plist) != CFDictionaryGetTypeID()
|
129
|
+
raise TypeError, 'Expected a plist with a dictionary root object.'
|
130
|
+
end
|
131
|
+
|
132
|
+
CFDictionaryToRubyHash(plist)
|
133
|
+
end
|
134
|
+
|
135
|
+
# @!group Types
|
136
|
+
#---------------------------------------------------------------------------#
|
137
|
+
|
138
|
+
# rubocop:disable Style/ConstantName
|
139
|
+
|
140
|
+
NULL = Fiddle::NULL
|
141
|
+
|
142
|
+
Void = Fiddle::TYPE_VOID
|
143
|
+
VoidPointer = Fiddle::TYPE_VOIDP
|
144
|
+
FunctionPointer = VoidPointer
|
145
|
+
|
146
|
+
UInt32 = -Fiddle::TYPE_INT
|
147
|
+
UInt8 = -Fiddle::TYPE_CHAR
|
148
|
+
|
149
|
+
SInt32Pointer = VoidPointer
|
150
|
+
UInt8Pointer = VoidPointer
|
151
|
+
CharPointer = VoidPointer
|
152
|
+
|
153
|
+
Boolean = Fiddle::TYPE_CHAR
|
154
|
+
TRUE = 1
|
155
|
+
FALSE = 0
|
156
|
+
|
157
|
+
CFTypeRef = VoidPointer
|
158
|
+
CFTypeRefPointer = VoidPointer
|
159
|
+
CFIndex = Fiddle::TYPE_LONG
|
160
|
+
CFTypeID = -Fiddle::TYPE_LONG
|
161
|
+
CFOptionFlags = UInt32
|
162
|
+
|
163
|
+
CFPropertyListMutabilityOptions = Fiddle::TYPE_INT
|
164
|
+
KCFPropertyListImmutable = 0
|
165
|
+
|
166
|
+
CFPropertyListFormat = Fiddle::TYPE_INT
|
167
|
+
KCFPropertyListXMLFormat_v1_0 = 100
|
168
|
+
CFPropertyListFormatPointer = VoidPointer
|
169
|
+
|
170
|
+
CFStringEncoding = UInt32
|
171
|
+
KCFStringEncodingUTF8 = 0x08000100
|
172
|
+
|
173
|
+
# rubocop:enable Style/ConstantName
|
174
|
+
|
175
|
+
private
|
176
|
+
|
177
|
+
# @!group Helpers
|
178
|
+
#---------------------------------------------------------------------------#
|
179
|
+
|
180
|
+
def self.image
|
181
|
+
@image ||= Fiddle.dlopen(PATH)
|
182
|
+
end
|
183
|
+
|
184
|
+
def self.free_function
|
185
|
+
@ruby_free ||= Fiddle::Function.new(Fiddle::RUBY_FREE, [VoidPointer], Void)
|
186
|
+
end
|
187
|
+
|
188
|
+
def self.CFRelease_function
|
189
|
+
@CFRelease ||= Fiddle::Function.new(image['CFRelease'], [CFTypeRef], Void)
|
190
|
+
end
|
191
|
+
|
192
|
+
def self.extern(symbol, parameter_types, return_type)
|
193
|
+
symbol = symbol.to_s
|
194
|
+
create_function = symbol.include?('Create')
|
195
|
+
function_cache_key = "@__#{symbol}__"
|
196
|
+
|
197
|
+
# Define a singleton method on the CoreFoundation module.
|
198
|
+
define_singleton_method(symbol) do |*args|
|
199
|
+
unless args.size == parameter_types.size
|
200
|
+
raise ArgumentError, "wrong number of arguments (#{args.size} for " \
|
201
|
+
"#{parameter_types.size})"
|
113
202
|
end
|
114
203
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
204
|
+
unless function = instance_variable_get(function_cache_key)
|
205
|
+
function = Fiddle::Function.new(image[symbol],
|
206
|
+
parameter_types,
|
207
|
+
return_type)
|
208
|
+
instance_variable_set(function_cache_key, function)
|
120
209
|
end
|
210
|
+
|
211
|
+
result = function.call(*args)
|
212
|
+
create_function ? CFAutoRelease(result) : result
|
121
213
|
end
|
122
214
|
end
|
215
|
+
|
216
|
+
public
|
217
|
+
|
218
|
+
# @!group CoreFoundation function definitions
|
219
|
+
#---------------------------------------------------------------------------#
|
220
|
+
|
221
|
+
# CFTypeRef description
|
222
|
+
extern :CFShow, [CFTypeRef], Void
|
223
|
+
extern :CFCopyDescription, [CFTypeRef], CFTypeRef
|
224
|
+
|
225
|
+
# CFType reflection
|
226
|
+
extern :CFGetTypeID, [CFTypeRef], CFTypeID
|
227
|
+
extern :CFDictionaryGetTypeID, [], CFTypeID
|
228
|
+
extern :CFStringGetTypeID, [], CFTypeID
|
229
|
+
extern :CFArrayGetTypeID, [], CFTypeID
|
230
|
+
extern :CFBooleanGetTypeID, [], CFTypeID
|
231
|
+
|
232
|
+
# CFStream
|
233
|
+
extern :CFWriteStreamCreateWithFile, [CFTypeRef, CFTypeRef], CFTypeRef
|
234
|
+
extern :CFWriteStreamOpen, [CFTypeRef], Boolean
|
235
|
+
extern :CFWriteStreamClose, [CFTypeRef], Void
|
236
|
+
extern :CFReadStreamCreateWithFile, [CFTypeRef, CFTypeRef], CFTypeRef
|
237
|
+
extern :CFReadStreamOpen, [CFTypeRef], Boolean
|
238
|
+
extern :CFReadStreamClose, [CFTypeRef], Void
|
239
|
+
|
240
|
+
# CFURL
|
241
|
+
extern :CFURLCreateFromFileSystemRepresentation, [CFTypeRef, UInt8Pointer, CFIndex, Boolean], CFTypeRef
|
242
|
+
|
243
|
+
# CFPropertyList
|
244
|
+
extern :CFPropertyListWrite, [CFTypeRef, CFTypeRef, CFPropertyListFormat, CFOptionFlags, CFTypeRefPointer], CFIndex
|
245
|
+
extern :CFPropertyListCreateWithStream, [CFTypeRef, CFTypeRef, CFIndex, CFOptionFlags, CFPropertyListFormatPointer, CFTypeRefPointer], CFTypeRef
|
246
|
+
|
247
|
+
# CFString
|
248
|
+
extern :CFStringCreateExternalRepresentation, [CFTypeRef, CFTypeRef, CFStringEncoding, UInt8], CFTypeRef
|
249
|
+
extern :CFStringCreateWithCString, [CFTypeRef, CharPointer, CFStringEncoding], CFTypeRef
|
250
|
+
|
251
|
+
# CFData
|
252
|
+
extern :CFDataGetLength, [CFTypeRef], CFIndex
|
253
|
+
extern :CFDataGetBytePtr, [CFTypeRef], VoidPointer
|
254
|
+
|
255
|
+
# CFDictionary
|
256
|
+
extern :CFDictionaryCreateMutable, [CFTypeRef, CFIndex, VoidPointer, VoidPointer], CFTypeRef
|
257
|
+
extern :CFDictionaryAddValue, [CFTypeRef, CFTypeRef, CFTypeRef], VoidPointer
|
258
|
+
extern :CFDictionaryApplyFunction, [CFTypeRef, FunctionPointer, VoidPointer], Void
|
259
|
+
|
260
|
+
# CFArray
|
261
|
+
extern :CFArrayCreateMutable, [CFTypeRef, CFIndex, VoidPointer], CFTypeRef
|
262
|
+
extern :CFArrayAppendValue, [CFTypeRef, CFTypeRef], VoidPointer
|
263
|
+
extern :CFArrayGetCount, [CFTypeRef], CFIndex
|
264
|
+
extern :CFArrayGetValueAtIndex, [CFTypeRef, CFIndex], CFTypeRef
|
265
|
+
|
266
|
+
# CFBoolean
|
267
|
+
extern :CFBooleanGetValue, [CFTypeRef], Boolean
|
268
|
+
|
269
|
+
# @!group Custom convenience functions
|
270
|
+
#---------------------------------------------------------------------------#
|
271
|
+
|
272
|
+
def self.CFBooleanTrue
|
273
|
+
@CFBooleanTrue ||= Fiddle::Pointer.new(image['kCFBooleanTrue']).ptr
|
274
|
+
end
|
275
|
+
|
276
|
+
def self.CFBooleanFalse
|
277
|
+
@CFBooleanFalse ||= Fiddle::Pointer.new(image['kCFBooleanFalse']).ptr
|
278
|
+
end
|
279
|
+
|
280
|
+
def self.CFTypeArrayCallBacks
|
281
|
+
@CFTypeArrayCallBacks ||= image['kCFTypeArrayCallBacks']
|
282
|
+
end
|
283
|
+
|
284
|
+
def self.CFTypeDictionaryKeyCallBacks
|
285
|
+
@CFTypeDictionaryKeyCallBacks ||= image['kCFTypeDictionaryKeyCallBacks']
|
286
|
+
end
|
287
|
+
|
288
|
+
def self.CFTypeDictionaryValueCallBacks
|
289
|
+
@CFTypeDictionaryValueCallBacks ||= image['kCFTypeDictionaryValueCallBacks']
|
290
|
+
end
|
291
|
+
|
292
|
+
# This pointer will assign `CFRelease` as the free function when
|
293
|
+
# dereferencing the pointer.
|
294
|
+
#
|
295
|
+
def self.CFTypeRefPointer
|
296
|
+
pointer = Fiddle::Pointer.malloc(Fiddle::SIZEOF_INTPTR_T, free_function)
|
297
|
+
def pointer.ptr
|
298
|
+
CFAutoRelease(super)
|
299
|
+
end
|
300
|
+
pointer
|
301
|
+
end
|
302
|
+
|
303
|
+
def self.CFAutoRelease(cf_type_reference)
|
304
|
+
cf_type_reference.free = CFRelease_function() unless cf_type_reference.null?
|
305
|
+
cf_type_reference
|
306
|
+
end
|
307
|
+
|
308
|
+
def self.CFDictionaryApplyBlock(dictionary, &applier)
|
309
|
+
param_types = [CFTypeRef, CFTypeRef, VoidPointer]
|
310
|
+
closure = Fiddle::Closure::BlockCaller.new(Void, param_types, &applier)
|
311
|
+
closure_function = Fiddle::Function.new(closure, param_types, Void)
|
312
|
+
CFDictionaryApplyFunction(dictionary, closure_function, NULL)
|
313
|
+
end
|
314
|
+
|
315
|
+
def self.CFArrayApplyBlock(array)
|
316
|
+
CFArrayGetCount(array).times do |index|
|
317
|
+
yield CFArrayGetValueAtIndex(array, index)
|
318
|
+
end
|
319
|
+
end
|
320
|
+
|
321
|
+
# @!group CFTypeRef to Ruby value conversion
|
322
|
+
#---------------------------------------------------------------------------#
|
323
|
+
|
324
|
+
def self.CFTypeRefToRubyValue(cf_type_reference)
|
325
|
+
case CFGetTypeID(cf_type_reference)
|
326
|
+
when CFStringGetTypeID()
|
327
|
+
CFStringToRubyString(cf_type_reference)
|
328
|
+
when CFDictionaryGetTypeID()
|
329
|
+
CFDictionaryToRubyHash(cf_type_reference)
|
330
|
+
when CFArrayGetTypeID()
|
331
|
+
CFArrayToRubyArray(cf_type_reference)
|
332
|
+
when CFBooleanGetTypeID()
|
333
|
+
CFBooleanToRubyBoolean(cf_type_reference)
|
334
|
+
else
|
335
|
+
description = CFStringToRubyString(CFCopyDescription(cf_type_reference))
|
336
|
+
raise TypeError, "Unknown type: #{description}"
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
340
|
+
def self.CFStringToRubyString(string)
|
341
|
+
data = CFStringCreateExternalRepresentation(NULL,
|
342
|
+
string,
|
343
|
+
KCFStringEncodingUTF8,
|
344
|
+
0)
|
345
|
+
if data.null?
|
346
|
+
raise TypeError, 'Unable to convert CFStringRef.'
|
347
|
+
end
|
348
|
+
bytes_ptr = CFDataGetBytePtr(data)
|
349
|
+
result = bytes_ptr.to_str(CFDataGetLength(data))
|
350
|
+
result.force_encoding(Encoding::UTF_8)
|
351
|
+
result
|
352
|
+
end
|
353
|
+
|
354
|
+
def self.CFDictionaryToRubyHash(dictionary)
|
355
|
+
result = {}
|
356
|
+
CFDictionaryApplyBlock(dictionary) do |key, value|
|
357
|
+
result[CFStringToRubyString(key)] = CFTypeRefToRubyValue(value)
|
358
|
+
end
|
359
|
+
result
|
360
|
+
end
|
361
|
+
|
362
|
+
def self.CFArrayToRubyArray(array)
|
363
|
+
result = []
|
364
|
+
CFArrayApplyBlock(array) do |element|
|
365
|
+
result << CFTypeRefToRubyValue(element)
|
366
|
+
end
|
367
|
+
result
|
368
|
+
end
|
369
|
+
|
370
|
+
def self.CFBooleanToRubyBoolean(boolean)
|
371
|
+
CFBooleanGetValue(boolean) == TRUE
|
372
|
+
end
|
373
|
+
|
374
|
+
# @!group Ruby value to CFTypeRef conversion
|
375
|
+
#---------------------------------------------------------------------------#
|
376
|
+
|
377
|
+
def self.RubyValueToCFTypeRef(value)
|
378
|
+
result = case value
|
379
|
+
when String
|
380
|
+
RubyStringToCFString(value)
|
381
|
+
when Hash
|
382
|
+
RubyHashToCFDictionary(value)
|
383
|
+
when Array
|
384
|
+
RubyArrayToCFArray(value)
|
385
|
+
when true, false
|
386
|
+
RubyBooleanToCFBoolean(value)
|
387
|
+
else
|
388
|
+
RubyStringToCFString(value.to_s)
|
389
|
+
end
|
390
|
+
if result.null?
|
391
|
+
raise TypeError, "Unable to convert Ruby value `#{value.inspect}' " \
|
392
|
+
'into a CFTypeRef.'
|
393
|
+
end
|
394
|
+
result
|
395
|
+
end
|
396
|
+
|
397
|
+
def self.RubyStringToCFString(string)
|
398
|
+
CFStringCreateWithCString(NULL,
|
399
|
+
Fiddle::Pointer[string],
|
400
|
+
KCFStringEncodingUTF8)
|
401
|
+
end
|
402
|
+
|
403
|
+
def self.RubyHashToCFDictionary(hash)
|
404
|
+
result = CFDictionaryCreateMutable(NULL,
|
405
|
+
0,
|
406
|
+
CFTypeDictionaryKeyCallBacks(),
|
407
|
+
CFTypeDictionaryValueCallBacks())
|
408
|
+
hash.each do |key, value|
|
409
|
+
key = RubyStringToCFString(key.to_s)
|
410
|
+
value = RubyValueToCFTypeRef(value)
|
411
|
+
CFDictionaryAddValue(result, key, value)
|
412
|
+
end
|
413
|
+
result
|
414
|
+
end
|
415
|
+
|
416
|
+
def self.RubyArrayToCFArray(array)
|
417
|
+
result = CFArrayCreateMutable(NULL, 0, CFTypeArrayCallBacks())
|
418
|
+
array.each do |element|
|
419
|
+
element = RubyValueToCFTypeRef(element)
|
420
|
+
CFArrayAppendValue(result, element)
|
421
|
+
end
|
422
|
+
result
|
423
|
+
end
|
424
|
+
|
425
|
+
def self.RubyBooleanToCFBoolean(value)
|
426
|
+
value ? CFBooleanTrue() : CFBooleanFalse()
|
427
|
+
end
|
428
|
+
|
429
|
+
# rubocop:enable Style/MethodName
|
430
|
+
# rubocop:enable Style/VariableName
|
123
431
|
end
|
data/lib/xcodeproj/project.rb
CHANGED
@@ -172,7 +172,7 @@ module Xcodeproj
|
|
172
172
|
#
|
173
173
|
def initialize_from_file
|
174
174
|
pbxproj_path = path + 'project.pbxproj'
|
175
|
-
plist = Xcodeproj
|
175
|
+
plist = Xcodeproj.read_plist(pbxproj_path.to_s)
|
176
176
|
root_object_uuid = plist['rootObject']
|
177
177
|
root_object.remove_referrer(self) if root_object
|
178
178
|
@root_object = new_from_plist(root_object_uuid, plist['objects'], self)
|
@@ -302,7 +302,7 @@ module Xcodeproj
|
|
302
302
|
save_path ||= path
|
303
303
|
FileUtils.mkdir_p(save_path)
|
304
304
|
file = File.join(save_path, 'project.pbxproj')
|
305
|
-
Xcodeproj
|
305
|
+
Xcodeproj.write_plist(to_hash, file)
|
306
306
|
fix_encoding(file)
|
307
307
|
XCProjHelper.touch(save_path) unless disable_xcproj?
|
308
308
|
end
|
@@ -701,7 +701,7 @@ module Xcodeproj
|
|
701
701
|
end
|
702
702
|
|
703
703
|
xcschememanagement_path = schemes_dir + 'xcschememanagement.plist'
|
704
|
-
Xcodeproj
|
704
|
+
Xcodeproj.write_plist(xcschememanagement, xcschememanagement_path)
|
705
705
|
end
|
706
706
|
|
707
707
|
#-------------------------------------------------------------------------#
|
@@ -139,7 +139,7 @@ module Xcodeproj
|
|
139
139
|
new_file_reference(ref, child_path, :group)
|
140
140
|
elsif File.basename(child_path) == '.xccurrentversion'
|
141
141
|
full_path = path + File.basename(child_path)
|
142
|
-
xccurrentversion = Xcodeproj
|
142
|
+
xccurrentversion = Xcodeproj.read_plist(full_path)
|
143
143
|
current_version_name = xccurrentversion['_XCCurrentVersionName']
|
144
144
|
end
|
145
145
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xcodeproj
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.19.
|
4
|
+
version: 0.19.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eloy Duran
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-10-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -38,20 +38,6 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.2'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: CFPropertyList
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '2.2'
|
48
|
-
type: :runtime
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '2.2'
|
55
41
|
description: Xcodeproj lets you create and modify Xcode projects from Ruby. Script
|
56
42
|
boring management tasks or build Xcode-friendly libraries. Also includes support
|
57
43
|
for Xcode workspaces (.xcworkspace) and configuration files (.xcconfig).
|
@@ -63,6 +49,7 @@ extra_rdoc_files: []
|
|
63
49
|
files:
|
64
50
|
- README.md
|
65
51
|
- LICENSE
|
52
|
+
- ext/xcodeproj/xcodeproj_ext.bundle
|
66
53
|
- lib/xcodeproj/command/project_diff.rb
|
67
54
|
- lib/xcodeproj/command/show.rb
|
68
55
|
- lib/xcodeproj/command/sort.rb
|