clamp 0.6.3 → 0.6.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- ZGNkZmM3NzM5ZDJjNDM2ZGIxZWNhNGIzZmM1ZDJjZGZjZmE1ODUwNQ==
5
- data.tar.gz: !binary |-
6
- OWI1Mzc1OWQwOTgzMjMxNjVjODE2ZGQwYzk5NmZjNzdkYTEwOTA0OQ==
7
- !binary "U0hBNTEy":
8
- metadata.gz: !binary |-
9
- NGFjOTY4MTQ3OTg2NDZhMjA3OWE5MmEzYTVlM2VmMzc0NjAxYWUwNDAxZThi
10
- MGY1MDMwNWE2NGY0ZDNhYjZkZTQ4MGEzNWU4Y2RhZTAzMDVkMjEyZjIwNzY1
11
- YmMxNWQ3NzY2MTIwMWZjM2UwNGEyMmU5ODllY2I5MGFhMzY2MWM=
12
- data.tar.gz: !binary |-
13
- OWNjMTNkOGNkYjZiMjNlNmRiODc4MWFmMzRhOWJmODIwZjBmNDkzNWVhZGQ2
14
- MzExZDg3ZTMwNDBjZjkxZDZkZGFiYzU1YzQ5NGM0ZDVhYjAyN2U3NTc0M2Qz
15
- MzRiZTVlMTJkOTU4YjkxZTVjMTIxNGIzNWY1OTI5OTVmYmYyODA=
2
+ SHA1:
3
+ metadata.gz: 0222cf7a03642506d668988d57a60b992accc073
4
+ data.tar.gz: 9d0314d698965b297003ebca1ad6a31183c91fac
5
+ SHA512:
6
+ metadata.gz: c9cbcdeded12d74963a8a00681f715640d185f6a0ee6faa285cf9b03b8f00721115a35664602f06b2ea40e8fd670be3546338f624b24feae7d450f1a659ad9e0
7
+ data.tar.gz: 4d304f351b33bd4eeb034837b3174d06898dd02eb5349db2142be751634b5885b0bc2160654b7af3a97392582fcab705968c2b7de72b37bb1828b885eef6c76e
data/.autotest CHANGED
@@ -1,3 +1,5 @@
1
+ require "autotest/bundler"
2
+
1
3
  Autotest.add_hook :initialize do |at|
2
4
 
3
5
  at.add_exception ".git"
@@ -4,3 +4,5 @@ rvm:
4
4
  - 1.9.2
5
5
  - 1.9.3
6
6
  - 2.0.0
7
+ - 2.1.5
8
+ - 2.2.0
data/CHANGES.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.6.4 (2015-02-26)
4
+
5
+ * Ensure computed defaults are only computed once.
6
+
7
+ ## 0.6.3 (2013-11-14)
8
+
9
+ * Specify (MIT) license.
10
+
3
11
  ## 0.6.2 (2013-11-06)
4
12
 
5
13
  * Refactoring around multi-valued attributes.
data/Gemfile CHANGED
@@ -3,7 +3,7 @@ source "http://rubygems.org"
3
3
  gemspec
4
4
 
5
5
  group :test do
6
- gem "rake"
7
- gem "rspec"
8
- gem "rr"
6
+ gem "rake", "~> 10.4"
7
+ gem "rspec", "~> 3.1.0"
8
+ gem "rr", "~> 1.1.2"
9
9
  end
