tty-prompt 0.19.0 → 0.20.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: 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.