highline_wrapper 0.1.0 → 1.0.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/Gemfile.lock +100 -0
- data/README.md +269 -13
- data/lib/highline_wrapper.rb +82 -31
- data/lib/highline_wrapper/checkbox_question.rb +32 -0
- data/lib/highline_wrapper/multiple_choice_question.rb +20 -0
- data/lib/highline_wrapper/open_ended_question.rb +19 -0
- data/lib/highline_wrapper/question.rb +35 -0
- data/lib/highline_wrapper/version.rb +1 -1
- data/lib/highline_wrapper/yes_no_question.rb +26 -0
- data/spec/highline_wrapper/checkbox_question_spec.rb +188 -0
- data/spec/highline_wrapper/multiple_choice_question_spec.rb +188 -0
- data/spec/highline_wrapper/open_ended_question_spec.rb +94 -0
- data/spec/highline_wrapper/question_spec.rb +63 -0
- data/spec/highline_wrapper/yes_no_question_spec.rb +88 -0
- metadata +24 -11
- data/lib/highline_wrapper/client.rb +0 -68
- data/spec/highline_wrapper/client_spec.rb +0 -109
| @@ -0,0 +1,94 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'spec_helper'
         | 
| 4 | 
            +
            require 'highline_wrapper'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            describe HighlineWrapper::OpenEndedQuestion do
         | 
| 7 | 
            +
              let(:response) { double(:response, readline: true, to_i: 3) }
         | 
| 8 | 
            +
              let(:highline) { double(:highline_cli, ask: response) }
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              before do
         | 
| 11 | 
            +
                allow(HighLine).to receive(:new).and_return(highline)
         | 
| 12 | 
            +
                allow(subject).to receive(:puts)
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              after do
         | 
| 16 | 
            +
                HighlineWrapper::OpenEndedQuestion.instance_variable_set('@highline', nil)
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              subject { HighlineWrapper::OpenEndedQuestion }
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              context 'with the options as defaults' do
         | 
| 22 | 
            +
                let(:options) do
         | 
| 23 | 
            +
                  {
         | 
| 24 | 
            +
                    secret: false,
         | 
| 25 | 
            +
                    default: '',
         | 
| 26 | 
            +
                    required: false
         | 
| 27 | 
            +
                  }
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                it 'should ask the highline client ask' do
         | 
| 31 | 
            +
                  expect(highline).to receive(:ask)
         | 
| 32 | 
            +
                  subject.ask(Faker::Lorem.sentence, options)
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                it 'should return the value the user selects' do
         | 
| 36 | 
            +
                  answer = Faker::Lorem.sentence
         | 
| 37 | 
            +
                  allow(highline).to receive(:ask).and_return(answer)
         | 
| 38 | 
            +
                  resp = subject.ask(Faker::Lorem.sentence, options)
         | 
| 39 | 
            +
                  expect(resp).to eq(answer)
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                it 'should return empty string if the user skips' do
         | 
| 43 | 
            +
                  allow(highline).to receive(:ask).and_return('')
         | 
| 44 | 
            +
                  resp = subject.ask(Faker::Lorem.sentence, options)
         | 
| 45 | 
            +
                  expect(resp).to eq('')
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
              end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
              context 'with required set to true' do
         | 
| 50 | 
            +
                let(:options) do
         | 
| 51 | 
            +
                  {
         | 
| 52 | 
            +
                    secret: false,
         | 
| 53 | 
            +
                    default: 'something-goes-here',
         | 
| 54 | 
            +
                    required: true
         | 
| 55 | 
            +
                  }
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                it 'should return the value the user selects' do
         | 
| 59 | 
            +
                  answer = Faker::Lorem.sentence
         | 
| 60 | 
            +
                  allow(highline).to receive(:ask).and_return(answer)
         | 
| 61 | 
            +
                  resp = subject.ask(Faker::Lorem.sentence, options)
         | 
| 62 | 
            +
                  expect(resp).to eq(answer)
         | 
| 63 | 
            +
                end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                it 'should recurse multiple times if the user skips' do
         | 
