rubycut-babushka 0.10.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.
Files changed (171) hide show
  1. data/Gemfile +8 -0
  2. data/Gemfile.lock +31 -0
  3. data/README.markdown +246 -0
  4. data/Rakefile +26 -0
  5. data/bin/babushka +11 -0
  6. data/deps/babushka.rb +101 -0
  7. data/deps/dev.rb +12 -0
  8. data/deps/fhs.rb +31 -0
  9. data/deps/git.rb +29 -0
  10. data/deps/homebrew.rb +30 -0
  11. data/deps/os_x.rb +33 -0
  12. data/deps/packages.rb +22 -0
  13. data/deps/pkg_managers.rb +110 -0
  14. data/deps/ruby.rb +23 -0
  15. data/deps/rubygems.rb +24 -0
  16. data/deps/system.rb +10 -0
  17. data/deps/templates/app.rb +68 -0
  18. data/deps/templates/external.rb +12 -0
  19. data/deps/templates/installer.rb +31 -0
  20. data/deps/templates/managed.rb +105 -0
  21. data/deps/templates/ppa.rb +24 -0
  22. data/deps/templates/src.rb +42 -0
  23. data/deps/templates/tmbundle.rb +15 -0
  24. data/lib/babushka.rb +28 -0
  25. data/lib/babushka/accepts_block_for.rb +72 -0
  26. data/lib/babushka/accepts_list_for.rb +49 -0
  27. data/lib/babushka/accepts_value_for.rb +24 -0
  28. data/lib/babushka/base.rb +78 -0
  29. data/lib/babushka/bug_reporter.rb +55 -0
  30. data/lib/babushka/cmdline.rb +133 -0
  31. data/lib/babushka/cmdline/handler.rb +41 -0
  32. data/lib/babushka/cmdline/helpers.rb +127 -0
  33. data/lib/babushka/cmdline/parser.rb +69 -0
  34. data/lib/babushka/colorizer.rb +59 -0
  35. data/lib/babushka/core_patches/array.rb +171 -0
  36. data/lib/babushka/core_patches/blank.rb +22 -0
  37. data/lib/babushka/core_patches/bytes.rb +52 -0
  38. data/lib/babushka/core_patches/hash.rb +107 -0
  39. data/lib/babushka/core_patches/hashish.rb +14 -0
  40. data/lib/babushka/core_patches/integer.rb +25 -0
  41. data/lib/babushka/core_patches/io.rb +8 -0
  42. data/lib/babushka/core_patches/numeric.rb +16 -0
  43. data/lib/babushka/core_patches/object.rb +27 -0
  44. data/lib/babushka/core_patches/string.rb +116 -0
  45. data/lib/babushka/core_patches/symbol.rb +12 -0
  46. data/lib/babushka/core_patches/try.rb +15 -0
  47. data/lib/babushka/core_patches/uri.rb +24 -0
  48. data/lib/babushka/dep.rb +470 -0
  49. data/lib/babushka/dep_context.rb +18 -0
  50. data/lib/babushka/dep_definer.rb +115 -0
  51. data/lib/babushka/dep_pool.rb +49 -0
  52. data/lib/babushka/dep_runner.rb +85 -0
  53. data/lib/babushka/dsl.rb +26 -0
  54. data/lib/babushka/git_repo.rb +185 -0
  55. data/lib/babushka/helpers/git_helpers.rb +32 -0
  56. data/lib/babushka/helpers/log_helpers.rb +176 -0
  57. data/lib/babushka/helpers/path_helpers.rb +34 -0
  58. data/lib/babushka/helpers/run_helpers.rb +145 -0
  59. data/lib/babushka/helpers/shell_helpers.rb +229 -0
  60. data/lib/babushka/helpers/suggest_helpers.rb +16 -0
  61. data/lib/babushka/helpers/uri_helpers.rb +36 -0
  62. data/lib/babushka/ip.rb +160 -0
  63. data/lib/babushka/lambda_chooser.rb +40 -0
  64. data/lib/babushka/levenshtein.rb +125 -0
  65. data/lib/babushka/meta_dep.rb +65 -0
  66. data/lib/babushka/meta_dep_context.rb +15 -0
  67. data/lib/babushka/parameter.rb +143 -0
  68. data/lib/babushka/pkg_helper.rb +81 -0
  69. data/lib/babushka/pkg_helpers/apt_helper.rb +61 -0
  70. data/lib/babushka/pkg_helpers/base_helper.rb +19 -0
  71. data/lib/babushka/pkg_helpers/binpkgsrc_helper.rb +48 -0
  72. data/lib/babushka/pkg_helpers/binports_helper.rb +34 -0
  73. data/lib/babushka/pkg_helpers/brew_helper.rb +110 -0
  74. data/lib/babushka/pkg_helpers/gem_helper.rb +120 -0
  75. data/lib/babushka/pkg_helpers/macports_helper.rb +22 -0
  76. data/lib/babushka/pkg_helpers/npm_helper.rb +45 -0
  77. data/lib/babushka/pkg_helpers/pacman_helper.rb +27 -0
  78. data/lib/babushka/pkg_helpers/pip_helper.rb +45 -0
  79. data/lib/babushka/pkg_helpers/src_helper.rb +16 -0
  80. data/lib/babushka/pkg_helpers/yum_helper.rb +25 -0
  81. data/lib/babushka/popen.rb +40 -0
  82. data/lib/babushka/prompt.rb +176 -0
  83. data/lib/babushka/renderable.rb +67 -0
  84. data/lib/babushka/resource.rb +215 -0
  85. data/lib/babushka/run_reporter.rb +60 -0
  86. data/lib/babushka/shell.rb +108 -0
  87. data/lib/babushka/source.rb +216 -0
  88. data/lib/babushka/source_pool.rb +146 -0
  89. data/lib/babushka/system_definitions.rb +97 -0
  90. data/lib/babushka/system_profile.rb +210 -0
  91. data/lib/babushka/task.rb +142 -0
  92. data/lib/babushka/vars.rb +108 -0
  93. data/lib/babushka/version_of.rb +65 -0
  94. data/lib/babushka/version_str.rb +57 -0
  95. data/lib/babushka/xml_string.rb +28 -0
  96. data/lib/components.rb +82 -0
  97. data/lib/fancypath/fancypath.rb +200 -0
  98. data/lib/inkan/inkan.rb +76 -0
  99. data/spec/acceptance/acceptance.rb +43 -0
  100. data/spec/acceptance_helper.rb +113 -0
  101. data/spec/archives/Blah.app.zip +0 -0
  102. data/spec/archives/archive.tar +0 -0
  103. data/spec/archives/archive.tar.bz2 +0 -0
  104. data/spec/archives/archive.tar.gz +0 -0
  105. data/spec/archives/archive.tbz2 +0 -0
  106. data/spec/archives/archive.tgz +0 -0
  107. data/spec/archives/archive.zip +0 -0
  108. data/spec/archives/content.txt +5 -0
  109. data/spec/archives/invalid_archive +5 -0
  110. data/spec/archives/nested archive/content.txt +5 -0
  111. data/spec/archives/nested_archive.tar +0 -0
  112. data/spec/archives/really_a_gzip.zip +0 -0
  113. data/spec/archives/test-0.3.1.tgz +0 -0
  114. data/spec/archives/tgz_archive +0 -0
  115. data/spec/archives/zip_without_extension +0 -0
  116. data/spec/babushka/accepts_for_spec.rb +174 -0
  117. data/spec/babushka/accepts_for_support.rb +72 -0
  118. data/spec/babushka/cmdline/console_spec.rb +11 -0
  119. data/spec/babushka/cmdline/help_spec.rb +61 -0
  120. data/spec/babushka/cmdline/version_spec.rb +10 -0
  121. data/spec/babushka/core_patches_spec.rb +171 -0
  122. data/spec/babushka/dep_context_spec.rb +58 -0
  123. data/spec/babushka/dep_definer_spec.rb +152 -0
  124. data/spec/babushka/dep_definer_support.rb +36 -0
  125. data/spec/babushka/dep_spec.rb +567 -0
  126. data/spec/babushka/dep_support.rb +29 -0
  127. data/spec/babushka/deps_spec.rb +113 -0
  128. data/spec/babushka/gem_helper_spec.rb +90 -0
  129. data/spec/babushka/git_repo_spec.rb +396 -0
  130. data/spec/babushka/ip_spec.rb +131 -0
  131. data/spec/babushka/lambda_chooser_spec.rb +115 -0
  132. data/spec/babushka/meta_dep_definer_spec.rb +127 -0
  133. data/spec/babushka/meta_dep_wrapper_spec.rb +32 -0
  134. data/spec/babushka/parameter_spec.rb +135 -0
  135. data/spec/babushka/path_helpers_spec.rb +102 -0
  136. data/spec/babushka/prompt_spec.rb +188 -0
  137. data/spec/babushka/renderable_spec.rb +100 -0
  138. data/spec/babushka/resource_spec.rb +141 -0
  139. data/spec/babushka/run_helpers_spec.rb +26 -0
  140. data/spec/babushka/shell_helpers_spec.rb +244 -0
  141. data/spec/babushka/shell_spec.rb +19 -0
  142. data/spec/babushka/source_pool_spec.rb +320 -0
  143. data/spec/babushka/source_pool_support.rb +31 -0
  144. data/spec/babushka/source_spec.rb +382 -0
  145. data/spec/babushka/source_support.rb +17 -0
  146. data/spec/babushka/system_profile_spec.rb +61 -0
  147. data/spec/babushka/task_spec.rb +141 -0
  148. data/spec/babushka/uri_spec.rb +13 -0
  149. data/spec/babushka/vars_spec.rb +59 -0
  150. data/spec/babushka/version_of_spec.rb +110 -0
  151. data/spec/babushka/version_str_spec.rb +130 -0
  152. data/spec/babushka/version_str_support.rb +37 -0
  153. data/spec/babushka/xml_string_spec.rb +98 -0
  154. data/spec/deps/bad/broken.rb +7 -0
  155. data/spec/deps/bad/working.rb +3 -0
  156. data/spec/deps/good/meta.rb +14 -0
  157. data/spec/deps/good/test.rb +11 -0
  158. data/spec/deps/outer/deps.rb +19 -0
  159. data/spec/deps/outer/more deps.rb +11 -0
  160. data/spec/deps/params/params.rb +10 -0
  161. data/spec/fancypath/fancypath_spec.rb +272 -0
  162. data/spec/fancypath_support.rb +10 -0
  163. data/spec/inkan/inkan_spec.rb +217 -0
  164. data/spec/renderable/different_example.conf.erb +4 -0
  165. data/spec/renderable/example.conf.erb +3 -0
  166. data/spec/renderable/example.sh +6 -0
  167. data/spec/renderable/with_binding.conf.erb +4 -0
  168. data/spec/renderable/xml_example.conf.erb +8 -0
  169. data/spec/repos/remote.git.tgz +0 -0
  170. data/spec/spec_helper.rb +87 -0
  171. metadata +238 -0
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ class RunTester; extend RunHelpers end
4
+
5
+ describe "grep" do
6
+ it "should grep existing files" do
7
+ RunTester.grep('include', 'spec/spec_helper.rb').should include("include Babushka\n")
8
+ end
9
+ it "should return nil when there are no matches" do
10
+ RunTester.grep('lol', 'spec/spec_helper.rb').should be_nil
11
+ end
12
+ it "should return nil for nonexistent files" do
13
+ RunTester.grep('lol', '/nonexistent').should be_nil
14
+ end
15
+ end
16
+
17
+ describe "change_line" do
18
+ path = "#{tmp_prefix}/babushka_run_helper_change_line"
19
+ it "should not mangle a file" do
20
+ File.open(path, "w") { |f| f.write "one\ntwo\nthree\n" }
21
+ RunTester.change_line("two", "changed", path)
22
+ lines = File.open(path, "r") { |f| f.readlines.map{ |l| l.chomp } }
23
+ lines.values_at(0,3,4).should == ["one", "changed", "three"]
24
+ lines.length.should == 5 # two comments added
25
+ end
26
+ end
@@ -0,0 +1,244 @@
1
+ require 'spec_helper'
2
+
3
+ SucceedingLs = 'ls /bin'
4
+ FailingLs = 'ls /nonexistent'
5
+
6
+ describe "shell" do
7
+ it "should return something true on successful commands" do
8
+ shell('true').should_not be_nil
9
+ end
10
+ it "should return nil on failed commands" do
11
+ shell('false').should be_nil
12
+ end
13
+ it "should return output of successful commands" do
14
+ shell('echo lol').should == 'lol'
15
+ end
16
+ it "should accept multiline commands" do
17
+ shell("echo babu &&\necho shka").should == "babu\nshka"
18
+ end
19
+ it "should accept environment variables as the first argument" do
20
+ shell({'KEY' => 'value'}, "echo $KEY").should == "value"
21
+ end
22
+ it "should provide the shell to supplied blocks when the command succeeds" do
23
+ (the_block = "").should_receive(:was_called)
24
+ shell(SucceedingLs) {|shell|
25
+ the_block.was_called
26
+ shell.stdout.should include('bash')
27
+ shell.stderr.should be_empty
28
+ }
29
+ end
30
+ it "should provide the shell to supplied blocks when the command fails" do
31
+ (the_block = "").should_receive(:was_called)
32
+ shell(FailingLs) {|shell|
33
+ the_block.was_called
34
+ shell.stdout.should be_empty
35
+ shell.stderr.should include("No such file or directory")
36
+ }
37
+ end
38
+ it "should accept :input parameter" do
39
+ shell('cat', :input => 'lol').should == "lol"
40
+ end
41
+ context ":cd parameter" do
42
+ before { (tmp_prefix / 'dir_param').mkdir }
43
+ it "should run in the current directory when :cd isn't specified" do
44
+ shell("pwd").should == Dir.pwd
45
+ end
46
+ it "should run in the specified directory" do
47
+ shell("pwd", :cd => (tmp_prefix / 'dir_param')).should == (tmp_prefix / 'dir_param').to_s
48
+ end
49
+ it "should expand the path" do
50
+ shell("pwd", :cd => '~').should == ENV['HOME']
51
+ end
52
+ it "should raise when the path is nonexistent" do
53
+ L{
54
+ shell("pwd", :cd => (tmp_prefix / 'nonexistent'))
55
+ }.should raise_error(Errno::ENOENT, "No such file or directory - #{tmp_prefix / 'nonexistent'}")
56
+ end
57
+ context "with :create option" do
58
+ it "should run in the specified directory" do
59
+ shell("pwd", :cd => (tmp_prefix / 'dir_param'), :create => true).should == (tmp_prefix / 'dir_param').to_s
60
+ end
61
+ it "should create and run when the path is nonexistent" do
62
+ shell("pwd", :cd => (tmp_prefix / 'dir_param_with_create'), :create => true).should == (tmp_prefix / 'dir_param_with_create').to_s
63
+ end
64
+ end
65
+ end
66
+ end
67
+
68
+ describe "shell?" do
69
+ it "should return the output for successful commands" do
70
+ shell?('echo lol').should == 'lol'
71
+ shell?(SucceedingLs).should be_true
72
+ end
73
+ it "should return false for failed commands" do
74
+ shell?('false').should be_false
75
+ shell?(FailingLs).should be_false
76
+ end
77
+ end
78
+
79
+ describe "shell!" do
80
+ it "should return the output for successful commands" do
81
+ shell!('echo lol').should == 'lol'
82
+ shell!(SucceedingLs).should be_true
83
+ end
84
+ it "should return false for failed commands" do
85
+ L{ shell!('false') }.should raise_error(Shell::ShellCommandFailed, "Shell command failed: 'false'")
86
+ L{ shell!(FailingLs) }.should raise_error(Shell::ShellCommandFailed)
87
+ end
88
+ end
89
+
90
+ describe "raw_shell" do
91
+ it "should always return a Shell" do
92
+ raw_shell('true').should be_a(Shell)
93
+ raw_shell('false').should be_a(Shell)
94
+ end
95
+ it "should return stdout for succeeding commands" do
96
+ shell = raw_shell(SucceedingLs)
97
+ shell.stdout.should include("bash")
98
+ shell.stderr.should be_empty
99
+ end
100
+ it "should return stderr for failed commands" do
101
+ shell = raw_shell(FailingLs)
102
+ shell.stdout.should be_empty
103
+ shell.stderr.should include("No such file or directory")
104
+ end
105
+ it "should support sudo" do
106
+ should_receive(:shell).with('whoami', :sudo => true).once
107
+ raw_shell('whoami', :sudo => true)
108
+ end
109
+ it "should handle env vars" do
110
+ raw_shell({'KEY' => 'value'}, 'echo $KEY').stdout.should == "value\n"
111
+ end
112
+ end
113
+
114
+ describe 'argument behaviour' do
115
+ context "with a single string" do
116
+ it "should support compound commands" do
117
+ shell("echo trousers | tr a-z A-Z").should == 'TROUSERS'
118
+ end
119
+ it "should fail with unclosed quotes" do
120
+ shell('echo blah"').should be_nil
121
+ end
122
+ end
123
+ context "with an array" do
124
+ it "should treat as a command and args" do
125
+ shell(%w[echo trousers | tr a-z A-Z]).should == 'trousers | tr a-z A-Z'
126
+ end
127
+ it "should escape unclosed quotes" do
128
+ shell(['echo', 'blah"']).should == 'blah"'
129
+ end
130
+ end
131
+ end
132
+
133
+ describe "sudo" do
134
+ it "should reject array input" do
135
+ L{ sudo(%w[whoami]) }.should raise_error(ArgumentError, "#sudo commands have to be passed as a single string, not splatted strings or an array, since the `sudo` is composed from strings.")
136
+ end
137
+ it "should run as root when no user is given" do
138
+ should_receive(:shell_cmd).with({}, 'sudo -u root whoami', {}).once
139
+ sudo('whoami')
140
+ end
141
+ it "should run as the given user" do
142
+ should_receive(:shell_cmd).with({}, 'sudo -u batman whoami', {}).once
143
+ sudo('whoami', :as => 'batman')
144
+ end
145
+ it "should treat :sudo => 'string' as a username" do
146
+ should_receive(:shell_cmd).with({}, 'sudo -u batman whoami', {}).once
147
+ shell('whoami', :sudo => 'batman')
148
+ end
149
+ it "should sudo from #shell when :as is specified" do
150
+ should_receive(:shell_cmd).with({}, 'sudo -u root whoami', {}).once
151
+ shell('whoami', :as => 'root')
152
+ end
153
+ context "when already running as the sudo user" do
154
+ it "should not sudo when the user is already root" do
155
+ stub!(:current_username).and_return('root')
156
+ should_receive(:shell_cmd).with({}, 'whoami', {}).once
157
+ sudo('whoami')
158
+ end
159
+ it "should not sudo with :as" do
160
+ stub!(:current_username).and_return('batman')
161
+ should_receive(:shell_cmd).with({}, 'whoami', {}).once
162
+ sudo('whoami', :as => 'batman')
163
+ end
164
+ it "should not sudo with a :sudo => 'string' username" do
165
+ stub!(:current_username).and_return('batman')
166
+ should_receive(:shell_cmd).with({}, 'whoami', {}).once
167
+ shell('whoami', :sudo => 'batman')
168
+ end
169
+ it "should not sudo from #shell when :as is specified" do
170
+ stub!(:current_username).and_return('root')
171
+ should_receive(:shell_cmd).with({}, 'whoami', {}).once
172
+ shell('whoami', :as => 'root')
173
+ end
174
+ it "should handle env vars properly" do
175
+ stub!(:current_username).and_return('root')
176
+ should_receive(:shell_cmd).with({'KEY' => 'value'}, 'echo $KEY', {}).once
177
+ sudo({'KEY' => 'value'}, 'echo $KEY')
178
+ end
179
+ end
180
+ describe "compound commands" do
181
+ it "should use 'sudo su -' when opts[:su] is supplied" do
182
+ should_receive(:shell_cmd).with({}, 'sudo su - root -c "echo \\`whoami\\`"', {}).once
183
+ sudo("echo \\`whoami\\`", :su => true)
184
+ end
185
+ it "should use 'sudo su -' for redirects" do
186
+ should_receive(:shell_cmd).with({}, 'sudo su - root -c "echo \\`whoami\\` > %s/su_with_redirect"' % tmp_prefix, {}).once
187
+ sudo("echo \\`whoami\\` > %s/su_with_redirect" % tmp_prefix)
188
+ end
189
+ it "should use 'sudo su -' for pipes" do
190
+ should_receive(:shell_cmd).with({}, 'sudo su - root -c "echo \\`whoami\\` | tee %s/su_with_pipe"' % tmp_prefix, {}).once
191
+ sudo("echo \\`whoami\\` | tee %s/su_with_pipe" % tmp_prefix)
192
+ end
193
+ end
194
+ end
195
+
196
+ describe "log_shell" do
197
+ it "should log correctly for a successful command" do
198
+ should_receive(:log).with("Getting uptime...", {:newline=>false}).once
199
+ should_receive(:shell).with('uptime', {:spinner=>true}).and_return("days and days")
200
+ should_receive(:log).with(" done.", {:as=>nil, :indentation=>false}).once
201
+ log_shell 'Getting uptime', 'uptime'
202
+ end
203
+ it "should log correctly for a failing command" do
204
+ should_receive(:log).with("Setting sail for fail...", {:newline=>false}).once
205
+ should_receive(:shell).with('false', {:spinner=>true}).and_return(nil)
206
+ should_receive(:log).with(" failed", {:as=>:error, :indentation=>false}).once
207
+ log_shell 'Setting sail for fail', 'false'
208
+ end
209
+ it "should handle env vars" do
210
+ should_receive(:log).with("Echoing some vars...", {:newline=>false}).once
211
+ should_receive(:shell).with({'KEY' => 'value'}, 'echo $KEY', {:spinner=>true}).and_return('value')
212
+ should_receive(:log).with(" done.", {:as=>nil, :indentation=>false}).once
213
+ log_shell 'Echoing some vars', {'KEY' => 'value'}, 'echo $KEY'
214
+ end
215
+ end
216
+
217
+ describe "which" do
218
+ it "should return a string" do
219
+ which('ls').should be_an_instance_of(String)
220
+ end
221
+ it "should return the path for valid commands" do
222
+ path = `which ls`.chomp
223
+ which('ls').should == path
224
+ end
225
+ it "should return nil for nonexistent commands" do
226
+ which('nonexistent').should be_nil
227
+ end
228
+ it "should handle command parameter passed as Symbol" do
229
+ path = `which ls`.chomp
230
+ which(:ls).should == path
231
+ end
232
+ end
233
+
234
+ describe "cmd_dir" do
235
+ it "should return a string" do
236
+ cmd_dir('ruby').should be_an_instance_of(String)
237
+ end
238
+ it "should return the cmd_dir of an existing command" do
239
+ cmd_dir('ruby').should == `which ruby`.chomp.gsub(/\/ruby$/, '')
240
+ end
241
+ it "should return nil for nonexistent commands" do
242
+ cmd_dir('nonexistent').should be_nil
243
+ end
244
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Shell, '#ok?' do
4
+ it "should return true on success" do
5
+ Shell.new('true', {}).run(&:ok?).should be_true
6
+ end
7
+ it "should return false on failure" do
8
+ Shell.new('false', {}).run(&:ok?).should be_false
9
+ end
10
+ end
11
+
12
+ describe Shell, '#result' do
13
+ it "should return zero on success" do
14
+ Shell.new('true', {}).run(&:result).should == 0
15
+ end
16
+ it "should return non-zero on failure" do
17
+ Shell.new('false', {}).run(&:result).should == 1
18
+ end
19
+ end
@@ -0,0 +1,320 @@
1
+ require 'spec_helper'
2
+ require 'source_support'
3
+ require 'source_pool_support'
4
+
5
+ describe SourcePool, '#source_for' do
6
+ before {
7
+ @source1 = Source.new nil, :name => 'source_1'
8
+ @source1.stub!(:load!)
9
+ @source2 = Source.new nil, :name => 'source_2'
10
+ @source2.stub!(:load!)
11
+ Base.sources.stub!(:current).and_return([@source1])
12
+ Source.stub!(:present).and_return([@source2])
13
+ }
14
+ it "should find core sources" do
15
+ Base.sources.source_for('source_1').should == @source1
16
+ end
17
+ it "should find cloned sources" do
18
+ Base.sources.source_for('source_2').should == @source2
19
+ end
20
+ end
21
+
22
+ describe Dep, '#dep_for, disregarding sources' do
23
+ before {
24
+ @dep = dep 'Base.sources.dep_for tests'
25
+ }
26
+ it "should work for strings" do
27
+ Base.sources.dep_for('Base.sources.dep_for tests').should == @dep
28
+ end
29
+ it "should work for deps" do
30
+ Base.sources.dep_for(@dep).should == @dep
31
+ end
32
+ it "should not find the dep with namespacing" do
33
+ Base.sources.dep_for('namespaced:namespaced Base.sources.dep_for tests').should be_nil
34
+ end
35
+ context "with namespaced dep defined" do
36
+ before {
37
+ @source = Source.new(nil, :name => 'namespaced')
38
+ Source.stub!(:present).and_return([@source])
39
+ Base.sources.load_context :source => @source do
40
+ @namespaced_dep = dep 'Base.sources.dep_for tests'
41
+ end
42
+ }
43
+ it "should work with namespacing" do
44
+ Base.sources.dep_for('namespaced:Base.sources.dep_for tests').should == @namespaced_dep
45
+ end
46
+ end
47
+ end
48
+
49
+ describe SourcePool, '#dep_for' do
50
+ before {
51
+ @source1 = Source.new nil, :name => 'source_1'
52
+ @source1.stub!(:load!)
53
+ @source2 = Source.new nil, :name => 'source_2'
54
+ @source2.stub!(:load!)
55
+ Base.sources.load_context :source => @source1 do
56
+ @dep1 = dep 'dep 1'
57
+ @dep2 = dep 'dep 2'
58
+ end
59
+ Base.sources.load_context :source => @source2 do
60
+ @dep3 = dep 'dep 3'
61
+ @dep4 = dep 'dep 4'
62
+ end
63
+ Base.sources.stub!(:current).and_return([@source1, @source2])
64
+ Source.stub!(:present).and_return([@source1, @source2])
65
+ }
66
+ it "should look up the correct deps without namespacing" do
67
+ Base.sources.dep_for('dep 1').should == @dep1
68
+ Base.sources.dep_for('dep 4').should == @dep4
69
+ end
70
+ it "should find the dep when the namespace is correct" do
71
+ Base.sources.dep_for('source_1:dep 1').should == @dep1
72
+ Base.sources.dep_for('source_2:dep 4').should == @dep4
73
+ end
74
+ it "should not find the dep when the namespace is wrong" do
75
+ Base.sources.dep_for('source_1:dep 3').should be_nil
76
+ Base.sources.dep_for('source_2:dep 2').should be_nil
77
+ end
78
+ end
79
+
80
+ describe SourcePool, '#dep_for core' do
81
+ before {
82
+ @core = Source.new nil, :name => 'core'
83
+ @core.stub!(:load!)
84
+ Base.sources.load_context :source => @core do
85
+ @dep1 = dep 'dep 1'
86
+ @dep2 = dep 'dep 2'
87
+ end
88
+ Base.sources.stub!(:current).and_return([@core])
89
+ }
90
+ it "should find the correct deps without namespacing" do
91
+ Base.sources.dep_for('dep 1').should == @dep1
92
+ Base.sources.dep_for('dep 4').should == @dep4
93
+ end
94
+ it "should find the dep when the namespace is correct" do
95
+ Base.sources.dep_for('core:dep 1').should == @dep1
96
+ end
97
+ it "should not find the dep when the namespace is wrong" do
98
+ Base.sources.dep_for('non_core:dep 1').should be_nil
99
+ end
100
+ end
101
+
102
+ describe SourcePool, '#template_for' do
103
+ before {
104
+ mock_sources
105
+ }
106
+ context "without namespacing" do
107
+ it "should find templates in the anonymous source" do
108
+ Base.sources.template_for('anonymous_meta').should == @anonymous_meta
109
+ end
110
+ it "should find templates in the core source" do
111
+ Base.sources.template_for('core_meta').should == @core_meta
112
+ end
113
+ it "should not find templates from non-default sources" do
114
+ Base.sources.template_for('meta_1').should be_nil
115
+ Base.sources.template_for('meta_3').should be_nil
116
+ end
117
+ context "with :from" do
118
+ it "should find the template in the same source" do
119
+ Base.sources.template_for('from_test', :from => @source1).should == @from1
120
+ Base.sources.template_for('from_test', :from => @source2).should == @from2
121
+ end
122
+ context "when it doesn't exist in the :from source" do
123
+ it "should find the template in the core source" do
124
+ Base.sources.template_for('core_from', :from => @source1).should == @core_from
125
+ end
126
+ it "should not find the template in other sources" do
127
+ Base.sources.template_for('from_test_2', :from => @source1).should be_nil
128
+ Base.sources.template_for('from_test_2', :from => @source2).should_not be_nil
129
+ end
130
+ end
131
+ end
132
+ end
133
+ context "with namespacing" do
134
+ it "should find the dep when the namespace is correct" do
135
+ Base.sources.template_for('source_1:meta_1').should == @meta1
136
+ Base.sources.template_for('source_2:meta_4').should == @meta4
137
+ end
138
+ it "should not find the dep when the namespace is wrong" do
139
+ Base.sources.template_for('source_1:').should be_nil
140
+ Base.sources.template_for('source_2:meta 2').should be_nil
141
+ end
142
+ end
143
+ after {
144
+ Base.sources.anonymous.templates.clear!
145
+ Base.sources.core.templates.clear!
146
+ }
147
+ end
148
+
149
+ describe SourcePool, '#load_context' do
150
+ context "without a template" do
151
+ before {
152
+ Dep.should_receive(:new).with('load_context', Base.sources.anonymous, [], {}, nil)
153
+ }
154
+ it "should pass the correct options" do
155
+ dep 'load_context'
156
+ end
157
+ end
158
+ context "with a template" do
159
+ let(:source) {
160
+ Source.new *make_source_remote('load_context')
161
+ }
162
+ let!(:template) {
163
+ Base.sources.load_context :source => source do
164
+ meta 'load_context_template'
165
+ end
166
+ }
167
+ let!(:the_dep) {
168
+ Base.sources.load_context :source => source do
169
+ dep 'defining test with template.load_context_template'
170
+ end
171
+ }
172
+ it "should use the template" do
173
+ the_dep.template.should == template
174
+ end
175
+ after {
176
+ source.remove!
177
+ }
178
+ end
179
+ context "with nesting" do
180
+ before {
181
+ @source1, @source2 = Source.new(nil), Source.new(nil)
182
+ }
183
+ it "should maintain the outer context after the inner one returns" do
184
+ Base.sources.load_context :source => @source1 do
185
+ Base.sources.current_load_source.should == @source1
186
+ Base.sources.load_context :source => @source2 do
187
+ Base.sources.current_load_source.should == @source2
188
+ end
189
+ Base.sources.current_load_source.should == @source1
190
+ end
191
+ end
192
+ end
193
+ end
194
+
195
+ describe "template selection during defining" do
196
+ before {
197
+ mock_sources
198
+ }
199
+ context "with namespacing" do
200
+ it "should use templates from the named source" do
201
+ dep('template selection 1', :template => 'source_1:meta_1').template.should == @meta1
202
+ end
203
+ it "should not find the template with the wrong source prefix, and raise" do
204
+ L{
205
+ dep('template selection 2', :template => 'source_2:meta_1')
206
+ }.should raise_error(TemplateNotFound, "There is no template named 'source_2:meta_1' to define 'template selection 2' against.")
207
+ end
208
+ end
209
+ context "without namespacing" do
210
+ context "with :template option" do
211
+ it "should find a template in the same source" do
212
+ mock_dep('template selection 3', :template => 'meta_1', :in => @source1).template.should == @meta1
213
+ end
214
+ it "should not find a template in the wrong source, and raise" do
215
+ L{
216
+ mock_dep('template selection 4', :template => 'meta_3', :in => @source1).template
217
+ }.should raise_error(TemplateNotFound, "There is no template named 'meta_3' to define 'template selection 4' against.")
218
+ end
219
+ end
220
+ context "with suffixes" do
221
+ it "should find a template in the same source" do
222
+ mock_dep('template selection 3.meta_1', :in => @source1).template.should == @meta1
223
+ end
224
+ it "should find a template in the core source" do
225
+ mock_dep('template selection 3.core_meta', :in => @source1).template.should == @core_meta
226
+ end
227
+ it "should not find a template in the wrong source, and use the base template" do
228
+ mock_dep('template selection 4.meta_3', :in => @source1).template.should == Dep::BaseTemplate
229
+ end
230
+ end
231
+ end
232
+ after {
233
+ Base.sources.anonymous.templates.clear!
234
+ Base.sources.core.templates.clear!
235
+ }
236
+ end
237
+
238
+ describe "template selection during defining from a real source" do
239
+ before {
240
+ @source = Source.new('spec/deps/good', :name => 'good source')
241
+ @source.load!
242
+ Source.stub!(:present).and_return([@source])
243
+ }
244
+ it "should have loaded deps" do
245
+ @source.deps.names.should =~ [
246
+ 'test dep 1',
247
+ 'test dep 2',
248
+ 'option-templated dep',
249
+ 'suffix-templated dep.test_template'
250
+ ]
251
+ end
252
+ it "should have loaded templates" do
253
+ @source.templates.names.should =~ [
254
+ 'test_template',
255
+ 'test_meta_1'
256
+ ]
257
+ end
258
+ it "should have defined deps against the correct template" do
259
+ @source.find('test dep 1').template.should == Dep::BaseTemplate
260
+ @source.find('test dep 2').template.should == Dep::BaseTemplate
261
+ @source.find('option-templated dep').template.should == @source.find_template('test_template')
262
+ @source.find('suffix-templated dep.test_template').template.should == @source.find_template('test_template')
263
+ end
264
+ end
265
+
266
+ describe "nested source loads" do
267
+ before {
268
+ @outer_source = Source.new('spec/deps/outer', :name => 'outer source')
269
+ @nested_source = Source.new('spec/deps/good', :name => 'nested source')
270
+
271
+ Source.stub!(:present).and_return([@outer_source, @nested_source])
272
+ @outer_source.load!
273
+ }
274
+ it "should have loaded outer deps" do
275
+ @outer_source.deps.names.should =~ [
276
+ 'test dep 1',
277
+ 'externally templated',
278
+ 'locally templated',
279
+ 'locally templated.local_template',
280
+ 'separate file',
281
+ 'separate file.another_local_template'
282
+ ]
283
+ @nested_source.deps.names.should == []
284
+ end
285
+ it "should have loaded outer templates" do
286
+ @outer_source.templates.names.should =~ [
287
+ 'local_template',
288
+ 'another_local_template'
289
+ ]
290
+ @nested_source.templates.names.should == []
291
+ end
292
+ context "after defining external deps" do
293
+ before {
294
+ @outer_source.find('externally templated').context
295
+ }
296
+ it "should have loaded the nested deps" do
297
+ @nested_source.deps.names.should =~ [
298
+ 'test dep 1',
299
+ 'test dep 2',
300
+ 'option-templated dep',
301
+ 'suffix-templated dep.test_template'
302
+ ]
303
+ end
304
+ it "should have loaded the nested templates" do
305
+ @nested_source.templates.names.should =~ [
306
+ 'test_template',
307
+ 'test_meta_1'
308
+ ]
309
+ end
310
+ end
311
+
312
+ it "should have defined deps against the correct template" do
313
+ @outer_source.find('test dep 1').template.should == Dep::BaseTemplate
314
+ @outer_source.find('externally templated').template.should == @nested_source.find_template('test_template')
315
+ @outer_source.find('locally templated').template.should == @outer_source.find_template('local_template')
316
+ @outer_source.find('locally templated.local_template').template.should == @outer_source.find_template('local_template')
317
+ @outer_source.find('separate file').template.should == @outer_source.find_template('another_local_template')
318
+ @outer_source.find('separate file.another_local_template').template.should == @outer_source.find_template('another_local_template')
319
+ end
320
+ end