tty-prompt 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +9 -6
  3. data/CHANGELOG.md +40 -3
  4. data/Gemfile +0 -1
  5. data/README.md +246 -65
  6. data/examples/ask.rb +7 -0
  7. data/examples/echo.rb +7 -0
  8. data/examples/in.rb +7 -0
  9. data/examples/mask.rb +9 -0
  10. data/examples/multi_select.rb +8 -0
  11. data/examples/select.rb +8 -0
  12. data/examples/validation.rb +9 -0
  13. data/examples/yes_no.rb +7 -0
  14. data/lib/tty-prompt.rb +6 -4
  15. data/lib/tty/prompt.rb +100 -25
  16. data/lib/tty/prompt/choice.rb +1 -1
  17. data/lib/tty/prompt/converter_dsl.rb +19 -0
  18. data/lib/tty/prompt/converter_registry.rb +56 -0
  19. data/lib/tty/prompt/converters.rb +77 -0
  20. data/lib/tty/prompt/evaluator.rb +29 -0
  21. data/lib/tty/prompt/list.rb +38 -36
  22. data/lib/tty/prompt/mask_question.rb +85 -0
  23. data/lib/tty/prompt/multi_list.rb +21 -32
  24. data/lib/tty/prompt/question.rb +184 -162
  25. data/lib/tty/prompt/question/checks.rb +85 -0
  26. data/lib/tty/prompt/question/modifier.rb +4 -5
  27. data/lib/tty/prompt/question/validation.rb +29 -35
  28. data/lib/tty/prompt/reader.rb +98 -52
  29. data/lib/tty/prompt/reader/codes.rb +63 -0
  30. data/lib/tty/prompt/reader/key_event.rb +67 -0
  31. data/lib/tty/prompt/reader/mode.rb +66 -0
  32. data/lib/tty/prompt/reader/mode/echo.rb +43 -0
  33. data/lib/tty/prompt/reader/mode/raw.rb +43 -0
  34. data/lib/tty/prompt/result.rb +42 -0
  35. data/lib/tty/prompt/statement.rb +9 -14
  36. data/lib/tty/prompt/suggestion.rb +4 -2
  37. data/lib/tty/prompt/symbols.rb +13 -0
  38. data/lib/tty/prompt/test.rb +3 -2
  39. data/lib/tty/prompt/utils.rb +1 -1
  40. data/lib/tty/prompt/version.rb +1 -1
  41. data/spec/unit/ask_spec.rb +31 -48
  42. data/spec/unit/choice/eql_spec.rb +0 -2
  43. data/spec/unit/choice/from_spec.rb +0 -2
  44. data/spec/unit/choices/add_spec.rb +0 -2
  45. data/spec/unit/choices/each_spec.rb +0 -2
  46. data/spec/unit/choices/new_spec.rb +0 -2
  47. data/spec/unit/choices/pluck_spec.rb +0 -2
  48. data/spec/unit/converters/convert_bool_spec.rb +58 -0
  49. data/spec/unit/{response/read_char_spec.rb → converters/convert_char_spec.rb} +2 -4
  50. data/spec/unit/converters/convert_custom_spec.rb +14 -0
  51. data/spec/unit/converters/convert_date_spec.rb +25 -0
  52. data/spec/unit/converters/convert_file_spec.rb +14 -0
  53. data/spec/unit/{response/read_number_spec.rb → converters/convert_number_spec.rb} +5 -7
  54. data/spec/unit/converters/convert_path_spec.rb +15 -0
  55. data/spec/unit/{response/read_range_spec.rb → converters/convert_range_spec.rb} +3 -5
  56. data/spec/unit/converters/convert_regex_spec.rb +12 -0
  57. data/spec/unit/converters/convert_string_spec.rb +21 -0
  58. data/spec/unit/distance/distance_spec.rb +0 -2
  59. data/spec/unit/error_spec.rb +0 -6
  60. data/spec/unit/evaluator_spec.rb +67 -0
  61. data/spec/unit/keypress_spec.rb +19 -0
  62. data/spec/unit/mask_spec.rb +95 -0
  63. data/spec/unit/multi_select_spec.rb +36 -24
  64. data/spec/unit/multiline_spec.rb +19 -0
  65. data/spec/unit/new_spec.rb +18 -0
  66. data/spec/unit/ok_spec.rb +10 -0
  67. data/spec/unit/question/default_spec.rb +17 -4
  68. data/spec/unit/question/echo_spec.rb +31 -0
  69. data/spec/unit/question/in_spec.rb +48 -16
  70. data/spec/unit/question/initialize_spec.rb +2 -9
  71. data/spec/unit/question/modifier/apply_to_spec.rb +9 -16
  72. data/spec/unit/question/modifier/letter_case_spec.rb +0 -2
  73. data/spec/unit/question/modifier/whitespace_spec.rb +12 -20
  74. data/spec/unit/question/modify_spec.rb +3 -7
  75. data/spec/unit/question/required_spec.rb +20 -14
  76. data/spec/unit/question/validate_spec.rb +20 -19
  77. data/spec/unit/question/validation/call_spec.rb +15 -6
  78. data/spec/unit/question/validation/coerce_spec.rb +17 -11
  79. data/spec/unit/reader/publish_keypress_event_spec.rb +81 -0
  80. data/spec/unit/reader/read_keypress_spec.rb +22 -0
  81. data/spec/unit/reader/read_line_spec.rb +31 -0
  82. data/spec/unit/reader/read_multiline_spec.rb +37 -0
  83. data/spec/unit/result_spec.rb +40 -0
  84. data/spec/unit/say_spec.rb +18 -23
  85. data/spec/unit/select_spec.rb +37 -32
  86. data/spec/unit/statement/initialize_spec.rb +4 -4
  87. data/spec/unit/suggest_spec.rb +0 -2
  88. data/spec/unit/warn_spec.rb +0 -5
  89. data/spec/unit/yes_no_spec.rb +70 -0
  90. data/tty-prompt.gemspec +7 -4
  91. metadata +123 -40
  92. data/lib/tty/prompt/codes.rb +0 -32
  93. data/lib/tty/prompt/cursor.rb +0 -131
  94. data/lib/tty/prompt/error.rb +0 -26
  95. data/lib/tty/prompt/mode.rb +0 -64
  96. data/lib/tty/prompt/mode/echo.rb +0 -41
  97. data/lib/tty/prompt/mode/raw.rb +0 -41
  98. data/lib/tty/prompt/response.rb +0 -247
  99. data/lib/tty/prompt/response_delegation.rb +0 -42
  100. data/spec/unit/cursor/new_spec.rb +0 -74
  101. data/spec/unit/question/character_spec.rb +0 -13
  102. data/spec/unit/reader/getc_spec.rb +0 -42
  103. data/spec/unit/response/read_bool_spec.rb +0 -58
  104. data/spec/unit/response/read_date_spec.rb +0 -16
  105. data/spec/unit/response/read_email_spec.rb +0 -45
  106. data/spec/unit/response/read_multiple_spec.rb +0 -21
  107. data/spec/unit/response/read_spec.rb +0 -69
  108. data/spec/unit/response/read_string_spec.rb +0 -14
