tty-screen 0.8.1 → 0.8.2

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: 52e1a7bc49432930fe35ab1d2831d747f63c2a8478368200314212041c2a2a50
4
- data.tar.gz: 1fb465ecf1b77a3dd62afb7a488ddb8e77976cbf5aff93551f5723ec6f6f8c7f
3
+ metadata.gz: 0710be23ea8be823cbb7cd583bbdc9606bdc0a8bb2efec10412c05c6895de6c4
4
+ data.tar.gz: eaa2498f0cba8ad0f2ef5c69a16a43f3ed631a2c5bf564ac63d3902f193ef051
5
5
  SHA512:
6
- metadata.gz: 2f48acc4ba11662f0d7b17e693f46ac1ca28155db546552fe07a3cc1aeee62ff77ff1c48afceb063301222db8895bd0d5b89fda83da71a45d88e464df65e88af
7
- data.tar.gz: ffeb5cb3f50af36233371bbb0fa860901d2ee7ca46b3845175ecd5d8071f161c82f63bdd2852dccc05ec5206acccee60781771fd5803a8bfb34642e0f022231f
6
+ metadata.gz: 20e76a0a0a5ab4d72b88b4bf8c3ccc341c249cdd54bcf0ca270eda89b6633cadf6e52f71e57127b45e339cc2a168a509fafead0f198e5cd9ea04ade10659d175
7
+ data.tar.gz: a995dccca4d956bf1675862149770b2f5164586df97f8250278652dcaf63c5905d60b385f3eb1d9c197554e56cd4dc884a5c9cbdca97f8bc765fe7aac1db769f
data/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # Change log
2
2
 
3
+ ## [v0.8.2] - 2023-12-17
4
+
5
+ ### Changed
6
+ * Change the ioctl system call support check to use the output method
7
+ * Change size from ioctl to extract window buffer format and length to constants
8
+ * Change size from ioctl to allocate and read window buffer with fewer objects
9
+ * Change size detection from tput to check TTY on the output method
10
+ * Change size detection from stty to check TTY on the output method
11
+ * Change size detection from the environment variables to use the env method
12
+ * Change size from the ansicon environment variable to use the env method
13
+ * Change size from ansicon to use regexp last match to lookup pattern matches
14
+ * Change size from ansicon to allocate window dimensions with fewer objects
15
+
16
+ ### Fixed
17
+ * Fix ioctl call test to stub terminal size encoding for big-endian systems
18
+ * Fix to skip terminal size detection from readline on non-TTY output
19
+ * Fix size detection from IO to skip loading io-console on non-TTY output
20
+ * Fix size detection from tput to check for non-zero columns instead of lines
21
+ * Fix JRuby and Windows system detection to check Ruby configuration only once
22
+
3
23
  ## [v0.8.1] - 2020-07-17
4
24
 
5
25
  ### Fixed
@@ -136,6 +156,7 @@
136
156
  ### Fixed
137
157
  * Fix bug with screen detection from_io_console by @luxflux
138
158
 
159
+ [v0.8.2]: https://github.com/piotrmurach/tty-screen/compare/v0.8.1...v0.8.2
139
160
  [v0.8.1]: https://github.com/piotrmurach/tty-screen/compare/v0.8.0...v0.8.1
140
161
  [v0.8.0]: https://github.com/piotrmurach/tty-screen/compare/v0.7.1...v0.8.0
141
162
  [v0.7.1]: https://github.com/piotrmurach/tty-screen/compare/v0.7.0...v0.7.1
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2014 Piotr Murach
1
+ Copyright (c) 2014 Piotr Murach (piotrmurach.com)
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -1,34 +1,34 @@
1
1
  <div align="center">
2
- <a href="https://piotrmurach.github.io/tty" target="_blank"><img width="130" src="https://github.com/piotrmurach/tty/raw/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
- # TTY::Screen [![Gitter](https://badges.gitter.im/Join%20Chat.svg)][gitter]
5
+ # TTY::Screen
6
6
 
