rubycut-babushka 0.10.6

Sign up to get free protection for your applications and to get access to all the features.
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