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,252 @@
1
+ require 'spec_helper'
2
+ require 'command_kit/printing/tables/table_builder'
3
+
4
+ describe CommandKit::Printing::Tables::TableBuilder do
5
+ it { expect(described_class).to include(Enumerable) }
6
+
7
+ describe "#initialize" do
8
+ it "must initialize #rows to an empty Array" do
9
+ expect(subject.rows).to eq([])
10
+ end
11
+
12
+ it "must default #height to 0" do
13
+ expect(subject.height).to eq(0)
14
+ end
15
+
16
+ it "must default #width to 0" do
17
+ expect(subject.width).to eq(0)
18
+ end
19
+
20
+ it "must iniitialize #column_widths to an empty Array" do
21
+ expect(subject.column_widths).to eq([])
22
+ end
23
+
24
+ it "must default #max_columns to 0" do
25
+ expect(subject.max_columns).to eq(0)
26
+ end
27
+
28
+ it "must default #max_rows to 0" do
29
+ expect(subject.max_rows).to eq(0)
30
+ end
31
+
32
+ context "when given initial rows" do
33
+ let(:row1) { %w[foo bar] }
34
+ let(:row2) { %w[baz qux] }
35
+ let(:rows) { [row1, row2] }
36
+
37
+ subject { described_class.new(rows) }
38
+
39
+ it "must append the rows to the table" do
40
+ expect(subject.rows[0]).to be_kind_of(CommandKit::Printing::Tables::RowBuilder)
41
+ expect(subject.rows[0].cells[0].lines[0]).to eq(row1[0])
42
+ expect(subject.rows[0].cells[1].lines[0]).to eq(row1[1])
43
+
44
+ expect(subject.rows[1]).to be_kind_of(CommandKit::Printing::Tables::RowBuilder)
45
+ expect(subject.rows[1].cells[0].lines[0]).to eq(row2[0])
46
+ expect(subject.rows[1].cells[1].lines[0]).to eq(row2[1])
47
+ end
48
+
49
+ context "and when given the header: keyword argument" do
50
+ let(:header) { %w[A B] }
51
+
52
+ subject { described_class.new(rows, header: header) }
53
+
54
+ it "must append the header: value before the rows" do
55
+ expect(subject.rows[0]).to be_kind_of(CommandKit::Printing::Tables::RowBuilder)
56
+ expect(subject.rows[0].cells[0].lines[0]).to eq(header[0])
57
+ expect(subject.rows[0].cells[1].lines[0]).to eq(header[1])
58
+
59
+ expect(subject.rows[1]).to be_kind_of(CommandKit::Printing::Tables::RowBuilder)
60
+ expect(subject.rows[1].cells[0].lines[0]).to eq(row1[0])
61
+ expect(subject.rows[1].cells[1].lines[0]).to eq(row1[1])
62
+
63
+ expect(subject.rows[2]).to be_kind_of(CommandKit::Printing::Tables::RowBuilder)
64
+ expect(subject.rows[2].cells[0].lines[0]).to eq(row2[0])
65
+ expect(subject.rows[2].cells[1].lines[0]).to eq(row2[1])
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ describe "#header?" do
72
+ let(:header) { %w[A B] }
73
+ let(:rows) do
74
+ [
75
+ %w[foo bar],
76
+ %w[baz qux]
77
+ ]
78
+ end
79
+
80
+ context "when initialized with the header: keyword argument" do
81
+ subject { described_class.new(rows, header: header) }
82
+
83
+ it "must return true" do
84
+ expect(subject.header?).to be(true)
85
+ end
86
+ end
87
+
88
+ context "when not initialized with the header: keyword argument" do
89
+ it "must return false" do
90
+ expect(subject.header?).to be(false)
91
+ end
92
+ end
93
+ end
94
+
95
+ describe "#<<" do
96
+ let(:row) { %w[foo bar] }
97
+
98
+ it "must append a new CommandKit::Printing::Tables::RowBuilder object to #rows" do
99
+ subject << row
100
+
101
+ expect(subject.rows.last).to be_kind_of(CommandKit::Printing::Tables::RowBuilder)
102
+ expect(subject.rows.last.cells[0].lines[0]).to eq(row[0])
103
+ expect(subject.rows.last.cells[1].lines[0]).to eq(row[1])
104
+ end
105
+
106
+ it "must increment #max_rows by 1" do
107
+ expect(subject.max_rows).to eq(0)
108
+
109
+ subject << row
110
+ expect(subject.max_rows).to eq(1)
111
+
112
+ subject << row
113
+ expect(subject.max_rows).to eq(2)
114
+ end
115
+
116
+ it "must return self" do
117
+ expect(subject << row).to be(subject)
118
+ end
119
+
120
+ context "when the row does contain any multi-line Strings" do
121
+ let(:row1) { %w[foo bar] }
122
+ let(:row2) { ["foo", "bar\nbaz"] }
123
+
124
+ it "must increase #height by the line height of the new row" do
125
+ expect(subject.height).to eq(0)
126
+
127
+ subject << row1
128
+ expect(subject.height).to eq(subject.rows.first.height)
129
+
130
+ subject << row2
131
+ expect(subject.height).to eq(
132
+ subject.rows[0].height + subject.rows[1].height
133
+ )
134
+ end
135
+ end
136
+
137
+ context "when the row does not contain any multi-line Strings" do
138
+ let(:row1) { %w[foo bar] }
139
+ let(:row2) { %w[baz qux] }
140
+
141
+ it "must increase #height by 1" do
142
+ expect(subject.height).to eq(0)
143
+
144
+ subject << row1
145
+ expect(subject.height).to eq(1)
146
+
147
+ subject << row2
148
+ expect(subject.height).to eq(2)
149
+ end
150
+ end
151
+
152
+ context "when the row contains more characters than the current #width" do
153
+ let(:row1) { %w[foo bar] }
154
+ let(:row2) { %w[foo barAAAAAAAA] }
155
+
156
+ it "must update #width to the new row's width" do
157
+ expect(subject.width).to eq(0)
158
+
159
+ subject << row1
160
+ expect(subject.width).to eq(subject.rows[0].width)
161
+
162
+ subject << row2
163
+ expect(subject.width).to eq(subject.rows[1].width)
164
+ end
165
+ end
166
+
167
+ context "when the row does not contains more characters than #width" do
168
+ let(:row1) { %w[foo bar] }
169
+ let(:row2) { %w[foo bar] }
170
+
171
+ it "must not update #width" do
172
+ expect(subject.width).to eq(0)
173
+
174
+ subject << row1
175
+ expect(subject.width).to eq(subject.rows[0].width)
176
+
177
+ subject << row2
178
+ expect(subject.width).to eq(subject.rows[0].width)
179
+ end
180
+ end
181
+
182
+ context "when the row contains more columns than the current #max_columns" do
183
+ let(:row1) { %w[foo bar] }
184
+ let(:row2) { %w[foo bar qux] }
185
+
186
+ it "must update #max_columns to the new row's #columns" do
187
+ expect(subject.max_columns).to eq(0)
188
+
189
+ subject << row1
190
+ expect(subject.max_columns).to eq(subject.rows[0].columns)
191
+
192
+ subject << row2
193
+ expect(subject.max_columns).to eq(subject.rows[1].columns)
194
+ end
195
+ end
196
+
197
+ context "when the row does not contain more columns than the current #max_columns" do
198
+ let(:row1) { %w[foo bar] }
199
+ let(:row2) { %w[foo bar] }
200
+
201
+ it "must not update #max_columns" do
202
+ expect(subject.max_columns).to eq(0)
203
+
204
+ subject << row1
205
+ expect(subject.max_columns).to eq(subject.rows[0].columns)
206
+
207
+ subject << row2
208
+ expect(subject.max_columns).to eq(subject.rows[0].columns)
209
+ end
210
+ end
211
+ end
212
+
213
+ describe "#[]" do
214
+ context "when the row index is within the bounds of #rows" do
215
+ before do
216
+ subject << %w[foo bar]
217
+ subject << %w[baz qux]
218
+ end
219
+
220
+ it "must return the row at the given index" do
221
+ expect(subject[1]).to be(subject.rows[1])
222
+ end
223
+ end
224
+
225
+ context "when the row index is not within the bounds of #rows" do
226
+ it "must return nil" do
227
+ expect(subject[2]).to be(nil)
228
+ end
229
+ end
230
+ end
231
+
232
+ describe "#each" do
233
+ before do
234
+ subject << %w[foo bar]
235
+ subject << %w[baz qux]
236
+ end
237
+
238
+ context "when given a block" do
239
+ it "must yield each row in #rows" do
240
+ expect { |b|
241
+ subject.each(&b)
242
+ }.to yield_successive_args(*subject.rows)
243
+ end
244
+ end
245
+
246
+ context "when no block is given" do
247
+ it "must return an Enumerator for #rows" do
248
+ expect(subject.each.to_a).to eq(subject.rows)
249
+ end
250
+ end
251
+ end
252
+ end