highline_wrapper 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2ce70d5eeb141d2b2440550b66335dc2e94a69acd4a0a214fea5dd78506b0bf8
4
- data.tar.gz: e88f0e2c78bba7f92aec919a21326d75ac84b324c5ff3c0c2b5177346605bb62
3
+ metadata.gz: f360fc32885250acb479282caea2a5594cd40ad0f7ed101bf87bf4c229212d2f
4
+ data.tar.gz: 71dcb19db17ce249d0fb08307b88dcd4fa22686d951065e5d0cc5e479866a53a
5
5
  SHA512:
6
- metadata.gz: ae702cfaa01941f91f445145af9f4143a234f3ef9c41cec601454fa75a1b0268b9ffa70a2384b236472b916281e2dac38c8721791c5b1d7c60029b1b135949f2
7
- data.tar.gz: 3891869ced3281e666861618dae0f43f81eff9f62c1a8cfd26d4e67758085585fe33595918b484fdf67fdf13ed1b7e013de82730229bf8c8d4fed39e5afc0981
6
+ metadata.gz: 2a3e21cc1744f27746016e1744f16640504cdaad8f1b80e1bdf3a9f4b16ac3afa5aed6787f1128e2b02867ba9edd02d83d17fa25f834d27c6334c93063daac9f
7
+ data.tar.gz: 2560f9a19bcd5fdb633084109aac6a82769d49f54b065ca780c1f0e32503aa9ee66952a731753e0bc5d18a83585e5fb74c57a06f124ca0739f7d201cd8dbf571
data/Gemfile.lock CHANGED
@@ -1,19 +1,22 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- highline_wrapper (1.0.0)
4
+ highline_wrapper (1.1.0)
5
5
  highline (~> 2.0)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
10
  ast (2.4.2)
11
+ binding_of_caller (1.0.0)
12
+ debug_inspector (>= 0.0.1)
11
13
  coderay (1.1.3)
12
14
  concurrent-ruby (1.1.8)
15
+ debug_inspector (1.0.0)
13
16
  diff-lcs (1.4.4)
14
17
  faker (2.16.0)
15
18
  i18n (>= 1.6, < 2)
16
- ffi (1.14.2)
19
+ ffi (1.15.0)
17
20
  formatador (0.2.5)
18
21
  guard (2.16.2)
19
22
  formatador (>= 0.2.4)
@@ -32,6 +35,7 @@ GEM
32
35
  highline (2.0.3)
33
36
  i18n (1.8.9)
34
37
  concurrent-ruby (~> 1.0)
38
+ interception (0.5)
35
39
  listen (3.4.1)
36
40
  rb-fsevent (~> 0.10, >= 0.10.3)
37
41
  rb-inotify (~> 0.9, >= 0.9.10)
@@ -47,6 +51,15 @@ GEM
47
51
  pry (0.14.0)
48
52
  coderay (~> 1.1)
49
53
  method_source (~> 1.0)
54
+ pry-doc (1.1.0)
55
+ pry (~> 0.11)
56
+ yard (~> 0.9.11)
57
+ pry-rescue (1.5.2)
58
+ interception (>= 0.5)
59
+ pry (>= 0.12.0)
60
+ pry-stack_explorer (0.6.1)
61
+ binding_of_caller (~> 1.0)
62
+ pry (~> 0.13)
50
63
  rainbow (3.0.0)
51
64
  rake (13.0.3)
52
65
  rb-fsevent (0.10.4)
@@ -82,6 +95,7 @@ GEM
82
95
  shellany (0.0.1)
83
96
  thor (1.1.0)
84
97
  unicode-display_width (2.0.0)
98
+ yard (0.9.26)
85
99
 
86
100
  PLATFORMS
87
101
  x86_64-darwin-20
@@ -92,9 +106,12 @@ DEPENDENCIES
92
106
  guard-rspec (~> 4.3)
93
107
  highline_wrapper!
94
108
  pry (~> 0.13)
109
+ pry-doc
110
+ pry-rescue
111
+ pry-stack_explorer
95
112
  rake (~> 13.0)
96
113
  rspec (~> 3.9)
97
114
  rubocop (~> 1.10)
98
115
 
99
116
  BUNDLED WITH
100
- 2.2.4
117
+ 2.2.14
data/README.md CHANGED
@@ -46,66 +46,87 @@ Then, you can call its questions to receive answers. There's several configurati
46
46
  ### Open-ended questions
47
47
 
48
48
  Question configuration options:
49
+ * `indicate_default_message`: defaults to `true`
49
50
  * `secret`: defaults to `false`
50
51
  * `default`: defaults to `''`
51
52
  * `required`: defaults to `false`
52
53
 
