tty 0.1.3 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ad0efdc965bc3c933d7cb71d0bf75a5be2c3bf45
4
- data.tar.gz: f4e7b12fbe37bce6cc467730a472112ca673ae36
3
+ metadata.gz: adb46f2f2927f1568a05f2bd72a95716463b325b
4
+ data.tar.gz: 9d51b87df30a5743b6c72685685e085fe52f4d4d
5
5
  SHA512:
6
- metadata.gz: 0045cfb5de1675a6485681b047f6cf5e785e1758b6fca908bf84a943d199f8ed2e77ba8cb0239f8dc810f07cea551ae565b485849c395e1e9fa7ed1de62bcb79
7
- data.tar.gz: 103f2d9010887f3b658f97f901df315deebe80f54248950818322477d0aea36f779a2ab93ce633c504f96491649feec324bce45d946402ebed729c81eabdd561
6
+ metadata.gz: b759a9417dd3cdd4ecc2f306b07eb9e47479e45bd4d5d54669157ef357491e55f6bc2c32cb061c9e6e6f31d3a85b21904e7665a6d9decfc8f2e991e93718562e
7
+ data.tar.gz: 444c56543b529c9e22b5b90b557a0398be12c2270223d7b97dc4732972380ea7838a9897e6a2a0d50a8ada2e34390e60f38a7c6f3240640ffba57539c0073204
@@ -1,3 +1,9 @@
1
+ 0.2.0 (July 6, 2015)
2
+
3
+ * Extract platform detection as dependency on tty-platform
4
+ * Extract terminal output paging as dependency on tty-pager
5
+ * Extract which command as dependency on tty-which
6
+
1
7
  0.1.3 (April 3, 2015)
2
8
 
3
9
  * Add table rendering as dependency on tty-table
data/Gemfile CHANGED
@@ -3,15 +3,15 @@ source 'https://rubygems.org'
3
3
  gemspec
4
4
 
5
5
  group :development do
6
- gem 'rake', '~> 10.1.0'
7
- gem 'rspec', '~> 3.1.0'
6
+ gem 'rake', '~> 10.4.2'
7
+ gem 'rspec', '~> 3.2.0'
8
8
  gem 'yard', '~> 0.8.7'
9
9
  gem 'timecop', '~> 0.7.1'
10
10
  end
11
11
 
12
12
  group :metrics do
13
- gem 'coveralls', '~> 0.7.0'
14
- gem 'simplecov', '~> 0.8.2'
13
+ gem 'coveralls', '~> 0.8.1'
14
+ gem 'simplecov', '~> 0.10.0'
15
15
  gem 'yardstick', '~> 0.9.9'
16
16
  gem 'reek', '~> 1.3.7'
17
17
  end
data/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # [![Application icon](https://github.com/peter-murach/tty/raw/master/images/tty.png)][icon]
2
2
  [icon]: http://peter-murach.github.io/tty/