@@ -1,7 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'spec_helper'
4
-
5
3
  RSpec.describe TTY::Prompt::Choice, '#==' do
6
4
  it "is true with the same name and value attributes" do
7
5
  expect(described_class.new(:large, 1)).
@@ -1,7 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'spec_helper'
4
-
5
3
  RSpec.describe TTY::Prompt::Choice, '#from' do
6
4
  it "creates choice from choice" do
7
5
  choice = described_class.new(:large, 1)
@@ -1,7 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'spec_helper'
4
-
5
3
  RSpec.describe TTY::Prompt::Choices, '#<<' do
6
4
  it "adds choice to collection" do
7
5
  choices = described_class.new
@@ -1,7 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'spec_helper'
4
-
5
3
  RSpec.describe TTY::Prompt::Choices, '.each' do
6
4
  it "iterates over collection" do
7
5
  choices = described_class[:large, :medium, :small]
@@ -1,7 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'spec_helper'
4
-
5
3
  RSpec.describe TTY::Prompt::Choices, '.new' do
6
4
  it "creates choices collection" do
7
5
  choice_1 = TTY::Prompt::Choice.from(:label1)
@@ -1,7 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'spec_helper'
4
-
5
3
  RSpec.describe TTY::Prompt::Choices, '.pluck' do
