command_kit 0.2.2 → 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.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +4 -5
  3. data/.rubocop.yml +14 -1
  4. data/ChangeLog.md +82 -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/arguments/argument.rb +2 -2
  12. data/lib/command_kit/arguments.rb +27 -2
  13. data/lib/command_kit/bug_report.rb +105 -0
  14. data/lib/command_kit/colors.rb +488 -15
  15. data/lib/command_kit/command.rb +1 -2
  16. data/lib/command_kit/edit.rb +54 -0
  17. data/lib/command_kit/env.rb +1 -1
  18. data/lib/command_kit/file_utils.rb +46 -0
  19. data/lib/command_kit/options/option.rb +45 -22
  20. data/lib/command_kit/options/option_value.rb +2 -2
  21. data/lib/command_kit/options/parser.rb +1 -4
  22. data/lib/command_kit/options/quiet.rb +1 -1
  23. data/lib/command_kit/options/verbose.rb +2 -2
  24. data/lib/command_kit/options/version.rb +10 -0
  25. data/lib/command_kit/options.rb +89 -14
  26. data/lib/command_kit/os.rb +1 -1
  27. data/lib/command_kit/printing/fields.rb +56 -0
  28. data/lib/command_kit/printing/indent.rb +1 -1
  29. data/lib/command_kit/printing/lists.rb +91 -0
  30. data/lib/command_kit/printing/tables/border_style.rb +169 -0
  31. data/lib/command_kit/printing/tables/cell_builder.rb +93 -0
  32. data/lib/command_kit/printing/tables/row_builder.rb +111 -0
  33. data/lib/command_kit/printing/tables/style.rb +198 -0
  34. data/lib/command_kit/printing/tables/table_builder.rb +145 -0
  35. data/lib/command_kit/printing/tables/table_formatter.rb +254 -0
  36. data/lib/command_kit/printing/tables.rb +208 -0
  37. data/lib/command_kit/program_name.rb +9 -0
  38. data/lib/command_kit/stdio.rb +5 -1
  39. data/lib/command_kit/version.rb +1 -1
  40. data/spec/arguments_spec.rb +33 -0
  41. data/spec/bug_report_spec.rb +266 -0
  42. data/spec/colors_spec.rb +232 -195
  43. data/spec/command_name_spec.rb +1 -1
  44. data/spec/command_spec.rb +2 -2
  45. data/spec/edit_spec.rb +72 -0
  46. data/spec/file_utils_spec.rb +59 -0
  47. data/spec/fixtures/template.erb +5 -0
  48. data/spec/options/option_spec.rb +48 -2
  49. data/spec/options/parser_spec.rb +0 -10
  50. data/spec/options/quiet_spec.rb +51 -0
  51. data/spec/options/verbose_spec.rb +51 -0
  52. data/spec/options/version_spec.rb +146 -0
  53. data/spec/options_spec.rb +46 -0
  54. data/spec/pager_spec.rb +1 -1
  55. data/spec/printing/fields_spec.rb +167 -0
  56. data/spec/printing/lists_spec.rb +99 -0
  57. data/spec/printing/tables/border_style.rb +43 -0
  58. data/spec/printing/tables/cell_builer_spec.rb +135 -0
  59. data/spec/printing/tables/row_builder_spec.rb +165 -0
  60. data/spec/printing/tables/style_spec.rb +377 -0
  61. data/spec/printing/tables/table_builder_spec.rb +252 -0
  62. data/spec/printing/tables/table_formatter_spec.rb +1180 -0
  63. data/spec/printing/tables_spec.rb +1069 -0
  64. data/spec/program_name_spec.rb +8 -0
  65. metadata +36 -7
@@ -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