tty-reader 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7f034dd9a1da1468f59ef2cf8c1ef164c5d85991d7aa0d9760eca05558d09978
4
- data.tar.gz: '097df714a88a98b2352e202e69c7da48db124a8f637516449676a8647aee31f3'
3
+ metadata.gz: 7766384b749f39d5646ce4ff20d95c1bdfdaac5af096d4a996a7a347379874ee
4
+ data.tar.gz: c5a85b72fae90d018f79acdd9303c9926b75236fb67a2b24e641f6737a001372
5
5
  SHA512:
6
- metadata.gz: 04cf6b1571693791baadf0f686f320393e17a0bd6b1a51aa61c28a34b20e65cb5a6efcca77a3ef21b0c4e2ff422ce3467cea3285b7c477783a5c91f3b1f08bde
7
- data.tar.gz: ef5d9d50c2bad451a4cb326547e979a36bca173c0f02df90c202fc702823bd12c2bed8c47d0b47e16ccd6a9d1b644552d1ecea3f605629afaa0b975ac60d0b2b
6
+ metadata.gz: 74bd44d949d086d8debe53bdd571755b263fce26d991dd7798d45fbb24513cdadea0a29c31e3388a65ce8f81f3b3514955d69c44c30af87465ba32933f5f6997
7
+ data.tar.gz: 4ad0c8d086506a2672f2a8bb8db1fbd9f951e2f1f9200f4c258e82967cf61bbea209a33fdd86aa4cfb99adf4e5b7fcdcf6e5b0f992da6fe9956daa5d5aade238
@@ -1,5 +1,20 @@
1
1
  # Change log
2
2
 
3
+ ## [v0.9.0] - 2020-12-08
4
+
5
+ ### Added
6
+ * Add buffer to save input when traversing history and restore it back
7
+ similar to shell
8
+
9
+ ### Changed
10
+ * Pressing :down no longer erases the #read_line input if history is disabled by Charles Pence (@pencechp)
11
+ * Change Reader initializer to use keyword arguments in place of options hash
12
+ * Change history to only exclude empty lines without any space or invisible characters
13
+ * Change all input reading methods to use explicit keyword arguments
14
+
15
+ ### Fix
16
+ * Fix #read_multiline :value parameter to insert content only once in the first line
17
+
3
18
  ## [v0.8.0] - 2020-06-28
4
19
 
5
20
  ### Changed
@@ -73,6 +88,7 @@
73
88
 
74
89
  * Initial implementation and release
75
90
 
91
+ [v0.9.0]: https://github.com/piotrmurach/tty-reader/compare/v0.8.0...v0.9.0
76
92
  [v0.8.0]: https://github.com/piotrmurach/tty-reader/compare/v0.7.0...v0.8.0
77
93
  [v0.7.0]: https://github.com/piotrmurach/tty-reader/compare/v0.6.0...v0.7.0