| 66 | 
            +
                  allow(highline).to receive(:ask).and_return('', '', Faker::Lorem.sentence)
         | 
| 67 | 
            +
                  expect(subject).to receive(:ask).exactly(3).times.and_call_original
         | 
| 68 | 
            +
                  subject.ask(Faker::Lorem.sentence, options)
         | 
| 69 | 
            +
                end
         | 
| 70 | 
            +
              end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
              context 'with the default set and the required set to false' do
         | 
| 73 | 
            +
                let(:default_string) { Faker::Lorem.sentence }
         | 
| 74 | 
            +
                let(:options) do
         | 
| 75 | 
            +
                  {
         | 
| 76 | 
            +
                    secret: false,
         | 
| 77 | 
            +
                    default: default_string,
         | 
| 78 | 
            +
                    required: false
         | 
| 79 | 
            +
                  }
         | 
| 80 | 
            +
                end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                it 'should return the value the user selects' do
         | 
| 83 | 
            +
                  answer = Faker::Lorem.sentence
         | 
| 84 | 
            +
                  allow(highline).to receive(:ask).and_return(answer)
         | 
| 85 | 
            +
                  resp = subject.ask(Faker::Lorem.sentence, options)
         | 
| 86 | 
            +
                  expect(resp).to eq(answer)
         | 
| 87 | 
            +
                end
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                it 'should return the default value the user skips' do
         | 
| 90 | 
            +
                  allow(highline).to receive(:ask).and_return('')
         | 
| 91 | 
            +
                  expect(subject.ask(Faker::Lorem.sentence, options)).to eq(default_string)
         | 
| 92 | 
            +
                end
         | 
| 93 | 
            +
              end
         | 
| 94 | 
            +
            end
         | 
| @@ -0,0 +1,63 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'spec_helper'
         | 
| 4 | 
            +
            require 'highline_wrapper'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            describe HighlineWrapper::Question do
         | 
| 7 | 
            +
              let(:response) { double(:response, readline: true, to_i: 3) }
         | 
| 8 | 
            +
              let(:highline) { double(:highline_cli, ask: response) }
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              before do
         | 
| 11 | 
            +
                allow(HighLine).to receive(:new).and_return(highline)
         | 
| 12 | 
            +
                allow(subject).to receive(:puts)
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              after do
         | 
| 16 | 
            +
                HighlineWrapper::Question.instance_variable_set('@highline', nil)
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              subject { HighlineWrapper::Question }
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              describe '#highline' do
         | 
| 22 | 
            +
                it 'should start a new highline client' do
         | 
| 23 | 
            +
                  expect(HighLine).to receive(:new)
         | 
| 24 | 
            +
                  subject.send(:highline)
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              describe '#ask_highline' do
         | 
| 29 | 
            +
                it 'should ask the highline client a question' do
         | 
| 30 | 
            +
                  expect(HighLine).to receive(:new)
         | 
| 31 | 
            +
                  subject.send(:ask_highline, Faker::Lorem.sentence)
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                it 'should accept an optional secret parameter' do
         | 
| 35 | 
            +
                  expect(HighLine).to receive(:new)
         | 
| 36 | 
            +
                  subject.send(:ask_highline, Faker::Lorem.sentence, secret: true)
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
              describe '#format_options' do
         | 
| 41 | 
            +
                it 'should format the prompt and choices into a single string with new lines' do
         | 
| 42 | 
            +
                  response = "Prompt\n1. Choice 1\n2. Choice 2"
         | 
| 43 | 
            +
                  expect(subject.format_options('Prompt', ['Choice 1', 'Choice 2'])).to eq(response)
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
              end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
              describe '#format_selection' do
         | 
| 48 | 
            +
                let(:choices) { %w[one two three] }
         | 
| 49 | 
            +
                let(:index) { 1 }
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                context 'with_index as false' do
         | 
| 52 | 
            +
                  it 'should format the selection based on the index into a hash' do
         | 
| 53 | 
            +
                    expect(subject.format_selection(choices, index, false)).to eq({ value: 'two' })
         | 
| 54 | 
            +
                  end
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                context 'with_index as true' do
         | 
