tty-prompt 0.1.0 → 0.2.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 +0 -2
- data/CHANGELOG.md +12 -0
- data/README.md +223 -59
- data/lib/tty/prompt/choice.rb +83 -0
- data/lib/tty/prompt/choices.rb +92 -0
- data/lib/tty/prompt/codes.rb +32 -0
- data/lib/tty/prompt/cursor.rb +131 -0
- data/lib/tty/prompt/list.rb +209 -0
- data/lib/tty/prompt/mode/echo.rb +10 -9
- data/lib/tty/prompt/mode/raw.rb +10 -9
- data/lib/tty/prompt/multi_list.rb +105 -0
- data/lib/tty/prompt/question/validation.rb +12 -27
- data/lib/tty/prompt/question.rb +58 -107
- data/lib/tty/prompt/reader.rb +44 -11
- data/lib/tty/prompt/response.rb +31 -36
- data/lib/tty/prompt/response_delegation.rb +3 -2
- data/lib/tty/prompt/statement.rb +10 -10
- data/lib/tty/prompt/test.rb +15 -0
- data/lib/tty/prompt/version.rb +3 -3
- data/lib/tty/prompt.rb +72 -9
- data/lib/tty-prompt.rb +11 -0
- data/spec/unit/ask_spec.rb +32 -35
- data/spec/unit/choice/eql_spec.rb +24 -0
- data/spec/unit/choice/from_spec.rb +25 -0
- data/spec/unit/choices/add_spec.rb +14 -0
- data/spec/unit/choices/each_spec.rb +15 -0
- data/spec/unit/choices/new_spec.rb +12 -0
- data/spec/unit/choices/pluck_spec.rb +11 -0
- data/spec/unit/cursor/new_spec.rb +74 -0
- data/spec/unit/error_spec.rb +4 -8
- data/spec/unit/multi_select_spec.rb +163 -0
- data/spec/unit/question/character_spec.rb +5 -16
- data/spec/unit/question/default_spec.rb +4 -10
- data/spec/unit/question/in_spec.rb +15 -12
- data/spec/unit/question/initialize_spec.rb +1 -6
- data/spec/unit/question/modify_spec.rb +25 -24
- data/spec/unit/question/required_spec.rb +31 -0
- data/spec/unit/question/validate_spec.rb +25 -17
- data/spec/unit/question/validation/call_spec.rb +22 -0
- data/spec/unit/response/read_bool_spec.rb +38 -27
- data/spec/unit/response/read_char_spec.rb +5 -8
- data/spec/unit/response/read_date_spec.rb +8 -12
- data/spec/unit/response/read_email_spec.rb +25 -22
- data/spec/unit/response/read_multiple_spec.rb +11 -13
- data/spec/unit/response/read_number_spec.rb +12 -16
- data/spec/unit/response/read_range_spec.rb +10 -13
- data/spec/unit/response/read_spec.rb +39 -38
- data/spec/unit/response/read_string_spec.rb +7 -12
- data/spec/unit/say_spec.rb +10 -14
- data/spec/unit/select_spec.rb +192 -0
- data/spec/unit/statement/initialize_spec.rb +0 -4
- data/spec/unit/suggest_spec.rb +6 -9
- data/spec/unit/warn_spec.rb +4 -8
- metadata +32 -8
- data/spec/unit/question/argument_spec.rb +0 -30
- data/spec/unit/question/valid_spec.rb +0 -46
- data/spec/unit/question/validation/valid_value_spec.rb +0 -22
    
        data/lib/tty/prompt/question.rb
    CHANGED
    
    | @@ -2,7 +2,6 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            require 'tty/prompt/question/modifier'
         | 
| 4 4 | 
             
            require 'tty/prompt/question/validation'
         | 
| 5 | 
            -
             | 
| 6 5 | 
             
            require 'tty/prompt/response_delegation'
         | 
| 7 6 |  | 
| 8 7 | 
             
            module TTY
         | 
| @@ -12,23 +11,15 @@ module TTY | |
| 12 11 | 
             
                class Question
         | 
| 13 12 | 
             
                  include ResponseDelegation
         | 
| 14 13 |  | 
| 15 | 
            -
                   | 
| 16 | 
            -
                   | 
| 17 | 
            -
                   | 
| 18 | 
            -
             | 
| 19 | 
            -
                  # Store statement.
         | 
| 20 | 
            -
                  #
         | 
| 21 | 
            -
                  # @api private
         | 
| 22 | 
            -
                  attr_accessor :statement
         | 
| 14 | 
            +
                  # Store question message
         | 
| 15 | 
            +
                  # @api public
         | 
| 16 | 
            +
                  attr_reader :message
         | 
| 23 17 |  | 
| 24 18 | 
             
                  # Store default value.
         | 
| 25 19 | 
             
                  #
         | 
| 26 20 | 
             
                  # @api private
         | 
