boson 0.4.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gemspec +6 -7
- data/.rspec +2 -0
- data/.travis.yml +7 -0
- data/CHANGELOG.rdoc +1 -1
- data/README.md +144 -0
- data/README.rdoc +2 -2
- data/Upgrading.md +23 -0
- data/bin/boson +2 -2
- data/lib/boson.rb +44 -52
- data/lib/boson/bare_runner.rb +83 -0
- data/lib/boson/bin_runner.rb +114 -0
- data/lib/boson/command.rb +92 -132
- data/lib/boson/inspector.rb +49 -48
- data/lib/boson/library.rb +71 -120
- data/lib/boson/loader.rb +73 -84
- data/lib/boson/manager.rb +131 -135
- data/lib/boson/method_inspector.rb +112 -0
- data/lib/boson/option_command.rb +71 -154
- data/lib/boson/option_parser.rb +178 -173
- data/lib/boson/options.rb +46 -32
- data/lib/boson/runner.rb +58 -66
- data/lib/boson/runner_library.rb +31 -0
- data/lib/boson/scientist.rb +48 -81
- data/lib/boson/util.rb +46 -61
- data/lib/boson/version.rb +1 -1
- data/test/bin_runner_test.rb +53 -191
- data/test/command_test.rb +5 -9
- data/test/deps.rip +2 -2
- data/test/loader_test.rb +18 -216
- data/test/manager_test.rb +69 -79
- data/test/method_inspector_test.rb +12 -36
- data/test/option_parser_test.rb +45 -32
- data/test/runner_library_test.rb +10 -0
- data/test/runner_test.rb +158 -28
- data/test/scientist_test.rb +9 -147
- data/test/test_helper.rb +87 -52
- metadata +30 -72
- data/deps.rip +0 -2
- data/lib/boson/commands.rb +0 -7
- data/lib/boson/commands/core.rb +0 -77
- data/lib/boson/commands/web_core.rb +0 -153
- data/lib/boson/index.rb +0 -48
- data/lib/boson/inspectors/argument_inspector.rb +0 -97
- data/lib/boson/inspectors/comment_inspector.rb +0 -100
- data/lib/boson/inspectors/method_inspector.rb +0 -98
- data/lib/boson/libraries/file_library.rb +0 -144
- data/lib/boson/libraries/gem_library.rb +0 -30
- data/lib/boson/libraries/local_file_library.rb +0 -30
- data/lib/boson/libraries/module_library.rb +0 -37
- data/lib/boson/libraries/require_library.rb +0 -23
- data/lib/boson/namespace.rb +0 -31
- data/lib/boson/pipe.rb +0 -147
- data/lib/boson/pipes.rb +0 -75
- data/lib/boson/repo.rb +0 -107
- data/lib/boson/runners/bin_runner.rb +0 -208
- data/lib/boson/runners/console_runner.rb +0 -58
- data/lib/boson/view.rb +0 -95
- data/test/argument_inspector_test.rb +0 -62
- data/test/commands_test.rb +0 -22
- data/test/comment_inspector_test.rb +0 -126
- data/test/file_library_test.rb +0 -42
- data/test/pipes_test.rb +0 -65
- data/test/repo_index_test.rb +0 -122
- data/test/repo_test.rb +0 -23
data/test/command_test.rb
CHANGED
@@ -2,21 +2,17 @@ require File.join(File.dirname(__FILE__), 'test_helper')
|
|
2
2
|
|
3
3
|
describe "Command" do
|
4
4
|
describe ".find" do
|
5
|
-
|
5
|
+
before do
|
6
6
|
reset_boson
|
7
|
-
|
8
|
-
|
9
|
-
@top_level_command = Command.new(:name=>'blah', :lib=>'bling')
|
10
|
-
Boson.commands << @namespace_command
|
11
|
-
Boson.commands << @top_level_command
|
12
|
-
}
|
7
|
+
@top_level_command = create_command(:name=>'blah', :lib=>'bling')
|
8
|
+
end
|
13
9
|
|
14
10
|
it 'finds correct command when a subcommand of the same name exists' do
|
15
11
|
Command.find('blah').should == @top_level_command
|
16
12
|
end
|
17
13
|
|
18
|
-
it 'finds
|
19
|
-
Command.find(
|
14
|
+
it 'finds nothing given nil' do
|
15
|
+
Command.find(nil).should == nil
|
20
16
|
end
|
21
17
|
end
|
22
18
|
end
|
data/test/deps.rip
CHANGED
data/test/loader_test.rb
CHANGED
@@ -1,235 +1,37 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
2
|
|
3
3
|
describe "Loader" do
|
4
|
-
def load_namespace_library
|
5
|
-
Manager.load([Boson::Commands::Namespace])
|
6
|
-
end
|
7
|
-
|
8
|
-
before { Gem.stubs(:loaded_specs).returns({}) } if RUBY_VERSION >= '1.9.2' && defined? Gem
|
9
|
-
describe "config" do
|
10
|
-
before { reset }
|
11
|
-
it "from callback overridden by user's config" do
|
12
|
-
with_config(:libraries=>{'blih'=>{:namespace=>false}}) do
|
13
|
-
load :blih, :file_string=>"module Blah; def self.config; {:namespace=>'bling'}; end; end"
|
14
|
-
library('blih').namespace.should == false
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
# if this test fails, other exists? using methods fail
|
19
|
-
it "from callback recursively merges with user's config" do
|
20
|
-
with_config(:libraries=>{'blah'=>{:commands=>{'bling'=>{:desc=>'bling', :options=>{:num=>3}}}}}) do
|
21
|
-
File.stubs(:exists?).returns(true)
|
22
|
-
load :blah, :file_string=> "module Blah; def self.config; {:commands=>{'blang'=>{:alias=>'ba'}, " +
|
23
|
-
"'bling'=>{:options=>{:verbose=>:boolean}}}}; end; end"
|
24
|
-
library('blah').command_object('bling').options.should == {:verbose=>:boolean, :num=>3}
|
25
|
-
library('blah').command_object('bling').desc.should == 'bling'
|
26
|
-
library('blah').command_object('blang').alias.should == 'ba'
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
it "non-hash from inspector overridden by user's config" do
|
31
|
-
with_config(:libraries=>{'blah'=>{:commands=>{'bling'=>{:desc=>'already'}}}}) do
|
32
|
-
load :blah, :file_string=>"module Blah; #from file\ndef bling; end; end"
|
33
|
-
library('blah').command_object('bling').desc.should == 'already'
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
it "from inspector attribute config sets command's config" do
|
38
|
-
load :blah, :file_string=>"module Blah; config :alias=>'ok'\n; def bling; end; end"
|
39
|
-
library('blah').command_object('bling').alias.should == 'ok'
|
40
|
-
end
|
41
|
-
|
42
|
-
it "hash from inspector recursively merged with user's config" do
|
43
|
-
with_config(:libraries=>{'blah'=>{:commands=>{'blung'=>{:args=>[], :render_options=>{:sort=>'this'}}}}}) do
|
44
|
-
CommentInspector.expects(:scrape).returns({:render_options=>{:fields=>['this']}})
|
45
|
-
load :blah, :file_string=>"module Blah; def blung; end; end"
|
46
|
-
library('blah').command_object('blung').render_options.should == {:fields=>["this"], :sort=>"this"}
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
4
|
describe "load" do
|
52
5
|
before { reset }
|
53
|
-
it "calls included callback" do
|
54
|
-
capture_stdout {
|
55
|
-
load :blah, :file_string=>"module Blah; def self.included(mod); puts 'included blah'; end; def blah; end; end"
|
56
|
-
}.should =~ /included blah/
|
57
|
-
end
|
58
6
|
|
59
|
-
it "
|
60
|
-
|
61
|
-
|
62
|
-
|
7
|
+
it "prints error for method conflicts with main_object method" do
|
8
|
+
runner = create_runner :require
|
9
|
+
manager_load runner
|
10
|
+
stderr.should =~ /Unable to load library Blarg.*conflict.*commands: require/
|
63
11
|
end
|
64
12
|
|
65
|
-
it "prints error
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
13
|
+
it "prints error for method conflicts between libraries" do
|
14
|
+
create_runner :whoops
|
15
|
+
create_runner :whoops, library: :Blorg
|
16
|
+
Manager.load Blarg
|
17
|
+
manager_load Blorg
|
18
|
+
stderr.should =~ /^Unable to load library Blorg.*conflict.*commands: whoops/
|
70
19
|
end
|
71
20
|
|
72
|
-
it "
|
73
|
-
|
74
|
-
|
75
|
-
capture_stderr { load('blah', :no_mock=>true, :verbose=>true).should == false }.should =~ /already exists/
|
21
|
+
it "sets loaded to true after loading a library" do
|
22
|
+
Manager.load create_runner
|
23
|
+
library('blarg').loaded.should == true
|
76
24
|
end
|
77
25
|
|
78
26
|
it "loads and strips aliases from a library's commands" do
|
79
27
|
with_config(:command_aliases=>{"blah"=>'b'}) do
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
it "loads a library and creates its class commands" do
|
87
|
-
with_config(:libraries=>{"blah"=>{:class_commands=>{"bling"=>"Blah.bling", "Blah"=>['hmm']}}}) do
|
88
|
-
load :blah, :file_string=>"module Blah; def self.bling; end; def self.hmm; end; end"
|
89
|
-
command_exists? 'bling'
|
90
|
-
command_exists? 'hmm'
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
it "loads a library with dependencies" do
|
95
|
-
File.stubs(:exists?).returns(true)
|
96
|
-
File.stubs(:read).returns("module Water; def water; end; end", "module Oaks; def oaks; end; end")
|
97
|
-
with_config(:libraries=>{"water"=>{:dependencies=>"oaks"}}) do
|
98
|
-
load 'water', :no_mock=>true
|
99
|
-
library_has_module('water', "Boson::Commands::Water")
|
100
|
-
library_has_module('oaks', "Boson::Commands::Oaks")
|
101
|
-
command_exists?('water')
|
102
|
-
command_exists?('oaks')
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
it "prints error for library with invalid dependencies" do
|
107
|
-
GemLibrary.stubs(:is_a_gem?).returns(true) #mock all as gem libs
|
108
|
-
Util.stubs(:safe_require).returns(true)
|
109
|
-
with_config(:libraries=>{"water"=>{:dependencies=>"fire"}, "fire"=>{:dependencies=>"man"}}) do
|
110
|
-
capture_stderr {
|
111
|
-
load('water', :no_mock=>true)
|
112
|
-
}.should == "Unable to load library fire. Reason: Can't load dependency man\nUnable to load"+
|
113
|
-
" library water. Reason: Can't load dependency fire\n"
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
it "prints error for method conflicts with main_object method" do
|
118
|
-
with_config(:error_method_conflicts=>true) do
|
119
|
-
capture_stderr {
|
120
|
-
load('blah', :file_string=>"module Blah; def require; end; end")
|
121
|
-
}.should =~ /Unable to load library blah.*conflict.*require/
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
it "prints error for method conflicts with config error_method_conflicts" do
|
126
|
-
with_config(:error_method_conflicts=>true) do
|
127
|
-
load('blah', :file_string=>"module Blah; def chwhat; end; end")
|
128
|
-
capture_stderr {
|
129
|
-
load('chwhat', :file_string=>"module Chwhat; def chwhat; end; end")
|
130
|
-
}.should =~ /Unable to load library chwhat.*conflict.*chwhat/
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
it "namespaces a library that has a method conflict" do
|
135
|
-
load('blah', :file_string=>"module Blah; def chwhat; end; end")
|
136
|
-
capture_stderr {
|
137
|
-
load('chwhat2', :file_string=>"module Chwhat2; def chwhat; end; end")
|
138
|
-
}.should =~ /conflict.*chwhat.*chwhat2/
|
139
|
-
library_has_command('namespace', 'chwhat2')
|
140
|
-
library_has_command('chwhat2', 'chwhat')
|
141
|
-
end
|
142
|
-
|
143
|
-
describe "module library" do
|
144
|
-
def mock_library(*args); end
|
145
|
-
|
146
|
-
it "loads a module library and all its class methods by default" do
|
147
|
-
eval %[module ::Harvey; def self.bird; end; def self.eagle; end; end]
|
148
|
-
load ::Harvey, :no_mock=>true
|
149
|
-
library_has_command('harvey', 'bird')
|
150
|
-
library_has_command('harvey', 'eagle')
|
151
|
-
end
|
152
|
-
|
153
|
-
it "loads a module library with specified commands" do
|
154
|
-
eval %[module ::Peanut; def self.bird; end; def self.eagle; end; end]
|
155
|
-
load ::Peanut, :no_mock=>true, :commands=>%w{bird}
|
156
|
-
library('peanut').commands.size.should == 1
|
157
|
-
library_has_command('peanut', 'bird')
|
158
|
-
end
|
159
|
-
|
160
|
-
it "loads a module library as a class" do
|
161
|
-
eval %[class ::Mentok; def self.bird; end; def self.eagle; end; end]
|
162
|
-
load ::Mentok, :no_mock=>true, :commands=>%w{bird}
|
163
|
-
library('mentok').commands.size.should == 1
|
164
|
-
library_has_command('mentok', 'bird')
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
|
-
describe "gem library" do
|
169
|
-
def mock_library(lib, options={})
|
170
|
-
options[:file_string] ||= ''
|
171
|
-
File.stubs(:exists?).returns(false)
|
172
|
-
GemLibrary.expects(:is_a_gem?).returns(true)
|
173
|
-
Util.expects(:safe_require).with { eval options.delete(:file_string) || ''; true}.returns(true)
|
174
|
-
end
|
175
|
-
|
176
|
-
it "loads" do
|
177
|
-
with_config(:libraries=>{"dude"=>{:module=>'Dude'}}) do
|
178
|
-
load "dude", :file_string=>"module ::Dude; def blah; end; end"
|
179
|
-
library_has_module('dude', "Dude")
|
180
|
-
command_exists?("blah")
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
|
-
it "with kernel methods loads" do
|
185
|
-
load "dude", :file_string=>"module ::Kernel; def dude; end; end"
|
186
|
-
library_loaded? 'dude'
|
187
|
-
library('dude').module.should == nil
|
188
|
-
command_exists?("dude")
|
189
|
-
end
|
190
|
-
|
191
|
-
it "prints error when nonexistent" do
|
192
|
-
capture_stderr { load('blah') }.should =~ /Library blah did not/
|
193
|
-
end
|
194
|
-
|
195
|
-
it "with invalid module prints error" do
|
196
|
-
with_config(:libraries=>{"coolio"=>{:module=>"Cool"}}) do
|
197
|
-
capture_stderr {
|
198
|
-
load('coolio', :file_string=>"module ::Coolio; def coolio; end; end")
|
199
|
-
}.should =~ /Unable.*coolio.*No module/
|
28
|
+
runner = create_runner do
|
29
|
+
def blah; end
|
30
|
+
alias :b :blah
|
200
31
|
end
|
32
|
+
Manager.load runner
|
33
|
+
library('blarg').commands.should == ['blah']
|
201
34
|
end
|
202
35
|
end
|
203
36
|
end
|
204
|
-
|
205
|
-
describe "library with namespace" do
|
206
|
-
before_all { reset_main_object }
|
207
|
-
before { reset_boson }
|
208
|
-
|
209
|
-
it "loads and defaults to library name" do
|
210
|
-
with_config(:libraries=>{'blang'=>{:namespace=>true}}) do
|
211
|
-
load 'blang', :file_string=>"module Blang; def bling; end; end"
|
212
|
-
library_has_command('blang', 'bling')
|
213
|
-
end
|
214
|
-
end
|
215
|
-
|
216
|
-
it "loads with config namespace" do
|
217
|
-
with_config(:libraries=>{'blung'=>{:namespace=>'dope'}}) do
|
218
|
-
load 'blung', :file_string=>"module Blung; def bling; end; end"
|
219
|
-
library_has_command('blung', 'bling')
|
220
|
-
library('blung').commands.size.should == 1
|
221
|
-
end
|
222
|
-
end
|
223
|
-
|
224
|
-
it "prints error if namespace conflicts with existing commands" do
|
225
|
-
eval "module ::Conflict; def self.bleng; end; end"
|
226
|
-
load Conflict, :no_mock=>true
|
227
|
-
with_config(:libraries=>{'bleng'=>{:namespace=>true}}) do
|
228
|
-
capture_stderr {
|
229
|
-
load 'bleng', :file_string=>"module Bleng; def bling; end; end"
|
230
|
-
}.should =~ /conflict.*bleng/
|
231
|
-
end
|
232
|
-
end
|
233
|
-
end
|
234
|
-
after_all { FileUtils.rm_r File.dirname(__FILE__)+'/commands/', :force=>true }
|
235
37
|
end
|
data/test/manager_test.rb
CHANGED
@@ -1,114 +1,104 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
2
|
|
3
3
|
describe "Manager" do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
4
|
+
def manager
|
5
|
+
Manager.instance
|
6
|
+
end
|
7
|
+
|
8
|
+
before do
|
9
|
+
reset_boson
|
10
|
+
Manager.instance = nil
|
11
|
+
end
|
11
12
|
|
12
|
-
|
13
|
+
describe ".load" do
|
14
|
+
def load_library(hash={})
|
15
|
+
meths = hash.delete(:commands) || []
|
16
|
+
manager_load create_runner(*(meths + [{library: :Blah}])), hash
|
17
|
+
end
|
13
18
|
|
14
19
|
it "loads basic library" do
|
15
|
-
load_library
|
20
|
+
load_library
|
16
21
|
library_loaded? 'blah'
|
17
22
|
end
|
18
23
|
|
19
|
-
it "loads library with
|
20
|
-
|
24
|
+
it "loads basic library with verbose" do
|
25
|
+
capture_stdout {
|
26
|
+
load_library verbose: true
|
27
|
+
}.chomp.should == 'Loaded library blah'
|
21
28
|
library_loaded? 'blah'
|
22
|
-
command_exists?('frylock')
|
23
|
-
command_exists?('meatwad')
|
24
29
|
end
|
25
30
|
|
26
|
-
it "
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
+
it "loads library with commands" do
|
32
|
+
load_library :commands=>['frylock','meatwad']
|
33
|
+
library_loaded? 'blah'
|
34
|
+
library_has_command 'blah', 'frylock'
|
35
|
+
library_has_command 'blah', 'meatwad'
|
31
36
|
end
|
32
37
|
|
33
|
-
it "prints error
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
}.should =~ /Unable to load library blah. Reason: LoadError/
|
38
|
+
it "prints error if library does not load" do
|
39
|
+
RunnerLibrary.any_instance.expects(:load).returns false
|
40
|
+
load_library
|
41
|
+
stderr.should == "Library blah did not load successfully."
|
38
42
|
end
|
39
43
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
Manager.expects(:create_instance_aliases).with({"Aquateen"=>{"frylock"=>"fr"}})
|
47
|
-
load_library :name=>'aquateen', :commands=>['frylock'], :module=>Aquateen
|
48
|
-
library_loaded? 'aquateen'
|
49
|
-
end
|
44
|
+
[SyntaxError, StandardError, LoaderError].each do |klass|
|
45
|
+
it "prints error if library fails with #{klass}" do
|
46
|
+
RunnerLibrary.expects(:new).raises(klass)
|
47
|
+
load_library
|
48
|
+
stderr.should == "Unable to load library Blah. Reason: #{klass}"
|
49
|
+
manager.failed_libraries.should == [Blah]
|
50
50
|
end
|
51
|
+
end
|
51
52
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
53
|
+
[SyntaxError, StandardError].each do |klass|
|
54
|
+
it "with verbose prints verbose error if library fails with #{klass}" do
|
55
|
+
RunnerLibrary.expects(:new).raises(klass)
|
56
|
+
load_library verbose: true
|
57
|
+
stderr.should =~ /^Unable to load library Blah. Reason: #{klass}\n\s*\//
|
58
|
+
manager.failed_libraries.should == [Blah]
|
58
59
|
end
|
60
|
+
end
|
59
61
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
62
|
+
it "prints error if no library is found" do
|
63
|
+
manager_load 'dude'
|
64
|
+
stderr.should ==
|
65
|
+
'Unable to load library dude. Reason: Library dude not found.'
|
66
|
+
end
|
67
|
+
|
68
|
+
it "prints error for library that's already loaded" do
|
69
|
+
runner = create_runner
|
70
|
+
Manager.load runner
|
71
|
+
manager_load runner, verbose: true
|
72
|
+
stderr.should == "Library blarg already exists."
|
69
73
|
end
|
70
74
|
|
71
75
|
it "merges with existing created library" do
|
72
|
-
create_library('blah')
|
73
|
-
load_library
|
76
|
+
create_library(name: 'blah')
|
77
|
+
load_library
|
74
78
|
library_loaded? 'blah'
|
75
79
|
Boson.libraries.size.should == 1
|
76
80
|
end
|
77
81
|
end
|
78
82
|
|
79
|
-
describe "
|
80
|
-
|
81
|
-
|
82
|
-
@
|
83
|
-
|
84
|
-
|
85
|
-
Boson.commands << @foo
|
86
|
-
Boson.commands << Command.new(:name=>'bar', :lib=>'blah', :options=>{:bah=>:string})
|
87
|
-
}
|
88
|
-
|
89
|
-
it "are deleted" do
|
90
|
-
Scientist.expects(:redefine_command).with(anything, @foo)
|
91
|
-
Manager.redefine_commands(@library, @library.commands)
|
83
|
+
describe ".redefine_commands" do
|
84
|
+
before do
|
85
|
+
@library = create_library(:name=>'blah', :commands=>['foo', 'bar'])
|
86
|
+
@foo = create_command(name: 'foo', lib: 'blah', options: {fool: :string},
|
87
|
+
args: '*')
|
88
|
+
create_command(name: 'bar', lib: 'blah', options: {bah: :string})
|
92
89
|
end
|
93
90
|
|
94
|
-
it "
|
91
|
+
it "only redefines commands with args" do
|
95
92
|
Scientist.expects(:redefine_command).with(anything, @foo)
|
96
|
-
|
97
|
-
capture_stdout { Manager.redefine_commands(@library, @library.commands) } =~ /options.*blah/
|
93
|
+
manager.redefine_commands(@library, @library.commands)
|
98
94
|
end
|
99
|
-
end
|
100
|
-
|
101
|
-
describe ".loaded?" do
|
102
|
-
before { reset_libraries }
|
103
95
|
|
104
|
-
it "
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
create_library('blah', :loaded=>true)
|
111
|
-
Manager.loaded?('blah').should == true
|
96
|
+
it "with verbose only redefines commands with args and prints rejected" do
|
97
|
+
Manager.instance.verbose = true
|
98
|
+
Scientist.expects(:redefine_command).with(anything, @foo)
|
99
|
+
capture_stdout {
|
100
|
+
manager.redefine_commands(@library, @library.commands)
|
101
|
+
}.should =~ /cannot have options.*bar/
|
112
102
|
end
|
113
103
|
end
|
114
|
-
end
|
104
|
+
end
|