tty-reader 0.3.0 → 0.8.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 +5 -5
- data/CHANGELOG.md +45 -0
- data/README.md +66 -17
- data/lib/tty-reader.rb +0 -2
- data/lib/tty/reader.rb +38 -28
- data/lib/tty/reader/console.rb +15 -6
- data/lib/tty/reader/history.rb +2 -3
- data/lib/tty/reader/key_event.rb +4 -5
- data/lib/tty/reader/keys.rb +15 -16
- data/lib/tty/reader/line.rb +30 -17
- data/lib/tty/reader/mode.rb +1 -2
- data/lib/tty/reader/version.rb +2 -2
- data/lib/tty/reader/win_api.rb +2 -5
- data/lib/tty/reader/win_console.rb +5 -6
- metadata +32 -63
- data/.gitignore +0 -12
- data/.rspec +0 -3
- data/.travis.yml +0 -26
- data/CODE_OF_CONDUCT.md +0 -74
- data/Gemfile +0 -20
- data/Rakefile +0 -10
- data/appveyor.yml +0 -23
- data/benchmarks/speed_read_char.rb +0 -34
- data/benchmarks/speed_read_line.rb +0 -34
- data/bin/console +0 -6
- data/bin/setup +0 -8
- data/examples/keypress.rb +0 -16
- data/examples/line.rb +0 -7
- data/examples/multiline.rb +0 -7
- data/examples/noecho.rb +0 -6
- data/examples/shell.rb +0 -12
- data/tasks/console.rake +0 -11
- data/tasks/coverage.rake +0 -11
- data/tasks/spec.rake +0 -29
- data/tty-reader.gemspec +0 -32
data/lib/tty/reader/history.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# frozen_string_literal: true
|
3
2
|
|
4
|
-
require
|
3
|
+
require "forwardable"
|
5
4
|
|
6
5
|
module TTY
|
7
6
|
class Reader
|
@@ -122,7 +121,7 @@ module TTY
|
|
122
121
|
end
|
123
122
|
line = @history[index]
|
124
123
|
if line.nil?
|
125
|
-
raise IndexError,
|
124
|
+
raise IndexError, "invalid index"
|
126
125
|
end
|
127
126
|
line.dup
|
128
127
|
end
|
data/lib/tty/reader/key_event.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# frozen_string_literal: true
|
3
2
|
|
4
|
-
require_relative
|
3
|
+
require_relative "keys"
|
5
4
|
|
6
5
|
module TTY
|
7
6
|
class Reader
|
@@ -17,7 +16,7 @@ module TTY
|
|
17
16
|
# Represents key event emitted during keyboard press
|
18
17
|
#
|
19
18
|
# @api public
|
20
|
-
class KeyEvent < Struct.new(:value, :
|
19
|
+
class KeyEvent < Struct.new(:key, :value, :line)
|
21
20
|
# Create key event from read input codes
|
22
21
|
#
|
23
22
|
# @param [Hash[Symbol]] keys
|
@@ -27,7 +26,7 @@ module TTY
|
|
27
26
|
# @return [KeyEvent]
|
28
27
|
#
|
29
28
|
# @api public
|
30
|
-
def self.from(keys, char)
|
29
|
+
def self.from(keys, char, line = "")
|
31
30
|
key = Key.new
|
32
31
|
key.name = (name = keys[char]) ? name : :ignore
|
33
32
|
|
@@ -43,7 +42,7 @@ module TTY
|
|
43
42
|
key.ctrl = true
|
44
43
|
end
|
45
44
|
|
46
|
-
new(char,
|
45
|
+
new(key, char, line)
|
47
46
|
end
|
48
47
|
|
49
48
|
# Check if key event can be triggered
|
data/lib/tty/reader/keys.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# frozen_string_literal: true
|
3
2
|
|
4
3
|
module TTY
|
@@ -14,12 +13,12 @@ module TTY
|
|
14
13
|
?\C-e => :ctrl_e,
|
15
14
|
?\C-f => :ctrl_f,
|
16
15
|
?\C-g => :ctrl_g,
|
17
|
-
?\C-h => :ctrl_h, # identical to
|
18
|
-
?\C-i => :ctrl_i, # identical to
|
19
|
-
?\C-j => :ctrl_j, # identical to
|
16
|
+
?\C-h => :ctrl_h, # identical to "\b"
|
17
|
+
?\C-i => :ctrl_i, # identical to "\t"
|
18
|
+
?\C-j => :ctrl_j, # identical to "\n"
|
20
19
|
?\C-k => :ctrl_k,
|
21
20
|
?\C-l => :ctrl_l,
|
22
|
-
?\C-m => :ctrl_m, # identical to
|
21
|
+
?\C-m => :ctrl_m, # identical to "\r"
|
23
22
|
?\C-n => :ctrl_n,
|
24
23
|
?\C-o => :ctrl_o,
|
25
24
|
?\C-p => :ctrl_p,
|
@@ -134,18 +133,18 @@ module TTY
|
|
134
133
|
"\e" => :escape,
|
135
134
|
" " => :space,
|
136
135
|
"\b" => :backspace,
|
137
|
-
[224, 71].pack(
|
138
|
-
[224, 79].pack(
|
139
|
-
[224, 82].pack(
|
140
|
-
[224, 83].pack(
|
141
|
-
[224, 73].pack(
|
142
|
-
[224, 81].pack(
|
136
|
+
[224, 71].pack("U*") => :home,
|
137
|
+
[224, 79].pack("U*") => :end,
|
138
|
+
[224, 82].pack("U*") => :insert,
|
139
|
+
[224, 83].pack("U*") => :delete,
|
140
|
+
[224, 73].pack("U*") => :page_up,
|
141
|
+
[224, 81].pack("U*") => :page_down,
|
143
142
|
|
144
|
-
[224, 72].pack(
|
145
|
-
[224, 80].pack(
|
146
|
-
[224, 77].pack(
|
147
|
-
[224, 75].pack(
|
148
|
-
[224, 83].pack(
|
143
|
+
[224, 72].pack("U*") => :up,
|
144
|
+
[224, 80].pack("U*") => :down,
|
145
|
+
[224, 77].pack("U*") => :right,
|
146
|
+
[224, 75].pack("U*") => :left,
|
147
|
+
[224, 83].pack("U*") => :clear,
|
149
148
|
|
150
149
|
"\x00;" => :f1,
|
151
150
|
"\x00<" => :f2,
|
data/lib/tty/reader/line.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "forwardable"
|
4
4
|
|
5
5
|
module TTY
|
6
6
|
class Reader
|
@@ -15,7 +15,7 @@ module TTY
|
|
15
15
|
#
|
16
16
|
# @api public
|
17
17
|
def self.sanitize(text)
|
18
|
-
text.dup.gsub(ANSI_MATCHER,
|
18
|
+
text.dup.gsub(ANSI_MATCHER, "")
|
19
19
|
end
|
20
20
|
|
21
21
|
# The editable text
|
@@ -30,13 +30,19 @@ module TTY
|
|
30
30
|
# @api public
|
31
31
|
attr_reader :mode
|
32
32
|
|
33
|
+
# The prompt displayed before input
|
34
|
+
# @api public
|
33
35
|
attr_reader :prompt
|
34
36
|
|
35
|
-
|
37
|
+
# Create a Line instance
|
38
|
+
#
|
39
|
+
# @api private
|
40
|
+
def initialize(text = "", prompt: "")
|
36
41
|
@prompt = prompt.dup
|
37
42
|
@text = text.dup
|
38
43
|
@cursor = [0, @text.length].max
|
39
44
|
@mode = :edit
|
45
|
+
|
40
46
|
yield self if block_given?
|
41
47
|
end
|
42
48
|
|
@@ -128,14 +134,18 @@ module TTY
|
|
128
134
|
# @param [Integer] i
|
129
135
|
# the index to insert at
|
130
136
|
#
|
137
|
+
# @param [String] chars
|
138
|
+
# the characters to insert
|
139
|
+
#
|
131
140
|
# @example
|
132
|
-
# text =
|
133
|
-
# line[5]=
|
134
|
-
# =>
|
141
|
+
# text = "aaa"
|
142
|
+
# line[5]= "b"
|
143
|
+
# => "aaa b"
|
135
144
|
#
|
136
145
|
# @api public
|
137
146
|
def []=(i, chars)
|
138
147
|
edit_mode
|
148
|
+
|
139
149
|
if i.is_a?(Range)
|
140
150
|
@text[i] = chars
|
141
151
|
@cursor += chars.length
|
@@ -143,12 +153,9 @@ module TTY
|
|
143
153
|
end
|
144
154
|
|
145
155
|
if i <= 0
|
146
|
-
before_text =
|
156
|
+
before_text = ""
|
147
157
|
after_text = @text.dup
|
148
|
-
elsif i
|
149
|
-
before_text = @text.dup
|
150
|
-
after_text = ''
|
151
|
-
elsif i > @text.length - 1
|
158
|
+
elsif i > @text.length - 1 # insert outside of line input
|
152
159
|
before_text = @text.dup
|
153
160
|
after_text = ?\s * (i - @text.length)
|
154
161
|
@cursor += after_text.length
|
@@ -202,16 +209,19 @@ module TTY
|
|
202
209
|
# Remove char from the line at current position
|
203
210
|
#
|
204
211
|
# @api public
|
205
|
-
def delete
|
206
|
-
@text.slice!(@cursor,
|
212
|
+
def delete(n = 1)
|
213
|
+
@text.slice!(@cursor, n)
|
207
214
|
end
|
208
215
|
|
209
216
|
# Remove char from the line in front of the cursor
|
210
217
|
#
|
218
|
+
# @param [Integer] n
|
219
|
+
# the number of chars to remove
|
220
|
+
#
|
211
221
|
# @api public
|
212
|
-
def remove
|
213
|
-
left
|
214
|
-
@text.slice!(@cursor,
|
222
|
+
def remove(n = 1)
|
223
|
+
left(n)
|
224
|
+
@text.slice!(@cursor, n)
|
215
225
|
end
|
216
226
|
|
217
227
|
# Full line with prompt as string
|
@@ -226,7 +236,10 @@ module TTY
|
|
226
236
|
#
|
227
237
|
# @api public
|
228
238
|
def prompt_size
|
229
|
-
self.class.sanitize(@prompt).
|
239
|
+
p = self.class.sanitize(@prompt).split(/\r?\n/)
|
240
|
+
# return the length of each line + screen width for every line past the first
|
241
|
+
# which accounts for multi-line prompts
|
242
|
+
p.join.length + ((p.length - 1) * TTY::Screen.width )
|
230
243
|
end
|
231
244
|
|
232
245
|
# Text size
|
data/lib/tty/reader/mode.rb
CHANGED
data/lib/tty/reader/version.rb
CHANGED
data/lib/tty/reader/win_api.rb
CHANGED
@@ -1,16 +1,13 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# frozen_string_literal: true
|
3
2
|
|
4
|
-
require
|
3
|
+
require "fiddle"
|
5
4
|
|
6
5
|
module TTY
|
7
6
|
class Reader
|
8
7
|
module WinAPI
|
9
8
|
include Fiddle
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
CRT_HANDLE = Handle.new("msvcrt") rescue Handle.new("crtdll")
|
10
|
+
CRT_HANDLE = Fiddle::Handle.new("msvcrt") rescue Fiddle::Handle.new("crtdll")
|
14
11
|
|
15
12
|
# Get a character from the console without echo.
|
16
13
|
#
|
@@ -1,14 +1,13 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# frozen_string_literal: true
|
3
2
|
|
4
|
-
require_relative
|
3
|
+
require_relative "keys"
|
5
4
|
|
6
5
|
module TTY
|
7
6
|
class Reader
|
8
7
|
class WinConsole
|
9
|
-
ESC = "\e"
|
10
|
-
NUL_HEX = "\x00"
|
11
|
-
EXT_HEX = "\xE0"
|
8
|
+
ESC = "\e"
|
9
|
+
NUL_HEX = "\x00"
|
10
|
+
EXT_HEX = "\xE0"
|
12
11
|
|
13
12
|
# Key codes
|
14
13
|
#
|
@@ -25,7 +24,7 @@ module TTY
|
|
25
24
|
attr_reader :escape_codes
|
26
25
|
|
27
26
|
def initialize(input)
|
28
|
-
require_relative
|
27
|
+
require_relative "win_api"
|
29
28
|
@input = input
|
30
29
|
@keys = Keys.ctrl_keys.merge(Keys.win_keys)
|
31
30
|
@escape_codes = [[NUL_HEX.ord], [ESC.ord], EXT_HEX.bytes.to_a]
|
metadata
CHANGED
@@ -1,91 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tty-reader
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Murach
|
8
8
|
autorequire:
|
9
|
-
bindir:
|
9
|
+
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-06-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: wisper
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 2.0.0
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: 2.0.0
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: tty-screen
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
30
16
|
requirements:
|
31
17
|
- - "~>"
|
32
18
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
19
|
+
version: '0.8'
|
34
20
|
type: :runtime
|
35
21
|
prerelease: false
|
36
22
|
version_requirements: !ruby/object:Gem::Requirement
|
37
23
|
requirements:
|
38
24
|
- - "~>"
|
39
25
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.
|
26
|
+
version: '0.8'
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: tty-cursor
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
44
30
|
requirements:
|
45
31
|
- - "~>"
|
46
32
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.
|
33
|
+
version: '0.7'
|
48
34
|
type: :runtime
|
49
35
|
prerelease: false
|
50
36
|
version_requirements: !ruby/object:Gem::Requirement
|
51
37
|
requirements:
|
52
38
|
- - "~>"
|
53
39
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.
|
40
|
+
version: '0.7'
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
42
|
+
name: wisper
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
58
44
|
requirements:
|
59
|
-
- - "
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 1.5.0
|
62
|
-
- - "<"
|
45
|
+
- - "~>"
|
63
46
|
- !ruby/object:Gem::Version
|
64
47
|
version: '2.0'
|
65
|
-
type: :
|
48
|
+
type: :runtime
|
66
49
|
prerelease: false
|
67
50
|
version_requirements: !ruby/object:Gem::Requirement
|
68
51
|
requirements:
|
69
|
-
- - "
|
70
|
-
- !ruby/object:Gem::Version
|
71
|
-
version: 1.5.0
|
72
|
-
- - "<"
|
52
|
+
- - "~>"
|
73
53
|
- !ruby/object:Gem::Version
|
74
54
|
version: '2.0'
|
75
55
|
- !ruby/object:Gem::Dependency
|
76
56
|
name: rake
|
77
57
|
requirement: !ruby/object:Gem::Requirement
|
78
58
|
requirements:
|
79
|
-
- - "
|
59
|
+
- - ">="
|
80
60
|
- !ruby/object:Gem::Version
|
81
|
-
version: '
|
61
|
+
version: '0'
|
82
62
|
type: :development
|
83
63
|
prerelease: false
|
84
64
|
version_requirements: !ruby/object:Gem::Requirement
|
85
65
|
requirements:
|
86
|
-
- - "
|
66
|
+
- - ">="
|
87
67
|
- !ruby/object:Gem::Version
|
88
|
-
version: '
|
68
|
+
version: '0'
|
89
69
|
- !ruby/object:Gem::Dependency
|
90
70
|
name: rspec
|
91
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -101,33 +81,21 @@ dependencies:
|
|
101
81
|
- !ruby/object:Gem::Version
|
102
82
|
version: '3.0'
|
103
83
|
description: A set of methods for processing keyboard input in character, line and
|
104
|
-
multiline modes.
|
105
|
-
|
84
|
+
multiline modes. It maintains history of entered input with an ability to recall
|
85
|
+
and re-edit those inputs. It lets you register to listen for keystroke events and
|
86
|
+
trigger custom key events yourself.
|
106
87
|
email:
|
107
|
-
-
|
88
|
+
- piotr@piotrmurach.com
|
108
89
|
executables: []
|
109
90
|
extensions: []
|
110
|
-
extra_rdoc_files:
|
91
|
+
extra_rdoc_files:
|
92
|
+
- README.md
|
93
|
+
- CHANGELOG.md
|
94
|
+
- LICENSE.txt
|
111
95
|
files:
|
112
|
-
- ".gitignore"
|
113
|
-
- ".rspec"
|
114
|
-
- ".travis.yml"
|
115
96
|
- CHANGELOG.md
|
116
|
-
- CODE_OF_CONDUCT.md
|
117
|
-
- Gemfile
|
118
97
|
- LICENSE.txt
|
119
98
|
- README.md
|
120
|
-
- Rakefile
|
121
|
-
- appveyor.yml
|
122
|
-
- benchmarks/speed_read_char.rb
|
123
|
-
- benchmarks/speed_read_line.rb
|
124
|
-
- bin/console
|
125
|
-
- bin/setup
|
126
|
-
- examples/keypress.rb
|
127
|
-
- examples/line.rb
|
128
|
-
- examples/multiline.rb
|
129
|
-
- examples/noecho.rb
|
130
|
-
- examples/shell.rb
|
131
99
|
- lib/tty-reader.rb
|
132
100
|
- lib/tty/reader.rb
|
133
101
|
- lib/tty/reader/console.rb
|
@@ -139,14 +107,16 @@ files:
|
|
139
107
|
- lib/tty/reader/version.rb
|
140
108
|
- lib/tty/reader/win_api.rb
|
141
109
|
- lib/tty/reader/win_console.rb
|
142
|
-
|
143
|
-
- tasks/coverage.rake
|
144
|
-
- tasks/spec.rake
|
145
|
-
- tty-reader.gemspec
|
146
|
-
homepage: https://piotrmurach.github.io/tty
|
110
|
+
homepage: https://ttytoolkit.org
|
147
111
|
licenses:
|
148
112
|
- MIT
|
149
|
-
metadata:
|
113
|
+
metadata:
|
114
|
+
allowed_push_host: https://rubygems.org
|
115
|
+
bug_tracker_uri: https://github.com/piotrmurach/tty-reader/issues
|
116
|
+
changelog_uri: https://github.com/piotrmurach/tty-reader/blob/master/CHANGELOG.md
|
117
|
+
documentation_uri: https://www.rubydoc.info/gems/tty-reader
|
118
|
+
homepage_uri: https://ttytoolkit.org
|
119
|
+
source_code_uri: https://github.com/piotrmurach/tty-reader
|
150
120
|
post_install_message:
|
151
121
|
rdoc_options: []
|
152
122
|
require_paths:
|
@@ -162,8 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
162
132
|
- !ruby/object:Gem::Version
|
163
133
|
version: '0'
|
164
134
|
requirements: []
|
165
|
-
|
166
|
-
rubygems_version: 2.5.1
|
135
|
+
rubygems_version: 3.1.2
|
167
136
|
signing_key:
|
168
137
|
specification_version: 4
|
169
138
|
summary: A set of methods for processing keyboard input in character, line and multiline
|