| 27 21 | 
             
                  attr_reader :default_value
         | 
| 28 22 |  | 
| 29 | 
            -
                  attr_reader :required
         | 
| 30 | 
            -
                  private :required
         | 
| 31 | 
            -
             | 
| 32 23 | 
             
                  attr_reader :validation
         | 
| 33 24 |  | 
| 34 25 | 
             
                  # Controls character processing of the answer
         | 
| @@ -36,11 +27,6 @@ module TTY | |
| 36 27 | 
             
                  # @api public
         | 
| 37 28 | 
             
                  attr_reader :modifier
         | 
| 38 29 |  | 
| 39 | 
            -
                  # Returns valid answers
         | 
| 40 | 
            -
                  #
         | 
| 41 | 
            -
                  # @api public
         | 
| 42 | 
            -
                  attr_reader :valid_values
         | 
| 43 | 
            -
             | 
| 44 30 | 
             
                  attr_reader :error
         | 
| 45 31 |  | 
| 46 32 | 
             
                  # Returns character mode
         | 
| @@ -49,14 +35,13 @@ module TTY | |
| 49 35 | 
             
                  attr_reader :character
         | 
| 50 36 |  | 
| 51 37 | 
             
                  # @api private
         | 
| 52 | 
            -
                  attr_reader : | 
| 53 | 
            -
                  private :shell
         | 
| 38 | 
            +
                  attr_reader :prompt
         | 
| 54 39 |  | 
| 55 40 | 
             
                  # Initialize a Question
         | 
| 56 41 | 
             
                  #
         | 
| 57 42 | 
             
                  # @api public
         | 
