vendor 0.0.1 → 0.0.2

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.
Files changed (166) hide show
  1. data/.gitignore +1 -0
  2. data/Gemfile.lock +2 -4
  3. data/LICENSE +20 -0
  4. data/Readme.markdown +91 -10
  5. data/bin/vendor +5 -53
  6. data/lib/vendor.rb +37 -26
  7. data/lib/vendor/api.rb +1 -1
  8. data/lib/vendor/cli.rb +3 -15
  9. data/lib/vendor/cli/app.rb +140 -0
  10. data/lib/vendor/cli/auth.rb +6 -4
  11. data/lib/vendor/cli/console.rb +25 -0
  12. data/lib/vendor/extensions/string.rb +1 -1
  13. data/lib/vendor/template.rb +55 -0
  14. data/lib/vendor/templates/Vendorfile +3 -0
  15. data/lib/vendor/templates/vendorspec +15 -0
  16. data/lib/vendor/ui.rb +62 -0
  17. data/lib/vendor/vendor_file.rb +12 -0
  18. data/lib/vendor/vendor_file/dsl.rb +54 -0
  19. data/lib/vendor/vendor_file/library.rb +16 -0
  20. data/lib/vendor/vendor_file/library/base.rb +95 -0
  21. data/lib/vendor/vendor_file/library/git.rb +71 -0
  22. data/lib/vendor/vendor_file/library/local.rb +22 -0
  23. data/lib/vendor/vendor_file/library/remote.rb +18 -0
  24. data/lib/vendor/vendor_file/loader.rb +36 -0
  25. data/lib/vendor/vendor_file/source.rb +21 -0
  26. data/lib/vendor/vendor_spec.rb +11 -0
  27. data/lib/vendor/vendor_spec/builder.rb +10 -3
  28. data/lib/vendor/version.rb +1 -1
  29. data/lib/vendor/xcode.rb +10 -0
  30. data/lib/vendor/xcode/project.rb +132 -19
  31. data/lib/vendor/xcode/proxy.rb +28 -0
  32. data/lib/vendor/xcode/{object.rb → proxy/base.rb} +52 -25
  33. data/lib/vendor/xcode/proxy/pbx_build_file.rb +9 -0
  34. data/lib/vendor/xcode/proxy/pbx_container_item_proxy.rb +8 -0
  35. data/lib/vendor/xcode/proxy/pbx_file_reference.rb +39 -0
  36. data/lib/vendor/xcode/proxy/pbx_frameworks_build_phase.rb +9 -0
  37. data/lib/vendor/xcode/proxy/pbx_group.rb +35 -0
  38. data/lib/vendor/xcode/{objects → proxy}/pbx_native_target.rb +2 -2
  39. data/lib/vendor/xcode/{objects → proxy}/pbx_project.rb +2 -2
  40. data/lib/vendor/xcode/proxy/pbx_resources_build_phase.rb +7 -0
  41. data/lib/vendor/xcode/proxy/pbx_shell_script_build_phase.rb +7 -0
  42. data/lib/vendor/xcode/proxy/pbx_sources_build_phase.rb +9 -0
  43. data/lib/vendor/xcode/proxy/pbx_target_dependency.rb +7 -0
  44. data/lib/vendor/xcode/proxy/pbx_variant_group.rb +7 -0
  45. data/lib/vendor/xcode/proxy/xc_build_configuration.rb +7 -0
  46. data/lib/vendor/xcode/proxy/xc_configuration_list.rb +9 -0
  47. data/lib/vendor/xcode/proxy/xc_version_group.rb +7 -0
  48. data/spec/{vendor → lib/vendor}/api_spec.rb +0 -0
  49. data/spec/{vendor → lib/vendor}/cli/auth_spec.rb +1 -1
  50. data/spec/{vendor → lib/vendor}/config_spec.rb +1 -1
  51. data/spec/lib/vendor/template_spec.rb +36 -0
  52. data/spec/lib/vendor/vendor_file/dsl_spec.rb +5 -0
  53. data/spec/lib/vendor/vendor_file/library/base_spec.rb +148 -0
  54. data/spec/lib/vendor/vendor_file/library/git_spec.rb +33 -0
  55. data/spec/lib/vendor/vendor_file/library/local_spec.rb +19 -0
  56. data/spec/lib/vendor/vendor_file/library/remote_spec.rb +13 -0
  57. data/spec/lib/vendor/vendor_file/loader_spec.rb +102 -0
  58. data/spec/lib/vendor/vendor_file/source_spec.rb +17 -0
  59. data/spec/{vendor → lib/vendor}/vendor_spec/builder_spec.rb +0 -0
  60. data/spec/{vendor → lib/vendor}/vendor_spec/dsl_spec.rb +0 -0
  61. data/spec/{vendor → lib/vendor}/vendor_spec/loader_spec.rb +1 -1
  62. data/spec/lib/vendor/xcode/project_spec.rb +400 -0
  63. data/spec/{vendor/xcode/object_spec.rb → lib/vendor/xcode/proxy/base_spec.rb} +15 -3
  64. data/spec/lib/vendor/xcode/proxy/pbx_file_reference_spec.rb +25 -0
  65. data/spec/lib/vendor/xcode/proxy/pbx_group_spec.rb +27 -0
  66. data/spec/{vendor/xcode/objects → lib/vendor/xcode/proxy}/pbx_project_spec.rb +1 -1
  67. data/spec/spec_helper.rb +5 -3
  68. data/spec/support/api_stubs.rb +4 -3
  69. data/spec/support/resources/Vendorfile +22 -0
  70. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/BICoreDataCache.mom +0 -0
  71. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/BMMapCalloutView.nib +0 -0
  72. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/Info.plist +0 -0
  73. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/bingmaps_logo.png +0 -0
  74. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/bingmaps_logo@2x.png +0 -0
  75. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/blue_selected_comp.png +0 -0
  76. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/blue_selected_comp@2x.png +0 -0
  77. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/blue_unselected.png +0 -0
  78. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/blue_unselected@2x.png +0 -0
  79. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/blue_unselected_comp.png +0 -0
  80. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/blue_unselected_comp@2x.png +0 -0
  81. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/callout_white.png +0 -0
  82. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/callout_white@2x.png +0 -0
  83. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/green_selected_comp.png +0 -0
  84. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/green_selected_comp@2x.png +0 -0
  85. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/green_unselected.png +0 -0
  86. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/green_unselected@2x.png +0 -0
  87. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/green_unselected_comp.png +0 -0
  88. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/green_unselected_comp@2x.png +0 -0
  89. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/mapConfiguration.plist +0 -0
  90. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/me_dot_128.png +0 -0
  91. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/networkDefaults.plist +0 -0
  92. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/orange_selected_comp.png +0 -0
  93. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/orange_selected_comp@2x.png +0 -0
  94. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/orange_unselected.png +0 -0
  95. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/orange_unselected@2x.png +0 -0
  96. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/orange_unselected_comp.png +0 -0
  97. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/orange_unselected_comp@2x.png +0 -0
  98. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/purple_selected_comp.png +0 -0
  99. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/purple_selected_comp@2x.png +0 -0
  100. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/purple_unselected.png +0 -0
  101. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/purple_unselected@2x.png +0 -0
  102. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/purple_unselected_comp.png +0 -0
  103. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/purple_unselected_comp@2x.png +0 -0
  104. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/red_selected_comp.png +0 -0
  105. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/red_selected_comp@2x.png +0 -0
  106. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/red_unselected.png +0 -0
  107. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/red_unselected@2x.png +0 -0
  108. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/red_unselected_comp.png +0 -0
  109. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/red_unselected_comp@2x.png +0 -0
  110. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/shadow.png +0 -0
  111. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/shadow@2x.png +0 -0
  112. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/yellow_selected_comp.png +0 -0
  113. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/yellow_selected_comp@2x.png +0 -0
  114. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/yellow_unselected.png +0 -0
  115. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/yellow_unselected@2x.png +0 -0
  116. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/yellow_unselected_comp.png +0 -0
  117. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps.Resources.bundle/yellow_unselected_comp@2x.png +0 -0
  118. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps/BMEntity.h +34 -0
  119. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps/BMGeometry.h +67 -0
  120. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps/BMMapView.h +159 -0
  121. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps/BMMarker.h +41 -0
  122. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps/BMMarkerView.h +47 -0
  123. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps/BMPushpinView.h +31 -0
  124. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps/BMReverseGeocoder.h +63 -0
  125. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps/BMTypes.h +25 -0
  126. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps/BMUserLocation.h +26 -0
  127. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/BingMaps/BingMaps.h +210 -0
  128. data/spec/support/resources/cache/base/BingMapsIOS/MapControl/libBingMaps.a +0 -0
  129. data/spec/support/resources/cache/base/BingMapsIOS/README.html +8 -0
  130. data/spec/support/resources/cache/base/DKBenchmark-Manifest/data/DKBenchmark.h +18 -0
  131. data/spec/support/resources/cache/base/DKBenchmark-Manifest/data/DKBenchmark.m +73 -0
  132. data/spec/support/resources/cache/base/DKBenchmark-Manifest/vendor.json +1 -0
  133. data/spec/support/resources/cache/base/DKBenchmark-Vendorspec/DKBenchmark.h +18 -0
  134. data/spec/support/resources/cache/base/DKBenchmark-Vendorspec/DKBenchmark.m +73 -0
  135. data/spec/support/resources/cache/base/DKBenchmark-Vendorspec/DKBenchmark.vendorspec +11 -0
  136. data/spec/support/resources/projects/TabBarWithUnitTests/TabBarWithUnitTests.xcodeproj/project.pbxproj +10 -0
  137. data/spec/support/resources/projects/UtilityApplication/UtilityApplication.xcodeproj/project.pbxproj +288 -0
  138. data/spec/support/resources/projects/UtilityApplication/UtilityApplication/UAAppDelegate.h +15 -0
  139. data/spec/support/resources/projects/UtilityApplication/UtilityApplication/UAAppDelegate.m +60 -0
  140. data/spec/support/resources/projects/UtilityApplication/UtilityApplication/UAFlipsideViewController.h +23 -0
  141. data/spec/support/resources/projects/UtilityApplication/UtilityApplication/UAFlipsideViewController.m +69 -0
  142. data/spec/support/resources/projects/UtilityApplication/UtilityApplication/UAMainViewController.h +13 -0
  143. data/spec/support/resources/projects/UtilityApplication/UtilityApplication/UAMainViewController.m +75 -0
  144. data/spec/support/resources/projects/UtilityApplication/UtilityApplication/UtilityApplication-Info.plist +42 -0
  145. data/spec/support/resources/projects/UtilityApplication/UtilityApplication/UtilityApplication-Prefix.pch +14 -0
  146. data/spec/support/resources/projects/UtilityApplication/UtilityApplication/en.lproj/InfoPlist.strings +2 -0
  147. data/spec/support/resources/projects/UtilityApplication/UtilityApplication/en.lproj/MainStoryboard.storyboard +90 -0
  148. data/spec/support/resources/projects/UtilityApplication/UtilityApplication/main.m +18 -0
  149. data/spec/support/resources/{files → source}/SecondViewController.h +0 -0
  150. data/spec/support/resources/{files → source}/SecondViewController.m +0 -0
  151. data/vendor.gemspec +0 -1
  152. metadata +254 -74
  153. data/LICENCE +0 -19
  154. data/lib/vendor/xcode/objects/pbx_build_file.rb +0 -9
  155. data/lib/vendor/xcode/objects/pbx_container_item_proxy.rb +0 -8
  156. data/lib/vendor/xcode/objects/pbx_file_reference.rb +0 -21
  157. data/lib/vendor/xcode/objects/pbx_frameworks_build_phase.rb +0 -9
  158. data/lib/vendor/xcode/objects/pbx_group.rb +0 -13
  159. data/lib/vendor/xcode/objects/pbx_resources_build_phase.rb +0 -7
  160. data/lib/vendor/xcode/objects/pbx_shell_script_build_phase.rb +0 -7
  161. data/lib/vendor/xcode/objects/pbx_sources_build_phase.rb +0 -9
  162. data/lib/vendor/xcode/objects/pbx_target_dependency.rb +0 -7
  163. data/lib/vendor/xcode/objects/pbx_variant_group.rb +0 -7
  164. data/lib/vendor/xcode/objects/xc_build_configuration.rb +0 -7
  165. data/lib/vendor/xcode/objects/xc_configuration_list.rb +0 -9
  166. data/spec/vendor/xcode/project_spec.rb +0 -211
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Vendor::VendorFile::Library::Local do
4
+
5
+ let(:lib) { Vendor::VendorFile::Library::Local.new(:path => "~/Development/something") }
6
+
7
+ it "should have a path attribute" do
8
+ lib.path.should == "~/Development/something"
9
+ end
10
+
11
+ describe "#cache_path" do
12
+
13
+ it "should return the path expanded" do
14
+ lib.cache_path.should == File.expand_path("~/Development/something")
15
+ end
16
+
17
+ end
18
+
19
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe Vendor::VendorFile::Library::Remote do
4
+
5
+ let(:lib) { Vendor::VendorFile::Library::Remote.new }
6
+
7
+ it "should have a version attribute" do
8
+ lib.version = "3.0.5"
9
+
10
+ lib.version.should == "3.0.5"
11
+ end
12
+
13
+ end
@@ -0,0 +1,102 @@
1
+ require 'spec_helper'
2
+
3
+ describe Vendor::VendorFile::Loader do
4
+
5
+ let (:loader) { Vendor::VendorFile::Loader.new }
6
+
7
+ context "#initialize" do
8
+
9
+ it "should create a dsl" do
10
+ loader.dsl.should be_kind_of(Vendor::VendorFile::DSL)
11
+ end
12
+
13
+ end
14
+
15
+ context "#load" do
16
+
17
+ before :all do
18
+ loader.load File.join(RESOURCE_PATH, "Vendorfile")
19
+
20
+ @sources = loader.dsl.sources
21
+ @libs = loader.dsl.libraries
22
+ end
23
+
24
+ it "should load all the sources" do
25
+ @sources.map(&:uri).should == [ "http://vendorforge.com", "http://vendorage.com" ]
26
+ end
27
+
28
+ it "should load all the libraries" do
29
+ @libs.count.should == 13
30
+ end
31
+
32
+ it "should load remote librarires" do
33
+ @libs[0].name.should == "Lib"
34
+ @libs[0].version.should be_nil
35
+ @libs[0].should be_kind_of(Vendor::VendorFile::Library::Remote)
36
+
37
+ @libs[1].name.should == "LibWithVersion"
38
+ @libs[1].version.should == "4.1"
39
+ @libs[1].should be_kind_of(Vendor::VendorFile::Library::Remote)
40
+
41
+ @libs[2].name.should == "LibWithGreaterThanVersion"
42
+ @libs[2].version.should == ">=1.0"
43
+ @libs[2].should be_kind_of(Vendor::VendorFile::Library::Remote)
44
+
45
+ @libs[3].name.should == "LibWithApproxVersionAndTarget"
46
+ @libs[3].version.should == "~>1.0"
47
+ @libs[3].targets.should == [ "something" ]
48
+ @libs[3].should be_kind_of(Vendor::VendorFile::Library::Remote)
49
+ end
50
+
51
+ it "should load all the git libraries" do
52
+ @libs[4].name.should == "LibWithGit"
53
+ @libs[4].uri.should == "https://github.com/keithpitt/vendor.git"
54
+ @libs[4].tag.should == "master"
55
+ @libs[4].require.should == "Some/Folder"
56
+ @libs[4].should be_kind_of(Vendor::VendorFile::Library::Git)
57
+
58
+ @libs[5].name.should == "LibWithGitAndBranch"
59
+ @libs[5].uri.should == "https://github.com/keithpitt/vendor.git"
60
+ @libs[5].tag.should == "1.4"
61
+ @libs[5].should be_kind_of(Vendor::VendorFile::Library::Git)
62
+
63
+ @libs[6].name.should == "LibWithGitAndTag"
64
+ @libs[6].uri.should == "https://github.com/keithpitt/vendor.git"
65
+ @libs[6].tag.should == "v0.13.4"
66
+ @libs[6].should be_kind_of(Vendor::VendorFile::Library::Git)
67
+
68
+ @libs[7].name.should == "LibWithGitAndRef"
69
+ @libs[7].uri.should == "https://github.com/keithpitt/vendor.git"
70
+ @libs[7].tag.should == "some-ref"
71
+ @libs[7].should be_kind_of(Vendor::VendorFile::Library::Git)
72
+ end
73
+
74
+ it "should load all the local libraries" do
75
+ @libs[8].name.should == "LibWithPath"
76
+ @libs[8].path.should == "~/Development/Library/Path"
77
+ @libs[8].should be_kind_of(Vendor::VendorFile::Library::Local)
78
+ end
79
+
80
+ it "should load all the libraries with a specific target" do
81
+ @libs[9].name.should == "LibWithSpecificTarget"
82
+ @libs[9].version.should be_nil
83
+ @libs[9].targets.should == [ "UISpecs" ]
84
+
85
+ @libs[10].name.should == "LibWithMultipleTarget"
86
+ @libs[10].version.should be_nil
87
+ @libs[10].targets.should == [ "Specs", "UISpecs" ]
88
+ end
89
+
90
+ it "should load all libraries within a target" do
91
+ @libs[11].name.should == "SpecLib1"
92
+ @libs[11].version.should be_nil
93
+ @libs[11].targets.should == [ "Specs", "UISpecs" ]
94
+
95
+ @libs[12].name.should == "SpecLib2"
96
+ @libs[12].version.should be_nil
97
+ @libs[12].targets.should == [ "Specs", "UISpecs" ]
98
+ end
99
+
100
+ end
101
+
102
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe Vendor::VendorFile::Source do
4
+
5
+ it "should allow you to set a uri via a string" do
6
+ source = Vendor::VendorFile::Source.new("http://google.com")
7
+
8
+ source.uri.should == "http://google.com"
9
+ end
10
+
11
+ it "should allow you to set a uri via a symbol" do
12
+ source = Vendor::VendorFile::Source.new(:vendorforge)
13
+
14
+ source.uri.should == "http://vendorforge.com"
15
+ end
16
+
17
+ end
@@ -7,7 +7,7 @@ describe Vendor::VendorSpec::Loader do
7
7
  context "#initialize" do