7
7
  [![Gem Version](https://badge.fury.io/rb/tty-screen.svg)][gem]
8
- [![Build Status](https://secure.travis-ci.org/piotrmurach/tty-screen.svg?branch=master)][travis]
8
+ [![Actions CI](https://github.com/piotrmurach/tty-screen/actions/workflows/ci.yml/badge.svg)][gh_actions_ci]
9
9
  [![Build status](https://ci.appveyor.com/api/projects/status/myjv8kahk1iwrlha?svg=true)][appveyor]
10
10
  [![Code Climate](https://codeclimate.com/github/piotrmurach/tty-screen/badges/gpa.svg)][codeclimate]
11
11
  [![Coverage Status](https://coveralls.io/repos/piotrmurach/tty-screen/badge.svg)][coverage]
12
- [![Inline docs](http://inch-ci.org/github/piotrmurach/tty-screen.svg?branch=master)][inchpages]
13
12
 
14
13
  [gitter]: https://gitter.im/piotrmurach/tty
15
14
  [gem]: http://badge.fury.io/rb/tty-screen
16
- [travis]: http://travis-ci.org/piotrmurach/tty-screen
15
+ [gh_actions_ci]: https://github.com/piotrmurach/tty-screen/actions/workflows/ci.yml
17
16
  [appveyor]: https://ci.appveyor.com/project/piotrmurach/tty-screen
18
17
  [codeclimate]: https://codeclimate.com/github/piotrmurach/tty-screen
19
18
  [coverage]: https://coveralls.io/r/piotrmurach/tty-screen
20
- [inchpages]: http://inch-ci.org/github/piotrmurach/tty-screen
21
19
 
22
- > Terminal screen size detection which works on Linux, OS X and Windows/Cygwin platforms and supports MRI, JRuby, TruffleRuby and Rubinius interpreters.
20
+ > Terminal screen size detection that works on Linux, macOS and Windows systems
21
+ and supports Ruby MRI, JRuby, TruffleRuby and Rubinius interpreters.
23
22
 
24
- **TTY::Screen** provides independent terminal screen size detection component for [TTY](https://github.com/piotrmurach/tty) toolkit.
23
+ **TTY::Screen** provides a terminal screen size detection component for the
24
+ [TTY](https://github.com/piotrmurach/tty) toolkit.
25
25
 
26
26
  ## Installation
27
27
 
28
28
  Add this line to your application's Gemfile:
29
29
 
30
30
  ```ruby
31
- gem 'tty-screen'
31
+ gem "tty-screen"
32
32
  ```
33
33
 
34
34
  And then execute:
@@ -41,13 +41,14 @@ Or install it yourself as:
41
41
 
42
42
  ## 1. Usage
43
43
 
44
- **TTY::Screen** allows you to detect terminal screen size by calling `size` method which returns [height, width] tuple.
44
+ Use the `size` method to detect terminal screen size. It will result in
45
+ a `[height, width]` array:
45
46
 
46
47
  ```ruby
47
- TTY::Screen.size # => [51, 280]
48
+ TTY::Screen.size # => [51, 280]
48
49
  ```
49
50
 
50
- To read terminal width do:
51
+ Use the `width`, `columns` or `cols` method to detect terminal screen width:
51
52
 
52
53
  ```ruby
53
54
  TTY::Screen.width # => 280
@@ -55,14 +56,20 @@ TTY::Screen.columns # => 280
55
56
  TTY::Screen.cols # => 280
56
57
  ```
57
58
 
58
- Similarly, to read terminal height do:
59
+ Use the `height`, `lines` or `rows` method to detect terminal screen height:
59
60
 
60
61
  ```ruby
61
- TTY::Screen.height # => 51
62
- TTY::Screen.rows # => 51
63
- TTY::Screen.lines # => 51
62
+ TTY::Screen.height # => 51
63
+ TTY::Screen.lines # => 51
64
+ TTY::Screen.rows # => 51
64
65
  ```
65
66
 
67
+ ## Development
68
+
69
+ After checking out the repo, run `bin/setup` to install dependencies.
70
+ Then, run `rake spec` to run the tests. You can also run `bin/console`
71
+ for an interactive prompt that will allow you to experiment.
72
+
66
73
  ## Contributing
67
74
 
68
75
  1. Fork it ( https://github.com/piotrmurach/tty-screen/fork )
@@ -71,8 +78,19 @@ TTY::Screen.lines # => 51
71
78
  4. Push to the branch (`git push origin my-new-feature`)
72
79
  5. Create a new Pull Request
73
80
 
74
- This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
81
+ ## License
82
+
83
+ The gem is available as open source under the terms of the
84
+ [MIT License](https://opensource.org/licenses/MIT).
85
+
86
+ ## Code of Conduct
87
+
88
+ Everyone interacting in the TTY::Screen project's codebases, issue trackers,
89
+ chat rooms and mailing lists is expected to follow the
90
+ [code of conduct](https://github.com/piotrmurach/tty-screen/blob/master/CODE_OF_CONDUCT.md).
75
91
 
76
92
  ## Copyright
77
93
 
78
- Copyright (c) 2014 Piotr Murach. See LICENSE for further details.
94
+ Copyright (c) 2014 Piotr Murach. See
95
+ [LICENSE.txt](https://github.com/piotrmurach/tty-screen/blob/master/LICENSE.txt)
96
+ for further details.
@@ -1,7 +1,7 @@
1
- # fronzen_string_literal: true
1
+ # frozen_string_literal: true
2
2
 
3
3
  module TTY
4
4
  module Screen
5
- VERSION = "0.8.1"
5
+ VERSION = "0.8.2"
6
6
  end # Screen
7
7
  end # TTY
data/lib/tty/screen.rb CHANGED
@@ -8,54 +8,99 @@ end
8
8
  require_relative "screen/version"
9
9
 
10
10
  module TTY
11
- # Used for detecting screen properties
11
+ # Responsible for detecting terminal screen size
12
12
  #
13
13
  # @api public
14
14
  module Screen
15
- # Helper to define private functions
15
+ # The Ruby configuration
16
+ #
17
+ # @return [Hash]
18
+ #
19
+ # @api private
20
+ RUBY_CONFIG = defined?(::RbConfig) ? ::RbConfig::CONFIG : {}
21
+ private_constant :RUBY_CONFIG
22
+
23
+ # Define module method as private
24
+ #
25
+ # @return [void]
26
+ #
27
+ # @api private
16
28
  def self.private_module_function(name)
17
29
  module_function(name)
18
30
  private_class_method(name)
19
31
  end
20
32
 
21
- case (defined?(::RbConfig) ? ::RbConfig::CONFIG["host_os"] : ::RUBY_PLATFORM)
33
+ case RUBY_CONFIG["host_os"] || ::RUBY_PLATFORM
22
34
  when /mswin|msys|mingw|cygwin|bccwin|wince|emc/
35
+ # Detect Windows system
36
+ #
37
+ # @return [Boolean]
38
+ #
39
+ # @api private
23
40
  def windows?; true end
24
41
  else
25
42
  def windows?; false end
26
43
  end
27
44
  module_function :windows?
28
45
 
29
- case (defined?(::RbConfig) ? ::RbConfig::CONFIG["ruby_install_name"] : ::RUBY_ENGINE)
46
+ case RUBY_CONFIG["ruby_install_name"] || ::RUBY_ENGINE
30
47
  when /jruby/
48
+ # Detect JRuby
49
+ #
50
+ # @return [Boolean]
51
+ #
52
+ # @api private
31
53
  def jruby?; true end
32
54
  else
33
55
  def jruby?; false end
34
56
  end
35
57
  module_function :jruby?
36
58
 
37
- # Default terminal size
59
+ # The default terminal screen size
38
60
  #
39
- # @api public
61
+ # @return [Array(Integer, Integer)]
62
+ #
63
+ # @api private
40
64
  DEFAULT_SIZE = [27, 80].freeze
41
65
 
42
66
  @env = ENV
43
67
  @output = $stderr
44
68
 
45
69
  class << self
46
- # Holds the environment variables
70
+ # The environment variables
71
+ #
72
+ # @example
73
+ # TTY::Screen.env
74
+ #
75
+ # @example
76
+ # TTY::Screen.env = {"ROWS" => "51", "COLUMNS" => "211"}
77
+ #
78
+ # @return [Enumerable]
79
+ #
47
80
  # @api public
48
81
  attr_accessor :env
49
82
 
50
- # Specifies an output stream
83
+ # The output stream with standard error as default
84
+ #
85
+ # @example
86
+ # TTY::Screen.output
87
+ #
88
+ # @example
89
+ # TTY::Screen.output = $stdout
90
+ #
91
+ # @return [IO]
92
+ #
51
93
  # @api public
52
94
  attr_accessor :output
53
95
  end
54
96
 
55
- # Get terminal rows and columns
97
+ # Detect terminal screen size
56
98
  #
57
- # @return [Array[Integer, Integer]]
58
- # return rows and columns
99
+ # @example
100
+ # TTY::Screen.size # => [51, 211]
101
+ #
102
+ # @return [Array(Integer, Integer)]
103
+ # the terminal screen size
59
104
  #
60
105
  # @api public
61
106
  def size(verbose: false)
@@ -72,6 +117,14 @@ module TTY
72
117
  end
73
118
  module_function :size
74
119
 
120
+ # Detect terminal screen width
121
+ #
122
+ # @example
123
+ # TTY::Screen.width # => 211
124
+ #
125
+ # @return [Integer]
126
+ #
127
+ # @api public
75
128
  def width
76
129
  size[1]
77
130
  end
@@ -82,6 +135,14 @@ module TTY
82
135
  module_function :columns
83
136
  module_function :cols
84
137
 
138
+ # Detect terminal screen height
139
+ #
140
+ # @example
141
+ # TTY::Screen.height # => 51
142
+ #
143
+ # @return [Integer]
144
+ #
145
+ # @api public
85
146
  def height
86
147
  size[0]
87
148
  end
@@ -92,9 +153,9 @@ module TTY
92
153
  module_function :rows
93
154
  module_function :lines
94
155
 
95
- # Default size for the terminal
156
+ # Detect terminal screen size from default
96
157
  #
97
- # @return [Array[Integer, Integer]]
158
+ # @return [Array(Integer, Integer)]
98
159
  #
99
160
  # @api private
100
161
  def size_from_default
@@ -102,32 +163,41 @@ module TTY
102
163
  end
103
164
  module_function :size_from_default
104
165
 
105
- # Determine terminal size with a Windows native API
106
- #
107
- # @return [nil, Array[Integer, Integer]]
108
- #
109
- # @api private
110
166
  if windows?
167
+ # The standard output handle
168
+ #
169
+ # @return [Integer]
170
+ #
171
+ # @api private
111
172
  STDOUT_HANDLE = 0xFFFFFFF5
112
173
 
174
+ # Detect terminal screen size from Windows API
175
+ #
176
+ # @param [Boolean] verbose
177
+ # the verbose mode, by default false
178
+ #
179
+ # @return [Array(Integer, Integer), nil]
180
+ # the terminal screen size or nil
181
+ #
182
+ # @api private
113
183
  def size_from_win_api(verbose: false)
114
184
  require "fiddle" unless defined?(Fiddle)
115
185
 
116
186
  kernel32 = Fiddle::Handle.new("kernel32")
117
- get_std_handle = Fiddle::Function.new(kernel32["GetStdHandle"],
118
- [-Fiddle::TYPE_INT], Fiddle::TYPE_INT)
187
+ get_std_handle = Fiddle::Function.new(
188
+ kernel32["GetStdHandle"], [-Fiddle::TYPE_INT], Fiddle::TYPE_INT)
119
189
  get_console_buffer_info = Fiddle::Function.new(
120
190
  kernel32["GetConsoleScreenBufferInfo"],
121
191
  [Fiddle::TYPE_LONG, Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT)
122
192
 
123
- format = "SSSSSssssSS"
124
- buffer = ([0] * format.size).pack(format)
193
+ format = "SSSSSssssSS"
194
+ buffer = ([0] * format.size).pack(format)
125
195
  stdout_handle = get_std_handle.(STDOUT_HANDLE)
126
196
 
127
197
  get_console_buffer_info.(stdout_handle, buffer)
128
198
  _, _, _, _, _, left, top, right, bottom, = buffer.unpack(format)
129
199
  size = [bottom - top + 1, right - left + 1]
130
- return size if nonzero_column?(size[1] - 1)
200
+ size if nonzero_column?(size[1] - 1)
131
201
  rescue LoadError
132
202
  warn "no native fiddle module found" if verbose
133
203
  rescue Fiddle::DLError
@@ -138,19 +208,23 @@ module TTY
138
208
  end
139
209
  module_function :size_from_win_api
140
210
 
141
- # Determine terminal size on jruby using native Java libs
142
- #
143
- # @return [nil, Array[Integer, Integer]]
144
- #
145
- # @api private
146
211
  if jruby?
212
+ # Detect terminal screen size from Java
213
+ #
214
+ # @param [Boolean] verbose
215
+ # the verbose mode, by default false
216
+ #
217
+ # @return [Array(Integer, Integer), nil]
218
+ # the terminal screen size or nil
219
+ #
220
+ # @api private
147
221
  def size_from_java(verbose: false)
148
222
  require "java"
149
223
 
150
224
  java_import "jline.TerminalFactory"
151
225
  terminal = TerminalFactory.get
152
226
  size = [terminal.get_height, terminal.get_width]
153
- return size if nonzero_column?(size[1])
227
+ size if nonzero_column?(size[1])
154
228
  rescue
155
229
  warn "failed to import java terminal package" if verbose
156
230
  end
@@ -159,21 +233,26 @@ module TTY
159
233
  end
160
234
  module_function :size_from_java
161
235
 
162
- # Detect screen size by loading io/console lib
236
+ # Detect terminal screen size from io-console
237
+ #
238
+ # On Windows, the io-console falls back to reading environment
239
+ # variables. This means any user changes to the terminal screen
240
+ # size will not be reflected in the runtime of the Ruby application.
163
241
  #
164
- # On Windows io_console falls back to reading environment
165
- # variables. This means any user changes to the terminal
166
- # size won't be reflected in the runtime of the Ruby app.
242
+ # @param [Boolean] verbose
243
+ # the verbose mode, by default false
167
244
  #
168
- # @return [nil, Array[Integer, Integer]]
245
+ # @return [Array(Integer, Integer), nil]
246
+ # the terminal screen size or nil
169
247
  #
170
248
  # @api private
171
249
  def size_from_io_console(verbose: false)
172
- require "io/console" unless IO.method_defined?(:winsize)
250
+ return unless output.tty?
173
251
 
174
- return unless @output.tty? && @output.respond_to?(:winsize)
252
+ require "io/console" unless IO.method_defined?(:winsize)
253
+ return unless output.respond_to?(:winsize)
175
254
 
176
- size = @output.winsize
255
+ size = output.winsize
177
256
  size if nonzero_column?(size[1])
178
257
  rescue Errno::EOPNOTSUPP
179
258
  # no support for winsize on output
@@ -182,34 +261,71 @@ module TTY
182
261
  end
183
262
  module_function :size_from_io_console
184
263
 
185
- if !jruby? && @output.respond_to?(:ioctl)
186
- TIOCGWINSZ = 0x5413 # linux
187
- TIOCGWINSZ_PPC = 0x40087468 # macos, freedbsd, netbsd, openbsd
188
- TIOCGWINSZ_SOL = 0x5468 # solaris
264
+ if !jruby? && output.respond_to?(:ioctl)
265
+ # The get window size control code for Linux
266
+ #
267
+ # @return [Integer]
268
+ #
269
+ # @api private
270
+ TIOCGWINSZ = 0x5413
271
+
272
+ # The get window size control code for FreeBSD and macOS
273
+ #
274
+ # @return [Integer]
275
+ #
276
+ # @api private
277
+ TIOCGWINSZ_PPC = 0x40087468
278
+
279
+ # The get window size control code for Solaris
280
+ #
281
+ # @return [Integer]
282
+ #
283
+ # @api private
284
+ TIOCGWINSZ_SOL = 0x5468
285
+
286
+ # The ioctl window size buffer format
287
+ #
288
+ # @return [String]
289
+ #
290
+ # @api private
291
+ TIOCGWINSZ_BUF_FMT = "SSSS"
292
+ private_constant :TIOCGWINSZ_BUF_FMT
189
293
 
190
- # Read terminal size from Unix ioctl
294
+ # The ioctl window size buffer length
191
295
  #
192
- # @return [nil, Array[Integer, Integer]]
296
+ # @return [Integer]
297
+ #
298
+ # @api private
299
+ TIOCGWINSZ_BUF_LEN = TIOCGWINSZ_BUF_FMT.length
300
+ private_constant :TIOCGWINSZ_BUF_LEN
301
+
302
+ # Detect terminal screen size from ioctl
303
+ #
304
+ # @return [Array(Integer, Integer), nil]
305
+ # the terminal screen size or nil
193
306
  #
194
307
  # @api private
195
308
  def size_from_ioctl
196
- format = "SSSS"
197
- buffer = ([0] * format.size).pack(format)
309
+ buffer = Array.new(TIOCGWINSZ_BUF_LEN, 0).pack(TIOCGWINSZ_BUF_FMT)
198
310
 
199
311
  if ioctl?(TIOCGWINSZ, buffer) ||
200
312
  ioctl?(TIOCGWINSZ_PPC, buffer) ||
201
313
  ioctl?(TIOCGWINSZ_SOL, buffer)
202
314
 
203
- rows, cols, = buffer.unpack(format)[0..1]
204
- return [rows, cols] if nonzero_column?(cols)
315
+ rows, cols, = buffer.unpack(TIOCGWINSZ_BUF_FMT)
316
+ [rows, cols] if nonzero_column?(cols)
205
317
  end
206
318
  end
207
319
 
208
- # Check if ioctl can be called and any of the streams is
209
- # attached to a terminal.
320
+ # Check if the ioctl call gets window size on any standard stream
321
+ #
322
+ # @param [Integer] control
323
+ # the control code
324
+ # @param [String] buf
325
+ # the window size buffer
210
326
  #
211
327
  # @return [Boolean]
212
- # True if any of the streams is attached to a terminal, false otherwise.
328
+ # true if the ioctl call gets window size, false otherwise
213
329
  #
214
330
  # @api private
215
331
  def ioctl?(control, buf)
@@ -225,12 +341,19 @@ module TTY
225
341
  end
226
342
  module_function :size_from_ioctl
227
343
 
228
- # Detect screen size using Readline
344
+ # Detect terminal screen size from readline
345
+ #
346
+ # @param [Boolean] verbose
347
+ # the verbose mode, by default false
348
+ #
349
+ # @return [Array(Integer, Integer), nil]
350
+ # the terminal screen size or nil
229
351
  #
230
352
  # @api private
231
353
  def size_from_readline(verbose: false)
232
- require "readline" unless defined?(::Readline)
354
+ return unless output.tty?
233
355
 
356
+ require "readline" unless defined?(::Readline)
234
357
  return unless ::Readline.respond_to?(:get_screen_size)
235
358
 
236
359
  size = ::Readline.get_screen_size
@@ -241,25 +364,31 @@ module TTY
241
364
  end
242
365
  module_function :size_from_readline
243
366
 
244
- # Detect terminal size from tput utility
367
+ # Detect terminal screen size from tput
368
+ #
369
+ # @return [Array(Integer, Integer), nil]
370
+ # the terminal screen size or nil
245
371
  #
246
372
  # @api private
247
373
  def size_from_tput
248
- return unless @output.tty? && command_exist?("tput")
374
+ return unless output.tty? && command_exist?("tput")
249
375
 
250
376
  lines = run_command("tput", "lines")
251
377
  return unless lines
252
378
 
253
379
  cols = run_command("tput", "cols")
254
- [lines.to_i, cols.to_i] if nonzero_column?(lines)
380
+ [lines.to_i, cols.to_i] if nonzero_column?(cols)
255
381
  end
256
382
  module_function :size_from_tput
257
383
 
258
- # Detect terminal size from stty utility
384
+ # Detect terminal screen size from stty
385
+ #
386
+ # @return [Array(Integer, Integer), nil]
387
+ # the terminal screen size or nil
259
388
  #
260
389
  # @api private
261
390
  def size_from_stty
262
- return unless @output.tty? && command_exist?("stty")
391
+ return unless output.tty? && command_exist?("stty")
263
392
 
264
393
  out = run_command("stty", "size")
265
394
  return unless out
@@ -269,36 +398,43 @@ module TTY
269
398
  end
270
399
  module_function :size_from_stty
271
400
 
272
- # Detect terminal size from environment
401
+ # Detect terminal screen size from environment variables
273
402
  #
274
- # After executing Ruby code if the user changes terminal
275
- # dimensions during code runtime, the code won't be notified,
276
- # and hence won't see the new dimensions reflected in its copy
277
- # of LINES and COLUMNS environment variables.
403
+ # After executing Ruby code, when the user changes terminal
404
+ # screen size during code runtime, the code will not be
405
+ # notified, and hence will not see the new size reflected
406
+ # in its copy of LINES and COLUMNS environment variables.
278
407
  #
279
- # @return [nil, Array[Integer, Integer]]
408
+ # @return [Array(Integer, Integer), nil]
409
+ # the terminal screen size or nil
280
410
  #
281
411
  # @api private
282
412
  def size_from_env
283
- return unless @env["COLUMNS"] =~ /^\d+$/
413
+ return unless env["COLUMNS"] =~ /^\d+$/
284
414
 
285
- size = [(@env["LINES"] || @env["ROWS"]).to_i, @env["COLUMNS"].to_i]
415
+ size = [(env["LINES"] || env["ROWS"]).to_i, env["COLUMNS"].to_i]
286
416
  size if nonzero_column?(size[1])
287
417
  end
288
418
  module_function :size_from_env
289
419
 
290
- # Detect terminal size from Windows ANSICON
420
+ # Detect terminal screen size from the ANSICON environment variable
421
+ #
422
+ # @return [Array(Integer, Integer), nil]
423
+ # the terminal screen size or nil
291
424
  #
292
425
  # @api private
293
426
  def size_from_ansicon
294
- return unless @env["ANSICON"] =~ /\((.*)x(.*)\)/
427
+ return unless env["ANSICON"] =~ /\((.*)x(.*)\)/
295
428
 
296
- size = [$2, $1].map(&:to_i)
429
+ size = [::Regexp.last_match(2).to_i, ::Regexp.last_match(1).to_i]
297
430
  size if nonzero_column?(size[1])
298
431
  end
299
432
  module_function :size_from_ansicon
300
433
 
301
- # Check if command exists
434
+ # Check if a command exists
435
+ #
436
+ # @param [String] command
437
+ # the command to check
302
438
  #
303
439
  # @return [Boolean]
304
440
  #
@@ -307,12 +443,19 @@ module TTY
307
443
  exts = env.fetch("PATHEXT", "").split(::File::PATH_SEPARATOR)
308
444
  env.fetch("PATH", "").split(::File::PATH_SEPARATOR).any? do |dir|
309
445
  file = ::File.join(dir, command)
310
- ::File.exist?(file) || exts.any? { |ext| ::File.exist?("#{file}#{ext}") }
446
+ ::File.exist?(file) ||
447
+ exts.any? { |ext| ::File.exist?("#{file}#{ext}") }
311
448
  end
312
449
  end
313
450
  private_module_function :command_exist?
314
451
 
315
- # Runs command silently capturing the output
452
+ # Run command capturing the standard output
453
+ #
454
+ # @param [Array<String>] args
455
+ # the command arguments
456
+ #
457
+ # @return [String, nil]
458
+ # the command output or nil
316
459
  #
317
460
  # @api private
318
461
  def run_command(*args)
@@ -322,9 +465,12 @@ module TTY
322
465
  end
323
466
  private_module_function :run_command
324
467
 
325
- # Check if number is non zero
468
+ # Check if a number is non-zero
326
469
  #
327
- # return [Boolean]
470
+ # @param [Integer, String] column
471
+ # the column to check
472
+ #
473
+ # @return [Boolean]
328
474
  #
329
475
  # @api private
330
476
  def nonzero_column?(column)
data/lib/tty-screen.rb CHANGED
@@ -1 +1 @@
1
- require_relative 'tty/screen'
1
+ require_relative "tty/screen"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tty-screen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.8.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Murach
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-17 00:00:00.000000000 Z
11
+ date: 2023-12-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -38,8 +38,8 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '3.0'
41
- description: Terminal screen size detection which works on Linux, OS X and Windows/Cygwin
42
- platforms and supports MRI, JRuby, TruffleRuby and Rubinius interpreters.
41
+ description: Terminal screen size detection that works on Linux, macOS and Windows
42
+ systems and supports Ruby MRI, JRuby, TruffleRuby and Rubinius interpreters.
43
43
  email:
44
44
  - piotr@piotrmurach.com
45
45
  executables: []
@@ -63,9 +63,11 @@ metadata:
63
63
  bug_tracker_uri: https://github.com/piotrmurach/tty-screen/issues
64
64
  changelog_uri: https://github.com/piotrmurach/tty-screen/blob/master/CHANGELOG.md
65
65
  documentation_uri: https://www.rubydoc.info/gems/tty-screen
66
+ funding_uri: https://github.com/sponsors/piotrmurach
66
67
  homepage_uri: https://ttytoolkit.org
68
+ rubygems_mfa_required: 'true'
67
69
  source_code_uri: https://github.com/piotrmurach/tty-screen
68
- post_install_message:
70
+ post_install_message:
69
71
  rdoc_options: []
70
72
  require_paths:
71
73
  - lib
@@ -80,9 +82,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
80
82
  - !ruby/object:Gem::Version
81
83
  version: '0'
82
84
  requirements: []
83
- rubygems_version: 3.1.2
84
- signing_key:
85
+ rubygems_version: 3.4.10
86
+ signing_key:
85
87
  specification_version: 4
86
- summary: Terminal screen size detection which works on Linux, OS X and Windows/Cygwin
87
- platforms and supports MRI, JRuby, TruffleRuby and Rubinius interpreters.
88
+ summary: Terminal screen size detection.
88
89
  test_files: []