tty-pager 0.7.1 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/CHANGELOG.md +13 -0
- data/CODE_OF_CONDUCT.md +49 -0
- data/README.md +35 -3
- data/examples/basic_pager.rb +7 -0
- data/lib/tty/pager/basic.rb +31 -0
- data/lib/tty/pager/system.rb +41 -3
- data/lib/tty/pager/version.rb +1 -1
- data/lib/tty/pager.rb +6 -28
- data/spec/unit/basic/page_spec.rb +9 -2
- data/spec/unit/page_spec.rb +3 -2
- data/spec/unit/system/available_spec.rb +2 -1
- data/spec/unit/system/new_spec.rb +10 -0
- data/spec/unit/system/page_spec.rb +1 -0
- data/tty-pager.gemspec +1 -1
- metadata +8 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f49536d3b9e164578f6d5ad3b561eacc9c2d6115
|
4
|
+
data.tar.gz: d5db6acf71e24ae57853b0623f49c18f0b05aedc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f5c1a7349501d0ab69a3b626356e9c81af6af26c52e44d0fae16f0612e203ac649dec918b99e06dff930ec145acdd90db54a55d228f6648c2961053551d70c29
|
7
|
+
data.tar.gz: d6b107adf86a78772c73012e1f28c61c482a470d9fd90a46706bb92e8ca3cece43a90d19c8d86fadec66ebedc8d803ec0ee5d57615f20e607e3b35548c542074
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
# Change log
|
2
2
|
|
3
|
+
## [v0.8.0] - 2017-07-14
|
4
|
+
|
5
|
+
### Added
|
6
|
+
* Add :command option to SystemPager to enforce choice of pagination tool
|
7
|
+
* Add Error type for specific error notifications
|
8
|
+
|
9
|
+
### Changed
|
10
|
+
* Change SystemPager to prevent initialization if pager isn't supported
|
11
|
+
|
12
|
+
### Fixed
|
13
|
+
* Fix BasicPager to take terminal width into account when displaying page break messages
|
14
|
+
* Fix SystemPager on Windows by detecting fork implementation
|
15
|
+
|
3
16
|
## [v0.7.1] - 2017-04-09
|
4
17
|
|
5
18
|
### Fixed
|
data/CODE_OF_CONDUCT.md
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
# Contributor Code of Conduct
|
2
|
+
|
3
|
+
As contributors and maintainers of this project, and in the interest of
|
4
|
+
fostering an open and welcoming community, we pledge to respect all people who
|
5
|
+
contribute through reporting issues, posting feature requests, updating
|
6
|
+
documentation, submitting pull requests or patches, and other activities.
|
7
|
+
|
8
|
+
We are committed to making participation in this project a harassment-free
|
9
|
+
experience for everyone, regardless of level of experience, gender, gender
|
10
|
+
identity and expression, sexual orientation, disability, personal appearance,
|
11
|
+
body size, race, ethnicity, age, religion, or nationality.
|
12
|
+
|
13
|
+
Examples of unacceptable behavior by participants include:
|
14
|
+
|
15
|
+
* The use of sexualized language or imagery
|
16
|
+
* Personal attacks
|
17
|
+
* Trolling or insulting/derogatory comments
|
18
|
+
* Public or private harassment
|
19
|
+
* Publishing other's private information, such as physical or electronic
|
20
|
+
addresses, without explicit permission
|
21
|
+
* Other unethical or unprofessional conduct
|
22
|
+
|
23
|
+
Project maintainers have the right and responsibility to remove, edit, or
|
24
|
+
reject comments, commits, code, wiki edits, issues, and other contributions
|
25
|
+
that are not aligned to this Code of Conduct, or to ban temporarily or
|
26
|
+
permanently any contributor for other behaviors that they deem inappropriate,
|
27
|
+
threatening, offensive, or harmful.
|
28
|
+
|
29
|
+
By adopting this Code of Conduct, project maintainers commit themselves to
|
30
|
+
fairly and consistently applying these principles to every aspect of managing
|
31
|
+
this project. Project maintainers who do not follow or enforce the Code of
|
32
|
+
Conduct may be permanently removed from the project team.
|
33
|
+
|
34
|
+
This code of conduct applies both within project spaces and in public spaces
|
35
|
+
when an individual is representing the project or its community.
|
36
|
+
|
37
|
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
38
|
+
reported by contacting a project maintainer at [email]. All
|
39
|
+
complaints will be reviewed and investigated and will result in a response that
|
40
|
+
is deemed necessary and appropriate to the circumstances. Maintainers are
|
41
|
+
obligated to maintain confidentiality with regard to the reporter of an
|
42
|
+
incident.
|
43
|
+
|
44
|
+
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
45
|
+
version 1.3.0, available at
|
46
|
+
[http://contributor-covenant.org/version/1/3/0/][version]
|
47
|
+
|
48
|
+
[homepage]: http://contributor-covenant.org
|
49
|
+
[version]: http://contributor-covenant.org/version/1/3/0/
|
data/README.md
CHANGED
@@ -32,10 +32,15 @@ Or install it yourself as:
|
|
32
32
|
|
33
33
|
$ gem install tty-pager
|
34
34
|
|
35
|
-
|
35
|
+
|
36
|
+
## Overview
|
36
37
|
|
37
38
|
The **TTY::Pager** on initialization will choose the best available pager out of `SystemPager`, `BasicPager` or `NullPager`. If paging is disabled then a `NullPager` is used and content is simply printed out to stdout, otherwise a check is performed to find system executable to perform pagination natively with `SystemPager`. However, if no system executable is found, a `BasicPager` is used which is a pure Ruby implementation that will work with any ruby interpreter.
|
38
39
|
|
40
|
+
## 1. Usage
|
41
|
+
|
42
|
+
In order to let **TTY::Pager** pick the best paging mechanism automatically do:
|
43
|
+
|
39
44
|
```ruby
|
40
45
|
pager = TTY::Pager.new
|
41
46
|
```
|
@@ -52,19 +57,44 @@ If you want to use specific pager you can do so by invoking it directly
|
|
52
57
|
pager = TTY::Pager::BasicPager.new
|
53
58
|
```
|
54
59
|
|
55
|
-
|
60
|
+
## 2. Interface
|
61
|
+
|
62
|
+
### :enabled
|
63
|
+
|
64
|
+
If you want to disable the pager pass the `:enabled` option set to `false`:
|
56
65
|
|
57
66
|
```ruby
|
58
67
|
pager = TTY::Pager.new enabled: false
|
59
68
|
```
|
60
69
|
|
61
|
-
|
70
|
+
### :width
|
71
|
+
|
72
|
+
The `BasicPager` allows to wrap content at given width:
|
73
|
+
|
74
|
+
```ruby
|
75
|
+
pager = TTY::Pager::BasicPager.new width: 80
|
76
|
+
```
|
77
|
+
|
78
|
+
### :prompt
|
79
|
+
|
80
|
+
For the `BasicPager` you can pass a `:prompt` option to change the page break text:
|
62
81
|
|
63
82
|
```ruby
|
64
83
|
prompt = -> (page_num) { output.puts "Page -#{page_num}- Press enter to continue" }
|
65
84
|
pager = TTY::Pager::BasicPager.new prompt: prompt
|
66
85
|
```
|
67
86
|
|
87
|
+
### :command
|
88
|
+
|
89
|
+
You can force `SystemPager` to always use a specific paging tool by passing the `:command` option:
|
90
|
+
|
91
|
+
```ruby
|
92
|
+
TTY::Pager.new command; 'less -R'
|
93
|
+
TTY::Pager::SystemPager.new command: 'less -R'
|
94
|
+
```
|
95
|
+
|
96
|
+
### PAGER
|
97
|
+
|
68
98
|
By default the `SystemPager` will check the `PAGER` environment variable, if not set it will try one of the `less`, `more`, `cat`, `pager`. Therefore, if you wish to set your prefered pager you can either set up your shell like so:
|
69
99
|
|
70
100
|
```bash
|
@@ -80,6 +110,8 @@ ENV['PAGER']='less'
|
|
80
110
|
|
81
111
|
## Contributing
|
82
112
|
|
113
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/piotrmurach/tty-pager. 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.
|
114
|
+
|
83
115
|
1. Fork it ( https://github.com/piotrmurach/tty-pager/fork )
|
84
116
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
85
117
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
data/lib/tty/pager/basic.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# coding: utf-8
|
2
3
|
|
3
4
|
require 'verse'
|
@@ -9,6 +10,36 @@ module TTY
|
|
9
10
|
#
|
10
11
|
# @api public
|
11
12
|
class BasicPager < Pager
|
13
|
+
PAGE_BREAK = "\n--- Page -%s- " \
|
14
|
+
"Press enter/return to continue " \
|
15
|
+
"(or q to quit) ---".freeze
|
16
|
+
|
17
|
+
# Create a basic pager
|
18
|
+
#
|
19
|
+
# @option options [Integer] :height
|
20
|
+
# the terminal height
|
21
|
+
# @option options [Integer] :width
|
22
|
+
# the terminal width
|
23
|
+
#
|
24
|
+
# @api public
|
25
|
+
def initialize(options = {})
|
26
|
+
super
|
27
|
+
@height = options.fetch(:height) { page_height }
|
28
|
+
@width = options.fetch(:width) { page_width }
|
29
|
+
@prompt = options.fetch(:prompt) { default_prompt }
|
30
|
+
prompt_height = PAGE_BREAK.lines.to_a.size
|
31
|
+
@height -= prompt_height
|
32
|
+
end
|
33
|
+
|
34
|
+
# Default prompt for paging
|
35
|
+
#
|
36
|
+
# @return [Proc]
|
37
|
+
#
|
38
|
+
# @api private
|
39
|
+
def default_prompt
|
40
|
+
proc { |page_num| output.puts Verse.wrap(PAGE_BREAK % page_num, @width) }
|
41
|
+
end
|
42
|
+
|
12
43
|
# Page text
|
13
44
|
#
|
14
45
|
# @api public
|
data/lib/tty/pager/system.rb
CHANGED
@@ -9,6 +9,22 @@ module TTY
|
|
9
9
|
#
|
10
10
|
# @api public
|
11
11
|
class SystemPager < Pager
|
12
|
+
# Create a system pager
|
13
|
+
#
|
14
|
+
# @param [Hash] options
|
15
|
+
# @option options [String] :command
|
16
|
+
# the command to use for paging
|
17
|
+
#
|
18
|
+
# @api public
|
19
|
+
def initialize(options = {})
|
20
|
+
super
|
21
|
+
@pager_command = options[:command]
|
22
|
+
unless self.class.can?
|
23
|
+
raise TTY::Pager::Error, "#{self.class.name} cannot be used on your" \
|
24
|
+
" system. Try using BasicPager instead."
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
12
28
|
# Find first available system command for paging
|
13
29
|
#
|
14
30
|
# @example Basic usage
|
@@ -24,9 +40,9 @@ module TTY
|
|
24
40
|
# @api public
|
25
41
|
def self.available(*commands)
|
26
42
|
commands = commands.empty? ? executables : commands
|
27
|
-
commands
|
28
|
-
compact.map(&:strip).reject(&:empty?).uniq
|
29
|
-
find { |cmd| command_exists?(cmd.split.first) }
|
43
|
+
commands
|
44
|
+
.compact.map(&:strip).reject(&:empty?).uniq
|
45
|
+
.find { |cmd| command_exists?(cmd.split.first) }
|
30
46
|
end
|
31
47
|
|
32
48
|
# Check if command is available
|
@@ -44,6 +60,28 @@ module TTY
|
|
44
60
|
!available(*commands).nil?
|
45
61
|
end
|
46
62
|
|
63
|
+
# Check if fork is supported
|
64
|
+
#
|
65
|
+
# @return [Boolean]
|
66
|
+
#
|
67
|
+
# @api public
|
68
|
+
def self.fork?
|
69
|
+
pid = fork {}
|
70
|
+
exit unless pid
|
71
|
+
true
|
72
|
+
rescue NotImplementedError
|
73
|
+
false
|
74
|
+
end
|
75
|
+
|
76
|
+
# Check if fork & comman exist
|
77
|
+
#
|
78
|
+
# @return [Boolean]
|
79
|
+
#
|
80
|
+
# @api public
|
81
|
+
def self.can?
|
82
|
+
self.fork? && self.available?
|
83
|
+
end
|
84
|
+
|
47
85
|
# Use system command to page output text
|
48
86
|
#
|
49
87
|
# @example
|
data/lib/tty/pager/version.rb
CHANGED
data/lib/tty/pager.rb
CHANGED
@@ -9,11 +9,7 @@ require_relative "pager/version"
|
|
9
9
|
|
10
10
|
module TTY
|
11
11
|
class Pager
|
12
|
-
|
13
|
-
|
14
|
-
PAGE_BREAK = "\n--- Page -%s- " \
|
15
|
-
"Press enter/return to continue " \
|
16
|
-
"(or q to quit) ---".freeze
|
12
|
+
Error = Class.new(StandardError)
|
17
13
|
|
18
14
|
# Create a pager
|
19
15
|
#
|
@@ -24,38 +20,20 @@ module TTY
|
|
24
20
|
# the object to send input to
|
25
21
|
# @option options [IO] :output
|
26
22
|
# the object to send output to
|
27
|
-
# @option options [Integer] :height
|
28
|
-
# the terminal height
|
29
|
-
# @option options [Integer] :width
|
30
|
-
# the terminal width
|
31
23
|
# @option options [Boolean] :enabled
|
32
24
|
# disable/enable text paging
|
33
25
|
#
|
34
26
|
# @api public
|
35
27
|
def initialize(options = {})
|
36
|
-
@height = options.fetch(:height) { page_height }
|
37
|
-
@width = options.fetch(:width) { page_width }
|
38
28
|
@input = options.fetch(:input) { $stdin }
|
39
29
|
@output = options.fetch(:output) { $stdout }
|
40
30
|
@enabled = options.fetch(:enabled) { true }
|
41
|
-
@prompt = options.fetch(:prompt) { default_prompt }
|
42
|
-
@height -= PROMPT_HEIGHT
|
43
|
-
@output = output
|
44
31
|
|
45
32
|
if self.class == TTY::Pager
|
46
|
-
@pager = find_available
|
33
|
+
@pager = find_available(options)
|
47
34
|
end
|
48
35
|
end
|
49
36
|
|
50
|
-
# Default prompt for paging
|
51
|
-
#
|
52
|
-
# @return [Proc]
|
53
|
-
#
|
54
|
-
# @api private
|
55
|
-
def default_prompt
|
56
|
-
proc { |page_num| output.puts PAGE_BREAK % page_num }
|
57
|
-
end
|
58
|
-
|
59
37
|
# Check if pager is enabled
|
60
38
|
#
|
61
39
|
# @return [Boolean]
|
@@ -111,13 +89,13 @@ module TTY
|
|
111
89
|
# is pure Ruby implementation.
|
112
90
|
#
|
113
91
|
# @api private
|
114
|
-
def find_available
|
92
|
+
def find_available(options)
|
115
93
|
if !enabled?
|
116
94
|
NullPager.new
|
117
|
-
elsif
|
118
|
-
SystemPager.new
|
95
|
+
elsif !Pager.jruby? && SystemPager.can?
|
96
|
+
SystemPager.new(options)
|
119
97
|
else
|
120
|
-
BasicPager.new
|
98
|
+
BasicPager.new(options)
|
121
99
|
end
|
122
100
|
end
|
123
101
|
|
@@ -31,7 +31,14 @@ RSpec.describe TTY::Pager::BasicPager, '.page' do
|
|
31
31
|
"any map; ",
|
32
32
|
"true ",
|
33
33
|
"",
|
34
|
-
"--- Page
|
34
|
+
"--- Page ",
|
35
|
+
"-1- Press ",
|
36
|
+
"e",
|
37
|
+
"nter/retur",
|
38
|
+
"n to ",
|
39
|
+
"continue ",
|
40
|
+
"(or q to ",
|
41
|
+
"quit) ---",
|
35
42
|
"places ",
|
36
43
|
"never are.\n"
|
37
44
|
].join("\n"))
|
@@ -111,7 +118,7 @@ RSpec.describe TTY::Pager::BasicPager, '.page' do
|
|
111
118
|
input << "\n\n\n"
|
112
119
|
input.rewind
|
113
120
|
pager = described_class.new(output: output, input: input,
|
114
|
-
width:
|
121
|
+
width: 80, height: 5)
|
115
122
|
pager.page(text)
|
116
123
|
expect(output.string).to eq([
|
117
124
|
"a",
|
data/spec/unit/page_spec.rb
CHANGED
@@ -16,7 +16,8 @@ RSpec.describe TTY::Pager, '.page' do
|
|
16
16
|
|
17
17
|
it "selects basic pager on non tty systems" do
|
18
18
|
basic_pager = spy(:basic_pager)
|
19
|
-
allow(
|
19
|
+
allow(described_class).to receive(:jruby?) { false }
|
20
|
+
allow(TTY::Pager::SystemPager).to receive(:can?) { false }
|
20
21
|
allow(TTY::Pager::BasicPager).to receive(:new) { basic_pager }
|
21
22
|
|
22
23
|
pager = described_class.new
|
@@ -28,8 +29,8 @@ RSpec.describe TTY::Pager, '.page' do
|
|
28
29
|
|
29
30
|
it "selects system pager on systems with tty" do
|
30
31
|
system_pager = spy(:system_pager)
|
31
|
-
allow(TTY::Pager::SystemPager).to receive(:available?) { true }
|
32
32
|
allow(described_class).to receive(:jruby?) { false }
|
33
|
+
allow(TTY::Pager::SystemPager).to receive(:can?) { true }
|
33
34
|
allow(TTY::Pager::SystemPager).to receive(:new) { system_pager }
|
34
35
|
|
35
36
|
pager = described_class.new
|
@@ -33,7 +33,8 @@ RSpec.describe TTY::Pager::SystemPager, '#available' do
|
|
33
33
|
|
34
34
|
it "does not error" do
|
35
35
|
allow(pager).to receive(:executables).and_return(execs)
|
36
|
-
|
36
|
+
allow(pager).to receive(:command_exists?).with('less') { true }
|
37
|
+
expect(pager.available).to eql('less')
|
37
38
|
end
|
38
39
|
end
|
39
40
|
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
RSpec.describe TTY::Pager::SystemPager, '#new' do
|
4
|
+
it "raises error if system paging is not supported" do
|
5
|
+
allow(TTY::Pager::SystemPager).to receive(:can?).and_return(false)
|
6
|
+
expect {
|
7
|
+
TTY::Pager::SystemPager.new
|
8
|
+
}.to raise_error(TTY::Pager::Error, "TTY::Pager::SystemPager cannot be used on your system. Try using BasicPager instead.")
|
9
|
+
end
|
10
|
+
end
|
@@ -6,6 +6,7 @@ RSpec.describe TTY::Pager::SystemPager, '.page' do
|
|
6
6
|
|
7
7
|
it "executes the pager command in a subprocess" do
|
8
8
|
text = "I try all things, I achieve what I can.\n"
|
9
|
+
allow(TTY::Pager::SystemPager).to receive(:can?).and_return(true)
|
9
10
|
pager = described_class.new(output: output, input: input)
|
10
11
|
read_io = spy
|
11
12
|
write_io = spy
|
data/tty-pager.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tty-pager
|
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
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-07-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: tty-screen
|
@@ -92,14 +92,14 @@ dependencies:
|
|
92
92
|
requirements:
|
93
93
|
- - "~>"
|
94
94
|
- !ruby/object:Gem::Version
|
95
|
-
version: 3.
|
95
|
+
version: 3.6.0
|
96
96
|
type: :development
|
97
97
|
prerelease: false
|
98
98
|
version_requirements: !ruby/object:Gem::Requirement
|
99
99
|
requirements:
|
100
100
|
- - "~>"
|
101
101
|
- !ruby/object:Gem::Version
|
102
|
-
version: 3.
|
102
|
+
version: 3.6.0
|
103
103
|
description: Terminal output paging in a cross-platform way supporting all major ruby
|
104
104
|
interpreters.
|
105
105
|
email:
|
@@ -112,11 +112,13 @@ files:
|
|
112
112
|
- ".rspec"
|
113
113
|
- ".travis.yml"
|
114
114
|
- CHANGELOG.md
|
115
|
+
- CODE_OF_CONDUCT.md
|
115
116
|
- Gemfile
|
116
117
|
- LICENSE.txt
|
117
118
|
- README.md
|
118
119
|
- Rakefile
|
119
120
|
- appveyor.yml
|
121
|
+
- examples/basic_pager.rb
|
120
122
|
- examples/system_pager.rb
|
121
123
|
- examples/temp.txt
|
122
124
|
- lib/tty-pager.rb
|
@@ -131,6 +133,7 @@ files:
|
|
131
133
|
- spec/unit/page_spec.rb
|
132
134
|
- spec/unit/system/available_spec.rb
|
133
135
|
- spec/unit/system/command_exists_spec.rb
|
136
|
+
- spec/unit/system/new_spec.rb
|
134
137
|
- spec/unit/system/page_spec.rb
|
135
138
|
- tasks/console.rake
|
136
139
|
- tasks/coverage.rake
|
@@ -168,5 +171,6 @@ test_files:
|
|
168
171
|
- spec/unit/page_spec.rb
|
169
172
|
- spec/unit/system/available_spec.rb
|
170
173
|
- spec/unit/system/command_exists_spec.rb
|
174
|
+
- spec/unit/system/new_spec.rb
|
171
175
|
- spec/unit/system/page_spec.rb
|
172
176
|
has_rdoc:
|