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.
- data/Gemfile +8 -0
- data/Gemfile.lock +31 -0
- data/README.markdown +246 -0
- data/Rakefile +26 -0
- data/bin/babushka +11 -0
- data/deps/babushka.rb +101 -0
- data/deps/dev.rb +12 -0
- data/deps/fhs.rb +31 -0
- data/deps/git.rb +29 -0
- data/deps/homebrew.rb +30 -0
- data/deps/os_x.rb +33 -0
- data/deps/packages.rb +22 -0
- data/deps/pkg_managers.rb +110 -0
- data/deps/ruby.rb +23 -0
- data/deps/rubygems.rb +24 -0
- data/deps/system.rb +10 -0
- data/deps/templates/app.rb +68 -0
- data/deps/templates/external.rb +12 -0
- data/deps/templates/installer.rb +31 -0
- data/deps/templates/managed.rb +105 -0
- data/deps/templates/ppa.rb +24 -0
- data/deps/templates/src.rb +42 -0
- data/deps/templates/tmbundle.rb +15 -0
- data/lib/babushka.rb +28 -0
- data/lib/babushka/accepts_block_for.rb +72 -0
- data/lib/babushka/accepts_list_for.rb +49 -0
- data/lib/babushka/accepts_value_for.rb +24 -0
- data/lib/babushka/base.rb +78 -0
- data/lib/babushka/bug_reporter.rb +55 -0
- data/lib/babushka/cmdline.rb +133 -0
- data/lib/babushka/cmdline/handler.rb +41 -0
- data/lib/babushka/cmdline/helpers.rb +127 -0
- data/lib/babushka/cmdline/parser.rb +69 -0
- data/lib/babushka/colorizer.rb +59 -0
- data/lib/babushka/core_patches/array.rb +171 -0
- data/lib/babushka/core_patches/blank.rb +22 -0
- data/lib/babushka/core_patches/bytes.rb +52 -0
- data/lib/babushka/core_patches/hash.rb +107 -0
- data/lib/babushka/core_patches/hashish.rb +14 -0
- data/lib/babushka/core_patches/integer.rb +25 -0
- data/lib/babushka/core_patches/io.rb +8 -0
- data/lib/babushka/core_patches/numeric.rb +16 -0
- data/lib/babushka/core_patches/object.rb +27 -0
- data/lib/babushka/core_patches/string.rb +116 -0
- data/lib/babushka/core_patches/symbol.rb +12 -0
- data/lib/babushka/core_patches/try.rb +15 -0
- data/lib/babushka/core_patches/uri.rb +24 -0
- data/lib/babushka/dep.rb +470 -0
- data/lib/babushka/dep_context.rb +18 -0
- data/lib/babushka/dep_definer.rb +115 -0
- data/lib/babushka/dep_pool.rb +49 -0
- data/lib/babushka/dep_runner.rb +85 -0
- data/lib/babushka/dsl.rb +26 -0
- data/lib/babushka/git_repo.rb +185 -0
- data/lib/babushka/helpers/git_helpers.rb +32 -0
- data/lib/babushka/helpers/log_helpers.rb +176 -0
- data/lib/babushka/helpers/path_helpers.rb +34 -0
- data/lib/babushka/helpers/run_helpers.rb +145 -0
- data/lib/babushka/helpers/shell_helpers.rb +229 -0
- data/lib/babushka/helpers/suggest_helpers.rb +16 -0
- data/lib/babushka/helpers/uri_helpers.rb +36 -0
- data/lib/babushka/ip.rb +160 -0
- data/lib/babushka/lambda_chooser.rb +40 -0
- data/lib/babushka/levenshtein.rb +125 -0
- data/lib/babushka/meta_dep.rb +65 -0
- data/lib/babushka/meta_dep_context.rb +15 -0
- data/lib/babushka/parameter.rb +143 -0
- data/lib/babushka/pkg_helper.rb +81 -0
- data/lib/babushka/pkg_helpers/apt_helper.rb +61 -0
- data/lib/babushka/pkg_helpers/base_helper.rb +19 -0
- data/lib/babushka/pkg_helpers/binpkgsrc_helper.rb +48 -0
- data/lib/babushka/pkg_helpers/binports_helper.rb +34 -0
- data/lib/babushka/pkg_helpers/brew_helper.rb +110 -0
- data/lib/babushka/pkg_helpers/gem_helper.rb +120 -0
- data/lib/babushka/pkg_helpers/macports_helper.rb +22 -0
- data/lib/babushka/pkg_helpers/npm_helper.rb +45 -0
- data/lib/babushka/pkg_helpers/pacman_helper.rb +27 -0
- data/lib/babushka/pkg_helpers/pip_helper.rb +45 -0
- data/lib/babushka/pkg_helpers/src_helper.rb +16 -0
- data/lib/babushka/pkg_helpers/yum_helper.rb +25 -0
- data/lib/babushka/popen.rb +40 -0
- data/lib/babushka/prompt.rb +176 -0
- data/lib/babushka/renderable.rb +67 -0
- data/lib/babushka/resource.rb +215 -0
- data/lib/babushka/run_reporter.rb +60 -0
- data/lib/babushka/shell.rb +108 -0
- data/lib/babushka/source.rb +216 -0
- data/lib/babushka/source_pool.rb +146 -0
- data/lib/babushka/system_definitions.rb +97 -0
- data/lib/babushka/system_profile.rb +210 -0
- data/lib/babushka/task.rb +142 -0
- data/lib/babushka/vars.rb +108 -0
- data/lib/babushka/version_of.rb +65 -0
- data/lib/babushka/version_str.rb +57 -0
- data/lib/babushka/xml_string.rb +28 -0
- data/lib/components.rb +82 -0
- data/lib/fancypath/fancypath.rb +200 -0
- data/lib/inkan/inkan.rb +76 -0
- data/spec/acceptance/acceptance.rb +43 -0
- data/spec/acceptance_helper.rb +113 -0
- data/spec/archives/Blah.app.zip +0 -0
- data/spec/archives/archive.tar +0 -0
- data/spec/archives/archive.tar.bz2 +0 -0
- data/spec/archives/archive.tar.gz +0 -0
- data/spec/archives/archive.tbz2 +0 -0
- data/spec/archives/archive.tgz +0 -0
- data/spec/archives/archive.zip +0 -0
- data/spec/archives/content.txt +5 -0
- data/spec/archives/invalid_archive +5 -0
- data/spec/archives/nested archive/content.txt +5 -0
- data/spec/archives/nested_archive.tar +0 -0
- data/spec/archives/really_a_gzip.zip +0 -0
- data/spec/archives/test-0.3.1.tgz +0 -0
- data/spec/archives/tgz_archive +0 -0
- data/spec/archives/zip_without_extension +0 -0
- data/spec/babushka/accepts_for_spec.rb +174 -0
- data/spec/babushka/accepts_for_support.rb +72 -0
- data/spec/babushka/cmdline/console_spec.rb +11 -0
- data/spec/babushka/cmdline/help_spec.rb +61 -0
- data/spec/babushka/cmdline/version_spec.rb +10 -0
- data/spec/babushka/core_patches_spec.rb +171 -0
- data/spec/babushka/dep_context_spec.rb +58 -0
- data/spec/babushka/dep_definer_spec.rb +152 -0
- data/spec/babushka/dep_definer_support.rb +36 -0
- data/spec/babushka/dep_spec.rb +567 -0
- data/spec/babushka/dep_support.rb +29 -0
- data/spec/babushka/deps_spec.rb +113 -0
- data/spec/babushka/gem_helper_spec.rb +90 -0
- data/spec/babushka/git_repo_spec.rb +396 -0
- data/spec/babushka/ip_spec.rb +131 -0
- data/spec/babushka/lambda_chooser_spec.rb +115 -0
- data/spec/babushka/meta_dep_definer_spec.rb +127 -0
- data/spec/babushka/meta_dep_wrapper_spec.rb +32 -0
- data/spec/babushka/parameter_spec.rb +135 -0
- data/spec/babushka/path_helpers_spec.rb +102 -0
- data/spec/babushka/prompt_spec.rb +188 -0
- data/spec/babushka/renderable_spec.rb +100 -0
- data/spec/babushka/resource_spec.rb +141 -0
- data/spec/babushka/run_helpers_spec.rb +26 -0
- data/spec/babushka/shell_helpers_spec.rb +244 -0
- data/spec/babushka/shell_spec.rb +19 -0
- data/spec/babushka/source_pool_spec.rb +320 -0
- data/spec/babushka/source_pool_support.rb +31 -0
- data/spec/babushka/source_spec.rb +382 -0
- data/spec/babushka/source_support.rb +17 -0
- data/spec/babushka/system_profile_spec.rb +61 -0
- data/spec/babushka/task_spec.rb +141 -0
- data/spec/babushka/uri_spec.rb +13 -0
- data/spec/babushka/vars_spec.rb +59 -0
- data/spec/babushka/version_of_spec.rb +110 -0
- data/spec/babushka/version_str_spec.rb +130 -0
- data/spec/babushka/version_str_support.rb +37 -0
- data/spec/babushka/xml_string_spec.rb +98 -0
- data/spec/deps/bad/broken.rb +7 -0
- data/spec/deps/bad/working.rb +3 -0
- data/spec/deps/good/meta.rb +14 -0
- data/spec/deps/good/test.rb +11 -0
- data/spec/deps/outer/deps.rb +19 -0
- data/spec/deps/outer/more deps.rb +11 -0
- data/spec/deps/params/params.rb +10 -0
- data/spec/fancypath/fancypath_spec.rb +272 -0
- data/spec/fancypath_support.rb +10 -0
- data/spec/inkan/inkan_spec.rb +217 -0
- data/spec/renderable/different_example.conf.erb +4 -0
- data/spec/renderable/example.conf.erb +3 -0
- data/spec/renderable/example.sh +6 -0
- data/spec/renderable/with_binding.conf.erb +4 -0
- data/spec/renderable/xml_example.conf.erb +8 -0
- data/spec/repos/remote.git.tgz +0 -0
- data/spec/spec_helper.rb +87 -0
- 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
|