command_kit 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +4 -6
  3. data/.rubocop.yml +13 -0
  4. data/ChangeLog.md +18 -0
  5. data/Gemfile +2 -0
  6. data/LICENSE.txt +1 -1
  7. data/README.md +18 -9
  8. data/command_kit.gemspec +0 -1
  9. data/examples/printing/tables.rb +141 -0
  10. data/gemspec.yml +3 -3
  11. data/lib/command_kit/bug_report.rb +105 -0
  12. data/lib/command_kit/colors.rb +4 -4
  13. data/lib/command_kit/edit.rb +54 -0
  14. data/lib/command_kit/env.rb +1 -1
  15. data/lib/command_kit/options/option.rb +5 -1
  16. data/lib/command_kit/options/option_value.rb +2 -2
  17. data/lib/command_kit/options/parser.rb +1 -1
  18. data/lib/command_kit/options/quiet.rb +1 -1
  19. data/lib/command_kit/options/verbose.rb +2 -2
  20. data/lib/command_kit/options/version.rb +10 -0
  21. data/lib/command_kit/options.rb +1 -1
  22. data/lib/command_kit/os.rb +1 -1
  23. data/lib/command_kit/printing/fields.rb +56 -0
  24. data/lib/command_kit/printing/indent.rb +1 -1
  25. data/lib/command_kit/printing/lists.rb +91 -0
  26. data/lib/command_kit/printing/tables/border_style.rb +169 -0
  27. data/lib/command_kit/printing/tables/cell_builder.rb +93 -0
  28. data/lib/command_kit/printing/tables/row_builder.rb +111 -0
  29. data/lib/command_kit/printing/tables/style.rb +198 -0
  30. data/lib/command_kit/printing/tables/table_builder.rb +145 -0
  31. data/lib/command_kit/printing/tables/table_formatter.rb +254 -0
  32. data/lib/command_kit/printing/tables.rb +208 -0
  33. data/lib/command_kit/stdio.rb +5 -1
  34. data/lib/command_kit/version.rb +1 -1
  35. data/spec/bug_report_spec.rb +266 -0
  36. data/spec/colors_spec.rb +6 -0
  37. data/spec/command_name_spec.rb +1 -1
  38. data/spec/edit_spec.rb +72 -0
  39. data/spec/options/option_spec.rb +12 -2
  40. data/spec/options/quiet_spec.rb +51 -0
  41. data/spec/options/verbose_spec.rb +51 -0
  42. data/spec/options/version_spec.rb +146 -0
  43. data/spec/pager_spec.rb +1 -1
  44. data/spec/printing/fields_spec.rb +167 -0
  45. data/spec/printing/lists_spec.rb +99 -0
  46. data/spec/printing/tables/border_style.rb +43 -0
  47. data/spec/printing/tables/cell_builer_spec.rb +135 -0
  48. data/spec/printing/tables/row_builder_spec.rb +165 -0
  49. data/spec/printing/tables/style_spec.rb +377 -0
  50. data/spec/printing/tables/table_builder_spec.rb +252 -0
  51. data/spec/printing/tables/table_formatter_spec.rb +1180 -0
  52. data/spec/printing/tables_spec.rb +1069 -0
  53. metadata +33 -7