6
4
  it "plucks choice from collection by name" do
7
5
  collection = %w(large medium small)
@@ -0,0 +1,58 @@
1
+ # encoding: utf-8
2
+
3
+ RSpec.describe TTY::Prompt::Question, 'convert bool' do
4
+
5
+ subject(:prompt) { TTY::TestPrompt.new}
6
+
7
+ it 'fails to convert boolean' do
8
+ prompt.input << 'invalid'
9
+ prompt.input.rewind
10
+ expect {
11
+ prompt.ask("Do you read books?", convert: :bool)
12
+ }.to raise_error(Necromancer::ConversionTypeError)
13
+ end
14
+
15
+ it "handles default values" do
16
+ prompt.input << "\n"
17
+ prompt.input.rewind
18
+ response = prompt.ask('Do you read books?', convert: :bool, default: true)
19
+ expect(response).to eql(true)
20
+ expect(prompt.output.string).to eq([
21
+ "Do you read books? \e[90m(Y/n)\e[0m ",
22
+ "\e[1000D\e[K\e[1A",
23
+ "\e[1000D\e[K",
24
+ "Do you read books? \e[32mtrue\e[0m\n"
25
+ ].join)
26
+ end
27
+
28
+ it "handles default values" do
29
+ prompt.input << "\n"
30
+ prompt.input.rewind
31
+ response = prompt.ask("Do you read books?") { |q|
32
+ q.default true
33
+ q.convert :bool
34
+ }
35
+ expect(response).to eq(true)
36
+ end
37
+
38
+ it 'converts negative boolean' do
39
+ prompt.input << 'No'
40
+ prompt.input.rewind
41
+ response = prompt.ask('Do you read books?', convert: :bool)
42
+ expect(response).to eq(false)
43
+ end
44
+
45
+ it 'converts positive boolean' do
46
+ prompt.input << 'Yes'
47
+ prompt.input.rewind
48
+ response = prompt.ask("Do you read books?", convert: :bool)
49
+ expect(response).to eq(true)
50
+ end
51
+
52
+ it 'converts single positive boolean' do
53
+ prompt.input << 'y'
54
+ prompt.input.rewind
55
+ response = prompt.ask('Do you read books?', convert: :bool)
56
+ expect(response).to eq(true)
57
+ end
58
+ end
@@ -1,13 +1,11 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'spec_helper'
4
-
5
- RSpec.describe TTY::Prompt::Question, '#read_char' do
3
+ RSpec.describe TTY::Prompt::Question, 'convert char' do
6
4
  it 'reads single character' do
7
5
  prompt = TTY::TestPrompt.new
8
6
  prompt.input << "abcde"
9
7
  prompt.input.rewind
10
- response = prompt.ask("What is your favourite letter?", read: :char)
8
+ response = prompt.ask("What is your favourite letter?", convert: :char)
11
9
  expect(response).to eq('a')
12
10
  end
13
11
  end
@@ -0,0 +1,14 @@
1
+ # encoding: utf-8
2
+
3
+ RSpec.describe TTY::Prompt::Question, 'convert custom' do
4
+
5
+ subject(:prompt) { TTY::TestPrompt.new }
6
+
7
+ it 'converts response with custom conversion' do
8
+ prompt.input << "one,two,three\n"
9
+ prompt.input.rewind
10
+ conversion = proc { |input| input.split(/,\s*/) }
11
+ answer = prompt.ask('Ingredients? (comma sep list)', convert: conversion)
12
+ expect(answer).to eq(['one','two','three'])
13
+ end
14
+ end
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+
3
+ RSpec.describe TTY::Prompt::Question, 'convert date' do
4
+ it 'converts date' do
5
+ prompt = TTY::TestPrompt.new
6
+ prompt.input << "20th April 1887"
7
+ prompt.input.rewind
8
+ response = prompt.ask("When were your born?", convert: :date)
9
+ expect(response).to be_kind_of(Date)
10
+ expect(response.day).to eq(20)
11
+ expect(response.month).to eq(4)
12
+ expect(response.year).to eq(1887)
13
+ end
14
+
15
+ it "converts datetime" do
16
+ prompt = TTY::TestPrompt.new
17
+ prompt.input << "20th April 1887"
18
+ prompt.input.rewind
19
+ response = prompt.ask("When were your born?", convert: :datetime)
20
+ expect(response).to be_kind_of(DateTime)
21
+ expect(response.day).to eq(20)
22
+ expect(response.month).to eq(4)
23
+ expect(response.year).to eq(1887)
24
+ end
25
+ end
@@ -0,0 +1,14 @@
1
+ # encoding: utf-8
2
+
3
+ RSpec.describe TTY::Prompt::Question, 'convert file' do
4
+ it "converts to file" do
5
+ file = double(:file)
6
+ allow(File).to receive(:open).with(/test\.txt/).and_return(file)
7
+ prompt = TTY::TestPrompt.new
8
+ prompt.input << "test.txt"
9
+ prompt.input.rewind
10
+ answer = prompt.ask("Which file to open?", convert: :file)
11
+ expect(answer).to eq(file)
12
+ # expect(File).to have_received(:open).with(/test\.txt/)
13
+ end
14
+ end
@@ -1,23 +1,21 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'spec_helper'
4
-
5
- RSpec.describe TTY::Prompt::Question, '#read_numbers' do
6
- it 'reads integer' do
3
+ RSpec.describe TTY::Prompt::Question, 'convert numbers' do
4
+ it 'converts integer' do
7
5
  prompt = TTY::TestPrompt.new
