tty-prompt 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +4 -1
- data/CHANGELOG.md +15 -0
- data/Gemfile +2 -2
- data/README.md +185 -25
- data/examples/enum.rb +8 -0
- data/examples/enum_select.rb +7 -0
- data/examples/in.rb +3 -1
- data/examples/slider.rb +6 -0
- data/lib/tty-prompt.rb +8 -2
- data/lib/tty/prompt.rb +63 -13
- data/lib/tty/prompt/converters.rb +12 -6
- data/lib/tty/prompt/enum_list.rb +222 -0
- data/lib/tty/prompt/list.rb +48 -15
- data/lib/tty/prompt/multi_list.rb +11 -11
- data/lib/tty/prompt/question.rb +38 -14
- data/lib/tty/prompt/question/checks.rb +5 -3
- data/lib/tty/prompt/reader.rb +12 -18
- data/lib/tty/prompt/reader/codes.rb +15 -9
- data/lib/tty/prompt/reader/key_event.rb +51 -24
- data/lib/tty/prompt/slider.rb +170 -0
- data/lib/tty/prompt/symbols.rb +7 -1
- data/lib/tty/prompt/utils.rb +31 -3
- data/lib/tty/prompt/version.rb +1 -1
- data/spec/spec_helper.rb +1 -0
- data/spec/unit/converters/convert_bool_spec.rb +1 -1
- data/spec/unit/converters/convert_date_spec.rb +11 -2
- data/spec/unit/converters/convert_file_spec.rb +1 -1
- data/spec/unit/converters/convert_number_spec.rb +19 -2
- data/spec/unit/converters/convert_path_spec.rb +1 -1
- data/spec/unit/converters/convert_range_spec.rb +4 -3
- data/spec/unit/enum_select_spec.rb +93 -0
- data/spec/unit/multi_select_spec.rb +14 -12
- data/spec/unit/question/checks_spec.rb +97 -0
- data/spec/unit/reader/key_event_spec.rb +67 -0
- data/spec/unit/select_spec.rb +15 -16
- data/spec/unit/slider_spec.rb +54 -0
- data/tty-prompt.gemspec +2 -1
- metadata +31 -5
- data/.ruby-version +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b2e80fd1b397f9aae2abb3195844a6d1d3dc2dea
|
4
|
+
data.tar.gz: 266c5ccc26bcbe7ea0a9634e7f702e3387a2bce4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d249d03ac3dd16fc49b784e5d11983f31c15d30991c524fe6dbc1fd135c7509fef3476f1ef3b1ad4c5e1dd9bcf19ec938743771c4f121fcf96977b3913220ab2
|
7
|
+
data.tar.gz: eacb6d537e03baaf4219304af247d0baaf24f0d22efd2e49eec368d5f19a4f5449ec10af4ca9009eba2dc468b91d22580b5df47333c519b759ba010e8505d394
|
data/.travis.yml
CHANGED
@@ -2,13 +2,14 @@
|
|
2
2
|
language: ruby
|
3
3
|
sudo: false
|
4
4
|
cache: bundler
|
5
|
-
bundler_args: --without
|
5
|
+
bundler_args: --without tools
|
6
6
|
script: "bundle exec rake ci"
|
7
7
|
rvm:
|
8
8
|
- 1.9.3
|
9
9
|
- 2.0
|
10
10
|
- 2.1
|
11
11
|
- 2.2
|
12
|
+
- 2.3.0
|
12
13
|
- ruby-head
|
13
14
|
- jruby-19mode
|
14
15
|
- jruby
|
@@ -23,3 +24,5 @@ matrix:
|
|
23
24
|
fast_finish: true
|
24
25
|
branches:
|
25
26
|
only: master
|
27
|
+
notifications:
|
28
|
+
email: false
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,19 @@
|
|
1
1
|
# Change log
|
2
2
|
|
3
|
+
## [v0.4.0] - 2016-02-08
|
4
|
+
|
5
|
+
### Added
|
6
|
+
* Add :enum option for #select & #multi_select to allow for numerical selection by @rtoshiro
|
7
|
+
* Add new key event types to KeyEvent
|
8
|
+
* Add #slider for picking values from range of numbers
|
9
|
+
* Add #enum_select for selecting option from enumerated list
|
10
|
+
* Add ability to configure error messages for #ask call
|
11
|
+
* Add new ConversionError type
|
12
|
+
|
13
|
+
### Changed
|
14
|
+
* Move #blank? to Utils
|
15
|
+
* Update pastel dependency
|
16
|
+
|
3
17
|
## [v0.3.0] - 2015-12-28
|
4
18
|
|
5
19
|
### Added
|
@@ -44,6 +58,7 @@
|
|
44
58
|
|
45
59
|
* Initial implementation and release
|
46
60
|
|
61
|
+
[v0.4.0]: https://github.com/peter-murach/tty-prompt/compare/v0.3.0...v0.4.0
|
47
62
|
[v0.3.0]: https://github.com/peter-murach/tty-prompt/compare/v0.2.0...v0.3.0
|
48
63
|
[v0.2.0]: https://github.com/peter-murach/tty-prompt/compare/v0.1.0...v0.2.0
|
49
64
|
[v0.1.0]: https://github.com/peter-murach/tty-prompt/compare/v0.1.0
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -18,7 +18,8 @@
|
|
18
18
|
## Features
|
19
19
|
|
20
20
|
* Number of prompt types for gathering user input
|
21
|
-
* A robust API for
|
21
|
+
* A robust API for validating complex inputs
|
22
|
+
* User friendly error feedback
|
22
23
|
|
23
24
|
## Installation
|
24
25
|
|
@@ -49,17 +50,20 @@ Or install it yourself as:
|
|
49
50
|
* [2.2.5 modify](#225-modify)
|
50
51
|
* [2.2.6 required](#226-required)
|
51
52
|
* [2.2.7 validate](#227-validate)
|
53
|
+
* [2.2.8 messages](#228-messages)
|
52
54
|
* [2.3 keypress](#23-keypress)
|
53
55
|
* [2.4 multiline](#24-multiline)
|
54
56
|
* [2.5 mask](#25-mask)
|
55
57
|
* [2.6 yes?/no?](#26-yesno)
|
56
58
|
* [2.7 select](#27-select)
|
57
59
|
* [2.8 multi_select](#28-multi_select)
|
58
|
-
* [2.9
|
59
|
-
* [2.10
|
60
|
-
* [2.11
|
61
|
-
* [2.12
|
62
|
-
* [2.13
|
60
|
+
* [2.9 enum_select](#29-enum_select)
|
61
|
+
* [2.10 suggest](#210-suggest)
|
62
|
+
* [2.11 slider](#211-slider)
|
63
|
+
* [2.12 say](#212-say)
|
64
|
+
* [2.13 ok](#213-ok)
|
65
|
+
* [2.14 warn](#214-warn)
|
66
|
+
* [2.15 error](#215-warn)
|
63
67
|
|
64
68
|
## 1. Usage
|
65
69
|
|
@@ -105,7 +109,7 @@ Also, asking multiple choice questions is a breeze with `multi_select`:
|
|
105
109
|
|
106
110
|
```ruby
|
107
111
|
choices = %w(vodka beer wine whisky bourbon)
|
108
|
-
prompt.
|
112
|
+
prompt.multi_select("Select drinks?", choices)
|
109
113
|
# =>
|
110
114
|
#
|
111
115
|
# Select drinks? (Use arrow keys, press Space to select and Enter to finish)"
|
@@ -116,6 +120,20 @@ prompt.select("Select drinks?", choices)
|
|
116
120
|
# ⬡ bourbon
|
117
121
|
```
|
118
122
|
|
123
|
+
To ask for a selection from enumerated list you can use `enum_select`:
|
124
|
+
|
125
|
+
```ruby
|
126
|
+
choices = %w(emacs nano vim)
|
127
|
+
prompt.enum_select("Select an editor?")
|
128
|
+
# =>
|
129
|
+
#
|
130
|
+
# Select an editor?
|
131
|
+
# 1) /bin/nano
|
132
|
+
# 2) /usr/bin/vim.basic
|
133
|
+
# 3) /usr/bin/vim.tiny
|
134
|
+
# Choose 1-3 [2]:
|
135
|
+
```
|
136
|
+
|
119
137
|
## 2. Interface
|
120
138
|
|
121
139
|
### 2.1 ask
|
@@ -214,7 +232,7 @@ ask("Provide number in range: 0-9?") { |q| q.in('0-9') }
|
|
214
232
|
|
215
233
|
#### 2.2.5 modify
|
216
234
|
|
217
|
-
Set the `:modify` option if you want to handle whitespace or letter capitalization.
|
235
|
+
Set the `:modify` option if you want to handle whitespace or letter capitalization.
|
218
236
|
|
219
237
|
```ruby
|
220
238
|
prompt.ask('Enter text:') do |q|
|
@@ -224,8 +242,8 @@ end
|
|
224
242
|
|
225
243
|
Available letter casing settings are:
|
226
244
|
```ruby
|
227
|
-
:up # change to
|
228
|
-
:down # change to
|
245
|
+
:up # change to upper case
|
246
|
+
:down # change to small case
|
229
247
|
:capitalize # capitalize each word
|
230
248
|
```
|
231
249
|
|
@@ -244,7 +262,7 @@ To ensure that input is provided use `:required` option:
|
|
244
262
|
```ruby
|
245
263
|
prompt.ask("What's your phone number?", required: true)
|
246
264
|
# What's your phone number?
|
247
|
-
# >>
|
265
|
+
# >> Value must be provided
|
248
266
|
```
|
249
267
|
|
250
268
|
#### 2.2.7 validate
|
@@ -263,25 +281,43 @@ The **TTY::Prompt** comes with bult-in validations for `:email` and you can use
|
|
263
281
|
prompt.ask('What is your email?') { |q| q.validate :email }
|
264
282
|
```
|
265
283
|
|
284
|
+
### 2.2.8 messages
|
285
|
+
|
286
|
+
By default `tty-prompt` comes with predefined error messages for `required`, `in`, `validate` options. You can change these and configure to your liking either by inling them with the option:
|
287
|
+
|
288
|
+
```ruby
|
289
|
+
prompt.ask('What is your email?') do |q|
|
290
|
+
question.validate(/\A\w+@\w+\.\w+\Z/, 'Invalid email address')
|
291
|
+
end
|
292
|
+
```
|
293
|
+
|
294
|
+
or change the `messages` key entry out of `:required?`, `:valid?`, `:range?`:
|
295
|
+
|
296
|
+
```ruby
|
297
|
+
prompt.ask('What is your email?') do |q|
|
298
|
+
question.validate(/\A\w+@\w+\.\w+\Z/)
|
299
|
+
question.messages[:valid?] = 'Invalid email address'
|
300
|
+
end
|
301
|
+
```
|
302
|
+
|
266
303
|
### 2.3 keypress
|
267
304
|
|
268
|
-
In order to ask question with a single character or keypress answer use `
|
305
|
+
In order to ask question with a single character or keypress answer use `keypress`:
|
269
306
|
|
270
307
|
```ruby
|
271
|
-
prompt.
|
308
|
+
prompt.keypress("Which one do you prefer a, b, c or d ?")
|
272
309
|
```
|
273
310
|
|
274
311
|
### 2.4 multiline
|
275
312
|
|
276
|
-
Asking for multiline input can be done with `
|
313
|
+
Asking for multiline input can be done with `multiline` method.
|
277
314
|
|
278
315
|
```ruby
|
279
|
-
prompt.
|
316
|
+
prompt.multiline("Provide description?")
|
280
317
|
```
|
281
318
|
|
282
319
|
The reading of input will terminate when empty line is submitted.
|
283
320
|
|
284
|
-
|
285
321
|
### 2.5 mask
|
286
322
|
|
287
323
|
If you require input of confidential information use `mask` method. By default each character that is printed is replaced by `•` symbol. All configuration options applicable to `ask` method can be used with `mask` as well.
|
@@ -325,7 +361,7 @@ There is also the opposite for asking confirmation of negative option:
|
|
325
361
|
```ruby
|
326
362
|
prompt.no?('Do you hate Ruby?')
|
327
363
|
# =>
|
328
|
-
# Do you
|
364
|
+
# Do you hate Ruby? (y/N)
|
329
365
|
```
|
330
366
|
|
331
367
|
### 2.7 select
|
@@ -341,7 +377,7 @@ prompt.select("Choose your destiny?", %w(Scorpion Kano Jax))
|
|
341
377
|
# Jax
|
342
378
|
```
|
343
379
|
|
344
|
-
You can also provide options through DSL using the `choice` method for single entry and/or `choices`
|
380
|
+
You can also provide options through DSL using the `choice` method for single entry and/or `choices` for more than one choice:
|
345
381
|
|
346
382
|
```ruby
|
347
383
|
prompt.select("Choose your destiny?") do |menu|
|
@@ -395,6 +431,23 @@ end
|
|
395
431
|
# ‣ Jax
|
396
432
|
```
|
397
433
|
|
434
|
+
For ordered choices set `enum` to any delimiter String. In that way, you can use arrows keys and numbers (0-9) to select the item.
|
435
|
+
|
436
|
+
```ruby
|
437
|
+
prompt.select("Choose your destiny?") do |menu|
|
438
|
+
menu.enum '.'
|
439
|
+
|
440
|
+
menu.choice 'Scorpion', 1
|
441
|
+
menu.choice 'Kano', 2
|
442
|
+
menu.choice 'Jax', 3
|
443
|
+
end
|
444
|
+
# =>
|
445
|
+
# Choose your destiny? (Use arrow or number (0-9) keys, press Enter to select)
|
446
|
+
# 1. Scorpion
|
447
|
+
# 2. Kano
|
448
|
+
# ‣ 3. Jax
|
449
|
+
```
|
450
|
+
|
398
451
|
You can configure help message, marker like so
|
399
452
|
|
400
453
|
```ruby
|
@@ -466,6 +519,27 @@ end
|
|
466
519
|
# ‣ ⬢ bourbon
|
467
520
|
```
|
468
521
|
|
522
|
+
Like `select`, for ordered choices set `enum` to any delimiter String. In that way, you can use arrows keys and numbers (0-9) to select the item.
|
523
|
+
|
524
|
+
```ruby
|
525
|
+
prompt.multi_select("Select drinks?") do |menu|
|
526
|
+
menu.enum ')'
|
527
|
+
|
528
|
+
menu.choice :vodka, {score: 10}
|
529
|
+
menu.choice :beer, {score: 20}
|
530
|
+
menu.choice :wine, {score: 30}
|
531
|
+
menu.choice :whisky, {score: 40}
|
532
|
+
menu.choice :bourbon, {score: 50}
|
533
|
+
end
|
534
|
+
# =>
|
535
|
+
# Select drinks? beer, bourbon
|
536
|
+
# ⬡ 1) vodka
|
537
|
+
# ⬢ 2) beer
|
538
|
+
# ⬡ 3) wine
|
539
|
+
# ⬡ 4) whisky
|
540
|
+
# ‣ ⬢ 5) bourbon
|
541
|
+
```
|
542
|
+
|
469
543
|
And when you press enter you will see the following selected:
|
470
544
|
|
471
545
|
```ruby
|
@@ -473,7 +547,66 @@ And when you press enter you will see the following selected:
|
|
473
547
|
# => [{score: 20}, {score: 50}]
|
474
548
|
```
|
475
549
|
|
476
|
-
### 2.9
|
550
|
+
### 2.9 enum_select
|
551
|
+
|
552
|
+
In order to ask for standard selection from indexed list you can use `enum_select` and pass question together with possible choices:
|
553
|
+
|
554
|
+
```ruby
|
555
|
+
choices = %w(emacs nano vim)
|
556
|
+
prompt.enum_select("Select an editor?")
|
557
|
+
# =>
|
558
|
+
#
|
559
|
+
# Select an editor?
|
560
|
+
# 1) nano
|
561
|
+
# 2) vim
|
562
|
+
# 3) emacs
|
563
|
+
# Choose 1-3 [1]:
|
564
|
+
```
|
565
|
+
|
566
|
+
Similar to `select` and `multi_select`, you can provide question options through DSL using `choice` method and/or `choices` like so:
|
567
|
+
|
568
|
+
```ruby
|
569
|
+
choices = %w(nano vim emacs)
|
570
|
+
prompt.enum_select("Select an editor?") do |menu|
|
571
|
+
menu.choice :nano, '/bin/nano'
|
572
|
+
menu.choice :vim, '/usr/bin/vim'
|
573
|
+
menu.choice :emacs, '/usr/bin/emacs'
|
574
|
+
end
|
575
|
+
# =>
|
576
|
+
#
|
577
|
+
# Select an editor?
|
578
|
+
# 1) nano
|
579
|
+
# 2) vim
|
580
|
+
# 3) emacs
|
581
|
+
# Choose 1-3 [1]:
|
582
|
+
#
|
583
|
+
# Select an editor? /bin/nano
|
584
|
+
```
|
585
|
+
|
586
|
+
You can change the indexed numbers by passing `enum` option and the default option by using `default` like so
|
587
|
+
|
588
|
+
```ruby
|
589
|
+
choices = %w(nano vim emacs)
|
590
|
+
prompt.enum_select("Select an editor?") do |menu|
|
591
|
+
menu.default 2
|
592
|
+
menu.enum '.'
|
593
|
+
|
594
|
+
menu.choice :nano, '/bin/nano'
|
595
|
+
menu.choice :vim, '/usr/bin/vim'
|
596
|
+
menu.choice :emacs, '/usr/bin/emacs'
|
597
|
+
end
|
598
|
+
# =>
|
599
|
+
#
|
600
|
+
# Select an editor?
|
601
|
+
# 1. nano
|
602
|
+
# 2. vim
|
603
|
+
# 3. emacs
|
604
|
+
# Choose 1-3 [2]:
|
605
|
+
#
|
606
|
+
# Select an editor? /usr/bin/vim
|
607
|
+
```
|
608
|
+
|
609
|
+
### 2.10 suggest
|
477
610
|
|
478
611
|
To suggest possible matches for the user input use `suggest` method like so:
|
479
612
|
|
@@ -485,7 +618,7 @@ prompt.suggest('sta', ['stage', 'stash', 'commit', 'branch'])
|
|
485
618
|
# stash
|
486
619
|
```
|
487
620
|
|
488
|
-
To
|
621
|
+
To customize query text presented pass `:single_text` and `:plural_text` options to respectively change the message when one match is found or many.
|
489
622
|
|
490
623
|
```ruby
|
491
624
|
possible = %w(status stage stash commit branch blame)
|
@@ -495,7 +628,34 @@ prompt.suggest('b', possible, indent: 4, single_text: 'Perhaps you meant?')
|
|
495
628
|
# blame
|
496
629
|
```
|
497
630
|
|
498
|
-
### 2.
|
631
|
+
### 2.11 slider
|
632
|
+
|
633
|
+
If you have constrained range of numbers for user to choose from you may consider using `slider`. The slider provides easy visual way of picking a value marked by `O` marker.
|
634
|
+
|
635
|
+
```ruby
|
636
|
+
prompt.slider('What size?', min: 32, max: 54, step: 2)
|
637
|
+
# =>
|
638
|
+
#
|
639
|
+
# What size? (User arrow keys, press Enter to select)
|
640
|
+
# |------O-----| 44
|
641
|
+
```
|
642
|
+
|
643
|
+
Slider can be configured through DSL as well:
|
644
|
+
|
645
|
+
```ruby
|
646
|
+
prompt.slider('What size?') do |range|
|
647
|
+
range.default 4
|
648
|
+
range.min 0
|
649
|
+
range.max 20
|
650
|
+
range.step 2
|
651
|
+
end
|
652
|
+
# =>
|
653
|
+
#
|
654
|
+
# What size? (User arrow keys, press Enter to select)
|
655
|
+
# |--O-------| 4
|
656
|
+
```
|
657
|
+
|
658
|
+
### 2.12 say
|
499
659
|
|
500
660
|
To simply print message out to stdout use `say` like so:
|
501
661
|
|
@@ -507,7 +667,7 @@ The `say` method also accepts option `:color` which supports all the colors prov
|
|
507
667
|
|
508
668
|
**TTY::Prompt** provides more specific versions of `say` method to better express intenation behind the message such as `ok`, `warn` and `error`.
|
509
669
|
|
510
|
-
### 2.
|
670
|
+
### 2.13 ok
|
511
671
|
|
512
672
|
Print message(s) in green do:
|
513
673
|
|
@@ -515,7 +675,7 @@ Print message(s) in green do:
|
|
515
675
|
prompt.ok(...)
|
516
676
|
```
|
517
677
|
|
518
|
-
### 2.
|
678
|
+
### 2.14 warn
|
519
679
|
|
520
680
|
Print message(s) in yellow do:
|
521
681
|
|
@@ -523,7 +683,7 @@ Print message(s) in yellow do:
|
|
523
683
|
prompt.warn(...)
|
524
684
|
```
|
525
685
|
|
526
|
-
### 2.
|
686
|
+
### 2.15 error
|
527
687
|
|
528
688
|
Print message(s) in red do:
|
529
689
|
|
@@ -541,4 +701,4 @@ prompt.error(...)
|
|
541
701
|
|
542
702
|
## Copyright
|
543
703
|
|
544
|
-
Copyright (c) 2015 Piotr Murach. See LICENSE for further details.
|
704
|
+
Copyright (c) 2015-2016 Piotr Murach. See LICENSE for further details.
|
data/examples/enum.rb
ADDED