tty-prompt 0.19.0 → 0.20.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5b95f394284033f244487a624ca98d9d4aca8a1d5b01c08d181a3bbfe509aa4a
4
- data.tar.gz: 32031c9ca43c3098418f54051af00bdcba6075532ba0878a3b8efda844ba076f
3
+ metadata.gz: c931430d3e829a2006e67517b24605d5761d401ab04824e6c1c26f33dee2253a
4
+ data.tar.gz: b5a4b0bbe4ffe080719074bca1d9ef59f6c55490a3b1832aa8bfa3c7f045ab0f
5
5
  SHA512:
6
- metadata.gz: decec13d7b8a65ba78d5c2eea5ed3366976670c1a7e0ebe228c25cf5b494aa82fe3131e5521fe3c8d882d10b2db2aa6934749f1583f767630f4bf3a4fc59eb96
7
- data.tar.gz: 7d1e877c0f4e1df2db06726cd8748b6e777f59cf055177d480610687db46ad7de12ee7cfe7aa454414816020bfa35ab5a1e273b680946a45d287b6563e7a1ff6
6
+ metadata.gz: c2daf65290416154a3734d22a08b3e3d93b518c963f5b735282835dd362ff6380c81cf0d1c5822d207eb3ff3b2717f3633fb82ab9941f0854849b893b775bc24
7
+ data.tar.gz: 1aaeb2c66b87133c54d353a305d3798629f5b953ac4dd09971a3789f0647d97dec2dd4ae811d4dc7f4e07775eef9e1803aeb80e6829a8a8b40d3d9f32fabf1ab
@@ -1,5 +1,17 @@
1
1
  # Change log
2
2
 
3
+ ## [v0.20.0] - 2019-11-24
4
+
5
+ ### Changed
6
+ * Change to update tty-reader dependency
7
+ * Change gemspec to include metadata
8
+
9
+ ### Fixed
10
+ * Fix Choice#from to differentiate between nil and false by Katelyn Schiesser(@slowbro)
11
+ * Fix yes? and no? prompts to stop raising on invalid/blank input by Katelyn Schiesser(@slowbro)
12
+ * Fix Ruby 2.7 keyword arguments warnings
13
+ * Fix question validation to work with nil input
14
+
3
15
  ## [v0.19.0] - 2019-05-27
4
16
 
5
17
  ### Added
@@ -326,6 +338,7 @@
326
338
 
327
339
  * Initial implementation and release
328
340
 
341
+ [v0.20.0]: https://github.com/piotrmurach/tty-prompt/compare/v0.19.0...v0.20.0
329
342
  [v0.19.0]: https://github.com/piotrmurach/tty-prompt/compare/v0.18.1...v0.19.0
330
343
  [v0.18.1]: https://github.com/piotrmurach/tty-prompt/compare/v0.18.0...v0.18.1
331
344
  [v0.18.0]: https://github.com/piotrmurach/tty-prompt/compare/v0.17.2...v0.18.0
data/README.md CHANGED
@@ -116,6 +116,8 @@ Or install it yourself as:
116
116
  In order to start asking questions on the command line, create prompt:
117
117
 
118
118
  ```ruby
119
+ require "tty-prompt"
120
+
119
121
  prompt = TTY::Prompt.new
120
122
  ```
121
123
 
@@ -374,7 +376,7 @@ prompt.ask("What's your phone number?", required: true)
374
376
 
375
377
  #### 2.1.9 validate
376
378
 
377
- In order to validate that input matches a given patter you can pass the `validate` option. Validate setting accepts `Regex`, `Proc` or `Symbol`.
379
+ In order to validate that input matches a given pattern you can pass the `validate` option. Validate setting accepts `Regex`, `Proc` or `Symbol`.
378
380
 
379
381
  ```ruby
380
382
  prompt.ask('What is your username?') do |q|
@@ -384,7 +386,7 @@ end
384
386
 
385
387
  The **TTY::Prompt** comes with built-in validations for `:email` and you can use them directly like so:
386
388
 
387
- ```prompt
389
+ ```ruby
388
390
  prompt.ask('What is your email?') { |q| q.validate :email }
389
391
  ```
390
392
 
@@ -716,14 +718,20 @@ prompt.select("Choose your letter?", letters, per_page: 4)
716
718
  # D
717
719
  ```
718
720
 
719
- You can also customise page navigation text using `:page_help` option:
721
+ You can also customise page navigation text using `:help` option:
720
722
  ```ruby
