clin 0.3.0 → 0.4.0
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.
- checksums.yaml +4 -4
- data/.lint-ci.yml +2 -0
- data/.simplecov +5 -0
- data/.travis.yml +8 -0
- data/CHANGELOG.md +11 -0
- data/README.md +5 -4
- data/benchmarks/bench.rb +21 -0
- data/benchmarks/text_bench.rb +78 -0
- data/clin.gemspec +2 -1
- data/examples/reusable_options.rb +19 -0
- data/examples/simple.rb +8 -3
- data/examples/test.rb +5 -5
- data/examples/text_builder.rb +40 -0
- data/lib/clin/argument.rb +19 -2
- data/lib/clin/command_mixin/core.rb +13 -18
- data/lib/clin/command_mixin/options.rb +37 -26
- data/lib/clin/command_parser.rb +46 -57
- data/lib/clin/common/help_options.rb +1 -0
- data/lib/clin/errors.rb +50 -4
- data/lib/clin/line_reader/basic.rb +38 -0
- data/lib/clin/line_reader/readline.rb +53 -0
- data/lib/clin/line_reader.rb +16 -0
- data/lib/clin/option.rb +24 -11
- data/lib/clin/option_parser.rb +159 -0
- data/lib/clin/shell.rb +36 -15
- data/lib/clin/shell_interaction/choose.rb +19 -11
- data/lib/clin/shell_interaction/file_conflict.rb +4 -1
- data/lib/clin/shell_interaction/select.rb +44 -0
- data/lib/clin/shell_interaction.rb +1 -0
- data/lib/clin/text/table.rb +270 -0
- data/lib/clin/text.rb +152 -0
- data/lib/clin/version.rb +1 -1
- data/lib/clin.rb +10 -1
- data/spec/clin/command_dispacher_spec.rb +1 -1
- data/spec/clin/command_mixin/options_spec.rb +38 -15
- data/spec/clin/command_parser_spec.rb +27 -51
- data/spec/clin/line_reader/basic_spec.rb +54 -0
- data/spec/clin/line_reader/readline_spec.rb +64 -0
- data/spec/clin/line_reader_spec.rb +17 -0
- data/spec/clin/option_parser_spec.rb +217 -0
- data/spec/clin/option_spec.rb +5 -7
- data/spec/clin/shell_interaction/choose_spec.rb +30 -0
- data/spec/clin/shell_interaction/file_interaction_spec.rb +18 -0
- data/spec/clin/shell_interaction/select_spec.rb +96 -0
- data/spec/clin/shell_spec.rb +42 -0
- data/spec/clin/text/table_cell_spec.rb +72 -0
- data/spec/clin/text/table_row_spec.rb +74 -0
- data/spec/clin/text/table_separator_row_spec.rb +82 -0
- data/spec/clin/text/table_spec.rb +259 -0
- data/spec/clin/text_spec.rb +158 -0
- data/spec/examples/list_option_spec.rb +6 -2
- data/spec/examples/reusable_options_spec.rb +21 -0
- data/spec/examples/simple_spec.rb +9 -9
- data/spec/spec_helper.rb +3 -2
- metadata +54 -3
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Clin::Text::TableRow do
|
4
|
+
def table_double(options)
|
5
|
+
double(:table, options.reverse_merge(column_length: {}, update_column_length: true,
|
6
|
+
separate_blank?: true))
|
7
|
+
end
|
8
|
+
|
9
|
+
describe '#each' do
|
10
|
+
let(:table) { table_double(column_length: double(:col_length, size: size)) }
|
11
|
+
subject { Clin::Text::TableRow.new(table, %w(a b c)) }
|
12
|
+
|
13
|
+
before do
|
14
|
+
allow(Clin::Text::TableCell).to receive(:new) do |_table, _index, val|
|
15
|
+
val
|
16
|
+
end
|
17
|
+
end
|
18
|
+
context 'when same number of column as cells' do
|
19
|
+
let(:size) { 3 }
|
20
|
+
it { expect { |b| subject.each(&b) }.to yield_control.exactly(size).times }
|
21
|
+
it { expect { |b| subject.each(&b) }.to yield_successive_args('a', 'b', 'c') }
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'when there are more column that cells in the rows' do
|
25
|
+
let(:size) { 5 }
|
26
|
+
it { expect { |b| subject.each(&b) }.to yield_control.exactly(size).times }
|
27
|
+
it { expect { |b| subject.each(&b) }.to yield_successive_args('a', 'b', 'c', '', '') }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '#border' do
|
32
|
+
let(:table) { table_double(vertical_border: '|', border?: border) }
|
33
|
+
subject { Clin::Text::TableRow.new(table, []) }
|
34
|
+
context 'when border is enabled' do
|
35
|
+
let(:border) { true }
|
36
|
+
|
37
|
+
it { expect(subject.border('value')).to eq('|value|') }
|
38
|
+
it { expect(subject.border('value', ' ')).to eq('| value |') }
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'when border is not enabled' do
|
42
|
+
let(:border) { false }
|
43
|
+
|
44
|
+
it { expect(subject.border('value')).to eq('value') }
|
45
|
+
it { expect(subject.border('value', ' ')).to eq('value') }
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '#to_s' do
|
50
|
+
let(:table) { Clin::Text::Table.new(col_delim: delimiter, border: border) }
|
51
|
+
subject { Clin::Text::TableRow.new(table, %w(val1 val2 val3)) }
|
52
|
+
|
53
|
+
context 'when no border' do
|
54
|
+
let(:border) { false }
|
55
|
+
let(:delimiter) { ' [] ' }
|
56
|
+
|
57
|
+
it { expect(subject.to_s).to eq('val1 [] val2 [] val3') }
|
58
|
+
end
|
59
|
+
|
60
|
+
context 'when border' do
|
61
|
+
let(:border) { true }
|
62
|
+
let(:delimiter) { ' [] ' }
|
63
|
+
|
64
|
+
it { expect(subject.to_s).to eq('| val1 [] val2 [] val3 |') }
|
65
|
+
end
|
66
|
+
|
67
|
+
context 'when no border and specific delimiter' do
|
68
|
+
let(:border) { false }
|
69
|
+
let(:delimiter) { [' # ', ' $ '] }
|
70
|
+
|
71
|
+
it { expect(subject.to_s).to eq('val1 # val2 $ val3') }
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Clin::Text::TableSeparatorRow do
|
4
|
+
def table_double(options)
|
5
|
+
double(:table, options.reverse_merge(column_length: {}, update_column_length: true,
|
6
|
+
separate_blank?: true))
|
7
|
+
end
|
8
|
+
|
9
|
+
describe '#delimiter_at' do
|
10
|
+
let(:table) do
|
11
|
+
Clin::Text::Table.new do |t|
|
12
|
+
t.row %w(a b c d) # 4 columns(i.e. 3 Delimiters)
|
13
|
+
t.column_delimiter delimiter
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
subject { Clin::Text::TableSeparatorRow.new(table, '-', col_delimiter: include_column) }
|
18
|
+
context 'when not include column delimiter' do
|
19
|
+
let(:include_column) { false }
|
20
|
+
let(:delimiter) { ' | ' }
|
21
|
+
|
22
|
+
it { expect(subject.delimiter_at(0)).to eq('---') }
|
23
|
+
it { expect(subject.delimiter_at(1)).to eq('---') }
|
24
|
+
it { expect(subject.delimiter_at(2)).to eq('---') }
|
25
|
+
it { expect(subject.delimiter_at(3)).to eq('') }
|
26
|
+
it { expect(subject.delimiter_at(10)).to eq('') }
|
27
|
+
|
28
|
+
end
|
29
|
+
context 'when include column delimiter' do
|
30
|
+
let(:include_column) { true }
|
31
|
+
|
32
|
+
context 'when column delimiter is a global value' do
|
33
|
+
let(:delimiter) { ' # ' }
|
34
|
+
it { expect(subject.delimiter_at(0)).to eq(delimiter) }
|
35
|
+
it { expect(subject.delimiter_at(1)).to eq(delimiter) }
|
36
|
+
it { expect(subject.delimiter_at(2)).to eq(delimiter) }
|
37
|
+
it { expect(subject.delimiter_at(3)).to eq('') }
|
38
|
+
it { expect(subject.delimiter_at(10)).to eq('') }
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'when column delimiter is a specific' do
|
42
|
+
let(:delimiter) { [' # ', ' | ', ' [] '] }
|
43
|
+
it { expect(subject.delimiter_at(0)).to eq(delimiter[0]) }
|
44
|
+
it { expect(subject.delimiter_at(1)).to eq(delimiter[1]) }
|
45
|
+
it { expect(subject.delimiter_at(2)).to eq(delimiter[2]) }
|
46
|
+
it { expect(subject.delimiter_at(3)).to eq('') }
|
47
|
+
it { expect(subject.delimiter_at(10)).to eq('') }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe '#to_s' do
|
53
|
+
let(:delimiter) { ' | ' }
|
54
|
+
let(:table) do
|
55
|
+
Clin::Text::Table.new(col_delim: delimiter, border: border) do |t|
|
56
|
+
t.column_length = [4, 4, 4]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
subject { Clin::Text::TableSeparatorRow.new(table, col_delimiter: include_column) }
|
60
|
+
|
61
|
+
context 'when not including column delimiter' do
|
62
|
+
let(:include_column) { false }
|
63
|
+
let(:border) { false }
|
64
|
+
|
65
|
+
it { expect(subject.to_s).to eq('------------------') }
|
66
|
+
end
|
67
|
+
|
68
|
+
context 'when including column delimiter' do
|
69
|
+
let(:include_column) { true }
|
70
|
+
let(:border) { false }
|
71
|
+
|
72
|
+
it { expect(subject.to_s).to eq('---- | ---- | ----') }
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'when border' do
|
76
|
+
let(:include_column) { true }
|
77
|
+
let(:border) { true }
|
78
|
+
|
79
|
+
it { expect(subject.to_s).to eq('|----- | ---- | -----|') }
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,259 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Clin::Text::Table do
|
4
|
+
describe '#row' do
|
5
|
+
before do
|
6
|
+
subject.row(%w(a b c))
|
7
|
+
subject.row(%w(a2 b2 c2))
|
8
|
+
end
|
9
|
+
|
10
|
+
it { expect(subject.rows.size).to be 2 }
|
11
|
+
it { expect(subject.rows.first).to be_a Clin::Text::TableRow }
|
12
|
+
it { expect(subject.rows.first.cells.size).to be 3 }
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '#header' do
|
16
|
+
before do
|
17
|
+
subject.header(%w(a b c))
|
18
|
+
end
|
19
|
+
|
20
|
+
it { expect(subject.rows).to be_empty }
|
21
|
+
it { expect(subject.header).to be_a Clin::Text::TableRow }
|
22
|
+
it { expect(subject.header.cells.size).to be 3 }
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#separator' do
|
26
|
+
before do
|
27
|
+
subject.row(%w(a b c))
|
28
|
+
subject.separator
|
29
|
+
subject.separator('=')
|
30
|
+
end
|
31
|
+
|
32
|
+
it { expect(subject.rows.size).to be 3 }
|
33
|
+
it { expect(subject.rows[1]).to be_a Clin::Text::TableSeparatorRow }
|
34
|
+
it { expect(subject.rows[2]).to be_a Clin::Text::TableSeparatorRow }
|
35
|
+
it { expect(subject.rows[2].char).to eq '=' }
|
36
|
+
end
|
37
|
+
|
38
|
+
describe '#align' do
|
39
|
+
it 'set global alignment' do
|
40
|
+
subject.align(:center)
|
41
|
+
expect(subject.alignment).to eq :center
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'set column alignment' do
|
45
|
+
subject.align(*[:center, :left, :right])
|
46
|
+
expect(subject.alignment).to eq [:center, :left, :right]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe '#column_delimiter' do
|
51
|
+
it 'set global delimiter' do
|
52
|
+
subject.column_delimiter(' # ')
|
53
|
+
expect(subject.column_delimiters).to eq(' # ')
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'set column delimiter' do
|
57
|
+
subject.column_delimiter(*[' # ', ' O ', ' [] '])
|
58
|
+
expect(subject.column_delimiters).to eq [' # ', ' O ', ' [] ']
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe '#update_column_length' do
|
63
|
+
it 'set the value' do
|
64
|
+
subject.update_column_length(1, 12)
|
65
|
+
expect(subject.column_length).to eq({1 => 12})
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'set overwrite smaller value' do
|
69
|
+
subject.update_column_length(1, 12)
|
70
|
+
subject.update_column_length(1, 24)
|
71
|
+
expect(subject.column_length).to eq({1 => 24})
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'set keep larger value' do
|
75
|
+
subject.update_column_length(1, 12)
|
76
|
+
subject.update_column_length(1, 6)
|
77
|
+
expect(subject.column_length).to eq({1 => 12})
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe '#sym_or_array' do
|
82
|
+
it 'return symbol when symbol given' do
|
83
|
+
expect(subject.send(:sym_or_array, :sym)).to eq(:sym)
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'return array when multiple arguments given' do
|
87
|
+
expect(subject.send(:sym_or_array, :sym1, :sym2, :sym3)).to eq([:sym1, :sym2, :sym3])
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'return array when array given' do
|
91
|
+
expect(subject.send(:sym_or_array, [:sym1, :sym2, :sym3])).to eq([:sym1, :sym2, :sym3])
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'return array when array and arguments given' do
|
95
|
+
expect(subject.send(:sym_or_array, [:sym1, :sym2], :sym3)).to eq([:sym1, :sym2, :sym3])
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe '#add_border' do
|
100
|
+
let(:text) { double(:text, line: true, prefix: true) }
|
101
|
+
let (:line) { '====----====' }
|
102
|
+
before do
|
103
|
+
allow(Clin::Text::TableSeparatorRow).to receive(:new).and_return(line)
|
104
|
+
subject.send(:add_border, text)
|
105
|
+
end
|
106
|
+
it { expect(text).to have_received(:line).with(line) }
|
107
|
+
it { expect(text).to have_received(:prefix).with(line) }
|
108
|
+
end
|
109
|
+
|
110
|
+
describe '#to_text' do
|
111
|
+
let(:header) { %w(Header1 Header2 Header3) }
|
112
|
+
let(:row1) { %w(First1 First2 First3) }
|
113
|
+
let(:row2) { %w(Second1 Second2 SecondThird) }
|
114
|
+
|
115
|
+
before do
|
116
|
+
subject.border = false
|
117
|
+
subject.row row1
|
118
|
+
subject.row row2
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'make a text with only the given row' do
|
122
|
+
expect(subject.to_text._lines.size).to be 2
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'add 2 rows for header' do
|
126
|
+
subject.header header
|
127
|
+
expect(subject.to_text._lines.size).to be 4
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'add 2 rows for border' do
|
131
|
+
subject.border = true
|
132
|
+
expect(subject.to_text._lines.size).to be 4
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
|
137
|
+
describe '#delimiter_at' do
|
138
|
+
before do
|
139
|
+
subject.row %w(a b c d) # 4 columns(i.e. 3 Delimiters)
|
140
|
+
subject.column_delimiter delimiter
|
141
|
+
end
|
142
|
+
context 'when delimiter is a global value' do
|
143
|
+
let(:delimiter) { ' # ' }
|
144
|
+
it { expect(subject.delimiter_at(0)).to eq(delimiter) }
|
145
|
+
it { expect(subject.delimiter_at(3)).to eq('') }
|
146
|
+
it { expect(subject.delimiter_at(10)).to eq('') }
|
147
|
+
end
|
148
|
+
|
149
|
+
context 'when delimiter is a global value' do
|
150
|
+
let(:delimiter) { ' # ' }
|
151
|
+
it { expect(subject.delimiter_at(0)).to eq(delimiter) }
|
152
|
+
it { expect(subject.delimiter_at(1)).to eq(delimiter) }
|
153
|
+
it { expect(subject.delimiter_at(2)).to eq(delimiter) }
|
154
|
+
it { expect(subject.delimiter_at(3)).to eq('') }
|
155
|
+
it { expect(subject.delimiter_at(10)).to eq('') }
|
156
|
+
end
|
157
|
+
|
158
|
+
context 'when delimiter is a specific' do
|
159
|
+
let(:delimiter) { [' # ', ' | ', ' [] '] }
|
160
|
+
it { expect(subject.delimiter_at(0)).to eq(delimiter[0]) }
|
161
|
+
it { expect(subject.delimiter_at(1)).to eq(delimiter[1]) }
|
162
|
+
it { expect(subject.delimiter_at(2)).to eq(delimiter[2]) }
|
163
|
+
it { expect(subject.delimiter_at(3)).to eq('') }
|
164
|
+
it { expect(subject.delimiter_at(10)).to eq('') }
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
describe '#to_s' do
|
169
|
+
subject do
|
170
|
+
Clin::Text::Table.new(border: false) do |t|
|
171
|
+
t.align :right, :center, :left
|
172
|
+
# t.column_delimiter ' - ', ' # '
|
173
|
+
t.header %w(First Last Email)
|
174
|
+
|
175
|
+
t.row %w(Timothee Guerin timothee.guerin@outlook.com)
|
176
|
+
t.row %w(Some Guy Some.Guy@outlook.com)
|
177
|
+
|
178
|
+
t.separator
|
179
|
+
|
180
|
+
t.row %w(VeryLongFirstName Guy Some.Other@outlook.com)
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
context 'when include border' do
|
185
|
+
it 'build the table' do
|
186
|
+
subject.border = true
|
187
|
+
expect(subject.to_s).to eq <<table
|
188
|
+
|----------------------------------------------------------|
|
189
|
+
| First | Last | Email |
|
190
|
+
|------------------ | ------ | ----------------------------|
|
191
|
+
| Timothee | Guerin | timothee.guerin@outlook.com |
|
192
|
+
| Some | Guy | Some.Guy@outlook.com |
|
193
|
+
|------------------ | ------ | ----------------------------|
|
194
|
+
| VeryLongFirstName | Guy | Some.Other@outlook.com |
|
195
|
+
|----------------------------------------------------------|
|
196
|
+
table
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
context 'when no border' do
|
201
|
+
before do
|
202
|
+
subject.border = false
|
203
|
+
end
|
204
|
+
|
205
|
+
it 'build the table' do
|
206
|
+
out = <<table
|
207
|
+
First | Last | Email
|
208
|
+
----------------- | ------ | ---------------------------
|
209
|
+
Timothee | Guerin | timothee.guerin@outlook.com
|
210
|
+
Some | Guy | Some.Guy@outlook.com
|
211
|
+
----------------- | ------ | ---------------------------
|
212
|
+
VeryLongFirstName | Guy | Some.Other@outlook.com
|
213
|
+
table
|
214
|
+
# Need to rstrip because trailing whitespace are being removed automatically by editor
|
215
|
+
expect(subject.to_s.split("\n").map(&:rstrip)).to eq out.split("\n").map(&:rstrip)
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
context 'when custom column delimiter' do
|
220
|
+
before do
|
221
|
+
subject.border = true
|
222
|
+
subject.column_delimiter ' - ', ' # '
|
223
|
+
end
|
224
|
+
|
225
|
+
it 'build the table' do
|
226
|
+
expect(subject.to_s).to eq <<table
|
227
|
+
|----------------------------------------------------------|
|
228
|
+
| First - Last # Email |
|
229
|
+
|------------------ - ------ # ----------------------------|
|
230
|
+
| Timothee - Guerin # timothee.guerin@outlook.com |
|
231
|
+
| Some - Guy # Some.Guy@outlook.com |
|
232
|
+
|------------------ - ------ # ----------------------------|
|
233
|
+
| VeryLongFirstName - Guy # Some.Other@outlook.com |
|
234
|
+
|----------------------------------------------------------|
|
235
|
+
table
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
context 'when align all to the right' do
|
240
|
+
before do
|
241
|
+
subject.border = true
|
242
|
+
subject.align :right
|
243
|
+
end
|
244
|
+
|
245
|
+
it 'build the table' do
|
246
|
+
expect(subject.to_s).to eq <<table
|
247
|
+
|----------------------------------------------------------|
|
248
|
+
| First | Last | Email |
|
249
|
+
|------------------ | ------ | ----------------------------|
|
250
|
+
| Timothee | Guerin | timothee.guerin@outlook.com |
|
251
|
+
| Some | Guy | Some.Guy@outlook.com |
|
252
|
+
|------------------ | ------ | ----------------------------|
|
253
|
+
| VeryLongFirstName | Guy | Some.Other@outlook.com |
|
254
|
+
|----------------------------------------------------------|
|
255
|
+
table
|
256
|
+
end
|
257
|
+
end
|
258
|
+
end
|
259
|
+
end
|
@@ -0,0 +1,158 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Clin::Text do
|
4
|
+
describe '#process_line' do
|
5
|
+
let (:line) { Faker::Lorem::sentence }
|
6
|
+
context 'when global indent is not set' do
|
7
|
+
subject { Clin::Text.new }
|
8
|
+
|
9
|
+
it 'return the same line with no indent' do
|
10
|
+
expect(subject.process_line(line)).to eq(line)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'add a new line and indent' do
|
14
|
+
expect(subject.process_line(line, indent: 2)).to eq(" #{line}")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'when global indent is set' do
|
19
|
+
subject { Clin::Text.new(indent: '**') }
|
20
|
+
|
21
|
+
it 'add line with global indent' do
|
22
|
+
expect(subject.process_line(line)).to eq("**#{line}")
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'add line with global indent and method indent' do
|
26
|
+
expect(subject.process_line(line, indent: 2)).to eq("** #{line}")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '#line' do
|
32
|
+
let (:line1) { Faker::Lorem::sentence }
|
33
|
+
let (:line2) { Faker::Lorem::sentence }
|
34
|
+
|
35
|
+
before do
|
36
|
+
subject.line(line1)
|
37
|
+
subject.line(line2)
|
38
|
+
end
|
39
|
+
|
40
|
+
it { expect(subject.lines.size).to be 2 }
|
41
|
+
it { expect(subject.lines[0]).to eq line1 }
|
42
|
+
it { expect(subject.lines[1]).to eq line2 }
|
43
|
+
end
|
44
|
+
|
45
|
+
describe '#prefix' do
|
46
|
+
let (:line1) { Faker::Lorem::sentence }
|
47
|
+
let (:line2) { Faker::Lorem::sentence }
|
48
|
+
|
49
|
+
before do
|
50
|
+
subject.line(line1)
|
51
|
+
subject.prefix(line2)
|
52
|
+
end
|
53
|
+
|
54
|
+
it { expect(subject.lines.size).to be 2 }
|
55
|
+
it { expect(subject.lines[0]).to eq line2 }
|
56
|
+
it { expect(subject.lines[1]).to eq line1 }
|
57
|
+
end
|
58
|
+
|
59
|
+
describe '#blank' do
|
60
|
+
it 'add 1 blank line' do
|
61
|
+
subject.blank
|
62
|
+
expect(subject.lines).to eq([''])
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'add multiple blank line' do
|
66
|
+
subject.blank(3)
|
67
|
+
expect(subject.lines).to eq(['', '', ''])
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe '#lines' do
|
72
|
+
let (:lines) { [Faker::Lorem::sentence, Faker::Lorem::sentence] }
|
73
|
+
it 'add lines' do
|
74
|
+
subject.lines(lines)
|
75
|
+
expect(subject.lines).to eq(lines)
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'add lines and indent' do
|
79
|
+
subject.lines(lines, indent: '**')
|
80
|
+
expect(subject.lines).to eq(lines.map { |x| "**#{x}" })
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe '#text' do
|
85
|
+
let (:lines) { [Faker::Lorem::sentence, Faker::Lorem::sentence] }
|
86
|
+
|
87
|
+
let (:text) do
|
88
|
+
text_lines = lines
|
89
|
+
Clin::Text.new do |t|
|
90
|
+
t.lines(text_lines)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'add text' do
|
95
|
+
subject.text(text)
|
96
|
+
expect(subject.lines).to eq(lines)
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'add text and indent' do
|
100
|
+
subject.text(text, indent: '**')
|
101
|
+
expect(subject.lines).to eq(lines.map { |x| "**#{x}" })
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe '#indent' do
|
106
|
+
let (:line) { Faker::Lorem::sentence }
|
107
|
+
|
108
|
+
it 'add an indented line inside block' do
|
109
|
+
subject.indent 2 do
|
110
|
+
subject.line(line)
|
111
|
+
end
|
112
|
+
expect(subject.lines).to eq([" #{line}"])
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'add line with nested indent' do
|
116
|
+
subject.indent 2 do
|
117
|
+
subject.line(line)
|
118
|
+
subject.indent '***' do
|
119
|
+
subject.line(line)
|
120
|
+
end
|
121
|
+
subject.line(line)
|
122
|
+
end
|
123
|
+
expect(subject.lines).to eq([" #{line}", " ***#{line}", " #{line}"])
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
|
128
|
+
describe '#to_s' do
|
129
|
+
let (:line1) { Faker::Lorem::sentence }
|
130
|
+
let (:line2) { Faker::Lorem::sentence }
|
131
|
+
let (:line3) { Faker::Lorem::sentence }
|
132
|
+
|
133
|
+
it 'join line with \n' do
|
134
|
+
subject.line line1
|
135
|
+
subject.line line2
|
136
|
+
subject.prefix line3
|
137
|
+
expect(subject.to_s).to eq("#{line3}\n#{line1}\n#{line2}\n")
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
describe '#on' do
|
142
|
+
it 'register a new callback' do
|
143
|
+
b = proc { |line|}
|
144
|
+
subject.on(&b)
|
145
|
+
expect(subject.listeners).to eq([b])
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
describe '#broadcast' do
|
150
|
+
it 'register a new callback' do
|
151
|
+
b = proc { |line|}
|
152
|
+
subject.on(&b)
|
153
|
+
subject.on(&b)
|
154
|
+
expect(b).to receive(:call).with('some line').twice
|
155
|
+
subject.broadcast('some line')
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
@@ -6,8 +6,12 @@ RSpec.describe 'list_option.rb' do
|
|
6
6
|
it { expect(ListCommand.parse('').params).to eq(echo: [], line: 0) }
|
7
7
|
it { expect(ListCommand.parse('--echo msg').params).to eq(echo: ['msg'], line: 0) }
|
8
8
|
it { expect(ListCommand.parse('--line').params).to eq(echo: [], line: 1) }
|
9
|
-
it {
|
10
|
-
|
9
|
+
it {
|
10
|
+
expect(ListCommand.parse('--line --line').params).to eq(echo: [], line: 2)
|
11
|
+
}
|
12
|
+
it {
|
13
|
+
expect(ListCommand.parse('-lll').params).to eq(echo: [], line: 3)
|
14
|
+
}
|
11
15
|
it do
|
12
16
|
expect(ListCommand.parse('--echo msg1 --echo msg2').params)
|
13
17
|
.to eq(echo: %w(msg1 msg2), line: 0)
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'examples/reusable_options'
|
3
|
+
|
4
|
+
RSpec.describe 'reusable_options.rb' do
|
5
|
+
def parse(str)
|
6
|
+
ReusableOptionCommand.parse(str).params
|
7
|
+
end
|
8
|
+
|
9
|
+
suppress_puts
|
10
|
+
it { expect(parse('--verbose')).to eq(verbose: true) }
|
11
|
+
it { expect(parse('--echo "Hello world!"')).to eq(echo: 'Hello world!') }
|
12
|
+
it { expect(parse('--source "~/source"')).to eq(source: '~/source') }
|
13
|
+
it { expect(parse('--echo "Hello world!" --source "~/source"'))
|
14
|
+
.to eq(echo: 'Hello world!', source: '~/source') }
|
15
|
+
it { expect(parse('--source "~/source" -v --echo "Hello world!"'))
|
16
|
+
.to eq(echo: 'Hello world!', verbose: true, source: '~/source') }
|
17
|
+
it { expect(parse('-s"~/source" -v --echo "Hello world!"'))
|
18
|
+
.to eq(echo: 'Hello world!', verbose: true, source: '~/source') }
|
19
|
+
|
20
|
+
|
21
|
+
end
|
@@ -4,28 +4,28 @@ require 'examples/simple'
|
|
4
4
|
RSpec.describe 'simple_spec.rb' do
|
5
5
|
suppress_puts
|
6
6
|
it { expect(SimpleCommand.parse('display Some').params).
|
7
|
-
|
7
|
+
to eq(display: 'display', message: 'Some') }
|
8
8
|
it { expect(SimpleCommand.parse('display "Message with spaces"').params).
|
9
|
-
|
9
|
+
to eq(display: 'display', message: 'Message with spaces') }
|
10
10
|
|
11
11
|
it { expect(SimpleCommand.parse('display Some -e More').params).
|
12
|
-
|
12
|
+
to eq(display: 'display', message: 'Some', echo: 'More') }
|
13
13
|
|
14
14
|
it { expect(SimpleCommand.parse('display Some -eMore').params).
|
15
|
-
|
15
|
+
to eq(display: 'display', message: 'Some', echo: 'More') }
|
16
16
|
|
17
17
|
it { expect(SimpleCommand.parse('display Some -e "Even More"').params).
|
18
|
-
|
18
|
+
to eq(display: 'display', message: 'Some', echo: 'Even More') }
|
19
19
|
|
20
20
|
it { expect(SimpleCommand.parse('display Some --echo More').params).
|
21
|
-
|
21
|
+
to eq(display: 'display', message: 'Some', echo: 'More') }
|
22
22
|
|
23
23
|
it { expect(SimpleCommand.parse('display Some --echo=More').params).
|
24
|
-
|
24
|
+
to eq(display: 'display', message: 'Some', echo: 'More') }
|
25
25
|
|
26
26
|
it { expect(SimpleCommand.parse('display Some --echo "Even More"').params).
|
27
|
-
|
27
|
+
to eq(display: 'display', message: 'Some', echo: 'Even More') }
|
28
28
|
|
29
29
|
it { expect { SimpleCommand.parse('').params }.to raise_error(Clin::HelpError) }
|
30
30
|
it { expect { SimpleCommand.parse('-h').params }.to raise_error(Clin::HelpError) }
|
31
|
-
end
|
31
|
+
end
|
data/spec/spec_helper.rb
CHANGED