xcoder 0.1.8 → 0.1.9
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +9 -0
- data/lib/xcode/configuration.rb +35 -6
- data/lib/xcode/configurations/array_property.rb +2 -2
- data/lib/xcode/configurations/boolean_property.rb +10 -2
- data/lib/xcode/configurations/key_value_array_property.rb +2 -2
- data/lib/xcode/configurations/space_delimited_string_property.rb +17 -3
- data/lib/xcode/configurations/string_property.rb +2 -2
- data/lib/xcode/file_reference.rb +2 -3
- data/lib/xcode/group.rb +6 -2
- data/lib/xcode/keychain.rb +11 -0
- data/lib/xcode/parsers/plutil_project_parser.rb +19 -1
- data/lib/xcode/project.rb +3 -4
- data/lib/xcode/registry.rb +1 -1
- data/lib/xcode/version.rb +1 -1
- data/spec/configuration_spec.rb +9 -2
- data/spec/keychain_spec.rb +8 -0
- metadata +12 -12
data/README.md
CHANGED
@@ -6,6 +6,10 @@ Xcoder is a ruby wrapper around various Xcode tools as well as providing project
|
|
6
6
|
|
7
7
|
Full documentation can be found here: http://rayh.github.com/xcoder/
|
8
8
|
|
9
|
+
## Requirements
|
10
|
+
|
11
|
+
Xcoder assumes you are using XCode 4.3 on Lion and ruby 1.9. You may have some degree of success with lesser versions, but they are not intentionally supported.
|
12
|
+
|
9
13
|
## Example Usage
|
10
14
|
|
11
15
|
You will need to install the gem:
|
@@ -47,6 +51,11 @@ You can either use the user's login keychain, another named keychain, or simply
|
|
47
51
|
# import certs into the keychain
|
48
52
|
# perform builds within this keychain's context
|
49
53
|
end # Keychain is deleted
|
54
|
+
|
55
|
+
Or, you can create a temporary keychain that will be deleted when the process exits:
|
56
|
+
|
57
|
+
keychain = Xcode::Keychain.temp
|
58
|
+
|
50
59
|
|
51
60
|
#### Importing a certificate
|
52
61
|
|
data/lib/xcode/configuration.rb
CHANGED
@@ -285,7 +285,9 @@ module Xcode
|
|
285
285
|
# @return [String,Array,Hash] the value stored for the specified configuration
|
286
286
|
#
|
287
287
|
def get(name)
|
288
|
-
if
|
288
|
+
if respond_to?(name)
|
289
|
+
send(name)
|
290
|
+
elsif Configuration.setting_name_to_property(name)
|
289
291
|
send Configuration.setting_name_to_property(name)
|
290
292
|
else
|
291
293
|
build_settings[name]
|
@@ -299,7 +301,9 @@ module Xcode
|
|
299
301
|
# @param [String,Array,Hash] value the value to store for the specific setting
|
300
302
|
#
|
301
303
|
def set(name, value)
|
302
|
-
if
|
304
|
+
if respond_to?(name)
|
305
|
+
send("#{name}=",value)
|
306
|
+
elsif Configuration.setting_name_to_property(name)
|
303
307
|
send("#{Configuration.setting_name_to_property(name)}=",value)
|
304
308
|
else
|
305
309
|
build_settings[name] = value
|
@@ -313,12 +317,37 @@ module Xcode
|
|
313
317
|
# @param [String,Array,Hash] value the value to store for the specific setting
|
314
318
|
#
|
315
319
|
def append(name, value)
|
316
|
-
|
320
|
+
|
321
|
+
if respond_to?(name)
|
322
|
+
send("append_to_#{name}",value)
|
323
|
+
elsif Configuration.setting_name_to_property(name)
|
317
324
|
send("append_to_#{Configuration.setting_name_to_property(name)}",value)
|
318
325
|
else
|
319
|
-
|
320
|
-
#
|
321
|
-
|
326
|
+
|
327
|
+
# @note this will likely raise some errors if trying to append a booleans
|
328
|
+
# to fixnums, strings to booleans, symbols + arrays, etc. but that likely
|
329
|
+
# means a new property should be defined so that the appending logic
|
330
|
+
# wil behave correctly.
|
331
|
+
|
332
|
+
if build_settings[name].is_a?(Array)
|
333
|
+
|
334
|
+
# Ensure that we are appending an array to the array; Array() does not
|
335
|
+
# work in this case in the event we were to pass in a Hash.
|
336
|
+
value = value.is_a?(Array) ? value : [ value ]
|
337
|
+
build_settings[name] = build_settings[name] + value.compact
|
338
|
+
|
339
|
+
else
|
340
|
+
|
341
|
+
# Ensure we handle the cases where a nil value is present that we append
|
342
|
+
# correctly to the value. We also need to try and leave intact boolean
|
343
|
+
# values which may be stored
|
344
|
+
|
345
|
+
value = "" unless value
|
346
|
+
build_settings[name] = "" unless build_settings[name]
|
347
|
+
|
348
|
+
build_settings[name] = build_settings[name] + value
|
349
|
+
end
|
350
|
+
|
322
351
|
end
|
323
352
|
end
|
324
353
|
|
@@ -36,11 +36,19 @@ module Xcode
|
|
36
36
|
value.to_s =~ /^(?:NO|false)$/ ? "NO" : "YES"
|
37
37
|
end
|
38
38
|
|
39
|
+
#
|
40
|
+
# @note Appending boolean properties has no real good default operation. What
|
41
|
+
# happens in this case is that whatever you decide to append will automatically
|
42
|
+
# override the previously existing settings.
|
43
|
+
#
|
44
|
+
# @param [Types] original the original value to be appended
|
45
|
+
# @param [Types] value Description
|
46
|
+
#
|
39
47
|
def append(original,value)
|
40
|
-
save(
|
48
|
+
save(value)
|
41
49
|
end
|
42
50
|
|
43
51
|
end
|
44
52
|
|
45
53
|
end
|
46
|
-
end
|
54
|
+
end
|
@@ -32,11 +32,11 @@ module Xcode
|
|
32
32
|
# back out to a key=value pair array.
|
33
33
|
#
|
34
34
|
def append(original,value)
|
35
|
-
all_values = (
|
35
|
+
all_values = (open(original) + Array(value)).map {|key_value| key_value.split("=") }.flatten
|
36
36
|
Hash[*all_values].map {|k,v| "#{k}=#{v}" }
|
37
37
|
end
|
38
38
|
|
39
39
|
end
|
40
40
|
|
41
41
|
end
|
42
|
-
end
|
42
|
+
end
|
@@ -26,11 +26,16 @@ module Xcode
|
|
26
26
|
extend self
|
27
27
|
|
28
28
|
#
|
29
|
+
# While the space delimited string can and is often stored in that way,
|
30
|
+
# it appears as though Xcode is now possibly storing these values in a format
|
31
|
+
# that the parser is returning as an Array. So if the raw value is an
|
32
|
+
# array, simply return that raw value instead of attempting to convert it.
|
33
|
+
#
|
29
34
|
# @param [Nil,String] value stored within the build settings
|
30
35
|
# @return [Array<String>] a list of the strings that are within this string
|
31
36
|
#
|
32
37
|
def open(value)
|
33
|
-
value.to_s.split(" ")
|
38
|
+
value.is_a?(Array) ? value : value.to_s.split(" ")
|
34
39
|
end
|
35
40
|
|
36
41
|
#
|
@@ -41,11 +46,20 @@ module Xcode
|
|
41
46
|
Array(value).join(" ")
|
42
47
|
end
|
43
48
|
|
49
|
+
#
|
50
|
+
# Space Delimited Strings are not unlike arrays and those we assume that the
|
51
|
+
# inputs are going to be two arrays that will be joined and then ensured
|
52
|
+
# that only the unique values are saved.
|
53
|
+
#
|
54
|
+
# @param [Nil,String] original the original value stored within the field
|
55
|
+
# @param [Nil,String,Array] value the new values that will coerced into an array
|
56
|
+
# and joined with the original values.
|
57
|
+
#
|
44
58
|
def append(original,value)
|
45
|
-
save( ( open(original) +
|
59
|
+
save( ( open(original) + Array(value)).uniq )
|
46
60
|
end
|
47
61
|
|
48
62
|
end
|
49
63
|
|
50
64
|
end
|
51
|
-
end
|
65
|
+
end
|
data/lib/xcode/file_reference.rb
CHANGED
@@ -67,8 +67,7 @@ module Xcode
|
|
67
67
|
# @return [Hash] system framework properties
|
68
68
|
#
|
69
69
|
def self.system_framework(name,properties = {})
|
70
|
-
|
71
|
-
name = name[/(.+)(?:\.framework)?$/,1]
|
70
|
+
name = name.gsub(File.extname(name),"")
|
72
71
|
|
73
72
|
default_properties = { 'isa' => 'PBXFileReference',
|
74
73
|
'lastKnownFileType' => 'wrapper.framework',
|
@@ -135,4 +134,4 @@ module Xcode
|
|
135
134
|
|
136
135
|
end
|
137
136
|
|
138
|
-
end
|
137
|
+
end
|
data/lib/xcode/group.rb
CHANGED
@@ -98,7 +98,9 @@ module Xcode
|
|
98
98
|
# if no matches were found.
|
99
99
|
#
|
100
100
|
def exists?(name)
|
101
|
-
children.find_all
|
101
|
+
children.find_all do |child|
|
102
|
+
child.name ? (child.name == name) : (File.basename(child.path) == name)
|
103
|
+
end
|
102
104
|
end
|
103
105
|
|
104
106
|
#
|
@@ -144,11 +146,13 @@ module Xcode
|
|
144
146
|
# found.
|
145
147
|
|
146
148
|
find_file_by = file_properties['name'] || file_properties['path']
|
149
|
+
|
147
150
|
found_or_created_file = exists?(find_file_by).first
|
148
151
|
|
149
152
|
unless found_or_created_file
|
150
153
|
found_or_created_file = create_child_object FileReference.file(file_properties)
|
151
154
|
end
|
155
|
+
|
152
156
|
found_or_created_file.supergroup = self
|
153
157
|
|
154
158
|
found_or_created_file
|
@@ -292,4 +296,4 @@ module Xcode
|
|
292
296
|
|
293
297
|
end
|
294
298
|
|
295
|
-
end
|
299
|
+
end
|
data/lib/xcode/keychain.rb
CHANGED
@@ -52,6 +52,17 @@ module Xcode
|
|
52
52
|
names
|
53
53
|
end
|
54
54
|
|
55
|
+
#
|
56
|
+
# Secure the keychain
|
57
|
+
#
|
58
|
+
def lock
|
59
|
+
cmd = []
|
60
|
+
cmd << "security"
|
61
|
+
cmd << "lock-keychain"
|
62
|
+
cmd << "\"#{@path}\""
|
63
|
+
Xcode::Shell.execute(cmd)
|
64
|
+
end
|
65
|
+
|
55
66
|
#
|
56
67
|
# Unlock the keychain using the provided password
|
57
68
|
#
|
@@ -14,7 +14,25 @@ module Xcode
|
|
14
14
|
xml = `plutil -convert xml1 -o - "#{path}"`
|
15
15
|
Plist::parse_xml(xml)
|
16
16
|
end
|
17
|
+
|
18
|
+
#
|
19
|
+
# Save the outputed string data to the specified project file path and then
|
20
|
+
# formats that data to be prettier than the default output.
|
21
|
+
#
|
22
|
+
def save path,data
|
23
|
+
|
24
|
+
File.open(path,'w') do |file|
|
25
|
+
file.puts data
|
26
|
+
end
|
27
|
+
|
28
|
+
#
|
29
|
+
|
30
|
+
if File.exists?(path)
|
31
|
+
`pl -input #{path} -output #{path}`
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
17
35
|
|
18
36
|
end
|
19
37
|
|
20
|
-
end
|
38
|
+
end
|
data/lib/xcode/project.rb
CHANGED
@@ -195,16 +195,15 @@ module Xcode
|
|
195
195
|
# @param [String] path the path to save the project
|
196
196
|
#
|
197
197
|
def save(path)
|
198
|
-
Dir.mkdir(path) unless File.exists?(path)
|
199
198
|
|
199
|
+
Dir.mkdir(path) unless File.exists?(path)
|
200
200
|
project_filepath = "#{path}/project.pbxproj"
|
201
201
|
|
202
202
|
# @toodo Save the workspace when the project is saved
|
203
203
|
# FileUtils.cp_r "#{path}/project.xcworkspace", "#{path}/project.xcworkspace"
|
204
|
+
|
205
|
+
Xcode::PLUTILProjectParser.save "#{@path}/project.pbxproj", to_xcplist
|
204
206
|
|
205
|
-
File.open(project_filepath,'w') do |file|
|
206
|
-
file.puts to_xcplist
|
207
|
-
end
|
208
207
|
end
|
209
208
|
|
210
209
|
#
|
data/lib/xcode/registry.rb
CHANGED
data/lib/xcode/version.rb
CHANGED
data/spec/configuration_spec.rb
CHANGED
@@ -68,10 +68,17 @@ describe Xcode::Configuration do
|
|
68
68
|
|
69
69
|
it "should append to existing settings" do
|
70
70
|
subject.set 'OTHER_LDFLAGS', '-NONE'
|
71
|
-
subject.append 'OTHER_LDFLAGS', '-FOR
|
71
|
+
subject.append 'OTHER_LDFLAGS', '-FOR'
|
72
|
+
subject.append 'OTHER_LDFLAGS', [ '-FOR' , '-ME' ]
|
72
73
|
settings['OTHER_LDFLAGS'].should == "-NONE -FOR -ME"
|
73
74
|
end
|
74
75
|
|
76
|
+
it "should append to existing settings" do
|
77
|
+
subject.set 'OTHER_LDFLAGS', '-NONE -FOR'
|
78
|
+
subject.append 'OTHER_LDFLAGS', '-FOR'
|
79
|
+
subject.append 'OTHER_LDFLAGS', [ '-FOR' , '-ME' ]
|
80
|
+
settings['OTHER_LDFLAGS'].should == "-FOR -ME"
|
81
|
+
end
|
75
82
|
end
|
76
83
|
|
77
84
|
describe "#get" do
|
@@ -331,4 +338,4 @@ describe Xcode::Configuration do
|
|
331
338
|
end
|
332
339
|
end
|
333
340
|
|
334
|
-
end
|
341
|
+
end
|
data/spec/keychain_spec.rb
CHANGED
@@ -26,6 +26,14 @@ describe Xcode::Keychain do
|
|
26
26
|
kc.identities[0].should=="Test User"
|
27
27
|
end
|
28
28
|
|
29
|
+
# FIXME: Need to surpress GUI dialog prompting to unlock keychain
|
30
|
+
# it "should lock the keychain" do
|
31
|
+
# kc = Xcode::Keychain.temp
|
32
|
+
# kc.lock
|
33
|
+
# kc.import "#{File.dirname(__FILE__)}/Provisioning/TestUser.p12", 'testpassword'
|
34
|
+
# kc.identities.size.should==0
|
35
|
+
# end
|
36
|
+
|
29
37
|
it "should fetch the login keychain" do
|
30
38
|
kc = Xcode::Keychain.login
|
31
39
|
File.exists?(kc.path).should==true
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xcoder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.9
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,11 +10,11 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-03-
|
13
|
+
date: 2012-03-25 00:00:00.000000000Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: json
|
17
|
-
requirement: &
|
17
|
+
requirement: &70245902880760 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: '0'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *70245902880760
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: plist
|
28
|
-
requirement: &
|
28
|
+
requirement: &70245902896700 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ! '>='
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *70245902896700
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: nokogiri
|
39
|
-
requirement: &
|
39
|
+
requirement: &70245902896280 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ! '>='
|
@@ -44,10 +44,10 @@ dependencies:
|
|
44
44
|
version: '0'
|
45
45
|
type: :runtime
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *70245902896280
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: builder
|
50
|
-
requirement: &
|
50
|
+
requirement: &70245902895860 !ruby/object:Gem::Requirement
|
51
51
|
none: false
|
52
52
|
requirements:
|
53
53
|
- - ! '>='
|
@@ -55,10 +55,10 @@ dependencies:
|
|
55
55
|
version: '0'
|
56
56
|
type: :runtime
|
57
57
|
prerelease: false
|
58
|
-
version_requirements: *
|
58
|
+
version_requirements: *70245902895860
|
59
59
|
- !ruby/object:Gem::Dependency
|
60
60
|
name: rest-client
|
61
|
-
requirement: &
|
61
|
+
requirement: &70245902895440 !ruby/object:Gem::Requirement
|
62
62
|
none: false
|
63
63
|
requirements:
|
64
64
|
- - ! '>='
|
@@ -66,7 +66,7 @@ dependencies:
|
|
66
66
|
version: '0'
|
67
67
|
type: :runtime
|
68
68
|
prerelease: false
|
69
|
-
version_requirements: *
|
69
|
+
version_requirements: *70245902895440
|
70
70
|
description: Provides a ruby based object-model for parsing project structures and
|
71
71
|
invoking builds
|
72
72
|
email:
|