zerg_xcode 0.3.4 → 0.3.5
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +2 -0
- data/Manifest +22 -14
- data/Rakefile +6 -0
- data/lib/zerg_xcode.rb +8 -3
- data/lib/zerg_xcode/builder/runner.rb +51 -0
- data/lib/zerg_xcode/builder/sdks.rb +34 -0
- data/lib/zerg_xcode/file_format/archiver.rb +15 -2
- data/lib/zerg_xcode/file_format/encoder.rb +15 -2
- data/lib/zerg_xcode/file_format/lexer.rb +15 -2
- data/lib/zerg_xcode/file_format/parser.rb +15 -2
- data/lib/zerg_xcode/file_format/paths.rb +15 -2
- data/lib/zerg_xcode/objects/pbx_build_file.rb +16 -3
- data/lib/zerg_xcode/objects/pbx_build_phase.rb +14 -2
- data/lib/zerg_xcode/objects/pbx_container_item_proxy.rb +14 -2
- data/lib/zerg_xcode/objects/pbx_group.rb +43 -3
- data/lib/zerg_xcode/objects/pbx_native_target.rb +15 -3
- data/lib/zerg_xcode/objects/pbx_project.rb +20 -4
- data/lib/zerg_xcode/objects/pbx_target_dependency.rb +15 -3
- data/lib/zerg_xcode/objects/xc_configuration_list.rb +14 -2
- data/lib/zerg_xcode/objects/xcode_object.rb +14 -3
- data/lib/zerg_xcode/plugins/addlibrary.rb +15 -2
- data/lib/zerg_xcode/plugins/core/core.rb +15 -6
- data/lib/zerg_xcode/plugins/help.rb +15 -2
- data/lib/zerg_xcode/plugins/import.rb +15 -2
- data/lib/zerg_xcode/plugins/irb.rb +16 -2
- data/lib/zerg_xcode/plugins/ls.rb +15 -2
- data/lib/zerg_xcode/plugins/lstargets.rb +16 -2
- data/lib/zerg_xcode/plugins/retarget.rb +15 -2
- data/lib/zerg_xcode/shortcuts.rb +10 -2
- data/test/builder/runner_test.rb +35 -0
- data/test/builder/sdk_test.rb +17 -0
- data/test/file_format/archiver_test.rb +6 -2
- data/test/file_format/encoder_test.rb +7 -3
- data/test/file_format/lexer_test.rb +7 -3
- data/test/file_format/parser_test.rb +6 -2
- data/test/file_format/path_test.rb +30 -24
- data/test/fixtures/ClosedLib/ClosedLib.xcodeproj/project.pbxproj +225 -0
- data/test/fixtures/ClosedLib/ClosedLib_Prefix.pch +7 -0
- data/test/fixtures/ClosedLib/ClosedNative.c +20 -0
- data/test/fixtures/ClosedLib/ClosedNative.h +12 -0
- data/{testdata → test/fixtures}/FlatTestApp/FlatTestApp.xcodeproj/project.pbxproj +0 -0
- data/{testdata → test/fixtures}/TestApp/TestApp.xcodeproj/project.pbxproj +0 -0
- data/{testdata → test/fixtures}/TestApp30.xcodeproj/project.pbxproj +0 -0
- data/{testdata → test/fixtures}/TestLib30.xcodeproj/project.pbxproj +0 -0
- data/{testdata → test/fixtures}/ZergSupport.xcodeproj/project.pbxproj +0 -0
- data/{testdata → test/fixtures}/project.pbxproj +0 -0
- data/{testdata → test/fixtures}/project.pbxproj.compat +0 -0
- data/test/objects/pbx_build_file_test.rb +7 -4
- data/test/objects/pbx_build_phase_test.rb +5 -2
- data/test/objects/pbx_container_item_proxy_test.rb +6 -2
- data/test/objects/pbx_group_test.rb +35 -3
- data/test/objects/pbx_native_target_test.rb +5 -2
- data/test/objects/pbx_project_test.rb +21 -9
- data/test/objects/pbx_target_dependency_test.rb +6 -2
- data/test/objects/xc_configuration_list_test.rb +5 -2
- data/test/objects/xcode_object_test.rb +5 -2
- data/test/plugins/addlibrary_test.rb +6 -3
- data/test/plugins/core/core_test.rb +5 -2
- data/test/plugins/helper.rb +4 -0
- data/test/plugins/import_test.rb +76 -72
- data/test/plugins/irb_test.rb +9 -4
- data/test/plugins/ls_test.rb +7 -4
- data/test/plugins/lstargets_test.rb +7 -4
- data/test/plugins/retarget_test.rb +7 -4
- data/test/shortcuts_test.rb +7 -3
- data/zerg_xcode.gemspec +6 -6
- metadata +32 -20
@@ -1,6 +1,16 @@
|
|
1
1
|
# The root object in the Xcode object graph.
|
2
|
-
|
3
|
-
|
2
|
+
#
|
3
|
+
# Author:: Victor Costan
|
4
|
+
# Copyright:: Copyright (C) 2009 Zergling.Net
|
5
|
+
# License:: MIT
|
6
|
+
|
7
|
+
# :nodoc: namespace
|
8
|
+
module ZergXcode::Objects
|
9
|
+
|
10
|
+
|
11
|
+
# The root object in the Xcode object graph.
|
12
|
+
class PBXProject < ZergXcode::XcodeObject
|
13
|
+
# Used to implement save! and to support builds.
|
4
14
|
attr_accessor :source_filename
|
5
15
|
|
6
16
|
# :nodoc: override to copy the new metadata
|
@@ -32,6 +42,10 @@ class ZergXcode::Objects::PBXProject < ZergXcode::XcodeObject
|
|
32
42
|
def xref_name
|
33
43
|
isa.to_s
|
34
44
|
end
|
45
|
+
|
46
|
+
def find_group_named name
|
47
|
+
self["mainGroup"].find_group_named name
|
48
|
+
end
|
35
49
|
|
36
50
|
# Container for the visitor that lists all files in a project.
|
37
51
|
module FileVisitor
|
@@ -72,5 +86,7 @@ class ZergXcode::Objects::PBXProject < ZergXcode::XcodeObject
|
|
72
86
|
end
|
73
87
|
return path
|
74
88
|
end
|
75
|
-
end
|
76
|
-
end
|
89
|
+
end # module ZergXcode::Objects::PBXProject::FileVisitor
|
90
|
+
end # class ZergXcode::Objects::PBXProject
|
91
|
+
|
92
|
+
end # namespace class ZergXcode::Objects
|
@@ -1,5 +1,15 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# A build target's dependency on another build target.
|
2
|
+
#
|
3
|
+
# Author:: Victor Costan
|
4
|
+
# Copyright:: Copyright (C) 2009 Zergling.Net
|
5
|
+
# License:: MIT
|
6
|
+
|
7
|
+
# :nodoc: namespace
|
8
|
+
module ZergXcode::Objects
|
9
|
+
|
10
|
+
|
11
|
+
# Expresses a build target's dependency on another build target.
|
12
|
+
class PBXTargetDependency < ZergXcode::XcodeObject
|
3
13
|
PBXContainerItemProxy = ZergXcode::Objects::PBXContainerItemProxy
|
4
14
|
|
5
15
|
# The target that this target depends on.
|
@@ -17,4 +27,6 @@ class ZergXcode::Objects::PBXTargetDependency < ZergXcode::XcodeObject
|
|
17
27
|
def xref_name
|
18
28
|
target.xref_name
|
19
29
|
end
|
20
|
-
end
|
30
|
+
end # class ZergXcode::Objects::PBXTargetDependency
|
31
|
+
|
32
|
+
end # namespace ZergXcode::Objects
|
@@ -1,7 +1,19 @@
|
|
1
1
|
# The configurations associated with an object.
|
2
|
-
|
2
|
+
#
|
3
|
+
# Author:: Victor Costan
|
4
|
+
# Copyright:: Copyright (C) 2009 Zergling.Net
|
5
|
+
# License:: MIT
|
6
|
+
|
7
|
+
# :nodoc: namespace
|
8
|
+
module ZergXcode::Objects
|
9
|
+
|
10
|
+
|
11
|
+
# The configurations associated with an object.
|
12
|
+
class XCConfigurationList < ZergXcode::XcodeObject
|
3
13
|
# :nodoc: override xref_name because there's always a single list in a context
|
4
14
|
def xref_name
|
5
15
|
isa.to_s
|
6
16
|
end
|
7
|
-
end
|
17
|
+
end # class ZergXcode::Objects::XCConfigurationList
|
18
|
+
|
19
|
+
end # namespace ZergXcode::Objects
|
@@ -1,5 +1,15 @@
|
|
1
|
-
# Xcode
|
2
|
-
|
1
|
+
# Superclass for all the objects in an Xcode project object graph.
|
2
|
+
#
|
3
|
+
# Author:: Victor Costan
|
4
|
+
# Copyright:: Copyright (C) 2009 Zergling.Net
|
5
|
+
# License:: MIT
|
6
|
+
|
7
|
+
# :nodoc: namespace
|
8
|
+
module ZergXcode
|
9
|
+
|
10
|
+
|
11
|
+
# Superclass for all the objects in an Xcode project object graph.
|
12
|
+
class XcodeObject
|
3
13
|
attr_accessor :version
|
4
14
|
attr_accessor :archive_id
|
5
15
|
|
@@ -181,5 +191,6 @@ class ZergXcode::XcodeObject
|
|
181
191
|
def copy_metadata(source)
|
182
192
|
self.archive_id, self.version = source.archive_id, source.version
|
183
193
|
end
|
184
|
-
end
|
194
|
+
end # class ZergXcode::XcodeObject
|
185
195
|
|
196
|
+
end # namespace ZergXcode
|
@@ -1,4 +1,15 @@
|
|
1
|
-
|
1
|
+
# Adds a library target as a dependence to another Xcode target.
|
2
|
+
#
|
3
|
+
# Author:: Victor Costan
|
4
|
+
# Copyright:: Copyright (C) 2009 Zergling.Net
|
5
|
+
# License:: MIT
|
6
|
+
|
7
|
+
# :nodoc: namespace
|
8
|
+
module ZergXcode::Plugins
|
9
|
+
|
10
|
+
|
11
|
+
# Adds a library target as a dependence to another Xcode target.
|
12
|
+
class Addlibrary
|
2
13
|
include ZergXcode::Objects
|
3
14
|
|
4
15
|
def help
|
@@ -118,4 +129,6 @@ END
|
|
118
129
|
(setting.kind_of?(Enumerable) && setting.include?(option)))
|
119
130
|
end
|
120
131
|
end
|
121
|
-
end
|
132
|
+
end # class ZergXcode::Plugins::Addlibrary
|
133
|
+
|
134
|
+
end # namespace ZergXcode::Plugins
|
@@ -1,6 +1,17 @@
|
|
1
|
+
# Plugin management logic.
|
2
|
+
#
|
3
|
+
# Author:: Victor Costan
|
4
|
+
# Copyright:: Copyright (C) 2009 Zergling.Net
|
5
|
+
# License:: MIT
|
6
|
+
|
1
7
|
require 'set'
|
2
8
|
|
3
|
-
|
9
|
+
# :nodoc: namespace
|
10
|
+
module ZergXcode
|
11
|
+
|
12
|
+
|
13
|
+
# Plugin management logic.
|
14
|
+
module Plugins
|
4
15
|
def self.all
|
5
16
|
plugin_dir = File.join(File.dirname(__FILE__), '..')
|
6
17
|
plugins = Dir.entries(plugin_dir).select { |entry|
|
@@ -19,7 +30,7 @@ module ZergXcode::Plugins
|
|
19
30
|
|
20
31
|
def self.get(plugin_name)
|
21
32
|
self.require plugin_name
|
22
|
-
|
33
|
+
Plugins.const_get(plugin_name.capitalize).new
|
23
34
|
end
|
24
35
|
|
25
36
|
def self.run(plugin_name, args)
|
@@ -29,8 +40,6 @@ module ZergXcode::Plugins
|
|
29
40
|
def self.help(plugin_name)
|
30
41
|
self.get(plugin_name).help
|
31
42
|
end
|
32
|
-
end
|
43
|
+
end # module ZergXcode::Plugins
|
33
44
|
|
34
|
-
#
|
35
|
-
module ZergXcode
|
36
|
-
end
|
45
|
+
end # namespace ZergXcode
|
@@ -1,4 +1,15 @@
|
|
1
|
-
|
1
|
+
# Displays the help strings for other plugins.
|
2
|
+
#
|
3
|
+
# Author:: Victor Costan
|
4
|
+
# Copyright:: Copyright (C) 2009 Zergling.Net
|
5
|
+
# License:: MIT
|
6
|
+
|
7
|
+
# :nodoc: namespace
|
8
|
+
module ZergXcode::Plugins
|
9
|
+
|
10
|
+
|
11
|
+
# Displays the help strings for other plugins.
|
12
|
+
class Help
|
2
13
|
def help
|
3
14
|
{:short => 'command-line usage instructions',
|
4
15
|
:long => <<"END" }
|
@@ -27,4 +38,6 @@ END
|
|
27
38
|
print helpstr
|
28
39
|
helpstr
|
29
40
|
end
|
30
|
-
end
|
41
|
+
end # class ZergXcode::Plugins::Help
|
42
|
+
|
43
|
+
end # namespace ZergXcode::Plugins
|
@@ -1,7 +1,18 @@
|
|
1
|
+
# Imports the contents of an Xcode project into another Xcode project.
|
2
|
+
#
|
3
|
+
# Author:: Victor Costan
|
4
|
+
# Copyright:: Copyright (C) 2009 Zergling.Net
|
5
|
+
# License:: MIT
|
6
|
+
|
1
7
|
require 'fileutils'
|
2
8
|
require 'pathname'
|
3
9
|
|
4
|
-
|
10
|
+
# :nodoc: namespace
|
11
|
+
module ZergXcode::Plugins
|
12
|
+
|
13
|
+
|
14
|
+
# Imports the contents of an Xcode project into another Xcode project.
|
15
|
+
class Import
|
5
16
|
include ZergXcode::Objects
|
6
17
|
|
7
18
|
def help
|
@@ -278,4 +289,6 @@ END
|
|
278
289
|
mappings
|
279
290
|
end
|
280
291
|
private :cross_reference_enumerables
|
281
|
-
end
|
292
|
+
end # class ZergXcode::Plugins::Import
|
293
|
+
|
294
|
+
end # namespace ZergXcode::Plugins
|
@@ -1,6 +1,17 @@
|
|
1
|
+
# Loads up an Xcode project and the ZergXcode library into an irb shell.
|
2
|
+
#
|
3
|
+
# Author:: Victor Costan
|
4
|
+
# Copyright:: Copyright (C) 2009 Zergling.Net
|
5
|
+
# License:: MIT
|
6
|
+
|
1
7
|
require 'irb'
|
2
8
|
|
3
|
-
|
9
|
+
# :nodoc: namespace
|
10
|
+
module ZergXcode::Plugins
|
11
|
+
|
12
|
+
|
13
|
+
# Loads up an Xcode project and the ZergXcode library into an irb shell.
|
14
|
+
class Irb
|
4
15
|
def help
|
5
16
|
{:short => 'opens up a project in an interactive ruby shell',
|
6
17
|
:long => <<"END" }
|
@@ -19,4 +30,7 @@ END
|
|
19
30
|
"Use the 'quit' command if you're here by mistake.\n"
|
20
31
|
IRB.start __FILE__
|
21
32
|
end
|
22
|
-
end
|
33
|
+
end # class ZergXcode::Plugins::Irb
|
34
|
+
|
35
|
+
end # namespace ZergXcode::Plugins
|
36
|
+
|
@@ -1,4 +1,15 @@
|
|
1
|
-
|
1
|
+
# Lists the files in an Xcode project.
|
2
|
+
#
|
3
|
+
# Author:: Victor Costan
|
4
|
+
# Copyright:: Copyright (C) 2009 Zergling.Net
|
5
|
+
# License:: MIT
|
6
|
+
|
7
|
+
# :nodoc: namespace
|
8
|
+
module ZergXcode::Plugins
|
9
|
+
|
10
|
+
|
11
|
+
# Lists the files in an Xcode project.
|
12
|
+
class Ls
|
2
13
|
def help
|
3
14
|
{:short => 'shows the files in a project',
|
4
15
|
:long => <<"END" }
|
@@ -24,4 +35,6 @@ END
|
|
24
35
|
[file[:path], file[:object]['lastKnownFileType']]
|
25
36
|
end
|
26
37
|
end
|
27
|
-
end
|
38
|
+
end # class ZergXcode::Plugins::Ls
|
39
|
+
|
40
|
+
end # namespace ZergXcode::Plugins
|
@@ -1,4 +1,15 @@
|
|
1
|
-
|
1
|
+
# Lists the build targets in an Xcode project.
|
2
|
+
#
|
3
|
+
# Author:: Victor Costan
|
4
|
+
# Copyright:: Copyright (C) 2009 Zergling.Net
|
5
|
+
# License:: MIT
|
6
|
+
|
7
|
+
# :nodoc: namespace
|
8
|
+
module ZergXcode::Plugins
|
9
|
+
|
10
|
+
|
11
|
+
# Lists the build targets in an Xcode project.
|
12
|
+
class Lstargets
|
2
13
|
def help
|
3
14
|
{:short => 'shows the targets in a project',
|
4
15
|
:long => <<"END" }
|
@@ -26,4 +37,7 @@ END
|
|
26
37
|
[target['name'], target['productName'], target['productType']]
|
27
38
|
end
|
28
39
|
end
|
29
|
-
end
|
40
|
+
end # class ZergXcode::Plugins::Lstargets
|
41
|
+
|
42
|
+
end # namespace ZergXcode::Plugins
|
43
|
+
|
@@ -1,4 +1,15 @@
|
|
1
|
-
|
1
|
+
# Adds files to a build target, and removes them from all the other targets.
|
2
|
+
#
|
3
|
+
# Author:: Victor Costan
|
4
|
+
# Copyright:: Copyright (C) 2009 Zergling.Net
|
5
|
+
# License:: MIT
|
6
|
+
|
7
|
+
# :nodoc: namespace
|
8
|
+
module ZergXcode::Plugins
|
9
|
+
|
10
|
+
|
11
|
+
# Adds files to a build target, and removes them from all the other targets.
|
12
|
+
class Retarget
|
2
13
|
include ZergXcode::Objects
|
3
14
|
|
4
15
|
def help
|
@@ -83,4 +94,6 @@ END
|
|
83
94
|
end
|
84
95
|
end
|
85
96
|
end
|
86
|
-
end
|
97
|
+
end # class ZergXcode::Plugins::Retarget
|
98
|
+
|
99
|
+
end # namespace ZergXcode::Plugins
|
data/lib/zerg_xcode/shortcuts.rb
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
# Convenience methods for core ZergXcode functionality.
|
2
|
+
#
|
3
|
+
# Author:: Victor Costan
|
4
|
+
# Copyright:: Copyright (C) 2009 Zergling.Net
|
5
|
+
# License:: MIT
|
6
|
+
|
7
|
+
|
8
|
+
# :nodoc: namespace
|
1
9
|
module ZergXcode
|
2
10
|
# Reads an Xcode project from the filesystem.
|
3
11
|
def self.load(path)
|
@@ -18,5 +26,5 @@ module ZergXcode
|
|
18
26
|
# Instantiate a plug-in.
|
19
27
|
def self.plugin(plugin_name)
|
20
28
|
ZergXcode::Plugins.get(plugin_name)
|
21
|
-
end
|
22
|
-
end
|
29
|
+
end
|
30
|
+
end # namespace ZergXcode
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# Author:: Victor Costan
|
2
|
+
# Copyright:: Copyright (C) 2009 Zergling.Net
|
3
|
+
# License:: MIT
|
4
|
+
|
5
|
+
require 'zerg_xcode'
|
6
|
+
require 'test/unit'
|
7
|
+
|
8
|
+
class RunnerTest < Test::Unit::TestCase
|
9
|
+
def setup
|
10
|
+
@project = ZergXcode.load 'test/fixtures/ClosedLib'
|
11
|
+
@configuration = 'Release'
|
12
|
+
@sdk = ZergXcode::Builder::Sdk.all.
|
13
|
+
select { |s| /iPhone .* 3\.0$/ =~ s[:name] }.first
|
14
|
+
@golden_build_path = 'test/fixtures/ClosedLib/build/Release-iphoneos'
|
15
|
+
@product = @golden_build_path + '/libClosedLib.a'
|
16
|
+
end
|
17
|
+
|
18
|
+
def teardown
|
19
|
+
ZergXcode::Builder::Runner.clean @project, @sdk, @configuration
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_clean_build_clean
|
23
|
+
assert ZergXcode::Builder::Runner.clean(@project, @sdk, @configuration),
|
24
|
+
'Initial clean failed'
|
25
|
+
|
26
|
+
build_path = ZergXcode::Builder::Runner.build @project, @sdk, @configuration
|
27
|
+
assert build_path, 'Build failed'
|
28
|
+
assert_equal @golden_build_path, build_path, 'Build returned incorrect path'
|
29
|
+
assert File.exist?(@product), 'Build product not found'
|
30
|
+
|
31
|
+
assert ZergXcode::Builder::Runner.clean(@project, @sdk, @configuration),
|
32
|
+
'Post-build clean failed'
|
33
|
+
assert !File.exist?(@product), 'Build product not removed by clean'
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# Author:: Victor Costan
|
2
|
+
# Copyright:: Copyright (C) 2009 Zergling.Net
|
3
|
+
# License:: MIT
|
4
|
+
|
5
|
+
require 'zerg_xcode'
|
6
|
+
require 'test/unit'
|
7
|
+
|
8
|
+
class SdkTest < Test::Unit::TestCase
|
9
|
+
def test_all
|
10
|
+
all_sdks = ZergXcode::Builder::Sdk.all
|
11
|
+
mac105 = { :group => 'Mac OS X SDKs', :name => 'Mac OS X 10.5',
|
12
|
+
:arg => 'macosx10.5' }
|
13
|
+
assert_operator all_sdks, :include?, mac105, 'MacOS 10.5 SDK included'
|
14
|
+
|
15
|
+
assert_operator all_sdks, :equal?, all_sdks, 'SDKs are cached'
|
16
|
+
end
|
17
|
+
end
|
@@ -1,5 +1,9 @@
|
|
1
|
-
|
1
|
+
# Author:: Victor Costan
|
2
|
+
# Copyright:: Copyright (C) 2009 Zergling.Net
|
3
|
+
# License:: MIT
|
4
|
+
|
2
5
|
require 'zerg_xcode'
|
6
|
+
require 'test/unit'
|
3
7
|
|
4
8
|
class ArchiverTest < Test::Unit::TestCase
|
5
9
|
Parser = ZergXcode::Parser
|
@@ -27,7 +31,7 @@ class ArchiverTest < Test::Unit::TestCase
|
|
27
31
|
}
|
28
32
|
}
|
29
33
|
|
30
|
-
@pbxdata = File.read '
|
34
|
+
@pbxdata = File.read 'test/fixtures/project.pbxproj'
|
31
35
|
end
|
32
36
|
|
33
37
|
def test_archive_to_hash
|
@@ -1,10 +1,14 @@
|
|
1
|
-
|
1
|
+
# Author:: Victor Costan
|
2
|
+
# Copyright:: Copyright (C) 2009 Zergling.Net
|
3
|
+
# License:: MIT
|
4
|
+
|
2
5
|
require 'zerg_xcode'
|
6
|
+
require 'test/unit'
|
3
7
|
|
4
8
|
class EncoderTest < Test::Unit::TestCase
|
5
9
|
def test_encoder
|
6
|
-
pbxdata = File.read '
|
7
|
-
golden_encoded_proj = File.read '
|
10
|
+
pbxdata = File.read 'test/fixtures/project.pbxproj'
|
11
|
+
golden_encoded_proj = File.read 'test/fixtures/project.pbxproj.compat'
|
8
12
|
proj = ZergXcode::Parser.parse pbxdata
|
9
13
|
assert_equal golden_encoded_proj, ZergXcode::Encoder.encode(proj)
|
10
14
|
end
|