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,131 @@
1
+ require 'spec_helper'
2
+
3
+ describe "IP" do
4
+ it "should accept IPs, arrays and strings" do
5
+ IP.new(IP.new('10.0.1.1')).to_s.should == '10.0.1.1'
6
+ IP.new([10, 0, 1, 1]).to_s.should == '10.0.1.1'
7
+ IP.new('10.0.1.1').to_s.should == '10.0.1.1'
8
+ end
9
+ it "should work for valid IPs" do
10
+ [
11
+ '10.0.1.1' ,
12
+ '192.168.0.1' ,
13
+ '174.129.110.43'
14
+ ].each {|string|
15
+ IP.new(string).should be_valid
16
+ }
17
+ end
18
+ it "should work for invalid IPs" do
19
+ [
20
+ '10.0.1.' ,
21
+ '.10.0.1' ,
22
+ '192.168.0' ,
23
+ '192.168.0.c' ,
24
+ '174.129.110.433'
25
+ ].each {|string|
26
+ IP.new(string).should_not be_valid
27
+ }
28
+ end
29
+ describe "equality" do
30
+ it "should be equal to equivalent IPs" do
31
+ IP.new('10.0.1.1').should == IP.new([10, 0, 1, 1])
32
+ end
33
+ it "should not be equal to different IPs" do
34
+ IP.new('10.0.1.1').should_not == IP.new('10.0.0.1')
35
+ IP.new('10.0.1.1').should_not == IP.new('10.0.1')
36
+ end
37
+ end
38
+ describe "#next" do
39
+ it "should return the next IP in the range" do
40
+ IP.new('10.0.1.1').next.to_s.should == '10.0.1.2'
41
+ IP.new('10.0.1.255').next.to_s.should == '10.0.2.0'
42
+ IP.new('10.13.37.1').next.to_s.should == '10.13.37.2'
43
+ end
44
+ end
45
+ describe "#prev" do
46
+ it "should return the previous IP in the range" do
47
+ IP.new('10.0.1.2').prev.to_s.should == '10.0.1.1'
48
+ IP.new('10.0.2.0').prev.to_s.should == '10.0.1.255'
49
+ IP.new('10.13.37.255').prev.to_s.should == '10.13.37.254'
50
+ end
51
+ end
52
+ end
53
+
54
+ describe "IPRange" do
55
+ it "should work for valid IPs" do
56
+ [
57
+ '10.0.1.x' ,
58
+ '10.0.x' ,
59
+ '174.129.x.x'
60
+ ].each {|string|
61
+ IPRange.new(string).should be_valid
62
+ }
63
+ end
64
+ it "should work for invalid IPs" do
65
+ [
66
+ '10.0.1.1' ,
67
+ '10.0.x.1' ,
68
+ '10.0.x.' ,
69
+ '174.129.110.',
70
+ '174.129.x.43'
71
+ ].each {|string|
72
+ IPRange.new(string).should_not be_valid
73
+ }
74
+ end
75
+ it "should collapse multiple wildcards" do
76
+ IPRange.new('10.0.1.x').bytes.should == [10, 0, 1, 'x']
77
+ IPRange.new('10.x').bytes.should == [10, 'x']
78
+ IPRange.new('10.x.x.x').bytes.should == [10, 'x']
79
+ IPRange.new('10.0.x').bytes.should == [10, 0, 'x']
80
+ IPRange.new('10.0.x.x').bytes.should == [10, 0, 'x']
81
+ end
82
+ describe "#padded_bytes" do
83
+ it "should pad the ranges back out to 4 terms" do
84
+ IPRange.new('10.0.1.x').padded_bytes.should == [10, 0, 1, 'x']
85
+ IPRange.new('10.x').padded_bytes.should == [10, 'x', 'x', 'x']
86
+ IPRange.new('10.x.x.x').padded_bytes.should == [10, 'x', 'x', 'x']
87
+ IPRange.new('10.0.x').padded_bytes.should == [10, 0, 'x', 'x']
88
+ IPRange.new('10.0.x.x').padded_bytes.should == [10, 0, 'x', 'x']
89
+ end
90
+ end
91
+ describe "#first" do
92
+ it "should return the first IP in the range" do
93
+ IPRange.new('10.0.x').first.should == IP.new('10.0.0.1')
94
+ IPRange.new('10.13.37.x').first.should == IP.new('10.13.37.1')
95
+ end
96
+ end
97
+ describe "#last" do
98
+ it "should return the last IP in the range" do
99
+ IPRange.new('10.0.x').last.should == IP.new('10.0.255.255')
100
+ IPRange.new('10.13.37.x').last.should == IP.new('10.13.37.255')
101
+ end
102
+ end
103
+ describe "#ip_for" do
104
+ it "should combine network and address parts" do
105
+ IPRange.new('10.0.1.x').ip_for('x.x.x.1').should == IP.new('10.0.1.1')
106
+ IPRange.new('10.13.37.x').ip_for('x.254').should == IP.new('10.13.37.254')
107
+ end
108
+ it "should default uncovered sections to 0" do
109
+ IPRange.new('10.0.x').ip_for('x.x.x.1').should == IP.new('10.0.0.1')
110
+ IPRange.new('10.x').ip_for('x.254').should == IP.new('10.0.0.254')
111
+ end
112
+ end
113
+ describe "#subnet" do
114
+ it "should return the subnet mask" do
115
+ IPRange.new('10.0.1.x').subnet.should == '255.255.255.0'
116
+ IPRange.new('10.x') .subnet.should == '255.0.0.0'
117
+ IPRange.new('10.x.x.x').subnet.should == '255.0.0.0'
118
+ IPRange.new('10.0.x') .subnet.should == '255.255.0.0'
119
+ IPRange.new('10.0.x.x').subnet.should == '255.255.0.0'
120
+ end
121
+ end
122
+ describe "#broadcast" do
123
+ it "should return the broadcast address" do
124
+ IPRange.new('10.0.1.x').broadcast.should == '10.0.1.255'
125
+ IPRange.new('10.x') .broadcast.should == '10.255.255.255'
126
+ IPRange.new('10.x.x.x').broadcast.should == '10.255.255.255'
127
+ IPRange.new('10.0.x') .broadcast.should == '10.0.255.255'
128
+ IPRange.new('10.0.x.x').broadcast.should == '10.0.255.255'
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,115 @@
1
+ require 'spec_helper'
2
+
3
+
4
+ describe "lambda choosing" do
5
+ it "should return the value of the block when there are no choices" do
6
+ LambdaChooser.new(nil, :ours, :theirs) {
7
+ "block value"
8
+ }.choose(:ours, :on).should == "block value"
9
+ end
10
+
11
+ it "should choose the specified call" do
12
+ LambdaChooser.new(nil, :ours, :theirs) {
13
+ on :ours, "this is ours"
14
+ on :theirs, "this is theirs"
15
+ }.choose(:ours, :on).should == ["this is ours"]
16
+ describe "with a block value" do
17
+ LambdaChooser.new(nil, :ours, :theirs) {
18
+ on :ours, "this is ours"
19
+ on :theirs, "this is theirs"
20
+ "block value"
21
+ }.choose(:ours, :on).should == ["this is ours"]
22
+ end
23
+ end
24
+
25
+ it "should pick the first choice from multiple choices" do
26
+ LambdaChooser.new(nil, :ours, :yours, :theirs) {
27
+ on :ours, "this is ours"
28
+ on :yours, "this is yours"
29
+ on :theirs, "this is theirs"
30
+ }.choose([:ours, :yours], :on).should == ["this is ours"]
31
+ LambdaChooser.new(nil, :ours, :yours, :theirs) {
32
+ on :yours, "this is yours"
33
+ on :ours, "this is ours"
34
+ on :theirs, "this is theirs"
35
+ }.choose([:ours, :yours], :on).should == ["this is ours"]
36
+ end
37
+
38
+ it "should reject :otherwise as a choice name" do
39
+ L{
40
+ LambdaChooser.new(nil, :ours, :yours, :otherwise)
41
+ }.should raise_error(ArgumentError, "You can't use :otherwise as a choice name, because it's reserved.")
42
+ end
43
+
44
+ it "should pick 'otherwise' if no choices match" do
45
+ LambdaChooser.new(nil, :ours, :yours, :theirs) {
46
+ on :ours, "this is ours"
47
+ on :yours, "this is yours"
48
+ otherwise "this is the default"
49
+ }.choose(:theirs, :on).should == ["this is the default"]
50
+ end
51
+
52
+ it "should return 'nil' if no choices match and there's no 'otherwise'" do
53
+ LambdaChooser.new(nil, :ours, :yours, :theirs) {
54
+ on :yours, "this is yours"
55
+ on :ours, "this is ours"
56
+ }.choose(:theirs, :on).should == nil
57
+ end
58
+
59
+ it "should not join lists from multiple choices" do
60
+ LambdaChooser.new(
61
+ nil,
62
+ :apt, :brew, :macports, :yum, :linux, :osx, :ubuntu, :debian, :osx, :karmic, :gutsy, :lucid, :intrepid, :dapper, :breezy, :jaunty, :feisty, :edgy, :warty, :hardy, :maverick, :hoary, :lenny, :snow_leopard, :panther, :tiger, :leopard
63
+ ) {
64
+ on :maverick, %w[ruby ruby1.8-dev]
65
+ on :apt, %w[ruby irb ruby1.8-dev libopenssl-ruby]
66
+ }.choose(
67
+ [:maverick, :ubuntu, :apt, :linux, :all],
68
+ :on
69
+ ).should == %w[ruby ruby1.8-dev]
70
+ end
71
+
72
+ it "should default the choice method to #on" do
73
+ LambdaChooser.new(nil, :ours, :theirs) {
74
+ on :ours, "this is ours"
75
+ on :theirs, "this is theirs"
76
+ }.choose(:ours).should == ["this is ours"]
77
+ LambdaChooser.new(nil, :ours, :theirs) {
78
+ on :ours, "this is ours"
79
+ on :theirs, "this is theirs"
80
+ }.choose(:ours, nil).should == ["this is ours"]
81
+ end
82
+
83
+ it "should reject values and block together" do
84
+ L{
85
+ LambdaChooser.new(nil, :ours, :theirs) {
86
+ on :ours, "this is ours"
87
+ on :theirs, "this is theirs" do
88
+ 'another value'
89
+ end
90
+ }.choose(:ours, :on)
91
+ }.should raise_error("You can supply values or a block, but not both.")
92
+ end
93
+
94
+ it "should reject unknown choosers" do
95
+ L{
96
+ LambdaChooser.new(nil, :ours, :theirs) {
97
+ on :ours, "this is ours"
98
+ on :someone_elses, "this is theirs"
99
+ }.choose(:ours, :on)
100
+ }.should raise_error("The choice 'someone_elses' isn't valid.")
101
+ end
102
+
103
+ it "should return the data intact" do
104
+ {
105
+ "string" => ["string"],
106
+ %w[a r r a y] => %w[a r r a y],
107
+ {:h => 'a', :s => 'h'} => {:h => 'a', :s => 'h'}
108
+ }.each_pair {|input, expected|
109
+ LambdaChooser.new(nil, :ours, :theirs) {
110
+ on :ours, input
111
+ on :theirs, "this is theirs"
112
+ }.choose(:ours, :on).should == expected
113
+ }
114
+ end
115
+ end
@@ -0,0 +1,127 @@
1
+ require 'spec_helper'
2
+ require 'dep_definer_support'
3
+
4
+ describe "declaration" do
5
+ before {
6
+ @meta = meta 'test'
7
+ }
8
+ it "should work" do
9
+ L{ meta 'count_test' }.should change(Base.sources.anonymous.templates, :count).by(1)
10
+ end
11
+ it "should set the name" do
12
+ @meta.name.should == 'test'
13
+ end
14
+ it "should downcase the name" do
15
+ meta("Case_Test").name.should == 'case_test'
16
+ end
17
+ it "should set the source" do
18
+ @meta.source.should == Base.sources.anonymous
19
+ end
20
+ it "should define a dep context" do
21
+ @meta.context_class.should be_an_instance_of(Class)
22
+ @meta.context_class.ancestors.should include(Babushka::DepContext)
23
+ end
24
+ it "should define template on the context" do
25
+ @meta.context_class.source_template.should == @meta
26
+ end
27
+ it "should not define a dep helper" do
28
+ Object.new.should_not respond_to('test')
29
+ end
30
+ it "should not be marked as suffixed" do
31
+ @meta.opts[:suffix].should be_false
32
+ end
33
+ after { Base.sources.anonymous.templates.clear! }
34
+ end
35
+
36
+ describe "using" do
37
+ describe "invalid templates" do
38
+ it "should not define deps as options" do
39
+ L{
40
+ dep('something undefined', :template => 'undefined').should be_nil
41
+ }.should raise_error(TemplateNotFound, "There is no template named 'undefined' to define 'something undefined' against.")
42
+ end
43
+ it "should define deps as options" do
44
+ dep('something.undefined').should be_an_instance_of(Dep)
45
+ end
46
+ end
47
+
48
+ describe "without template" do
49
+ before {
50
+ @meta = meta('templateless_test') {}
51
+ }
52
+ it "should define deps based on the template" do
53
+ dep('templateless dep.templateless_test').template.should == @meta
54
+ end
55
+ after { Base.sources.anonymous.templates.clear! }
56
+ end
57
+
58
+ describe "with template" do
59
+ before {
60
+ @meta = meta 'template_test' do
61
+ def a_helper_method
62
+ 'hello from the helper!'
63
+ end
64
+ template {
65
+ def a_helper
66
+ 'hello from the helper in the template!'
67
+ end
68
+ met? {
69
+ 'this dep is met.'
70
+ }
71
+ }
72
+ end
73
+ }
74
+ it "should define the helper on the context class" do
75
+ @meta.context_class.respond_to?(:a_helper).should be_false
76
+ @meta.context_class.new(nil).respond_to?(:a_helper).should be_false
77
+ dep('dep1.template_test').context.respond_to?(:a_helper).should be_true
78
+ end
79
+ it "should correctly define the helper method" do
80
+ dep('dep2.template_test').context.a_helper_method.should == 'hello from the helper!'
81
+ end
82
+ it "should correctly define the helper" do
83
+ dep('dep2.template_test').context.a_helper.should == 'hello from the helper in the template!'
84
+ end
85
+ it "should correctly define the met? block" do
86
+ dep('dep3.template_test').send(:process_task, :met?).should == 'this dep is met.'
87
+ end
88
+ it "should override the template correctly" do
89
+ dep('dep4.template_test') {
90
+ met? { 'overridden met? block.' }
91
+ }.send(:process_task, :met?).should == 'overridden met? block.'
92
+ end
93
+ after { Base.sources.anonymous.templates.clear! }
94
+ end
95
+
96
+ describe "acceptors" do
97
+ before {
98
+ @meta = meta 'acceptor_test' do
99
+ accepts_list_for :list_test
100
+ accepts_block_for :block_test
101
+ template {
102
+ met? {
103
+ list_test == ['valid']
104
+ }
105
+ meet {
106
+ block_test.call
107
+ }
108
+ }
109
+ end
110
+ }
111
+ it "should handle accepts_list_for" do
112
+ dep('unmet accepts_list_for.acceptor_test') { list_test 'invalid' }.met?.should be_false
113
+ dep('met accepts_list_for.acceptor_test') { list_test 'valid' }.met?.should be_true
114
+ end
115
+ it "should handle accepts_block_for" do
116
+ block_called = false
117
+ dep('accepts_block_for.acceptor_test') {
118
+ list_test 'invalid'
119
+ block_test {
120
+ block_called = true
121
+ }
122
+ }.meet
123
+ block_called.should be_true
124
+ end
125
+ after { Base.sources.anonymous.templates.clear! }
126
+ end
127
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe "name checks" do
4
+ it "should not allow blank names" do
5
+ L{ meta(nil) }.should raise_error(ArgumentError, "You can't define a template with a blank name.")
6
+ L{ meta('') }.should raise_error(ArgumentError, "You can't define a template with a blank name.")
7
+ end
8
+ it "should not allow reserved names" do
9
+ L{ meta(:base) }.should raise_error(ArgumentError, "You can't use 'base' for a template name, because it's reserved.")
10
+ end
11
+ it "should allow valid names" do
12
+ L{ meta(:a) }.should_not raise_error
13
+ L{ meta('b') }.should_not raise_error
14
+ L{ meta('valid') }.should_not raise_error
15
+ end
16
+ it "should not allow spaces and numbers" do
17
+ L{ meta('meta dep 2') }.should raise_error(ArgumentError, "You can't use 'meta dep 2' for a template name - it can only contain [a-z0-9_].")
18
+ end
19
+ it "should not allow invalid characters" do
20
+ L{ meta("meta\ndep") }.should raise_error(ArgumentError, "You can't use 'meta\ndep' for a template name - it can only contain [a-z0-9_].")
21
+ end
22
+ it "should not allow names that don't start with a letter" do
23
+ L{ meta('3d_dep') }.should raise_error(ArgumentError, "You can't use '3d_dep' for a template name - it must start with a letter.")
24
+ end
25
+ describe "duplicate declaration" do
26
+ before { meta 'duplicate' }
27
+ it "should be prevented" do
28
+ L{ meta(:duplicate) }.should raise_error(ArgumentError, "A template called 'duplicate' has already been defined.")
29
+ end
30
+ after { Base.sources.anonymous.templates.clear! }
31
+ end
32
+ end
@@ -0,0 +1,135 @@
1
+ require 'spec_helper'
2
+
3
+ describe Parameter do
4
+ it "should not be set without a value" do
5
+ Parameter.new(:test).set?.should be_false
6
+ end
7
+ it "should be set with a value" do
8
+ Parameter.new(:test, 'testy test').set?.should be_true
9
+ end
10
+
11
+ describe ".for" do
12
+ let(:input) { 'testy test' }
13
+ let(:param) { Parameter.for(:test, input) }
14
+ it "should return a parameter" do
15
+ param.should be_an_instance_of(Parameter)
16
+ end
17
+ context "with Parameter input" do
18
+ let(:input) { Parameter.new(:test, 'testy test') }
19
+ it "should not re-wrap the Parameter" do
20
+ Parameter.for(:test, input).object_id.should == input.object_id
21
+ end
22
+ end
23
+ end
24
+
25
+ describe "#==" do
26
+ it "should behave like a string when it's set" do
27
+ Parameter.new(:test, "a value").should == "a value"
28
+ Parameter.new(:test, "a value").should_not == "another value"
29
+ end
30
+ it "should prompt when the value isn't set" do
31
+ Prompt.should_receive(:get_value)
32
+ Parameter.new(:test) == "a value"
33
+ end
34
+ end
35
+
36
+ describe "#to_s" do
37
+ it "should delegate to the value" do
38
+ Parameter.new(:test, "a value").to_s.should == "a value"
39
+ end
40
+ it "should convert non-string values to strings" do
41
+ Parameter.new(:test, 3065).to_s.should == "3065"
42
+ end
43
+ it "should interpolate" do
44
+ "a #{Parameter.new(:adjective, "nice")} param".should == "a nice param"
45
+ end
46
+ end
47
+
48
+ describe "#to_str" do
49
+ it "should delegate to the value" do
50
+ File.exists?(Parameter.new(:path, "/bin")).should be_true
51
+ end
52
+ it "should fail when the value itself would fail" do
53
+ parameter = Parameter.new(:path, 3065)
54
+ message = if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
55
+ "Coercion error: #<Babushka::Parameter:#{parameter.object_id} path: 3065>.to_str => String failed"
56
+ else
57
+ "Can't coerce 3065:Fixnum into a String"
58
+ end
59
+ L{
60
+ File.exists?(parameter)
61
+ }.should raise_error(TypeError, message)
62
+ end
63
+ end
64
+
65
+ describe '#description' do
66
+ it "should describe unset parameters" do
67
+ Parameter.new(:test).description.should == 'test: [unset]'
68
+ end
69
+ it "should describe unset parameters with defaults" do
70
+ Parameter.new(:test).default("a default").description.should == 'test: [default: "a default"]'
71
+ end
72
+ it "should describe unset parameters with bang-defaults" do
73
+ Parameter.new(:test).default!("a bang-default").description.should == 'test: [default!: "a bang-default"]'
74
+ end
75
+ it "should describe set parameters" do
76
+ Parameter.new(:test, "a value").description.should == 'test: "a value"'
77
+ end
78
+ it "should describe non-string values" do
79
+ Parameter.new(:test, %w[non-string value]).description.should == 'test: ["non-string", "value"]'
80
+ end
81
+ end
82
+
83
+ describe "other stringy methods" do
84
+ it "should work with #/" do
85
+ (Parameter.new(:test, "/path") / 'joining') == "/path/joining"
86
+ end
87
+ it "should work with #[]" do
88
+ Parameter.new(:test, "The Rural Jurour")[/ur/].should == 'ur'
89
+ end
90
+ it "should work with #p" do
91
+ Parameter.new(:test, "/bin").p.should be_an_instance_of(Fancypath)
92
+ end
93
+ end
94
+
95
+ describe "#default!" do
96
+ it "should be returned when no value is set" do
97
+ Parameter.new(:unset).default!('default!').to_s.should == 'default!'
98
+ end
99
+ it "should be ignored when a value is set" do
100
+ Parameter.new(:set, 'value').default!('default!').to_s.should == 'value'
101
+ end
102
+ it "should take precedence over default values" do
103
+ Parameter.new(:unset).default!('default!').default('default').to_s.should == 'default!'
104
+ end
105
+ end
106
+
107
+ describe "asking for values" do
108
+ it "should request a value when it's not present" do
109
+ Prompt.should_receive(:get_value).with('unset', {}).and_return('value')
110
+ Parameter.new(:unset).to_s.should == 'value'
111
+ end
112
+ it "should pass the default from #default" do
113
+ Prompt.should_receive(:get_value).with('unset', :default => 'default').and_return('default')
114
+ Parameter.new(:unset).default('default').to_s.should == 'default'
115
+ end
116
+ it "should pass the message from #ask" do
117
+ Prompt.should_receive(:get_value).with('What number am I thinking of', {}).and_return('7')
118
+ Parameter.new(:unset).ask('What number am I thinking of').to_s.should == '7'
119
+ end
120
+ describe "choices, from #choose" do
121
+ it "should pass to #choices when given as an array" do
122
+ Prompt.should_receive(:get_value).with('unset', :choices => %w[a b]).and_return('a')
123
+ Parameter.new(:unset).choose(%w[a b]).to_s.should == 'a'
124
+ end
125
+ it "should pass to #choices when given as splatted args" do
126
+ Prompt.should_receive(:get_value).with('unset', :choices => %w[a b]).and_return('a')
127
+ Parameter.new(:unset).choose('a', 'b').to_s.should == 'a'
128
+ end
129
+ it "should pass to #choice_descriptions when given as a hash" do
130
+ Prompt.should_receive(:get_value).with('unset', :choice_descriptions => {:a => 'a', :b => 'b'}).and_return('a')
131
+ Parameter.new(:unset).choose(:a => 'a', :b => 'b').to_s.should == 'a'
132
+ end
133
+ end
134
+ end
135
+ end