vendor 0.1.5 → 0.1.6
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.
- data/CHANGELOG.md +6 -0
- data/Gemfile.lock +1 -1
- data/LICENSE +1 -1
- data/Readme.markdown +2 -1
- data/VERSION +1 -1
- data/lib/vendor/cli/app.rb +13 -17
- data/lib/vendor/spec.rb +244 -55
- data/lib/vendor/vendor_file/library/base.rb +43 -63
- data/lib/vendor/vendor_file/loader.rb +8 -0
- data/lib/vendor/vendor_spec/builder.rb +19 -8
- data/lib/vendor/xcode.rb +0 -1
- data/lib/vendor/xcode/project.rb +198 -469
- data/spec/lib/vendor/spec_spec.rb +34 -10
- data/spec/lib/vendor/vendor_file/library/base_spec.rb +41 -49
- data/spec/lib/vendor/vendor_spec/builder_spec.rb +26 -0
- data/spec/support/resources/cache/base/DKBenchmark-0.1-Manifest/vendor.json +1 -1
- data/spec/support/resources/cache/base/DKBenchmark-0.1-Vendorspec/DKBenchmark.vendorspec +2 -0
- data/spec/support/resources/vendors/DKBenchmark/DKBenchmark.vendorspec +2 -0
- data/spec/support/resources/vendors/DKBenchmarkFramework/DKBenchmark.framework/DKBenchmark +0 -0
- data/spec/support/resources/vendors/DKBenchmarkFramework/DKBenchmark.framework/Versions/A/DKBenchmark +0 -0
- data/spec/support/resources/vendors/DKBenchmarkFramework/DKBenchmark.framework/Versions/A/Headers/DKBenchmark.h +18 -0
- data/spec/support/resources/vendors/DKBenchmarkFramework/DKBenchmark.vendorspec +23 -0
- data/vendor.gemspec +1 -0
- metadata +111 -63
- data/lib/vendor/xcode/proxy.rb +0 -31
- data/lib/vendor/xcode/proxy/base.rb +0 -129
- data/lib/vendor/xcode/proxy/pbx_aggregate_target.rb +0 -11
- data/lib/vendor/xcode/proxy/pbx_build_file.rb +0 -9
- data/lib/vendor/xcode/proxy/pbx_container_item_proxy.rb +0 -8
- data/lib/vendor/xcode/proxy/pbx_file_reference.rb +0 -41
- data/lib/vendor/xcode/proxy/pbx_frameworks_build_phase.rb +0 -15
- data/lib/vendor/xcode/proxy/pbx_group.rb +0 -35
- data/lib/vendor/xcode/proxy/pbx_native_target.rb +0 -11
- data/lib/vendor/xcode/proxy/pbx_project.rb +0 -12
- data/lib/vendor/xcode/proxy/pbx_reference_proxy.rb +0 -7
- data/lib/vendor/xcode/proxy/pbx_resources_build_phase.rb +0 -15
- data/lib/vendor/xcode/proxy/pbx_shell_script_build_phase.rb +0 -15
- data/lib/vendor/xcode/proxy/pbx_sources_build_phase.rb +0 -15
- data/lib/vendor/xcode/proxy/pbx_target_dependency.rb +0 -7
- data/lib/vendor/xcode/proxy/pbx_variant_group.rb +0 -7
- data/lib/vendor/xcode/proxy/unknown.rb +0 -8
- data/lib/vendor/xcode/proxy/xc_build_configuration.rb +0 -7
- data/lib/vendor/xcode/proxy/xc_configuration_list.rb +0 -9
- data/lib/vendor/xcode/proxy/xc_version_group.rb +0 -7
- data/spec/lib/vendor/xcode/project_spec.rb +0 -635
- data/spec/lib/vendor/xcode/proxy/base_spec.rb +0 -88
- data/spec/lib/vendor/xcode/proxy/pbx_file_reference_spec.rb +0 -26
- data/spec/lib/vendor/xcode/proxy/pbx_group_spec.rb +0 -27
- data/spec/lib/vendor/xcode/proxy/pbx_project_spec.rb +0 -29
data/lib/vendor/xcode/proxy.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
module Vendor
|
2
|
-
|
3
|
-
module XCode
|
4
|
-
|
5
|
-
module Proxy
|
6
|
-
|
7
|
-
autoload :Base, "vendor/xcode/proxy/base"
|
8
|
-
autoload :PBXAggregateTarget, "vendor/xcode/proxy/pbx_aggregate_target"
|
9
|
-
autoload :PBXProject, "vendor/xcode/proxy/pbx_project"
|
10
|
-
autoload :PBXFileReference, "vendor/xcode/proxy/pbx_file_reference"
|
11
|
-
autoload :PBXGroup, "vendor/xcode/proxy/pbx_group"
|
12
|
-
autoload :PBXSourcesBuildPhase, "vendor/xcode/proxy/pbx_sources_build_phase"
|
13
|
-
autoload :PBXBuildFile, "vendor/xcode/proxy/pbx_build_file"
|
14
|
-
autoload :PBXFrameworksBuildPhase, "vendor/xcode/proxy/pbx_frameworks_build_phase"
|
15
|
-
autoload :PBXResourcesBuildPhase, "vendor/xcode/proxy/pbx_resources_build_phase"
|
16
|
-
autoload :PBXNativeTarget, "vendor/xcode/proxy/pbx_native_target"
|
17
|
-
autoload :PBXContainerItemProxy, "vendor/xcode/proxy/pbx_container_item_proxy"
|
18
|
-
autoload :PBXTargetDependency, "vendor/xcode/proxy/pbx_target_dependency"
|
19
|
-
autoload :PBXVariantGroup, "vendor/xcode/proxy/pbx_variant_group"
|
20
|
-
autoload :PBXShellScriptBuildPhase, "vendor/xcode/proxy/pbx_shell_script_build_phase"
|
21
|
-
autoload :PBXReferenceProxy, "vendor/xcode/proxy/pbx_reference_proxy"
|
22
|
-
autoload :XCBuildConfiguration, "vendor/xcode/proxy/xc_build_configuration"
|
23
|
-
autoload :XCConfigurationList, "vendor/xcode/proxy/xc_configuration_list"
|
24
|
-
autoload :XCVersionGroup, "vendor/xcode/proxy/xc_version_group"
|
25
|
-
autoload :Unknown, "vendor/xcode/proxy/unknown"
|
26
|
-
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
@@ -1,129 +0,0 @@
|
|
1
|
-
module Vendor::XCode::Proxy
|
2
|
-
|
3
|
-
class Base
|
4
|
-
|
5
|
-
attr_accessor :id
|
6
|
-
attr_accessor :parent
|
7
|
-
attr_reader :attributes
|
8
|
-
|
9
|
-
class << self
|
10
|
-
|
11
|
-
# I don't know what the ID's are made up of in XCode,
|
12
|
-
# so lets just generate a 24 character string.
|
13
|
-
def generate_id
|
14
|
-
(0...24).map { '%02X' % rand(256) }.join
|
15
|
-
end
|
16
|
-
|
17
|
-
def object_references
|
18
|
-
@references || []
|
19
|
-
end
|
20
|
-
|
21
|
-
def reference(name)
|
22
|
-
attribute = attribute_name(name)
|
23
|
-
|
24
|
-
define_method name do
|
25
|
-
value = @attributes[attribute]
|
26
|
-
if value.kind_of?(Array)
|
27
|
-
value.map { |id| @project.find_object(id) }
|
28
|
-
else
|
29
|
-
@project.find_object(value)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
@references ||= []
|
34
|
-
@references << name
|
35
|
-
end
|
36
|
-
|
37
|
-
# References are stored in camel case in the project file
|
38
|
-
def attribute_name(name)
|
39
|
-
camelized = name.to_s.gsub(/[^\w]/, '').gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
|
40
|
-
camelized[0].chr.downcase + camelized[1..-1]
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
def initialize(options)
|
46
|
-
@id = options[:id]
|
47
|
-
@project = options[:project]
|
48
|
-
@attributes = options[:attributes]
|
49
|
-
|
50
|
-
@attributes['isa'] = self.class.name.split('::').last unless @attributes['isa']
|
51
|
-
end
|
52
|
-
|
53
|
-
def inspect
|
54
|
-
properties = { "id" => @id }.merge(@attributes)
|
55
|
-
|
56
|
-
# The class name contains the ISA (the type of the object)
|
57
|
-
properties.delete("isa")
|
58
|
-
|
59
|
-
# Always show the ID first
|
60
|
-
keys = properties.keys.map(&:to_s)
|
61
|
-
keys.delete("id")
|
62
|
-
keys.unshift("id")
|
63
|
-
|
64
|
-
"#<#{self.class.name} #{keys.map{ |key| "#{underscore(key)}: #{properties[key].inspect}" }.join(', ')}>"
|
65
|
-
end
|
66
|
-
|
67
|
-
def method_missing(v, *args)
|
68
|
-
setting = v.to_s.match(/\=$/)
|
69
|
-
name = self.class.attribute_name(v)
|
70
|
-
|
71
|
-
if @attributes.has_key?(name)
|
72
|
-
if setting
|
73
|
-
write_attribute(name, args.first)
|
74
|
-
else
|
75
|
-
read_attribute(name)
|
76
|
-
end
|
77
|
-
else
|
78
|
-
super
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
def respond_to?(method)
|
83
|
-
name = self.class.attribute_name(method)
|
84
|
-
|
85
|
-
if @attributes.has_key?(name)
|
86
|
-
true
|
87
|
-
else
|
88
|
-
super
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
def write_attribute(name, value)
|
93
|
-
@attributes[name.to_s] = value
|
94
|
-
end
|
95
|
-
|
96
|
-
def read_attribute(name)
|
97
|
-
@attributes[name.to_s]
|
98
|
-
end
|
99
|
-
|
100
|
-
def to_ascii_plist
|
101
|
-
@attributes.to_ascii_plist
|
102
|
-
end
|
103
|
-
|
104
|
-
def group?
|
105
|
-
false
|
106
|
-
end
|
107
|
-
|
108
|
-
def file?
|
109
|
-
false
|
110
|
-
end
|
111
|
-
|
112
|
-
private
|
113
|
-
|
114
|
-
def after_initialize
|
115
|
-
# Do nothing by default
|
116
|
-
end
|
117
|
-
|
118
|
-
# I miss active support...
|
119
|
-
def underscore(string)
|
120
|
-
string.gsub(/::/, '/').
|
121
|
-
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
122
|
-
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
123
|
-
tr("-", "_").
|
124
|
-
downcase
|
125
|
-
end
|
126
|
-
|
127
|
-
end
|
128
|
-
|
129
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
module Vendor::XCode::Proxy
|
2
|
-
|
3
|
-
class PBXFileReference < Vendor::XCode::Proxy::Base
|
4
|
-
|
5
|
-
reference :file_ref
|
6
|
-
|
7
|
-
def file?
|
8
|
-
true
|
9
|
-
end
|
10
|
-
|
11
|
-
def full_path
|
12
|
-
parts = []
|
13
|
-
current = self
|
14
|
-
|
15
|
-
while current
|
16
|
-
parts.push current.path if current.respond_to?(:path) && !current.path.nil?
|
17
|
-
current = current.parent
|
18
|
-
end
|
19
|
-
|
20
|
-
parts.reverse.join("/")
|
21
|
-
end
|
22
|
-
|
23
|
-
def self.file_type_from_extension(extension)
|
24
|
-
case extension
|
25
|
-
when /.(png|jpg)/ then "image.#{$1}"
|
26
|
-
when ".h" then "sourcecode.c.h"
|
27
|
-
when ".m" then "sourcecode.c.objc"
|
28
|
-
when ".c" then "sourcecode.c.c"
|
29
|
-
when ".bundle" then "wrapper.plug-in"
|
30
|
-
when ".framework" then "wrapper.framework"
|
31
|
-
when ".a" then "archive.ar"
|
32
|
-
when ".strings" then "text.plist.strings"
|
33
|
-
when ".plist" then "text.plist.xml"
|
34
|
-
when ".dylib" then "compiled.mach-o.dylib"
|
35
|
-
else "unknown"
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
module Vendor::XCode::Proxy
|
2
|
-
|
3
|
-
class PBXGroup < Vendor::XCode::Proxy::Base
|
4
|
-
|
5
|
-
reference :children
|
6
|
-
|
7
|
-
def name
|
8
|
-
@attributes['name'] || @attributes['path']
|
9
|
-
end
|
10
|
-
|
11
|
-
def full_path
|
12
|
-
parts = []
|
13
|
-
current = self
|
14
|
-
|
15
|
-
while current
|
16
|
-
parts.push current.name
|
17
|
-
current = current.parent
|
18
|
-
end
|
19
|
-
|
20
|
-
parts.reverse.compact.join("/")
|
21
|
-
end
|
22
|
-
|
23
|
-
def group?
|
24
|
-
true
|
25
|
-
end
|
26
|
-
|
27
|
-
private
|
28
|
-
|
29
|
-
def after_initialize
|
30
|
-
children.each { |child| child.parent = self }
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
@@ -1,635 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Vendor::XCode::Project do
|
4
|
-
|
5
|
-
before :each do
|
6
|
-
@project = Vendor::XCode::Project.new(File.join(PROJECT_RESOURCE_PATH, "ProjectWithSpecs/ProjectWithSpecs.xcodeproj"))
|
7
|
-
end
|
8
|
-
|
9
|
-
context "#initialize" do
|
10
|
-
|
11
|
-
context "ProjectWithSpecs.xcodeproj" do
|
12
|
-
|
13
|
-
it "should load all the objects" do
|
14
|
-
@project.objects.length.should == 52
|
15
|
-
end
|
16
|
-
|
17
|
-
it "should load the object version" do
|
18
|
-
@project.object_version.should == 46
|
19
|
-
end
|
20
|
-
|
21
|
-
it "should load the archive version" do
|
22
|
-
@project.archive_version.should == 1
|
23
|
-
end
|
24
|
-
|
25
|
-
it "should populate the root object" do
|
26
|
-
@project.root_object.should_not be_nil
|
27
|
-
end
|
28
|
-
|
29
|
-
it "should not be dirty" do
|
30
|
-
@project.dirty?.should be_false
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
|
-
context "TabBarWithUnitTests.xcodeproj" do
|
36
|
-
|
37
|
-
it "should parse and load all the objects" do
|
38
|
-
project = Vendor::XCode::Project.new(File.join(PROJECT_RESOURCE_PATH, "TabBarWithUnitTests/TabBarWithUnitTests.xcodeproj"))
|
39
|
-
|
40
|
-
project.objects.length.should == 78
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
context "RestKitProject.xcodeproj" do
|
46
|
-
|
47
|
-
it "should parse and load all the objects" do
|
48
|
-
project = Vendor::XCode::Project.new(File.join(PROJECT_RESOURCE_PATH, "RestKitProject/RestKitProject.xcodeproj"))
|
49
|
-
|
50
|
-
project.objects.length.should == 69
|
51
|
-
end
|
52
|
-
|
53
|
-
end
|
54
|
-
|
55
|
-
context "other projects in the ProjectsToTestParsing folder" do
|
56
|
-
|
57
|
-
projects = Dir[File.join(PROJECT_RESOURCE_PATH, "ProjectsToTestParsing/*.xcodeproj")]
|
58
|
-
|
59
|
-
projects.each do |p|
|
60
|
-
it "should correctly load and save '#{p}'" do
|
61
|
-
project = Vendor::XCode::Project.new(p)
|
62
|
-
contents = File.readlines(File.join(p, "project.pbxproj")).join("\n")
|
63
|
-
original = Vendor::Plist.parse_ascii(contents)
|
64
|
-
saved = Vendor::Plist.parse_ascii(project.to_ascii_plist)
|
65
|
-
|
66
|
-
original.should == saved
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
end
|
71
|
-
|
72
|
-
end
|
73
|
-
|
74
|
-
context "#name" do
|
75
|
-
|
76
|
-
it "should have the correct project name" do
|
77
|
-
@project.name.should == "ProjectWithSpecs"
|
78
|
-
end
|
79
|
-
|
80
|
-
end
|
81
|
-
|
82
|
-
context "#find_object" do
|
83
|
-
|
84
|
-
it "should return the object mapped to the id" do
|
85
|
-
@project.find_object('5378747F140109AE00D9B746').should == @project.root_object
|
86
|
-
end
|
87
|
-
|
88
|
-
end
|
89
|
-
|
90
|
-
context "#find_target" do
|
91
|
-
|
92
|
-
it "should return the target" do
|
93
|
-
@project.find_target('Specs').should == @project.root_object.targets.first
|
94
|
-
end
|
95
|
-
|
96
|
-
it "should return nil if one cannot be found" do
|
97
|
-
@project.find_target('Ruut').should be_nil
|
98
|
-
end
|
99
|
-
|
100
|
-
end
|
101
|
-
|
102
|
-
context "#find_group" do
|
103
|
-
|
104
|
-
context 'when finding an existing group' do
|
105
|
-
|
106
|
-
it "should return the group" do
|
107
|
-
@project.find_group("Specs/Supporting Files").should == @project.root_object.main_group.children.first.children.first
|
108
|
-
end
|
109
|
-
|
110
|
-
end
|
111
|
-
|
112
|
-
context "when looking for a group that doens't exist" do
|
113
|
-
|
114
|
-
it "should return nil" do
|
115
|
-
@project.find_group("Does/Not/Exist").should == nil
|
116
|
-
end
|
117
|
-
|
118
|
-
end
|
119
|
-
|
120
|
-
end
|
121
|
-
|
122
|
-
context '#create_group' do
|
123
|
-
|
124
|
-
context 'when finding an existing group' do
|
125
|
-
|
126
|
-
it "should return the group" do
|
127
|
-
@project.create_group("Specs/Supporting Files").should == @project.root_object.main_group.children.first.children.first
|
128
|
-
end
|
129
|
-
|
130
|
-
end
|
131
|
-
|
132
|
-
context 'when creating a group' do
|
133
|
-
|
134
|
-
before :each do
|
135
|
-
@group = @project.create_group("Specs/Supporting Files/Something/Goes Inside/Here")
|
136
|
-
|
137
|
-
@supporting_files_group = @project.root_object.main_group.children.first.children.first
|
138
|
-
@something_group = @supporting_files_group.children.last
|
139
|
-
@inside_group = @something_group.children.last
|
140
|
-
@here_group = @inside_group.children.last
|
141
|
-
end
|
142
|
-
|
143
|
-
it "should mark the project as dirty" do
|
144
|
-
@project.dirty.should be_true
|
145
|
-
end
|
146
|
-
|
147
|
-
it 'should create it in the correct location' do
|
148
|
-
@here_group.should_not be_nil
|
149
|
-
end
|
150
|
-
|
151
|
-
it 'should give the new groups the right names' do
|
152
|
-
@something_group.name.should == "Something"
|
153
|
-
@inside_group.name.should == "Goes Inside"
|
154
|
-
@here_group.name.should == "Here"
|
155
|
-
end
|
156
|
-
|
157
|
-
it 'should give the new groups the correct source tree property' do
|
158
|
-
@here_group.source_tree.should == "<group>"
|
159
|
-
end
|
160
|
-
|
161
|
-
it 'should give the new groups an ID' do
|
162
|
-
@here_group.source_tree.should_not be_nil
|
163
|
-
end
|
164
|
-
|
165
|
-
it 'should give the new groups a valid ISA' do
|
166
|
-
@here_group.isa.should == 'PBXGroup'
|
167
|
-
end
|
168
|
-
|
169
|
-
it "should set the parent" do
|
170
|
-
@here_group.parent.should == @inside_group
|
171
|
-
end
|
172
|
-
|
173
|
-
end
|
174
|
-
|
175
|
-
end
|
176
|
-
|
177
|
-
context "#remove_group" do
|
178
|
-
|
179
|
-
before :each do
|
180
|
-
@temp_path = TempProject.create(File.join(PROJECT_RESOURCE_PATH, "UtilityApplication"))
|
181
|
-
@temp_project = Vendor::XCode::Project.new(File.join(@temp_path, "UtilityApplication.xcodeproj"))
|
182
|
-
|
183
|
-
@group = @temp_project.find_group("UtilityApplication/Supporting Files")
|
184
|
-
end
|
185
|
-
|
186
|
-
context "removing an existing group" do
|
187
|
-
|
188
|
-
it "should mark the project as dirty" do
|
189
|
-
remove_group
|
190
|
-
|
191
|
-
@temp_project.dirty.should be_true
|
192
|
-
end
|
193
|
-
|
194
|
-
it "should return true" do
|
195
|
-
remove_group.should be_true
|
196
|
-
end
|
197
|
-
|
198
|
-
it "should remove the group" do
|
199
|
-
remove_group
|
200
|
-
|
201
|
-
@temp_project.find_group("UtilityApplication/Supporting Files").should be_nil
|
202
|
-
end
|
203
|
-
|
204
|
-
it "should remove the children from the group" do
|
205
|
-
remove_group
|
206
|
-
|
207
|
-
@temp_project.find_group("UtilityApplication").children.map(&:id).should_not include(@group.id)
|
208
|
-
end
|
209
|
-
|
210
|
-
it "should remove the files from the file system" do
|
211
|
-
file = File.join(@temp_path, "UtilityApplication", "main.m")
|
212
|
-
File.exist?(file).should be_true
|
213
|
-
|
214
|
-
remove_group
|
215
|
-
File.exist?(file).should be_false
|
216
|
-
end
|
217
|
-
|
218
|
-
it "should remove the files from all the targets" do
|
219
|
-
ids = @temp_project.find_group("UtilityApplication/Classes").children.map(&:id)
|
220
|
-
@temp_project.remove_group("UtilityApplication/Classes")
|
221
|
-
|
222
|
-
@temp_project.root_object.targets.each do |target|
|
223
|
-
ids.each do |id|
|
224
|
-
target.build_phases.each do |phase|
|
225
|
-
phase.files.map(&:file_ref).map(&:id).should_not include(id)
|
226
|
-
end
|
227
|
-
end
|
228
|
-
end
|
229
|
-
end
|
230
|
-
|
231
|
-
private
|
232
|
-
|
233
|
-
def remove_group
|
234
|
-
@temp_project.remove_group("UtilityApplication/Supporting Files")
|
235
|
-
end
|
236
|
-
|
237
|
-
end
|
238
|
-
|
239
|
-
context "removing a group that doesn't exist" do
|
240
|
-
|
241
|
-
subject { @temp_project.remove_group("Doest/Not/Exist") }
|
242
|
-
|
243
|
-
it "should return false" do
|
244
|
-
subject.should be_false
|
245
|
-
end
|
246
|
-
|
247
|
-
end
|
248
|
-
|
249
|
-
end
|
250
|
-
|
251
|
-
context "#add_framework" do
|
252
|
-
|
253
|
-
before :each do
|
254
|
-
@temp_path = TempProject.create(File.join(PROJECT_RESOURCE_PATH, "MultipleTargets"))
|
255
|
-
@temp_project = Vendor::XCode::Project.new(File.join(@temp_path, "MultipleTargets.xcodeproj"))
|
256
|
-
end
|
257
|
-
|
258
|
-
it "should add the framework to the right targets" do
|
259
|
-
@temp_project.should_receive(:add_file).with({ :targets => @temp_project.find_target("Integration"),
|
260
|
-
:file => "System/Library/Frameworks/KeithPitt.framework",
|
261
|
-
:path => "Frameworks", :name => "KeithPitt.framework",
|
262
|
-
:source_tree => :sdkroot })
|
263
|
-
|
264
|
-
@temp_project.add_framework "KeithPitt.framework", :targets => [ "Integration", "AggregateTarget" ]
|
265
|
-
end
|
266
|
-
|
267
|
-
it "should add the dylibs to the right targets" do
|
268
|
-
@temp_project.should_receive(:add_file).with({ :targets => @temp_project.find_target("Integration"),
|
269
|
-
:file => "usr/lib/libz.dylib",
|
270
|
-
:path => "Frameworks", :name => "libz.dylib",
|
271
|
-
:source_tree => :sdkroot })
|
272
|
-
|
273
|
-
@temp_project.add_framework "libz.dylib", :targets => "Integration"
|
274
|
-
end
|
275
|
-
|
276
|
-
it "shouldn't add the framework if it already exists" do
|
277
|
-
@temp_project.should_not_receive(:add_file)
|
278
|
-
|
279
|
-
@temp_project.add_framework "Foundation.framework", :targets => "Integration"
|
280
|
-
end
|
281
|
-
|
282
|
-
end
|
283
|
-
|
284
|
-
context "#add_build_setting" do
|
285
|
-
|
286
|
-
before :each do
|
287
|
-
@temp_path = TempProject.create(File.join(PROJECT_RESOURCE_PATH, "MultipleTargets"))
|
288
|
-
@temp_project = Vendor::XCode::Project.new(File.join(@temp_path, "MultipleTargets.xcodeproj"))
|
289
|
-
@target = @temp_project.find_target("Specs")
|
290
|
-
end
|
291
|
-
|
292
|
-
it "should add build settings if they are not there" do
|
293
|
-
@temp_project.add_build_setting "SOMETHING", "YES", :targets => "Specs", :changer => "SomeLib"
|
294
|
-
|
295
|
-
@target.build_configuration_list.build_configurations.each do |config|
|
296
|
-
config.build_settings.keys.should include("SOMETHING")
|
297
|
-
config.build_settings["SOMETHING"].should == "YES"
|
298
|
-
end
|
299
|
-
end
|
300
|
-
|
301
|
-
it "should create an array of options if the setting is known to be a selection" do
|
302
|
-
@temp_project.add_build_setting "OTHER_LDFLAGS", "-ObjC", :targets => "Specs", :changer => "SomeLib"
|
303
|
-
@temp_project.add_build_setting "OTHER_LDFLAGS", "-Something", :targets => "Specs", :changer => "SomeLib"
|
304
|
-
|
305
|
-
@target.build_configuration_list.build_configurations.each do |config|
|
306
|
-
config.build_settings["OTHER_LDFLAGS"].should == [ "-ObjC", "-Something" ]
|
307
|
-
end
|
308
|
-
end
|
309
|
-
|
310
|
-
it "should not duplicate build settings" do
|
311
|
-
@temp_project.add_build_setting "OTHER_LDFLAGS", "-ObjC", :targets => "Specs", :changer => "SomeLib"
|
312
|
-
@temp_project.add_build_setting "OTHER_LDFLAGS", "-ObjC", :targets => "Specs", :changer => "SomeLib"
|
313
|
-
|
314
|
-
@target.build_configuration_list.build_configurations.each do |config|
|
315
|
-
config.build_settings["OTHER_LDFLAGS"].should == "-ObjC"
|
316
|
-
end
|
317
|
-
end
|
318
|
-
|
319
|
-
it "shouldn't change a build setting if it already exists" do
|
320
|
-
@temp_project.add_build_setting "SOMETHING", "YES", :targets => "Specs", :changer => "SomeLib"
|
321
|
-
|
322
|
-
Vendor.ui.should_receive(:warn).with(" Build setting \"SOMETHING\" wanted to change to \"NO\", but it was already \"YES\" in \"Specs/Debug\"").ordered
|
323
|
-
Vendor.ui.should_receive(:warn).with(" Build setting \"SOMETHING\" wanted to change to \"NO\", but it was already \"YES\" in \"Specs/Release\"").ordered
|
324
|
-
@temp_project.add_build_setting "SOMETHING", "NO", :targets => "Specs", :changer => "SomeLib"
|
325
|
-
|
326
|
-
@target.build_configuration_list.build_configurations.each do |config|
|
327
|
-
config.build_settings.keys.should include("SOMETHING")
|
328
|
-
config.build_settings["SOMETHING"].should == "YES"
|
329
|
-
end
|
330
|
-
end
|
331
|
-
|
332
|
-
it "should mark the project as dirty" do
|
333
|
-
@temp_project.add_build_setting "SOMETHING", "YES", :targets => "Specs", :changer => "SomeLib"
|
334
|
-
|
335
|
-
@temp_project.dirty?.should be_true
|
336
|
-
end
|
337
|
-
|
338
|
-
end
|
339
|
-
|
340
|
-
context '#add_file' do
|
341
|
-
|
342
|
-
let(:first_file) { File.join(SOURCE_RESOURCE_PATH, "SecondViewController.h") }
|
343
|
-
let(:second_file) { File.join(SOURCE_RESOURCE_PATH, "SecondViewController.m") }
|
344
|
-
|
345
|
-
before :each do
|
346
|
-
@temp_path = TempProject.create(File.join(PROJECT_RESOURCE_PATH, "ProjectWithSpecs"))
|
347
|
-
@temp_project = Vendor::XCode::Project.new(File.join(@temp_path, "ProjectWithSpecs.xcodeproj"))
|
348
|
-
|
349
|
-
@target = @temp_project.find_target("Specs")
|
350
|
-
end
|
351
|
-
|
352
|
-
context "with a source tree of :group" do
|
353
|
-
|
354
|
-
before :each do
|
355
|
-
@first_file_added = @temp_project.add_file :targets => [ @target ], :file => first_file,
|
356
|
-
:path => "Controllers/SecondViewController", :source_tree => :group
|
357
|
-
@second_file_added = @temp_project.add_file :targets => [ @target ], :file => second_file,
|
358
|
-
:path => "Controllers/SecondViewController", :source_tree => :group
|
359
|
-
end
|
360
|
-
|
361
|
-
it "should mark the project as dirty" do
|
362
|
-
@temp_project.dirty.should be_true
|
363
|
-
end
|
364
|
-
|
365
|
-
it 'should add the file to the filesystem' do
|
366
|
-
new_first_path = File.join(@temp_path, "Controllers", "SecondViewController", "SecondViewController.h")
|
367
|
-
new_second_path = File.join(@temp_path, "Controllers", "SecondViewController", "SecondViewController.m")
|
368
|
-
|
369
|
-
File.exists?(new_first_path).should be_true
|
370
|
-
File.exists?(new_second_path).should be_true
|
371
|
-
end
|
372
|
-
|
373
|
-
it 'should add it as the correct file type' do
|
374
|
-
@first_file_added.last_known_file_type.should == "sourcecode.c.h"
|
375
|
-
@second_file_added.last_known_file_type.should == "sourcecode.c.objc"
|
376
|
-
end
|
377
|
-
|
378
|
-
it 'should add the files with the correct path' do
|
379
|
-
@first_file_added.path.should == "SecondViewController.h"
|
380
|
-
@second_file_added.path.should == "SecondViewController.m"
|
381
|
-
end
|
382
|
-
|
383
|
-
it 'should have the correct ISA' do
|
384
|
-
@first_file_added.isa.should == "PBXFileReference"
|
385
|
-
@second_file_added.isa.should == "PBXFileReference"
|
386
|
-
end
|
387
|
-
|
388
|
-
it 'should have an ID' do
|
389
|
-
@first_file_added.id.should_not be_nil
|
390
|
-
@second_file_added.id.should_not be_nil
|
391
|
-
end
|
392
|
-
|
393
|
-
it 'should add it to the correct group' do
|
394
|
-
group = @temp_project.create_group("Controllers/SecondViewController")
|
395
|
-
|
396
|
-
group.children[0].should == @first_file_added
|
397
|
-
group.children[1].should == @second_file_added
|
398
|
-
end
|
399
|
-
|
400
|
-
it "should set the parent" do
|
401
|
-
@first_file_added.parent.should == @temp_project.find_group("Controllers/SecondViewController")
|
402
|
-
end
|
403
|
-
|
404
|
-
it 'should still save' do
|
405
|
-
@temp_project.save
|
406
|
-
end
|
407
|
-
|
408
|
-
it 'should add it to the build targets specified' do
|
409
|
-
build_phase = @target.build_phases.first
|
410
|
-
|
411
|
-
build_phase.files[-2].file_ref.should_not == @first_file_added
|
412
|
-
|
413
|
-
build_phase.files[-1].isa.should == "PBXBuildFile"
|
414
|
-
build_phase.files[-1].should be_kind_of(Vendor::XCode::Proxy::PBXBuildFile)
|
415
|
-
build_phase.files[-1].file_ref.should == @second_file_added
|
416
|
-
end
|
417
|
-
|
418
|
-
it "should throw an error if you try and add to a target that doesn't exist" do
|
419
|
-
expect do
|
420
|
-
@temp_project.add_file :targets => [ "Blah" ], :file => first_file,
|
421
|
-
:path => "Controllers/SecondViewController", :source_tree => :group
|
422
|
-
end.should raise_error(StandardError, "Could not find target 'Blah' in project 'ProjectWithSpecs'")
|
423
|
-
end
|
424
|
-
|
425
|
-
end
|
426
|
-
|
427
|
-
context "with a source tree of :sdkroot" do
|
428
|
-
|
429
|
-
before :each do
|
430
|
-
@first_file_added = @temp_project.add_file :targets => [ @target ], :file => "System/Library/Frameworks/Foundation.framework",
|
431
|
-
:path => "Frameworks", :source_tree => :sdkroot
|
432
|
-
@second_file_added = @temp_project.add_file :targets => [ @target ], :file => "System/Library/Frameworks/CoreGraphics.framework",
|
433
|
-
:path => "Frameworks", :source_tree => :sdkroot
|
434
|
-
end
|
435
|
-
|
436
|
-
it "should mark the project as dirty" do
|
437
|
-
@temp_project.dirty.should be_true
|
438
|
-
end
|
439
|
-
|
440
|
-
it 'should add it as the correct file type' do
|
441
|
-
@first_file_added.last_known_file_type.should == "wrapper.framework"
|
442
|
-
@second_file_added.last_known_file_type.should == "wrapper.framework"
|
443
|
-
end
|
444
|
-
|
445
|
-
it 'should add the files with the correct path' do
|
446
|
-
@first_file_added.path.should == "System/Library/Frameworks/Foundation.framework"
|
447
|
-
@second_file_added.path.should == "System/Library/Frameworks/CoreGraphics.framework"
|
448
|
-
end
|
449
|
-
|
450
|
-
it 'should have an ID' do
|
451
|
-
@first_file_added.id.should_not be_nil
|
452
|
-
@second_file_added.id.should_not be_nil
|
453
|
-
end
|
454
|
-
|
455
|
-
it 'should add it to the correct group' do
|
456
|
-
group = @temp_project.create_group("Frameworks")
|
457
|
-
|
458
|
-
group.children[-2].should == @first_file_added
|
459
|
-
group.children[-1].should == @second_file_added
|
460
|
-
end
|
461
|
-
|
462
|
-
it 'should still save' do
|
463
|
-
@temp_project.save
|
464
|
-
end
|
465
|
-
|
466
|
-
it 'should add it to the build targets specified' do
|
467
|
-
build_phase = @target.build_phases[1]
|
468
|
-
|
469
|
-
build_phase.files[-2].should be_kind_of(Vendor::XCode::Proxy::PBXBuildFile)
|
470
|
-
build_phase.files[-2].file_ref.should == @first_file_added
|
471
|
-
build_phase.files[-1].should be_kind_of(Vendor::XCode::Proxy::PBXBuildFile)
|
472
|
-
build_phase.files[-1].file_ref.should == @second_file_added
|
473
|
-
end
|
474
|
-
|
475
|
-
end
|
476
|
-
|
477
|
-
context "with a source tree of :absoulte" do
|
478
|
-
|
479
|
-
before :each do
|
480
|
-
@first_file_added = @temp_project.add_file :targets => [ @target ], :file => first_file,
|
481
|
-
:path => "Controllers/SecondViewController", :source_tree => :absolute
|
482
|
-
@second_file_added = @temp_project.add_file :targets => [ @target ], :file => second_file,
|
483
|
-
:path => "Controllers/SecondViewController", :source_tree => :absolute
|
484
|
-
end
|
485
|
-
|
486
|
-
it "should mark the project as dirty" do
|
487
|
-
@temp_project.dirty.should be_true
|
488
|
-
end
|
489
|
-
|
490
|
-
it 'should add it as the correct file type' do
|
491
|
-
@first_file_added.last_known_file_type.should == "sourcecode.c.h"
|
492
|
-
@second_file_added.last_known_file_type.should == "sourcecode.c.objc"
|
493
|
-
end
|
494
|
-
|
495
|
-
|
496
|
-
it 'should add the files with the correct path' do
|
497
|
-
@first_file_added.path.should == first_file
|
498
|
-
@second_file_added.path.should == second_file
|
499
|
-
end
|
500
|
-
|
501
|
-
it 'should add the files with the correct names' do
|
502
|
-
@first_file_added.name.should == "SecondViewController.h"
|
503
|
-
@second_file_added.name.should == "SecondViewController.m"
|
504
|
-
end
|
505
|
-
|
506
|
-
it 'should have the correct ISA' do
|
507
|
-
@first_file_added.isa.should == "PBXFileReference"
|
508
|
-
@second_file_added.isa.should == "PBXFileReference"
|
509
|
-
end
|
510
|
-
|
511
|
-
it 'should have an ID' do
|
512
|
-
@first_file_added.id.should_not be_nil
|
513
|
-
@second_file_added.id.should_not be_nil
|
514
|
-
end
|
515
|
-
|
516
|
-
it 'should add it to the correct group' do
|
517
|
-
group = @temp_project.create_group("Controllers/SecondViewController")
|
518
|
-
|
519
|
-
group.children[0].should == @first_file_added
|
520
|
-
group.children[1].should == @second_file_added
|
521
|
-
end
|
522
|
-
|
523
|
-
it 'should still save' do
|
524
|
-
@temp_project.save
|
525
|
-
end
|
526
|
-
|
527
|
-
it 'should add it to the build targets specified' do
|
528
|
-
build_phase = @target.build_phases.first
|
529
|
-
|
530
|
-
build_phase.files[-2].file_ref.should_not == @first_file_added
|
531
|
-
|
532
|
-
build_phase.files[-1].should be_kind_of(Vendor::XCode::Proxy::PBXBuildFile)
|
533
|
-
build_phase.files[-1].file_ref.should == @second_file_added
|
534
|
-
end
|
535
|
-
|
536
|
-
end
|
537
|
-
|
538
|
-
context 'should raise an error if' do
|
539
|
-
|
540
|
-
it 'there is no path set' do
|
541
|
-
expect do
|
542
|
-
@temp_project.add_file :targets => "Specs", :file => first_file
|
543
|
-
end.to raise_exception(StandardError, "Missing :path option")
|
544
|
-
end
|
545
|
-
|
546
|
-
it 'there is no file set' do
|
547
|
-
expect do
|
548
|
-
@temp_project.add_file :targets => "Specs", :path => "ASD"
|
549
|
-
end.to raise_exception(StandardError, "Missing :file option")
|
550
|
-
end
|
551
|
-
|
552
|
-
it "the file doesn't exist" do
|
553
|
-
expect do
|
554
|
-
@temp_project.add_file :targets => "Ruut", :file => "foo",
|
555
|
-
:path => "Controllers/SecondViewController", :source_tree => :group
|
556
|
-
end.to raise_exception(StandardError, "Could not find file `foo`")
|
557
|
-
end
|
558
|
-
|
559
|
-
it "you don't pass a source tree option" do
|
560
|
-
expect do
|
561
|
-
@temp_project.add_file :targets => "Specs", :path => "ASD", :file => "foo"
|
562
|
-
end.to raise_exception(StandardError, "Missing :source_tree option")
|
563
|
-
end
|
564
|
-
|
565
|
-
it "the source tree option is invalid" do
|
566
|
-
expect do
|
567
|
-
@temp_project.add_file :targets => "Specs", :path => "ASD",
|
568
|
-
:file => first_file, :source_tree => :foo
|
569
|
-
end.to raise_exception(StandardError, "Invalid :source_tree option `foo`")
|
570
|
-
end
|
571
|
-
|
572
|
-
end
|
573
|
-
|
574
|
-
end
|
575
|
-
|
576
|
-
context "#valid?" do
|
577
|
-
|
578
|
-
it "should return true the plist format is valid" do
|
579
|
-
@project.valid?.should be_true
|
580
|
-
end
|
581
|
-
|
582
|
-
it "should raise an error if there is an invalid format" do
|
583
|
-
@project.should_receive(:to_ascii_plist).twice.and_return { "asd; { f5him" }
|
584
|
-
|
585
|
-
@project.valid?.should be_false
|
586
|
-
end
|
587
|
-
|
588
|
-
end
|
589
|
-
|
590
|
-
context "#save" do
|
591
|
-
|
592
|
-
before :each do
|
593
|
-
@temp_path = TempProject.create(File.join(PROJECT_RESOURCE_PATH, "UtilityApplication"))
|
594
|
-
@temp_project = Vendor::XCode::Project.new(File.join(@temp_path, "UtilityApplication.xcodeproj"))
|
595
|
-
end
|
596
|
-
|
597
|
-
it "should save a backup of the project" do
|
598
|
-
@temp_project.create_group("Specs/Supporting Files/Something/Goes Inside/Here")
|
599
|
-
@temp_project.save
|
600
|
-
|
601
|
-
File.exist?(File.join(File.dirname(@temp_project.project_folder), "UtilityApplication.vendorbackup")).should be_true
|
602
|
-
end
|
603
|
-
|
604
|
-
it "should save another backup if the project exists" do
|
605
|
-
@temp_project.create_group("Specs/Supporting Files/Something/Goes Inside/Here")
|
606
|
-
@temp_project.save
|
607
|
-
File.exist?(File.join(File.dirname(@temp_project.project_folder), "UtilityApplication.vendorbackup")).should be_true
|
608
|
-
|
609
|
-
@temp_project.create_group("Specs/Supporting Files/Something/Goes Inside/Here/I/Think")
|
610
|
-
@temp_project.save
|
611
|
-
File.exist?(File.join(File.dirname(@temp_project.project_folder), "UtilityApplication.vendorbackup.1")).should be_true
|
612
|
-
|
613
|
-
@temp_project.create_group("Specs/Supporting Files/Something/Goes Inside/Here/I/Think")
|
614
|
-
@temp_project.save
|
615
|
-
File.exist?(File.join(File.dirname(@temp_project.project_folder), "UtilityApplication.vendorbackup.2")).should be_true
|
616
|
-
end
|
617
|
-
|
618
|
-
end
|
619
|
-
|
620
|
-
context "#to_ascii_plist" do
|
621
|
-
|
622
|
-
it "should convert it to the correct format" do
|
623
|
-
# Reload the project from the filesystem
|
624
|
-
@project.reload
|
625
|
-
|
626
|
-
contents = File.readlines(File.join(PROJECT_RESOURCE_PATH, "ProjectWithSpecs/ProjectWithSpecs.xcodeproj", "project.pbxproj")).join("\n")
|
627
|
-
original = Vendor::Plist.parse_ascii(contents)
|
628
|
-
saved = Vendor::Plist.parse_ascii(@project.to_ascii_plist)
|
629
|
-
|
630
|
-
original.should == saved
|
631
|
-
end
|
632
|
-
|
633
|
-
end
|
634
|
-
|
635
|
-
end
|