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.
@@ -1,7 +1,6 @@
1
- # encoding: utf-8
2
1
  # frozen_string_literal: true
3
2
 
4
- require 'forwardable'
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, 'invalid index'
124
+ raise IndexError, "invalid index"
126
125
  end
127
126
  line.dup
128
127
  end
@@ -1,7 +1,6 @@
1
- # encoding: utf-8
2
1
  # frozen_string_literal: true
3
2
 
4
- require_relative 'keys'
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, :key)
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, key)
45
+ new(key, char, line)
47
46
  end
48
47
 
49
48
  # Check if key event can be triggered
@@ -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 '\b'
18
- ?\C-i => :ctrl_i, # identical to '\t'
19
- ?\C-j => :ctrl_j, # identical to '\n'
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 '\r'
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('U*') => :home,
138
- [224, 79].pack('U*') => :end,
139
- [224, 82].pack('U*') => :insert,
140
- [224, 83].pack('U*') => :delete,
141
- [224, 73].pack('U*') => :page_up,
142
- [224, 81].pack('U*') => :page_down,
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('U*') => :up,
145
- [224, 80].pack('U*') => :down,
146
- [224, 77].pack('U*') => :right,
147
- [224, 75].pack('U*') => :left,
148
- [224, 83].pack('U*') => :clear,
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,
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'forwardable'
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
- def initialize(prompt, text = '')
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 = 'aaa'
133
- # line[5]= 'b'
134
- # => 'aaa b'
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 == @text.length - 1
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, 1)
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, 1)
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).size
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
@@ -1,7 +1,6 @@
1
- # encoding: utf-8
2
1
  # frozen_string_literal: true
3
2
 
4
- require 'io/console'
3
+ require "io/console"
5
4
 
6
5
  module TTY
7
6
  class Reader
@@ -1,7 +1,7 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module TTY
4
4
  class Reader
5
- VERSION = '0.3.0'.freeze
5
+ VERSION = "0.8.0"
6
6
  end # Reader
7
7
  end # TTY
@@ -1,16 +1,13 @@
1
- # encoding: utf-8
2
1
  # frozen_string_literal: true
3
2
 
4
- require 'fiddle'
3
+ require "fiddle"
5
4
 
6
5
  module TTY
7
6
  class Reader
8
7
  module WinAPI
9
8
  include Fiddle
10
9
 
11
- Handle = RUBY_VERSION >= "2.0.0" ? Fiddle::Handle : DL::Handle
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 'keys'
3
+ require_relative "keys"
5
4
 
6
5
  module TTY
7
6
  class Reader
8
7
  class WinConsole
9
- ESC = "\e".freeze
10
- NUL_HEX = "\x00".freeze
11
- EXT_HEX = "\xE0".freeze
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 'win_api'
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.3.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Murach
8
8
  autorequire:
9
- bindir: exe
9
+ bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-29 00:00:00.000000000 Z
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.6.4
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.6.4
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.5.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.5.0
40
+ version: '0.7'
55
41
  - !ruby/object:Gem::Dependency
56
- name: bundler
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: :development
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: '12.0'
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: '12.0'
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. In addition it maintains history of entered input with an ability
105
- to recall and re-edit those inputs and register to listen for keystrokes.
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
- - tasks/console.rake
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
- rubyforge_project:
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