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,141 @@
1
+ require 'spec_helper'
2
+ require 'source_support'
3
+
4
+ standard_vars = {
5
+ "rails_root" => {:default => "~/current", :value => "~/projects/corkboard/current"},
6
+ "extra_domains" => {:default => "", :value => ""},
7
+ "username" => {:default => "ben"},
8
+ "versions" => {:value => {:nginx => "0.7.61", :upload_module => "2.0.9"}},
9
+ "vhost_type" => {:default => "passenger", :value => "passenger"}
10
+ }
11
+
12
+ describe Task, "process" do
13
+ describe "with a dep name" do
14
+ before {
15
+ dep 'task spec'
16
+ Dep('task spec').should_receive(:process)
17
+ }
18
+ it "should run a dep when just the name is passed" do
19
+ Base.task.process ['task spec']
20
+ end
21
+ end
22
+ describe "variable assignment" do
23
+ it "should set the values in with_vars as vars" do
24
+ var_value = nil
25
+ dep 'task spec with_vars' do
26
+ met? {
27
+ var_value = var(:task_var)
28
+ }
29
+ end
30
+ Base.task.process ['task spec with_vars'], {'task_var' => 'something tasky'}
31
+ var_value.should == 'something tasky'
32
+ end
33
+ end
34
+ describe "argument assignment" do
35
+ it "should work when with_vars contains no arguments" do
36
+ @dep = dep('task spec arg passing, no args')
37
+ @dep.should_receive(:with).with({}).and_return(@dep)
38
+ @dep.should_receive(:process).with({:top_level => true})
39
+ Base.task.process ['task spec arg passing, no args']
40
+ end
41
+ it "should provide the values in with_vars as dep arguments with symbol names" do
42
+ @dep = dep('task spec arg passing, 1 arg', :arg)
43
+ @dep.should_receive(:with).with({:arg => 'something argy'}).and_return(@dep)
44
+ @dep.should_receive(:process).with({:top_level => true})
45
+ Base.task.process ['task spec arg passing, 1 arg'], {'arg' => 'something argy'}
46
+ end
47
+ it "should print a warning about unexpected arguments, and not pass them to Dep#with" do
48
+ @dep = dep('task spec arg passing, unexpected arg', :expected)
49
+ Base.task.should_receive(:log_warn).with(%{Ignoring unexpected argument "unexpected", which the dep 'task spec arg passing, unexpected arg' would reject.})
50
+ @dep.should_receive(:with).with({:expected => 'something argy'}).and_return(@dep)
51
+ @dep.should_receive(:process).with({:top_level => true})
52
+ Base.task.process ['task spec arg passing, unexpected arg'], {'expected' => 'something argy', 'unexpected' => 'nobody expects the Spanish arg!'}
53
+ end
54
+ end
55
+ after {
56
+ Base.task.vars.saved_vars.clear
57
+ }
58
+ end
59
+
60
+ describe Task, "saved vars" do
61
+ before {
62
+ Base.task.vars.stub!(:saved_vars).and_return(Hashish.hash.merge(
63
+ 'domain' => {:value => "lol.org"}
64
+ ))
65
+ Base.task.vars.stub!(:vars).and_return(Hashish.hash.merge(
66
+ 'domain' => {:default => :username},
67
+ 'username' => {:default => 'ben'}
68
+ ))
69
+ }
70
+ it "should return the saved value over the set default" do
71
+ Base.task.vars.var(:domain, :ask => false).should == 'lol.org'
72
+ end
73
+ end
74
+
75
+ describe Task, "vars_for_save" do
76
+ before {
77
+ Base.task.vars.stub!(:vars).and_return(standard_vars)
78
+ @vars_for_save = Base.task.vars.for_save
79
+ }
80
+ it "should create a saved_var for every var" do
81
+ (Base.task.vars.vars.keys - @vars_for_save.keys).should == []
82
+ end
83
+ describe "rejecting invalid input" do
84
+ before {
85
+ Base.task.vars.stub!(:vars).and_return(standard_vars.merge({
86
+ "www_aliases" => {:default => L{ 'stub' }, :value => "www.test3.org"},
87
+ "db_password" => {:value => 'sekret'}
88
+ }))
89
+ @vars_for_save = Base.task.vars.for_save
90
+ }
91
+ it "should exclude invalid data types" do
92
+ @vars_for_save['www_aliases'].has_key?(:default).should be_false
93
+ end
94
+ it "should reject passwords" do
95
+ @vars_for_save.has_key?('db_password').should be_false
96
+ end
97
+ end
98
+ describe "subsequent saves" do
99
+ before {
100
+ Base.task.vars.stub!(:saved_vars).and_return(standard_vars)
101
+ Base.task.vars.stub!(:vars).and_return(standard_vars.reject {|k,v| %w[username versions vhost_type].include? k })
102
+ @new_vars_for_save = Base.task.vars.for_save
103
+ }
104
+ it "should preserve old values" do
105
+ (@vars_for_save.keys - @new_vars_for_save.keys).should == []
106
+ end
107
+ end
108
+ describe "referred values" do
109
+ before {
110
+ Base.task.vars.stub!(:vars).and_return(standard_vars.merge({
111
+ "domain" => {:default => :username, :value => "test3.org"},
112
+ "db_domain" => {:default => :domain},
113
+ "db_name" => {:default => :username, :value => 'corkboard'},
114
+ "db_user" => {:default => :db_name, :value => 'corkboard_user'},
115
+ "app_name" => {:default => :username},
116
+ "rake_root" => {:default => :rails_root},
117
+ "static_root" => {:default => :rails_root, :value => "~/projects/corkboard/current/static"}
118
+ }))
119
+ @vars_for_save = Base.task.vars.for_save
120
+ }
121
+ it "should create saved_vars" do
122
+ %w[domain db_name db_user rake_root static_root].each {|key|
123
+ @vars_for_save.has_key?(key).should be_true
124
+ }
125
+ end
126
+ it "should not create a :value" do
127
+ %w[domain db_name db_user rake_root static_root].each {|key|
128
+ @vars_for_save[key].has_key?(:value).should be_false
129
+ }
130
+ end
131
+ it "should store the referenced var's value in :values" do
132
+ @vars_for_save['domain'][:values].should == {nil => 'test3.org'}
133
+ @vars_for_save['db_domain'][:values].should == {}
134
+ @vars_for_save['db_name'][:values].should == {nil => 'corkboard'}
135
+ @vars_for_save['db_user'][:values].should == {'corkboard' => 'corkboard_user'}
136
+ @vars_for_save['app_name'][:values].should == {}
137
+ @vars_for_save['rake_root'][:values].should == {}
138
+ @vars_for_save['static_root'][:values].should == {'~/projects/corkboard/current' => '~/projects/corkboard/current/static'}
139
+ end
140
+ end
141
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe URI, "escaping" do
4
+ it "should escape URLs" do
5
+ URI.escape("http://babushka.me/babushka snapshot.tgz").should == "http://babushka.me/babushka%20snapshot.tgz"
6
+ end
7
+ it "should not escape twice" do
8
+ URI.escape("http://babushka.me/babushka%20snapshot.tgz").should == "http://babushka.me/babushka%20snapshot.tgz"
9
+ end
10
+ it "should handle partially escaped urls" do
11
+ URI.escape("http://babushka.me/ok this is%20just%20a mess.tgz").should == "http://babushka.me/ok%20this%20is%20just%20a%20mess.tgz"
12
+ end
13
+ end
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+
3
+ describe Vars do
4
+ before {
5
+ Base.task.vars.define_var :username, :default => shell('whoami')
6
+ Base.task.vars.define_var :domain, :default => :username
7
+ Base.task.vars.define_var :db_name
8
+ Base.task.vars.define_var :test_user, :default => :db_name
9
+ Base.task.vars.set :nginx_version, '0.7.64'
10
+ }
11
+ describe "without values" do
12
+ it "should return a direct value" do
13
+ Base.task.vars.var(:nginx_version).should == '0.7.64'
14
+ end
15
+ it "should return a direct default" do
16
+ Base.task.vars.default_for(:username).should == `whoami`.chomp
17
+ end
18
+ it "should return a referenced default" do
19
+ Base.task.vars.default_for(:domain).should == `whoami`.chomp
20
+ end
21
+ it "should return nothing when no default is set" do
22
+ Base.task.vars.default_for(:db_name).should be_nil
23
+ end
24
+ it "should return nothing when no default is set on the referred var" do
25
+ Base.task.vars.default_for(:test_user).should be_nil
26
+ end
27
+ end
28
+ describe "with values" do
29
+ before {
30
+ Base.task.vars.set :username, 'bob'
31
+ Base.task.vars.set :db_name, 'bobs_database'
32
+ }
33
+ it "should return a direct value, overriding default" do
34
+ Base.task.vars.var(:username).should == 'bob'
35
+ end
36
+ it "should return a referenced value as a default" do
37
+ Base.task.vars.default_for(:domain).should == 'bob'
38
+ end
39
+ it "should return a direct value when there is no default" do
40
+ Base.task.vars.var(:db_name).should == 'bobs_database'
41
+ end
42
+ it "should return a referenced value when there is no referenced default" do
43
+ Base.task.vars.default_for(:test_user).should == 'bobs_database'
44
+ end
45
+ end
46
+ describe "with values" do
47
+ before {
48
+ Base.task.vars.set :username, 'bob'
49
+ Base.task.vars.set :db_name, 'bobs_database'
50
+ Base.task.vars.set :test_user, 'senor_bob'
51
+ }
52
+ it "should return a direct value when there is no default" do
53
+ Base.task.vars.var(:db_name).should == 'bobs_database'
54
+ end
55
+ it "should return a direct value, overriding the referenced default" do
56
+ Base.task.vars.default_for(:test_user).should == 'bobs_database'
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,110 @@
1
+ require 'spec_helper'
2
+
3
+ def version_of *args
4
+ Babushka::VersionOf::Helpers.VersionOf *args
5
+ end
6
+
7
+ describe "creation" do
8
+ it "should store name" do
9
+ version_of('ruby').name.should == 'ruby'
10
+ end
11
+ it "should accept versions, optionally" do
12
+ version_of('ruby').version.should == nil
13
+ version_of('ruby', '1.8').version.to_s.should == '1.8'
14
+ version_of('ruby', '1.8'.to_version).version.to_s.should == '1.8'
15
+ end
16
+ it "should accept name & version in one string" do
17
+ version_of('ruby 1.8').version.to_s.should == '1.8'
18
+ version_of('ruby >= 1.9').version.to_s.should == '>= 1.9'
19
+ end
20
+ it "should handle array args" do
21
+ version_of(['ruby', '1.8']).version.to_s.should == '1.8'
22
+ end
23
+ it "should accept existing VersionOf instances" do
24
+ version_of(version_of('ruby')).should == version_of('ruby')
25
+ version_of(version_of('ruby', '1.8')).should == version_of('ruby', '1.8')
26
+ version_of(version_of('ruby', '1.8'), '1.9').should == version_of('ruby', '1.9')
27
+ end
28
+ end
29
+
30
+ describe "to_s" do
31
+ describe "versionless" do
32
+ it "should be just the name" do
33
+ version_of('ruby').to_s.should == 'ruby'
34
+ end
35
+ end
36
+ describe "nameless" do
37
+ it "should be just the version" do
38
+ version_of(nil, '1.8').to_s.should == '1.8'
39
+ end
40
+ end
41
+ describe "versioned" do
42
+ it "should be separated with -" do
43
+ version_of('ruby', '1.8').to_s.should == 'ruby-1.8'
44
+ end
45
+ end
46
+ end
47
+
48
+ describe "equality" do
49
+ it "should compare to versionless strings" do
50
+ version_of('ruby' ).should == version_of('ruby')
51
+ version_of('ruby', '1.8').should_not == version_of('ruby')
52
+ end
53
+ it "should compare to versioned strings" do
54
+ version_of('ruby' ).should_not == version_of('ruby', '1.8')
55
+ version_of('ruby', '1.8').should == version_of('ruby', '1.8')
56
+ version_of('ruby', '1.8').should_not == version_of('ruby', '1.9')
57
+ end
58
+ it "should compare to versionless VersionOfs" do
59
+ version_of('ruby' ).should == version_of('ruby')
60
+ version_of('ruby', '1.8').should_not == version_of('ruby')
61
+ end
62
+ it "should compare to versioned VersionOfs" do
63
+ version_of('ruby' ).should_not == version_of('ruby', '1.8')
64
+ version_of('ruby', '1.8').should == version_of('ruby', '1.8')
65
+ version_of('ruby', '1.8').should_not == version_of('ruby', '1.9')
66
+ end
67
+ end
68
+
69
+ describe "comparisons" do
70
+ it "should fail when the names don't match" do
71
+ L{
72
+ version_of('ruby', '1.8') <=> version_of('mongo', '1.4.2')
73
+ }.should raise_error(ArgumentError, "You can't compare the versions of two different things (ruby, mongo).")
74
+ end
75
+ it "should defer to VersionStr#<=>" do
76
+ (version_of('ruby', '1.8') <=> version_of('ruby', '1.9')).should == -1
77
+ (version_of('ruby', '1.8') <=> version_of('ruby', '1.8')).should == 0
78
+ (version_of('ruby', '1.8.7') <=> version_of('ruby', '1.8')).should == 1
79
+ (version_of('ruby', '1.8.7') <=> version_of('ruby', '1.9.1')).should == -1
80
+ end
81
+ end
82
+
83
+ describe "matching" do
84
+ describe "against strings" do
85
+ it "should match all versions when unversioned" do
86
+ version_of('ruby').matches?('1.8').should be_true
87
+ version_of('ruby').matches?('1.9').should be_true
88
+ end
89
+ it "should only match the correct version" do
90
+ version_of('ruby', '1.8').matches?('1.8').should be_true
91
+ version_of('ruby', '1.9').matches?('1.8').should be_false
92
+ version_of('ruby', '>= 1.7').matches?('1.8').should be_true
93
+ version_of('ruby', '~> 1.8').matches?('1.9').should be_true
94
+ version_of('ruby', '~> 1.8').matches?('2.0').should be_false
95
+ end
96
+ end
97
+ describe "against VersionStrs" do
98
+ it "should match all versions when unversioned" do
99
+ version_of('ruby').matches?('1.8'.to_version).should be_true
100
+ version_of('ruby').matches?('1.9'.to_version).should be_true
101
+ end
102
+ it "should only match the correct version" do
103
+ version_of('ruby', '1.8').matches?('1.8'.to_version).should be_true
104
+ version_of('ruby', '1.9').matches?('1.8'.to_version).should be_false
105
+ version_of('ruby', '>= 1.7').matches?('1.8'.to_version).should be_true
106
+ version_of('ruby', '~> 1.8').matches?('1.9'.to_version).should be_true
107
+ version_of('ruby', '~> 1.8').matches?('2.0'.to_version).should be_false
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,130 @@
1
+ require 'spec_helper'
2
+ require 'version_str_support'
3
+
4
+ def compare_with operator
5
+ pairs.zip(results[operator]).each {|pair,expected|
6
+ result = VersionStr.new(pair.first).send operator, VersionStr.new(pair.last)
7
+ it "#{pair.first} #{operator} #{pair.last}: #{result}" do
8
+ result.should == expected
9
+ end
10
+ }
11
+ end
12
+
13
+ %w[== != > < >= <= ~>].each do |operator|
14
+ describe operator do
15
+ compare_with operator
16
+ end
17
+ end
18
+
19
+ describe "comparing" do
20
+ it "should work with other VersionStrs" do
21
+ (VersionStr.new('0.3.1') > VersionStr.new('0.2.9')).should be_true
22
+ end
23
+
24
+ it "should work with strings" do
25
+ (VersionStr.new('0.3.1') > '0.2.9').should be_true
26
+ end
27
+
28
+ it "should treat word pieces as less than no piece" do
29
+ (VersionStr.new('3.0.0') > VersionStr.new('3.0.0.beta')).should be_true
30
+ (VersionStr.new('3.0.0') > VersionStr.new('3.0.0.beta1')).should be_true
31
+ (VersionStr.new('1.0.0') > VersionStr.new('1.0.0.rc.5')).should be_true
32
+ end
33
+
34
+ it "should compare word pieces alphabetically" do
35
+ (VersionStr.new('3.0.0.beta') < VersionStr.new('3.0.0.pre')).should be_true
36
+ (VersionStr.new('3.0.0.pre') < VersionStr.new('3.0.0.rc')).should be_true
37
+ end
38
+
39
+ it "should treat word pieces with a number as more than without one" do
40
+ (VersionStr.new('3.0.0.beta1') > VersionStr.new('3.0.0.beta')).should be_true
41
+ end
42
+
43
+ it "should compare number parts of word pieces numerically" do
44
+ (VersionStr.new('3.0.0.beta2') > VersionStr.new('3.0.0.beta1')).should be_true
45
+ (VersionStr.new('3.0.0.beta10') > VersionStr.new('3.0.0.beta1')).should be_true
46
+ end
47
+
48
+ it "should allow for integers in strings and sort correctly" do
49
+ (VersionStr.new('3.0.0.beta12') > VersionStr.new('3.0.0.beta2')).should be_true
50
+ (VersionStr.new('R13B04') > VersionStr.new('R2B9')).should be_true
51
+ end
52
+ end
53
+
54
+ describe "parsing" do
55
+ it "should parse the version number" do
56
+ VersionStr.new('0.2').pieces.should == [0, 2]
57
+ VersionStr.new('0.3.10.2').pieces.should == [0, 3, 10, 2]
58
+ VersionStr.new('1.9.1-p243').pieces.should == [1, 9, 1, 'p', 243]
59
+ VersionStr.new('3.0.0.beta').pieces.should == [3, 0, 0, 'beta']
60
+ VersionStr.new('3.0.0.beta3').pieces.should == [3, 0, 0, 'beta', 3]
61
+ VersionStr.new('R13B04').pieces.should == ['R', 13, 'B', 4]
62
+ end
63
+ it "should parse the operator if supplied" do
64
+ v = VersionStr.new('>0.2')
65
+ v.pieces.should == [0, 2]
66
+ v.operator.should == '>'
67
+
68
+ v = VersionStr.new('>= 0.2')
69
+ v.pieces.should == [0, 2]
70
+ v.operator.should == '>='
71
+
72
+ v = VersionStr.new(' ~> 0.3.10.2')
73
+ v.pieces.should == [0, 3, 10, 2]
74
+ v.operator.should == '~>'
75
+ end
76
+ it "should convert = to ==" do
77
+ v = VersionStr.new('= 0.2')
78
+ v.pieces.should == [0, 2]
79
+ v.operator.should == '=='
80
+
81
+ v = VersionStr.new('== 0.2')
82
+ v.pieces.should == [0, 2]
83
+ v.operator.should == '=='
84
+ end
85
+ it "should ignore a leading 'v' for 'version'" do
86
+ v = VersionStr.new('V0.5.0')
87
+ v.pieces.should == [0, 5, 0]
88
+ v.operator.should == '=='
89
+
90
+ v = VersionStr.new('>= v1.9.2p180')
91
+ v.pieces.should == [1, 9, 2, 'p', 180]
92
+ v.operator.should == '>='
93
+ end
94
+ it "should reject invalid operators" do
95
+ L{
96
+ VersionStr.new('~ 0.2')
97
+ }.should raise_error(InvalidVersionOperator, "VersionStr.new('~ 0.2'): invalid operator '~'.")
98
+
99
+ L{
100
+ VersionStr.new('>> 0.2')
101
+ }.should raise_error(InvalidVersionOperator, "VersionStr.new('>> 0.2'): invalid operator '>>'.")
102
+ end
103
+ it "should reject bad version numbers" do
104
+ L{
105
+ VersionStr.new('0. 2')
106
+ }.should raise_error(InvalidVersionStr, "VersionStr.new('0. 2'): couldn't parse a version number.")
107
+
108
+ L{
109
+ VersionStr.new('0.2!')
110
+ }.should raise_error(InvalidVersionStr, "VersionStr.new('0.2!'): couldn't parse a version number.")
111
+ end
112
+ end
113
+
114
+ describe 'rendering' do
115
+ it "should render just the version number with no operator" do
116
+ VersionStr.new('0.3.1').to_s.should == '0.3.1'
117
+ end
118
+ it "should render the full string with an operator" do
119
+ VersionStr.new('= 0.3.1').to_s.should == '0.3.1'
120
+ VersionStr.new('== 0.3.1').to_s.should == '0.3.1'
121
+ VersionStr.new('~> 0.3.1').to_s.should == '~> 0.3.1'
122
+ end
123
+ it "should keep string pieces" do
124
+ VersionStr.new('3.0.0.beta').to_s.should == '3.0.0.beta'
125
+ end
126
+ it "should preserve the original formatting" do
127
+ VersionStr.new('1.8.7-p174-src').to_s.should == '1.8.7-p174-src'
128
+ VersionStr.new('3.0.0-beta').to_s.should == '3.0.0-beta'
129
+ end
130
+ end