| 58 | 
            +
                  it 'should format the selection based on the index into a hash' do
         | 
| 59 | 
            +
                    expect(subject.format_selection(choices, index, true)).to eq({ value: 'two', index: 1 })
         | 
| 60 | 
            +
                  end
         | 
| 61 | 
            +
                end
         | 
| 62 | 
            +
              end
         | 
| 63 | 
            +
            end
         | 
| @@ -0,0 +1,88 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'spec_helper'
         | 
| 4 | 
            +
            require 'highline_wrapper'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            describe HighlineWrapper::YesNoQuestion do
         | 
| 7 | 
            +
              let(:response) { double(:response, readline: true, to_i: 3) }
         | 
| 8 | 
            +
              let(:highline) { double(:highline_cli, ask: response) }
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              before do
         | 
| 11 | 
            +
                allow(HighLine).to receive(:new).and_return(highline)
         | 
| 12 | 
            +
                allow(subject).to receive(:puts)
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              after do
         | 
| 16 | 
            +
                HighlineWrapper::YesNoQuestion.instance_variable_set('@highline', nil)
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              subject { HighlineWrapper::YesNoQuestion }
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              context 'with the options as defaults' do
         | 
| 22 | 
            +
                let(:options) do
         | 
| 23 | 
            +
                  {
         | 
| 24 | 
            +
                    default: true,
         | 
| 25 | 
            +
                    required: false
         | 
| 26 | 
            +
                  }
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                it 'should ask the highline client ask' do
         | 
| 30 | 
            +
                  expect(highline).to receive(:ask)
         | 
| 31 | 
            +
                  subject.ask(Faker::Lorem.sentence, options)
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                it 'should return the value the user selects' do
         | 
| 35 | 
            +
                  allow(highline).to receive(:ask).and_return('n')
         | 
| 36 | 
            +
                  resp = subject.ask(Faker::Lorem.sentence, options)
         | 
| 37 | 
            +
                  expect(resp).to eq(false)
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                it 'should return true if the user skips' do
         | 
| 41 | 
            +
                  allow(highline).to receive(:ask).and_return('')
         | 
| 42 | 
            +
                  resp = subject.ask(Faker::Lorem.sentence, options)
         | 
| 43 | 
            +
                  expect(resp).to eq(true)
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
              end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
              context 'with required set to true' do
         | 
| 48 | 
            +
                let(:options) do
         | 
| 49 | 
            +
                  {
         | 
| 50 | 
            +
                    default: false,
         | 
| 51 | 
            +
                    required: true
         | 
| 52 | 
            +
                  }
         | 
| 53 | 
            +
                end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                it 'should return the value the user selects' do
         | 
| 56 | 
            +
                  allow(highline).to receive(:ask).and_return('y')
         | 
| 57 | 
            +
                  resp = subject.ask(Faker::Lorem.sentence, options)
         | 
| 58 | 
            +
                  expect(resp).to eq(true)
         | 
| 59 | 
            +
                end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                it 'should recurse multiple times if the user skips' do
         | 
| 62 | 
            +
                  allow(highline).to receive(:ask).and_return('', '', 'y')
         | 
| 63 | 
            +
                  expect(subject).to receive(:ask).exactly(3).times.and_call_original
         | 
| 64 | 
            +
                  subject.ask(Faker::Lorem.sentence, options)
         | 
| 65 | 
            +
                end
         | 
| 66 | 
            +
              end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
              context 'with required set to false' do
         | 
| 69 | 
            +
                let(:options) do
         | 
| 70 | 
            +
                  {
         | 
| 71 | 
            +
                    default: false,
         | 
| 72 | 
            +
                    required: false
         | 
| 73 | 
            +
                  }
         | 
| 74 | 
            +
                end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                it 'should return the value the user selects' do
         | 
| 77 | 
            +
                  allow(highline).to receive(:ask).and_return('y')
         | 
| 78 | 
            +
                  resp = subject.ask(Faker::Lorem.sentence, options)
         | 
| 79 | 
            +
                  expect(resp).to eq(true)
         | 