8
6
  prompt.input << 35
9
7
  prompt.input.rewind
10
- answer = prompt.ask("What temperature?", read: :int)
8
+ answer = prompt.ask("What temperature?", convert: :int)
11
9
  expect(answer).to be_a(Integer)
12
10
  expect(answer).to eq(35)
13
11
  end
14
12
 
15
- it 'reads float' do
13
+ it 'converts float' do
16
14
  prompt = TTY::TestPrompt.new
17
15
  number = 6.666
18
16
  prompt.input << number
19
17
  prompt.input.rewind
20
- answer = prompt.ask('How tall are you?', read: :float)
18
+ answer = prompt.ask('How tall are you?', convert: :float)
21
19
  expect(answer).to be_a(Float)
22
20
  expect(answer).to eq(number)
23
21
  end
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+
3
+ RSpec.describe TTY::Prompt::Question, 'convert path' do
4
+ subject(:prompt) { TTY::TestPrompt.new }
5
+
6
+ it "converts pathname" do
7
+ path = double(:path)
8
+ allow(Pathname).to receive(:new).and_return(path)
9
+ prompt.input << "/path/to/file"
10
+ prompt.input.rewind
11
+ answer = prompt.ask('File location?', convert: :path)
12
+ # expect(Pathname).to have_received(:new).with(/path\/to\/file/)
13
+ expect(answer).to eql(path)
14
+ end
15
+ end
@@ -1,13 +1,11 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'spec_helper'
4
-
5
- RSpec.describe TTY::Prompt::Question, '#read_range' do
3
+ RSpec.describe TTY::Prompt::Question, 'convert range' do
6
4
  it 'converts with valid range' do
7
5
  prompt = TTY::TestPrompt.new
8
6
  prompt.input << "20-30"
9
7
  prompt.input.rewind
10
- answer = prompt.ask("Which age group?", read: :range)
8
+ answer = prompt.ask("Which age group?", convert: :range)
11
9
  expect(answer).to be_a(Range)
12
10
  expect(answer).to eq(20..30)
13
11
  end
@@ -17,7 +15,7 @@ RSpec.describe TTY::Prompt::Question, '#read_range' do
17
15
  prompt.input << "abcd"
18
16
  prompt.input.rewind
19
17
  expect {
20
- prompt.ask('Which age group?', read: :range)
18
+ prompt.ask('Which age group?', convert: :range)
21
19
  }.to raise_error(Necromancer::ConversionTypeError)
22
20
  end
