tty-reader 0.5.0 → 0.6.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/CHANGELOG.md +14 -0
- data/README.md +13 -6
- data/examples/keypress_nonblock.rb +17 -0
- data/lib/tty/reader.rb +10 -5
- data/lib/tty/reader/console.rb +5 -3
- data/lib/tty/reader/line.rb +8 -5
- data/lib/tty/reader/version.rb +1 -1
- data/spec/spec_helper.rb +6 -0
- data/spec/unit/line_spec.rb +1 -2
- data/spec/unit/read_line_spec.rb +27 -0
- data/tty-reader.gemspec +5 -5
- metadata +13 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6193cf64fd770d652ff66d89ff395c28f52181521242ce432b3b651aa7b13d63
|
4
|
+
data.tar.gz: 7fa878638a8851265dfed9f8970f03fd360f975007c8ad0c865bf2bb304c64a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 91136b6cecab81d4705560af21775ae5e4140e860c1d2413e8c01b545652623f2d17c2a146494fcf790d0c3e996a4b38cab1a80741f1900d3422eb4018e861ac
|
7
|
+
data.tar.gz: bf159f08943f118a48c133171410bd5e9f8f6e8da0f83be54745e653648f9d3de7863025667a4a08da19d8ba27ab1c1c6cab0add921777de23a7a0b069c2ac15
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
# Change log
|
2
2
|
|
3
|
+
## [v0.6.0] - 2019-05-27
|
4
|
+
|
5
|
+
### Added
|
6
|
+
* Add :value option to #read_line to allow pre-populating of line content
|
7
|
+
|
8
|
+
### Changed
|
9
|
+
* Change to make InputInterrupt to derive from Interrupt by Samuel Williams(@ioquatix)
|
10
|
+
* Change #read_line to trigger before line is printed to allow for line changes in key callbacks
|
11
|
+
* Change Console#get_char :nonblock option to wait for readable input without blocking
|
12
|
+
* Change to remove bundler version constraints
|
13
|
+
* Change to update tty-screen dependency
|
14
|
+
* Change to update tty-cursor dependency
|
15
|
+
|
3
16
|
## [v0.5.0] - 2018-11-24
|
4
17
|
|
5
18
|
### Added
|
@@ -47,6 +60,7 @@
|
|
47
60
|
|
48
61
|
* Initial implementation and release
|
49
62
|
|
63
|
+
[v0.6.0]: https://github.com/piotrmurach/tty-reader/compare/v0.5.0...v0.6.0
|
50
64
|
[v0.5.0]: https://github.com/piotrmurach/tty-reader/compare/v0.4.0...v0.5.0
|
51
65
|
[v0.4.0]: https://github.com/piotrmurach/tty-reader/compare/v0.3.0...v0.4.0
|
52
66
|
[v0.3.0]: https://github.com/piotrmurach/tty-reader/compare/v0.2.0...v0.3.0
|
data/README.md
CHANGED
@@ -140,7 +140,14 @@ You can also provide a line prefix displayed before input by passing it as a fir
|
|
140
140
|
|
141
141
|
```ruby
|
142
142
|
reader.read_line(">> ")
|
143
|
-
# >>
|
143
|
+
# >>
|
144
|
+
```
|
145
|
+
|
146
|
+
To pre-populate the line content for editing use `:value` option:
|
147
|
+
|
148
|
+
```ruby
|
149
|
+
reader.read_line("> ", value: "edit me")
|
150
|
+
# > edit me
|
144
151
|
```
|
145
152
|
|
146
153
|
### 2.3 read_multiline
|
@@ -230,13 +237,13 @@ class MyListener
|
|
230
237
|
end
|
231
238
|
```
|
232
239
|
|
233
|
-
Then
|
240
|
+
Then subscribing is done:
|
234
241
|
|
235
242
|
```ruby
|
236
243
|
reader.subscribe(MyListener.new)
|
237
244
|
```
|
238
245
|
|
239
|
-
Alternatively, `subscribe` allows you to listen to events only for the
|
246
|
+
Alternatively, `subscribe` allows you to listen to events only for the duration of block execution like so:
|
240
247
|
|
241
248
|
```ruby
|
242
249
|
reader.subscribe(MyListener) do
|
@@ -290,7 +297,7 @@ The available key events for character input are:
|
|
290
297
|
* `:keyalpha`
|
291
298
|
* `:keynum`
|
292
299
|
|
293
|
-
The navigation
|
300
|
+
The navigation related key events are:
|
294
301
|
|
295
302
|
* `:keydown`
|
296
303
|
* `:keyup`
|
@@ -333,7 +340,7 @@ reader = TTY::Reader.new(interrupt: :signal)
|
|
333
340
|
|
334
341
|
### 3.2. `:track_history`
|
335
342
|
|
336
|
-
The `read_line` and `read_multiline` provide history buffer that tracks all the lines entered during `TTY::Reader.new` interactions. The history buffer provides
|
343
|
+
The `read_line` and `read_multiline` provide history buffer that tracks all the lines entered during `TTY::Reader.new` interactions. The history buffer provides previous or next lines when user presses up/down arrows respectively. However, if you wish to disable this behaviour use `:track_history` option like so:
|
337
344
|
|
338
345
|
```ruby
|
339
346
|
reader = TTY::Reader.new(track_history: false)
|
@@ -357,7 +364,7 @@ reader = TTY::Reader.new(history_duplicates: false)
|
|
357
364
|
|
358
365
|
### 3.5. `:history_exclude`
|
359
366
|
|
360
|
-
This option allows you to exclude lines from being stored in history. It accepts a `Proc` with a line as a first argument. By default it is set to
|
367
|
+
This option allows you to exclude lines from being stored in history. It accepts a `Proc` with a line as a first argument. By default it is set to exclude empty lines. To change this:
|
361
368
|
|
362
369
|
```ruby
|
363
370
|
reader = TTY::Reader.new(history_exclude: ->(line) { ... })
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative '../lib/tty-reader'
|
2
|
+
|
3
|
+
reader = TTY::Reader.new
|
4
|
+
|
5
|
+
puts "Press a key (or Ctrl-X to exit)"
|
6
|
+
|
7
|
+
loop do
|
8
|
+
print reader.cursor.clear_line
|
9
|
+
print "=> "
|
10
|
+
char = reader.read_keypress(nonblock: true)
|
11
|
+
if ?\C-x == char
|
12
|
+
puts "Exiting..."
|
13
|
+
exit
|
14
|
+
elsif char
|
15
|
+
puts "#{char.inspect} [#{char.ord}] (hex: #{char.ord.to_s(16)})"
|
16
|
+
end
|
17
|
+
end
|
data/lib/tty/reader.rb
CHANGED
@@ -23,7 +23,7 @@ module TTY
|
|
23
23
|
# Raised when the user hits the interrupt key(Control-C)
|
24
24
|
#
|
25
25
|
# @api public
|
26
|
-
InputInterrupt = Class.new(
|
26
|
+
InputInterrupt = Class.new(Interrupt)
|
27
27
|
|
28
28
|
# Check if Windowz mode
|
29
29
|
#
|
@@ -215,6 +215,9 @@ module TTY
|
|
215
215
|
# @param [String] prompt
|
216
216
|
# the prompt to display before input
|
217
217
|
#
|
218
|
+
# @param [String] value
|
219
|
+
# the value to pre-populate line with
|
220
|
+
#
|
218
221
|
# @param [Boolean] echo
|
219
222
|
# if true echo back characters, output nothing otherwise
|
220
223
|
#
|
@@ -223,10 +226,11 @@ module TTY
|
|
223
226
|
# @api public
|
224
227
|
def read_line(prompt = '', **options)
|
225
228
|
opts = { echo: true, raw: true }.merge(options)
|
226
|
-
|
229
|
+
value = options.fetch(:value, '')
|
230
|
+
line = Line.new(value, prompt: prompt)
|
227
231
|
screen_width = TTY::Screen.width
|
228
232
|
|
229
|
-
output.print(line
|
233
|
+
output.print(line)
|
230
234
|
|
231
235
|
while (codes = get_codes(opts)) && (code = codes[0])
|
232
236
|
char = codes.pack('U*')
|
@@ -277,6 +281,9 @@ module TTY
|
|
277
281
|
end
|
278
282
|
end
|
279
283
|
|
284
|
+
# trigger before line is printed to allow for line changes
|
285
|
+
trigger_key_event(char, line: line.to_s)
|
286
|
+
|
280
287
|
if opts[:raw] && opts[:echo]
|
281
288
|
output.print(line.to_s)
|
282
289
|
if char == "\n"
|
@@ -286,8 +293,6 @@ module TTY
|
|
286
293
|
end
|
287
294
|
end
|
288
295
|
|
289
|
-
trigger_key_event(char, line: line.to_s)
|
290
|
-
|
291
296
|
if [CARRIAGE_RETURN, NEWLINE].include?(code)
|
292
297
|
output.puts unless opts[:echo]
|
293
298
|
break
|
data/lib/tty/reader/console.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'io/wait'
|
4
|
+
|
3
5
|
require_relative 'keys'
|
4
6
|
require_relative 'mode'
|
5
7
|
|
@@ -9,6 +11,8 @@ module TTY
|
|
9
11
|
ESC = "\e".freeze
|
10
12
|
CSI = "\e[".freeze
|
11
13
|
|
14
|
+
TIMEOUT = 0.1
|
15
|
+
|
12
16
|
# Key codes
|
13
17
|
#
|
14
18
|
# @return [Hash[Symbol]]
|
@@ -43,14 +47,12 @@ module TTY
|
|
43
47
|
mode.raw(options[:raw]) do
|
44
48
|
mode.echo(options[:echo]) do
|
45
49
|
if options[:nonblock]
|
46
|
-
input.
|
50
|
+
input.wait_readable(TIMEOUT) ? input.getc : nil
|
47
51
|
else
|
48
52
|
input.getc
|
49
53
|
end
|
50
54
|
end
|
51
55
|
end
|
52
|
-
rescue IO::WaitReadable, EOFError
|
53
|
-
# no more bytes to read
|
54
56
|
end
|
55
57
|
|
56
58
|
protected
|
data/lib/tty/reader/line.rb
CHANGED
@@ -209,16 +209,19 @@ module TTY
|
|
209
209
|
# Remove char from the line at current position
|
210
210
|
#
|
211
211
|
# @api public
|
212
|
-
def delete
|
213
|
-
@text.slice!(@cursor,
|
212
|
+
def delete(n = 1)
|
213
|
+
@text.slice!(@cursor, n)
|
214
214
|
end
|
215
215
|
|
216
216
|
# Remove char from the line in front of the cursor
|
217
217
|
#
|
218
|
+
# @param [Integer] n
|
219
|
+
# the number of chars to remove
|
220
|
+
#
|
218
221
|
# @api public
|
219
|
-
def remove
|
220
|
-
left
|
221
|
-
@text.slice!(@cursor,
|
222
|
+
def remove(n = 1)
|
223
|
+
left(n)
|
224
|
+
@text.slice!(@cursor, n)
|
222
225
|
end
|
223
226
|
|
224
227
|
# Full line with prompt as string
|
data/lib/tty/reader/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -16,6 +16,12 @@ end
|
|
16
16
|
require "bundler/setup"
|
17
17
|
require "tty-reader"
|
18
18
|
|
19
|
+
class StringIO
|
20
|
+
def wait_readable(*)
|
21
|
+
true
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
19
25
|
RSpec.configure do |config|
|
20
26
|
# Enable flags like --only-failures and --next-failure
|
21
27
|
config.example_status_persistence_file_path = ".rspec_status"
|
data/spec/unit/line_spec.rb
CHANGED
data/spec/unit/read_line_spec.rb
CHANGED
@@ -10,14 +10,18 @@ RSpec.describe TTY::Reader, '#read_line' do
|
|
10
10
|
it 'masks characters' do
|
11
11
|
input << "password\n"
|
12
12
|
input.rewind
|
13
|
+
|
13
14
|
answer = reader.read_line(echo: false)
|
15
|
+
|
14
16
|
expect(answer).to eq("password\n")
|
15
17
|
end
|
16
18
|
|
17
19
|
it "echoes characters back" do
|
18
20
|
input << "password\n"
|
19
21
|
input.rewind
|
22
|
+
|
20
23
|
answer = reader.read_line
|
24
|
+
|
21
25
|
expect(answer).to eq("password\n")
|
22
26
|
expect(output.string).to eq([
|
23
27
|
"\e[2K\e[1Gp",
|
@@ -35,7 +39,9 @@ RSpec.describe TTY::Reader, '#read_line' do
|
|
35
39
|
it "doesn't echo characters back" do
|
36
40
|
input << "password\n"
|
37
41
|
input.rewind
|
42
|
+
|
38
43
|
answer = reader.read_line(echo: false)
|
44
|
+
|
39
45
|
expect(answer).to eq("password\n")
|
40
46
|
expect(output.string).to eq("\n")
|
41
47
|
end
|
@@ -43,7 +49,9 @@ RSpec.describe TTY::Reader, '#read_line' do
|
|
43
49
|
it "displays a prompt before input" do
|
44
50
|
input << "aa\n"
|
45
51
|
input.rewind
|
52
|
+
|
46
53
|
answer = reader.read_line('>> ')
|
54
|
+
|
47
55
|
expect(answer).to eq("aa\n")
|
48
56
|
expect(output.string).to eq([
|
49
57
|
">> ",
|
@@ -53,17 +61,36 @@ RSpec.describe TTY::Reader, '#read_line' do
|
|
53
61
|
].join)
|
54
62
|
end
|
55
63
|
|
64
|
+
it "displays custom input with a prompt" do
|
65
|
+
input << "aa\n"
|
66
|
+
input.rewind
|
67
|
+
|
68
|
+
answer = reader.read_line("> ", value: "xx")
|
69
|
+
|
70
|
+
expect(answer).to eq("xxaa\n")
|
71
|
+
expect(output.string).to eq([
|
72
|
+
"> xx",
|
73
|
+
"\e[2K\e[1G> xxa",
|
74
|
+
"\e[2K\e[1G> xxaa",
|
75
|
+
"\e[2K\e[1G> xxaa\n"
|
76
|
+
].join)
|
77
|
+
end
|
78
|
+
|
56
79
|
it 'deletes characters when backspace pressed' do
|
57
80
|
input << "aa\ba\bcc\n"
|
58
81
|
input.rewind
|
82
|
+
|
59
83
|
answer = reader.read_line
|
84
|
+
|
60
85
|
expect(answer).to eq("acc\n")
|
61
86
|
end
|
62
87
|
|
63
88
|
it 'reads multibyte line' do
|
64
89
|
input << "한글"
|
65
90
|
input.rewind
|
91
|
+
|
66
92
|
answer = reader.read_line
|
93
|
+
|
67
94
|
expect(answer).to eq("한글")
|
68
95
|
end
|
69
96
|
end
|
data/tty-reader.gemspec
CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |spec|
|
|
6
6
|
spec.name = "tty-reader"
|
7
7
|
spec.version = TTY::Reader::VERSION
|
8
8
|
spec.authors = ["Piotr Murach"]
|
9
|
-
spec.email = [""]
|
9
|
+
spec.email = ["me@piotrmurach.com"]
|
10
10
|
spec.summary = %q{A set of methods for processing keyboard input in character, line and multiline modes.}
|
11
11
|
spec.description = %q{A set of methods for processing keyboard input in character, line and multiline modes. It maintains history of entered input with an ability to recall and re-edit those inputs. It lets you register to listen for keystroke events and trigger custom key events yourself.}
|
12
12
|
spec.homepage = "https://piotrmurach.github.io/tty"
|
@@ -22,10 +22,10 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.required_ruby_version = '>= 2.0.0'
|
23
23
|
|
24
24
|
spec.add_dependency "wisper", "~> 2.0.0"
|
25
|
-
spec.add_dependency "tty-screen", "~> 0.
|
26
|
-
spec.add_dependency "tty-cursor", "~> 0.
|
25
|
+
spec.add_dependency "tty-screen", "~> 0.7"
|
26
|
+
spec.add_dependency "tty-cursor", "~> 0.7"
|
27
27
|
|
28
|
-
spec.add_development_dependency "bundler", ">= 1.5.0"
|
29
|
-
spec.add_development_dependency "rake"
|
28
|
+
spec.add_development_dependency "bundler", ">= 1.5.0"
|
29
|
+
spec.add_development_dependency "rake"
|
30
30
|
spec.add_development_dependency "rspec", "~> 3.0"
|
31
31
|
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.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Murach
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-05-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: wisper
|
@@ -30,28 +30,28 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: '0.7'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.
|
40
|
+
version: '0.7'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: tty-cursor
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.
|
47
|
+
version: '0.7'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.
|
54
|
+
version: '0.7'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: bundler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -59,9 +59,6 @@ dependencies:
|
|
59
59
|
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: 1.5.0
|
62
|
-
- - "<"
|
63
|
-
- !ruby/object:Gem::Version
|
64
|
-
version: '2.0'
|
65
62
|
type: :development
|
66
63
|
prerelease: false
|
67
64
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -69,23 +66,20 @@ dependencies:
|
|
69
66
|
- - ">="
|
70
67
|
- !ruby/object:Gem::Version
|
71
68
|
version: 1.5.0
|
72
|
-
- - "<"
|
73
|
-
- !ruby/object:Gem::Version
|
74
|
-
version: '2.0'
|
75
69
|
- !ruby/object:Gem::Dependency
|
76
70
|
name: rake
|
77
71
|
requirement: !ruby/object:Gem::Requirement
|
78
72
|
requirements:
|
79
|
-
- - "
|
73
|
+
- - ">="
|
80
74
|
- !ruby/object:Gem::Version
|
81
|
-
version: '
|
75
|
+
version: '0'
|
82
76
|
type: :development
|
83
77
|
prerelease: false
|
84
78
|
version_requirements: !ruby/object:Gem::Requirement
|
85
79
|
requirements:
|
86
|
-
- - "
|
80
|
+
- - ">="
|
87
81
|
- !ruby/object:Gem::Version
|
88
|
-
version: '
|
82
|
+
version: '0'
|
89
83
|
- !ruby/object:Gem::Dependency
|
90
84
|
name: rspec
|
91
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -105,7 +99,7 @@ description: A set of methods for processing keyboard input in character, line a
|
|
105
99
|
and re-edit those inputs. It lets you register to listen for keystroke events and
|
106
100
|
trigger custom key events yourself.
|
107
101
|
email:
|
108
|
-
-
|
102
|
+
- me@piotrmurach.com
|
109
103
|
executables: []
|
110
104
|
extensions: []
|
111
105
|
extra_rdoc_files: []
|
@@ -119,6 +113,7 @@ files:
|
|
119
113
|
- bin/console
|
120
114
|
- bin/setup
|
121
115
|
- examples/keypress.rb
|
116
|
+
- examples/keypress_nonblock.rb
|
122
117
|
- examples/line.rb
|
123
118
|
- examples/multiline.rb
|
124
119
|
- examples/noecho.rb
|
@@ -166,8 +161,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
166
161
|
- !ruby/object:Gem::Version
|
167
162
|
version: '0'
|
168
163
|
requirements: []
|
169
|
-
|
170
|
-
rubygems_version: 2.7.3
|
164
|
+
rubygems_version: 3.0.3
|
171
165
|
signing_key:
|
172
166
|
specification_version: 4
|
173
167
|
summary: A set of methods for processing keyboard input in character, line and multiline
|