721
723
  letters = ('A'..'Z').to_a
722
724
  prompt.select("Choose your letter?") do |menu|
723
725
  menu.per_page 4
724
- menu.page_help '(Wiggle thy finger up or down to see more)'
726
+ menu.help '(Wiggle thy finger up/down and left/right to see more)'
725
727
  menu.choices letters
726
728
  end
729
+ # =>
730
+ # Which letter? (Wiggle thy finger up/down and left/right to see more)
731
+ # ‣ A
732
+ # B
733
+ # C
734
+ # D
727
735
  ```
728
736
 
729
737
  #### 2.6.2.2 `:disabled`
@@ -1210,7 +1218,7 @@ end
1210
1218
 
1211
1219
  In order to collect _mutliple values_ for a given key in a loop, chain `values` onto the `key` desired:
1212
1220
 
1213
- ```rb
1221
+ ```ruby
1214
1222
  result = prompt.collect do
1215
1223
  key(:name).ask('Name?')
1216
1224
 
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../lib/tty-prompt"
4
+
5
+ prompt = TTY::Prompt.new
6
+
7
+ prompt.ask("What\nis your\nname?", default: ENV['USER'])
@@ -86,7 +86,7 @@ module TTY
86
86
  def_delegators :@cursor, :clear_lines, :clear_line,
87
87
  :show, :hide
88
88
 
89
- def_delegators :@reader, :read_char, :read_line, :read_keypress,
89
+ def_delegators :@reader, :read_char, :read_keypress, # :read_line,
90
90
  :read_multiline, :on, :subscribe, :unsubscribe, :trigger,
91
91
  :count_screen_lines
92
92
 
@@ -100,6 +100,11 @@ module TTY
100
100
  }
101
101
  end
102
102
 
103
+ # This fixes Forwardable module keyword arguments warning
104
+ def read_line(message, **options)
105
+ @reader.read_line(message, **options)
106
+ end
107
+
103
108
  # Initialize a Prompt
104
109
  #
105
110
  # @param [Hash] options
@@ -163,7 +168,7 @@ module TTY
163
168
  # @api public
164
169
  def invoke_question(object, message, **options, &block)
165
170
  options[:messages] = self.class.messages
166
- question = object.new(self, options)
171
+ question = object.new(self, **options)
167
172
  question.(message, &block)
168
173
  end
169
174
 
@@ -233,7 +238,7 @@ module TTY
233
238
  args.flatten
234
239
  end
235
240
 
236
- list = object.new(self, options)
241
+ list = object.new(self, **options)
237
242
  list.(question, choices, &block)
238
243
  end
239
244
 
@@ -330,7 +335,7 @@ module TTY
330
335
  options = Utils.extract_options!(args)
331
336
  options.merge!(defaults.reject { |k, _| options.key?(k) })
332
337
 
333
- question = ConfirmQuestion.new(self, options)
338
+ question = ConfirmQuestion.new(self, **options)
334
339
  question.call(message, &block)
335
340
  end
336
341
 
@@ -350,7 +355,7 @@ module TTY
350
355
  options = Utils.extract_options!(args)
351
356
  options.merge!(defaults.reject { |k, _| options.key?(k) })
352
357
 
353
- question = ConfirmQuestion.new(self, options)
358
+ question = ConfirmQuestion.new(self, **options)
354
359
  !question.call(message, &block)
355
360
  end
356
361
 
@@ -391,7 +396,7 @@ module TTY
391
396
  # @api public
392
397
  def slider(question, *args, &block)
393
398
  options = Utils.extract_options!(args)
394
- slider = Slider.new(self, options)
399
+ slider = Slider.new(self, **options)
395
400
  slider.call(question, &block)
396
401
  end
397
402
 
@@ -506,8 +511,8 @@ module TTY
506
511
  # @return [String]
507
512
  #
508
513
  # @api public
509
- def suggest(message, possibilities, options = {})
510
- suggestion = Suggestion.new(options)
514
+ def suggest(message, possibilities, **options)
515
+ suggestion = Suggestion.new(**options)
511
516
  say(suggestion.suggest(message, possibilities))
512
517
  end
513
518
 
@@ -522,8 +527,8 @@ module TTY
522
527
  # the collection of answers
523
528
  #
524
529
  # @api public
525
- def collect(options = {}, &block)
526
- collector = AnswersCollector.new(self, options)
530
+ def collect(**options, &block)
531
+ collector = AnswersCollector.new(self, **options)
527
532
  collector.call(&block)
528
533
  end
529
534
 
@@ -6,7 +6,7 @@ module TTY
6
6
  # Initialize answer collector
7
7
  #
8
8
  # @api public
9
- def initialize(prompt, options = {})
9
+ def initialize(prompt, **options)
10
10
  @prompt = prompt
11
11
  @answers = options.fetch(:answers) { {} }
12
12
  end
@@ -69,8 +69,8 @@ module TTY
69
69
  private
70
70
 
71
71
  # @api private
72
- def method_missing(method, *args, &block)
73
- answer = @prompt.public_send(method, *args, &block)
72
+ def method_missing(method, *args, **options, &block)
73
+ answer = @prompt.public_send(method, *args, **options, &block)
74
74
  add_answer(answer)
75
75
  end
76
76
  end # AnswersCollector
@@ -35,7 +35,7 @@ module TTY
35
35
  if name.is_a?(Hash)
36
36
  convert_hash(name)
37
37
  else
38
- new(name.to_s, value || name.to_s, options || {})
38
+ new(name.to_s, (value.nil? ? name.to_s : value), **(options || {}))
39
39
  end
40
40
  when Hash
41
41
  convert_hash(val)
@@ -49,9 +49,9 @@ module TTY
49
49
  # @api public
50
50
  def self.convert_hash(val)
51
51
  if val.key?(:name) && val.key?(:value)
52
- new(val[:name].to_s, val[:value], val)
52
+ new(val[:name].to_s, val[:value], **val)
53
53
  elsif val.key?(:name)
54
- new(val[:name].to_s, val[:name].to_s, val)
54
+ new(val[:name].to_s, val[:name].to_s, **val)
55
55
  else
56
56
  new(val.keys.first.to_s, val.values.first)
57
57
  end
@@ -14,7 +14,7 @@ module TTY
14
14
  # @option options [String] :negative
15
15
  #
16
16
  # @api public
17
- def initialize(prompt, options = {})
17
+ def initialize(prompt, **options)
18
18
  super
19
19
  @suffix = options.fetch(:suffix) { UndefinedSetting }
20
20
  @positive = options.fetch(:positive) { UndefinedSetting }
@@ -85,21 +85,30 @@ module TTY
85
85
 
86
86
  protected
87
87
 
88
+ # Decide how to handle input from user
89
+ #
90
+ # @api private
91
+ def process_input(question)
92
+ @input = read_input(question)
93
+ if Utils.blank?(@input)
94
+ @input = default ? positive : negative
95
+ end
96
+ @evaluator.call(@input)
97
+ end
98
+
88
99
  # @api private
89
100
  def setup_defaults
101
+ @convert = conversion
90
102
  return if suffix? && positive?
91
103
 
92
104
  if suffix? && (!positive? || !negative?)
93
105
  parts = @suffix.split('/')
94
106
  @positive = parts[0]
95
107
  @negative = parts[1]
96
- @convert = conversion
97
108
  elsif !suffix? && positive?
98
109
  @suffix = create_suffix
99
- @convert = conversion
100
110
  else
101
111
  create_default_labels
102
- @convert = :bool
103
112
  end
104
113
  end
105
114
 
@@ -108,6 +117,8 @@ module TTY
108
117
  @suffix = default ? 'Y/n' : 'y/N'
109
118
  @positive = default ? 'Yes' : 'yes'
110
119
  @negative = default ? 'no' : 'No'
120
+ @validation = /^(y(es)?|no?)$/i
121
+ @messages[:valid?] = "Invalid input."
111
122
  end
112
123
 
113
124
  # @api private
@@ -11,7 +11,7 @@ module TTY
11
11
  class Multiline < Question
12
12
  HELP = '(Press CTRL-D or CTRL-Z to finish)'.freeze
13
13
 
14
- def initialize(prompt, options = {})
14
+ def initialize(prompt, **options)
15
15
  super
16
16
  @help = options[:help] || self.class::HELP
17
17
  @first_render = true
@@ -167,7 +167,7 @@ module TTY
167
167
  options[:value] = @value
168
168
  @first_render = false
169
169
  end
170
- @prompt.read_line(question, options).chomp
170
+ @prompt.read_line(question, **options).chomp
171
171
  end
172
172
 
173
173
  # Handle error condition
@@ -57,11 +57,11 @@ module TTY
57
57
  def call(input)
58
58
  if pattern.is_a?(String) || pattern.is_a?(Symbol)
59
59
  VALIDATORS.key?(pattern.to_sym)
60
- !VALIDATORS[pattern.to_sym].match(input).nil?
60
+ !VALIDATORS[pattern.to_sym].match(input.to_s).nil?
61
61
  elsif pattern.is_a?(Regexp)
62
- !pattern.match(input).nil?
62
+ !pattern.match(input.to_s).nil?
63
63
  elsif pattern.is_a?(Proc)
64
- result = pattern.call(input)
64
+ result = pattern.call(input.to_s)
65
65
  result.nil? ? false : result
66
66
  else false
67
67
  end
@@ -33,7 +33,7 @@ module TTY
33
33
  # Initialize a Suggestion
34
34
  #
35
35
  # @api public
36
- def initialize(options = {})
36
+ def initialize(**options)
37
37
  @indent = options.fetch(:indent) { DEFAULT_INDENT }
38
38
  @single_text = options.fetch(:single_text) { SINGLE_TEXT }
39
39
  @plural_text = options.fetch(:plural_text) { PLURAL_TEXT }
@@ -2,6 +2,6 @@
2
2
 
3
3
  module TTY
4
4
  class Prompt
5
- VERSION = '0.19.0'
5
+ VERSION = '0.20.0'
6
6
  end # Prompt
7
7
  end # TTY
@@ -99,7 +99,7 @@ RSpec.describe TTY::Prompt, '#ask' do
99
99
  prompt.input << ''
100
100
  prompt.input.rewind
101
101
  options = {default: 'Piotr', help_color: :red, active_color: :cyan}
102
- answer = prompt.ask("What is your name?", options)
102
+ answer = prompt.ask("What is your name?", **options)
103
103
  expect(answer).to eq('Piotr')
104
104
  expect(prompt.output.string).to eq([
105
105
  "What is your name? \e[31m(Piotr)\e[0m ",
@@ -147,7 +147,7 @@ RSpec.describe TTY::Prompt, '#ask' do
147
147
  prompt.input << "Piotr\r"
148
148
  prompt.input.rewind
149
149
  local_settings = {prefix: ':-) ', active_color: :blue, help_color: :magenta}
150
- prompt.ask('What is your name?', local_settings)
150
+ prompt.ask('What is your name?', **local_settings)
151
151
 
152
152
  expect(prompt.output.string).to eq([
153
153
  "[?] What is your name? ",
@@ -3,7 +3,7 @@
3
3
  RSpec.describe TTY::Prompt::BlockPaginator, '#paginate' do
4
4
  it "ignores per_page when equal items " do
5
5
  list = %w(a b c d)
6
- paginator = described_class.new({per_page: 4})
6
+ paginator = described_class.new(per_page: 4)
7
7
 
8
8
  expect(paginator.paginate(list, 1).to_a).to eq([
9
9
  ['a',0],['b',1],['c',2],['d',3]])
@@ -11,7 +11,7 @@ RSpec.describe TTY::Prompt::BlockPaginator, '#paginate' do
11
11
 
12
12
  it "ignores per_page when less items " do
13
13
  list = %w(a b c d)
14
- paginator = described_class.new({per_page: 5})
14
+ paginator = described_class.new(per_page: 5)
15
15
 
16
16
  expect(paginator.paginate(list, 1).to_a).to eq([
17
17
  ['a',0],['b',1],['c',2],['d',3]])
@@ -19,7 +19,7 @@ RSpec.describe TTY::Prompt::BlockPaginator, '#paginate' do
19
19
 
20
20
  it "paginates items matching per_page count" do
21
21
  list = %w(a b c d e f)
22
- paginator = described_class.new({per_page: 3})
22
+ paginator = described_class.new(per_page: 3)
23
23
 
24
24
  expect(paginator.paginate(list, 1).to_a).to eq([['a',0], ['b',1], ['c',2]])
25
25
  expect(paginator.paginate(list, 2).to_a).to eq([['a',0], ['b',1], ['c',2]])
@@ -32,7 +32,7 @@ RSpec.describe TTY::Prompt::BlockPaginator, '#paginate' do
32
32
 
33
33
  it "paginates items not matching per_page count" do
34
34
  list = %w(a b c d e f g)
35
- paginator = described_class.new({per_page: 3})
35
+ paginator = described_class.new(per_page: 3)
36
36
 
37
37
  expect(paginator.paginate(list, 1).to_a).to eq([['a',0], ['b',1], ['c',2]])
38
38
  expect(paginator.paginate(list, 2).to_a).to eq([['a',0], ['b',1], ['c',2]])
@@ -46,7 +46,7 @@ RSpec.describe TTY::Prompt::BlockPaginator, '#paginate' do
46
46
 
47
47
  it "finds both start and end index for current selection" do
48
48
  list = %w(a b c d e f g)
49
- paginator = described_class.new({per_page: 3, default: 0})
49
+ paginator = described_class.new(per_page: 3, default: 0)
50
50
 
51
51
  paginator.paginate(list, 3)
52
52
  expect(paginator.start_index).to eq(0)
@@ -67,7 +67,7 @@ RSpec.describe TTY::Prompt::BlockPaginator, '#paginate' do
67
67
 
68
68
  it "starts with default selection" do
69
69
  list = %w(a b c d e f g)
70
- paginator = described_class.new({per_page: 3, default: 3})
70
+ paginator = described_class.new(per_page: 3, default: 3)
71
71
 
72
72
  expect(paginator.paginate(list, 4).to_a).to eq([['d',3], ['e',4], ['f',5]])
73
73
  end
@@ -75,7 +75,7 @@ RSpec.describe TTY::Prompt::BlockPaginator, '#paginate' do
75
75
  it "doesn't accept invalid pagination" do
76
76
  list = %w(a b c d e f g)
77
77
 
78
- paginator = described_class.new({per_page: 0})
78
+ paginator = described_class.new(per_page: 0)
79
79
 
80
80
  expect {
81
81
  paginator.paginate(list, 4)
@@ -34,6 +34,24 @@ RSpec.describe TTY::Prompt::Choice, '#from' do
34
34
  expect(choice.value).to eq(1)
35
35
  end
36
36
 
37
+ it "creates choice from array with false" do
38
+ expected_choice = described_class.new('large', false)
39
+ choice = described_class.from([:large, false])
40
+
41
+ expect(choice).to eq(expected_choice)
42
+ expect(choice.name).to eq('large')
43
+ expect(choice.value).to eq(false)
44
+ end
45
+
46
+ it "defaults value to name if value is nil" do
47
+ expected_choice = described_class.new('large', 'large')
48
+ choice = described_class.from([:large, nil])
49
+
50
+ expect(choice).to eq(expected_choice)
51
+ expect(choice.name).to eq('large')
52
+ expect(choice.value).to eq('large')
53
+ end
54
+
37
55
  it "creates choice from hash value" do
38
56
  expected_choice = described_class.new('large', 1)
39
57
  choice = described_class.from({large: 1})
@@ -3,7 +3,7 @@
3
3
  RSpec.describe TTY::Prompt::Paginator, '#paginate' do
4
4
  it "ignores per_page when equal items " do
5
5
  list = %w(a b c d)
6
- paginator = described_class.new({per_page: 4})
6
+ paginator = described_class.new(per_page: 4)
7
7
 
8
8
  expect(paginator.paginate(list, 1).to_a).to eq([
9
9
  ['a',0],['b',1],['c',2],['d',3]])
@@ -11,7 +11,7 @@ RSpec.describe TTY::Prompt::Paginator, '#paginate' do
11
11
 
12
12
  it "ignores per_page when less items " do
13
13
  list = %w(a b c d)
14
- paginator = described_class.new({per_page: 5})
14
+ paginator = described_class.new(per_page: 5)
15
15
 
16
16
  expect(paginator.paginate(list, 1).to_a).to eq([
17
17
  ['a',0],['b',1],['c',2],['d',3]])
@@ -19,7 +19,7 @@ RSpec.describe TTY::Prompt::Paginator, '#paginate' do
19
19
 
20
20
  it "paginates items matching per_page count" do
21
21
  list = %w(a b c d e f)
22
- paginator = described_class.new({per_page: 3})
22
+ paginator = described_class.new(per_page: 3)
23
23
 
24
24
  expect(paginator.paginate(list, 1).to_a).to eq([['a',0], ['b',1], ['c',2]])
25
25
  expect(paginator.paginate(list, 2).to_a).to eq([['a',0], ['b',1], ['c',2]])
@@ -32,7 +32,7 @@ RSpec.describe TTY::Prompt::Paginator, '#paginate' do
32
32
 
33
33
  it "paginates items not matching per_page count" do
34
34
  list = %w(a b c d e f g)
35
- paginator = described_class.new({per_page: 3})
35
+ paginator = described_class.new(per_page: 3)
36
36
 
37
37
  expect(paginator.paginate(list, 1).to_a).to eq([['a',0], ['b',1], ['c',2]])
38
38
  expect(paginator.paginate(list, 2).to_a).to eq([['a',0], ['b',1], ['c',2]])
@@ -46,7 +46,7 @@ RSpec.describe TTY::Prompt::Paginator, '#paginate' do
46
46
 
47
47
  it "finds both start and end index for current selection" do
48
48
  list = %w(a b c d e f g)
49
- paginator = described_class.new({per_page: 3, default: 0})
49
+ paginator = described_class.new(per_page: 3, default: 0)
50
50
 
51
51
  paginator.paginate(list, 2)
52
52
  expect(paginator.start_index).to eq(0)
@@ -75,7 +75,7 @@ RSpec.describe TTY::Prompt::Paginator, '#paginate' do
75
75
 
76
76
  it "starts with default selection" do
77
77
  list = %w(a b c d e f g)
78
- paginator = described_class.new({per_page: 3, default: 3})
78
+ paginator = described_class.new(per_page: 3, default: 3)
79
79
 
80
80
  expect(paginator.paginate(list, 4).to_a).to eq([['d',3], ['e',4], ['f',5]])
81
81
  end
@@ -83,7 +83,7 @@ RSpec.describe TTY::Prompt::Paginator, '#paginate' do
83
83
  it "doesn't accept invalid pagination" do
84
84
  list = %w(a b c d e f g)
85
85
 
86
- paginator = described_class.new({per_page: 0})
86
+ paginator = described_class.new(per_page: 0)
87
87
 
88
88
  expect {
89
89
  paginator.paginate(list, 4)
@@ -233,7 +233,7 @@ RSpec.describe TTY::Prompt, '#select' do
233
233
  prompt.input.rewind
234
234
  options = {active_color: :blue, help_color: :red, symbols: {marker: '>' }}
235
235
 
236
- value = prompt.select('What size?', choices, options)
236
+ value = prompt.select('What size?', choices, **options)
237
237
 
238
238
  expect(value).to eq('Large')
239
239
  expect(prompt.output.string).to eq([
@@ -32,6 +32,23 @@ RSpec.describe TTY::Prompt, 'confirmation' do
32
32
  ].join)
33
33
  end
34
34
 
35
+ it 'warns about invalid entry when using defaults' do
36
+ prompt.input << "test"
37
+ prompt.input.rewind
38
+ prompt.yes?("Are you a human?")
39
+ expect(prompt.output.string).to eq([
40
+ "Are you a human? \e[90m(Y/n)\e[0m ",
41
+ "\e[2K\e[1GAre you a human? \e[90m(Y/n)\e[0m t",
42
+ "\e[2K\e[1GAre you a human? \e[90m(Y/n)\e[0m te",
43
+ "\e[2K\e[1GAre you a human? \e[90m(Y/n)\e[0m tes",
44
+ "\e[2K\e[1GAre you a human? \e[90m(Y/n)\e[0m test",
45
+ "\e[31m>>\e[0m Invalid input.\e[1A",
46
+ "\e[2K\e[1GAre you a human? \e[90m(Y/n)\e[0m ",
47
+ "\e[2K\e[1G\e[1A\e[2K\e[1G",
48
+ "Are you a human? \e[32mYes\e[0m\n"
49
+ ].join)
50
+ end
51
+
35
52
  it 'assumes default true' do
36
53
  prompt.input << "\r"
37
54
  prompt.input.rewind
@@ -181,6 +198,23 @@ RSpec.describe TTY::Prompt, 'confirmation' do
181
198
  ].join)
182
199
  end
183
200
 
201
+ it 'warns about invalid entry when using defaults' do
202
+ prompt.input << "test"
203
+ prompt.input.rewind
204
+ prompt.no?("Are you a human?")
205
+ expect(prompt.output.string).to eq([
206
+ "Are you a human? \e[90m(y/N)\e[0m ",
207
+ "\e[2K\e[1GAre you a human? \e[90m(y/N)\e[0m t",
208
+ "\e[2K\e[1GAre you a human? \e[90m(y/N)\e[0m te",
209
+ "\e[2K\e[1GAre you a human? \e[90m(y/N)\e[0m tes",
210
+ "\e[2K\e[1GAre you a human? \e[90m(y/N)\e[0m test",
211
+ "\e[31m>>\e[0m Invalid input.\e[1A",
212
+ "\e[2K\e[1GAre you a human? \e[90m(y/N)\e[0m ",
213
+ "\e[2K\e[1G\e[1A\e[2K\e[1G",
214
+ "Are you a human? \e[32mNo\e[0m\n"
215
+ ].join)
216
+ end
217
+
184
218
  it 'assumes default false' do
185
219
  prompt.input << "\r"
186
220
  prompt.input.rewind
@@ -11,7 +11,16 @@ Gem::Specification.new do |spec|
11
11
  spec.description = %q{A beautiful and powerful interactive command line prompt with a robust API for getting and validating complex inputs.}
12
12
  spec.homepage = "https://piotrmurach.github.io/tty"
13
13
  spec.license = "MIT"
14
-
14
+ if spec.respond_to?(:metadata=)
15
+ spec.metadata = {
16
+ "allowed_push_host" => "https://rubygems.org",
17
+ "bug_tracker_uri" => "https://github.com/piotrmurach/tty-prompt/issues",
18
+ "changelog_uri" => "https://github.com/piotrmurach/tty-prompt/blob/master/CHANGELOG.md",
19
+ "documentation_uri" => "https://www.rubydoc.info/gems/tty-prompt",
20
+ "homepage_uri" => spec.homepage,
21
+ "source_code_uri" => "https://github.com/piotrmurach/tty-prompt"
22
+ }
23
+ end
15
24
  spec.files = Dir['{lib,spec,examples}/**/*.rb']
16
25
  spec.files += Dir['tasks/*', 'tty-prompt.gemspec']
17
26
  spec.files += Dir['README.md', 'CHANGELOG.md', 'LICENSE.txt', 'Rakefile']
@@ -23,7 +32,7 @@ Gem::Specification.new do |spec|
23
32
 
24
33
  spec.add_dependency 'necromancer', '~> 0.5.0'
25
34
  spec.add_dependency 'pastel', '~> 0.7.0'
26
- spec.add_dependency 'tty-reader', '~> 0.6.0'
35
+ spec.add_dependency 'tty-reader', '~> 0.7.0'
27
36
 
28
37
  spec.add_development_dependency 'bundler', '>= 1.5.0'
29
38
  spec.add_development_dependency 'rake'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tty-prompt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.19.0
4
+ version: 0.20.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Murach
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-27 00:00:00.000000000 Z
11
+ date: 2019-11-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: necromancer
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 0.6.0
47
+ version: 0.7.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 0.6.0
54
+ version: 0.7.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: bundler
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +108,7 @@ files:
108
108
  - Rakefile
109
109
  - examples/ask.rb
110
110
  - examples/ask_blank.rb
111
+ - examples/ask_multiline.rb
111
112
  - examples/ask_valid.rb
112
113
  - examples/collect.rb
113
114
  - examples/echo.rb
@@ -237,7 +238,13 @@ files:
237
238
  homepage: https://piotrmurach.github.io/tty
238
239
  licenses:
239
240
  - MIT
240
- metadata: {}
241
+ metadata:
242
+ allowed_push_host: https://rubygems.org
243
+ bug_tracker_uri: https://github.com/piotrmurach/tty-prompt/issues
244
+ changelog_uri: https://github.com/piotrmurach/tty-prompt/blob/master/CHANGELOG.md
245
+ documentation_uri: https://www.rubydoc.info/gems/tty-prompt
246
+ homepage_uri: https://piotrmurach.github.io/tty
247
+ source_code_uri: https://github.com/piotrmurach/tty-prompt
241
248
  post_install_message:
242
249
  rdoc_options: []
243
250
  require_paths:
@@ -253,7 +260,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
253
260
  - !ruby/object:Gem::Version
254
261
  version: '0'
255
262
  requirements: []
256
- rubygems_version: 3.0.3
263
+ rubygems_version: 3.0.6
257
264
  signing_key:
258
265
  specification_version: 4
259
266
  summary: A beautiful and powerful interactive command line prompt.