3
- [![Gem Version](https://badge.fury.io/rb/tty.png)][gem]
4
- [![Build Status](https://secure.travis-ci.org/peter-murach/tty.png?branch=master)][travis]
5
- [![Code Climate](https://codeclimate.com/github/peter-murach/tty.png)][codeclimate]
6
- [![Coverage Status](https://coveralls.io/repos/peter-murach/tty/badge.png?branch=master)][coveralls]
7
- [![Inline docs](http://inch-ci.org/github/peter-murach/tty.png?branch=master)][inchpages]
3
+ [![Gem Version](https://badge.fury.io/rb/tty.svg)][gem]
4
+ [![Build Status](https://secure.travis-ci.org/peter-murach/tty.svg?branch=master)][travis]
5
+ [![Code Climate](https://codeclimate.com/github/peter-murach/tty/badges/gpa.svg)][codeclimate]
6
+ [![Coverage Status](https://coveralls.io/repos/peter-murach/tty/badge.svg?branch=master)][coveralls]
7
+ [![Inline docs](http://inch-ci.org/github/peter-murach/tty.svg?branch=master)][inchpages]
8
8
  [![Gitter](https://badges.gitter.im/Join Chat.svg)][gitter]
9
9
 
10
10
  [gem]: http://badge.fury.io/rb/tty
@@ -57,17 +57,18 @@ Or install it yourself as:
57
57
 
58
58
  ## Contents
59
59
 
60
- * [1. Table](#1-table)
61
- * [2. Color](#2-color)
62
- * [3. ProgressBar](#3-progressbar)
63
- * [4. Spinner](#4-spinner)
64
- * [5. Screen](#5-screen)
65
- * [6. Terminal](#6-terminal)
66
- * [6.1 Pager](#61-pager)
67
- * [7. Shell](#7-shell)
68
- * [8. System](#8-system)
60
+ * [1. Overview](#1-overview)
61
+ * [2. Drawing tables](#2-drawing-tables)
62
+ * [3. Drawing progress bars](#3-drawing-progress-bars)
63
+ * [4. Drawing spinners](#4-drawing-spinners)
64
+ * [5. Output coloring](#5-output-coloring)
65
+ * [6. Output paging](#6-output-paging)
66
+ * [7. Detecting screen properties](#7-detecting-screen-properties)
67
+ * [8. Detecting platform](#8-detecting-platform)
68
+ * [9. Searching executables](#9-searching-executables)
69
+ * [10. Prompting for input](#10-prompting-for-input)
69
70
 
70
- ## Usage
71
+ ## 1. Overview
71
72
 
72
73
  **TTY** provides you with many tools to get the job done in terminal.
73
74
 
@@ -110,7 +111,7 @@ screen.width # => 280
110
111
  screen.height # => 51
111
112
  ```
112
113
 
113
- ## 1. Table
114
+ ## 2. Drawing tables
114
115
 
115
116
  **TTY** uses the [tty-table](https://github.com/peter-murach/tty-table) component in order to convert data into table and render as string output in tabular form. For example, to render data with ASCII border:
116
117
 
@@ -128,20 +129,11 @@ table.render(:ascii)
128
129
 
129
130
  Please refer to [documentation](https://github.com/peter-murach/tty-table) for complete API.
130
131
 
131
- ## 2. Color
132
+ ## 3. Drawing progress bars
132
133
 
133
- In order to colorize your output **TTY** uses the [pastel](https://github.com/peter-murach/pastel) component like so:
134
-
135
- ```ruby
136
- pastel = Pastel.new
137
- pastel.red.on_green.bold 'text...' # => red bold text on green background
138
- ```
139
-
140
- Please refer to [documentation](https://github.com/peter-murach/pastel) for complete API.
134
+ In order to draw progress bars in terminal, **TTY** uses the [tty-progressbar](https://github.com/peter-murach/tty-progressbar) component.
141
135
 
142
- ## 3. ProgressBar
143
-
144
- In order to draw progress bar **TTY** uses the [tty-progressbar](https://github.com/peter-murach/tty-progressbar) component. For example, to render basic download bar do:
136
+ For example, to render basic download bar do:
145
137
 
146
138
  ```ruby
147
139
  bar = TTY::ProgressBar.new("downloading [:bar]", total: 30)
@@ -150,7 +142,7 @@ bar = TTY::ProgressBar.new("downloading [:bar]", total: 30)
150
142
 
151
143
  Please refer to [documentation](https://github.com/peter-murach/tty-progressbar) for complete API.
152
144
 
153
- ## 4. Spinner
145
+ ## 4. Drawing spinners
154
146
 
155
147
  **TTY** uses the [tty-spinner](https://github.com/peter-murach/tty-spinner) component to handle terminal spinning animation. For instance, to create a simple spinner do:
156
148
 
@@ -161,9 +153,35 @@ spinner = TTY::Spinner.new('Loading ... ', format: :spin_2)
161
153
 
162
154
  Please refer to [documentation](https://github.com/peter-murach/tty-spinner) for complete API.
163
155
 
164
- ## 5. Screen
156
+ ## 5. Output coloring
157
+
158
+ In order to colorize your output **TTY** uses the [pastel](https://github.com/peter-murach/pastel) component like so:
159
+
160
+ ```ruby
161
+ pastel = Pastel.new
162
+ pastel.red.on_green.bold 'text...' # => red bold text on green background
163
+ ```
164
+
165
+ Please refer to [documentation](https://github.com/peter-murach/pastel) for complete API.
166
+
167
+ ## 6. Output paging
165
168
 
166
- **TTY** uses the [tty-screen](https://github.com/peter-murach/tty-screen) component to measure the screen properties. For example to get screen size do:
169
+ To page terminal output **TTY** relies on [tty-pager](https://github.com/peter-murach/tty-pager) component.
170
+
171
+ For example to page terminal output do (on non unix systems falls back to ruby implementation):
172
+
173
+ ```ruby
174
+ pager = TTY::Pager.new
175
+ pager.page('Very long text...')
176
+ ```
177
+
178
+ Please refer to [documentation](https://github.com/peter-murach/tty-pager) for complete API.
179
+
180
+ ## 7. Detecting screen properties
181
+
182
+ **TTY** uses the [tty-screen](https://github.com/peter-murach/tty-screen) component to measure the screen properties.
183
+
184
+ For example to get screen size do:
167
185
 
168
186
  ```ruby
169
187
  screen = TTY::Screen.new
@@ -174,25 +192,39 @@ screen.height # => 51
174
192
 
175
193
  Please refer to [documentation](https://github.com/peter-murach/tty-screen) for complete API.
176
194
 
177
- ## 6 Terminal
195
+ ## 8. Detecting platform
178
196
 
179
- To read general terminal properties you can use on of the helpers
197
+ To check for platform properties **TTY** uses [tty-platform](https://github.com/peter-murach/tty-platform) component.
180
198
 
181
199
  ```ruby
182
- term = TTY::Terminal.new
183
- term.echo(false) { } # switch off echo for the block
184
- term.page # page terminal output, on non unix systems falls back to ruby implementation
200
+ platform = TTY::Platform.new
201
+ platform.cpu # => 'x86_64'
202
+ platform.os # => 'darwin'
203
+ platform.version # => '10.6.1'
185
204
  ```
186
205
 
187
- ### 6.1 Pager
206
+ In addition, there are more generic utilities to check for type of operating system:
188
207
 
189
- To page your output do
208
+ ```
209
+ TTY::Platform.unix? # => true
210
+ TTY::Platform.windows? # => false
211
+ ```
212
+
213
+ Please refer to [documentation](https://github.com/peter-murach/tty-platform) for complete API.
214
+
215
+ ## 9. Searching executables
216
+
217
+ To find executable path **TTY** uses [tty-which](https://github.com/peter-murach/tty-which#ttywhich) component.
218
+
219
+ For instance, to find out if `less` utility is actually supported by the system do:
190
220
 
191
221
  ```ruby
192
- term.page 'long text...'
222
+ TTY::Which.which('less') # => '/usr/bin/less'
193
223
  ```
194
224
 
195
- ## 7 Shell
225
+ Please refer to [documentation](https://github.com/peter-murach/tty-which) for complete API.
226
+
227
+ ## 10. Prompting for input
196
228
 
197
229
  Main responsibility is to interact with the prompt and provide convenience methods.
198
230
 
@@ -291,16 +323,9 @@ shell.suggest('sta', ['stage', 'stash', 'commit', 'branch'])
291
323
  stash
292
324
  ```
293
325
 
294
- ## 8 System
295
-
296
- ```ruby
297
- TTY::System.unix? # check if unix platform
298
- TTY::System.windows? # check if windows platform
299
326
  TTY::System.which(cmd) # full path to executable if found, nil otherwise
300
327
  TTY::System.exists?(cmd) # check if command is available
301
328
  TTY::System.editor # provides access to system editor
302
- ```
303
-
304
329
  To set preferred editor you can either use shell environment variables such as `EDITOR` and `VISUAL` or set the command(s) manually like so
305
330
 
306
331
  ```ruby
data/lib/tty.rb CHANGED
@@ -3,10 +3,13 @@
3
3
  require 'equatable'
4
4
  require 'pastel'
5
5
  require 'necromancer'
6
+ require 'tty-pager'
7
+ require 'tty-platform'
8
+ require 'tty-progressbar'
6
9
  require 'tty-screen'
7
10
  require 'tty-spinner'
8
- require 'tty-progressbar'
9
11
  require 'tty-table'
12
+ require 'tty-which'
10
13
 
11
14
  require 'tty/version'
12
15
 
@@ -37,11 +40,7 @@ require 'tty/shell/response'
37
40
  require 'tty/terminal/echo'
38
41
  require 'tty/terminal/raw'
39
42
  require 'tty/terminal/home'
40
- require 'tty/terminal/pager'
41
- require 'tty/terminal/pager/basic'
42
- require 'tty/terminal/pager/system'
43
43
 
44
- require 'tty/system/which'
45
44
  require 'tty/system/editor'
46
45
 
47
46
  module TTY
@@ -1,55 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'rbconfig'
4
-
5
3
  module TTY
6
4
  class System
7
- # Check if windows platform.
8
- #
9
- # @return [Boolean]
10
- #
11
- # @api public
12
- def self.windows?
13
- match_os?(/msdos|mswin|djgpp|mingw|windows/i)
14
- end
15
-
16
- # Check if unix platform
17
- #
18
- # @return [Boolean]
19
- #
20
- # @api public
21
- def self.unix?
22
- match_os?(/(aix|darwin|linux|(net|free|open)bsd|cygwin|solaris|irix|hpux)/i)
23
- end
24
-
25
- # Check if platform matches given systems
26
- #
27
- # @return [Boolean]
28
- #
29
- # @api public
30
- def self.match_os?(matcher)
31
- !!(RbConfig::CONFIG['host_os'] =~ matcher)
32
- end
33
-
34
- # Find an executable in the PATH
35
- #
36
- # @see TTY::System::Which
37
- #
38
- # @api public
39
- def self.which(command)
40
- Which.new(command).which
41
- end
42
-
43
- # Check if command is available
44
- #
45
- # @param [String] name
46
- # the command name
47
- #
48
- # @api public
49
- def self.exists?(name)
50
- !!which(name)
51
- end
52
-
53
5
  # Proxy to editor object
54
6
  #
55
7
  # @return [TTY::System::Editor]
@@ -9,13 +9,6 @@ module TTY
9
9
  # @api public
10
10
  attr_reader :color
11
11
 
12
- # Output pager
13
- #
14
- # @return [TTY::Terminal::Pager]
15
- #
16
- # @api public
17
- attr_reader :pager
18
-
19
12
  # Initialize a Terminal
20
13
  #
21
14
  # @api public
@@ -23,7 +16,6 @@ module TTY
23
16
  @color = Pastel.new
24
17
  @echo = TTY::Terminal::Echo.new
25
18
  @raw = TTY::Terminal::Raw.new
26
- @pager = TTY::Terminal::Pager
27
19
  @home = Home.new
28
20
  end
29
21
 
@@ -81,15 +73,5 @@ module TTY
81
73
  def home
82
74
  @home.home
83
75
  end
84
-
85
- # Run text through a dynamically chosen pager
86
- #
87
- # @param [String] text
88
- # the text to page
89
- #
90
- # @api public
91
- def page(text)
92
- @pager.page(text)
93
- end
94
76
  end # Terminal
95
77
  end # TTY
@@ -8,14 +8,14 @@ module TTY
8
8
  #
9
9
  # @api public
10
10
  def on
11
- %x{stty echo} if TTY::System.unix?
11
+ %x{stty echo} if TTY::Platform.unix?
12
12
  end
13
13
 
14
14
  # Turn echo off
15
15
  #
16
16
  # @api public
17
17
  def off
18
- %x{stty -echo} if TTY::System.unix?
18
+ %x{stty -echo} if TTY::Platform.unix?
19
19
  end
20
20
 
21
21
  # Wrap code block inside echo
@@ -8,14 +8,14 @@ module TTY
8
8
  #
9
9
  # @api public
10
10
  def on
11
- %x{stty raw} if TTY::System.unix?
11
+ %x{stty raw} if TTY::Platform.unix?
12
12
  end
13
13
 
14
14
  # Turn raw mode off
15
15
  #
16
16
  # @api public
17
17
  def off
18
- %x{stty -raw} if TTY::System.unix?
18
+ %x{stty -raw} if TTY::Platform.unix?
19
19
  end
20
20
 
21
21
  # Wrap code block inside raw mode
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module TTY
4
- VERSION = "0.1.3"
4
+ VERSION = "0.2.0"
5
5
  end # TTY
@@ -17,10 +17,13 @@ Gem::Specification.new do |gem|
17
17
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
18
  gem.require_paths = ["lib"]
19
19
 
20
- gem.add_dependency 'tty-table', '~> 0.2.0'
21
- gem.add_dependency 'tty-progressbar', '~> 0.5.0'
22
- gem.add_dependency 'tty-screen', '~> 0.1.0'
20
+ gem.add_dependency 'tty-pager', '~> 0.2.0'
21
+ gem.add_dependency 'tty-platform', '~> 0.1.0'
22
+ gem.add_dependency 'tty-progressbar', '~> 0.6.0'
23
+ gem.add_dependency 'tty-screen', '~> 0.2.0'
23
24
  gem.add_dependency 'tty-spinner', '~> 0.1.0'
25
+ gem.add_dependency 'tty-table', '~> 0.3.0'
26
+ gem.add_dependency 'tty-which', '~> 0.1.0'
24
27
  gem.add_dependency 'equatable', '~> 0.5.0'
25
28
  gem.add_dependency 'necromancer', '~> 0.3.0'
26
29
  gem.add_dependency 'pastel', '~> 0.4.0'
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tty
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.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: 2015-04-03 00:00:00.000000000 Z
11
+ date: 2015-07-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: tty-table
14
+ name: tty-pager
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ~>
@@ -24,22 +24,50 @@ dependencies:
24
24
  - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.2.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: tty-platform
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 0.1.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 0.1.0
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: tty-progressbar
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - ~>
32
46
  - !ruby/object:Gem::Version
33
- version: 0.5.0
47
+ version: 0.6.0
34
48
  type: :runtime
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
52
  - - ~>
39
53
  - !ruby/object:Gem::Version
40
- version: 0.5.0
54
+ version: 0.6.0
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: tty-screen
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 0.2.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 0.2.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: tty-spinner
43
71
  requirement: !ruby/object:Gem::Requirement
44
72
  requirements:
45
73
  - - ~>
@@ -53,7 +81,21 @@ dependencies:
53
81
  - !ruby/object:Gem::Version
54
82
  version: 0.1.0
55
83
  - !ruby/object:Gem::Dependency
56
- name: tty-spinner
84
+ name: tty-table
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: 0.3.0
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: 0.3.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: tty-which
57
99
  requirement: !ruby/object:Gem::Requirement
58
100
  requirements:
59
101
  - - ~>
@@ -162,13 +204,9 @@ files:
162
204
  - lib/tty/support/utils.rb
163
205
  - lib/tty/system.rb
164
206
  - lib/tty/system/editor.rb
165
- - lib/tty/system/which.rb
166
207
  - lib/tty/terminal.rb
167
208
  - lib/tty/terminal/echo.rb
168
209
  - lib/tty/terminal/home.rb
169
- - lib/tty/terminal/pager.rb
170
- - lib/tty/terminal/pager/basic.rb
171
- - lib/tty/terminal/pager/system.rb
172
210
  - lib/tty/terminal/raw.rb
173
211
  - lib/tty/vector.rb
174
212
  - lib/tty/version.rb
@@ -221,19 +259,9 @@ files:
221
259
  - spec/tty/system/editor/executables_spec.rb
222
260
  - spec/tty/system/editor/invoke_spec.rb
223
261
  - spec/tty/system/editor/open_spec.rb
224
- - spec/tty/system/platform_spec.rb
225
- - spec/tty/system/which/which_spec.rb
226
- - spec/tty/system/which_spec.rb
227
262
  - spec/tty/terminal/color_spec.rb
228
263
  - spec/tty/terminal/echo_spec.rb
229
264
  - spec/tty/terminal/home_spec.rb
230
- - spec/tty/terminal/page_spec.rb
231
- - spec/tty/terminal/pager/available_spec.rb
232
- - spec/tty/terminal/pager/basic/page_spec.rb
233
- - spec/tty/terminal/pager/command_spec.rb
234
- - spec/tty/terminal/pager/executables_spec.rb
235
- - spec/tty/terminal/pager/page_spec.rb
236
- - spec/tty/terminal/pager/system/page_spec.rb
237
265
  - spec/tty/tty_spec.rb
238
266
  - spec/tty/vector/new_spec.rb
239
267
  - tasks/console.rake
@@ -319,19 +347,9 @@ test_files:
319
347
  - spec/tty/system/editor/executables_spec.rb
320
348
  - spec/tty/system/editor/invoke_spec.rb
321
349
  - spec/tty/system/editor/open_spec.rb
322
- - spec/tty/system/platform_spec.rb
323
- - spec/tty/system/which/which_spec.rb
324
- - spec/tty/system/which_spec.rb
325
350
  - spec/tty/terminal/color_spec.rb
326
351
  - spec/tty/terminal/echo_spec.rb
327
352
  - spec/tty/terminal/home_spec.rb
328
- - spec/tty/terminal/page_spec.rb
329
- - spec/tty/terminal/pager/available_spec.rb
330
- - spec/tty/terminal/pager/basic/page_spec.rb
331
- - spec/tty/terminal/pager/command_spec.rb
332
- - spec/tty/terminal/pager/executables_spec.rb
333
- - spec/tty/terminal/pager/page_spec.rb
334
- - spec/tty/terminal/pager/system/page_spec.rb
335
353
  - spec/tty/tty_spec.rb
336
354
  - spec/tty/vector/new_spec.rb
337
355
  has_rdoc:
@@ -1,51 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module TTY
4
- class System
5
- # A class responsible for finding an executable in the PATH
6
- class Which
7
- # The command to find
8
- attr_reader :command
9
-
10
- # Initialize a Which
11
- #
12
- # @param [String] command
13
- # the command to find
14
- #
15
- # @api public
16
- def initialize(command)
17
- @command = command
18
- end
19
-
20
- # Find an executable in the PATH
21
- #
22
- # @param [String] command
23
- # the command to search in the PATH
24
- #
25
- # @example
26
- # which("ruby") # => /usr/local/bin/ruby
27
- #
28
- # @return [String]
29
- # the full path to executable if found, `nil` otherwise
30
- #
31
- # @api public
32
- def which
33
- exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
34
- default_system_path.each do |path|
35
- exts.each do |ext|
36
- exec = File.join("#{path}", "#{command}#{ext}")
37
- return exec if File.executable? exec
38
- end
39
- end
40
- nil
41
- end
42
-
43
- # Find default system paths
44
- #
45
- # @api private
46
- def default_system_path
47
- ENV['PATH'].split(File::PATH_SEPARATOR)
48
- end
49
- end # Which
50
- end # System
51
- end # TTY
@@ -1,96 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module TTY
4
- class Terminal
5
- # A class responsible for paging text inside terminal
6
- class Pager
7
-
8
- attr_accessor :enabled
9
-
10
- attr_reader :text
11
-
12
- @command = nil
13
-
14
- # Initialize a Pager
15
- #
16
- # @param [String] text
17
- # the text to page
18
- #
19
- # @api public
20
- def initialize(text = nil)
21
- @text = text
22
- @enabled = true
23
- end
24
-
25
- # Check if pager is enabled
26
- #
27
- # @return [Boolean]
28
- #
29
- # @api public
30
- def enabled?
31
- !!@enabled
32
- end
33
-
34
- # List possible executables for output paging
35
- #
36
- # @return [Array[String]]
37
- #
38
- # @api private
39
- def self.executables
40
- [ENV['GIT_PAGER'], `git config --get-all core.pager`.split.first,
41
- ENV['PAGER'], 'less -isr', 'more', 'cat', 'pager']
42
- end
43
-
44
- # Find first available system command for paging
45
- #
46
- # @param [Array[String]] commands
47
- #
48
- # @return [String]
49
- #
50
- # @api public
51
- def self.available(*commands)
52
- commands = commands.empty? ? executables : commands
53
- commands.compact.uniq.find { |cmd| System.exists?(cmd) }
54
- end
55
-
56
- # Check if paging command exists
57
- #
58
- # @api private
59
- def self.available?
60
- !!available
61
- end
62
-
63
- # Finds command to execute pager from shell commands
64
- # unless configured is provided.
65
- #
66
- # @param [Array[String]] commands
67
- #
68
- # @return [String]
69
- #
70
- # @api private
71
- def self.command(*commands)
72
- @command = if @command && commands.empty?
73
- @command
74
- else
75
- available(*commands)
76
- end
77
- end
78
-
79
- # Pages output using configured pager
80
- #
81
- # @param [String] text
82
- # the text to page
83
- #
84
- # @api public
85
- def self.page(text)
86
- return unless TTY.shell.tty?
87
-
88
- if System.unix? && available?
89
- SystemPager.new(text).page
90
- else
91
- BasicPager.new(text).page
92
- end
93
- end
94
- end # Pager
95
- end # Terminal
96
- end # TTY
@@ -1,49 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module TTY
4
- class Terminal
5
- # A class responsible for paging text
6
- class BasicPager < Pager
7
- PROMPT_HEIGHT = 3
8
-
9
- PAGE_BREAK = '--- Press enter/return to continue (or q to quit) ---'
10
-
11
- # Use ruby to page output text
12
- #
13
- # @api public
14
- def page
15
- text_lines = text.lines.to_a
16
-
17
- text_lines.each_slice(page_size) do |chunk|
18
- TTY.shell.say chunk.join
19
- break if chunk.size < page_size
20
- break if !continue?(text_lines)
21
- end
22
- end
23
-
24
- private
25
-
26
- # Check whether to progress with paging
27
- #
28
- # @param [Array[String]] text_lines
29
- #
30
- # @return [Boolean]
31
- #
32
- # @api private
33
- def continue?(text_lines)
34
- if text_lines.size > page_size
35
- question = TTY.shell.ask "\n#{PAGE_BREAK}"
36
- return false if question.read_string[/q/i]
37
- end
38
- true
39
- end
40
-
41
- # Determine current page size
42
- #
43
- # @api private
44
- def page_size
45
- @page_size ||= TTY.terminal.height - PROMPT_HEIGHT
46
- end
47
- end # BasicPager
48
- end # Terminal
49
- end # TTY
@@ -1,36 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module TTY
4
- class Terminal
5
- # A class responsible for paging text
6
- class SystemPager < Pager
7
- # Use system command to page output text
8
- #
9
- # @api public
10
- def page
11
- read_io, write_io = IO.pipe
12
-
13
- if Kernel.fork
14
- # parent process
15
- TTY.shell.input.reopen(read_io)
16
- read_io.close
17
- write_io.close
18
-
19
- # Wait until we have input before we start the pager
20
- Kernel.select [TTY.shell.stdin]
21
-
22
- begin
23
- Kernel.exec(Pager.command)
24
- rescue
25
- Kernel.exec '/bin/sh', '-c', command
26
- end
27
- else
28
- # child process
29
- write_io.write(text)
30
- write_io.close
31
- read_io.close
32
- end
33
- end
34
- end # SystemPager
35
- end # Terminal
36
- end # TTY
@@ -1,46 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe TTY::System, '#platform' do
6
- subject(:system) { described_class }
7
-
8
- it { is_expected.to respond_to(:windows?) }
9
-
10
- it { is_expected.to respond_to(:unix?) }
11
-
12
- it { is_expected.to respond_to(:which) }
13
-
14
- it { is_expected.to respond_to(:exists?) }
15
-
16
- it { is_expected.to respond_to(:editor) }
17
-
18
- context 'windows?' do
19
- it 'is on windows' do
20
- allow(RbConfig::CONFIG).to receive(:[]).with('host_os').and_return('windows')
21
- expect(system.windows?).to eq(true)
22
- end
23
-
24
- it 'is on windows ignoring case' do
25
- allow(RbConfig::CONFIG).to receive(:[]).with('host_os').and_return('Windows')
26
- expect(system.windows?).to eq(true)
27
- end
28
-
29
- it 'is not on windows' do
30
- allow(RbConfig::CONFIG).to receive(:[]).with('host_os').and_return('unknown')
31
- expect(system.windows?).to eq(false)
32
- end
33
- end
34
-
35
- context 'unix?' do
36
- it 'checks if unix' do
37
- allow(RbConfig::CONFIG).to receive(:[]).with('host_os').and_return('darwin')
38
- expect(system.unix?).to eq(true)
39
- end
40
-
41
- it 'checks if unix' do
42
- allow(RbConfig::CONFIG).to receive(:[]).with('host_os').and_return('unknown')
43
- expect(system.unix?).to eq(false)
44
- end
45
- end
46
- end
@@ -1,48 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe TTY::System::Which, '#which' do
6
- let(:path) { "/usr/local/bin:/usr/local/git/bin" }
7
- let(:extension) { '.bat' }
8
-
9
- subject { described_class.new(command) }
10
-
11
- context 'without extension' do
12
- let(:command) { 'ruby' }
13
-
14
- before {
15
- allow(ENV).to receive(:[]).with('PATHEXT').and_return(nil)
16
- allow(ENV).to receive(:[]).with('PATH').and_return(path)
17
- }
18
-
19
- it 'finds command' do
20
- allow(File).to receive(:executable?) { true }
21
- expect(subject.which).to eql "/usr/local/bin/ruby"
22
- end
23
-
24
- it "doesn't find command" do
25
- allow(File).to receive(:executable?) { false }
26
- expect(subject.which).to be_nil
27
- end
28
- end
29
-
30
- context 'with extension' do
31
- let(:command) { 'ruby' }
32
-
33
- before {
34
- allow(ENV).to receive(:[]).with('PATHEXT').and_return(extension)
35
- allow(ENV).to receive(:[]).with('PATH').and_return(path)
36
- }
37
-
38
- it 'finds command' do
39
- allow(File).to receive(:executable?) { true }
40
- expect(subject.which).to eql "/usr/local/bin/ruby.bat"
41
- end
42
-
43
- it "doesn't find command" do
44
- allow(File).to receive(:executable?) { false }
45
- expect(subject.which).to be_nil
46
- end
47
- end
48
- end
@@ -1,15 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe TTY::System, '#which' do
6
- let(:command) { 'ruby' }
7
- let(:which) { double(:which, :which => command) }
8
-
9
- subject(:system) { described_class }
10
-
11
- it 'seeks system command' do
12
- allow(TTY::System::Which).to receive(:new).with(command).and_return(which)
13
- expect(system.which(command)).to eql(command)
14
- end
15
- end
@@ -1,14 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe TTY::Terminal, '#page' do
6
- let(:text) { "a\n"}
7
-
8
- subject(:terminal) { described_class.new }
9
-
10
- it 'invokes pager page method' do
11
- expect(terminal.pager).to receive(:page).with(text)
12
- terminal.page(text)
13
- end
14
- end
@@ -1,40 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe TTY::Terminal::Pager, '#available' do
6
- let(:execs) { ['less', 'more'] }
7
- let(:system) { TTY::System }
8
- let(:command) { 'less' }
9
-
10
- subject(:pager) { described_class }
11
-
12
- before { allow(subject).to receive(:executables).and_return(execs) }
13
-
14
- context 'when command exists' do
15
- before {
16
- allow(system).to receive(:exists?).with('less').and_return(true)
17
- allow(system).to receive(:exists?).with('more').and_return(false)
18
- }
19
-
20
- it 'finds single command' do
21
- expect(pager.available).to eql('less')
22
- end
23
- end
24
-
25
- context 'when no command exists' do
26
- before { allow(system).to receive(:exists?).and_return(false) }
27
-
28
- it "doesn't find command" do
29
- expect(pager.available).to be_nil
30
- end
31
- end
32
-
33
- context 'when custom command' do
34
- before { allow(system).to receive(:exists?).with(command).and_return(true) }
35
-
36
- it "takes precedence over other commands" do
37
- expect(subject.available(command)).to eql(command)
38
- end
39
- end
40
- end
@@ -1,54 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe TTY::Terminal::BasicPager, '#simple' do
6
- let(:input) { StringIO.new }
7
- let(:output) { StringIO.new }
8
- let(:shell) { TTY::Shell.new(input, output) }
9
- let(:terminal) { TTY.terminal }
10
- let(:object) { described_class }
11
-
12
- subject(:pager) { object.new(text) }
13
-
14
- before {
15
- allow(TTY).to receive(:shell).and_return(shell)
16
- allow(terminal).to receive(:height).and_return(10)
17
- }
18
-
19
- context 'when no text' do
20
- let(:text) { "" }
21
-
22
- it "doesn't page text" do
23
- pager.page
24
- expect(output.string).to eql(text)
25
- end
26
- end
27
-
28
- context 'when text fits on screen' do
29
- let(:text) { "a\n" }
30
-
31
- it "doesn't page text not long enough" do
32
- pager.page
33
- expect(output.string).to eql(text)
34
- end
35
- end
36
-
37
- context "when text doesn't fit on screen" do
38
- let(:text) { "a\na\na\na\na\na\na\na\na\na\n" }
39
-
40
- it "continues paging when enter is pressed" do
41
- input << '\n'
42
- input.rewind
43
- pager.page
44
- expect(output.string).to eql("a\na\na\na\na\na\na\n\n#{object::PAGE_BREAK}\na\na\na\n")
45
- end
46
-
47
- it "stops paging when q is pressed" do
48
- input << 'q\n'
49
- input.rewind
50
- pager.page
51
- expect(output.string).to eql("a\na\na\na\na\na\na\n\n#{object::PAGE_BREAK}\n")
52
- end
53
- end
54
- end
@@ -1,16 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe TTY::Terminal::Pager, '#command' do
6
- let(:pager) { 'vim' }
7
-
8
- subject { described_class }
9
-
10
- context 'when custom command' do
11
- it 'searches available commands' do
12
- expect(subject).to receive(:available).with(pager)
13
- subject.command(pager)
14
- end
15
- end
16
- end
@@ -1,13 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe TTY::Terminal::Pager, '#executables' do
6
- let(:object) { described_class }
7
-
8
- subject { object.executables }
9
-
10
- it { is_expected.to be_an(Array) }
11
-
12
- it { is_expected.to include('less -isr') }
13
- end
@@ -1,45 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe TTY::Terminal::Pager, '#page' do
6
- let(:text) { "a\n" }
7
- let(:shell) { TTY.shell }
8
- let(:system) { TTY::System }
9
- let(:pager) { double(:pager, :page => nil) }
10
- let(:basic_pager) { TTY::Terminal::BasicPager }
11
- let(:system_pager) { TTY::Terminal::SystemPager }
12
-
13
- subject { described_class }
14
-
15
- before { allow(shell).to receive(:tty?).and_return(true) }
16
-
17
- context 'when not tty' do
18
- before { allow(shell).to receive(:tty?).and_return(false) }
19
-
20
- it "doesn't page" do
21
- expect(subject.page(text)).to eql(nil)
22
- end
23
- end
24
-
25
- context 'when not unix' do
26
- before { allow(system).to receive(:unix?).and_return(false) }
27
-
28
- it 'pages with simple pager' do
29
- expect(basic_pager).to receive(:new).with(text).and_return(pager)
30
- subject.page(text)
31
- end
32
- end
33
-
34
- context 'when unix and available' do
35
- before {
36
- allow(system).to receive(:unix?).and_return(true)
37
- allow(subject).to receive(:available?).and_return(true)
38
- }
39
-
40
- it 'pages with system pager' do
41
- expect(system_pager).to receive(:new).with(text).and_return(pager)
42
- subject.page(text)
43
- end
44
- end
45
- end
@@ -1,29 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe TTY::Terminal::SystemPager, '#simple' do
6
- let(:input) { StringIO.new }
7
- let(:output) { StringIO.new }
8
- let(:shell) { TTY::Shell.new(input, output) }
9
- let(:terminal) { TTY.terminal }
10
- let(:object) { described_class }
11
-
12
- subject(:pager) { object.new(text) }
13
-
14
- before {
15
- allow(TTY).to receive(:shell).and_return(shell)
16
- allow(IO).to receive(:pipe).and_return([input, output])
17
- allow(Kernel).to receive(:fork) { true }
18
- }
19
-
20
- context 'when text fits on screen' do
21
- let(:text) { "a\na\na\na\na\na\na\na\na\na\n" }
22
-
23
- it "doesn't page text not long enough" do
24
- expect(Kernel).to receive(:exec)
25
- expect(Kernel).to receive(:select)
26
- pager.page
27
- end
28
- end
29
- end