23
21
  end
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+
3
+ RSpec.describe TTY::Prompt::Question, 'convert regexp' do
4
+ it "converts regex" do
5
+ prompt = TTY::TestPrompt.new
6
+ prompt.input << "[a-z]*"
7
+ prompt.input.rewind
8
+ answer = prompt.ask("Regex?", convert: :regexp)
9
+ expect(answer).to be_a(Regexp)
10
+ expect(answer).to eq(/[a-z]*/)
11
+ end
12
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+
3
+ RSpec.describe TTY::Prompt::Question, 'convert string' do
4
+ it 'converts string' do
5
+ prompt = TTY::TestPrompt.new
6
+ prompt.input << 'Piotr'
7
+ prompt.input.rewind
8
+ answer = prompt.ask("What is your name?", convert: :string)
9
+ expect(answer).to be_a(String)
10
+ expect(answer).to eq('Piotr')
11
+ end
12
+
13
+ it "converts symbol" do
14
+ prompt = TTY::TestPrompt.new
15
+ prompt.input << 'Piotr'
16
+ prompt.input.rewind
17
+ answer = prompt.ask("What is your name?", convert: :symbol)
18
+ expect(answer).to be_a(Symbol)
19
+ expect(answer).to eq(:Piotr)
20
+ end
21
+ end
@@ -1,7 +1,5 @@
1
1
  # coding: utf-8
2
2
 
3
- require 'spec_helper'
4
-
5
3
  RSpec.describe TTY::Prompt::Distance, '.distance' do
6
4
  let(:object) { described_class.new }
7
5
 
@@ -1,14 +1,8 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'spec_helper'
4
-
5
3
  RSpec.describe TTY::Prompt, '.error' do
6
- let(:color) { Pastel.new(enabled: true) }
7
-
8
4
  subject(:prompt) { TTY::TestPrompt.new }
9
5
 
10
- before { allow(Pastel).to receive(:new).and_return(color) }
11
-
12
6
  it 'displays one message' do
13
7
  prompt.error "Nothing is fine!"
14
8
  expect(prompt.output.string).to eql "\e[31mNothing is fine!\e[0m\n"