| 80 | 
            +
                end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                it 'should return the default if the user skips' do
         | 
| 83 | 
            +
                  allow(highline).to receive(:ask).and_return('')
         | 
| 84 | 
            +
                  resp = subject.ask(Faker::Lorem.sentence, options)
         | 
| 85 | 
            +
                  expect(resp).to eq(false)
         | 
| 86 | 
            +
                end
         | 
| 87 | 
            +
              end
         | 
| 88 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: highline_wrapper
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version:  | 
| 4 | 
            +
              version: 1.0.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Emma Sax
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2021-03- | 
| 11 | 
            +
            date: 2021-03-04 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: highline
         | 
| @@ -112,32 +112,41 @@ dependencies: | |
| 112 112 | 
             
              name: rubocop
         | 
| 113 113 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 114 114 | 
             
                requirements:
         | 
| 115 | 
            -
                - - " | 
| 115 | 
            +
                - - "~>"
         | 
| 116 116 | 
             
                  - !ruby/object:Gem::Version
         | 
| 117 | 
            -
                    version: ' | 
| 117 | 
            +
                    version: '1.10'
         | 
| 118 118 | 
             
              type: :development
         | 
| 119 119 | 
             
              prerelease: false
         | 
| 120 120 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 121 121 | 
             
                requirements:
         | 
| 122 | 
            -
                - - " | 
| 122 | 
            +
                - - "~>"
         | 
| 123 123 | 
             
                  - !ruby/object:Gem::Version
         | 
| 124 | 
            -
                    version: ' | 
| 124 | 
            +
                    version: '1.10'
         | 
| 125 125 | 
             
            description: Making it easier to ask simple questions, such as multiple choice questions,
         | 
| 126 | 
            -
              yes/no questions, etc, using  | 
| 126 | 
            +
              yes/no questions, etc, using HighLine
         | 
| 127 127 | 
             
            email:
         | 
| 128 128 | 
             
            executables: []
         | 
| 129 129 | 
             
            extensions: []
         | 
| 130 130 | 
             
            extra_rdoc_files: []
         | 
| 131 131 | 
             
            files:
         | 
| 132 132 | 
             
            - Gemfile
         | 
| 133 | 
            +
            - Gemfile.lock
         | 
| 133 134 | 
             
            - Guardfile
         | 
| 134 135 | 
             
            - LICENSE
         | 
| 135 136 | 
             
            - README.md
         | 
| 136 137 | 
             
            - Rakefile
         | 
| 137 138 | 
             
            - lib/highline_wrapper.rb
         | 
| 138 | 
            -
            - lib/highline_wrapper/ | 
| 139 | 
            +
            - lib/highline_wrapper/checkbox_question.rb
         | 
| 140 | 
            +
            - lib/highline_wrapper/multiple_choice_question.rb
         | 
| 141 | 
            +
            - lib/highline_wrapper/open_ended_question.rb
         | 
| 142 | 
            +
            - lib/highline_wrapper/question.rb
         | 
| 139 143 | 
             
            - lib/highline_wrapper/version.rb
         | 
| 140 | 
            -
            -  | 
| 144 | 
            +
            - lib/highline_wrapper/yes_no_question.rb
         | 
| 145 | 
            +
            - spec/highline_wrapper/checkbox_question_spec.rb
         | 
| 146 | 
            +
            - spec/highline_wrapper/multiple_choice_question_spec.rb
         | 
| 147 | 
            +
            - spec/highline_wrapper/open_ended_question_spec.rb
         | 
| 148 | 
            +
            - spec/highline_wrapper/question_spec.rb
         | 
| 149 | 
            +
            - spec/highline_wrapper/yes_no_question_spec.rb
         | 
| 141 150 | 
             
            - spec/spec_helper.rb
         | 
| 142 151 | 
             
            homepage: https://github.com/emmahsax/highline_wrapper
         | 
| 143 152 | 
             
            licenses:
         | 
| @@ -161,7 +170,11 @@ requirements: [] | |
| 161 170 | 
             
            rubygems_version: 3.2.3
         | 
| 162 171 | 
             
            signing_key:
         | 
