xcodeproj 0.19.2 → 0.19.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|