@@ -0,0 +1,208 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'command_kit/printing/indent'
4
+ require 'command_kit/printing/tables/table_builder'
5
+ require 'command_kit/printing/tables/style'
6
+ require 'command_kit/printing/tables/table_formatter'
7
+
8
+ module CommandKit
9
+ module Printing
10
+ #
11
+ # Methods for printing tables.
12
+ #
13
+ # ## Examples
14
+ #
15
+ # include CommandKit::Printing::Tables
16
+ #
17
+ # def run
18
+ # header = ['A', 'B', 'C']
19
+ # table = [
20
+ # ['AAAA', 'BBBB', 'CCCC'],
21
+ # ['AAAA', 'BBBB', 'CCCC'],
22
+ # ['AAAA', 'BBBB', 'CCCC']
23
+ # ]
24
+ #
25
+ # print_table table
26
+ # # AAAA BBBB CCCC
27
+ # # AAAA BBBB CCCC
28
+ # # AAAA BBBB CCCC
29
+ #
30
+ # print_table table, header: header
31
+ # # A B C
32
+ # #
33
+ # # AAAA BBBB CCCC
34
+ # # AAAA BBBB CCCC
35
+ # # AAAA BBBB CCCC
36
+ #
37
+ # print_table table, header: header,
38
+ # border: :ascii
39
+ # # +------+------+------+
40
+ # # | A | B | C |
41
+ # # +------+------+------+
42
+ # # | AAAA | BBBB | CCCC |
43
+ # # | AAAA | BBBB | CCCC |
44
+ # # | AAAA | BBBB | CCCC |
45
+ # # +------+------+------+
46
+ #
47
+ # print_table table, header: header,
48
+ # border: :ascii,
49
+ # separate_rows: true
50
+ # # +------+------+------+
51
+ # # | A | B | C |
52
+ # # +------+------+------+
53
+ # # | AAAA | BBBB | CCCC |
54
+ # # +------+------+------+
55
+ # # | AAAA | BBBB | CCCC |
56
+ # # +------+------+------+
57
+ # # | AAAA | BBBB | CCCC |
58
+ # # +------+------+------+
59
+ #
60
+ # print_table table, header: header,
61
+ # border: :line
62
+ # # ┌──────┬──────┬──────┐
63
+ # # │ A │ B │ C │
64
+ # # ├──────┼──────┼──────┤
65
+ # # │ AAAA │ BBBB │ CCCC │
66
+ # # │ AAAA │ BBBB │ CCCC │
67
+ # # │ AAAA │ BBBB │ CCCC │
68
+ # # └──────┴──────┴──────┘
69
+ #
70
+ # print_table table, header: header,
71
+ # border: :double_line
72
+ # # ╔══════╦══════╦══════╗
73
+ # # ║ A ║ B ║ C ║
74
+ # # ╠══════╬══════╬══════╣
75
+ # # ║ AAAA ║ BBBB ║ CCCC ║
76
+ # # ║ AAAA ║ BBBB ║ CCCC ║
77
+ # # ║ AAAA ║ BBBB ║ CCCC ║
78
+ # # ╚══════╩══════╩══════╝
79
+ #
80
+ # uneven_table = [
81
+ # ['AAAAAA', 'B', 'CCCCCCC'],
82
+ # ['AAA', 'BBBB', 'CCC' ],
83
+ # ['A', 'BBBBBBB', 'C' ]
84
+ # ]
85
+ #
86
+ # print_table uneven_table, header: header,
87
+ # justify: :left,
88
+ # justify_header: :left,
89
+ # border: :line
90
+ # # ┌────────┬─────────┬─────────┐
91
+ # # │ A │ B │ C │
92
+ # # ├────────┼─────────┼─────────┤
93
+ # # │ AAAAAA │ B │ CCCCCCC │
94
+ # # │ AAA │ BBBB │ CCC │
95
+ # # │ A │ BBBBBBB │ C │
96
+ # # └────────┴─────────┴─────────┘
97
+ #
98
+ # print_table uneven_table, header: header,
99
+ # justify: :right,
100
+ # justify_header: :right,
101
+ # border: :line
102
+ # # ┌────────┬─────────┬─────────┐
103
+ # # │ A │ B │ C │
104
+ # # ├────────┼─────────┼─────────┤
105
+ # # │ AAAAAA │ B │ CCCCCCC │
106
+ # # │ AAA │ BBBB │ CCC │
107
+ # # │ A │ BBBBBBB │ C │
108
+ # # └────────┴─────────┴─────────┘
109
+ #
110
+ # print_table uneven_table, header: header,
111
+ # justify: :center,
112
+ # justify_header: :center,
113
+ # border: :line
114
+ # # ┌────────┬─────────┬─────────┐
115
+ # # │ A │ B │ C │
116
+ # # ├────────┼─────────┼─────────┤
117
+ # # │ AAAAAA │ B │ CCCCCCC │
118
+ # # │ AAA │ BBBB │ CCC │
119
+ # # │ A │ BBBBBBB │ C │
120
+ # # └────────┴─────────┴─────────┘
121
+ #
122
+ # table_with_empty_cells = [
123
+ # ['AAAA', 'BBBB', 'CCCC'],
124
+ # ['AAAA', nil, 'CCCC'],
125
+ # ['AAAA', 'BBBB']
126
+ # ]
127
+ #
128
+ # print_table table_with_empty_cells, header: header,
129
+ # justify: :left,
130
+ # border: :line
131
+ # # ┌──────┬──────┬──────┐
132
+ # # │ A │ B │ C │
133
+ # # ├──────┼──────┼──────┤
134
+ # # │ AAAA │ BBBB │ CCCC │
135
+ # # │ AAAA │ │ CCCC │
136
+ # # │ AAAA │ BBBB │ │
137
+ # # └──────┴──────┴──────┘
138
+ #
139
+ # multi_line_table = [
140
+ # ['AAAA', 'BBBB', "CCCC\nCC"],
141
+ # ['AAAA', "BBBB\nB", 'CCCC'],
142
+ # ["AAAA\nAA\nA", "BBBB", "CCCC"]
143
+ # ]
144
+ #
145
+ # print_table multi_line_table, header: header,
146
+ # justify: :left,
147
+ # border: :line
148
+ # # ┌──────┬──────┬──────┐
149
+ # # │ A │ B │ C │
150
+ # # ├──────┼──────┼──────┤
151
+ # # │ AAAA │ BBBB │ CCCC │
152
+ # # │ │ │ CC │
153
+ # # │ AAAA │ BBBB │ CCCC │
154
+ # # │ │ B │ │
155
+ # # │ AAAA │ BBBB │ CCCC │
156
+ # # │ AA │ │ │
157
+ # # │ A │ │ │
158
+ # # └──────┴──────┴──────┘
159
+ # end
160
+ #
161
+ # @since 0.4.0
162
+ #
163
+ module Tables
164
+ include Indent
165
+
166
+ #
167
+ # Prints a table of rows.
168
+ #
169
+ # @param [Array<Array>] rows
170
+ # The table rows.
171
+ #
172
+ # @param [Array, nil] header
173
+ # The optional header row.
174
+ #
175
+ # @param [Hash{Symbol => Object}] kwargs
176
+ # Additional keyword arguments.
177
+ #
178
+ # @option kwargs [:line, :double_line, nil, Hash{Symbol => String}, :ascii] :border
179
+ # The border style or a custom Hash of border characters.
180
+ #
181
+ # @option [Integer] :padding (1)
182
+ # The number of characters to pad table cell values with.
183
+ #
184
+ # @option [:left, :right, :center] :justify (:left)
185
+ # Specifies how to justify the table cell values.
186
+ #
187
+ # @option [:left, :right, :center] :justify_header (:center)
188
+ # Specifies how to justify the table header cell values.
189
+ #
190
+ # @option [Boolean] :separate_rows (false)
191
+ # Specifies whether to add separator rows in between the rows.
192
+ #
193
+ # @api public
194
+ #
195
+ def print_table(rows, header: nil, **kwargs)
196
+ table = TableBuilder.new(rows, header: header)
197
+ style = Style.new(**kwargs)
198
+ formatter = TableFormatter.new(table,style)
199
+
200
+ formatter.format do |line|
201
+ puts line
202
+ end
203
+
204
+ return nil
205
+ end
206
+ end
207
+ end
208
+ end
@@ -7,7 +7,11 @@ module CommandKit
7
7
  # class MyCmd
