automateit 0.70923
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.tar.gz.sig +1 -0
- data/CHANGES.txt +100 -0
- data/Hoe.rake +35 -0
- data/Manifest.txt +111 -0
- data/README.txt +44 -0
- data/Rakefile +284 -0
- data/TESTING.txt +57 -0
- data/TODO.txt +26 -0
- data/TUTORIAL.txt +390 -0
- data/bin/ai +3 -0
- data/bin/aifield +82 -0
- data/bin/aitag +128 -0
- data/bin/automateit +117 -0
- data/docs/friendly_errors.txt +50 -0
- data/docs/previews.txt +86 -0
- data/env.sh +4 -0
- data/examples/basic/Rakefile +26 -0
- data/examples/basic/config/automateit_env.rb +16 -0
- data/examples/basic/config/fields.yml +3 -0
- data/examples/basic/config/tags.yml +13 -0
- data/examples/basic/dist/README.txt +9 -0
- data/examples/basic/dist/myapp_server.erb +30 -0
- data/examples/basic/install.log +15 -0
- data/examples/basic/lib/README.txt +10 -0
- data/examples/basic/recipes/README.txt +4 -0
- data/examples/basic/recipes/install.rb +53 -0
- data/examples/basic/recipes/uninstall.rb +6 -0
- data/gpl.txt +674 -0
- data/lib/automateit.rb +66 -0
- data/lib/automateit/account_manager.rb +106 -0
- data/lib/automateit/account_manager/linux.rb +171 -0
- data/lib/automateit/account_manager/passwd.rb +69 -0
- data/lib/automateit/account_manager/portable.rb +136 -0
- data/lib/automateit/address_manager.rb +165 -0
- data/lib/automateit/address_manager/linux.rb +80 -0
- data/lib/automateit/address_manager/portable.rb +37 -0
- data/lib/automateit/cli.rb +80 -0
- data/lib/automateit/common.rb +65 -0
- data/lib/automateit/constants.rb +33 -0
- data/lib/automateit/edit_manager.rb +292 -0
- data/lib/automateit/error.rb +10 -0
- data/lib/automateit/field_manager.rb +103 -0
- data/lib/automateit/interpreter.rb +641 -0
- data/lib/automateit/package_manager.rb +242 -0
- data/lib/automateit/package_manager/apt.rb +63 -0
- data/lib/automateit/package_manager/egg.rb +64 -0
- data/lib/automateit/package_manager/gem.rb +179 -0
- data/lib/automateit/package_manager/portage.rb +69 -0
- data/lib/automateit/package_manager/yum.rb +65 -0
- data/lib/automateit/platform_manager.rb +47 -0
- data/lib/automateit/platform_manager/darwin.rb +30 -0
- data/lib/automateit/platform_manager/debian.rb +26 -0
- data/lib/automateit/platform_manager/freebsd.rb +25 -0
- data/lib/automateit/platform_manager/gentoo.rb +26 -0
- data/lib/automateit/platform_manager/lsb.rb +40 -0
- data/lib/automateit/platform_manager/struct.rb +78 -0
- data/lib/automateit/platform_manager/uname.rb +29 -0
- data/lib/automateit/platform_manager/windows.rb +33 -0
- data/lib/automateit/plugin.rb +7 -0
- data/lib/automateit/plugin/base.rb +32 -0
- data/lib/automateit/plugin/driver.rb +218 -0
- data/lib/automateit/plugin/manager.rb +232 -0
- data/lib/automateit/project.rb +460 -0
- data/lib/automateit/root.rb +14 -0
- data/lib/automateit/service_manager.rb +79 -0
- data/lib/automateit/service_manager/chkconfig.rb +39 -0
- data/lib/automateit/service_manager/rc_update.rb +37 -0
- data/lib/automateit/service_manager/sysv.rb +126 -0
- data/lib/automateit/service_manager/update_rcd.rb +35 -0
- data/lib/automateit/shell_manager.rb +261 -0
- data/lib/automateit/shell_manager/base_link.rb +67 -0
- data/lib/automateit/shell_manager/link.rb +24 -0
- data/lib/automateit/shell_manager/portable.rb +421 -0
- data/lib/automateit/shell_manager/symlink.rb +32 -0
- data/lib/automateit/shell_manager/which.rb +25 -0
- data/lib/automateit/tag_manager.rb +63 -0
- data/lib/automateit/tag_manager/struct.rb +101 -0
- data/lib/automateit/tag_manager/tag_parser.rb +91 -0
- data/lib/automateit/tag_manager/yaml.rb +29 -0
- data/lib/automateit/template_manager.rb +55 -0
- data/lib/automateit/template_manager/base.rb +172 -0
- data/lib/automateit/template_manager/erb.rb +17 -0
- data/lib/ext/metaclass.rb +17 -0
- data/lib/ext/object.rb +18 -0
- data/lib/hashcache.rb +22 -0
- data/lib/helpful_erb.rb +63 -0
- data/lib/nested_error.rb +33 -0
- data/lib/queued_logger.rb +68 -0
- data/lib/tempster.rb +239 -0
- data/misc/index_gem_repository.rb +303 -0
- data/misc/setup_egg.rb +12 -0
- data/misc/setup_gem_dependencies.sh +7 -0
- data/misc/setup_rubygems.sh +21 -0
- data/misc/which.cmd +6 -0
- data/spec/extras/automateit_service_sysv_test +50 -0
- data/spec/extras/scratch.rb +15 -0
- data/spec/extras/simple_recipe.rb +8 -0
- data/spec/integration/account_manager_spec.rb +218 -0
- data/spec/integration/address_manager_linux_spec.rb +119 -0
- data/spec/integration/address_manager_portable_spec.rb +30 -0
- data/spec/integration/cli_spec.rb +215 -0
- data/spec/integration/examples_spec.rb +54 -0
- data/spec/integration/examples_spec_editor.rb +71 -0
- data/spec/integration/package_manager_spec.rb +104 -0
- data/spec/integration/platform_manager_spec.rb +69 -0
- data/spec/integration/service_manager_sysv_spec.rb +115 -0
- data/spec/integration/shell_manager_spec.rb +471 -0
- data/spec/integration/template_manager_erb_spec.rb +31 -0
- data/spec/spec_helper.rb +23 -0
- data/spec/unit/edit_manager_spec.rb +162 -0
- data/spec/unit/field_manager_spec.rb +79 -0
- data/spec/unit/hashcache_spec.rb +28 -0
- data/spec/unit/interpreter_spec.rb +98 -0
- data/spec/unit/platform_manager_spec.rb +44 -0
- data/spec/unit/plugins_spec.rb +253 -0
- data/spec/unit/tag_manager_spec.rb +189 -0
- data/spec/unit/template_manager_erb_spec.rb +137 -0
- metadata +249 -0
- metadata.gz.sig +0 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), "/../spec_helper.rb")
|
|
2
|
+
|
|
3
|
+
describe "AutomateIt::TemplateManager::ERB" do
|
|
4
|
+
before(:all) do
|
|
5
|
+
@a = AutomateIt.new(:verbosity => Logger::WARN)
|
|
6
|
+
@m = @a.template_manager
|
|
7
|
+
@d = @m[:erb]
|
|
8
|
+
@d.setup(:default_check => :mtime)
|
|
9
|
+
@d.available?.should be_true
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "should set mode when rendering" do
|
|
13
|
+
@a.mktempdircd do
|
|
14
|
+
source = "foo"
|
|
15
|
+
target = "bar"
|
|
16
|
+
mode1 = 0646 if INTERPRETER.shell_manager.provides_mode?
|
|
17
|
+
mode2 = 0100646
|
|
18
|
+
File.open(source, "w+"){|h| h.write("<%=variable%>")}
|
|
19
|
+
|
|
20
|
+
opts = {:file => source, :to => target, :locals => {:variable => 42}}
|
|
21
|
+
opts[:mode] = mode1 if mode1
|
|
22
|
+
@a.render(opts).should be_true
|
|
23
|
+
File.read(target).should == "42"
|
|
24
|
+
if INTERPRETER.shell_manager.provides_mode?
|
|
25
|
+
File.stat(target).mode.should == mode2
|
|
26
|
+
else
|
|
27
|
+
puts "NOTE: Can't check permission modes on this platform, #{__FILE__}"
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
AutomateIt_Base = File.dirname(File.expand_path(__FILE__)) unless defined?(AutomateIt_Base)
|
|
2
|
+
AutomateIt_Lib = File.join(AutomateIt_Base, "/../lib") unless defined?(AutomateIt_Lib)
|
|
3
|
+
AutomateIt_Bin = File.join(AutomateIt_Base, "/../bin") unless defined?(AutomateIt_Bin)
|
|
4
|
+
|
|
5
|
+
$LOAD_PATH.unshift(AutomateIt_Lib)
|
|
6
|
+
|
|
7
|
+
# Remove environmental variables that will contaminate tests
|
|
8
|
+
ENV.delete("AUTOMATEIT_PROJECT")
|
|
9
|
+
|
|
10
|
+
require 'automateit'
|
|
11
|
+
|
|
12
|
+
# Create a global instance, using WARN verbosity so that
|
|
13
|
+
# INTERPRETER.mktempdircd calls don't generate output.
|
|
14
|
+
unless defined?(INTERPRETER)
|
|
15
|
+
INTERPRETER = AutomateIt.new(:verbosity => Logger::WARN)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Inject matchers into interpreter, e.g., 'should be_true'
|
|
19
|
+
INTERPRETER.class.send(:include, Spec::Matchers)
|
|
20
|
+
|
|
21
|
+
def write_to(filename, text)
|
|
22
|
+
File.open(filename, "w+"){|h| h.write(text)}
|
|
23
|
+
end
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), "/../spec_helper.rb")
|
|
2
|
+
|
|
3
|
+
describe "AutomateIt::EditManager for strings" do
|
|
4
|
+
before(:all) do
|
|
5
|
+
@a = AutomateIt.new(:verbosity => Logger::WARN)
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
before(:each) do
|
|
9
|
+
@input = "This\nis\n\a\nstring."
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "should pass contents" do
|
|
13
|
+
@a.edit(:text => @input) do
|
|
14
|
+
contents.should == "This\nis\n\a\nstring."
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "should pass params" do
|
|
19
|
+
@a.edit(:text => @input, :params => {:hello => "world"}) do
|
|
20
|
+
params[:hello].should == "world"
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "should find contained lines" do
|
|
25
|
+
@a.edit(:text => @input) do
|
|
26
|
+
contains?(/This/).should == true
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "should prepend lines to the top" do
|
|
31
|
+
output = @a.edit(:text => @input) do
|
|
32
|
+
prepend "PREPEND"
|
|
33
|
+
prepend "PREPEND" # Duplicate line will be ignored.
|
|
34
|
+
end
|
|
35
|
+
output.should =~ /\APREPEND\nThis/s
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "should prepend lines to the top unless they match an expression" do
|
|
39
|
+
output = @a.edit(:text => @input) do
|
|
40
|
+
prepend "PREPEND", :unless => /PR.+ND/
|
|
41
|
+
prepend "PRETENDER", :unless => /PR.+ND/ # Regexp matches.
|
|
42
|
+
end
|
|
43
|
+
output.should =~ /\APREPEND\nThis/s
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "should append lines to the bottom" do
|
|
47
|
+
output = @a.edit(:text => @input) do
|
|
48
|
+
append "APPEND"
|
|
49
|
+
append "APPEND" # Duplicate line will be ignored.
|
|
50
|
+
end
|
|
51
|
+
output.should =~ /string\.\nAPPEND\Z/s
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "should append lines to the bottom unless they match an expression" do
|
|
55
|
+
output = @a.edit(:text => @input) do
|
|
56
|
+
append "APPEND", :unless => /^APP/
|
|
57
|
+
append "APPENDIX", :unless => /^APP/ # Regexp matches.
|
|
58
|
+
end
|
|
59
|
+
output.should =~ /^string\.\nAPPEND\Z/s
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it "should delete lines" do
|
|
63
|
+
output = @a.edit(:text => @input) do
|
|
64
|
+
delete "This"
|
|
65
|
+
end
|
|
66
|
+
output.should_not =~ /This/
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it "should comment lines" do
|
|
70
|
+
output = @a.edit(:text => @input) do
|
|
71
|
+
comment_style "<", ">"
|
|
72
|
+
comment "This"
|
|
73
|
+
end
|
|
74
|
+
output.should =~ /^<This>$/s
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it "should uncomment lines" do
|
|
78
|
+
output = @a.edit(:text => @input) do
|
|
79
|
+
comment_style "T", "s"
|
|
80
|
+
uncomment "hi"
|
|
81
|
+
end
|
|
82
|
+
output.should =~ /^hi\nis\n/s
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
it "should replace strings" do
|
|
86
|
+
output = @a.edit(:text => @input) do
|
|
87
|
+
replace "This", "That"
|
|
88
|
+
end
|
|
89
|
+
output.should =~ /^That\nis\n/s
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
it "should manipulate contents" do
|
|
93
|
+
output = @a.edit(:text => @input) do
|
|
94
|
+
manipulate do |buffer|
|
|
95
|
+
buffer.gsub(/i/, "@")
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
output.should =~ /^Th@s\n@s\n/
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
it "should tell if content is different after an edit" do
|
|
102
|
+
@a.edit(:text => @input) do
|
|
103
|
+
different?.should == false
|
|
104
|
+
append "changing"
|
|
105
|
+
different?.should == true
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
it "should provide session with access to interpreter" do
|
|
110
|
+
@a.lookup["foo"] = "bar"
|
|
111
|
+
output = @a.edit(:text => @input) do
|
|
112
|
+
manipulate do |b|
|
|
113
|
+
lookup "foo"
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
output.should == "bar"
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
it "should raise exceptions for invalid methods" do
|
|
120
|
+
lambda {
|
|
121
|
+
@a.edit(:text => @input) do
|
|
122
|
+
qwoiuerjzxiuo
|
|
123
|
+
end
|
|
124
|
+
}.should raise_error(NameError, /qwoiuerjzxiuo/)
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
describe "AutomateIt::EditManager for files" do
|
|
129
|
+
before(:all) do
|
|
130
|
+
@a = AutomateIt.new(:verbosity => Logger::WARN)
|
|
131
|
+
@filename = "input"
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
before(:each) do
|
|
135
|
+
@input = "This\nis\n\a\nstring."
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
it "should edit a file" do
|
|
139
|
+
File.should_receive(:read).with(@filename).and_return(@input)
|
|
140
|
+
File.should_receive(:open).with(@filename, "w+").and_return(true)
|
|
141
|
+
result = @a.edit(:file => @filename) do
|
|
142
|
+
append "APPEND"
|
|
143
|
+
end
|
|
144
|
+
result.should be_true
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
it "should not rewrite an unchanged file" do
|
|
148
|
+
File.should_receive(:read).with(@filename).and_return(@input)
|
|
149
|
+
result = @a.edit(:file => @filename) do
|
|
150
|
+
# Do nothing
|
|
151
|
+
end
|
|
152
|
+
result.should be_false
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
it "should default to editing a file" do
|
|
156
|
+
File.should_receive(:read).with(@filename).and_return(@input)
|
|
157
|
+
result = @a.edit(@filename) do
|
|
158
|
+
# Do nothing
|
|
159
|
+
end
|
|
160
|
+
result.should be_false
|
|
161
|
+
end
|
|
162
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), "/../spec_helper.rb")
|
|
2
|
+
|
|
3
|
+
describe "AutomateIt::FieldManager", :shared => true do
|
|
4
|
+
before(:all) do
|
|
5
|
+
@a = AutomateIt.new
|
|
6
|
+
@a.tags << "magical_hosts"
|
|
7
|
+
@m = @a.field_manager
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
it "should be able to lookup entire hash" do
|
|
11
|
+
rv = @m.lookup("*")
|
|
12
|
+
rv.keys.should include("hash")
|
|
13
|
+
rv["hash"].should be_a_kind_of(Hash)
|
|
14
|
+
rv.keys.should include("key")
|
|
15
|
+
rv["key"].should == "value"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "should lookup keys by string" do
|
|
19
|
+
@m.lookup("key").should == "value"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "should lookup keys by symbol" do
|
|
23
|
+
@m.lookup(:key).should == "value"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "should lookup hash" do
|
|
27
|
+
@m.lookup(:hash)["leafkey"].should == "leafvalue"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "should lookup leaves" do
|
|
31
|
+
@m.lookup("hash#leafkey").should == "leafvalue"
|
|
32
|
+
@m.lookup("hash#branchkey#deepleafkey").should == "deepleafvalue"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "should have aliased lookup into the interpreter" do
|
|
36
|
+
@m.should equal(@m.interpreter.field_manager)
|
|
37
|
+
@m[:yaml].should equal(@m.interpreter.field_manager[:yaml])
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "should be aliases into the interpreter" do
|
|
41
|
+
@a.lookup("hash#leafkey").should == "leafvalue"
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
describe AutomateIt::FieldManager::Struct do
|
|
46
|
+
it_should_behave_like "AutomateIt::FieldManager"
|
|
47
|
+
|
|
48
|
+
before(:all) do
|
|
49
|
+
@m.setup(:default => :struct, :struct => {
|
|
50
|
+
"key" => "value",
|
|
51
|
+
"hash" => {
|
|
52
|
+
"leafkey" => "leafvalue",
|
|
53
|
+
"branchkey" => {
|
|
54
|
+
"deepleafkey" => "deepleafvalue",
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
})
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
describe AutomateIt::FieldManager::YAML do
|
|
62
|
+
it_should_behave_like "AutomateIt::FieldManager"
|
|
63
|
+
|
|
64
|
+
before(:all) do
|
|
65
|
+
@m[:yaml].should_receive(:_read).with("demo.yml").and_return(<<-EOB)
|
|
66
|
+
<%="key"%>: value
|
|
67
|
+
hash:
|
|
68
|
+
leafkey: leafvalue
|
|
69
|
+
branchkey:
|
|
70
|
+
deepleafkey: deepleafvalue
|
|
71
|
+
magical: <%= tagged?("magical_hosts") ? true : false %>
|
|
72
|
+
EOB
|
|
73
|
+
@m.setup(:default => :yaml, :file => "demo.yml")
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
it "should expose the interpreter to ERB statements" do
|
|
77
|
+
@a.lookup("magical").should be_true
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), "/../spec_helper.rb")
|
|
2
|
+
|
|
3
|
+
describe "HashCache" do
|
|
4
|
+
before(:each) do
|
|
5
|
+
@c = HashCache.new
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
it "should store and fetch values" do
|
|
9
|
+
@c.store("foo", "bar")
|
|
10
|
+
@c.fetch("foo").should == "bar"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "should store values when needed if given a block" do
|
|
14
|
+
@c.fetch("foo"){"bar"}.should == "bar"
|
|
15
|
+
@c.fetch("foo").should == "bar"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "should use HashCached values" do
|
|
19
|
+
@c.fetch("foo"){"bar"}.should == "bar"
|
|
20
|
+
@c.fetch("foo"){raise Exception.new("won't be raised")}.should == "bar"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "should invalidate values" do
|
|
24
|
+
@c.store("foo", "bar")
|
|
25
|
+
@c.delete("foo")
|
|
26
|
+
@c.fetch("foo").should be_nil
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), "/../spec_helper.rb")
|
|
2
|
+
|
|
3
|
+
describe AutomateIt::Interpreter do
|
|
4
|
+
before(:all) do
|
|
5
|
+
@a = AutomateIt::Interpreter.new(:verbosity => Logger::WARN)
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
it "should have a logger" do
|
|
9
|
+
@a.log.should be_a_kind_of(Logger)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "should provide a preview mode" do
|
|
13
|
+
@a.preview = true
|
|
14
|
+
@a.preview?.should be_true
|
|
15
|
+
@a.preview_for("answer"){42}.should == :preview
|
|
16
|
+
@a.noop?.should be_true
|
|
17
|
+
@a.writing?.should be_false
|
|
18
|
+
|
|
19
|
+
@a.preview = false
|
|
20
|
+
@a.preview?.should be_false
|
|
21
|
+
@a.preview_for("answer"){42}.should == 42
|
|
22
|
+
@a.noop?.should be_false
|
|
23
|
+
@a.writing?.should be_true
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "should eval commands within Interpreter's context" do
|
|
27
|
+
@a.preview = true
|
|
28
|
+
@a.instance_eval{preview?}.should be_true
|
|
29
|
+
@a.instance_eval{self}.should == @a
|
|
30
|
+
@a.instance_eval("preview?").should be_true
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it "should be able to include methods into a class" do
|
|
34
|
+
@a.preview = true
|
|
35
|
+
@a.instance_eval do
|
|
36
|
+
class MyInterpreterWrapper1
|
|
37
|
+
def initialize(interpreter)
|
|
38
|
+
interpreter.include_in(self)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def answer
|
|
42
|
+
42
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Method overridden by Interpreter#preview?
|
|
46
|
+
def preview?
|
|
47
|
+
raise ArgumentError.new("MyInterpreterWrapper#preview? wasn't overriden")
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
mc = MyInterpreterWrapper1.new(self)
|
|
51
|
+
mc.answer.should == 42 # Instance method
|
|
52
|
+
mc.preview?.should == true # Interpreter method that overrides instance
|
|
53
|
+
lambda{ mc.not_a_method }.should raise_error(NoMethodError)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "should be able to add method_missing to a class" do
|
|
58
|
+
@a.preview = true
|
|
59
|
+
@a.instance_eval do
|
|
60
|
+
class MyInterpreterWrapper2
|
|
61
|
+
def initialize(interpreter)
|
|
62
|
+
interpreter.add_method_missing_to(self)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def answer
|
|
66
|
+
42
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Method masking Interpreter#preview?
|
|
70
|
+
def preview?
|
|
71
|
+
42
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
mc = MyInterpreterWrapper2.new(self)
|
|
75
|
+
mc.answer.should == 42 # Instance method
|
|
76
|
+
mc.preview?.should == 42 # Instance method masking Interpreter
|
|
77
|
+
lambda{ mc.not_a_method }.should raise_error(NoMethodError)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
it "should be able to add method_missing to a class with an existing method_missing" do
|
|
82
|
+
@a.preview = true
|
|
83
|
+
@a.instance_eval do
|
|
84
|
+
class MyInterpreterWrapper3
|
|
85
|
+
def initialize(interpreter)
|
|
86
|
+
interpreter.add_method_missing_to(self)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def method_missing(method, *args, &block)
|
|
90
|
+
42
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
mc = MyInterpreterWrapper3.new(self)
|
|
94
|
+
mc.answer.should == 42 # Instance#method_missing
|
|
95
|
+
mc.preview?.should == true # Interpreter method
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), "/../spec_helper.rb")
|
|
2
|
+
|
|
3
|
+
describe "AutomateIt::PlatformManager" do
|
|
4
|
+
before(:all) do
|
|
5
|
+
@a = AutomateIt.new
|
|
6
|
+
@m = @a.platform_manager
|
|
7
|
+
@m.setup(:default => :struct, :struct => {
|
|
8
|
+
:os => "mizrahi",
|
|
9
|
+
:arch => "realian",
|
|
10
|
+
:distro => "momo",
|
|
11
|
+
:version => "s100",
|
|
12
|
+
})
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "should query key by symbol" do
|
|
16
|
+
@m.query(:os).should == "mizrahi"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "should query key by string" do
|
|
20
|
+
@m.query("distro").should == "momo"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "should query by two-key query" do
|
|
24
|
+
@m.query("os#arch").should == "mizrahi_realian"
|
|
25
|
+
@m.query("distro#version").should == "momo_s100"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "should query by three-part query" do
|
|
29
|
+
@m.query("os#distro#version").should == "mizrahi_momo_s100"
|
|
30
|
+
@m.query("distro#version#arch").should == "momo_s100_realian"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it "should query by aliases" do
|
|
34
|
+
@m.query("release#version").should == "s100_s100"
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "should fail on invalid top-level keys" do
|
|
38
|
+
lambda { @m.query(:asdf) }.should raise_error(IndexError)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "should fail on invalid subkeys" do
|
|
42
|
+
lambda { @m.query("os#asdf") }.should raise_error(IndexError)
|
|
43
|
+
end
|
|
44
|
+
end
|