54
+ Notes:
55
+ * If `indicate_default_message` is `true`, then the wrapper will tell us what the default value returned is _if_ the user skips the question
56
+ * If `secret` is `true`, then the wrapper _may_ automatically add a newline after a skipped answer... this is automatic from HighLine and is, unfortunately, out of the wrapper's control
57
+ * If `required` is `true`, the question will repeat until the user answers the question
58
+ * If `required` is `true`, then the `default` value will be ignored (defaults to `''`, but could be set to whatever and the code won't care... the question is required)
59
+ * If `default` is `''` and `required` is `false`, and the user skips the question, the answer will be `''`
60
+ * If `secret` is `true`, then the command-line will hide the user's answer behind `*`
61
+
53
62
  <details><summary>Examples</summary>
54
63
 
55
64
  ```ruby
56
65
  > HighlineWrapper.new.ask('What is your favorite number?')
57
66
  What is your favorite number?
58
67
  four
59
-
60
68
  => "four"
61
69
 
62
70
  > HighlineWrapper.new.ask('What is your favorite number?', {required: true})
63
71
  What is your favorite number?
64
-
65
- This question is required.
66
-
72
+ --- This question is required ---
67
73
  What is your favorite number?
68
-
69
- This question is required.
70
-
74
+ --- This question is required ---
75
+ What is your favorite number?
76
+ --- This question is required ---
71
77
  What is your favorite number?
72
78
  2
73
-
74
79
  => "2"
75
80
 
81
+ > HighlineWrapper.new.ask('What is your favorite number?', {required: true, indicate_default_message: false})
82
+ What is your favorite number?
83
+ --- This question is required ---
84
+ What is your favorite number?
85
+ --- This question is required ---
86
+ What is your favorite number?
87
+ 5
88
+ => "5"
89
+
90
+ > HighlineWrapper.new.ask('What is your favorite number?', {indicate_default_message: false})
91
+ What is your favorite number?
92
+ => ""
93
+
76
94
  > HighlineWrapper.new.ask('What is your favorite color?')
77
95
  What is your favorite color?
78
-
96
+ --- Default selected: EMPTY ---
79
97
  => ""
80
98
 
81
99
  > HighlineWrapper.new.ask('What is your favorite color?', {default: 'orange'})
82
100
  What is your favorite color?
83
-
101
+ --- Default selected: orange ---
84
102
  => "orange"
85
103
 
86
104
  > HighlineWrapper.new.ask('Please type your private token:', {secret: true})
87
105
  Please type your private token?
88
106
  ****************
89
-
90
107
  => "MY-PRIVATE-TOKEN"
91
108
 
92
- > HighlineWrapper.new.ask('What is your private token?', {secret: true, required: true})
93
- What is your private token?
109
+ > HighlineWrapper.new.ask('Please type your private token:', {secret: true, indicate_default_message: false})
110
+ Please type your private token:
94
111
 
95
- This question is required.
96
-
97
- What is your private token?
98
-
99
- This question is required.
112
+ => ""
100
113
 
101
- What is your private token?
114
+ > HighlineWrapper.new.ask('Please type your private token:', {secret: true, required: true})
115
+ Please type your private token:
102
116
 
103
- This question is required.
117
+ --- This question is required ---
118
+ Please type your private token:
104
119
 
105
- What is your private token?
120
+ --- This question is required ---
121
+ Please type your private token:
106
122
  ****************
107
-
108
123
  => "MY-PRIVATE-TOKEN"
124
+
125
+ > HighlineWrapper.new.ask('Please type your private token:', {secret: true})
126
+ Please type your private token:
127
+
128
+ --- Default selected: HIDDEN ---
129
+ => ""
109
130
  ```
110
131
 
111
132
  </details>
@@ -113,61 +134,70 @@ What is your private token?
113
134
  ### Yes/No questions
114
135
 
115
136
  Question configuration options:
137
+ * `indicate_default_message`: defaults to `true`
116
138
  * `default`: defaults to `true` (aka 'yes')
117
139
  * `required`: defaults to `false`
118
140
 
141
+ Notes:
142
+ * If `indicate_default_message` is `true`, then the wrapper will tell us what the default value returned is _if_ the user skips the question
143
+ * If `required` is `true`, the question will repeat until the user answers the question
144
+ * If `required` is `true`, then the `default` value will be ignored (defaults to `true`, but could be set to whatever and the code won't care... the question is required)
145
+ * If `default` is `true` and `required` is `false`, and the user skips the question, the answer will be `true`
146
+
119
147
  <details><summary>Examples</summary>
120
148
 
121
149
  ```ruby
122
150
  > HighlineWrapper.new.ask_yes_no('Do you like Ruby?')
123
151
  Do you like Ruby?
124
- no
152
+ --- Default selected: YES ---
153
+ => true
125
154
 
126
- => false
155
+ > HighlineWrapper.new.ask_yes_no('Do you like Ruby?', {indicate_default_message: false})
156
+ Do you like Ruby?
157
+ => true
127
158
 
128
159
  > HighlineWrapper.new.ask_yes_no('Do you like Ruby?')
129
160
  Do you like Ruby?
130
- yes
131
-
132
- => true
161
+ no
162
+ => false
133
163
 
134
164
  > HighlineWrapper.new.ask_yes_no('Do you like Ruby?', {default: false})
135
165
  Do you like Ruby?
136
-
166
+ --- Default selected: NO ---
137
167
  => false
138
168
 
139
169
  > HighlineWrapper.new.ask_yes_no('Do you like Ruby?', {required: true})
140
170
  Do you like Ruby?
141
-
142
- This question is required.
143
-
171
+ --- This question is required ---
144
172
  Do you like Ruby?
145
- No
146
-
173
+ --- This question is required ---
174
+ Do you like Ruby?
175
+ --- This question is required ---
176
+ Do you like Ruby?
177
+ no
147
178
  => false
148
179
 
149
180
  > HighlineWrapper.new.ask_yes_no('Do you like Ruby?')
150
181
  Do you like Ruby?
151
182
  uh-huh
152
-
153
- This question is required.
154
-
183
+ --- This question is required ---
155
184
  Do you like Ruby?
156
- YES
157
-
185
+ yep
158
186
  => true
159
187
  ```
160
188
 
161
189
  </details>
162
190
 
163
- ### Multiple choice question
191
+ ### Multiple choice questions
164
192
 
165
193
  Question configuration options:
194
+ * `indicate_default_message`: defaults to `true`
166
195
  * `with_index`: defaults to `false` (particularly handy when there may be duplicate-named but different items in the list—think Sally with ID 45 and Sally with ID 72)
167
196
  * `default`: defaults to `nil`
168
197
  * `required`: defaults to `false`
169
198
 
170
199
  Notes:
200
+ * If `indicate_default_message` is `true`, then the wrapper will tell us what the default value returned is _if_ the user skips the question
171
201
  * If `required` is `true`, the question will repeat until the user answers the question
172
202
  * If `required` is `true`, then the `default` value will be ignored (defaults to `nil`, but could be set to whatever and the code won't care... the question is required)
173
203
  * If `default` is `nil` and `required` is `false`, and the user skips the question, the answer will be `nil`
@@ -185,7 +215,6 @@ What is your favorite number of these?
185
215
  2. two
186
216
  3. three
187
217
  2
188
-
189
218
  => {:value=>"two"}
190
219
 
191
220
  > HighlineWrapper.new.ask_multiple_choice('What is your favorite number of these?', ['one', 'two', 'three'], {with_index: true})
@@ -194,15 +223,39 @@ What is your favorite number of these?
194
223
  2. two
195
224
  3. three
196
225
  2
197
-
198
226
  => {:value=>"two", :index=>1}
199
227
 
228
+ > HighlineWrapper.new.ask_multiple_choice('What is your favorite number of these?', ['one', 'two', 'three'], {default: 'three', required: true, indicate_default_message: false})
229
+ What is your favorite number of these?
230
+ 1. one
231
+ 2. two
232
+ 3. three
233
+ --- This question is required ---
234
+ What is your favorite number of these?
235
+ 1. one
236
+ 2. two
237
+ 3. three
238
+ --- This question is required ---
239
+ What is your favorite number of these?
240
+ 1. one
241
+ 2. two
242
+ 3. three
243
+ 2
244
+ => {:value=>"two"}
245
+
200
246
  > HighlineWrapper.new.ask_multiple_choice('What is your favorite number of these?', ['one', 'two', 'three'], {with_index: true, default: 'one'})
201
247
  What is your favorite number of these?
202
248
  1. one
203
249
  2. two
204
250
  3. three
251
+ --- Default selected: 1. one ---
252
+ => {:value=>"one", :index=>0}
205
253
 
254
+ > HighlineWrapper.new.ask_multiple_choice('What is your favorite number of these?', ['one', 'two', 'three'], {with_index: true, default: 'one', indicate_default_message: false})
255
+ What is your favorite number of these?
256
+ 1. one
257
+ 2. two
258
+ 3. three
206
259
  => {:value=>"one", :index=>0}
207
260
 
208
261
  > HighlineWrapper.new.ask_multiple_choice('What is your favorite number of these?', ['one', 'two', 'three'], {default: 'three', required: true})
@@ -210,51 +263,55 @@ What is your favorite number of these?
210
263
  1. one
211
264
  2. two
212
265
  3. three
213
-
214
- This question is required.
215
-
266
+ --- This question is required ---
216
267
  What is your favorite number of these?
217
268
  1. one
218
269
  2. two
219
270
  3. three
220
-
221
- This question is required.
222
-
271
+ --- This question is required ---
223
272
  What is your favorite number of these?
224
273
  1. one
225
274
  2. two
226
275
  3. three
227
- 2
228
-
229
- => {:value=>"two"}
276
+ 1
277
+ => {:value=>"one"}
230
278
 
231
279
  > HighlineWrapper.new.ask_multiple_choice('What is your favorite number of these?', ['one', 'two', 'three'], {default: nil})
232
280
  What is your favorite number of these?
233
281
  1. one
234
282
  2. two
235
283
  3. three
236
-
284
+ --- Default selected: EMPTY ---
237
285
  => nil
238
286
 
239
- > HighlineWrapper.new.ask_multiple_choice('What is your favorite number of these?', ['one', 'two', 'three'], {default: nil, with_index: true})
287
+ > HighlineWrapper.new.ask_multiple_choice('What is your favorite number of these?', ['one', 'two', 'three'], {default: nil, with_index: true})
240
288
  What is your favorite number of these?
241
289
  1. one
242
290
  2. two
243
291
  3. three
292
+ --- Default selected: EMPTY ---
293
+ => nil
244
294
 
295
+ > HighlineWrapper.new.ask_multiple_choice('What is your favorite number of these?', ['one', 'two', 'three'], {default: nil, with_index: true, indicate_default_message: false})
296
+ What is your favorite number of these?
297
+ 1. one
298
+ 2. two
299
+ 3. three
245
300
  => nil
246
301
  ```
247
302
 
248
303
  </details>
249
304
 
250
- ### Multiple choice "checkbox" question
305
+ ### Multiple choice "checkbox" questions
251
306
 
252
307
  Question configuration options:
308
+ * `indicate_default_message`: defaults to `true`
253
309
  * `with_indexes`: defaults to `false` (particularly handy when there may be duplicate-named but different items in the list—think Sally with ID 45 and Sally with ID 72)
254
310
  * `defaults`: defaults to `[]`
255
311
  * `required`: defaults to `false`
256
312
 
257
313
  Notes:
314
+ * If `indicate_default_message` is `true`, then the wrapper will tell us what the default value returned is _if_ the user skips the question
258
315
  * If `required` is `true`, the question will repeat until the user answers the question
259
316
  * If `required` is `true`, then the `defaults` value will be ignored (this value is defaulting to `[]`, but could be set to whatever and the code won't care... the question is required)
260
317
  * If `defaults` is `[]` and `required` is `false`, then the method will return an empty array
@@ -272,7 +329,6 @@ What are your favorite numbers of these?
272
329
  2. two
273
330
  3. three
274
331
  1, 3
275
-
276
332
  => [{:value=>"one"}, {:value=>"three"}]
277
333
 
278
334
  > HighlineWrapper.new.ask_checkbox("What are your favorite numbers of these?", ['one', 'two','three'], {with_indexes: true})
@@ -281,15 +337,29 @@ What are your favorite numbers of these?
281
337
  2. two
282
338
  3. three
283
339
  1, 3
284
-
285
340
  => [{:value=>"one", :index=>0}, {:value=>"three", :index=>2}]
286
341
 
287
- > HighlineWrapper.new.ask_checkbox("What are your favorite numbers of these?", ['one', 'two','three'], {defaults: ['two', 'three']})
342
+ > HighlineWrapper.new.ask_checkbox("What are your favorite numbers of these?", ['one', 'two','three'], {with_indexes: true, indicate_default_message: false})
343
+ What are your favorite numbers of these?
344
+ 1. one
345
+ 2. two
346
+ 3. three
347
+ => []
348
+
349
+ > HighlineWrapper.new.ask_checkbox("What are your favorite numbers of these?", ['one', 'two','three'], {with_indexes: true})
288
350
  What are your favorite numbers of these?
289
351
  1. one
290
352
  2. two
291
353
  3. three
354
+ --- Defaults selected: EMPTY ---
355
+ => []
292
356
 
357
+ > HighlineWrapper.new.ask_checkbox("What are your favorite numbers of these?", ['one', 'two','three'], {defaults: ['two', 'three']})
358
+ What are your favorite numbers of these?
359
+ 1. one
360
+ 2. two
361
+ 3. three
362
+ --- Defaults selected: 2. two, 3. three ---
293
363
  => [{:value=>"two"}, {:value=>"three"}]
294
364
 
295
365
  > HighlineWrapper.new.ask_checkbox("What are your favorite numbers of these?", ['one', 'two','three'], {required: true, with_indexes: true})
@@ -297,15 +367,17 @@ What are your favorite numbers of these?
297
367
  1. one
298
368
  2. two
299
369
  3. three
300
-
301
- This question is required.
302
-
370
+ --- This question is required ---
371
+ What are your favorite numbers of these?
372
+ 1. one
373
+ 2. two
374
+ 3. three
375
+ --- This question is required ---
303
376
  What are your favorite numbers of these?
304
377
  1. one
305
378
  2. two
306
379
  3. three
307
380
  2
308
-
309
381
  => [{:value=>"two", :index=>1}]
310
382
 
311
383
  > HighlineWrapper.new.ask_checkbox("What are your favorite numbers of these?", ['one', 'two','three'], {required: true, with_indexes: false})
@@ -313,39 +385,27 @@ What are your favorite numbers of these?
313
385
  1. one
314
386
  2. two
315
387
  3. three
316
-
317
- This question is required.
318
-
388
+ --- This question is required ---
319
389
  What are your favorite numbers of these?
320
390
  1. one
321
391
  2. two
322
392
  3. three
323
393
  1
324
-
325
394
  => [{:value=>"one"}]
326
395
 
327
- > HighlineWrapper.new.ask_checkbox("What are your favorite numbers of these?", ['one', 'two','three'], {defaults: []})
396
+ > HighlineWrapper.new.ask_checkbox("What are your favorite numbers of these?", ['one', 'two','three'], {defaults: ['two', 'three'], with_indexes: true, indicate_default_message: false})
328
397
  What are your favorite numbers of these?
329
398
  1. one
330
399
  2. two
331
400
  3. three
332
-
333
- => []
334
-
335
- > HighlineWrapper.new.ask_checkbox("What are your favorite numbers of these?", ['one', 'two','three'], {defaults: [], with_indexes: true})
336
- What are your favorite numbers of these?
337
- 1. one
338
- 2. two
339
- 3. three
340
-
341
- => []
401
+ => [{:value=>"two", :index=>1}, {:value=>"three", :index=>2}]
342
402
  ```
343
403
 
344
404
  </details>
345
405
 
346
406
  ## Tests
347
407
 
348
- To run the tests, run `bundle exec rspec` from the command line. GitHub Actions will also run the tests upon every commit to make sure they're up to date and that everything is working correctly. Locally, you can also run `bundle exec guard` to automatically run tests as you develop!
408
+ To run the tests, run `bundle exec rspec` from the command-line. GitHub Actions will also run the tests upon every commit to make sure they're up to date and that everything is working correctly. Locally, you can also run `bundle exec guard` to automatically run tests as you develop!
349
409
 
350
410
  ## Contributing
351
411
 
@@ -13,15 +13,14 @@ class HighlineWrapper
13
13
  #
14
14
  # prompt: the prompt for the question (string)
15
15
  # options: various options to pass to the questions (hash)
16
+ # indicate_default_message: whether to tell the terminal what the default value selected is if the question
17
+ # is skipped (boolean - defaults to true)
16
18
  # secret: whether the terminal should hide the typed value (boolean - defaults to false)
17
19
  # default: the default selection (string - defaults to '')
18
20
  # required: whether the question is required or not (boolean - defaults to false)
19
- #
20
- # Notes:
21
- # If required == true, the question will repeat until the user answers the question
22
- # If required == true, then the default value will be ignored
23
21
  def ask(prompt, options = {})
24
22
  defaults = {
23
+ indicate_default_message: true,
25
24
  secret: false,
26
25
  default: '',
27
26
  required: false
@@ -34,14 +33,13 @@ class HighlineWrapper
34
33
  #
35
34
  # prompt: the prompt for the question (string)
36
35
  # options: various options to pass to the questions (hash)
36
+ # indicate_default_message: whether to tell the terminal what the default value selected is if the question
37
+ # is skipped (boolean - defaults to true)
37
38
  # default: the default selection (boolean - defaults to true)
38
39
  # required: whether the question is required or not (boolean - defaults to false)
39
- #
40
- # Notes:
41
- # If required == true, the question will repeat until the user answers the question
42
- # If required == true, then the default value will be ignored
43
40
  def ask_yes_no(prompt, options = {})
44
41
  defaults = {
42
+ indicate_default_message: true,
45
43
  default: true,
46
44
  required: false
47
45
  }
@@ -56,16 +54,14 @@ class HighlineWrapper
56
54
  # prompt: the prompt for the question (string)
57
55
  # choices: a list of string options (array) (e.g. [ 'a', 'b', 'c' ])
58
56
  # options: various options to pass to the questions (hash)
57
+ # indicate_default_message: whether to tell the terminal what the default value selected is if the question
58
+ # is skipped (boolean - defaults to true)
59
59
  # with_index: whether to return the index of the selection (boolean - defaults to false)
60
60
  # default: the default selection if the user skips the question (string - defaults to nil)
61
61
  # required: whether the question is required or not (boolean - defaults to false)
62
- #
63
- # Notes:
64
- # If required == true, the question will repeat until the user answers the question
65
- # If required == true, then the default value will be ignored
66
- # If default == nil and required == false, and the user skips the question, the answer will be nil
67
62
  def ask_multiple_choice(prompt, choices, options = {})
68
63
  defaults = {
64
+ indicate_default_message: true,
69
65
  with_index: false,
70
66
  default: nil,
71
67
  required: false
@@ -81,16 +77,14 @@ class HighlineWrapper
81
77
  # prompt: the prompt for the question (string)
82
78
  # choices: a list of string options (array) (e.g. [ 'a', 'b', 'c' ])
83
79
  # options: various options to pass to the questions (hash)
80
+ # indicate_default_message: whether to tell the terminal what the default value selected is if the question
81
+ # is skipped (boolean - defaults to true)
84
82
  # with_indexes: whether to return the indexes of the selections (boolean - defaults to false)
85
83
  # defaults: the default selections if the user skips the question (array - defaults to [])
86
84
  # required: whether the question is required or not (boolean - defaults to false)
87
- #
88
- # Notes:
89
- # If required == true, the question will repeat until the user answers the question
90
- # If required == true, then the defaults value will be ignored
91
- # If defaults == [] and required == false, then the method will return an empty array
92
85
  def ask_checkbox(prompt, choices, options = {})
93
86
  defaults = {
87
+ indicate_default_message: true,
94
88
  with_indexes: false,
95
89
  defaults: [],
96
90
  required: false
@@ -7,13 +7,12 @@ class HighlineWrapper
7
7
  class << self
8
8
  def ask(prompt, choices, options)
9
9
  indices = ask_highline(format_options(prompt, choices))
10
- puts
11
10
 
12
11
  return format_multiple_selections(choices, indices, options[:with_indexes]) unless indices.empty?
13
12
  return recurse(prompt, choices, options) if options[:required]
14
- return options[:defaults] if options[:defaults].empty?
13
+ return return_empty_defaults(options) if options[:defaults].empty?
15
14
 
16
- format_multiple_selections(choices, options[:defaults].map { |d| choices.index(d) }, options[:with_indexes])
15
+ return_defaults(choices, options)
17
16
  end
18
17
 
19
18
  private def ask_highline(prompt)
@@ -22,6 +21,17 @@ class HighlineWrapper
22
21
  indices
23
22
  end
24
23
 
24
+ private def return_defaults(choices, options)
25
+ options[:default_indexes] = options[:defaults].map { |d| choices.index(d) }
26
+ print_default_message(options, choices) if options[:indicate_default_message]
27
+ format_multiple_selections(choices, options[:default_indexes], options[:with_indexes])
28
+ end
29
+
30
+ private def print_default_message(options, choices)
31
+ defaults = options[:default_indexes].map { |i| "#{i + 1}. #{choices[i]}".strip }.join(', ')
32
+ puts "--- Defaults selected: #{defaults} ---"
33
+ end
34
+
25
35
  private def format_multiple_selections(choices, indices, with_indexes)
26
36
  selected = []
27
37
  indices.each { |index| selected << format_selection(choices, index, with_indexes) }
@@ -7,13 +7,22 @@ class HighlineWrapper
7
7
  class << self
8
8
  def ask(prompt, choices, options)
9
9
  index = ask_highline(format_options(prompt, choices)).to_i - 1
10
- puts
11
10
 
12
11
  return format_selection(choices, index, options[:with_index]) unless index == -1
13
12
  return recurse(prompt, choices, options) if options[:required]
14
- return nil if options[:default].nil?
13
+ return return_empty_defaults(options) if options[:default].nil?
15
14
 
16
- format_selection(choices, choices.index(options[:default]), options[:with_index])
15
+ return_defaults(choices, options)
16
+ end
17
+
18
+ private def return_defaults(choices, options)
19
+ options[:default_index] = choices.index(options[:default])
20
+ print_default_message(options) if options[:indicate_default_message]
21
+ format_selection(choices, options[:default_index], options[:with_index])
22
+ end
23
+
24
+ private def print_default_message(options)
25
+ puts "--- Default selected: #{options[:default_index] + 1}. #{options[:default]} ---"
17
26
  end
18
27
  end
19
28
  end
@@ -7,13 +7,21 @@ class HighlineWrapper
7
7
  class << self
8
8
  def ask(prompt, options)
9
9
  answer = ask_highline(prompt, secret: options[:secret]).to_s
10
- puts unless answer.empty? && options[:secret]
11
10
 
12
11
  return answer unless answer.empty?
13
12
  return recurse(prompt, nil, options) if options[:required]
14
13
 
14
+ print_default_message(options) if options[:indicate_default_message]
15
15
  options[:default]
16
16
  end
17
+
18
+ private def print_default_message(options)
19
+ if !options[:secret]
20
+ puts "--- Default selected: #{options[:default].empty? ? 'EMPTY' : options[:default]} ---"
21
+ elsif options[:secret]
22
+ puts '--- Default selected: HIDDEN ---'
23
+ end
24
+ end
17
25
  end
18
26
  end
19
27
  end
@@ -23,10 +23,15 @@ class HighlineWrapper
23
23
  end
24
24
 
25
25
  def recurse(prompt, choices, options)
26
- puts "This question is required.\n\n"
26
+ puts '--- This question is required ---'
27
27
  choices.nil? ? ask(prompt, options) : ask(prompt, choices, options)
28
28
  end
29
29
 
30
+ def return_empty_defaults(options)
31
+ puts '--- Default selected: EMPTY ---' if options[:indicate_default_message]
32
+ options[:defaults] || options[:default]
33
+ end
34
+
30
35
  private def highline
31
36
  @highline ||= HighLine.new
32
37
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class HighlineWrapper
4
- VERSION = '1.0.0'
4
+ VERSION = '1.1.0'
5
5
  end
@@ -7,20 +7,24 @@ class HighlineWrapper
7
7
  class << self
8
8
  def ask(prompt, options)
9
9
  answer = ask_highline(prompt).to_s.downcase
10
- puts
11
10
 
12
11
  return parse(answer, prompt, options) unless answer.empty?
13
12
  return recurse(prompt, nil, options) if options[:required]
14
13
 
14
+ print_default_message(options) if options[:indicate_default_message]
15
15
  options[:default]
16
16
  end
17
17
 
18
- def parse(answer, prompt, options)
18
+ private def parse(answer, prompt, options)
19
19
  return true if answer.include?('y')
20
20
  return false if answer.include?('n')
21
21
 
22
22
  recurse(prompt, nil, options)
23
23
  end
24
+
25
+ private def print_default_message(options)
26
+ puts "--- Default selected: #{options[:default] ? 'YES' : 'NO'} ---"
27
+ end
24
28
  end
25
29
  end
26
30
  end
@@ -44,6 +44,12 @@ describe HighlineWrapper::CheckboxQuestion do
44
44
  resp = subject.ask(Faker::Lorem.sentence, choices, options)
45
45
  expect(resp).to eq([])
46
46
  end
47
+
48
+ it 'should call the return empty defaults if the user skips' do
49
+ allow(highline).to receive(:ask).and_return('')
50
+ expect(subject).to receive(:return_empty_defaults)
51
+ subject.ask(Faker::Lorem.sentence, choices, options)
52
+ end
47
53
  end
48
54
 
49
55
  context 'with required set to true' do
@@ -97,6 +103,7 @@ describe HighlineWrapper::CheckboxQuestion do
97
103
  context 'with defaults set' do
98
104
  let(:options) do
99
105
  {
106
+ indicate_default_message: true,
100
107
  with_indexes: false,
101
108
  defaults: ['two'],
102
109
  required: false
@@ -114,6 +121,31 @@ describe HighlineWrapper::CheckboxQuestion do
114
121
  resp = subject.ask(Faker::Lorem.sentence, choices, options)
115
122
  expect(resp).to eq([{ value: 'two' }])
116
123
  end
124
+
125
+ it 'should call to return the defaults if the user skips' do
126
+ allow(highline).to receive(:ask).and_return('')
127
+ expect(subject).to receive(:return_defaults).and_call_original
128
+ expect(subject).to receive(:puts)
129
+ subject.ask(Faker::Lorem.sentence, choices, options)
130
+ end
131
+
132
+ context 'when the indicate_default_message is false' do
133
+ let(:options) do
134
+ {
135
+ indicate_default_message: false,
136
+ with_indexes: false,
137
+ defaults: ['two'],
138
+ required: false
139
+ }
140
+ end
141
+
142
+ it 'should call to return the defaults if the user skips' do
143
+ allow(highline).to receive(:ask).and_return('')
144
+ expect(subject).to receive(:return_defaults)
145
+ expect(subject).not_to receive(:puts)
146
+ subject.ask(Faker::Lorem.sentence, choices, options)
147
+ end
148
+ end
117
149
  end
118
150
 
119
151
  context 'with defaults set to []' do
@@ -182,6 +214,12 @@ describe HighlineWrapper::CheckboxQuestion do
182
214
  resp = subject.ask(Faker::Lorem.sentence, choices, options)
183
215
  expect(resp).to eq([])
184
216
  end
217
+
218
+ it 'should call the return empty defaults message' do
219
+ allow(highline).to receive(:ask).and_return('')
220
+ expect(subject).to receive(:return_empty_defaults)
221
+ subject.ask(Faker::Lorem.sentence, choices, options)
222
+ end
185
223
  end
186
224
  end
187
225
  end
@@ -44,6 +44,12 @@ describe HighlineWrapper::MultipleChoiceQuestion do
44
44
  resp = subject.ask(Faker::Lorem.sentence, choices, options)
45
45
  expect(resp).to eq(nil)
46
46
  end
47
+
48
+ it 'should call the return empty defaults if the user skips' do
49
+ allow(highline).to receive(:ask).and_return('')
50
+ expect(subject).to receive(:return_empty_defaults)
51
+ subject.ask(Faker::Lorem.sentence, choices, options)
52
+ end
47
53
  end
48
54
 
49
55
  context 'with required set to true' do
@@ -97,6 +103,7 @@ describe HighlineWrapper::MultipleChoiceQuestion do
97
103
  context 'with default set' do
98
104
  let(:options) do
99
105
  {
106
+ indicate_default_message: true,
100
107
  with_index: false,
101
108
  default: 'two',
102
109
  required: false
@@ -114,6 +121,31 @@ describe HighlineWrapper::MultipleChoiceQuestion do
114
121
  resp = subject.ask(Faker::Lorem.sentence, choices, options)
115
122
  expect(resp).to eq({ value: 'two' })
116
123
  end
124
+
125
+ it 'should call to return the defaults if the user skips' do
126
+ allow(highline).to receive(:ask).and_return(0)
127
+ expect(subject).to receive(:return_defaults).and_call_original
128
+ expect(subject).to receive(:puts)
129
+ subject.ask(Faker::Lorem.sentence, choices, options)
130
+ end
131
+
132
+ context 'when the indicate_default_message is false' do
133
+ let(:options) do
134
+ {
135
+ indicate_default_message: false,
136
+ with_indexes: false,
137
+ default: 'two',
138
+ required: false
139
+ }
140
+ end
141
+
142
+ it 'should call to return the defaults if the user skips' do
143
+ allow(highline).to receive(:ask).and_return(0)
144
+ expect(subject).to receive(:return_defaults)
145
+ expect(subject).not_to receive(:puts)
146
+ subject.ask(Faker::Lorem.sentence, choices, options)
147
+ end
148
+ end
117
149
  end
118
150
 
119
151
  context 'with default nil' do
@@ -182,6 +214,12 @@ describe HighlineWrapper::MultipleChoiceQuestion do
182
214
  resp = subject.ask(Faker::Lorem.sentence, choices, options)
183
215
  expect(resp).to eq(nil)
184
216
  end
217
+
218
+ it 'should call the return empty defaults message' do
219
+ allow(highline).to receive(:ask).and_return(0)
220
+ expect(subject).to receive(:return_empty_defaults)
221
+ subject.ask(Faker::Lorem.sentence, choices, options)
222
+ end
185
223
  end
186
224
  end
187
225
  end
@@ -21,6 +21,7 @@ describe HighlineWrapper::OpenEndedQuestion do
21
21
  context 'with the options as defaults' do
22
22
  let(:options) do
23
23
  {
24
+ indicate_default_message: true,
24
25
  secret: false,
25
26
  default: '',
26
27
  required: false
@@ -44,6 +45,12 @@ describe HighlineWrapper::OpenEndedQuestion do
44
45
  resp = subject.ask(Faker::Lorem.sentence, options)
45
46
  expect(resp).to eq('')
46
47
  end
48
+
49
+ it 'should call to print the default message' do
50
+ allow(highline).to receive(:ask).and_return('')
51
+ expect(subject).to receive(:print_default_message)
52
+ subject.ask(Faker::Lorem.sentence, options)
53
+ end
47
54
  end
48
55
 
49
56
  context 'with required set to true' do
@@ -73,6 +80,7 @@ describe HighlineWrapper::OpenEndedQuestion do
73
80
  let(:default_string) { Faker::Lorem.sentence }
74
81
  let(:options) do
75
82
  {
83
+ indicate_default_message: false,
76
84
  secret: false,
77
85
  default: default_string,
78
86
  required: false
@@ -90,5 +98,11 @@ describe HighlineWrapper::OpenEndedQuestion do
90
98
  allow(highline).to receive(:ask).and_return('')
91
99
  expect(subject.ask(Faker::Lorem.sentence, options)).to eq(default_string)
92
100
  end
101
+
102
+ it 'should not call to print the default message' do
103
+ allow(highline).to receive(:ask).and_return('')
104
+ expect(subject).not_to receive(:print_default_message)
105
+ subject.ask(Faker::Lorem.sentence, options)
106
+ end
93
107
  end
94
108
  end
@@ -60,4 +60,55 @@ describe HighlineWrapper::Question do
60
60
  end
61
61
  end
62
62
  end
63
+
64
+ describe '#should print out a message indicating EMPTY was selected, and return the defaults' do
65
+ context 'when default message is true' do
66
+ let(:options) do
67
+ {
68
+ defaults: :default,
69
+ indicate_default_message: true
70
+ }
71
+ end
72
+
73
+ it 'should return the default in the options' do
74
+ expect(subject.send(:return_empty_defaults, options)).to eq(:default)
75
+ end
76
+
77
+ it 'should puts a message' do
78
+ expect(subject).to receive(:puts)
79
+ expect(subject.send(:return_empty_defaults, options)).to eq(:default)
80
+ end
81
+ end
82
+
83
+ context 'when default message is false' do
84
+ let(:options) do
85
+ {
86
+ defaults: :default,
87
+ indicate_default_message: false
88
+ }
89
+ end
90
+
91
+ it 'should return the default in the options' do
92
+ expect(subject.send(:return_empty_defaults, options)).to eq(:default)
93
+ end
94
+
95
+ it 'should not puts a message' do
96
+ expect(subject).not_to receive(:puts)
97
+ expect(subject.send(:return_empty_defaults, options)).to eq(:default)
98
+ end
99
+ end
100
+
101
+ context 'when a singular default is present, but not plural' do
102
+ let(:options) do
103
+ {
104
+ default: :default,
105
+ indicate_default_message: false
106
+ }
107
+ end
108
+
109
+ it 'should return the default in the options' do
110
+ expect(subject.send(:return_empty_defaults, options)).to eq(:default)
111
+ end
112
+ end
113
+ end
63
114
  end
@@ -21,6 +21,7 @@ describe HighlineWrapper::YesNoQuestion do
21
21
  context 'with the options as defaults' do
22
22
  let(:options) do
23
23
  {
24
+ indicate_default_message: true,
24
25
  default: true,
25
26
  required: false
26
27
  }
@@ -42,6 +43,12 @@ describe HighlineWrapper::YesNoQuestion do
42
43
  resp = subject.ask(Faker::Lorem.sentence, options)
43
44
  expect(resp).to eq(true)
44
45
  end
46
+
47
+ it 'should call to print the default message' do
48
+ allow(highline).to receive(:ask).and_return('')
49
+ expect(subject).to receive(:print_default_message)
50
+ subject.ask(Faker::Lorem.sentence, options)
51
+ end
45
52
  end
46
53
 
47
54
  context 'with required set to true' do
@@ -68,6 +75,7 @@ describe HighlineWrapper::YesNoQuestion do
68
75
  context 'with required set to false' do
69
76
  let(:options) do
70
77
  {
78
+ indicate_default_message: false,
71
79
  default: false,
72
80
  required: false
73
81
  }
@@ -84,5 +92,11 @@ describe HighlineWrapper::YesNoQuestion do
84
92
  resp = subject.ask(Faker::Lorem.sentence, options)
85
93
  expect(resp).to eq(false)
86
94
  end
95
+
96
+ it 'should not call to print the default message' do
97
+ allow(highline).to receive(:ask).and_return('')
98
+ expect(subject).not_to receive(:print_default_message)
99
+ subject.ask(Faker::Lorem.sentence, options)
100
+ end
87
101
  end
88
102
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: highline_wrapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Emma Sax
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-04 00:00:00.000000000 Z
11
+ date: 2021-03-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: highline