tty-prompt 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/.rspec +3 -0
- data/.ruby-version +1 -0
- data/.travis.yml +24 -0
- data/Gemfile +16 -0
- data/LICENSE.txt +22 -0
- data/README.md +199 -0
- data/Rakefile +8 -0
- data/lib/tty-prompt.rb +15 -0
- data/lib/tty/prompt.rb +206 -0
- data/lib/tty/prompt/distance.rb +49 -0
- data/lib/tty/prompt/error.rb +26 -0
- data/lib/tty/prompt/history.rb +16 -0
- data/lib/tty/prompt/mode.rb +64 -0
- data/lib/tty/prompt/mode/echo.rb +40 -0
- data/lib/tty/prompt/mode/raw.rb +40 -0
- data/lib/tty/prompt/question.rb +338 -0
- data/lib/tty/prompt/question/modifier.rb +93 -0
- data/lib/tty/prompt/question/validation.rb +92 -0
- data/lib/tty/prompt/reader.rb +113 -0
- data/lib/tty/prompt/response.rb +252 -0
- data/lib/tty/prompt/response_delegation.rb +41 -0
- data/lib/tty/prompt/statement.rb +60 -0
- data/lib/tty/prompt/suggestion.rb +113 -0
- data/lib/tty/prompt/utils.rb +16 -0
- data/lib/tty/prompt/version.rb +7 -0
- data/spec/spec_helper.rb +45 -0
- data/spec/unit/ask_spec.rb +77 -0
- data/spec/unit/distance/distance_spec.rb +75 -0
- data/spec/unit/error_spec.rb +30 -0
- data/spec/unit/question/argument_spec.rb +30 -0
- data/spec/unit/question/character_spec.rb +24 -0
- data/spec/unit/question/default_spec.rb +25 -0
- data/spec/unit/question/in_spec.rb +23 -0
- data/spec/unit/question/initialize_spec.rb +24 -0
- data/spec/unit/question/modifier/apply_to_spec.rb +31 -0
- data/spec/unit/question/modifier/letter_case_spec.rb +22 -0
- data/spec/unit/question/modifier/whitespace_spec.rb +33 -0
- data/spec/unit/question/modify_spec.rb +44 -0
- data/spec/unit/question/valid_spec.rb +46 -0
- data/spec/unit/question/validate_spec.rb +30 -0
- data/spec/unit/question/validation/coerce_spec.rb +24 -0
- data/spec/unit/question/validation/valid_value_spec.rb +22 -0
- data/spec/unit/reader/getc_spec.rb +42 -0
- data/spec/unit/response/read_bool_spec.rb +47 -0
- data/spec/unit/response/read_char_spec.rb +16 -0
- data/spec/unit/response/read_date_spec.rb +20 -0
- data/spec/unit/response/read_email_spec.rb +42 -0
- data/spec/unit/response/read_multiple_spec.rb +23 -0
- data/spec/unit/response/read_number_spec.rb +28 -0
- data/spec/unit/response/read_range_spec.rb +26 -0
- data/spec/unit/response/read_spec.rb +68 -0
- data/spec/unit/response/read_string_spec.rb +19 -0
- data/spec/unit/say_spec.rb +66 -0
- data/spec/unit/statement/initialize_spec.rb +19 -0
- data/spec/unit/suggest_spec.rb +33 -0
- data/spec/unit/warn_spec.rb +30 -0
- data/tasks/console.rake +10 -0
- data/tasks/coverage.rake +11 -0
- data/tasks/spec.rake +29 -0
- data/tty-prompt.gemspec +26 -0
- metadata +194 -0
@@ -0,0 +1,30 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe TTY::Prompt::Question, '#argument' do
|
6
|
+
let(:input) { StringIO.new }
|
7
|
+
let(:output) { StringIO.new }
|
8
|
+
let(:prompt) { TTY::Prompt.new(input, output) }
|
9
|
+
|
10
|
+
it 'requires value to be present with helper' do
|
11
|
+
input << ''
|
12
|
+
input.rewind
|
13
|
+
q = prompt.ask("What is your name?").argument(:required)
|
14
|
+
expect { q.read }.to raise_error(ArgumentError)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'requires value to be present with option' do
|
18
|
+
input << ''
|
19
|
+
input.rewind
|
20
|
+
q = prompt.ask("What is your name?", required: true)
|
21
|
+
expect { q.read }.to raise_error(ArgumentError)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "doesn't require value to be present" do
|
25
|
+
input << ''
|
26
|
+
input.rewind
|
27
|
+
q = prompt.ask("What is your name?").argument(:optional)
|
28
|
+
expect(q.read).to be_nil
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe TTY::Prompt::Question, '#character' do
|
6
|
+
let(:input) { StringIO.new }
|
7
|
+
let(:output) { StringIO.new }
|
8
|
+
let(:prompt) { TTY::Prompt.new(input, output) }
|
9
|
+
|
10
|
+
it 'switches to character input' do
|
11
|
+
input << "abcd"
|
12
|
+
input.rewind
|
13
|
+
q = prompt.ask("Which one do you prefer a, b, c or d?").char(true)
|
14
|
+
expect(q.character)
|
15
|
+
expect(q.read_string).to eq("abcd")
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'acts as reader without arguments' do
|
19
|
+
input << "abcd"
|
20
|
+
input.rewind
|
21
|
+
q = prompt.ask("Which one do you prefer a, b, c or d?")
|
22
|
+
expect(q.char).to eq(false)
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe TTY::Prompt::Question, '#default' do
|
6
|
+
let(:input) { StringIO.new }
|
7
|
+
let(:output) { StringIO.new }
|
8
|
+
let(:prompt) { TTY::Prompt.new(input, output) }
|
9
|
+
|
10
|
+
it 'uses default value' do
|
11
|
+
name = 'Anonymous'
|
12
|
+
q = prompt.ask("What is your name?").default(name)
|
13
|
+
answer = q.read
|
14
|
+
expect(answer).to eq(name)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'uses default value in block' do
|
18
|
+
name = 'Anonymous'
|
19
|
+
q = prompt.ask "What is your name?" do
|
20
|
+
default name
|
21
|
+
end
|
22
|
+
answer = q.read
|
23
|
+
expect(answer).to eq(name)
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe TTY::Prompt::Question, '#in' do
|
6
|
+
let(:input) { StringIO.new }
|
7
|
+
let(:output) { StringIO.new }
|
8
|
+
let(:prompt) { TTY::Prompt.new(input, output) }
|
9
|
+
|
10
|
+
it 'reads number within range' do
|
11
|
+
input << 8
|
12
|
+
input.rewind
|
13
|
+
q = prompt.ask("How do you like it on scale 1-10").in('1-10')
|
14
|
+
expect(q.read_int).to eql 8
|
15
|
+
end
|
16
|
+
|
17
|
+
it "reads number outside of range" do
|
18
|
+
input << 12
|
19
|
+
input.rewind
|
20
|
+
q = prompt.ask("How do you like it on scale 1-10").in('1-10')
|
21
|
+
expect { q.read_int }.to raise_error(ArgumentError)
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe TTY::Prompt::Question, '#initialize' do
|
6
|
+
let(:input) { StringIO.new }
|
7
|
+
let(:output) { StringIO.new }
|
8
|
+
let(:prompt) { TTY::Prompt.new(input, output) }
|
9
|
+
let(:message) { 'Do you like me?' }
|
10
|
+
|
11
|
+
subject(:question) { described_class.new prompt }
|
12
|
+
|
13
|
+
it { expect(question.required?).to eq(false) }
|
14
|
+
|
15
|
+
it { expect(question.echo).to eq(true) }
|
16
|
+
|
17
|
+
it { expect(question.mask).to eq(false) }
|
18
|
+
|
19
|
+
it { expect(question.character).to eq(false) }
|
20
|
+
|
21
|
+
it { expect(question.modifier).to be_kind_of(TTY::Prompt::Question::Modifier) }
|
22
|
+
|
23
|
+
it { expect(question.validation).to be_kind_of(TTY::Prompt::Question::Validation) }
|
24
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe TTY::Prompt::Question::Modifier, '#apply_to' do
|
6
|
+
let(:instance) { described_class.new modifiers }
|
7
|
+
let(:string) { "Text to be modified"}
|
8
|
+
|
9
|
+
it "doesn't apply modifiers" do
|
10
|
+
modifier = described_class.new([])
|
11
|
+
expect(modifier.apply_to(string)).to eq(string)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'applies letter case modifications' do
|
15
|
+
modifiers = [:down, :capitalize]
|
16
|
+
allow(described_class).to receive(:letter_case)
|
17
|
+
modifier = described_class.new(modifiers)
|
18
|
+
modifier.apply_to(string)
|
19
|
+
expect(described_class).to have_received(:letter_case).
|
20
|
+
with(modifiers, string)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'applies whitespace modifications' do
|
24
|
+
modifiers = [:up, :capitalize]
|
25
|
+
allow(described_class).to receive(:whitespace)
|
26
|
+
modifier = described_class.new(modifiers)
|
27
|
+
modifier.apply_to(string)
|
28
|
+
expect(described_class).to have_received(:whitespace).
|
29
|
+
with(modifiers, string)
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe TTY::Prompt::Question::Modifier, '#letter_case' do
|
6
|
+
let(:string) { 'text to modify' }
|
7
|
+
|
8
|
+
it "changes to uppercase" do
|
9
|
+
modified = described_class.letter_case(:up, string)
|
10
|
+
expect(modified).to eq('TEXT TO MODIFY')
|
11
|
+
end
|
12
|
+
|
13
|
+
it "changes to lower case" do
|
14
|
+
modified = described_class.letter_case(:down, string)
|
15
|
+
expect(modified).to eq('text to modify')
|
16
|
+
end
|
17
|
+
|
18
|
+
it "capitalizes text" do
|
19
|
+
modified = described_class.letter_case(:capitalize, string)
|
20
|
+
expect(modified).to eq('Text to modify')
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe TTY::Prompt::Question::Modifier, '#whitespace' do
|
6
|
+
let(:string) { " text\t \n to\t modify\r\n" }
|
7
|
+
|
8
|
+
subject { described_class.whitespace modifier, string}
|
9
|
+
|
10
|
+
context 'when stripping whitespace' do
|
11
|
+
let(:modifier) { :trim }
|
12
|
+
|
13
|
+
it { is_expected.to eq("text\t \n to\t modify") }
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'when chomping whitespace' do
|
17
|
+
let(:modifier) { :chomp }
|
18
|
+
|
19
|
+
it { is_expected.to eq(" text\t \n to\t modify") }
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'when capitalize' do
|
23
|
+
let(:modifier) { :collapse }
|
24
|
+
|
25
|
+
it { is_expected.to eq(" text to modify ") }
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'when removing whitespace' do
|
29
|
+
let(:modifier) { :remove }
|
30
|
+
|
31
|
+
it { is_expected.to eq("texttomodify") }
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe TTY::Prompt::Question, '#modify' do
|
6
|
+
let(:input) { StringIO.new }
|
7
|
+
let(:output) { StringIO.new }
|
8
|
+
let(:prompt) { TTY::Prompt.new(input, output) }
|
9
|
+
|
10
|
+
it 'preserves answer for unkown modification' do
|
11
|
+
input << 'piotr'
|
12
|
+
input.rewind
|
13
|
+
q = prompt.ask("What is your name?").modify(:none)
|
14
|
+
expect(q.read_string).to eql 'piotr'
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'converts to upper case' do
|
18
|
+
input << 'piotr'
|
19
|
+
input.rewind
|
20
|
+
q = prompt.ask("What is your name?").modify(:upcase)
|
21
|
+
expect(q.read_string).to eql 'PIOTR'
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'trims whitespace' do
|
25
|
+
input << " Some white\t space\t \there! \n"
|
26
|
+
input.rewind
|
27
|
+
q = prompt.ask("Enter some text: ").modify(:trim)
|
28
|
+
expect(q.read_string).to eql "Some white\t space\t \there!"
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'collapses whitespace' do
|
32
|
+
input << " Some white\t space\t \there! \n"
|
33
|
+
input.rewind
|
34
|
+
q = prompt.ask("Enter some text: ").modify(:collapse)
|
35
|
+
expect(q.read_string).to eql "Some white space here!"
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'strips and collapses whitespace' do
|
39
|
+
input << " Some white\t space\t \there! \n"
|
40
|
+
input.rewind
|
41
|
+
q = prompt.ask("Enter some text: ").modify(:strip, :collapse)
|
42
|
+
expect(q.read_string).to eql "Some white space here!"
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe TTY::Prompt::Question, '#valid' do
|
6
|
+
let(:input) { StringIO.new }
|
7
|
+
let(:output) { StringIO.new }
|
8
|
+
let(:prompt) { TTY::Prompt.new(input, output) }
|
9
|
+
|
10
|
+
let(:cards) { %w[ club diamond spade heart ] }
|
11
|
+
|
12
|
+
it 'reads valid optios with helper' do
|
13
|
+
input << 'club'
|
14
|
+
input.rewind
|
15
|
+
q = prompt.ask("What is your card suit sir?").valid(cards)
|
16
|
+
expect(q.read_choice).to eq('club')
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'reads valid options with option hash' do
|
20
|
+
input << 'club'
|
21
|
+
input.rewind
|
22
|
+
q = prompt.ask("What is your card suit sir?", valid: cards)
|
23
|
+
expect(q.read_choice).to eq('club')
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'reads invalid option' do
|
27
|
+
input << 'clover'
|
28
|
+
input.rewind
|
29
|
+
q = prompt.ask("What is your card suit sir?").valid(cards)
|
30
|
+
expect { q.read_choice }.to raise_error(TTY::Prompt::InvalidArgument)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'needs argument' do
|
34
|
+
input << ''
|
35
|
+
input.rewind
|
36
|
+
q = prompt.ask("What is your card suit sir?").valid(cards)
|
37
|
+
expect { q.read_choice }.to raise_error(TTY::Prompt::ArgumentRequired)
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'reads with default' do
|
41
|
+
input << ''
|
42
|
+
input.rewind
|
43
|
+
q = prompt.ask("What is your card suit sir?").valid(cards).default('club')
|
44
|
+
expect(q.read_choice).to eq('club')
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe TTY::Prompt::Question, '#validate' do
|
6
|
+
let(:input) { StringIO.new }
|
7
|
+
let(:output) { StringIO.new }
|
8
|
+
let(:prompt) { TTY::Prompt.new(input, output) }
|
9
|
+
|
10
|
+
it 'fails to validate input' do
|
11
|
+
input << 'piotrmurach'
|
12
|
+
input.rewind
|
13
|
+
q = prompt.ask("What is your username?").validate(/^[^\.]+\.[^\.]+/)
|
14
|
+
expect { q.read_string }.to raise_error(ArgumentError)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'validates input with regex' do
|
18
|
+
input << 'piotr.murach'
|
19
|
+
input.rewind
|
20
|
+
q = prompt.ask("What is your username?").validate(/^[^\.]+\.[^\.]+/)
|
21
|
+
expect(q.read_string).to eq('piotr.murach')
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'validates input in block' do
|
25
|
+
input << 'piotr.murach'
|
26
|
+
input.rewind
|
27
|
+
q = prompt.ask("What is your username?").validate { |arg| arg =~ /^[^\.]+\.[^\.]+/ }
|
28
|
+
expect(q.read_string).to eq('piotr.murach')
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe TTY::Prompt::Question::Validation, '#coerce' do
|
6
|
+
let(:instance) { described_class.new }
|
7
|
+
|
8
|
+
it "coerces into proc" do
|
9
|
+
validation = lambda { "^[^\.]+\.[^\.]+" }
|
10
|
+
expect(instance.coerce(validation)).to be_kind_of(Proc)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "cources into regex" do
|
14
|
+
validation = "^[^\.]+\.[^\.]+"
|
15
|
+
expect(instance.coerce(validation)).to be_kind_of(Regexp)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "fails to coerce validation" do
|
19
|
+
validation = Object.new
|
20
|
+
expect {
|
21
|
+
instance.coerce(validation)
|
22
|
+
}.to raise_error(TTY::Prompt::ValidationCoercion)
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe TTY::Prompt::Question::Validation, '#valid_value?' do
|
6
|
+
let(:validation) { /^[^\.]+\.[^\.]+/ }
|
7
|
+
let(:instance) { described_class.new validation }
|
8
|
+
|
9
|
+
it "validates nil input" do
|
10
|
+
expect(instance.valid_value?(nil)).to eq(false)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "validates successfully when the value matches pattern" do
|
14
|
+
expect(instance.valid_value?('piotr.murach')).to eq(true)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "fails validation when not maching pattern" do
|
18
|
+
expect {
|
19
|
+
instance.valid_value?('piotrmurach')
|
20
|
+
}.to raise_error(TTY::Prompt::InvalidArgument)
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe TTY::Prompt::Reader, '#getc' do
|
6
|
+
let(:instance) { described_class.new(prompt) }
|
7
|
+
|
8
|
+
let(:input) { StringIO.new }
|
9
|
+
let(:output) { StringIO.new }
|
10
|
+
let(:prompt) { TTY::Prompt.new(input, output) }
|
11
|
+
|
12
|
+
subject(:reader) { instance.getc mask }
|
13
|
+
|
14
|
+
context 'with mask' do
|
15
|
+
let(:mask) { '*'}
|
16
|
+
|
17
|
+
it 'masks characters' do
|
18
|
+
input << "password\n"
|
19
|
+
input.rewind
|
20
|
+
expect(reader).to eql "password"
|
21
|
+
expect(output.string).to eql("********")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context "without mask" do
|
26
|
+
let(:mask) { }
|
27
|
+
|
28
|
+
it 'masks characters' do
|
29
|
+
input << "password\n"
|
30
|
+
input.rewind
|
31
|
+
expect(reader).to eql "password"
|
32
|
+
expect(output.string).to eql("password")
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'deletes characters when backspace pressed' do
|
36
|
+
input << "\b\b"
|
37
|
+
input.rewind
|
38
|
+
expect(reader).to eql ''
|
39
|
+
expect(output.string).to eql('')
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe TTY::Prompt::Question, '#read_bool' do
|
6
|
+
let(:input) { StringIO.new }
|
7
|
+
let(:output) { StringIO.new }
|
8
|
+
let(:prompt) { TTY::Prompt.new(input, output) }
|
9
|
+
|
10
|
+
it 'fails to read boolean' do
|
11
|
+
input << 'invalid'
|
12
|
+
input.rewind
|
13
|
+
q = prompt.ask("Do you read books?")
|
14
|
+
expect { q.read_bool }.to raise_error(Necromancer::ConversionTypeError)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "handles default values" do
|
18
|
+
input << "\n"
|
19
|
+
input.rewind
|
20
|
+
q = prompt.ask("Do you read books?").default(true)
|
21
|
+
expect(q.read_bool).to eql(true)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'reads negative boolean' do
|
25
|
+
input << 'No'
|
26
|
+
input.rewind
|
27
|
+
q = prompt.ask("Do you read books?")
|
28
|
+
answer = q.read_bool
|
29
|
+
expect(answer).to eql false
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'reads positive boolean' do
|
33
|
+
input << 'Yes'
|
34
|
+
input.rewind
|
35
|
+
q = prompt.ask("Do you read books?")
|
36
|
+
answer = q.read_bool
|
37
|
+
expect(answer).to eql true
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'reads single positive boolean' do
|
41
|
+
input << 'y'
|
42
|
+
input.rewind
|
43
|
+
q = prompt.ask("Do you read books?")
|
44
|
+
answer = q.read_bool
|
45
|
+
expect(answer).to eql true
|
46
|
+
end
|
47
|
+
end
|