| 163 172 | 
             
            specification_version: 4
         | 
| 164 | 
            -
            summary: A little wrapper for  | 
| 173 | 
            +
            summary: A little wrapper for HighLine
         | 
| 165 174 | 
             
            test_files:
         | 
| 166 175 | 
             
            - spec/spec_helper.rb
         | 
| 167 | 
            -
            - spec/highline_wrapper/ | 
| 176 | 
            +
            - spec/highline_wrapper/checkbox_question_spec.rb
         | 
| 177 | 
            +
            - spec/highline_wrapper/multiple_choice_question_spec.rb
         | 
| 178 | 
            +
            - spec/highline_wrapper/open_ended_question_spec.rb
         | 
| 179 | 
            +
            - spec/highline_wrapper/question_spec.rb
         | 
| 180 | 
            +
            - spec/highline_wrapper/yes_no_question_spec.rb
         | 
| @@ -1,68 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            class HighlineWrapper
         | 
| 4 | 
            -
              class Client
         | 
| 5 | 
            -
                def ask(prompt, secret)
         | 
| 6 | 
            -
                  highline.ask(prompt) do |conf|
         | 
| 7 | 
            -
                    conf.readline = true
         | 
| 8 | 
            -
                    if secret
         | 
| 9 | 
            -
                      conf.echo = false
         | 
| 10 | 
            -
                      conf.echo = '*'
         | 
| 11 | 
            -
                    end
         | 
| 12 | 
            -
                  end.to_s
         | 
| 13 | 
            -
                end
         | 
| 14 | 
            -
             | 
| 15 | 
            -
                def ask_yes_no(prompt, preference)
         | 
| 16 | 
            -
                  answer = highline.ask(prompt) do |conf|
         | 
| 17 | 
            -
                    conf.readline = true
         | 
| 18 | 
            -
                  end.to_s
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                  answer.empty? ? preference : !!(answer =~ /^y/i)
         | 
| 21 | 
            -
                end
         | 
| 22 | 
            -
             | 
| 23 | 
            -
                def ask_multiple_choice(prompt, choices, with_index)
         | 
| 24 | 
            -
                  index = highline.ask(format_options(prompt, choices)) do |conf|
         | 
| 25 | 
            -
                    conf.readline = true
         | 
| 26 | 
            -
                  end.to_i - 1
         | 
| 27 | 
            -
             | 
| 28 | 
            -
                  if with_index
         | 
| 29 | 
            -
                    { choice: choices[index], index: index }
         | 
| 30 | 
            -
                  else
         | 
| 31 | 
            -
                    choices[index]
         | 
| 32 | 
            -
                  end
         | 
| 33 | 
            -
                end
         | 
| 34 | 
            -
             | 
| 35 | 
            -
                # rubocop:disable Metrics/AbcSize
         | 
| 36 | 
            -
                # rubocop:disable Metrics/MethodLength
         | 
| 37 | 
            -
                def ask_checkbox(prompt, choices, provide_indices)
         | 
| 38 | 
            -
                  indices = []
         | 
| 39 | 
            -
                  selected = []
         | 
| 40 | 
            -
             | 
| 41 | 
            -
                  answer = highline.ask(format_options(prompt, choices)) do |conf|
         | 
| 42 | 
            -
                    conf.readline = true
         | 
| 43 | 
            -
                  end
         | 
| 44 | 
            -
             | 
| 45 | 
            -
                  answer.split(',').each { |i| indices << i.strip.to_i - 1 }
         | 
| 46 | 
            -
             | 
| 47 | 
            -
                  if provide_indices
         | 
| 48 | 
            -
                    indices.each { |index| selected << { choice: choices[index], index: index } }
         | 
| 49 | 
            -
                  else
         | 
| 50 | 
            -
                    indices.each { |index| selected << choices[index] }
         | 
| 51 | 
            -
                  end
         | 
| 52 | 
            -
             | 
| 53 | 
            -
                  selected
         | 
| 54 | 
            -
                end
         | 
| 55 | 
            -
                # rubocop:enable Metrics/MethodLength
         | 