8
8
 
9
9
  it "should create a dsl" do
10
- loader.dsl.should be_kind_of?(Vendor::VendorSpec::DSL)
10
+ loader.dsl.should be_kind_of(Vendor::VendorSpec::DSL)
11
11
  end
12
12
 
13
13
  end
@@ -0,0 +1,400 @@
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 == 48
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
+ end
46
+
47
+ context "#name" do
48
+
49
+ it "should have the correct project name" do
50
+ @project.name.should == "ProjectWithSpecs"
51
+ end
52
+
53
+ end
54
+
55
+ context "#find_object" do
56
+
57
+ it "should return the object mapped to the id" do
58
+ @project.find_object('5378747F140109AE00D9B746').should == @project.root_object
59
+ end
60
+
61
+ end
62
+
63
+ context "#find_target" do
64
+
65
+ it "should return the target" do
66
+ @project.find_target('Specs').should == @project.root_object.targets.first
67
+ end
68
+
69
+ it "should return nil if one cannot be found" do
70
+ @project.find_target('Ruut').should be_nil
71
+ end
72
+
73
+ end
74
+
75
+ context "#find_group" do
76
+
77
+ context 'when finding an existing group' do
78
+
79
+ it "should return the group" do
80
+ @project.find_group("Specs/Supporting Files").should == @project.root_object.main_group.children.first.children.first
81
+ end
82
+
83
+ end
84
+
85
+ context "when looking for a group that doens't exist" do
86
+
87
+ it "should return nil" do
88
+ @project.find_group("Does/Not/Exist").should == nil
89
+ end
90
+
91
+ end
92
+
93
+ end
94
+
95
+ context '#create_group' do
96
+
97
+ context 'when finding an existing group' do
98
+
99
+ it "should return the group" do
100
+ @project.create_group("Specs/Supporting Files").should == @project.root_object.main_group.children.first.children.first
101
+ end
102
+
103
+ end
104
+
105
+ context 'when creating a group' do
106
+
107
+ before :each do
108
+ @group = @project.create_group("Specs/Supporting Files/Something/Goes Inside/Here")
109
+
110
+ @supporting_files_group = @project.root_object.main_group.children.first.children.first
111
+ @something_group = @supporting_files_group.children.last
112
+ @inside_group = @something_group.children.last
113
+ @here_group = @inside_group.children.last
114
+ end
115
+
116
+ it "should mark the project as dirty" do
117
+ @project.dirty.should be_true
118
+ end
119
+
120
+ it 'should create it in the correct location' do
121
+ @here_group.should_not be_nil
122
+ end
123
+
124
+ it 'should give the new groups the right names' do
125
+ @something_group.name.should == "Something"
126
+ @inside_group.name.should == "Goes Inside"
127
+ @here_group.name.should == "Here"
128
+ end
129
+
130
+ it 'should give the new groups the correct source tree property' do
131
+ @here_group.source_tree.should == "<group>"
132
+ end
133
+
134
+ it 'should give the new groups an ID' do
135
+ @here_group.source_tree.should_not be_nil
136
+ end
137
+
138
+ it 'should give the new groups a valid ISA' do
139
+ @here_group.isa.should == 'PBXGroup'
140
+ end
141
+
142
+ end
143
+
144
+ end
145
+
146
+ context "#remove_group" do
147
+
148
+ before :each do
149
+ @temp_path = TempProject.create(File.join(PROJECT_RESOURCE_PATH, "UtilityApplication"))
150
+ @temp_project = Vendor::XCode::Project.new(File.join(@temp_path, "UtilityApplication.xcodeproj"))
151
+
152
+ @group = @temp_project.find_group("UtilityApplication/Supporting Files")
153
+ end
154
+
155
+ context "removing an existing group" do
156
+
157
+ it "should mark the project as dirty" do
158
+ remove_group
159
+
160
+ @temp_project.dirty.should be_true
161
+ end
162
+
163
+ it "should return true" do
164
+ remove_group.should be_true
165
+ end
166
+
167
+ it "should remove the group" do
168
+ remove_group
169
+
170
+ @temp_project.find_group("UtilityApplication/Supporting Files").should be_nil
171
+ end
172
+
173
+ it "should remove the children from the group" do
174
+ remove_group
175
+
176
+ @temp_project.find_group("UtilityApplication").children.map(&:id).should_not include(@group.id)
177
+ end
178
+
179
+ it "should remove the files from the file system" do
180
+ file = File.join(@temp_path, "UtilityApplication", "main.m")
181
+ File.exist?(file).should be_true
182
+
183
+ remove_group
184
+ File.exist?(file).should be_false
185
+ end
186
+
187
+ it "should remove the files from the build targets"
188
+
189
+ private
190
+
191
+ def remove_group
192
+ @temp_project.remove_group("UtilityApplication/Supporting Files")
193
+ end
194
+
195
+ end
196
+
197
+ context "removing a group that doesn't exist" do
198
+
199
+ subject { @temp_project.remove_group("Doest/Not/Exist") }
200
+
201
+ it "should return false" do
202
+ subject.should be_false
203
+ end
204
+
205
+ end
206
+
207
+ end
208
+
209
+ context "#remove_file"
210
+
211
+ context '#add_file' do
212
+
213
+ let(:first_file) { File.join(SOURCE_RESOURCE_PATH, "SecondViewController.h") }
214
+ let(:second_file) { File.join(SOURCE_RESOURCE_PATH, "SecondViewController.m") }
215
+
216
+ before :each do
217
+ @temp_path = TempProject.create(File.join(PROJECT_RESOURCE_PATH, "ProjectWithSpecs"))
218
+ @temp_project = Vendor::XCode::Project.new(File.join(@temp_path, "ProjectWithSpecs.xcodeproj"))
219
+
220
+ @target = @temp_project.find_target("Specs")
221
+ end
222
+
223
+ context "with a source tree of :group" do
224
+
225
+ before :each do
226
+ @first_file_added = @temp_project.add_file :targets => [ @target ], :file => first_file,
227
+ :path => "Controllers/SecondViewController", :source_tree => :group
228
+ @second_file_added = @temp_project.add_file :targets => [ @target ], :file => second_file,
229
+ :path => "Controllers/SecondViewController", :source_tree => :group
230
+ end
231
+
232
+ it "should mark the project as dirty" do
233
+ @temp_project.dirty.should be_true
234
+ end
235
+
236
+ it 'should add the file to the filesystem' do
237
+ new_first_path = File.join(@temp_path, "Controllers", "SecondViewController", "SecondViewController.h")
238
+ new_second_path = File.join(@temp_path, "Controllers", "SecondViewController", "SecondViewController.m")
239
+
240
+ File.exists?(new_first_path).should be_true
241
+ File.exists?(new_second_path).should be_true
242
+ end
243
+
244
+ it 'should add it as the correct file type' do
245
+ @first_file_added.last_known_file_type.should == "sourcecode.c.h"
246
+ @second_file_added.last_known_file_type.should == "sourcecode.c.objc"
247
+ end
248
+
249
+ it 'should add the files with the correct path' do
250
+ @first_file_added.path.should == "SecondViewController.h"
251
+ @second_file_added.path.should == "SecondViewController.m"
252
+ end
253
+
254
+ it 'should have the correct ISA' do
255
+ @first_file_added.isa.should == "PBXFileReference"
256
+ @second_file_added.isa.should == "PBXFileReference"
257
+ end
258
+
259
+ it 'should have an ID' do
260
+ @first_file_added.id.should_not be_nil
261
+ @second_file_added.id.should_not be_nil
262
+ end
263
+
264
+ it 'should add it to the correct group' do
265
+ group = @temp_project.create_group("Controllers/SecondViewController")
266
+
267
+ group.children[0].should == @first_file_added
268
+ group.children[1].should == @second_file_added
269
+ end
270
+
271
+ it 'should still save' do
272
+ @temp_project.save
273
+ end
274
+
275
+ it 'should add it to the build targets specified'
276
+
277
+ end
278
+
279
+ context "with a source tree of :absoulte" do
280
+
281
+ before :each do
282
+ @first_file_added = @temp_project.add_file :targets => [ @target ], :file => first_file,
283
+ :path => "Controllers/SecondViewController", :source_tree => :absolute
284
+ @second_file_added = @temp_project.add_file :targets => [ @target ], :file => second_file,
285
+ :path => "Controllers/SecondViewController", :source_tree => :absolute
286
+ end
287
+
288
+ it "should mark the project as dirty" do
289
+ @temp_project.dirty.should be_true
290
+ end
291
+
292
+ it 'should add it as the correct file type' do
293
+ @first_file_added.last_known_file_type.should == "sourcecode.c.h"
294
+ @second_file_added.last_known_file_type.should == "sourcecode.c.objc"
295
+ end
296
+
297
+
298
+ it 'should add the files with the correct path' do
299
+ @first_file_added.path.should == first_file
300
+ @second_file_added.path.should == second_file
301
+ end
302
+
303
+ it 'should add the files with the correct names' do
304
+ @first_file_added.name.should == "SecondViewController.h"
305
+ @second_file_added.name.should == "SecondViewController.m"
306
+ end
307
+
308
+ it 'should have the correct ISA' do
309
+ @first_file_added.isa.should == "PBXFileReference"
310
+ @second_file_added.isa.should == "PBXFileReference"
311
+ end
312
+
313
+ it 'should have an ID' do
314
+ @first_file_added.id.should_not be_nil
315
+ @second_file_added.id.should_not be_nil
316
+ end
317
+
318
+ it 'should add it to the correct group' do
319
+ group = @temp_project.create_group("Controllers/SecondViewController")
320
+
321
+ group.children[0].should == @first_file_added
322
+ group.children[1].should == @second_file_added
323
+ end
324
+
325
+ it 'should still save' do
326
+ @temp_project.save
327
+ end
328
+
329
+ it 'should add it to the build targets specified'
330
+
331
+ end
332
+
333
+ context 'should raise an error if' do
334
+
335
+ it 'there is no path set' do
336
+ expect do
337
+ @temp_project.add_file :targets => "Specs", :file => first_file
338
+ end.to raise_exception(StandardError, "Missing :path option")
339
+ end
340
+
341
+ it 'there is no file set' do
342
+ expect do
343
+ @temp_project.add_file :targets => "Specs", :path => "ASD"
344
+ end.to raise_exception(StandardError, "Missing :file option")
345
+ end
346
+
347
+ it "the file doesn't exist" do
348
+ expect do
349
+ @temp_project.add_file :targets => "Ruut", :file => "foo",
350
+ :path => "Controllers/SecondViewController", :source_tree => :group
351
+ end.to raise_exception(StandardError, "Could not find file `foo`")
352
+ end
353
+
354
+ it "you don't pass a source tree option" do
355
+ expect do
356
+ @temp_project.add_file :targets => "Specs", :path => "ASD", :file => "foo"
357
+ end.to raise_exception(StandardError, "Missing :source_tree option")
358
+ end
359
+
360
+ it "the source tree option is invalid" do
361
+ expect do
362
+ @temp_project.add_file :targets => "Specs", :path => "ASD",
363
+ :file => first_file, :source_tree => :foo
364
+ end.to raise_exception(StandardError, "Invalid :source_tree option `foo`")
365
+ end
366
+
367
+ end
368
+
369
+ end
370
+
371
+ context "#valid?" do
372
+
373
+ it "should return true the plist format is valid" do
374
+ @project.valid?.should be_true
375
+ end
376
+
377
+ it "should raise an error if there is an invalid format" do
378
+ @project.should_receive(:to_ascii_plist).and_return { "asd; { f5him" }
379
+
380
+ @project.valid?.should be_false
381
+ end
382
+
383
+ end
384
+
385
+ context "#to_ascii_plist" do
386
+
387
+ it "should convert it to the correct format" do
388
+ # Reload the project from the filesystem
389
+ @project.reload
390
+
391
+ contents = File.readlines(File.join(PROJECT_RESOURCE_PATH, "ProjectWithSpecs/ProjectWithSpecs.xcodeproj", "project.pbxproj")).join("\n")
392
+ original = Vendor::Plist.parse_ascii(contents)
393
+ saved = Vendor::Plist.parse_ascii(@project.to_ascii_plist)
394
+
395
+ original.should == saved
396
+ end
397
+
398
+ end
399
+
400
+ end