@@ -0,0 +1,67 @@
1
+ # encoding: utf-8
2
+
3
+ RSpec.describe TTY::Prompt::Evaluator do
4
+ it "checks chained validation procs" do
5
+ question = double(:question)
6
+ evaluator = TTY::Prompt::Evaluator.new(question)
7
+
8
+ evaluator.check { |quest, value|
9
+ if value < 21
10
+ [value, ["#{value} is not bigger than 21"]]
11
+ else
12
+ value
13
+ end
14
+ }
15
+
16
+ evaluator.check { |quest, value|
17
+ if value < 42
18
+ [value, ["#{value} is not bigger than 42"]]
19
+ else
20
+ value
21
+ end
22
+ }
23
+
24
+ answer = evaluator.call(2)
25
+ expect(answer.errors.count).to eq(2)
26
+ expect(answer.value).to eq(2)
27
+ expect(answer.success?).to eq(false)
28
+ expect(answer.failure?).to eq(true)
29
+ end
30
+
31
+ it "checks chained validation objects" do
32
+ question = double(:question)
33
+ evaluator = TTY::Prompt::Evaluator.new(question)
34
+
35
+ LessThan21 = Class.new do
36
+ def self.call(quest, value)
37
+ if value < 21
38
+ [value, ["#{value} is not bigger than 21"]]
39
+ else
40
+ value
41
+ end
42
+ end
43
+ end
44
+
45
+ LessThan42 = Class.new do
46
+ def self.call(quest, value)
47
+ if value < 42
48
+ [value, ["#{value} is not bigger than 42"]]
49
+ else
50
+ value
51
+ end
52
+ end
53
+ end
54
+
55
+ evaluator.check(LessThan21)
56
+ evaluator.check(LessThan42)
57
+
58
+ answer = evaluator.call(2)
59
+ expect(answer.errors).to match_array([
60
+ "2 is not bigger than 21",
61
+ "2 is not bigger than 42"
62
+ ])
63
+ expect(answer.value).to eq(2)
64
+ expect(answer.success?).to eq(false)
65
+ expect(answer.failure?).to eq(true)
66
+ end
67
+ end
@@ -0,0 +1,19 @@
1
+ # encoding: utf-8
2
+
3
+ RSpec.describe TTY::Prompt::Question, 'ask keypress' do
4
+ it 'asks for a keypress with :read option' do
5
+ prompt = TTY::TestPrompt.new
6
+ prompt.input << "abcd"
7
+ prompt.input.rewind
8
+ answer = prompt.ask("Which one do you prefer a, b, c or d?", read: :keypress)
9
+ expect(answer).to eq("a")
10
+ end
11
+
12
+ it 'asks for a keypress with method' do
13
+ prompt = TTY::TestPrompt.new
14
+ prompt.input << "abcd"
15
+ prompt.input.rewind
16
+ answer = prompt.keypress("Which one do you prefer a, b, c or d?")
17
+ expect(answer).to eq("a")
18
+ end
19
+ end
@@ -0,0 +1,95 @@
1
+ # encoding: utf-8
2
+
3
+ RSpec.describe TTY::Prompt, '#mask' do
4
+
5
+ subject(:prompt) { TTY::TestPrompt.new }
6
+
7
+ it "masks output by default" do
8
+ prompt.input << "pass\r"
9
+ prompt.input.rewind
10
+ answer = prompt.mask("What is your password?")
11
+ expect(answer).to eql("pass")
12
+ expect(prompt.output.string).to eq([
13
+ "What is your password? ",
14
+ "\e[1000D\e[K",
15
+ "What is your password? •",
16
+ "\e[1000D\e[K",
17
+ "What is your password? ••",
18
+ "\e[1000D\e[K",
19
+ "What is your password? •••",
20
+ "\e[1000D\e[K",
21
+ "What is your password? ••••",
22
+ "\e[1000D\e[K",
23
+ "What is your password? \e[32m••••\e[0m\n",
24
+ "\e[1000D\e[K\e[1A\e[1000D\e[K",
25
+ "What is your password? \e[32m••••\e[0m\n"
26
+ ].join)
27
+ end
28
+
29
+ it 'masks output with custom character' do
30
+ prompt.input << "pass\r"
31
+ prompt.input.rewind
32
+ answer = prompt.mask("What is your password?") { |q| q.mask('*') }
33
+ expect(answer).to eql("pass")
34
+ expect(prompt.output.string).to eq([
35
+ "What is your password? ",
36
+ "\e[1000D\e[K",
37
+ "What is your password? *",
38
+ "\e[1000D\e[K",
39
+ "What is your password? **",
40
+ "\e[1000D\e[K",
41
+ "What is your password? ***",
42
+ "\e[1000D\e[K",
43
+ "What is your password? ****",
44
+ "\e[1000D\e[K",
45
+ "What is your password? \e[32m****\e[0m\n",
46
+ "\e[1000D\e[K\e[1A\e[1000D\e[K",
47
+ "What is your password? \e[32m****\e[0m\n",
48
+ ].join)
49
+ end
50
+
51
+ it "masks with unicode character" do
52
+ prompt.input << "lov\n"
53
+ prompt.input.rewind
54
+ answer = prompt.mask("What is your password?", mask: "\u2665")
55
+ expect(answer).to eql("lov")
56
+ expect(prompt.output.string).to eq([
57
+ "What is your password? ",
58
+ "\e[1000D\e[K",
59
+ "What is your password? ♥",
60
+ "\e[1000D\e[K",
61
+ "What is your password? ♥♥",
62
+ "\e[1000D\e[K",
63
+ "What is your password? ♥♥♥",
64
+ "\e[1000D\e[K",
65
+ "What is your password? \e[32m♥♥♥\e[0m\n",
66
+ "\e[1000D\e[K\e[1A\e[1000D\e[K",
67
+ "What is your password? \e[32m♥♥♥\e[0m\n",
68
+ ].join)
69
+ end
70
+
71
+ it 'ignores mask if echo is off' do
72
+ prompt.input << "pass\n"
73
+ prompt.input.rewind
74
+ answer = prompt.mask('What is your password?') do |q|
75
+ q.echo false
76
+ q.mask '*'
77
+ end
78
+ expect(answer).to eql("pass")
79
+ expect(prompt.output.string).to eq([
80
+ "What is your password? ",
81
+ "\e[1000D\e[K",
82
+ "What is your password? ",
83
+ "\e[1000D\e[K",
84
+ "What is your password? ",
85
+ "\e[1000D\e[K",
86
+ "What is your password? ",
87
+ "\e[1000D\e[K",
88
+ "What is your password? ",
89
+ "\e[1000D\e[K",
90
+ "What is your password? \n",
91
+ "\e[1000D\e[K",
92
+ "What is your password? \n",
93
+ ].join)
94
+ end
95
+ end