| 56 | 
            -
                # rubocop:enable Metrics/AbcSize
         | 
| 57 | 
            -
             | 
| 58 | 
            -
                private def format_options(prompt, choices)
         | 
| 59 | 
            -
                  choices_as_string_options = ''.dup
         | 
| 60 | 
            -
                  choices.each_with_index { |choice, index| choices_as_string_options << "#{index + 1}. #{choice}\n" }
         | 
| 61 | 
            -
                  "#{prompt}\n#{choices_as_string_options.strip}"
         | 
| 62 | 
            -
                end
         | 
| 63 | 
            -
             | 
| 64 | 
            -
                private def highline
         | 
| 65 | 
            -
                  @highline ||= HighLine.new
         | 
| 66 | 
            -
                end
         | 
| 67 | 
            -
              end
         | 
| 68 | 
            -
            end
         | 
| @@ -1,109 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            require 'spec_helper'
         | 
| 4 | 
            -
            require 'highline_wrapper'
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            describe HighlineWrapper::Client do
         | 
| 7 | 
            -
              let(:response) { double(:response, readline: true, to_i: 3) }
         | 
| 8 | 
            -
              let(:highline) { double(:highline_cli, ask: response) }
         | 
| 9 | 
            -
             | 
| 10 | 
            -
              before do
         | 
| 11 | 
            -
                allow(HighLine).to receive(:new).and_return(highline)
         | 
| 12 | 
            -
              end
         | 
| 13 | 
            -
             | 
| 14 | 
            -
              describe '#ask' do
         | 
| 15 | 
            -
                it 'should ask the highline client ask' do
         | 
| 16 | 
            -
                  expect(highline).to receive(:ask)
         | 
| 17 | 
            -
                  subject.ask(Faker::Lorem.sentence, false)
         | 
| 18 | 
            -
                end
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                it 'should return a string' do
         | 
| 21 | 
            -
                  expect(subject.ask(Faker::Lorem.sentence, true)).to be_a(String)
         | 
| 22 | 
            -
                end
         | 
| 23 | 
            -
              end
         | 
| 24 | 
            -
             | 
| 25 | 
            -
              describe '#ask_yes_no' do
         | 
| 26 | 
            -
                it 'should ask the highline client ask' do
         | 
| 27 | 
            -
                  expect(highline).to receive(:ask)
         | 
| 28 | 
            -
                  subject.ask_yes_no(Faker::Lorem.sentence, true)
         | 
| 29 | 
            -
                end
         | 
| 30 | 
            -
             | 
| 31 | 
            -
                it 'should return a boolean' do
         | 
| 32 | 
            -
                  expect(subject.ask_yes_no(Faker::Lorem.sentence, false)).to be_falsey
         | 
| 33 | 
            -
                end
         | 
| 34 | 
            -
             | 
| 35 | 
            -
                it 'should return true if we say yes' do
         | 
| 36 | 
            -
                  allow(response).to receive(:to_s).and_return('y')
         | 
| 37 | 
            -
                  expect(subject.ask_yes_no(Faker::Lorem.sentence, false)).to be_truthy
         | 
| 38 | 
            -
                end
         | 
| 39 | 
            -
             | 
| 40 | 
            -
                it 'should return false if we say yes' do
         | 
| 41 | 
            -
                  allow(response).to receive(:to_s).and_return('no')
         | 
| 42 | 
            -
                  expect(subject.ask_yes_no(Faker::Lorem.sentence, true)).to be_falsey
         | 
| 43 | 
            -
                end
         | 
| 44 | 
            -
             | 
| 45 | 
            -
                context 'when preferring true' do
         | 
| 46 | 
            -
                  it 'should return true if empty' do
         | 
| 47 | 
            -
                    allow(response).to receive(:to_s).and_return('')
         | 
| 48 | 
            -
                    expect(subject.ask_yes_no(Faker::Lorem.sentence, true)).to be_truthy
         | 
| 49 | 
            -
                  end
         | 
| 50 | 
            -
             | 
| 51 | 
            -
                  it 'should return false if empty' do
         | 
| 52 | 
            -
                    allow(response).to receive(:to_s).and_return('')
         | 