8
8
  # include CommandKit::Stdio
9
9
  #
10
- # def main
10
+ # def run
11
+ # print 'Name: '
12
+ # name = gets
13
+ #
14
+ # puts "Hello #{name}!"
11
15
  # end
12
16
  # end
13
17
  #
@@ -1,4 +1,4 @@
1
1
  module CommandKit
2
2
  # command_kit version
3
- VERSION = "0.3.0"
3
+ VERSION = "0.4.0"
4
4
  end
@@ -0,0 +1,266 @@
1
+ require 'spec_helper'
2
+ require 'command_kit/bug_report'
3
+
4
+ describe CommandKit::BugReport do
5
+ module TestBugReport
6
+ class CommandWithoutBugReportURLSet
7
+ include CommandKit::BugReport
8
+ end
9
+
10
+ class CommandWithBugReportURLSet
11
+ include CommandKit::BugReport
12
+
13
+ bug_report_url 'https://github.com/org/repo/issues/new'
14
+ end
15
+
16
+ class CommandWithInheritedBugReportURL < CommandWithBugReportURLSet
17
+ end
18
+ end
19
+
20
+ let(:command_class) { TestBugReport::CommandWithBugReportURLSet }
21
+
22
+ describe ".included" do
23
+ it { expect(command_class).to include(CommandKit::ExceptionHandler) }
24
+ it { expect(command_class).to include(CommandKit::Printing) }
25
+ end
26
+
27
+ describe ".bug_report_url" do
28
+ subject { TestBugReport::CommandWithoutBugReportURLSet }
29
+
30
+ context "when no bug_report_url has been set" do
31
+ it "should default to nil" do
32
+ expect(subject.bug_report_url).to be_nil
33
+ end
34
+ end
35
+
36
+ context "when a bug_report_url is explicitly set" do
37
+ subject { TestBugReport::CommandWithBugReportURLSet }
38
+
39
+ it "must return the explicitly set bug_report_url" do
40
+ expect(subject.bug_report_url).to eq("https://github.com/org/repo/issues/new")
41
+ end
42
+ end
43
+
44
+ context "when the command class inherites from another class" do
45
+ context "but no bug_report_url is set" do
46
+ module TestBugReport
47
+ class BaseCmd
48
+ include CommandKit::BugReport
49
+ end
50
+
51
+ class InheritedCmd < BaseCmd
52
+ end
53
+ end
54
+
55
+ subject { TestBugReport::InheritedCmd }
56
+
57
+ it "must search each class then return nil "do
58
+ expect(subject.bug_report_url).to be_nil
59
+ end
60
+ end
61
+
62
+ module TestBugReport
63
+ class ExplicitBaseCmd
64
+ include CommandKit::BugReport
65
+ bug_report_url 'https://github.com/org/repo/issues/new'
66
+ end
67
+ end
68
+
69
+ context "when the superclass defines an explicit bug_report_url" do
70
+ module TestBugReport
71
+ class ImplicitInheritedCmd < ExplicitBaseCmd
72
+ end
73
+ end
74
+
75
+ let(:super_subject) { TestBugReport::ExplicitBaseCmd }
76
+ subject { TestBugReport::ImplicitInheritedCmd }
77
+
78
+ it "must inherit the superclass'es bug_report_url" do
79
+ expect(subject.bug_report_url).to eq(super_subject.bug_report_url)
80
+ end
81
+
82
+ it "must not change the superclass'es bug_report_url" do
83
+ expect(super_subject.bug_report_url).to eq('https://github.com/org/repo/issues/new')
84
+ end
85
+ end
86
+
87
+ context "when the subclass defines an explicit bug_report_url" do
88
+ module TestBugReport
89
+ class ImplicitBaseCmd
90
+ include CommandKit::BugReport
91
+ end
92
+
93
+ class ExplicitInheritedCmd < ImplicitBaseCmd
94
+ bug_report_url 'https://github.com/other_org/other_repo/issues/new'
95
+ end
96
+ end
97
+
98
+ let(:super_subject) { TestBugReport::ImplicitBaseCmd }
99
+ subject { TestBugReport::ExplicitInheritedCmd }
100
+
101
+ it "must return the subclass'es bug_report_url" do
102
+ expect(subject.bug_report_url).to eq('https://github.com/other_org/other_repo/issues/new')
103
+ end
104
+
105
+ it "must not change the superclass'es bug_report_url" do
106
+ expect(super_subject.bug_report_url).to be_nil
107
+ end
108
+ end
109
+
110
+ context "when both the subclass overrides the superclass's bug_report_urls" do
111
+ module TestBugReport
112
+ class ExplicitOverridingInheritedCmd < ExplicitBaseCmd
113
+ bug_report_url 'https://github.com/other_org/other_repo/issues/new'
114
+ end
115
+ end
116
+
117
+ let(:super_subject) { TestBugReport::ExplicitBaseCmd }
118
+ subject { TestBugReport::ExplicitOverridingInheritedCmd }
119
+
120
+ it "must return the subclass'es bug_report_url" do
121
+ expect(subject.bug_report_url).to eq("https://github.com/other_org/other_repo/issues/new")
122
+ end
123
+
124
+ it "must not change the superclass'es bug_report_url" do
125
+ expect(super_subject.bug_report_url).to eq("https://github.com/org/repo/issues/new")
126
+ end
127
+ end
128
+ end
129
+ end
130
+
131
+ subject { command_class.new }
132
+
133
+ describe "#bug_report_url" do
134
+ context "when the command has bug_report_url set" do
135
+ let(:command_class) { TestBugReport::CommandWithBugReportURLSet }
136
+
137
+ it "must return the bug_report_url" do
138
+ expect(subject.bug_report_url).to eq(command_class.bug_report_url)
139
+ end
140
+ end
141
+
142
+ context "when the command does not have bug_report_url set" do
143
+ let(:command_class) { TestBugReport::CommandWithoutBugReportURLSet }
144
+
145
+ it "must return nil" do
146
+ expect(subject.bug_report_url).to be(nil)
147
+ end
148
+ end
149
+ end
150
+
151
+ describe "#print_bug_report" do
152
+ let(:message) { "error!" }
153
+ let(:backtrace) do
154
+ [
155
+ "/path/to/test1.rb:1 in `test1'",
156
+ "/path/to/test2.rb:2 in `test2'",
157
+ "/path/to/test3.rb:3 in `test3'",
158
+ "/path/to/test4.rb:4 in `test4'"
159
+ ]
160
+ end
161
+ let(:exception) do
162
+ error = RuntimeError.new(message)
163
+ error.set_backtrace(backtrace)
164
+ error
165
+ end
166
+
167
+ subject { command_class.new(stderr: StringIO.new) }
168
+
169
+ context "when the command has bug_report_url set" do
170
+ let(:command_class) { TestBugReport::CommandWithBugReportURLSet }
171
+
172
+ context "when stderr is a TTY" do
173
+ before { expect(subject.stderr).to receive(:tty?).and_return(true) }
174
+
175
+ it "must print a message, bug_report_url, and a highlighted exception" do
176
+ subject.print_bug_report(exception)
177
+
178
+ expect(subject.stderr.string).to eq(
179
+ [
180
+ '',
181
+ 'Oops! Looks like you have found a bug. Please report it!',
182
+ command_class.bug_report_url,
183
+ '',
184
+ '```',
185
+ exception.full_message(highlight: true).chomp,
186
+ '```',
187
+ ''
188
+ ].join($/)
189
+ )
190
+ end
191
+ end
192
+
193
+ context "when stderr is not a TTY" do
194
+ it "must print a message, bug_report_url, and print an unhighlighted exception" do
195
+ subject.print_bug_report(exception)
196
+
197
+ expect(subject.stderr.string).to eq(
198
+ [
199
+ '',
200
+ 'Oops! Looks like you have found a bug. Please report it!',
201
+ command_class.bug_report_url,
202
+ '',
203
+ '```',
204
+ exception.full_message(highlight: false).chomp,
205
+ '```',
206
+ ''
207
+ ].join($/)
208
+ )
209
+ end
210
+ end
211
+ end
212
+
213
+ context "when the command does not have bug_report_url set" do
214
+ let(:command_class) { TestBugReport::CommandWithoutBugReportURLSet }
215
+
216
+ context "when stderr is a TTY" do
217
+ before { expect(subject.stderr).to receive(:tty?).and_return(true) }
218
+
219
+ it "must print a message and a highlighted exception" do
220
+ subject.print_bug_report(exception)
221
+
222
+ expect(subject.stderr.string).to eq(
223
+ [
224
+ '',
225
+ 'Oops! Looks like you have found a bug. Please report it!',
226
+ '',
227
+ '```',
228
+ exception.full_message(highlight: true).chomp,
229
+ '```',
230
+ ''
231
+ ].join($/)
232
+ )
233
+ end
234
+ end
235
+
236
+ context "when stderr is not a TTY" do
237
+ it "must print a message and print an unhighlighted exception" do
238
+ subject.print_bug_report(exception)
239
+
240
+ expect(subject.stderr.string).to eq(
241
+ [
242
+ '',
243
+ 'Oops! Looks like you have found a bug. Please report it!',
244
+ '',
245
+ '```',
246
+ exception.full_message(highlight: false).chomp,
247
+ '```',
248
+ ''
249
+ ].join($/)
250
+ )
251
+ end
252
+ end
253
+ end
254
+ end
255
+
256
+ describe "#on_exception" do
257
+ let(:exception) { RuntimeError.new('error!') }
258
+
259
+ it "must call print_bug_report with the exception and then exit(-1)" do
260
+ expect(subject).to receive(:print_bug_report).with(exception)
261
+ expect(subject).to receive(:exit).with(-1)
262
+
263
+ subject.on_exception(exception)
264
+ end
265
+ end
266
+ end
data/spec/colors_spec.rb CHANGED
@@ -656,6 +656,12 @@ describe CommandKit::Colors do
656
656
  it { expect(subject.ansi?).to be(false) }