data/README.md CHANGED
@@ -1,7 +1,9 @@
1
-
2
- Clamp [![Build Status](https://secure.travis-ci.org/mdub/clamp.png?branch=master)](http://travis-ci.org/mdub/clamp)
1
+ Clamp
3
2
  =====
4
3
 
4
+ [![Gem Version](https://badge.fury.io/rb/clamp.png)](http://badge.fury.io/rb/clamp)
5
+ [![Build Status](https://secure.travis-ci.org/mdub/clamp.png?branch=master)](http://travis-ci.org/mdub/clamp)
6
+
5
7
  "Clamp" is a minimal framework for command-line utilities.
6
8
 
7
9
  It handles boring stuff like parsing the command-line, and generating help, so you can get on with making your command actually do stuff.
@@ -197,7 +199,7 @@ Clamp will verify that all required (ie. non-optional) parameters are present, a
197
199
  ### Validation
198
200
 
199
201
  Both `option` and `parameter` accept an optional block. If present, the block will be
200
- called with the raw string argument, and is expected to validate it. The value returned by the block will be assigned to the underlying attribute, so it's also a good place to coerce the String to a different type, if appropriate.
202
+ called with the raw string argument, and is expected to validate it. The value returned by the block will be assigned to the underlying attribute, so it's also a good place to coerce the String to a different type, if appropriate.
201
203
 
202
204
  For example:
203
205
 
@@ -314,6 +316,18 @@ class InitCommand < Clamp::Command
314
316
  end
315
317
  ```
316
318
 
319
+ Like options, subcommands may have aliases:
320
+
321
+ ```ruby
322
+ Clamp do
323
+
324
+ subcommand ["initialize", "init"], "Initialize the repository" do
325
+ # ...
326
+ end
327
+
328
+ end
329
+ ```
330
+
317
331
  ### Default subcommand
318
332
 
319
333
  You can set a default subcommand, at the class level, as follows:
data/Rakefile CHANGED
@@ -8,5 +8,5 @@ task "default" => "spec"
8
8
 
9
9
  RSpec::Core::RakeTask.new do |t|
10
10
  t.pattern = 'spec/**/*_spec.rb'
11
- t.rspec_opts = ["--colour", "--format", "nested"]
11
+ t.rspec_opts = ["--colour", "--format", "documentation"]
12
12
  end
@@ -8,7 +8,7 @@ Clamp do
8
8
 
9
9
  subcommand "foo", "Foo!" do
10
10
 
11
- subcommand "bar", "Baaaa!" do
11
+ subcommand ["bar", "bah", "baa"], "Baaaa!" do
12
12
 
13
13
  def execute
14
14
  puts "FUBAR"
@@ -32,11 +32,8 @@ module Clamp
32
32
 
33
33
  # default implementation of read_method
34
34
  def _read
35
- if self.defined?
36
- get
37
- else
38
- default
39
- end
35
+ set(default) unless self.defined?
36
+ get
40
37
  end
41
38
 
42
39
  # default implementation of append_method
@@ -103,6 +103,13 @@ module Clamp
103
103
  raise e
104
104
  end
105
105
 
106
+ def signal_error(message, options = {})
107
+ status = options.fetch(:status, 1)
108
+ e = ExecutionError.new(message, self, status)
109
+ e.set_backtrace(caller)
110
+ raise e
111
+ end
112
+
106
113
  def request_help
107
114
  raise HelpWanted, self
108
115
  end
@@ -130,6 +137,9 @@ module Clamp
130
137
  exit(1)
131
138
  rescue Clamp::HelpWanted => e
132
139
  puts e.command.help
140
+ rescue Clamp::ExecutionError => e
141
+ $stderr.puts "ERROR: #{e.message}"
142
+ exit(e.status)
133
143
  end
134
144
  end
135
145
 
@@ -26,4 +26,16 @@ module Clamp
26
26
 
27
27
  end
28
28
 
29
+ # raise to signal error during execution
30
+ class ExecutionError < RuntimeError
31
+
32
+ def initialize(message, command, status = 1)
33
+ super(message, command)
34
+ @status = status
35
+ end
36
+
37
+ attr_reader :status
38
+
39
+ end
40
+
29
41
  end
@@ -1,3 +1,3 @@
1
1
  module Clamp
2
- VERSION = "0.6.3".freeze
2
+ VERSION = "0.6.4".freeze
3
3
  end
@@ -5,7 +5,7 @@ describe Clamp::Command do
5
5
  extend CommandFactory
6
6
  include OutputCapture
7
7
 
8
- describe "with subcommands" do
8
+ context "with subcommands" do
9
9
 
10
10
  given_command "flipflop" do
11
11
 
@@ -30,19 +30,19 @@ describe Clamp::Command do
30
30
  it "delegates to sub-commands" do
31
31
 
32
32
  command.run(["flip"])
33
- stdout.should =~ /FLIPPED/
33
+ expect(stdout).to match /FLIPPED/
34
34
 
35
35
  command.run(["flop"])
36
- stdout.should =~ /FLOPPED/
36
+ expect(stdout).to match /FLOPPED/
37
37
 
38
38
  end
39
39
 
40
40
  context "executed with no subcommand" do
41
41
 
42
42
  it "triggers help" do
43
- lambda do
43
+ expect do
44
44
  command.run([])
45
- end.should raise_error(Clamp::HelpWanted)
45
+ end.to raise_error(Clamp::HelpWanted)
46
46
  end
47
47
 
48
48
  end
@@ -50,25 +50,25 @@ describe Clamp::Command do
50
50
  describe "#help" do
51
51
 
52
52
  it "shows subcommand parameters in usage" do
53
- command.help.should include("flipflop [OPTIONS] SUBCOMMAND [ARG] ...")
53
+ expect(command.help).to include("flipflop [OPTIONS] SUBCOMMAND [ARG] ...")
54
54
  end
55
55
 
56
56
  it "lists subcommands" do
57
57
  help = command.help
58
- help.should =~ /Subcommands:/
59
- help.should =~ /flip +flip it/
60
- help.should =~ /flop +flop it/
58
+ expect(help).to match /Subcommands:/
59
+ expect(help).to match /flip +flip it/
60
+ expect(help).to match /flop +flop it/
61
61
  end
62
62
 
63
63
  it "handles new lines in subcommand descriptions" do
64
- command.help.should =~ /flop +flop it\n +for extra flop/
64
+ expect(command.help).to match /flop +flop it\n +for extra flop/
65
65
  end
66
66
 
67
67
  end
68
68
 
69
69
  end
70
70
 
71
- describe "with an aliased subcommand" do
71
+ context "with an aliased subcommand" do
72
72
 
73
73
  given_command "blah" do
74
74
 
@@ -87,10 +87,10 @@ describe Clamp::Command do
87
87
  it "responds to both aliases" do
88
88
 
89
89
  command.run(["say", "boo"])
90
- stdout.should =~ /boo/
90
+ expect(stdout).to match /boo/
91
91
 
92
92
  command.run(["talk", "jive"])
93
- stdout.should =~ /jive/
93
+ expect(stdout).to match /jive/
94
94
 
95
95
  end
96
96
 
@@ -98,14 +98,14 @@ describe Clamp::Command do
98
98
 
99
99
  it "lists all aliases" do
100
100
  help = command.help
101
- help.should =~ /say, talk .* Say something/
101
+ expect(help).to match /say, talk .* Say something/
102
102
  end
103
103
 
104
104
  end
105
105
 
106
106
  end
107
107
 
108
- describe "with nested subcommands" do
108
+ context "with nested subcommands" do
109
109
 
110
110
  given_command "fubar" do
111
111
 
@@ -123,12 +123,12 @@ describe Clamp::Command do
123
123
 
124
124
  it "delegates multiple levels" do
125
125
  command.run(["foo", "bar"])
126
- stdout.should =~ /FUBAR/
126
+ expect(stdout).to match /FUBAR/
127
127
  end
128
128
 
129
129
  end
130
130
 
131
- describe "with a default subcommand" do
131
+ context "with a default subcommand" do
132
132
 
133
133
  given_command "admin" do
134
134
 
@@ -148,14 +148,14 @@ describe Clamp::Command do
148
148
 
149
149
  it "invokes the default subcommand" do
150
150
  command.run([])
151
- stdout.should =~ /All good/
151
+ expect(stdout).to match /All good/
152
152
  end
153
153
 
154
154
  end
155
155
 
156
156
  end
157
157
 
158
- describe "with a default subcommand, declared the old way" do
158
+ context "with a default subcommand, declared the old way" do
159
159
 
160
160
  given_command "admin" do
161
161
 
@@ -173,18 +173,18 @@ describe Clamp::Command do
173
173
 
174
174
  it "invokes the default subcommand" do
175
175
  command.run([])
176
- stdout.should =~ /All good/
176
+ expect(stdout).to match /All good/
177
177
  end
178
178
 
179
179
  end
180
180
 
181
181
  end
182
182
 
183
- describe "declaring a default subcommand after subcommands" do
183
+ context "declaring a default subcommand after subcommands" do
184
184
 
185
185
  it "is not supported" do
186
186
 
187
- lambda do
187
+ expect do
188
188
  Class.new(Clamp::Command) do
189
189
 
190
190
  subcommand "status", "Show status" do
@@ -198,13 +198,13 @@ describe Clamp::Command do
198
198
  self.default_subcommand = "status"
199
199
 
200
200
  end
201
- end.should raise_error(/default_subcommand must be defined before subcommands/)
201
+ end.to raise_error(/default_subcommand must be defined before subcommands/)
202
202
 
203
203
  end
204
204
 
205
205
  end
206
206
 
207
- describe "with subcommands, declared after a parameter" do
207
+ context "with subcommands, declared after a parameter" do
208
208
 
209
209
  given_command "with" do
210
210
 
@@ -221,7 +221,7 @@ describe Clamp::Command do
221
221
  it "allows the parameter to be specified first" do
222
222
 
223
223
  command.run(["dummy", "spit"])
224
- stdout.strip.should == "spat the dummy"
224
+ expect(stdout.strip).to eql "spat the dummy"
225
225
 
226
226
  end
227
227
 
@@ -260,28 +260,28 @@ describe Clamp::Command do
260
260
 
261
261
  it "accepts options defined in superclass (specified after the subcommand)" do
262
262
  command.run(["move", "--direction", "north"])
263
- stdout.should =~ /walking north/
263
+ expect(stdout).to match /walking north/
264
264
  end
265
265
 
266
266
  it "accepts options defined in superclass (specified before the subcommand)" do
267
267
  command.run(["--direction", "north", "move"])
268
- stdout.should =~ /walking north/
268
+ expect(stdout).to match /walking north/
269
269
  end
270
270
 
271
271
  it "accepts options defined in included modules" do
272
272
  command.run(["move", "--speed", "very quickly"])
273
- stdout.should =~ /walking home very quickly/
273
+ expect(stdout).to match /walking home very quickly/
274
274
  end
275
275
 
276
276
  it "has access to command context" do
277
277
  command = command_class.new("go", :motion => "wandering")
278
278
  command.run(["move"])
279
- stdout.should =~ /wandering home/
279
+ expect(stdout).to match /wandering home/
280
280
  end
281
281
 
282
282
  end
283
283
 
284
- describe "with a subcommand, with options" do
284
+ context "with a subcommand, with options" do
285
285
 
286
286
  given_command 'weeheehee' do
287
287
  option '--json', 'JSON', 'a json blob' do |option|
@@ -297,7 +297,7 @@ describe Clamp::Command do
297
297
 
298
298
  it "only parses options once" do
299
299
  command.run(['--json', '{"a":"b"}', 'woohoohoo'])
300
- stdout.should == 'parsing!'
300
+ expect(stdout).to eql 'parsing!'
301
301
  end
302
302
 
303
303
  end
@@ -5,6 +5,7 @@ describe Clamp::Command do
5
5
 
6
6
  extend CommandFactory
7
7
  include OutputCapture
8
+ include SetEnv
8
9
 
9
10
  given_command("cmd") do
10
11
 
@@ -17,7 +18,7 @@ describe Clamp::Command do
17
18
  describe "#help" do
18
19
 
19
20
  it "describes usage" do
20
- command.help.should =~ /^Usage:\n cmd.*\n/
21
+ expect(command.help).to match /^Usage:\n cmd.*\n/
21
22
  end
22
23
 
23
24
  end
@@ -29,7 +30,7 @@ describe Clamp::Command do
29
30
  end
30
31
 
31
32
  it "executes the #execute method" do
32
- stdout.should_not be_empty
33
+ expect(stdout).to_not be_empty
33
34
  end
34
35
 
35
36
  end
@@ -38,25 +39,25 @@ describe Clamp::Command do
38
39
 
39
40
  it "declares option argument accessors" do
40
41
  command.class.option "--flavour", "FLAVOUR", "Flavour of the month"
41
- command.flavour.should == nil
42
+ expect(command.flavour).to eql nil
42
43
  command.flavour = "chocolate"
43
- command.flavour.should == "chocolate"
44
+ expect(command.flavour).to eql "chocolate"
44
45
  end
45
46
 
46
- describe "with type :flag" do
47
+ context "with type :flag" do
47
48
 
48
49
  before do
49
50
  command.class.option "--verbose", :flag, "Be heartier"
50
51
  end
51
52
 
52
53
  it "declares a predicate-style reader" do
53
- command.should respond_to(:verbose?)
54
- command.should_not respond_to(:verbose)
54
+ expect(command).to respond_to(:verbose?)
55
+ expect(command).to_not respond_to(:verbose)
55
56
  end
56
57
 
57
58
  end
58
59
 
59
- describe "with explicit :attribute_name" do
60
+ context "with explicit :attribute_name" do
60
61
 
61
62
  before do
62
63
  command.class.option "--foo", "FOO", "A foo", :attribute_name => :bar
@@ -64,17 +65,17 @@ describe Clamp::Command do
64
65
 
65
66
  it "uses the specified attribute_name name to name accessors" do
66
67
  command.bar = "chocolate"
67
- command.bar.should == "chocolate"
68
+ expect(command.bar).to eql "chocolate"
68
69
  end
69
70
 
70
71
  it "does not attempt to create the default accessors" do
71
- command.should_not respond_to(:foo)
72
- command.should_not respond_to(:foo=)
72
+ expect(command).to_not respond_to(:foo)
73
+ expect(command).to_not respond_to(:foo=)
73
74
  end
74
75
 
75
76
  end
76
77
 
77
- describe "with default method" do
78
+ context "with default method" do
78
79
 
79
80
  before do
80
81
  command.class.option "--port", "PORT", "port"
@@ -86,97 +87,95 @@ describe Clamp::Command do
86
87
  end
87
88
 
88
89
  it "sets the specified default value" do
89
- command.port.should == 4321
90
+ expect(command.port).to eql 4321
90
91
  end
91
92
 
92
93
  end
93
94
 
94
- describe "with :default value" do
95
+ context "with :default value" do
95
96
 
96
97
  before do
97
98
  command.class.option "--port", "PORT", "port to listen on", :default => 4321
98
99
  end
99
100
 
100
101
  it "declares default method" do
101
- command.default_port.should == 4321
102
+ expect(command.default_port).to eql 4321
102
103
  end
103
104
 
104
105
  describe "#help" do
105
106
 
106
107
  it "describes the default value" do
107
- command.help.should include("port to listen on (default: 4321)")
108
+ expect(command.help).to include("port to listen on (default: 4321)")
108
109
  end
109
110
 
110
111
  end
111
112
 
112
113
  end
113
114
 
114
- describe "with :multivalued" do
115
+ context "with :multivalued" do
115
116
 
116
117
  before do
117
118
  command.class.option "--flavour", "FLAVOUR", "flavour(s)", :multivalued => true, :attribute_name => :flavours
118
119
  end
119
120
 
120
121
  it "defaults to empty array" do
121
- command.flavours.should == []
122
+ expect(command.flavours).to eql []
122
123
  end
123
124
 
124
125
  it "supports multiple values" do
125
126
  command.parse(%w(--flavour chocolate --flavour vanilla))
126
- command.flavours.should == %w(chocolate vanilla)
127
+ expect(command.flavours).to eql %w(chocolate vanilla)
127
128
  end
128
129
 
129
130
  it "generates a single-value appender method" do
130
131
  command.append_to_flavours("mud")
131
132
  command.append_to_flavours("pie")
132
- command.flavours.should == %w(mud pie)
133
+ expect(command.flavours).to eql %w(mud pie)
133
134
  end
134
135
 
135
136
  it "generates a multi-value setter method" do
136
137
  command.append_to_flavours("replaceme")
137
138
  command.flavours = %w(mud pie)
138
- command.flavours.should == %w(mud pie)
139
+ expect(command.flavours).to eql %w(mud pie)
139
140
  end
140
141
 
141
142
  end
142
143
 
143
- describe "with :environment_variable" do
144
+ context "with :environment_variable" do
145
+
146
+ let(:environment_value) { nil }
147
+ let(:args) { [] }
144
148
 
145
149
  before do
146
150
  command.class.option "--port", "PORT", "port to listen on", :default => 4321, :environment_variable => "PORT" do |value|
147
151
  value.to_i
148
152
  end
153
+ set_env("PORT", environment_value)
154
+ command.parse(args)
149
155
  end
150
156
 
151
157
  context "when no environment variable is present" do
152
158
 
153
- before do
154
- ENV.delete("PORT")
155
- end
156
-
157
159
  it "uses the default" do
158
- command.parse([])
159
- command.port.should == 4321
160
+ expect(command.port).to eql 4321
160
161
  end
161
162
 
162
163
  end
163
164
 
164
165
  context "when environment variable is present" do
165
166
 
166
- before do
167
- ENV["PORT"] = "12345"
168
- end
167
+ let(:environment_value) { "12345" }
169
168
 
170
169
  it "uses the environment variable" do
171
- command.parse([])
172
- command.port.should == 12345
170
+ expect(command.port).to eql 12345
173
171
  end
174
172
 
175
173
  context "and a value is specified on the command-line" do
176
174
 
175
+ let(:args) { %w(--port 1500) }
176
+
177
177
  it "uses command-line value" do
178
- command.parse(%w(--port 1500))
179
- command.port.should == 1500
178
+ expect(command.port).to eql 1500
180
179
  end
181
180
 
182
181
  end
@@ -186,28 +185,27 @@ describe Clamp::Command do
186
185
  describe "#help" do
187
186
 
188
187
  it "describes the default value and env usage" do
189
- command.help.should include("port to listen on (default: $PORT, or 4321)")
188
+ expect(command.help).to include("port to listen on (default: $PORT, or 4321)")
190
189
  end
191
190
 
192
191
  end
193
192
 
194
193
  end
195
194
 
196
- describe "with :environment_variable and type :flag" do
195
+ context "with :environment_variable and type :flag" do
196
+
197
+ let(:environment_value) { nil }
197
198
 
198
199
  before do
199
200
  command.class.option "--[no-]enable", :flag, "enable?", :default => false, :environment_variable => "ENABLE"
201
+ set_env("ENABLE", environment_value)
202
+ command.parse([])
200
203
  end
201
204
 
202
205
  context "when no environment variable is present" do
203
206
 
204
- before do
205
- ENV.delete("ENABLE")
206
- end
207
-
208
207
  it "uses the default" do
209
- command.parse([])
210
- command.enable?.should == false
208
+ expect(command.enable?).to eql false
211
209
  end
212
210
 
213
211
  end
@@ -216,10 +214,10 @@ describe Clamp::Command do
216
214
 
217
215
  context "when environment variable is #{truthy_value.inspect}" do
218
216
 
217
+ let(:environment_value) { truthy_value }
218
+
219
219
  it "sets the flag" do
220
- ENV["ENABLE"] = truthy_value
221
- command.parse([])
222
- command.enable?.should == true
220
+ expect(command.enable?).to eql true
223
221
  end
224
222
 
225
223
  end
@@ -230,10 +228,10 @@ describe Clamp::Command do
230
228
 
231
229
  context "when environment variable is #{falsey_value.inspect}" do
232
230
 
231
+ let(:environment_value) { falsey_value }
232
+
233
233
  it "clears the flag" do
234
- ENV["ENABLE"] = falsey_value
235
- command.parse([])
236
- command.enable?.should == false
234
+ expect(command.enable?).to eql false
237
235
  end
238
236
 
239
237
  end
@@ -242,7 +240,7 @@ describe Clamp::Command do
242
240
 
243
241
  end
244
242
 
245
- describe "with :required" do
243
+ context "with :required" do
246
244
 
247
245
  before do
248
246
  command.class.option "--port", "PORT", "port to listen on", :required => true
@@ -270,7 +268,7 @@ describe Clamp::Command do
270
268
 
271
269
  end
272
270
 
273
- describe "with a block" do
271
+ context "with a block" do
274
272
 
275
273
  before do
276
274
  command.class.option "--port", "PORT", "Port to listen on" do |port|
@@ -279,18 +277,18 @@ describe Clamp::Command do
279
277
  end
280
278
 
281
279
  it "uses the block to validate and convert the option argument" do
282
- lambda do
280
+ expect do
283
281
  command.port = "blah"
284
- end.should raise_error(ArgumentError)
282
+ end.to raise_error(ArgumentError)
285
283
  command.port = "1234"
286
- command.port.should == 1234
284
+ expect(command.port).to eql 1234
287
285
  end
288
286
 
289
287
  end
290
288
 
291
289
  end
292
290
 
293
- describe "with options declared" do
291
+ context "with options declared" do
294
292
 
295
293
  before do
296
294
  command.class.option ["-f", "--flavour"], "FLAVOUR", "Flavour of the month"
@@ -306,126 +304,126 @@ describe Clamp::Command do
306
304
 
307
305
  describe "#parse" do
308
306
 
309
- describe "with an unrecognised option" do
307
+ context "with an unrecognised option" do
310
308
 
311
309
  it "raises a UsageError" do
312
- lambda do
310
+ expect do
313
311
  command.parse(%w(--foo bar))
314
- end.should raise_error(Clamp::UsageError)
312
+ end.to raise_error(Clamp::UsageError)
315
313
  end
316
314
 
317
315
  end
318
316
 
319
- describe "with options" do
317
+ context "with options" do
320
318
 
321
319
  before do
322
320
  command.parse(%w(--flavour strawberry --nuts --color blue))
323
321
  end
324
322
 
325
323
  it "maps the option values onto the command object" do
326
- command.flavour.should == "strawberry"
327
- command.color.should == "blue"
328
- command.nuts?.should == true
324
+ expect(command.flavour).to eql "strawberry"
325
+ expect(command.color).to eql "blue"
326
+ expect(command.nuts?).to eql true
329
327
  end
330
328
 
331
329
  end
332
330
 
333
- describe "with short options" do
331
+ context "with short options" do
334
332
 
335
333
  before do
336
334
  command.parse(%w(-f strawberry -c blue))
337
335
  end
338
336
 
339
337
  it "recognises short options as aliases" do
340
- command.flavour.should == "strawberry"
341
- command.color.should == "blue"
338
+ expect(command.flavour).to eql "strawberry"
339
+ expect(command.color).to eql "blue"
342
340
  end
343
341
 
344
342
  end
345
343
 
346
- describe "with a value appended to a short option" do
344
+ context "with a value appended to a short option" do
347
345
 
348
346
  before do
349
347
  command.parse(%w(-fstrawberry))
350
348
  end
351
349
 
352
350
  it "works as though the value were separated" do
353
- command.flavour.should == "strawberry"
351
+ expect(command.flavour).to eql "strawberry"
354
352
  end
355
353
 
356
354
  end
357
355
 
358
- describe "with combined short options" do
356
+ context "with combined short options" do
359
357
 
360
358
  before do
361
359
  command.parse(%w(-nf strawberry))
362
360
  end
363
361
 
364
362
  it "works as though the options were separate" do
365
- command.flavour.should == "strawberry"
366
- command.nuts?.should == true
363
+ expect(command.flavour).to eql "strawberry"
364
+ expect(command.nuts?).to eql true
367
365
  end
368
366
 
369
367
  end
370
368
 
371
- describe "with option arguments attached using equals sign" do
369
+ context "with option arguments attached using equals sign" do
372
370
 
373
371
  before do
374
372
  command.parse(%w(--flavour=strawberry --color=blue))
375
373
  end
376
374
 
377
375
  it "works as though the option arguments were separate" do
378
- command.flavour.should == "strawberry"
379
- command.color.should == "blue"
376
+ expect(command.flavour).to eql "strawberry"
377
+ expect(command.color).to eql "blue"
380
378
  end
381
379
 
382
380
  end
383
381
 
384
- describe "with option-like things beyond the arguments" do
382
+ context "with option-like things beyond the arguments" do
385
383
 
386
384
  it "treats them as positional arguments" do
387
385
  command.parse(%w(a b c --flavour strawberry))
388
- command.arguments.should == %w(a b c --flavour strawberry)
386
+ expect(command.arguments).to eql %w(a b c --flavour strawberry)
389
387
  end
390
388
 
391
389
  end
392
390
 
393
- describe "with multi-line arguments that look like options" do
391
+ context "with multi-line arguments that look like options" do
394
392
 
395
393
  before do
396
394
  command.parse(["foo\n--flavour=strawberry", "bar\n-cblue"])
397
395
  end
398
396
 
399
397
  it "treats them as positional arguments" do
400
- command.arguments.should == ["foo\n--flavour=strawberry", "bar\n-cblue"]
401
- command.flavour.should be_nil
402
- command.color.should be_nil
398
+ expect(command.arguments).to eql ["foo\n--flavour=strawberry", "bar\n-cblue"]
399
+ expect(command.flavour).to be_nil
400
+ expect(command.color).to be_nil
403
401
  end
404
402
 
405
403
  end
406
404
 
407
- describe "with an option terminator" do
405
+ context "with an option terminator" do
408
406
 
409
407
  it "considers everything after the terminator to be an argument" do
410
408
  command.parse(%w(--color blue -- --flavour strawberry))
411
- command.arguments.should == %w(--flavour strawberry)
409
+ expect(command.arguments).to eql %w(--flavour strawberry)
412
410
  end
413
411
 
414
412
  end
415
413
 
416
- describe "with --flag" do
414
+ context "with --flag" do
417
415
 
418
416
  before do
419
417
  command.parse(%w(--nuts))
420
418
  end
421
419
 
422
420
  it "sets the flag" do
423
- command.nuts?.should be_true
421
+ expect(command.nuts?).to be true
424
422
  end
425
423
 
426
424
  end
427
425
 
428
- describe "with --no-flag" do
426
+ context "with --no-flag" do
429
427
 
430
428
  before do
431
429
  command.nuts = true
@@ -433,48 +431,48 @@ describe Clamp::Command do
433
431
  end
434
432
 
435
433
  it "clears the flag" do
436
- command.nuts?.should be_false
434
+ expect(command.nuts?).to be false
437
435
  end
438
436
 
439
437
  end
440
438
 
441
- describe "with --help" do
439
+ context "with --help" do
442
440
 
443
441
  it "requests help" do
444
- lambda do
442
+ expect do
445
443
  command.parse(%w(--help))
446
- end.should raise_error(Clamp::HelpWanted)
444
+ end.to raise_error(Clamp::HelpWanted)
447
445
  end
448
446
 
449
447
  end
450
448
 
451
- describe "with -h" do
449
+ context "with -h" do
452
450
 
453
451
  it "requests help" do
454
- lambda do
452
+ expect do
455
453
  command.parse(%w(-h))
456
- end.should raise_error(Clamp::HelpWanted)
454
+ end.to raise_error(Clamp::HelpWanted)
457
455
  end
458
456
 
459
457
  end
460
458
 
461
- describe "when a bad option value is specified on the command-line" do
459
+ context "when a bad option value is specified on the command-line" do
462
460
 
463
461
  it "signals a UsageError" do
464
- lambda do
462
+ expect do
465
463
  command.parse(%w(--scoops reginald))
466
- end.should raise_error(Clamp::UsageError, /^option '--scoops': invalid value for Integer/)
464
+ end.to raise_error(Clamp::UsageError, /^option '--scoops': invalid value for Integer/)
467
465
  end
468
466
 
469
467
  end
470
468
 
471
- describe "when a bad option value is specified in the environment" do
469
+ context "when a bad option value is specified in the environment" do
472
470
 
473
471
  it "signals a UsageError" do
474
472
  ENV["DEFAULT_SCOOPS"] = "marjorie"
475
- lambda do
473
+ expect do
476
474
  command.parse([])
477
- end.should raise_error(Clamp::UsageError, /^\$DEFAULT_SCOOPS: invalid value for Integer/)
475
+ end.to raise_error(Clamp::UsageError, /^\$DEFAULT_SCOOPS: invalid value for Integer/)
478
476
  end
479
477
 
480
478
  end
@@ -484,44 +482,44 @@ describe Clamp::Command do
484
482
  describe "#help" do
485
483
 
486
484
  it "indicates that there are options" do
487
- command.help.should include("cmd [OPTIONS]")
485
+ expect(command.help).to include("cmd [OPTIONS]")
488
486
  end
489
487
 
490
488
  it "includes option details" do
491
- command.help.should =~ %r(--flavour FLAVOUR +Flavour of the month)
492
- command.help.should =~ %r(--color COLOR +Preferred hue)
489
+ expect(command.help).to match %r(--flavour FLAVOUR +Flavour of the month)
490
+ expect(command.help).to match %r(--color COLOR +Preferred hue)
493
491
  end
494
492
 
495
493
  it "handles new lines in option descriptions" do
496
- command.help.should =~ %r(--\[no-\]nuts +Nuts \(or not\)\n +May include nuts)
494
+ expect(command.help).to match %r(--\[no-\]nuts +Nuts \(or not\)\n +May include nuts)
497
495
  end
498
496
 
499
497
  end
500
498
 
501
499
  end
502
500
 
503
- describe "with an explicit --help option declared" do
501
+ context "with an explicit --help option declared" do
504
502
 
505
503
  before do
506
504
  command.class.option ["--help"], :flag, "help wanted"
507
505
  end
508
506
 
509
507
  it "does not generate implicit help option" do
510
- lambda do
508
+ expect do
511
509
  command.parse(%w(--help))
512
- end.should_not raise_error
513
- command.help.should be_true
510
+ end.to_not raise_error
511
+ expect(command.help?).to be true
514
512
  end
515
513
 
516
514
  it "does not recognise -h" do
517
- lambda do
515
+ expect do
518
516
  command.parse(%w(-h))
519
- end.should raise_error(Clamp::UsageError)
517
+ end.to raise_error(Clamp::UsageError)
520
518
  end
521
519
 
522
520
  end
523
521
 
524
- describe "with an explicit -h option declared" do
522
+ context "with an explicit -h option declared" do
525
523
 
526
524
  before do
527
525
  command.class.option ["-h", "--humidity"], "PERCENT", "relative humidity" do |n|
@@ -530,13 +528,13 @@ describe Clamp::Command do
530
528
  end
531
529
 
532
530
  it "does not map -h to help" do
533
- command.help.should_not =~ %r( -h[, ].*help)
531
+ expect(command.help).to_not match %r( -h[, ].*help)
534
532
  end
535
533
 
536
534
  it "still recognises --help" do
537
- lambda do
535
+ expect do
538
536
  command.parse(%w(--help))
539
- end.should raise_error(Clamp::HelpWanted)
537
+ end.to raise_error(Clamp::HelpWanted)
540
538
  end
541
539
 
542
540
  end
@@ -545,12 +543,12 @@ describe Clamp::Command do
545
543
 
546
544
  it "declares option argument accessors" do
547
545
  command.class.parameter "FLAVOUR", "flavour of the month"
548
- command.flavour.should == nil
546
+ expect(command.flavour).to eql nil
549
547
  command.flavour = "chocolate"
550
- command.flavour.should == "chocolate"
548
+ expect(command.flavour).to eql "chocolate"
551
549
  end
552
550
 
553
- describe "with explicit :attribute_name" do
551
+ context "with explicit :attribute_name" do
554
552
 
555
553
  before do
556
554
  command.class.parameter "FOO", "a foo", :attribute_name => :bar
@@ -558,32 +556,32 @@ describe Clamp::Command do
558
556
 
559
557
  it "uses the specified attribute_name name to name accessors" do
560
558
  command.bar = "chocolate"
561
- command.bar.should == "chocolate"
559
+ expect(command.bar).to eql "chocolate"
562
560
  end
563
561
 
564
562
  end
565
563
 
566
- describe "with :default value" do
564
+ context "with :default value" do
567
565
 
568
566
  before do
569
567
  command.class.parameter "[ORIENTATION]", "direction", :default => "west"
570
568
  end
571
569
 
572
570
  it "sets the specified default value" do
573
- command.orientation.should == "west"
571
+ expect(command.orientation).to eql "west"
574
572
  end
575
573
 
576
574
  describe "#help" do
577
575
 
578
576
  it "describes the default value" do
579
- command.help.should include("direction (default: \"west\")")
577
+ expect(command.help).to include("direction (default: \"west\")")
580
578
  end
581
579
 
582
580
  end
583
581
 
584
582
  end
585
583
 
586
- describe "with a block" do
584
+ context "with a block" do
587
585
 
588
586
  before do
589
587
  command.class.parameter "PORT", "port to listen on" do |port|
@@ -592,16 +590,16 @@ describe Clamp::Command do
592
590
  end
593
591
 
594
592
  it "uses the block to validate and convert the argument" do
595
- lambda do
593
+ expect do
596
594
  command.port = "blah"
597
- end.should raise_error(ArgumentError)
595
+ end.to raise_error(ArgumentError)
598
596
  command.port = "1234"
599
- command.port.should == 1234
597
+ expect(command.port).to eql 1234
600
598
  end
601
599
 
602
600
  end
603
601
 
604
- describe "with ellipsis" do
602
+ context "with ellipsis" do
605
603
 
606
604
  before do
607
605
  command.class.parameter "FILE ...", "files"
@@ -609,53 +607,83 @@ describe Clamp::Command do
609
607
 
610
608
  it "accepts multiple arguments" do
611
609
  command.parse(%w(X Y Z))
612
- command.file_list.should == %w(X Y Z)
610
+ expect(command.file_list).to eql %w(X Y Z)
613
611
  end
614
612
 
615
613
  end
616
614
 
617
- describe "optional, with ellipsis" do
615
+ context "optional, with ellipsis" do
618
616
 
619
617
  before do
620
618
  command.class.parameter "[FILE] ...", "files"
621
619
  end
622
620
 
623
- it "default to an empty list" do
621
+ it "defaults to an empty list" do
624
622
  command.parse([])
625
- command.default_file_list.should == []
626
- command.file_list.should == []
623
+ expect(command.default_file_list).to eql []
624
+ expect(command.file_list).to eql []
625
+ end
626
+
627
+ it "is mutable" do
628
+ command.parse([])
629
+ command.file_list << "treasure"
630
+ expect(command.file_list).to eql ["treasure"]
627
631
  end
628
632
 
629
633
  end
630
634
 
631
- describe "with :environment_variable value" do
635
+ context "with :environment_variable" do
632
636
 
633
637
  before do
634
638
  command.class.parameter "[FILE]", "a file", :environment_variable => "FILE",
635
639
  :default => "/dev/null"
636
640
  end
637
641
 
638
- it "should use the default if neither flag nor env var are present" do
639
- command.parse([])
640
- command.file.should == "/dev/null"
642
+ let(:args) { [] }
643
+ let(:environment_value) { nil }
644
+
645
+
646
+ before do
647
+ set_env("FILE", environment_value)
648
+ command.parse(args)
641
649
  end
642
650
 
643
- it "should use the env value if present (instead of default)" do
644
- ENV["FILE"] = "/etc/motd"
645
- command.parse([])
646
- command.file.should == ENV["FILE"]
651
+ context "when neither argument nor environment variable are present" do
652
+
653
+ it "uses the default" do
654
+ expect(command.file).to eql "/dev/null"
655
+ end
656
+
647
657
  end
648
658
 
649
- it "should use the the flag value if present (instead of env)" do
650
- ENV["FILE"] = "/etc/motd"
651
- command.parse(%w(/bin/sh))
652
- command.file.should == "/bin/sh"
659
+ context "when environment variable is present" do
660
+
661
+ let(:environment_value) { "/etc/motd" }
662
+
663
+ describe "and no argument is provided" do
664
+
665
+ it "uses the environment variable" do
666
+ expect(command.file).to eql "/etc/motd"
667
+ end
668
+
669
+ end
670
+
671
+ describe "and an argument is provided" do
672
+
673
+ let(:args) { ["/dev/null"] }
674
+
675
+ it "uses the argument" do
676
+ expect(command.file).to eql "/dev/null"
677
+ end
678
+
679
+ end
680
+
653
681
  end
654
682
 
655
683
  describe "#help" do
656
684
 
657
685
  it "describes the default value and env usage" do
658
- command.help.should include(%{ (default: $FILE, or "/dev/null")})
686
+ expect(command.help).to include(%{ (default: $FILE, or "/dev/null")})
659
687
  end
660
688
 
661
689
  end
@@ -664,16 +692,16 @@ describe Clamp::Command do
664
692
 
665
693
  end
666
694
 
667
- describe "with no parameters declared" do
695
+ context "with no parameters declared" do
668
696
 
669
697
  describe "#parse" do
670
698
 
671
- describe "with arguments" do
699
+ context "with arguments" do
672
700
 
673
701
  it "raises a UsageError" do
674
- lambda do
702
+ expect do
675
703
  command.parse(["crash"])
676
- end.should raise_error(Clamp::UsageError, "too many arguments")
704
+ end.to raise_error(Clamp::UsageError, "too many arguments")
677
705
  end
678
706
 
679
707
  end
@@ -682,7 +710,7 @@ describe Clamp::Command do
682
710
 
683
711
  end
684
712
 
685
- describe "with parameters declared" do
713
+ context "with parameters declared" do
686
714
 
687
715
  before do
688
716
  command.class.parameter "X", "x\nxx"
@@ -692,58 +720,58 @@ describe Clamp::Command do
692
720
 
693
721
  describe "#parse" do
694
722
 
695
- describe "with arguments for all parameters" do
723
+ context "with arguments for all parameters" do
696
724
 
697
725
  before do
698
726
  command.parse(["crash", "bang", "wallop"])
699
727
  end
700
728
 
701
729
  it "maps arguments onto the command object" do
702
- command.x.should == "crash"
703
- command.y.should == "bang"
704
- command.z.should == "wallop"
730
+ expect(command.x).to eql "crash"
731
+ expect(command.y).to eql "bang"
732
+ expect(command.z).to eql "wallop"
705
733
  end
706
734
 
707
735
  end
708
736
 
709
- describe "with insufficient arguments" do
737
+ context "with insufficient arguments" do
710
738
 
711
739
  it "raises a UsageError" do
712
- lambda do
740
+ expect do
713
741
  command.parse(["crash"])
714
- end.should raise_error(Clamp::UsageError, "parameter 'Y': no value provided")
742
+ end.to raise_error(Clamp::UsageError, "parameter 'Y': no value provided")
715
743
  end
716
744
 
717
745
  end
718
746
 
719
- describe "with optional argument omitted" do
747
+ context "with optional argument omitted" do
720
748
 
721
749
  it "defaults the optional argument" do
722
750
  command.parse(["crash", "bang"])
723
- command.x.should == "crash"
724
- command.y.should == "bang"
725
- command.z.should == "ZZZ"
751
+ expect(command.x).to eql "crash"
752
+ expect(command.y).to eql "bang"
753
+ expect(command.z).to eql "ZZZ"
726
754
  end
727
755
 
728
756
  end
729
757
 
730
- describe "with multi-line arguments" do
758
+ context "with multi-line arguments" do
731
759
 
732
760
  it "parses them correctly" do
733
761
  command.parse(["foo\nhi", "bar", "baz"])
734
- command.x.should == "foo\nhi"
735
- command.y.should == "bar"
736
- command.z.should == "baz"
762
+ expect(command.x).to eql "foo\nhi"
763
+ expect(command.y).to eql "bar"
764
+ expect(command.z).to eql "baz"
737
765
  end
738
766
 
739
767
  end
740
768
 
741
- describe "with too many arguments" do
769
+ context "with too many arguments" do
742
770
 
743
771
  it "raises a UsageError" do
744
- lambda do
772
+ expect do
745
773
  command.parse(["crash", "bang", "wallop", "kapow"])
746
- end.should raise_error(Clamp::UsageError, "too many arguments")
774
+ end.to raise_error(Clamp::UsageError, "too many arguments")
747
775
  end
748
776
 
749
777
  end
@@ -753,17 +781,17 @@ describe Clamp::Command do
753
781
  describe "#help" do
754
782
 
755
783
  it "indicates that there are parameters" do
756
- command.help.should include("cmd [OPTIONS] X Y [Z]")
784
+ expect(command.help).to include("cmd [OPTIONS] X Y [Z]")
757
785
  end
758
786
 
759
787
  it "includes parameter details" do
760
- command.help.should =~ %r(X +x)
761
- command.help.should =~ %r(Y +y)
762
- command.help.should =~ %r(\[Z\] +z \(default: "ZZZ"\))
788
+ expect(command.help).to match %r(X +x)
789
+ expect(command.help).to match %r(Y +y)
790
+ expect(command.help).to match %r(\[Z\] +z \(default: "ZZZ"\))
763
791
  end
764
792
 
765
793
  it "handles new lines in option descriptions" do
766
- command.help.should =~ %r(X +x\n +xx)
794
+ expect(command.help).to match %r(X +x\n +xx)
767
795
  end
768
796
 
769
797
  end
@@ -771,7 +799,7 @@ describe Clamp::Command do
771
799
 
772
800
  end
773
801
 
774
- describe "with explicit usage" do
802
+ context "with explicit usage" do
775
803
 
776
804
  given_command("blah") do
777
805
 
@@ -782,14 +810,14 @@ describe Clamp::Command do
782
810
  describe "#help" do
783
811
 
784
812
  it "includes the explicit usage" do
785
- command.help.should include("blah FOO BAR ...\n")
813
+ expect(command.help).to include("blah FOO BAR ...\n")
786
814
  end
787
815
 
788
816
  end
789
817
 
790
818
  end
791
819
 
792
- describe "with multiple usages" do
820
+ context "with multiple usages" do
793
821
 
794
822
  given_command("put") do
795
823
 
@@ -801,15 +829,15 @@ describe Clamp::Command do
801
829
  describe "#help" do
802
830
 
803
831
  it "includes both potential usages" do
804
- command.help.should include("put THIS HERE\n")
805
- command.help.should include("put THAT THERE\n")
832
+ expect(command.help).to include("put THIS HERE\n")
833
+ expect(command.help).to include("put THAT THERE\n")
806
834
  end
807
835
 
808
836
  end
809
837
 
810
838
  end
811
839
 
812
- describe "with a banner" do
840
+ context "with a banner" do
813
841
 
814
842
  given_command("punt") do
815
843
 
@@ -825,8 +853,8 @@ describe Clamp::Command do
825
853
  describe "#help" do
826
854
 
827
855
  it "includes the banner" do
828
- command.help.should =~ /^ Punt is an example command/
829
- command.help.should =~ /^ The prefix/
856
+ expect(command.help).to match /^ Punt is an example command/
857
+ expect(command.help).to match /^ The prefix/
830
858
  end
831
859
 
832
860
  end
@@ -844,10 +872,10 @@ describe Clamp::Command do
844
872
  end
845
873
  @xyz = %w(x y z)
846
874
  command.class.run("cmd", @xyz)
847
- stdout.should == @xyz.inspect
875
+ expect(stdout).to eql @xyz.inspect
848
876
  end
849
877
 
850
- describe "invoked with a context hash" do
878
+ context "invoked with a context hash" do
851
879
 
852
880
  it "makes the context available within the command" do
853
881
  command.class.class_eval do
@@ -856,12 +884,40 @@ describe Clamp::Command do
856
884
  end
857
885
  end
858
886
  command.class.run("xyz", [], :foo => "bar")
859
- stdout.should == "bar"
887
+ expect(stdout).to eql "bar"
888
+ end
889
+
890
+ end
891
+
892
+ context "when there's a CommandError" do
893
+
894
+ before do
895
+
896
+ command.class.class_eval do
897
+ def execute
898
+ signal_error "Oh crap!", :status => 456
899
+ end
900
+ end
901
+
902
+ begin
903
+ command.class.run("cmd", [])
904
+ rescue SystemExit => e
905
+ @system_exit = e
906
+ end
907
+
908
+ end
909
+
910
+ it "outputs the error message" do
911
+ expect(stderr).to include "ERROR: Oh crap!"
912
+ end
913
+
914
+ it "exits with the specified status" do
915
+ expect(@system_exit.status).to eql 456
860
916
  end
861
917
 
862
918
  end
863
919
 
864
- describe "when there's a UsageError" do
920
+ context "when there's a UsageError" do
865
921
 
866
922
  before do
867
923
 
@@ -880,25 +936,25 @@ describe Clamp::Command do
880
936
  end
881
937
 
882
938
  it "outputs the error message" do
883
- stderr.should include "ERROR: bad dog!"
939
+ expect(stderr).to include "ERROR: bad dog!"
884
940
  end
885
941
 
886
942
  it "outputs help" do
887
- stderr.should include "See: 'cmd --help'"
943
+ expect(stderr).to include "See: 'cmd --help'"
888
944
  end
889
945
 
890
946
  it "exits with a non-zero status" do
891
- @system_exit.should_not be_nil
892
- @system_exit.status.should == 1
947
+ expect(@system_exit).to_not be_nil
948
+ expect(@system_exit.status).to eql 1
893
949
  end
894
950
 
895
951
  end
896
952
 
897
- describe "when help is requested" do
953
+ context "when help is requested" do
898
954
 
899
955
  it "outputs help" do
900
956
  command.class.run("cmd", ["--help"])
901
- stdout.should include "Usage:"
957
+ expect(stdout).to include "Usage:"
902
958
  end
903
959
 
904
960
  end
@@ -919,7 +975,7 @@ describe Clamp::Command do
919
975
 
920
976
  it "inherits options from it's superclass" do
921
977
  command.parse(["--verbose"])
922
- command.should be_verbose
978
+ expect(command).to be_verbose
923
979
  end
924
980
 
925
981
  end