tty-prompt 0.2.0 → 0.3.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 +4 -4
- data/.travis.yml +9 -6
- data/CHANGELOG.md +40 -3
- data/Gemfile +0 -1
- data/README.md +246 -65
- data/examples/ask.rb +7 -0
- data/examples/echo.rb +7 -0
- data/examples/in.rb +7 -0
- data/examples/mask.rb +9 -0
- data/examples/multi_select.rb +8 -0
- data/examples/select.rb +8 -0
- data/examples/validation.rb +9 -0
- data/examples/yes_no.rb +7 -0
- data/lib/tty-prompt.rb +6 -4
- data/lib/tty/prompt.rb +100 -25
- data/lib/tty/prompt/choice.rb +1 -1
- data/lib/tty/prompt/converter_dsl.rb +19 -0
- data/lib/tty/prompt/converter_registry.rb +56 -0
- data/lib/tty/prompt/converters.rb +77 -0
- data/lib/tty/prompt/evaluator.rb +29 -0
- data/lib/tty/prompt/list.rb +38 -36
- data/lib/tty/prompt/mask_question.rb +85 -0
- data/lib/tty/prompt/multi_list.rb +21 -32
- data/lib/tty/prompt/question.rb +184 -162
- data/lib/tty/prompt/question/checks.rb +85 -0
- data/lib/tty/prompt/question/modifier.rb +4 -5
- data/lib/tty/prompt/question/validation.rb +29 -35
- data/lib/tty/prompt/reader.rb +98 -52
- data/lib/tty/prompt/reader/codes.rb +63 -0
- data/lib/tty/prompt/reader/key_event.rb +67 -0
- data/lib/tty/prompt/reader/mode.rb +66 -0
- data/lib/tty/prompt/reader/mode/echo.rb +43 -0
- data/lib/tty/prompt/reader/mode/raw.rb +43 -0
- data/lib/tty/prompt/result.rb +42 -0
- data/lib/tty/prompt/statement.rb +9 -14
- data/lib/tty/prompt/suggestion.rb +4 -2
- data/lib/tty/prompt/symbols.rb +13 -0
- data/lib/tty/prompt/test.rb +3 -2
- data/lib/tty/prompt/utils.rb +1 -1
- data/lib/tty/prompt/version.rb +1 -1
- data/spec/unit/ask_spec.rb +31 -48
- data/spec/unit/choice/eql_spec.rb +0 -2
- data/spec/unit/choice/from_spec.rb +0 -2
- data/spec/unit/choices/add_spec.rb +0 -2
- data/spec/unit/choices/each_spec.rb +0 -2
- data/spec/unit/choices/new_spec.rb +0 -2
- data/spec/unit/choices/pluck_spec.rb +0 -2
- data/spec/unit/converters/convert_bool_spec.rb +58 -0
- data/spec/unit/{response/read_char_spec.rb → converters/convert_char_spec.rb} +2 -4
- data/spec/unit/converters/convert_custom_spec.rb +14 -0
- data/spec/unit/converters/convert_date_spec.rb +25 -0
- data/spec/unit/converters/convert_file_spec.rb +14 -0
- data/spec/unit/{response/read_number_spec.rb → converters/convert_number_spec.rb} +5 -7
- data/spec/unit/converters/convert_path_spec.rb +15 -0
- data/spec/unit/{response/read_range_spec.rb → converters/convert_range_spec.rb} +3 -5
- data/spec/unit/converters/convert_regex_spec.rb +12 -0
- data/spec/unit/converters/convert_string_spec.rb +21 -0
- data/spec/unit/distance/distance_spec.rb +0 -2
- data/spec/unit/error_spec.rb +0 -6
- data/spec/unit/evaluator_spec.rb +67 -0
- data/spec/unit/keypress_spec.rb +19 -0
- data/spec/unit/mask_spec.rb +95 -0
- data/spec/unit/multi_select_spec.rb +36 -24
- data/spec/unit/multiline_spec.rb +19 -0
- data/spec/unit/new_spec.rb +18 -0
- data/spec/unit/ok_spec.rb +10 -0
- data/spec/unit/question/default_spec.rb +17 -4
- data/spec/unit/question/echo_spec.rb +31 -0
- data/spec/unit/question/in_spec.rb +48 -16
- data/spec/unit/question/initialize_spec.rb +2 -9
- data/spec/unit/question/modifier/apply_to_spec.rb +9 -16
- data/spec/unit/question/modifier/letter_case_spec.rb +0 -2
- data/spec/unit/question/modifier/whitespace_spec.rb +12 -20
- data/spec/unit/question/modify_spec.rb +3 -7
- data/spec/unit/question/required_spec.rb +20 -14
- data/spec/unit/question/validate_spec.rb +20 -19
- data/spec/unit/question/validation/call_spec.rb +15 -6
- data/spec/unit/question/validation/coerce_spec.rb +17 -11
- data/spec/unit/reader/publish_keypress_event_spec.rb +81 -0
- data/spec/unit/reader/read_keypress_spec.rb +22 -0
- data/spec/unit/reader/read_line_spec.rb +31 -0
- data/spec/unit/reader/read_multiline_spec.rb +37 -0
- data/spec/unit/result_spec.rb +40 -0
- data/spec/unit/say_spec.rb +18 -23
- data/spec/unit/select_spec.rb +37 -32
- data/spec/unit/statement/initialize_spec.rb +4 -4
- data/spec/unit/suggest_spec.rb +0 -2
- data/spec/unit/warn_spec.rb +0 -5
- data/spec/unit/yes_no_spec.rb +70 -0
- data/tty-prompt.gemspec +7 -4
- metadata +123 -40
- data/lib/tty/prompt/codes.rb +0 -32
- data/lib/tty/prompt/cursor.rb +0 -131
- data/lib/tty/prompt/error.rb +0 -26
- data/lib/tty/prompt/mode.rb +0 -64
- data/lib/tty/prompt/mode/echo.rb +0 -41
- data/lib/tty/prompt/mode/raw.rb +0 -41
- data/lib/tty/prompt/response.rb +0 -247
- data/lib/tty/prompt/response_delegation.rb +0 -42
- data/spec/unit/cursor/new_spec.rb +0 -74
- data/spec/unit/question/character_spec.rb +0 -13
- data/spec/unit/reader/getc_spec.rb +0 -42
- data/spec/unit/response/read_bool_spec.rb +0 -58
- data/spec/unit/response/read_date_spec.rb +0 -16
- data/spec/unit/response/read_email_spec.rb +0 -45
- data/spec/unit/response/read_multiple_spec.rb +0 -21
- data/spec/unit/response/read_spec.rb +0 -69
- data/spec/unit/response/read_string_spec.rb +0 -14
@@ -1,10 +1,10 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
3
|
RSpec.describe TTY::Prompt::Question, '#modify' do
|
4
|
+
|
5
|
+
subject(:prompt) { TTY::TestPrompt.new }
|
6
|
+
|
6
7
|
it 'preserves answer for unkown modification' do
|
7
|
-
prompt = TTY::TestPrompt.new
|
8
8
|
prompt.input << 'piotr'
|
9
9
|
prompt.input.rewind
|
10
10
|
answer = prompt.ask("What is your name?") { |q| q.modify(:none) }
|
@@ -12,7 +12,6 @@ RSpec.describe TTY::Prompt::Question, '#modify' do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'converts to upper case' do
|
15
|
-
prompt = TTY::TestPrompt.new
|
16
15
|
prompt.input << 'piotr'
|
17
16
|
prompt.input.rewind
|
18
17
|
answer = prompt.ask("What is your name?") { |q| q.modify(:upcase) }
|
@@ -20,7 +19,6 @@ RSpec.describe TTY::Prompt::Question, '#modify' do
|
|
20
19
|
end
|
21
20
|
|
22
21
|
it 'trims whitespace' do
|
23
|
-
prompt = TTY::TestPrompt.new
|
24
22
|
prompt.input << " Some white\t space\t \there! \n"
|
25
23
|
prompt.input.rewind
|
26
24
|
answer = prompt.ask('Enter some text: ') { |q| q.modify(:trim) }
|
@@ -28,7 +26,6 @@ RSpec.describe TTY::Prompt::Question, '#modify' do
|
|
28
26
|
end
|
29
27
|
|
30
28
|
it 'collapses whitespace' do
|
31
|
-
prompt = TTY::TestPrompt.new
|
32
29
|
prompt.input << " Some white\t space\t \there! \n"
|
33
30
|
prompt.input.rewind
|
34
31
|
answer = prompt.ask('Enter some text: ') { |q| q.modify(:collapse) }
|
@@ -36,7 +33,6 @@ RSpec.describe TTY::Prompt::Question, '#modify' do
|
|
36
33
|
end
|
37
34
|
|
38
35
|
it 'strips and collapses whitespace' do
|
39
|
-
prompt = TTY::TestPrompt.new
|
40
36
|
prompt.input << " Some white\t space\t \there! \n"
|
41
37
|
prompt.input.rewind
|
42
38
|
answer = prompt.ask('Enter some text: ') { |q| q.modify(:strip, :collapse) }
|
@@ -1,28 +1,34 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
3
|
RSpec.describe TTY::Prompt::Question, '#required' do
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
|
5
|
+
subject(:prompt) { TTY::TestPrompt.new }
|
6
|
+
|
7
|
+
it 'requires value to be present' do
|
8
|
+
prompt.input << "Piotr"
|
9
9
|
prompt.input.rewind
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
prompt.ask('What is your name?') { |q| q.required(true) }
|
11
|
+
expect(prompt.output.string).to eq([
|
12
|
+
"What is your name? ",
|
13
|
+
"\e[1000D\e[K\e[1A",
|
14
|
+
"\e[1000D\e[K",
|
15
|
+
"What is your name? \e[32mPiotr\e[0m\n"
|
16
|
+
].join)
|
13
17
|
end
|
14
18
|
|
15
19
|
it 'requires value to be present with option' do
|
16
|
-
prompt
|
17
|
-
prompt.input << ''
|
20
|
+
prompt.input << "Piotr"
|
18
21
|
prompt.input.rewind
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
+
prompt.ask('What is your name?') { |q| q.required(true) }
|
23
|
+
expect(prompt.output.string).to eq([
|
24
|
+
"What is your name? ",
|
25
|
+
"\e[1000D\e[K\e[1A",
|
26
|
+
"\e[1000D\e[K",
|
27
|
+
"What is your name? \e[32mPiotr\e[0m\n"
|
28
|
+
].join)
|
22
29
|
end
|
23
30
|
|
24
31
|
it "doesn't require value to be present" do
|
25
|
-
prompt = TTY::TestPrompt.new
|
26
32
|
prompt.input << ''
|
27
33
|
prompt.input.rewind
|
28
34
|
answer = prompt.ask('What is your name?') { |q| q.required(false) }
|
@@ -1,38 +1,39 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
3
|
RSpec.describe TTY::Prompt::Question, '#validate' do
|
6
|
-
|
7
|
-
|
8
|
-
prompt.input << 'piotrmurach'
|
9
|
-
prompt.input.rewind
|
10
|
-
expect {
|
11
|
-
prompt.ask('What is your username?') { |q|
|
12
|
-
q.validate(/^[^\.]+\.[^\.]+/)
|
13
|
-
}
|
14
|
-
}.to raise_error(ArgumentError)
|
15
|
-
end
|
4
|
+
|
5
|
+
subject(:prompt) { TTY::TestPrompt.new }
|
16
6
|
|
17
7
|
it 'validates input with regex' do
|
18
|
-
prompt = TTY::TestPrompt.new
|
19
8
|
prompt.input << 'piotr.murach'
|
20
9
|
prompt.input.rewind
|
21
|
-
answer = prompt.ask('What is your username?')
|
10
|
+
answer = prompt.ask('What is your username?') do |q|
|
22
11
|
q.validate(/^[^\.]+\.[^\.]+/)
|
23
|
-
|
12
|
+
end
|
24
13
|
expect(answer).to eq('piotr.murach')
|
14
|
+
expect(prompt.output.string).to eq([
|
15
|
+
"What is your username? ",
|
16
|
+
"\e[1000D\e[K\e[1A",
|
17
|
+
"\e[1000D\e[K",
|
18
|
+
"What is your username? \e[32mpiotr.murach\e[0m\n"
|
19
|
+
].join)
|
25
20
|
end
|
26
21
|
|
27
22
|
it 'validates input with proc' do
|
28
|
-
prompt = TTY::TestPrompt.new
|
29
23
|
prompt.input << 'piotr.murach'
|
30
24
|
prompt.input.rewind
|
31
|
-
answer = prompt.ask('What is your username?')
|
25
|
+
answer = prompt.ask('What is your username?') do |q|
|
32
26
|
q.validate { |input| input =~ /^[^\.]+\.[^\.]+/ }
|
33
|
-
|
27
|
+
end
|
34
28
|
expect(answer).to eq('piotr.murach')
|
35
29
|
end
|
36
30
|
|
37
|
-
it 'understands custom validation like :email'
|
31
|
+
it 'understands custom validation like :email' do
|
32
|
+
prompt.input << 'piotr@example.com'
|
33
|
+
prompt.input.rewind
|
34
|
+
answer = prompt.ask('What is your email?') do |q|
|
35
|
+
q.validate :email
|
36
|
+
end
|
37
|
+
expect(answer).to eq('piotr@example.com')
|
38
|
+
end
|
38
39
|
end
|
@@ -1,22 +1,31 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
3
|
RSpec.describe TTY::Prompt::Question::Validation, '#call' do
|
6
4
|
let(:pattern) { /^[^\.]+\.[^\.]+/ }
|
7
|
-
let(:validation) { described_class.new(pattern) }
|
8
5
|
|
9
6
|
it "validates nil input" do
|
7
|
+
validation = described_class.new(pattern)
|
10
8
|
expect(validation.(nil)).to eq(false)
|
11
9
|
end
|
12
10
|
|
13
11
|
it "validates successfully when the value matches pattern" do
|
12
|
+
validation = described_class.new(pattern)
|
14
13
|
expect(validation.('piotr.murach')).to eq(true)
|
15
14
|
end
|
16
15
|
|
16
|
+
it "validates with a proc" do
|
17
|
+
pat = proc { |input| !pattern.match(input).nil? }
|
18
|
+
validation = described_class.new(pat)
|
19
|
+
expect(validation.call('piotr.murach')).to eq(true)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "validates with custom name" do
|
23
|
+
validation = described_class.new(:email)
|
24
|
+
expect(validation.call('piotr@example.com')).to eq(true)
|
25
|
+
end
|
26
|
+
|
17
27
|
it "fails validation when not maching pattern" do
|
18
|
-
|
19
|
-
|
20
|
-
}.to raise_error(TTY::Prompt::InvalidArgument)
|
28
|
+
validation = described_class.new(pattern)
|
29
|
+
expect(validation.('piotrmurach')).to eq(false)
|
21
30
|
end
|
22
31
|
end
|
@@ -1,24 +1,30 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
3
|
RSpec.describe TTY::Prompt::Question::Validation, '#coerce' do
|
6
4
|
let(:instance) { described_class.new }
|
7
5
|
|
8
|
-
it "coerces into proc" do
|
9
|
-
|
10
|
-
|
6
|
+
it "coerces lambda into proc" do
|
7
|
+
pattern = lambda { "^[^\.]+\.[^\.]+" }
|
8
|
+
validation = described_class.new(pattern)
|
9
|
+
expect(validation.pattern).to be_a(Proc)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "doesn't coerce symbols" do
|
13
|
+
pattern = :email
|
14
|
+
validation =described_class.new(pattern)
|
15
|
+
expect(validation.pattern).to eq(:email)
|
11
16
|
end
|
12
17
|
|
13
|
-
it "
|
14
|
-
|
15
|
-
|
18
|
+
it "coerces into regex" do
|
19
|
+
pattern = /^[^\.]+\.[^\.]+/
|
20
|
+
validation = described_class.new(pattern)
|
21
|
+
expect(validation.pattern).to be_a(Regexp)
|
16
22
|
end
|
17
23
|
|
18
|
-
it "fails to coerce validation" do
|
19
|
-
|
24
|
+
it "fails to coerce pattern into validation" do
|
25
|
+
pattern = Object.new
|
20
26
|
expect {
|
21
|
-
|
27
|
+
described_class.new(pattern)
|
22
28
|
}.to raise_error(TTY::Prompt::ValidationCoercion)
|
23
29
|
end
|
24
30
|
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
RSpec.describe TTY::Prompt::Reader, '#publish_keypress_event' do
|
4
|
+
let(:input) { StringIO.new }
|
5
|
+
let(:out) { StringIO.new }
|
6
|
+
let(:reader) { described_class.new(input, out) }
|
7
|
+
|
8
|
+
it "publishes :keypress events" do
|
9
|
+
input << "abc\n"
|
10
|
+
input.rewind
|
11
|
+
chars = []
|
12
|
+
reader.on(:keypress) { |event| chars << event.value }
|
13
|
+
answer = reader.read_line
|
14
|
+
expect(chars).to eq(%w(a b c))
|
15
|
+
expect(answer).to eq("abc")
|
16
|
+
end
|
17
|
+
|
18
|
+
it "publishes :keyup for read_keypress" do
|
19
|
+
input << "\e[Aaa"
|
20
|
+
input.rewind
|
21
|
+
keys = []
|
22
|
+
reader.on(:keypress) { |event| keys << "keypress_#{event.value}" }
|
23
|
+
reader.on(:keyup) { |event| keys << "keyup_#{event.value}" }
|
24
|
+
reader.on(:keydown) { |event| keys << "keydown_#{event.value}" }
|
25
|
+
|
26
|
+
answer = reader.read_keypress
|
27
|
+
expect(keys).to eq(["keyup_\e[A", "keypress_\e[A"])
|
28
|
+
expect(answer).to eq("\e[A")
|
29
|
+
end
|
30
|
+
|
31
|
+
it "publishes :keydown event for read_keypress" do
|
32
|
+
input << "\e[Baa"
|
33
|
+
input.rewind
|
34
|
+
keys = []
|
35
|
+
reader.on(:keypress) { |event| keys << "keypress_#{event.value}" }
|
36
|
+
reader.on(:keyup) { |event| keys << "keyup_#{event.value}" }
|
37
|
+
reader.on(:keydown) { |event| keys << "keydown_#{event.value}" }
|
38
|
+
|
39
|
+
answer = reader.read_keypress
|
40
|
+
expect(keys).to eq(["keydown_\e[B", "keypress_\e[B"])
|
41
|
+
expect(answer).to eq("\e[B")
|
42
|
+
end
|
43
|
+
|
44
|
+
it "publishes :keynum event" do
|
45
|
+
input << "5aa"
|
46
|
+
input.rewind
|
47
|
+
keys = []
|
48
|
+
reader.on(:keypress) { |event| keys << "keypress_#{event.value}" }
|
49
|
+
reader.on(:keyup) { |event| keys << "keyup_#{event.value}" }
|
50
|
+
reader.on(:keynum) { |event| keys << "keynum_#{event.value}" }
|
51
|
+
|
52
|
+
answer = reader.read_keypress
|
53
|
+
expect(keys).to eq(["keynum_5", "keypress_5"])
|
54
|
+
expect(answer).to eq("5")
|
55
|
+
end
|
56
|
+
|
57
|
+
it "publishes :keyreturn event" do
|
58
|
+
input << "\r"
|
59
|
+
input.rewind
|
60
|
+
keys = []
|
61
|
+
reader.on(:keypress) { |event| keys << "keypress" }
|
62
|
+
reader.on(:keyup) { |event| keys << "keyup" }
|
63
|
+
reader.on(:keyreturn) { |event| keys << "keyreturn" }
|
64
|
+
|
65
|
+
answer = reader.read_keypress
|
66
|
+
expect(keys).to eq(["keyreturn", "keypress"])
|
67
|
+
expect(answer).to eq("\r")
|
68
|
+
end
|
69
|
+
|
70
|
+
it "subscribes to multiple events" do
|
71
|
+
input << "\n"
|
72
|
+
input.rewind
|
73
|
+
keys = []
|
74
|
+
reader.on(:keyenter) { |event| keys << "keyenter" }
|
75
|
+
.on(:keypress) { |event| keys << "keypress" }
|
76
|
+
|
77
|
+
answer = reader.read_keypress
|
78
|
+
expect(keys).to eq(["keyenter", "keypress"])
|
79
|
+
expect(answer).to eq("\n")
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
RSpec.describe TTY::Prompt::Reader, '#read_keypress' do
|
4
|
+
let(:input) { StringIO.new }
|
5
|
+
let(:out) { StringIO.new }
|
6
|
+
let(:reader) { described_class.new(input, out) }
|
7
|
+
|
8
|
+
it "reads single key press" do
|
9
|
+
input << "\e[Aaaaaaa\n"
|
10
|
+
input.rewind
|
11
|
+
answer = reader.read_keypress
|
12
|
+
expect(answer).to eq("\e[A")
|
13
|
+
end
|
14
|
+
|
15
|
+
it "stops reading when ctrl-c pressed" do
|
16
|
+
input << "\x03"
|
17
|
+
input.rewind
|
18
|
+
expect {
|
19
|
+
reader.read_keypress
|
20
|
+
}.to raise_error(SystemExit)
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
RSpec.describe TTY::Prompt::Reader, '#read_line' do
|
4
|
+
let(:input) { StringIO.new }
|
5
|
+
let(:output) { StringIO.new }
|
6
|
+
|
7
|
+
subject(:reader) { described_class.new(input, output) }
|
8
|
+
|
9
|
+
it 'masks characters' do
|
10
|
+
mask = '*'
|
11
|
+
input << "password\n"
|
12
|
+
input.rewind
|
13
|
+
answer = reader.read_line(mask)
|
14
|
+
expect(answer).to eq("password")
|
15
|
+
end
|
16
|
+
|
17
|
+
it "echoes characters back" do
|
18
|
+
input << "password\n"
|
19
|
+
input.rewind
|
20
|
+
answer = reader.read_line
|
21
|
+
expect(answer).to eq("password")
|
22
|
+
expect(output.string).to eq("")
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'deletes characters when backspace pressed' do
|
26
|
+
input << "aa\ba\bcc"
|
27
|
+
input.rewind
|
28
|
+
answer = reader.read_line
|
29
|
+
expect(answer).to eq('acc')
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
RSpec.describe TTY::Prompt::Reader, '#read_multiline' do
|
4
|
+
let(:input) { StringIO.new }
|
5
|
+
let(:output) { StringIO.new }
|
6
|
+
|
7
|
+
subject(:reader) { described_class.new(input, output) }
|
8
|
+
|
9
|
+
it 'reads no lines' do
|
10
|
+
input << ''
|
11
|
+
input.rewind
|
12
|
+
answer = reader.read_multiline
|
13
|
+
expect(answer).to eq([])
|
14
|
+
end
|
15
|
+
|
16
|
+
it "reads a line" do
|
17
|
+
input << "Single line"
|
18
|
+
input.rewind
|
19
|
+
answer = reader.read_multiline
|
20
|
+
expect(answer).to eq(['Single line'])
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'reads few lines' do
|
24
|
+
input << "First line\nSecond line\nThird line"
|
25
|
+
input.rewind
|
26
|
+
answer = reader.read_multiline
|
27
|
+
expect(answer).to eq(['First line', 'Second line', 'Third line'])
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'reads and yiels every line' do
|
31
|
+
input << "First line\nSecond line\nThird line"
|
32
|
+
input.rewind
|
33
|
+
lines = []
|
34
|
+
reader.read_multiline { |line| lines << line }
|
35
|
+
expect(lines).to eq(['First line', 'Second line', 'Third line'])
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
RSpec.describe TTY::Prompt::Result do
|
4
|
+
it "checks value to be invalid" do
|
5
|
+
question = double(:question)
|
6
|
+
result = TTY::Prompt::Result.new(question, nil)
|
7
|
+
|
8
|
+
answer = result.with { |quest, value|
|
9
|
+
if value.nil?
|
10
|
+
[value, ["`#{value}` provided cannot be empty"]]
|
11
|
+
else
|
12
|
+
value
|
13
|
+
end
|
14
|
+
}
|
15
|
+
expect(answer).to be_a(TTY::Prompt::Result::Failure)
|
16
|
+
expect(answer.success?).to eq(false)
|
17
|
+
expect(answer.errors).to eq(["`` provided cannot be empty"])
|
18
|
+
end
|
19
|
+
|
20
|
+
it "checks value to be valid" do
|
21
|
+
question = double(:question)
|
22
|
+
result = TTY::Prompt::Result.new(question, 'Piotr')
|
23
|
+
|
24
|
+
CheckRequired = Class.new do
|
25
|
+
def self.call(quest, value)
|
26
|
+
if value.nil?
|
27
|
+
[value, ["`#{value}` provided cannot be empty"]]
|
28
|
+
else
|
29
|
+
value
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
answer = result.with(CheckRequired)
|
35
|
+
expect(answer).to be_a(TTY::Prompt::Result::Success)
|
36
|
+
expect(answer.success?).to eq(true)
|
37
|
+
expect(answer.value).to eq('Piotr')
|
38
|
+
expect(answer.errors).to eq([])
|
39
|
+
end
|
40
|
+
end
|