command_kit 0.2.2 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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