78
94
  [v0.6.0]: https://github.com/piotrmurach/tty-reader/compare/v0.5.0...v0.6.0
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2017 Piotr Murach
3
+ Copyright (c) 2017 Piotr Murach (https://piotrmurach.com)
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,11 +1,11 @@
1
1
  <div align="center">
2
- <a href="https://piotrmurach.github.io/tty" target="_blank"><img width="130" src="https://cdn.rawgit.com/piotrmurach/tty/master/images/tty.png" alt="tty logo" /></a>
2
+ <a href="https://ttytoolkit.org"><img width="130" src="https://github.com/piotrmurach/tty/raw/master/images/tty.png" alt="TTY Toolkit logo" /></a>
3
3
  </div>
4
4
 
5
5
  # TTY::Reader [![Gitter](https://badges.gitter.im/Join%20Chat.svg)][gitter]
6
6
 
7
7
  [![Gem Version](https://badge.fury.io/rb/tty-reader.svg)][gem]
8
- [![Build Status](https://secure.travis-ci.org/piotrmurach/tty-reader.svg?branch=master)][travis]
8
+ [![Actions CI](https://github.com/piotrmurach/tty-reader/workflows/CI/badge.svg?branch=master)][gh_actions_ci]
9
9
  [![Build status](https://ci.appveyor.com/api/projects/status/cj4owy2vlty2q1ko?svg=true)][appveyor]
10
10
  [![Maintainability](https://api.codeclimate.com/v1/badges/2f68d5e8ecc271bda820/maintainability)][codeclimate]
11
11
  [![Coverage Status](https://coveralls.io/repos/github/piotrmurach/tty-reader/badge.svg)][coverage]
@@ -13,6 +13,7 @@
13
13
 
14
14
  [gitter]: https://gitter.im/piotrmurach/tty
15
15
  [gem]: http://badge.fury.io/rb/tty-reader
16
+ [gh_actions_ci]: https://github.com/piotrmurach/tty-reader/actions?query=workflow%3ACI
16
17
  [travis]: http://travis-ci.org/piotrmurach/tty-reader
17
18
  [appveyor]: https://ci.appveyor.com/project/piotrmurach/tty-reader
18
19
  [codeclimate]: https://codeclimate.com/github/piotrmurach/tty-reader/maintainability
@@ -48,7 +49,7 @@ The `tty-reader` is not compatible with the GNU Readline and doesn't aim to be.
48
49
  Add this line to your application's Gemfile:
49
50
 
50
51
  ```ruby
51
- gem 'tty-reader'
52
+ gem "tty-reader"
52
53
  ```
53
54
 
54
55
  And then execute:
@@ -99,7 +100,7 @@ Finally, keep asking user for line input with a `=>` as a prompt:
99
100
 
100
101
  ```ruby
101
102
  loop do
102
- reader.read_line('=> ')
103
+ reader.read_line("=> ")
103
104
  end
104
105
  ```
105
106
 
@@ -207,11 +208,11 @@ For example, to add listen to vim like navigation keys, one would do the followi
207
208
 
208
209
  ```ruby
209
210
  reader.on(:keypress) do |event|
210
- if event.value == 'j'
211
+ if event.value == "j"
211
212
  ...
212
213
  end
213
214
 
214
- if event.value == 'k'
215
+ if event.value == "k"
215
216
  ...
216
217
  end
217
218
  end
@@ -220,8 +221,8 @@ end
220
221
  You can subscribe to more than one event:
221
222
 
222
223
  ```ruby
223
- prompt.on(:keypress) { |key| ... }
224
- .on(:keydown) { |key| ... }
224
+ reader.on(:keypress) { |event| ... }
225
+ .on(:keydown) { |event| ... }
225
226
  ```
226
227
 
227
228
  ### 2.5 subscribe
@@ -274,10 +275,10 @@ To add vim bindings for line editing you could discern between alphanumeric inpu
274
275
 
275
276
  ```ruby
276
277
  reader.on(:keypress) do |event|
277
- if event.value == 'j'
278
+ if event.value == "j"
278
279
  reader.trigger(:keydown)
279
280
  end
280
- if evevnt.value == 'k'
281
+ if evevnt.value == "k"
281
282
  reader.trigger(:keyup)
282
283
  end
283
284
  end
@@ -20,6 +20,15 @@ module TTY
20
20
  class Reader
21
21
  include Wisper::Publisher
22
22
 
23
+ # Key codes
24
+ CARRIAGE_RETURN = 13
25
+ NEWLINE = 10
26
+ BACKSPACE = 8
27
+ DELETE = 127
28
+
29
+ # Keys that terminate input
30
+ EXIT_KEYS = [:ctrl_d, :ctrl_z]
31
+
23
32
  # Raised when the user hits the interrupt key(Control-C)
24
33
  #
25
34
  # @api public
@@ -47,42 +56,44 @@ module TTY
47
56
 
48
57
  attr_reader :cursor
49
58
 
50
- # Key codes
51
- CARRIAGE_RETURN = 13
52
- NEWLINE = 10
53
- BACKSPACE = 8
54
- DELETE = 127
55
-
56
59
  # Initialize a Reader
57
60
  #
58
61
  # @param [IO] input
59
62
  # the input stream
60
63
  # @param [IO] output
61
64
  # the output stream
62
- # @param [Hash] options
63
- # @option options [Symbol] :interrupt
64
- # handling of Ctrl+C key out of :signal, :exit, :noop
65
- # @option options [Boolean] :track_history
65
+ # @param [Symbol] interrupt
66
+ # the way to handle the Ctrl+C key out of :signal, :exit, :noop
67
+ # @param [Hash] env
68
+ # the environment variables
69
+ # @param [Boolean] track_history
66
70
  # disable line history tracking, true by default
71
+ # @param [Boolean] history_cycle
72
+ # allow cycling through history, false by default
73
+ # @param [Boolean] history_duplicates
74
+ # allow duplicate entires, false by default
75
+ # @param [Proc] history_exclude
76
+ # exclude lines from history, by default all lines are stored
67
77
  #
68
78
  # @api public
69
- def initialize(**options)
70
- @input = options.fetch(:input) { $stdin }
71
- @output = options.fetch(:output) { $stdout }
72
- @interrupt = options.fetch(:interrupt) { :error }
73
- @env = options.fetch(:env) { ENV }
74
-
75
- @track_history = options.fetch(:track_history) { true }
76
- @history_cycle = options.fetch(:history_cycle) { false }
77
- exclude_proc = ->(line) { line.strip == "" }
78
- @history_exclude = options.fetch(:history_exclude) { exclude_proc }
79
- @history_duplicates = options.fetch(:history_duplicates) { false }
80
-
81
- @console = select_console(input)
82
- @history = History.new do |h|
83
- h.cycle = @history_cycle
84
- h.duplicates = @history_duplicates
85
- h.exclude = @history_exclude
79
+ def initialize(input: $stdin, output: $stdout, interrupt: :error,
80
+ env: ENV, track_history: true, history_cycle: false,
81
+ history_exclude: History::DEFAULT_EXCLUDE,
82
+ history_duplicates: false)
83
+ @input = input
84
+ @output = output
85
+ @interrupt = interrupt
86
+ @env = env
87
+ @track_history = track_history
88
+ @history_cycle = history_cycle
89
+ @history_exclude = history_exclude
90
+ @history_duplicates = history_duplicates
91
+
92
+ @console = select_console(input)
93
+ @history = History.new do |h|
94
+ h.cycle = history_cycle
95
+ h.duplicates = history_duplicates
96
+ h.exclude = history_exclude
86
97
  end
87
98
  @stop = false # gathering input
88
99
  @cursor = TTY::Cursor
@@ -155,24 +166,26 @@ module TTY
155
166
  output.sync = bufferring
156
167
  end
157
168
 
158
- # Read a keypress including invisible multibyte codes
159
- # and return a character as a string.
169
+ # Read a keypress including invisible multibyte codes and return
170
+ # a character as a string.
160
171
  # Nothing is echoed to the console. This call will block for a
161
172
  # single keypress, but will not wait for Enter to be pressed.
162
173
  #
163
- # @param [Hash[Symbol]] options
164
- # @option options [Boolean] echo
174
+ # @param [Boolean] echo
165
175
  # whether to echo chars back or not, defaults to false
166
- # @option options [Boolean] raw
167
- # whenther raw mode enabled, defaults to true
176
+ # @option [Boolean] raw
177
+ # whenther raw mode is enabled, defaults to true
178
+ # @option [Boolean] nonblock
179
+ # whether to wait for input or not, defaults to false
168
180
  #
169
181
  # @return [String]
170
182
  #
171
183
  # @api public
172
- def read_keypress(options = {})
173
- opts = { echo: false, raw: true }.merge(options)
174
- codes = unbufferred { get_codes(opts) }
175
- char = codes ? codes.pack("U*") : nil
184
+ def read_keypress(echo: false, raw: true, nonblock: false)
185
+ codes = unbufferred do
186
+ get_codes(echo: echo, raw: raw, nonblock: nonblock)
187
+ end
188
+ char = codes ? codes.pack("U*") : nil
176
189
 
177
190
  trigger_key_event(char) if char
178
191
  char
@@ -181,19 +194,24 @@ module TTY
181
194
 
182
195
  # Get input code points
183
196
  #
184
- # @param [Hash[Symbol]] options
197
+ # @param [Boolean] echo
198
+ # whether to echo chars back or not, defaults to false
199
+ # @option [Boolean] raw
200
+ # whenther raw mode is enabled, defaults to true
201
+ # @option [Boolean] nonblock
202
+ # whether to wait for input or not, defaults to false
185
203
  # @param [Array[Integer]] codes
204
+ # the currently read char code points
186
205
  #
187
206
  # @return [Array[Integer]]
188
207
  #
189
208
  # @api private
190
- def get_codes(options = {}, codes = [])
191
- opts = { echo: true, raw: false }.merge(options)
192
- char = console.get_char(opts)
209
+ def get_codes(echo: true, raw: false, nonblock: false, codes: [])
210
+ char = console.get_char(echo: echo, raw: raw, nonblock: nonblock)
193
211
  handle_interrupt if console.keys[char] == :ctrl_c
194
212
  return if char.nil?
195
- codes << char.ord
196
213
 
214
+ codes << char.ord
197
215
  condition = proc { |escape|
198
216
  (codes - escape).empty? ||
199
217
  (escape - codes).empty? &&
@@ -201,7 +219,8 @@ module TTY
201
219
  }
202
220
 
203
221
  while console.escape_codes.any?(&condition)
204
- char_codes = get_codes(options.merge(nonblock: true), codes)
222
+ char_codes = get_codes(echo: echo, raw: raw,
223
+ nonblock: true, codes: codes)
205
224
  break if char_codes.nil?
206
225
  end
207
226
 
@@ -214,49 +233,51 @@ module TTY
214
233
  #
215
234
  # @param [String] prompt
216
235
  # the prompt to display before input
217
- #
218
236
  # @param [String] value
219
237
  # the value to pre-populate line with
220
- #
221
238
  # @param [Boolean] echo
222
- # if true echo back characters, output nothing otherwise
239
+ # whether to echo chars back or not, defaults to false
240
+ # @option [Boolean] raw
241
+ # whenther raw mode is enabled, defaults to true
242
+ # @option [Boolean] nonblock
243
+ # whether to wait for input or not, defaults to false
223
244
  #
224
245
  # @return [String]
225
246
  #
226
247
  # @api public
227
- def read_line(prompt = "", **options)
228
- opts = { echo: true, raw: true }.merge(options)
229
- value = options.fetch(:value, "")
248
+ def read_line(prompt = "", value: "", echo: true, raw: true, nonblock: false)
230
249
  line = Line.new(value, prompt: prompt)
231
250
  screen_width = TTY::Screen.width
251
+ buffer = ""
232
252
 
233
253
  output.print(line)
234
254
 
235
- while (codes = get_codes(opts)) && (code = codes[0])
255
+ while (codes = get_codes(echo: echo, raw: raw, nonblock: nonblock)) &&
256
+ (code = codes[0])
236
257
  char = codes.pack("U*")
237
258
 
238
- if [:ctrl_d, :ctrl_z].include?(console.keys[char])
259
+ if EXIT_KEYS.include?(console.keys[char])
239
260
  trigger_key_event(char, line: line.to_s)
240
261
  break
241
262
  end
242
263
 
243
- if opts[:raw] && opts[:echo]
264
+ if raw && echo
244
265
  clear_display(line, screen_width)
245
266
  end
246
267
 
247
- if console.keys[char] == :backspace || BACKSPACE == code
268
+ if console.keys[char] == :backspace || code == BACKSPACE
248
269
  if !line.start?
249
270
  line.left
250
271
  line.delete
251
272
  end
252
- elsif console.keys[char] == :delete || DELETE == code
273
+ elsif console.keys[char] == :delete || code == DELETE
253
274
  line.delete
254
275
  elsif console.keys[char].to_s =~ /ctrl_/
255
276
  # skip
256
277
  elsif console.keys[char] == :up
257
278
  line.replace(history_previous) if history_previous?
258
279
  elsif console.keys[char] == :down
259
- line.replace(history_next? ? history_next : "")
280
+ line.replace(history_next? ? history_next : buffer) if track_history?
260
281
  elsif console.keys[char] == :left
261
282
  line.left
262
283
  elsif console.keys[char] == :right
@@ -266,15 +287,16 @@ module TTY
266
287
  elsif console.keys[char] == :end
267
288
  line.move_to_end
268
289
  else
269
- if opts[:raw] && code == CARRIAGE_RETURN
290
+ if raw && code == CARRIAGE_RETURN
270
291
  char = "\n"
271
292
  line.move_to_end
272
293
  end
273
294
  line.insert(char)
295
+ buffer = line.text
274
296
  end
275
297
 
276
- if (console.keys[char] == :backspace || BACKSPACE == code) && opts[:echo]
277
- if opts[:raw]
298
+ if (console.keys[char] == :backspace || code == BACKSPACE) && echo
299
+ if raw
278
300
  output.print("\e[1X") unless line.start?
279
301
  else
280
302
  output.print(?\s + (line.start? ? "" : ?\b))
@@ -284,7 +306,7 @@ module TTY
284
306
  # trigger before line is printed to allow for line changes
285
307
  trigger_key_event(char, line: line.to_s)
286
308
 
287
- if opts[:raw] && opts[:echo]
309
+ if raw && echo
288
310
  output.print(line.to_s)
289
311
  if char == "\n"
290
312
  line.move_to_start
@@ -294,13 +316,16 @@ module TTY
294
316
  end
295
317
 
296
318
  if [CARRIAGE_RETURN, NEWLINE].include?(code)
297
- output.puts unless opts[:echo]
319
+ buffer = ""
320
+ output.puts unless echo
298
321
  break
299
322
  end
300
323
  end
301
- if track_history? && opts[:echo]
324
+
325
+ if track_history? && echo
302
326
  add_to_history(line.text.rstrip)
303
327
  end
328
+
304
329
  line.text
305
330
  end
306
331
 
@@ -351,19 +376,33 @@ module TTY
351
376
  #
352
377
  # @param [String] prompt
353
378
  # the prompt displayed before the input
379
+ # @param [String] value
380
+ # the value to pre-populate line with
381
+ # @param [Boolean] echo
382
+ # whether to echo chars back or not, defaults to false
383
+ # @option [Boolean] raw
384
+ # whenther raw mode is enabled, defaults to true
385
+ # @option [Boolean] nonblock
386
+ # whether to wait for input or not, defaults to false
354
387
  #
355
388
  # @yield [String] line
356
389
  #
357
390
  # @return [Array[String]]
358
391
  #
359
392
  # @api public
360
- def read_multiline(*args)
393
+ def read_multiline(prompt = "", value: "", echo: true, raw: true,
394
+ nonblock: false)
361
395
  @stop = false
362
396
  lines = []
397
+ empty_str = ""
398
+
363
399
  loop do
364
- line = read_line(*args)
365
- break if !line || line == ""
400
+ line = read_line(prompt, value: value, echo: echo, raw: raw,
401
+ nonblock: nonblock)
402
+ value = empty_str unless value.empty? # reset
403
+ break if !line || line == empty_str
366
404
  next if line !~ /\S/ && !@stop
405
+
367
406
  if block_given?
368
407
  yield(line) unless line.to_s.empty?
369
408
  else
@@ -371,6 +410,7 @@ module TTY
371
410
  end
372
411
  break if @stop
373
412
  end
413
+
374
414
  lines
375
415
  end
376
416
  alias read_lines read_multiline
@@ -449,7 +489,7 @@ module TTY
449
489
  when Proc
450
490
  @interrupt.call
451
491
  when :noop
452
- return
492
+ # Noop
453
493
  else
454
494
  raise InputInterrupt
455
495
  end
@@ -36,17 +36,20 @@ module TTY
36
36
 
37
37
  # Get a character from console with echo
38
38
  #
39
- # @param [Hash[Symbol]] options
40
- # @option options [Symbol] :echo
41
- # the echo toggle
39
+ # @param [Boolean] echo
40
+ # whether to echo input back or not, defaults to true
41
+ # @param [Boolean] raw
42
+ # whether to use raw mode or not, defaults to false
43
+ # @param [Boolean] nonblock
44
+ # whether to wait for input or not, defaults to false
42
45
  #
43
46
  # @return [String]
44
47
  #
45
48
  # @api private
46
- def get_char(options)
47
- mode.raw(options[:raw]) do
48
- mode.echo(options[:echo]) do
49
- if options[:nonblock]
49
+ def get_char(echo: true, raw: false, nonblock: false)
50
+ mode.raw(raw) do
51
+ mode.echo(echo) do
52
+ if nonblock
50
53
  input.wait_readable(TIMEOUT) ? input.getc : nil
51
54
  else
52
55
  input.getc
@@ -15,49 +15,72 @@ module TTY
15
15
  # Default maximum size
16
16
  DEFAULT_SIZE = 32 << 4
17
17
 
18
+ # Default exclude
19
+ DEFAULT_EXCLUDE = ->(line) { line.chomp == "" }
20
+
18
21
  def_delegators :@history, :size, :length, :to_s, :inspect
19
22
 
20
23
  # Set and retrieve the maximum size of the buffer
21
24
  attr_accessor :max_size
22
25
 
26
+ # The current index
27
+ #
28
+ # @return [Integer]
29
+ #
30
+ # @api private
23
31
  attr_reader :index
24
32
 
33
+ # Decides whether or not to allow cycling through stored lines.
34
+ #
35
+ # @return [Boolean]
36
+ #
37
+ # @api public
25
38
  attr_accessor :cycle
26
39
 
40
+ # Decides wether or not duplicate lines are stored.
41
+ #
42
+ # @return [Boolean]
43
+ #
44
+ # @api public
27
45
  attr_accessor :duplicates
28
46
 
47
+ # Dictates which lines are stored.
48
+ #
49
+ # @return [Proc]
50
+ #
51
+ # @public
29
52
  attr_accessor :exclude
30
53
 
31
54
  # Create a History buffer
32
55
  #
33
- # param [Integer] max_size
56
+ # @param [Integer] max_size
34
57
  # the maximum size for history buffer
35
- #
36
- # param [Hash[Symbol]] options
37
- # @option options [Boolean] :cycle
58
+ # @param [Boolean] cycle
38
59
  # whether or not the history should cycle, false by default
39
- # @option options [Boolean] :duplicates
60
+ # @param [Boolean] duplicates
40
61
  # whether or not to store duplicates, true by default
41
- # @option options [Boolean] :exclude
62
+ # @param [Boolean] exclude
42
63
  # a Proc to exclude items from storing in history
43
64
  #
44
65
  # @api public
45
- def initialize(max_size = DEFAULT_SIZE, **options)
66
+ def initialize(max_size = DEFAULT_SIZE, duplicates: true, cycle: false,
67
+ exclude: DEFAULT_EXCLUDE)
46
68
  @max_size = max_size
47
69
  @index = nil
48
70
  @history = []
49
- @duplicates = options.fetch(:duplicates) { true }
50
- @exclude = options.fetch(:exclude) { proc {} }
51
- @cycle = options.fetch(:cycle) { false }
71
+ @duplicates = duplicates
72
+ @exclude = exclude
73
+ @cycle = cycle
74
+
52
75
  yield self if block_given?
53
76
  end
54
77
 
55
78
  # Iterates over history lines
56
79
  #
57
80
  # @api public
58
- def each
81
+ def each(&block)
59
82
  if block_given?
60
- @history.each { |line| yield line }
83
+ @history.each(&block)
61
84
  else
62
85
  @history.to_enum
63
86
  end
@@ -85,6 +108,7 @@ module TTY
85
108
  # @api public
86
109
  def next
87
110
  return if size.zero?
111
+
88
112
  if @index == size - 1
89
113
  @index = 0 if @cycle
90
114
  else
@@ -99,6 +123,7 @@ module TTY
99
123
  # Move the pointer to the previous line in the history
100
124
  def previous
101
125
  return if size.zero?
126
+
102
127
  if @index.zero?
103
128
  @index = size - 1 if @cycle
104
129
  else
@@ -2,6 +2,6 @@
2
2
 
3
3
  module TTY
4
4
  class Reader
5
- VERSION = "0.8.0"
5
+ VERSION = "0.9.0"
6
6
  end # Reader
7
7
  end # TTY
@@ -32,26 +32,27 @@ module TTY
32
32
 
33
33
  # Get a character from console blocking for input
34
34
  #
35
- # @param [Hash[Symbol]] options
36
- # @option options [Symbol] :echo
37
- # the echo mode toggle
38
- # @option options [Symbol] :raw
39
- # the raw mode toggle
35
+ # @param [Boolean] echo
36
+ # whether to echo input back or not, defaults to true
37
+ # @param [Boolean] raw
38
+ # whether to use raw mode or not, defaults to false
39
+ # @param [Boolean] nonblock
40
+ # whether to wait for input or not, defaults to false
40
41
  #
41
42
  # @return [String]
42
43
  #
43
44
  # @api private
44
- def get_char(options)
45
- if options[:raw] && options[:echo]
46
- if options[:nonblock]
45
+ def get_char(echo: true, raw: false, nonblock: false)
46
+ if raw && echo
47
+ if nonblock
47
48
  get_char_echo_non_blocking
48
49
  else
49
50
  get_char_echo_blocking
50
51
  end
51
- elsif options[:raw] && !options[:echo]
52
- options[:nonblock] ? get_char_non_blocking : get_char_blocking
53
- elsif !options[:raw] && !options[:echo]
54
- options[:nonblock] ? get_char_non_blocking : get_char_blocking
52
+ elsif raw && !echo
53
+ nonblock ? get_char_non_blocking : get_char_blocking
54
+ elsif !raw && !echo
55
+ nonblock ? get_char_non_blocking : get_char_blocking
55
56
  else
56
57
  @input.getc
57
58
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tty-reader
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Murach
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-28 00:00:00.000000000 Z
11
+ date: 2020-12-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tty-screen
@@ -70,14 +70,14 @@ dependencies:
70
70
  name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: '3.0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '3.0'
83
83
  description: A set of methods for processing keyboard input in character, line and