| 53 | 
            -
                    expect(subject.ask_yes_no(Faker::Lorem.sentence, false)).to be_falsey
         | 
| 54 | 
            -
                  end
         | 
| 55 | 
            -
                end
         | 
| 56 | 
            -
              end
         | 
| 57 | 
            -
             | 
| 58 | 
            -
              describe '#ask_multiple_choice' do
         | 
| 59 | 
            -
                it 'should ask the highline client ask' do
         | 
| 60 | 
            -
                  expect(highline).to receive(:ask)
         | 
| 61 | 
            -
                  subject.ask_multiple_choice(Faker::Lorem.sentence, %w[one two three], false)
         | 
| 62 | 
            -
                end
         | 
| 63 | 
            -
             | 
| 64 | 
            -
                context 'when not including the index' do
         | 
| 65 | 
            -
                  it 'should return an array of one from the options' do
         | 
| 66 | 
            -
                    resp = subject.ask_multiple_choice(Faker::Lorem.sentence, %w[one two three], false)
         | 
| 67 | 
            -
                    expect(resp).to be_a(String)
         | 
| 68 | 
            -
                    expect(resp).to eq('three')
         | 
| 69 | 
            -
                  end
         | 
| 70 | 
            -
                end
         | 
| 71 | 
            -
             | 
| 72 | 
            -
                context 'when including the index' do
         | 
| 73 | 
            -
                  it 'should return an array of two' do
         | 
| 74 | 
            -
                    resp = subject.ask_multiple_choice(Faker::Lorem.sentence, %w[one two three], true)
         | 
| 75 | 
            -
                    expect(resp).to be_a(Hash)
         | 
| 76 | 
            -
                    expect(resp[:choice]).to eq('three')
         | 
| 77 | 
            -
                    expect(resp[:index]).to eq(2)
         | 
| 78 | 
            -
                  end
         | 
| 79 | 
            -
                end
         | 
| 80 | 
            -
              end
         | 
| 81 | 
            -
             | 
| 82 | 
            -
              describe '#ask_checkbox' do
         | 
| 83 | 
            -
                it 'should ask the highline client ask' do
         | 
| 84 | 
            -
                  expect(highline).to receive(:ask).and_return('2')
         | 
| 85 | 
            -
                  subject.ask_checkbox(Faker::Lorem.sentence, %w[one two three], false)
         | 
| 86 | 
            -
                end
         | 
| 87 | 
            -
             | 
| 88 | 
            -
                context 'when not including the index' do
         | 
| 89 | 
            -
                  it 'should return an array of one from the options' do
         | 
| 90 | 
            -
                    allow(highline).to receive(:ask).and_return('1, 3')
         | 
| 91 | 
            -
                    resp = subject.ask_checkbox(Faker::Lorem.sentence, %w[one two three], false)
         | 
| 92 | 
            -
                    expect(resp).to be_a(Array)
         | 
| 93 | 
            -
                    expect(resp.count).to eq(2)
         | 
| 94 | 
            -
                    expect(resp).to include('one')
         | 
| 95 | 
            -
                  end
         | 
| 96 | 
            -
                end
         | 
| 97 | 
            -
             | 
| 98 | 
            -
                context 'when including the index' do
         | 
| 99 | 
            -
                  it 'should return an array of two' do
         | 
| 100 | 
            -
                    allow(highline).to receive(:ask).and_return('1, 3')
         | 
| 101 | 
            -
                    resp = subject.ask_checkbox(Faker::Lorem.sentence, %w[one two three], true)
         | 
| 102 | 
            -
                    expect(resp).to be_a(Array)
         | 
| 103 | 
            -
                    expect(resp.count).to eq(2)
         | 
| 104 | 
            -
                    expect(resp).to include({ choice: 'one', index: 0 })
         | 
| 105 | 
            -
                    expect(resp).to include({ choice: 'three', index: 2 })
         | 
| 106 | 
            -
                  end
         | 
| 107 | 
            -
                end
         | 
| 108 | 
            -
              end
         | 
| 109 | 
            -
            end
         |