657
657
  end
658
658
 
659
+ context "when NO_COLOR is set" do
660
+ subject { command_class.new(env: {'NO_COLOR' => 'true'}) }
661
+
662
+ it { expect(subject.ansi?).to be(false) }
663
+ end
664
+
659
665
  context "when stdout is a TTY" do
660
666
  let(:stdout) { StringIO.new }
661
667
  subject { command_class.new(stdout: stdout) }
@@ -19,7 +19,7 @@ describe CommandKit::CommandName do
19
19
  end
20
20
  end
21
21
 
22
- context "when a command_name is explicitly set" do
22
+ context "when a command_name has been explicitly set" do
23
23
  module TestCommandName
24
24
  class ExplicitCmd
25
25
  include CommandKit::CommandName
data/spec/edit_spec.rb ADDED
@@ -0,0 +1,72 @@
1
+ require 'spec_helper'
2
+ require 'command_kit/edit'
3
+
4
+ describe CommandKit::Edit do
5
+ module TestEdit
6
+ class TestCommand
7
+ include CommandKit::Edit
8
+ end
9
+ end
10
+
11
+ let(:command_class) { TestEdit::TestCommand }
12
+
13
+ it "must also include CommandKit::Env" do
14
+ expect(command_class).to include(CommandKit::Env)
15
+ end
16
+
17
+ describe "#editor" do
18
+ subject { command_class.new(env: env) }
19
+
20
+ context "when env['EDITOR'] is set" do
21
+ let(:editor) { 'vim' }
22
+ let(:env) do
23
+ {'EDITOR' => editor}
24
+ end
25
+
26
+ it "must return env['EDITOR']" do
27
+ expect(subject.editor).to eq(env['EDITOR'])
28
+ end
29
+ end
30
+
31
+ context "when env['EDITOR'] is not set" do
32
+ let(:env) do
33
+ {}
34
+ end
35
+
36
+ it "must return 'nano'" do
37
+ expect(subject.editor).to eq('nano')
38
+ end
39
+ end
40
+ end
41
+
42
+ describe "#edit" do
43
+ subject { command_class.new(env: env) }
44
+
45
+ let(:arguments) { ['file.txt'] }
46
+
47
+ context "when env['EDITOR'] is set" do
48
+ let(:editor) { 'vim' }
49
+ let(:env) do
50
+ {'EDITOR' => editor}
51
+ end
52
+
53
+ it "must invoke system with #editor and the additional arguments" do
54
+ expect(subject).to receive(:system).with(subject.editor,*arguments)
55
+
56
+ subject.edit(*arguments)
57
+ end
58
+ end
59
+
60
+ context "when env['EDITOR'] is not set" do
61
+ let(:env) do
62
+ {}
63
+ end
64
+
65
+ it "must invoke system with 'nano' and the additional arguments" do
66
+ expect(subject).to receive(:system).with('nano',*arguments)
67
+
68
+ subject.edit(*arguments)
69
+ end
70
+ end
71
+ end
72
+ end
@@ -6,10 +6,12 @@ describe CommandKit::Options::Option do
6
6
  let(:short) { nil }