| 58 | 
            -
                  def initialize( | 
| 59 | 
            -
                    @ | 
| 43 | 
            +
                  def initialize(prompt, options = {})
         | 
| 44 | 
            +
                    @prompt        = prompt || Prompt.new
         | 
| 60 45 | 
             
                    @required      = options.fetch(:required) { false }
         | 
| 61 46 | 
             
                    @echo          = options.fetch(:echo) { true }
         | 
| 62 47 | 
             
                    @raw           = options.fetch(:raw) { false }
         | 
| @@ -64,33 +49,40 @@ module TTY | |
| 64 49 | 
             
                    @character     = options.fetch(:character) { false }
         | 
| 65 50 | 
             
                    @in            = options.fetch(:in) { false }
         | 
| 66 51 | 
             
                    @modifier      = Modifier.new options.fetch(:modifier) { [] }
         | 
| 67 | 
            -
                    @ | 
| 68 | 
            -
                    @ | 
| 69 | 
            -
                    @default_value = nil
         | 
| 52 | 
            +
                    @validation    = Validation.new(options.fetch(:validation) { nil })
         | 
| 53 | 
            +
                    @default       = options.fetch(:default) { nil }
         | 
| 70 54 | 
             
                    @error         = false
         | 
| 71 55 | 
             
                    @converter     = Necromancer.new
         | 
| 56 | 
            +
                    @read          = options.fetch(:read) { nil }
         | 
| 72 57 | 
             
                  end
         | 
| 73 58 |  | 
| 74 | 
            -
                  #  | 
| 59 | 
            +
                  # Call the quesiton
         | 
| 75 60 | 
             
                  #
         | 
| 76 61 | 
             
                  # @param [String] message
         | 
| 77 62 | 
             
                  #
         | 
| 78 63 | 
             
                  # @return [self]
         | 
| 79 64 | 
             
                  #
         | 
| 80 65 | 
             
                  # @api public
         | 
| 81 | 
            -
                  def  | 
| 82 | 
            -
                     | 
| 83 | 
            -
                     | 
| 84 | 
            -
                     | 
| 66 | 
            +
                  def call(message, &block)
         | 
| 67 | 
            +
                    @message = message
         | 
| 68 | 
            +
                    block.call(self) if block
         | 
| 69 | 
            +
                    prompt.output.print("#{prompt.prefix}#{message}")
         | 
| 70 | 
            +
                    render
         | 
| 71 | 
            +
                  end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                  # Reader answer and convert to type
         | 
| 74 | 
            +
                  #
         | 
| 75 | 
            +
                  # @api private
         | 
| 76 | 
            +
                  def render
         | 
| 77 | 
            +
                    dispatch.read_type(@read)
         | 
| 85 78 | 
             
                  end
         | 
| 86 79 |  | 
| 87 80 | 
             
                  # Set default value.
         | 
| 88 81 | 
             
                  #
         | 
| 89 82 | 
             
                  # @api public
         | 
| 90 83 | 
             
                  def default(value)
         | 
| 91 | 
            -
                    return  | 
| 92 | 
            -
                    @ | 
| 93 | 
            -
                    self
         | 
| 84 | 
            +
                    return @default unless value
         | 
| 85 | 
            +
                    @default = value
         | 
| 94 86 | 
             
                  end
         | 
| 95 87 |  | 
| 96 88 | 
             
                  # Check if default value is set
         | 
| @@ -99,31 +91,16 @@ module TTY | |
| 99 91 | 
             
                  #
         | 
| 100 92 | 
             
                  # @api public
         | 
| 101 93 | 
             
                  def default?
         | 
| 102 | 
            -
                    !!@ | 
| 94 | 
            +
                    !!@default
         | 
| 103 95 | 
             
                  end
         | 
| 104 96 |  | 
| 105 | 
            -
                  # Ensure that passed argument is present  | 
| 106 | 
            -
                  #
         | 
| 107 | 
            -
                  # @return [Question]
         | 
| 108 | 
            -
                  #
         | 
| 109 | 
            -
                  # @api public
         | 
| 110 | 
            -
                  def argument(value)
         | 
| 111 | 
            -
                    case value
         | 
| 112 | 
            -
                    when :required
         | 
| 113 | 
            -
                      @required = true
         | 
| 114 | 
            -
                    when :optional
         | 
| 115 | 
            -
                      @required = false
         | 
| 116 | 
            -
                    end
         | 
| 117 | 
            -
                    self
         | 
| 118 | 
            -
                  end
         | 
| 119 | 
            -
             | 
| 120 | 
            -
                  # Check if required argument present.
         | 
| 97 | 
            +
                  # Ensure that passed argument is present or not
         | 
| 121 98 | 
             
                  #
         | 
| 122 99 | 
             
                  # @return [Boolean]
         | 
| 123 100 | 
             
                  #
         | 
| 124 | 
            -
                  # @api  | 
| 125 | 
            -
                  def required | 
| 126 | 
            -
                    required
         | 
| 101 | 
            +
                  # @api public
         | 
| 102 | 
            +
                  def required(value)
         | 
| 103 | 
            +
                    @required = value
         | 
| 127 104 | 
             
                  end
         | 
| 128 105 |  | 
| 129 106 | 
             
                  # Set validation rule for an argument
         | 
| @@ -135,29 +112,6 @@ module TTY | |
| 135 112 | 
             
                  # @api public
         | 
| 136 113 | 
             
                  def validate(value = nil, &block)
         | 
| 137 114 | 
             
                    @validation = Validation.new(value || block)
         | 
| 138 | 
            -
                    self
         | 
| 139 | 
            -
                  end
         | 
| 140 | 
            -
             | 
| 141 | 
            -
                  # Set expected values
         | 
| 142 | 
            -
                  #
         | 
| 143 | 
            -
                  # @param [Array] values
         | 
| 144 | 
            -
                  #
         | 
| 145 | 
            -
                  # @return [self]
         | 
| 146 | 
            -
                  #
         | 
| 147 | 
            -
                  # @api public
         | 
| 148 | 
            -
                  def valid(values)
         | 
| 149 | 
            -
                    @valid_values = values
         | 
| 150 | 
            -
                    self
         | 
| 151 | 
            -
                  end
         | 
| 152 | 
            -
             | 
| 153 | 
            -
                  # Reset question object.
         | 
| 154 | 
            -
                  #
         | 
| 155 | 
            -
                  # @api public
         | 
| 156 | 
            -
                  def clean
         | 
| 157 | 
            -
                    @statement     = nil
         | 
| 158 | 
            -
                    @default_value = nil
         | 
| 159 | 
            -
                    @required      = false
         | 
| 160 | 
            -
                    @modifier      = nil
         | 
| 161 115 | 
             
                  end
         | 
| 162 116 |  | 
| 163 117 | 
             
                  # Modify string according to the rule given.
         | 
| @@ -167,7 +121,6 @@ module TTY | |
| 167 121 | 
             
                  # @api public
         | 
| 168 122 | 
             
                  def modify(*rules)
         | 
| 169 123 | 
             
                    @modifier = Modifier.new(*rules)
         | 
| 170 | 
            -
                    self
         | 
| 171 124 | 
             
                  end
         | 
| 172 125 |  | 
| 173 126 | 
             
                  # Setup behaviour when error(s) occur
         | 
| @@ -175,7 +128,6 @@ module TTY | |
| 175 128 | 
             
                  # @api public
         | 
| 176 129 | 
             
                  def on_error(action = nil)
         | 
| 177 130 | 
             
                    @error = action
         | 
| 178 | 
            -
                    self
         | 
| 179 131 | 
             
                  end
         | 
| 180 132 |  | 
| 181 133 | 
             
                  # Check if error behaviour is set
         | 
| @@ -192,7 +144,6 @@ module TTY | |
| 192 144 | 
             
                  def echo(value = nil)
         | 
| 193 145 | 
             
                    return @echo if value.nil?
         | 
| 194 146 | 
             
                    @echo = value
         | 
| 195 | 
            -
                    self
         | 
| 196 147 | 
             
                  end
         | 
| 197 148 |  | 
| 198 149 | 
             
                  # Chec if echo is set
         | 
| @@ -208,7 +159,6 @@ module TTY | |
| 208 159 | 
             
                  def raw(value = nil)
         | 
| 209 160 | 
             
                    return @raw if value.nil?
         | 
| 210 161 | 
             
                    @raw = value
         | 
| 211 | 
            -
                    self
         | 
| 212 162 | 
             
                  end
         | 
| 213 163 |  | 
| 214 164 | 
             
                  # Check if raw mode is set
         | 
| @@ -228,7 +178,6 @@ module TTY | |
| 228 178 | 
             
                  def mask(char = nil)
         | 
| 229 179 | 
             
                    return @mask if char.nil?
         | 
| 230 180 | 
             
                    @mask = char
         | 
| 231 | 
            -
                    self
         | 
| 232 181 | 
             
                  end
         | 
| 233 182 |  | 
| 234 183 | 
             
                  # Check if character mask is set
         | 
| @@ -250,7 +199,6 @@ module TTY | |
| 250 199 | 
             
                  def char(value = nil)
         | 
| 251 200 | 
             
                    return @character if value.nil?
         | 
| 252 201 | 
             
                    @character = value
         | 
| 253 | 
            -
                    self
         | 
| 254 202 | 
             
                  end
         | 
| 255 203 |  | 
| 256 204 | 
             
                  # Check if character intput is set
         | 
| @@ -270,7 +218,6 @@ module TTY | |
| 270 218 | 
             
                  def in(value = nil)
         | 
| 271 219 | 
             
                    return @in if value.nil?
         | 
| 272 220 | 
             
                    @in = @converter.convert(value).to(:range, strict: true)
         | 
| 273 | 
            -
                    self
         | 
| 274 221 | 
             
                  end
         | 
| 275 222 |  | 
| 276 223 | 
             
                  # Check if range is set
         | 
| @@ -289,15 +236,32 @@ module TTY | |
| 289 236 | 
             
                  # @return [Object]
         | 
| 290 237 | 
             
                  #
         | 
| 291 238 | 
             
                  # @api private
         | 
| 292 | 
            -
                  def evaluate_response( | 
| 293 | 
            -
                    return  | 
| 294 | 
            -
                    check_required( | 
| 295 | 
            -
                    return if  | 
| 296 | 
            -
             | 
| 297 | 
            -
                     | 
| 298 | 
            -
                     | 
| 299 | 
            -
                     | 
| 300 | 
            -
             | 
| 239 | 
            +
                  def evaluate_response(input)
         | 
| 240 | 
            +
                    return @default if !input && default?
         | 
| 241 | 
            +
                    check_required(input)
         | 
| 242 | 
            +
                    return if input.nil?
         | 
| 243 | 
            +
             | 
| 244 | 
            +
                    within?(input)
         | 
| 245 | 
            +
                    validation.(input)
         | 
| 246 | 
            +
                    modifier.apply_to(input)
         | 
| 247 | 
            +
                  end
         | 
| 248 | 
            +
             | 
| 249 | 
            +
                  # Reset question object.
         | 
| 250 | 
            +
                  #
         | 
| 251 | 
            +
                  # @api public
         | 
| 252 | 
            +
                  def clean
         | 
| 253 | 
            +
                    @message  = nil
         | 
| 254 | 
            +
                    @default  = nil
         | 
| 255 | 
            +
                    @required = false
         | 
| 256 | 
            +
                    @modifier = nil
         | 
| 257 | 
            +
                  end
         | 
| 258 | 
            +
             | 
| 259 | 
            +
                  def to_s
         | 
| 260 | 
            +
                    "#{message}"
         | 
| 261 | 
            +
                  end
         | 
| 262 | 
            +
             | 
| 263 | 
            +
                  def inspect
         | 
| 264 | 
            +
                    "#<Question @message=#{message}>"
         | 
| 301 265 | 
             
                  end
         | 
| 302 266 |  | 
| 303 267 | 
             
                  private
         | 
| @@ -306,31 +270,18 @@ module TTY | |
| 306 270 | 
             
                  #
         | 
| 307 271 | 
             
                  # @api private
         | 
| 308 272 | 
             
                  def check_required(value)
         | 
| 309 | 
            -
                    if required | 
| 273 | 
            +
                    if @required && !default? && value.nil?
         | 
| 310 274 | 
             
                      fail ArgumentRequired, 'No value provided for required'
         | 
| 311 275 | 
             
                    end
         | 
| 312 276 | 
             
                  end
         | 
| 313 277 |  | 
| 314 | 
            -
                  # Check if value matches any of the expected values
         | 
| 315 | 
            -
                  #
         | 
| 316 | 
            -
                  # @api private
         | 
| 317 | 
            -
                  def check_valid(value)
         | 
| 318 | 
            -
                    if Array(value).all? { |val| valid_values.include? val }
         | 
| 319 | 
            -
                      return value
         | 
| 320 | 
            -
                    else
         | 
| 321 | 
            -
                      fail InvalidArgument, "Valid values are: #{valid_values.join(', ')}"
         | 
| 322 | 
            -
                    end
         | 
| 323 | 
            -
                  end
         | 
| 324 | 
            -
             | 
| 325 278 | 
             
                  # Check if value is within expected range
         | 
| 326 279 | 
             
                  #
         | 
| 327 280 | 
             
                  # @api private
         | 
| 328 281 | 
             
                  def within?(value)
         | 
| 329 282 | 
             
                    if in? && value
         | 
| 330 | 
            -
                       | 
| 331 | 
            -
             | 
| 332 | 
            -
                        fail InvalidArgument, "Value #{value} is not included in the range #{@in}"
         | 
| 333 | 
            -
                      end
         | 
| 283 | 
            +
                      @in.include?(value) || fail(InvalidArgument,
         | 
| 284 | 
            +
                        "Value #{value} is not included in the range #{@in}")
         | 
| 334 285 | 
             
                    end
         | 
| 335 286 | 
             
                  end
         | 
| 336 287 | 
             
                end # Question
         | 
    
        data/lib/tty/prompt/reader.rb
    CHANGED
    
    | @@ -6,8 +6,8 @@ module TTY | |
| 6 6 | 
             
                # A class responsible for reading character input from STDIN
         | 
| 7 7 | 
             
                class Reader
         | 
| 8 8 | 
             
                  # @api private
         | 
| 9 | 
            -
                  attr_reader : | 
| 10 | 
            -
                  private : | 
| 9 | 
            +
                  attr_reader :prompt
         | 
| 10 | 
            +
                  private :prompt
         | 
| 11 11 |  | 
| 12 12 | 
             
                  attr_reader :mode
         | 
| 13 13 |  | 
| @@ -20,8 +20,8 @@ module TTY | |
| 20 20 | 
             
                  # Initialize a Reader
         | 
| 21 21 | 
             
                  #
         | 
| 22 22 | 
             
                  # @api public
         | 
| 23 | 
            -
                  def initialize( | 
| 24 | 
            -
                    @ | 
| 23 | 
            +
                  def initialize(prompt = Prompt.new)
         | 
| 24 | 
            +
                    @prompt = prompt
         | 
| 25 25 | 
             
                    @mode  = Mode.new
         | 
| 26 26 | 
             
                  end
         | 
| 27 27 |  | 
| @@ -36,16 +36,49 @@ module TTY | |
| 36 36 | 
             
                  #
         | 
| 37 37 | 
             
                  # @api public
         | 
| 38 38 | 
             
                  def buffer(&block)
         | 
| 39 | 
            -
                    bufferring =  | 
| 39 | 
            +
                    bufferring = prompt.output.sync
         | 
| 40 40 | 
             
                    # Immediately flush output
         | 
| 41 | 
            -
                     | 
| 41 | 
            +
                    prompt.output.sync = true
         | 
| 42 42 |  | 
| 43 43 | 
             
                    value = block.call if block_given?
         | 
| 44 44 |  | 
| 45 | 
            -
                     | 
| 45 | 
            +
                    prompt.output.sync = bufferring
         | 
| 46 46 | 
             
                    value
         | 
| 47 47 | 
             
                  end
         | 
| 48 48 |  | 
| 49 | 
            +
                  # Read a single keypress that may include
         | 
| 50 | 
            +
                  # 2 or 3 escape characters.
         | 
| 51 | 
            +
                  #
         | 
| 52 | 
            +
                  # @return [String]
         | 
| 53 | 
            +
                  #
         | 
| 54 | 
            +
                  # @api public
         | 
| 55 | 
            +
                  def read_keypress
         | 
| 56 | 
            +
                    buffer do
         | 
| 57 | 
            +
                      mode.echo(false) do
         | 
| 58 | 
            +
                        mode.raw(true) do
         | 
| 59 | 
            +
                          read_char
         | 
| 60 | 
            +
                        end
         | 
| 61 | 
            +
                      end
         | 
| 62 | 
            +
                    end
         | 
| 63 | 
            +
                  end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                  # Reads single character including invisible multibyte codes
         | 
| 66 | 
            +
                  #
         | 
| 67 | 
            +
                  # @return [String]
         | 
| 68 | 
            +
                  #
         | 
| 69 | 
            +
                  # @api public
         | 
| 70 | 
            +
                  def read_char
         | 
| 71 | 
            +
                    chars = prompt.input.getc.chr
         | 
| 72 | 
            +
                    if chars == "\e"
         | 
| 73 | 
            +
                      chars = prompt.input.read_nonblock(3) rescue chars
         | 
| 74 | 
            +
                      chars = prompt.input.read_nonblock(2) rescue chars
         | 
| 75 | 
            +
                      chars = "\e" + chars
         | 
| 76 | 
            +
                    end
         | 
| 77 | 
            +
                    chars
         | 
| 78 | 
            +
                  rescue
         | 
| 79 | 
            +
                    chars
         | 
| 80 | 
            +
                  end
         | 
| 81 | 
            +
             | 
| 49 82 | 
             
                  # Get a value from STDIN one key at a time. Each key press is echoed back
         | 
| 50 83 | 
             
                  # to the shell masked with character(if given). The input finishes when
         | 
| 51 84 | 
             
                  # enter key is pressed.
         | 
| @@ -60,7 +93,7 @@ module TTY | |
| 60 93 | 
             
                    value = ''
         | 
| 61 94 | 
             
                    buffer do
         | 
| 62 95 | 
             
                      begin
         | 
| 63 | 
            -
                        while (char =  | 
| 96 | 
            +
                        while (char = prompt.input.getbyte) &&
         | 
| 64 97 | 
             
                            !(char == CARRIAGE_RETURN || char == NEWLINE)
         | 
| 65 98 | 
             
                          value = handle_char value, char, not_set, mask
         | 
| 66 99 | 
             
                        end
         | 
| @@ -75,7 +108,7 @@ module TTY | |
| 75 108 | 
             
                  #
         | 
| 76 109 | 
             
                  # @api public
         | 
| 77 110 | 
             
                  def gets
         | 
| 78 | 
            -
                     | 
| 111 | 
            +
                    prompt.input.gets
         | 
| 79 112 | 
             
                  end
         | 
| 80 113 |  | 
| 81 114 | 
             
                  # Reads at maximum +maxlen+ characters.
         | 
| @@ -84,7 +117,7 @@ module TTY | |
| 84 117 | 
             
                  #
         | 
| 85 118 | 
             
                  # @api public
         | 
| 86 119 | 
             
                  def readpartial(maxlen)
         | 
| 87 | 
            -
                     | 
| 120 | 
            +
                    prompt.input.readpartial(maxlen)
         | 
| 88 121 | 
             
                  end
         | 
| 89 122 |  | 
| 90 123 | 
             
                  private
         | 
| @@ -106,7 +139,7 @@ module TTY | |
| 106 139 | 
             
                  #
         | 
| 107 140 | 
             
                  # @api private
         | 
| 108 141 | 
             
                  def print_char(char, not_set, mask)
         | 
| 109 | 
            -
                     | 
| 142 | 
            +
                    prompt.output.putc((not_set || !mask) ? char : mask)
         | 
| 110 143 | 
             
                  end
         | 
| 111 144 | 
             
                end # Reader
         | 
| 112 145 | 
             
              end # Prompt
         | 
    
        data/lib/tty/prompt/response.rb
    CHANGED
    
    | @@ -5,16 +5,6 @@ module TTY | |
| 5 5 | 
             
              class Prompt
         | 
| 6 6 | 
             
                # A class representing a shell response
         | 
| 7 7 | 
             
                class Response
         | 
| 8 | 
            -
                  VALID_TYPES = [
         | 
| 9 | 
            -
                    :boolean,
         | 
| 10 | 
            -
                    :string,
         | 
| 11 | 
            -
                    :symbol,
         | 
| 12 | 
            -
                    :integer,
         | 
| 13 | 
            -
                    :float,
         | 
| 14 | 
            -
                    :date,
         | 
| 15 | 
            -
                    :datetime
         | 
| 16 | 
            -
                  ]
         | 
| 17 | 
            -
             | 
| 18 8 | 
             
                  attr_reader :reader
         | 
| 19 9 | 
             
                  private :reader
         | 
| 20 10 |  | 
| @@ -24,11 +14,11 @@ module TTY | |
| 24 14 | 
             
                  # Initialize a Response
         | 
| 25 15 | 
             
                  #
         | 
| 26 16 | 
             
                  # @api public
         | 
| 27 | 
            -
                  def initialize(question,  | 
| 17 | 
            +
                  def initialize(question, prompt)
         | 
| 28 18 | 
             
                    @question  = question
         | 
| 29 | 
            -
                    @ | 
| 19 | 
            +
                    @prompt    = prompt
         | 
| 30 20 | 
             
                    @converter = Necromancer.new
         | 
| 31 | 
            -
                    @reader    = Reader.new(@ | 
| 21 | 
            +
                    @reader    = Reader.new(@prompt)
         | 
| 32 22 | 
             
                  end
         | 
| 33 23 |  | 
| 34 24 | 
             
                  # Read input from STDIN either character or line
         | 
| @@ -109,14 +99,6 @@ module TTY | |
| 109 99 | 
             
                    evaluate_response { |input| input.to_sym }
         | 
| 110 100 | 
             
                  end
         | 
| 111 101 |  | 
| 112 | 
            -
                  # Read answer from predifined choicse
         | 
| 113 | 
            -
                  #
         | 
| 114 | 
            -
                  # @api public
         | 
| 115 | 
            -
                  def read_choice(type = nil)
         | 
| 116 | 
            -
                    question.argument(:required) unless question.default?
         | 
| 117 | 
            -
                    evaluate_response
         | 
| 118 | 
            -
                  end
         | 
| 119 | 
            -
             | 
| 120 102 | 
             
                  # Read integer value
         | 
| 121 103 | 
             
                  #
         | 
| 122 104 | 
             
                  # @api public
         | 
| @@ -180,14 +162,14 @@ module TTY | |
| 180 162 | 
             
                  # @api public
         | 
| 181 163 | 
             
                  def read_email
         | 
| 182 164 | 
             
                    question.validate(/^[a-z0-9._%+-]+@([a-z0-9-]+\.)+[a-z]{2,6}$/i)
         | 
| 183 | 
            -
                    question. | 
| 165 | 
            +
                    question.call("\n" + question.statement) if question.error?
         | 
| 184 166 | 
             
                    with_exception { read_string }
         | 
| 185 167 | 
             
                  end
         | 
| 186 168 |  | 
| 187 169 | 
             
                  # Read answer provided on multiple lines
         | 
| 188 170 | 
             
                  #
         | 
| 189 171 | 
             
                  # @api public
         | 
| 190 | 
            -
                  def  | 
| 172 | 
            +
                  def read_multiline
         | 
| 191 173 | 
             
                    response = ''
         | 
| 192 174 | 
             
                    loop do
         | 
| 193 175 | 
             
                      value = evaluate_response
         | 
| @@ -217,8 +199,6 @@ module TTY | |
| 217 199 | 
             
                    end
         | 
| 218 200 | 
             
                  end
         | 
| 219 201 |  | 
| 220 | 
            -
                  private
         | 
| 221 | 
            -
             | 
| 222 202 | 
             
                  # Ignore exception
         | 
| 223 203 | 
             
                  #
         | 
| 224 204 | 
             
                  # @api private
         | 
| @@ -232,21 +212,36 @@ module TTY | |
| 232 212 | 
             
                  #   :boolean, :string, :numeric, :array
         | 
| 233 213 | 
             
                  #
         | 
| 234 214 | 
             
                  # @api private
         | 
| 235 | 
            -
                  def read_type(class_or_name)
         | 
| 236 | 
            -
                     | 
| 237 | 
            -
                     | 
| 238 | 
            -
             | 
| 215 | 
            +
                  def read_type(class_or_name = nil)
         | 
| 216 | 
            +
                    case class_or_name
         | 
| 217 | 
            +
                    when :bool
         | 
| 218 | 
            +
                      read_bool
         | 
| 219 | 
            +
                    when :email
         | 
| 220 | 
            +
                      read_email
         | 
| 221 | 
            +
                    when :char
         | 
| 222 | 
            +
                      read_char
         | 
| 223 | 
            +
                    when :date
         | 
| 224 | 
            +
                      read_date
         | 
| 225 | 
            +
                    when :int
         | 
| 226 | 
            +
                      read_int
         | 
| 227 | 
            +
                    when :range
         | 
| 228 | 
            +
                      read_range
         | 
| 229 | 
            +
                    when :multiline
         | 
| 230 | 
            +
                      read_multiline
         | 
| 231 | 
            +
                    when :float
         | 
| 232 | 
            +
                      read_float
         | 
| 233 | 
            +
                    when :file
         | 
| 234 | 
            +
                      read_file
         | 
| 235 | 
            +
                    when :string
         | 
| 239 236 | 
             
                      read_string
         | 
| 240 | 
            -
                    when :symbol | 
| 237 | 
            +
                    when :symbol
         | 
| 241 238 | 
             
                      read_symbol
         | 
| 242 | 
            -
                    when : | 
| 243 | 
            -
                       | 
| 239 | 
            +
                    when :keypress
         | 
| 240 | 
            +
                      read_keypress
         | 
| 241 | 
            +
                    else
         | 
| 242 | 
            +
                      read
         | 
| 244 243 | 
             
                    end
         | 
| 245 244 | 
             
                  end
         | 
| 246 | 
            -
             | 
| 247 | 
            -
                  def valid_type?(type)
         | 
| 248 | 
            -
                    self.class::VALID_TYPES.include? type.to_sym
         | 
| 249 | 
            -
                  end
         | 
| 250 245 | 
             
                end # Response
         | 
| 251 246 | 
             
              end # Prompt
         | 
| 252 247 | 
             
            end # TTY
         | 
| @@ -25,14 +25,15 @@ module TTY | |
| 25 25 | 
             
                                            :read_regex,
         | 
| 26 26 | 
             
                                            :read_string,
         | 
| 27 27 | 
             
                                            :read_symbol,
         | 
| 28 | 
            -
                                            :read_text
         | 
| 28 | 
            +
                                            :read_text,
         | 
| 29 | 
            +
                                            :read_type
         | 
| 29 30 |  | 
| 30 31 | 
             
                  # Create response instance when question readed is invoked
         | 
| 31 32 | 
             
                  #
         | 
| 32 33 | 
             
                  # @param [Response] response
         | 
| 33 34 | 
             
                  #
         | 
| 34 35 | 
             
                  # @api private
         | 
| 35 | 
            -
                  def dispatch(response = Response.new(self,  | 
| 36 | 
            +
                  def dispatch(response = Response.new(self, prompt))
         | 
| 36 37 | 
             
                    @response ||= response
         | 
| 37 38 | 
             
                  end
         | 
| 38 39 |  | 
    
        data/lib/tty/prompt/statement.rb
    CHANGED
    
    | @@ -3,11 +3,11 @@ | |
| 3 3 | 
             
            module TTY
         | 
| 4 4 | 
             
              # A class responsible for shell prompt interactions.
         | 
| 5 5 | 
             
              class Prompt
         | 
| 6 | 
            -
                # A class representing a statement output to  | 
| 6 | 
            +
                # A class representing a statement output to prompt.
         | 
| 7 7 | 
             
                class Statement
         | 
| 8 8 | 
             
                  # @api private
         | 
| 9 | 
            -
                  attr_reader : | 
| 10 | 
            -
                  private : | 
| 9 | 
            +
                  attr_reader :prompt
         | 
| 10 | 
            +
                  private :prompt
         | 
| 11 11 |  | 
| 12 12 | 
             
                  # Flag to display newline
         | 
| 13 13 | 
             
                  #
         | 
| @@ -21,7 +21,7 @@ module TTY | |
| 21 21 |  | 
| 22 22 | 
             
                  # Initialize a Statement
         | 
| 23 23 | 
             
                  #
         | 
| 24 | 
            -
                  # @param [TTY:: | 
| 24 | 
            +
                  # @param [TTY::Prompt] prompt
         | 
| 25 25 | 
             
                  #
         | 
| 26 26 | 
             
                  # @param [Hash] options
         | 
| 27 27 | 
             
                  #
         | 
| @@ -32,14 +32,14 @@ module TTY | |
| 32 32 | 
             
                  #   change the message display to color
         | 
| 33 33 | 
             
                  #
         | 
| 34 34 | 
             
                  # @api public
         | 
| 35 | 
            -
                  def initialize( | 
| 36 | 
            -
                    @ | 
| 35 | 
            +
                  def initialize(prompt = Prompt.new, options = {})
         | 
| 36 | 
            +
                    @prompt   = prompt
         | 
| 37 37 | 
             
                    @pastel  = Pastel.new
         | 
| 38 38 | 
             
                    @newline = options.fetch(:newline, true)
         | 
| 39 39 | 
             
                    @color   = options.fetch(:color, false)
         | 
| 40 40 | 
             
                  end
         | 
| 41 41 |  | 
| 42 | 
            -
                  # Output the message to the  | 
| 42 | 
            +
                  # Output the message to the prompt
         | 
| 43 43 | 
             
                  #
         | 
| 44 44 | 
             
                  # @param [String] message
         | 
| 45 45 | 
             
                  #   the message to be printed to stdout
         | 
| @@ -49,10 +49,10 @@ module TTY | |
| 49 49 | 
             
                    message = @pastel.decorate message, *color if color
         | 
| 50 50 |  | 
| 51 51 | 
             
                    if newline && /( |\t)(\e\[\d+(;\d+)*m)?\Z/ !~ message
         | 
| 52 | 
            -
                       | 
| 52 | 
            +
                      prompt.output.puts message
         | 
| 53 53 | 
             
                    else
         | 
| 54 | 
            -
                       | 
| 55 | 
            -
                       | 
| 54 | 
            +
                      prompt.output.print message
         | 
| 55 | 
            +
                      prompt.output.flush
         | 
| 56 56 | 
             
                    end
         | 
| 57 57 | 
             
                  end
         | 
| 58 58 | 
             
                end # Statement
         | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'tty/prompt'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module TTY
         | 
| 6 | 
            +
              # Used for initializing test cases
         | 
| 7 | 
            +
              class TestPrompt < Prompt
         | 
| 8 | 
            +
                def initialize(options = {})
         | 
| 9 | 
            +
                  @input  = StringIO.new
         | 
| 10 | 
            +
                  @output = StringIO.new
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  super(@input, @output, options)
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
              end # TestPrompt
         | 
| 15 | 
            +
            end # TTY
         | 
    
        data/lib/tty/prompt/version.rb
    CHANGED