tty-prompt 0.11.0 → 0.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +25 -0
- data/README.md +66 -7
- data/examples/key_events.rb +11 -0
- data/examples/keypress.rb +3 -5
- data/examples/multiline.rb +9 -0
- data/examples/pause.rb +7 -0
- data/lib/tty/prompt.rb +82 -44
- data/lib/tty/prompt/confirm_question.rb +20 -36
- data/lib/tty/prompt/enum_list.rb +32 -23
- data/lib/tty/prompt/expander.rb +35 -31
- data/lib/tty/prompt/keypress.rb +91 -0
- data/lib/tty/prompt/list.rb +38 -23
- data/lib/tty/prompt/mask_question.rb +4 -7
- data/lib/tty/prompt/multi_list.rb +3 -1
- data/lib/tty/prompt/multiline.rb +71 -0
- data/lib/tty/prompt/question.rb +33 -35
- data/lib/tty/prompt/reader.rb +154 -38
- data/lib/tty/prompt/reader/codes.rb +4 -4
- data/lib/tty/prompt/reader/console.rb +1 -1
- data/lib/tty/prompt/reader/history.rb +145 -0
- data/lib/tty/prompt/reader/key_event.rb +4 -0
- data/lib/tty/prompt/reader/line.rb +162 -0
- data/lib/tty/prompt/reader/mode.rb +2 -2
- data/lib/tty/prompt/reader/win_console.rb +5 -1
- data/lib/tty/prompt/slider.rb +18 -12
- data/lib/tty/prompt/timeout.rb +48 -0
- data/lib/tty/prompt/version.rb +1 -1
- data/spec/unit/ask_spec.rb +15 -0
- data/spec/unit/converters/convert_bool_spec.rb +1 -0
- data/spec/unit/keypress_spec.rb +35 -6
- data/spec/unit/multi_select_spec.rb +18 -0
- data/spec/unit/multiline_spec.rb +67 -9
- data/spec/unit/question/default_spec.rb +1 -0
- data/spec/unit/question/echo_spec.rb +8 -0
- data/spec/unit/question/in_spec.rb +13 -0
- data/spec/unit/question/required_spec.rb +31 -2
- data/spec/unit/question/validate_spec.rb +39 -9
- data/spec/unit/reader/history_spec.rb +172 -0
- data/spec/unit/reader/key_event_spec.rb +12 -8
- data/spec/unit/reader/line_spec.rb +110 -0
- data/spec/unit/reader/publish_keypress_event_spec.rb +11 -0
- data/spec/unit/reader/read_line_spec.rb +32 -2
- data/spec/unit/reader/read_multiline_spec.rb +21 -7
- data/spec/unit/select_spec.rb +40 -1
- data/spec/unit/yes_no_spec.rb +48 -4
- metadata +14 -3
- data/lib/tty/prompt/history.rb +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7c73bc3ac5978ca2ec1610fee367e6e04e66c0ec
|
4
|
+
data.tar.gz: 3350a73010eb30efd4494799ff5a6e8437115a42
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cd4716769f48d957e8ef5f4167a231d042126ab565267697b3541cd150629c669079275c1cdf66b7d3bba60b02d0b800458d3b84d1f0d0fa26c3c7cce202b709
|
7
|
+
data.tar.gz: 003c09c9afe7d9f3e3b6014bc5352150f49a1609827c637342605f34fcbbac59f0a913b6d20f68cad8b698387b720c00f3025ab3a1fa30984b226adaada07f1f
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,30 @@
|
|
1
1
|
# Change log
|
2
2
|
|
3
|
+
## [v0.12.0] - 2017-03-19
|
4
|
+
|
5
|
+
### Added
|
6
|
+
* Add Multiline question type
|
7
|
+
* Add Keypress question type
|
8
|
+
* Add Reader::History for storing buffered lines
|
9
|
+
* Add Reader::Line for line abstraction
|
10
|
+
|
11
|
+
### Changed
|
12
|
+
* Remove :read option from Question
|
13
|
+
* Chnage Reader#read_line to handle raw mode for processing special
|
14
|
+
characters such as Ctrl+x, navigate through history buffer
|
15
|
+
using up/down arrows, allow editing current line by moving left/right
|
16
|
+
with arrow keys and inserting content
|
17
|
+
* Change Reader#read_multiline to gather multi line input correctly,
|
18
|
+
skip empty lines and terminate when Ctrl+d and Ctrl+z are pressed
|
19
|
+
* Change Reader::Mode to check if tty is available by Matt Martyn (@MMartyn)
|
20
|
+
* Change #keypress prompt to correctly refresh line and accept :keys & :timeout options
|
21
|
+
|
22
|
+
### Fixed
|
23
|
+
* Fix issue with #select, #multi_selct, #enum_select when choices are
|
24
|
+
provided as hash object together with prompt options.
|
25
|
+
* Fix issue with default parameter for yes?/no? prompt by Carlos Fonseca (@carlosefonseca)
|
26
|
+
* Fix List#help to allow setting help text through DSL
|
27
|
+
|
3
28
|
## [v0.11.0] - 2017-02-26
|
4
29
|
|
5
30
|
### Added
|
data/README.md
CHANGED
@@ -56,6 +56,7 @@ Or install it yourself as:
|
|
56
56
|
* [2.1.7 required](#217-required)
|
57
57
|
* [2.1.8 validate](#218-validate)
|
58
58
|
* [2.2 keypress](#22-keypress)
|
59
|
+
* [2.2.1 timeout](#221-timeout)
|
59
60
|
* [2.3 multiline](#23-multiline)
|
60
61
|
* [2.4 mask](#24-mask)
|
61
62
|
* [2.5 yes?/no?](#25-yesno)
|
@@ -79,6 +80,7 @@ Or install it yourself as:
|
|
79
80
|
* [3.3 help_color](#33-help_color)
|
80
81
|
* [3.4 interrupt](#34-interrupt)
|
81
82
|
* [3.5 prefix](#35-prefix)
|
83
|
+
* [3.6 trakc_history](#36-track_history)
|
82
84
|
|
83
85
|
## 1. Usage
|
84
86
|
|
@@ -349,21 +351,61 @@ prompt.ask('What is your email?') { |q| q.validate :email }
|
|
349
351
|
|
350
352
|
### 2.2. keypress
|
351
353
|
|
352
|
-
In order to ask question
|
354
|
+
In order to ask question that awaits a single character answer use `keypress` prompt like so:
|
353
355
|
|
354
356
|
```ruby
|
355
|
-
prompt.keypress("
|
357
|
+
prompt.keypress("Press key ?")
|
358
|
+
# Press key?
|
359
|
+
# => a
|
360
|
+
```
|
361
|
+
|
362
|
+
By default any key is accepted but you can limit keys by using `:keys` option. Any key event names such as `:space` or `:ctrl_k` are valid:
|
363
|
+
|
364
|
+
```ruby
|
365
|
+
prompt.keypress("Press space or enter to continue, keys: [:space, :return])
|
366
|
+
```
|
367
|
+
|
368
|
+
#### 2.2.1 timeout
|
369
|
+
|
370
|
+
Timeout can be set using `:timeout` option to expire prompt and allow the script to continue automatically:
|
371
|
+
|
372
|
+
```ruby
|
373
|
+
prompt.keypress("Press any key to continue, resumes automatically in 3 seconds ...", timeout: 3)
|
374
|
+
```
|
375
|
+
|
376
|
+
In addition the `keypress` recognises `:countdown` token when inserted inside the question. It will automatically countdown the time in seconds:
|
377
|
+
|
378
|
+
```ruby
|
379
|
+
prompt.keypress("Press any key to continue, resumes automatically in :countdown ...", timeout: 3)
|
356
380
|
```
|
357
381
|
|
358
382
|
### 2.3 multiline
|
359
383
|
|
360
|
-
Asking for multiline input can be done with `multiline` method.
|
384
|
+
Asking for multiline input can be done with `multiline` method. The reading of input will terminate when `Ctrl+d` or `Ctrl+z` is pressed. Empty lines will not be included in the returned array.
|
361
385
|
|
362
386
|
```ruby
|
363
|
-
prompt.multiline("
|
387
|
+
prompt.multiline("Description?")
|
388
|
+
# Description? (Press CTRL-D or CTRL-Z to finish)
|
389
|
+
# I know not all that may be coming,
|
390
|
+
# but be it what it will,
|
391
|
+
# I'll go to it laughing.
|
392
|
+
# => ["I know not all that may be coming,\n", "but be it what it will,\n", "I'll go to it laughing.\n"]
|
364
393
|
```
|
365
394
|
|
366
|
-
The
|
395
|
+
The `multiline` uses similar options to those supported by `ask` prompt. For example, to provide default description:
|
396
|
+
|
397
|
+
```ruby
|
398
|
+
prompt.multiline("Description?", default: 'A super sweet prompt.')
|
399
|
+
```
|
400
|
+
|
401
|
+
or using DSL:
|
402
|
+
|
403
|
+
```ruby
|
404
|
+
prompt.multiline("Description?") do |q|
|
405
|
+
q.default 'A super sweet prompt.'
|
406
|
+
q.help 'Press thy ctrl+d to end'
|
407
|
+
end
|
408
|
+
```
|
367
409
|
|
368
410
|
### 2.4 mask
|
369
411
|
|
@@ -377,8 +419,9 @@ prompt.mask('What is your secret?')
|
|
377
419
|
The masking character can be changed by passing `:mask` option:
|
378
420
|
|
379
421
|
```ruby
|
380
|
-
prompt.
|
381
|
-
|
422
|
+
heart = prompt.decorate('❤ ', :magenta)
|
423
|
+
prompt.mask('What is your secret?', mask: heart)
|
424
|
+
# => What is your secret? ❤ ❤ ❤ ❤ ❤
|
382
425
|
```
|
383
426
|
|
384
427
|
If you don't wish to show any output use `:echo` option like so:
|
@@ -387,6 +430,14 @@ If you don't wish to show any output use `:echo` option like so:
|
|
387
430
|
prompt.mask('What is your secret?', echo: false)
|
388
431
|
```
|
389
432
|
|
433
|
+
You can also provide validation for your mask to enforce for instance strong passwords:
|
434
|
+
|
435
|
+
```ruby
|
436
|
+
prompt.mask('What is your secret?', mask: heart) do |q|
|
437
|
+
q.validate(/[a-z\ ]{5,15}/)
|
438
|
+
end
|
439
|
+
```
|
440
|
+
|
390
441
|
### 2.5 yes?/no?
|
391
442
|
|
392
443
|
In order to display a query asking for boolean input from user use `yes?` like so:
|
@@ -1058,6 +1109,14 @@ You can prefix each question asked using the `:prefix` option. This option can b
|
|
1058
1109
|
prompt = TTY::Prompt.new(prefix: '[?] ')
|
1059
1110
|
```
|
1060
1111
|
|
1112
|
+
### 3.6 track_history
|
1113
|
+
|
1114
|
+
The prompts that accept line input such as `multiline` or `ask` provide history buffer that tracks all the lines entered during `TTY::Prompt.new` interactions. The history buffer provides previoius or next lines when user presses up/down arrows respectively. However, if you wish to disable this behaviour use `:track_history` option like so:
|
1115
|
+
|
1116
|
+
```ruby
|
1117
|
+
prompt = TTY::Prompt.new(track_history: false)
|
1118
|
+
```
|
1119
|
+
|
1061
1120
|
## Contributing
|
1062
1121
|
|
1063
1122
|
1. Fork it ( https://github.com/piotrmurach/tty-prompt/fork )
|
data/examples/keypress.rb
CHANGED
@@ -2,10 +2,8 @@
|
|
2
2
|
|
3
3
|
require 'tty-prompt'
|
4
4
|
|
5
|
-
prompt = TTY::Prompt::new
|
5
|
+
prompt = TTY::Prompt::new
|
6
6
|
|
7
|
-
prompt.
|
8
|
-
puts "name: #{event.key.name}, value: #{event.value.dump}"
|
9
|
-
end
|
7
|
+
answer = prompt.keypress("Press any key to continue")
|
10
8
|
|
11
|
-
|
9
|
+
puts "Answer: #{answer}"
|
data/examples/pause.rb
ADDED
data/lib/tty/prompt.rb
CHANGED
@@ -8,8 +8,10 @@ require_relative 'prompt/answers_collector'
|
|
8
8
|
require_relative 'prompt/confirm_question'
|
9
9
|
require_relative 'prompt/expander'
|
10
10
|
require_relative 'prompt/enum_list'
|
11
|
+
require_relative 'prompt/keypress'
|
11
12
|
require_relative 'prompt/list'
|
12
13
|
require_relative 'prompt/multi_list'
|
14
|
+
require_relative 'prompt/multiline'
|
13
15
|
require_relative 'prompt/mask_question'
|
14
16
|
require_relative 'prompt/question'
|
15
17
|
require_relative 'prompt/reader'
|
@@ -87,6 +89,28 @@ module TTY
|
|
87
89
|
|
88
90
|
# Initialize a Prompt
|
89
91
|
#
|
92
|
+
# @param [Hash] options
|
93
|
+
# @option options [IO] :input
|
94
|
+
# the input stream
|
95
|
+
# @option options [IO] :output
|
96
|
+
# the output stream
|
97
|
+
# @option options [Hash] :env
|
98
|
+
# the environment variables
|
99
|
+
# @option options [String] :prefix
|
100
|
+
# the prompt prefix, by default empty
|
101
|
+
# @option options [Boolean] :enable_color
|
102
|
+
# enable color support, true by default
|
103
|
+
# @option options [String] :active_color
|
104
|
+
# the color used for selected option
|
105
|
+
# @option options [String] :help_color
|
106
|
+
# the color used for help text
|
107
|
+
# @option options [String] :error_color
|
108
|
+
# the color used for displaying error messages
|
109
|
+
# @option options [Symbol] :interrupt
|
110
|
+
# handling of Ctrl+C key out of :signal, :exit, :noop
|
111
|
+
# @option options [Boolean] :track_history
|
112
|
+
# disable line history tracking, true by default
|
113
|
+
#
|
90
114
|
# @api public
|
91
115
|
def initialize(*args)
|
92
116
|
options = Utils.extract_options!(args)
|
@@ -98,10 +122,29 @@ module TTY
|
|
98
122
|
@active_color = options.fetch(:active_color) { :green }
|
99
123
|
@help_color = options.fetch(:help_color) { :bright_black }
|
100
124
|
@error_color = options.fetch(:error_color) { :red }
|
125
|
+
@interrupt = options.fetch(:interrupt) { :error }
|
126
|
+
@track_history = options.fetch(:track_history) { true }
|
101
127
|
|
102
128
|
@cursor = TTY::Cursor
|
103
129
|
@pastel = Pastel.new(@enabled_color.nil? ? {} : { enabled: @enabled_color })
|
104
|
-
@reader = Reader.new(@input, @output, interrupt:
|
130
|
+
@reader = Reader.new(@input, @output, interrupt: @interrupt,
|
131
|
+
track_history: @track_history, env: @env)
|
132
|
+
end
|
133
|
+
|
134
|
+
# Invoke a question type of prompt
|
135
|
+
#
|
136
|
+
# @example
|
137
|
+
# prompt = TTY::Prompt.new
|
138
|
+
# prompt.invoke_question(Question, "Your name? ")
|
139
|
+
#
|
140
|
+
# @return [String]
|
141
|
+
#
|
142
|
+
# @api public
|
143
|
+
def invoke_question(object, message, *args, &block)
|
144
|
+
options = Utils.extract_options!(args)
|
145
|
+
options[:messages] = self.class.messages
|
146
|
+
question = object.new(self, options)
|
147
|
+
question.(message, &block)
|
105
148
|
end
|
106
149
|
|
107
150
|
# Ask a question.
|
@@ -122,10 +165,7 @@ module TTY
|
|
122
165
|
#
|
123
166
|
# @api public
|
124
167
|
def ask(message, *args, &block)
|
125
|
-
|
126
|
-
options.merge!({messages: self.class.messages})
|
127
|
-
question = Question.new(self, options)
|
128
|
-
question.call(message, &block)
|
168
|
+
invoke_question(Question, message, *args, &block)
|
129
169
|
end
|
130
170
|
|
131
171
|
# Ask a question with a keypress answer
|
@@ -134,22 +174,47 @@ module TTY
|
|
134
174
|
#
|
135
175
|
# @api public
|
136
176
|
def keypress(message, *args, &block)
|
137
|
-
|
138
|
-
options.merge!(read: :keypress)
|
139
|
-
args << options
|
140
|
-
ask(message, *args, &block)
|
177
|
+
invoke_question(Keypress, message, *args, &block)
|
141
178
|
end
|
142
179
|
|
143
180
|
# Ask a question with a multiline answer
|
144
181
|
#
|
145
|
-
# @
|
182
|
+
# @example
|
183
|
+
# prompt.multiline('Description?')
|
184
|
+
#
|
185
|
+
# @return [Array[String]]
|
146
186
|
#
|
147
187
|
# @api public
|
148
188
|
def multiline(message, *args, &block)
|
189
|
+
invoke_question(Multiline, message, *args, &block)
|
190
|
+
end
|
191
|
+
|
192
|
+
# Invoke a list type of prompt
|
193
|
+
#
|
194
|
+
# @example
|
195
|
+
# prompt = TTY::Prompt.new
|
196
|
+
# editors = %w(emacs nano vim)
|
197
|
+
# prompt.invoke_select(EnumList, "Select editor: ", editors)
|
198
|
+
#
|
199
|
+
# @return [String]
|
200
|
+
#
|
201
|
+
# @api public
|
202
|
+
def invoke_select(object, question, *args, &block)
|
149
203
|
options = Utils.extract_options!(args)
|
150
|
-
|
151
|
-
|
152
|
-
|
204
|
+
choices = if block
|
205
|
+
[]
|
206
|
+
elsif args.empty?
|
207
|
+
possible = options.dup
|
208
|
+
options = {}
|
209
|
+
possible
|
210
|
+
elsif args.size == 1 && args[0].is_a?(Hash)
|
211
|
+
Utils.extract_options!(args)
|
212
|
+
else
|
213
|
+
args.flatten
|
214
|
+
end
|
215
|
+
|
216
|
+
list = object.new(self, options)
|
217
|
+
list.(question, choices, &block)
|
153
218
|
end
|
154
219
|
|
155
220
|
# Ask masked question
|
@@ -162,10 +227,7 @@ module TTY
|
|
162
227
|
#
|
163
228
|
# @api public
|
164
229
|
def mask(message, *args, &block)
|
165
|
-
|
166
|
-
options.merge!({messages: self.class.messages})
|
167
|
-
question = MaskQuestion.new(self, options)
|
168
|
-
question.call(message, &block)
|
230
|
+
invoke_question(MaskQuestion, message, *args, &block)
|
169
231
|
end
|
170
232
|
|
171
233
|
# Ask a question with a list of options
|
@@ -232,30 +294,6 @@ module TTY
|
|
232
294
|
invoke_select(EnumList, question, *args, &block)
|
233
295
|
end
|
234
296
|
|
235
|
-
# Invoke a list type of prompt
|
236
|
-
#
|
237
|
-
# @example
|
238
|
-
# prompt = TTY::Prompt.new
|
239
|
-
# editors = %w(emacs nano vim)
|
240
|
-
# prompt.invoke_select(EnumList, "Select editor: ", editors)
|
241
|
-
#
|
242
|
-
# @return [String]
|
243
|
-
#
|
244
|
-
# @api public
|
245
|
-
def invoke_select(object, question, *args, &block)
|
246
|
-
options = Utils.extract_options!(args)
|
247
|
-
choices = if block
|
248
|
-
[]
|
249
|
-
elsif args.empty?
|
250
|
-
options
|
251
|
-
else
|
252
|
-
args.flatten
|
253
|
-
end
|
254
|
-
|
255
|
-
list = object.new(self, options)
|
256
|
-
list.call(question, choices, &block)
|
257
|
-
end
|
258
|
-
|
259
297
|
# A shortcut method to ask the user positive question and return
|
260
298
|
# true for 'yes' reply, false for 'no'.
|
261
299
|
#
|
@@ -288,7 +326,7 @@ module TTY
|
|
288
326
|
#
|
289
327
|
# @api public
|
290
328
|
def no?(message, *args, &block)
|
291
|
-
defaults = { default: false
|
329
|
+
defaults = { default: false }
|
292
330
|
options = Utils.extract_options!(args)
|
293
331
|
options.merge!(defaults.reject { |k, _| options.key?(k) })
|
294
332
|
|
@@ -350,7 +388,7 @@ module TTY
|
|
350
388
|
# @api public
|
351
389
|
def say(message = '', options = {})
|
352
390
|
message = message.to_s
|
353
|
-
return
|
391
|
+
return if message.empty?
|
354
392
|
|
355
393
|
statement = Statement.new(self, options)
|
356
394
|
statement.call(message)
|
@@ -491,7 +529,7 @@ module TTY
|
|
491
529
|
enabled_color: enabled_color,
|
492
530
|
help_color: help_color
|
493
531
|
}
|
494
|
-
"#<#{self.class}: #{attributes.each { |name, val| "@#{name}=#{val}" }
|
532
|
+
"#<#{self.class}: #{attributes.each { |name, val| "@#{name}=#{val}" }}"
|
495
533
|
end
|
496
534
|
end # Prompt
|
497
535
|
end # TTY
|
@@ -16,11 +16,9 @@ module TTY
|
|
16
16
|
# @api public
|
17
17
|
def initialize(prompt, options = {})
|
18
18
|
super
|
19
|
-
|
20
19
|
@suffix = options.fetch(:suffix) { UndefinedSetting }
|
21
20
|
@positive = options.fetch(:positive) { UndefinedSetting }
|
22
21
|
@negative = options.fetch(:negative) { UndefinedSetting }
|
23
|
-
@type = options.fetch(:type) { :yes }
|
24
22
|
end
|
25
23
|
|
26
24
|
def positive?
|
@@ -38,21 +36,24 @@ module TTY
|
|
38
36
|
# Set question suffix
|
39
37
|
#
|
40
38
|
# @api public
|
41
|
-
def suffix(value)
|
39
|
+
def suffix(value = (not_set = true))
|
40
|
+
return @negative if not_set
|
42
41
|
@suffix = value
|
43
42
|
end
|
44
43
|
|
45
44
|
# Set value for matching positive choice
|
46
45
|
#
|
47
46
|
# @api public
|
48
|
-
def positive(value)
|
47
|
+
def positive(value = (not_set = true))
|
48
|
+
return @positive if not_set
|
49
49
|
@positive = value
|
50
50
|
end
|
51
51
|
|
52
52
|
# Set value for matching negative choice
|
53
53
|
#
|
54
54
|
# @api public
|
55
|
-
def negative(value)
|
55
|
+
def negative(value = (not_set = true))
|
56
|
+
return @negative if not_set
|
56
57
|
@negative = value
|
57
58
|
end
|
58
59
|
|
@@ -66,10 +67,11 @@ module TTY
|
|
66
67
|
|
67
68
|
# Render confirmation question
|
68
69
|
#
|
70
|
+
# @return [String]
|
71
|
+
#
|
69
72
|
# @api private
|
70
73
|
def render_question
|
71
74
|
header = "#{@prefix}#{message} "
|
72
|
-
|
73
75
|
if !@done
|
74
76
|
header += @prompt.decorate("(#{@suffix})", @help_color) + ' '
|
75
77
|
else
|
@@ -77,24 +79,17 @@ module TTY
|
|
77
79
|
label = answer ? @positive : @negative
|
78
80
|
header += @prompt.decorate(label, @active_color)
|
79
81
|
end
|
80
|
-
@
|
81
|
-
|
82
|
-
|
83
|
-
header.lines.count + (@done ? 1 : 0)
|
82
|
+
header << "\n" if @done
|
83
|
+
header
|
84
84
|
end
|
85
85
|
|
86
86
|
protected
|
87
87
|
|
88
|
-
# @api private
|
89
|
-
def is?(type)
|
90
|
-
@type == type
|
91
|
-
end
|
92
|
-
|
93
88
|
# @api private
|
94
89
|
def setup_defaults
|
95
90
|
return if suffix? && positive?
|
96
91
|
|
97
|
-
if suffix? && !positive?
|
92
|
+
if suffix? && (!positive? || !negative?)
|
98
93
|
parts = @suffix.split('/')
|
99
94
|
@positive = parts[0]
|
100
95
|
@negative = parts[1]
|
@@ -104,41 +99,30 @@ module TTY
|
|
104
99
|
@convert = conversion
|
105
100
|
else
|
106
101
|
create_default_labels
|
107
|
-
@convert
|
102
|
+
@convert = :bool
|
108
103
|
end
|
109
104
|
end
|
110
105
|
|
106
|
+
# @api private
|
111
107
|
def create_default_labels
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
@negative = default? ? 'no' : 'No'
|
116
|
-
else
|
117
|
-
@suffix = default? ? 'y/N' : 'Y/n'
|
118
|
-
@positive = default? ? 'Yes' : 'yes'
|
119
|
-
@negative = default? ? 'No' : 'no'
|
120
|
-
end
|
108
|
+
@suffix = default ? 'Y/n' : 'y/N'
|
109
|
+
@positive = default ? 'Yes' : 'yes'
|
110
|
+
@negative = default ? 'no' : 'No'
|
121
111
|
end
|
122
112
|
|
123
113
|
# @api private
|
124
114
|
def create_suffix
|
125
115
|
result = ''
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
result << "#{default? ? @negative.downcase : @negative.capitalize}"
|
130
|
-
else
|
131
|
-
result << "#{default? ? @positive.downcase : @positive.capitalize}"
|
132
|
-
result << '/'
|
133
|
-
result << "#{default? ? @negative.capitalize : @negative.downcase}"
|
134
|
-
end
|
116
|
+
result << "#{default ? positive.capitalize : positive.downcase}"
|
117
|
+
result << '/'
|
118
|
+
result << "#{default ? negative.downcase : negative.capitalize}"
|
135
119
|
end
|
136
120
|
|
137
121
|
# Create custom conversion
|
138
122
|
#
|
139
123
|
# @api private
|
140
124
|
def conversion
|
141
|
-
proc { |input| !input.match(/^#{
|
125
|
+
proc { |input| !input.match(/^#{positive}|#{positive[0]}$/i).nil? }
|
142
126
|
end
|
143
127
|
end # ConfirmQuestion
|
144
128
|
end # Prompt
|