7
7
  let(:long) { '--foo' }
8
8
  let(:equals) { false }
9
+ let(:value_usage) { 'FOO' }
10
+ let(:value_required) { true }
9
11
  let(:value) do
10
12
  {
11
- usage: 'FOO',
12
- required: true
13
+ usage: value_usage,
14
+ required: value_required
13
15
  }
14
16
  end
15
17
  let(:desc) { 'Foo option' }
@@ -228,6 +230,14 @@ describe CommandKit::Options::Option do
228
230
  it "must return '--option=USAGE'" do
229
231
  expect(subject.usage.last).to eq("#{long}=#{subject.value.usage}")
230
232
  end
233
+
234
+ context "but the #value is also optional?" do
235
+ let(:value_required) { false }
236
+
237
+ it "must return '--option[=USAGE]'" do
238
+ expect(subject.usage.last).to eq("#{long}[=#{subject.value.usage}]")
239
+ end
240
+ end
231
241
  end
232
242
  end
233
243
 
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+ require 'command_kit/options/quiet'
3
+
4
+ describe CommandKit::Options::Quiet do
5
+ module TestOptionsQuiet
6
+ class TestCommand
7
+ include CommandKit::Options::Quiet
8
+ end
9
+ end
10
+
11
+ let(:command_class) { TestOptionsQuiet::TestCommand }
12
+
13
+ describe ".included" do
14
+ subject { command_class }
15
+
16
+ it "must include CommandKit::Options" do
17
+ expect(subject).to include(CommandKit::Options)
18
+ end
19
+
20
+ it "must define a quiet option" do
21
+ expect(subject.options[:quiet]).to_not be(nil)
22
+ expect(subject.options[:quiet].short).to eq('-q')
23
+ expect(subject.options[:quiet].long).to eq('--quiet')
24
+ expect(subject.options[:quiet].desc).to eq('Enables quiet output')
25
+ end
26
+ end
27
+
28
+ subject { command_class.new }
29
+
30
+ describe "#quiet?" do
31
+ context "when @quiet is true" do
32
+ before do
33
+ subject.instance_variable_set('@quiet',true)
34
+ end
35
+
36
+ it "must return true" do
37
+ expect(subject.quiet?).to be(true)
38
+ end
39
+ end
40
+
41
+ context "when @quiet is false" do
42
+ before do
43
+ subject.instance_variable_set('@quiet',false)
44
+ end
45
+
46
+ it "must return false" do
47
+ expect(subject.quiet?).to be(false)
48
+ end
49
+ end
50
+ end
51
+ end