tty-pager 0.12.1 → 0.13.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 +4 -4
- data/CHANGELOG.md +24 -0
- data/README.md +233 -27
- data/lib/tty-pager.rb +1 -1
- data/lib/tty/pager.rb +84 -86
- data/lib/tty/pager/abstract.rb +138 -0
- data/lib/tty/pager/basic.rb +197 -54
- data/lib/tty/pager/null.rb +22 -3
- data/lib/tty/pager/system.rb +154 -67
- data/lib/tty/pager/version.rb +2 -2
- metadata +28 -76
- data/Rakefile +0 -8
- data/examples/basic_pager.rb +0 -5
- data/examples/markdown.rb +0 -7
- data/examples/pager.rb +0 -7
- data/examples/system_pager.rb +0 -7
- data/spec/spec_helper.rb +0 -45
- data/spec/unit/basic/page_spec.rb +0 -141
- data/spec/unit/null/page_spec.rb +0 -23
- data/spec/unit/page_spec.rb +0 -40
- data/spec/unit/system/command_exists_spec.rb +0 -15
- data/spec/unit/system/executables_spec.rb +0 -11
- data/spec/unit/system/find_executable_spec.rb +0 -50
- data/spec/unit/system/new_spec.rb +0 -21
- data/spec/unit/system/page_spec.rb +0 -21
- data/tasks/console.rake +0 -11
- data/tasks/coverage.rake +0 -11
- data/tasks/spec.rake +0 -29
- data/tty-pager.gemspec +0 -31
data/Rakefile
DELETED
data/examples/basic_pager.rb
DELETED
data/examples/markdown.rb
DELETED
data/examples/pager.rb
DELETED
data/examples/system_pager.rb
DELETED
data/spec/spec_helper.rb
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
if ENV['COVERAGE'] || ENV['TRAVIS']
|
4
|
-
require 'simplecov'
|
5
|
-
require 'coveralls'
|
6
|
-
|
7
|
-
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
8
|
-
SimpleCov::Formatter::HTMLFormatter,
|
9
|
-
Coveralls::SimpleCov::Formatter
|
10
|
-
]
|
11
|
-
|
12
|
-
SimpleCov.start do
|
13
|
-
command_name 'spec'
|
14
|
-
add_filter 'spec'
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
require 'tty-pager'
|
19
|
-
|
20
|
-
RSpec.configure do |config|
|
21
|
-
config.expect_with :rspec do |expectations|
|
22
|
-
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
23
|
-
end
|
24
|
-
|
25
|
-
config.mock_with :rspec do |mocks|
|
26
|
-
mocks.verify_partial_doubles = true
|
27
|
-
end
|
28
|
-
|
29
|
-
# Limits the available syntax to the non-monkey patched syntax that is recommended.
|
30
|
-
config.disable_monkey_patching!
|
31
|
-
|
32
|
-
# This setting enables warnings. It's recommended, but in some cases may
|
33
|
-
# be too noisy due to issues in dependencies.
|
34
|
-
config.warnings = true
|
35
|
-
|
36
|
-
if config.files_to_run.one?
|
37
|
-
config.default_formatter = 'doc'
|
38
|
-
end
|
39
|
-
|
40
|
-
config.profile_examples = 2
|
41
|
-
|
42
|
-
config.order = :random
|
43
|
-
|
44
|
-
Kernel.srand config.seed
|
45
|
-
end
|
@@ -1,141 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RSpec.describe TTY::Pager::BasicPager, '.page' do
|
4
|
-
let(:input) { StringIO.new }
|
5
|
-
let(:output) { StringIO.new }
|
6
|
-
|
7
|
-
it "doesn't paginate empty string" do
|
8
|
-
pager = described_class.new(output: output, input: input)
|
9
|
-
pager.page("")
|
10
|
-
expect(output.string).to eq("")
|
11
|
-
end
|
12
|
-
|
13
|
-
it "doesn't paginate text that fits on screen" do
|
14
|
-
text = "I try all things, I achieve what I can.\n"
|
15
|
-
pager = described_class.new(output: output, width: 100, height: 10)
|
16
|
-
pager.page(text)
|
17
|
-
expect(output.string).to eq(text)
|
18
|
-
end
|
19
|
-
|
20
|
-
it "breaks text exceeding terminal width" do
|
21
|
-
text = "It is not down on any map; true places never are.\n"
|
22
|
-
input << "\n"
|
23
|
-
input.rewind
|
24
|
-
pager = described_class.new(output: output, input: input,
|
25
|
-
width: 10, height: 6)
|
26
|
-
pager.page(text)
|
27
|
-
expect(output.string).to eq([
|
28
|
-
"It is not ",
|
29
|
-
"down on ",
|
30
|
-
"any map; ",
|
31
|
-
"true ",
|
32
|
-
"",
|
33
|
-
"--- Page ",
|
34
|
-
"-1- Press ",
|
35
|
-
"e",
|
36
|
-
"nter/retur",
|
37
|
-
"n to ",
|
38
|
-
"continue ",
|
39
|
-
"(or q to ",
|
40
|
-
"quit) ---",
|
41
|
-
"places ",
|
42
|
-
"never are.\n"
|
43
|
-
].join("\n"))
|
44
|
-
end
|
45
|
-
|
46
|
-
it "continues paging when enter is pressed" do
|
47
|
-
text = []
|
48
|
-
10.times { text << "I try all things, I achieve what I can.\n"}
|
49
|
-
input << "\n\n\n"
|
50
|
-
input.rewind
|
51
|
-
pager = described_class.new(output: output, input: input,
|
52
|
-
width: 100, height: 5)
|
53
|
-
pager.page(text.join)
|
54
|
-
expect(output.string).to eq([
|
55
|
-
"I try all things, I achieve what I can.",
|
56
|
-
"I try all things, I achieve what I can.",
|
57
|
-
"I try all things, I achieve what I can.",
|
58
|
-
"",
|
59
|
-
"--- Page -1- Press enter/return to continue (or q to quit) ---",
|
60
|
-
"I try all things, I achieve what I can.",
|
61
|
-
"I try all things, I achieve what I can.",
|
62
|
-
"I try all things, I achieve what I can.",
|
63
|
-
"",
|
64
|
-
"--- Page -2- Press enter/return to continue (or q to quit) ---",
|
65
|
-
"I try all things, I achieve what I can.",
|
66
|
-
"I try all things, I achieve what I can.",
|
67
|
-
"I try all things, I achieve what I can.",
|
68
|
-
"",
|
69
|
-
"--- Page -3- Press enter/return to continue (or q to quit) ---",
|
70
|
-
"I try all things, I achieve what I can.\n"
|
71
|
-
].join("\n"))
|
72
|
-
end
|
73
|
-
|
74
|
-
it "stops paging when q is pressed" do
|
75
|
-
text = []
|
76
|
-
10.times { text << "I try all things, I achieve what I can.\n"}
|
77
|
-
input << "\nq\n"
|
78
|
-
input.rewind
|
79
|
-
pager = described_class.new(output: output, input: input,
|
80
|
-
width: 100, height: 5)
|
81
|
-
pager.page(text.join)
|
82
|
-
expect(output.string).to eq([
|
83
|
-
"I try all things, I achieve what I can.",
|
84
|
-
"I try all things, I achieve what I can.",
|
85
|
-
"I try all things, I achieve what I can.",
|
86
|
-
"",
|
87
|
-
"--- Page -1- Press enter/return to continue (or q to quit) ---",
|
88
|
-
"I try all things, I achieve what I can.",
|
89
|
-
"I try all things, I achieve what I can.",
|
90
|
-
"I try all things, I achieve what I can.",
|
91
|
-
"",
|
92
|
-
"--- Page -2- Press enter/return to continue (or q to quit) ---\n",
|
93
|
-
].join("\n"))
|
94
|
-
end
|
95
|
-
|
96
|
-
it "allows to change paging prompt" do
|
97
|
-
text = []
|
98
|
-
5.times { text << "I try all things, I achieve what I can.\n"}
|
99
|
-
input << "\nq\n"
|
100
|
-
input.rewind
|
101
|
-
prompt = proc { |num| output.puts "Page -#{num}-" }
|
102
|
-
pager = described_class.new(output: output, input: input,
|
103
|
-
width: 100, height: 5, prompt: prompt)
|
104
|
-
pager.page(text.join)
|
105
|
-
expect(output.string).to eq([
|
106
|
-
"I try all things, I achieve what I can.",
|
107
|
-
"I try all things, I achieve what I can.",
|
108
|
-
"I try all things, I achieve what I can.",
|
109
|
-
"Page -1-",
|
110
|
-
"I try all things, I achieve what I can.",
|
111
|
-
"I try all things, I achieve what I can.\n",
|
112
|
-
].join("\n"))
|
113
|
-
end
|
114
|
-
|
115
|
-
it "preserves new lines when breaking" do
|
116
|
-
text = "a\na\na\na\na\na\na\na\na\na"
|
117
|
-
input << "\n\n\n"
|
118
|
-
input.rewind
|
119
|
-
pager = described_class.new(output: output, input: input,
|
120
|
-
width: 80, height: 5)
|
121
|
-
pager.page(text)
|
122
|
-
expect(output.string).to eq([
|
123
|
-
"a",
|
124
|
-
"a",
|
125
|
-
"a",
|
126
|
-
"",
|
127
|
-
"--- Page -1- Press enter/return to continue (or q to quit) ---",
|
128
|
-
"a",
|
129
|
-
"a",
|
130
|
-
"a",
|
131
|
-
"",
|
132
|
-
"--- Page -2- Press enter/return to continue (or q to quit) ---",
|
133
|
-
"a",
|
134
|
-
"a",
|
135
|
-
"a",
|
136
|
-
"",
|
137
|
-
"--- Page -3- Press enter/return to continue (or q to quit) ---",
|
138
|
-
"a"
|
139
|
-
].join("\n"))
|
140
|
-
end
|
141
|
-
end
|
data/spec/unit/null/page_spec.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RSpec.describe TTY::Pager::NullPager, '.page' do
|
4
|
-
let(:output) { StringIO.new }
|
5
|
-
|
6
|
-
it "prints content to stdout when tty device" do
|
7
|
-
allow(output).to receive(:tty?).and_return(true)
|
8
|
-
pager = described_class.new(output: output)
|
9
|
-
text = "I try all things, I achieve what I can.\n"
|
10
|
-
|
11
|
-
pager.page(text)
|
12
|
-
|
13
|
-
expect(output.string).to eq(text)
|
14
|
-
end
|
15
|
-
|
16
|
-
it "returns text when non-tty device" do
|
17
|
-
pager = described_class.new(output: output)
|
18
|
-
text = "I try all things, I achieve what I can.\n"
|
19
|
-
|
20
|
-
expect(pager.page(text)).to eq(text)
|
21
|
-
expect(output.string).to eq('')
|
22
|
-
end
|
23
|
-
end
|
data/spec/unit/page_spec.rb
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RSpec.describe TTY::Pager, '.page' do
|
4
|
-
let(:output) { StringIO.new }
|
5
|
-
|
6
|
-
it "selects null pager when disabled" do
|
7
|
-
null_pager = spy(:null_pager)
|
8
|
-
allow(TTY::Pager::NullPager).to receive(:new) { null_pager }
|
9
|
-
|
10
|
-
pager = described_class.new(enabled: false)
|
11
|
-
text = "I try all things, I achieve what I can.\n"
|
12
|
-
pager.page(text)
|
13
|
-
|
14
|
-
expect(TTY::Pager::NullPager).to have_received(:new)
|
15
|
-
end
|
16
|
-
|
17
|
-
it "selects BasicPager when no paging command is available" do
|
18
|
-
basic_pager = spy(:basic_pager)
|
19
|
-
allow(TTY::Pager::SystemPager).to receive(:exec_available?) { false }
|
20
|
-
allow(TTY::Pager::BasicPager).to receive(:new) { basic_pager }
|
21
|
-
|
22
|
-
pager = described_class.new
|
23
|
-
text = "I try all things, I achieve what I can.\n"
|
24
|
-
pager.page(text)
|
25
|
-
|
26
|
-
expect(basic_pager).to have_received(:page).with(text)
|
27
|
-
end
|
28
|
-
|
29
|
-
it "selects SystemPager when paging command is available" do
|
30
|
-
system_pager = spy(:system_pager)
|
31
|
-
allow(TTY::Pager::SystemPager).to receive(:exec_available?) { true }
|
32
|
-
allow(TTY::Pager::SystemPager).to receive(:new) { system_pager }
|
33
|
-
|
34
|
-
pager = described_class.new
|
35
|
-
text = "I try all things, I achieve what I can.\n"
|
36
|
-
pager.page(text)
|
37
|
-
|
38
|
-
expect(system_pager).to have_received(:page).with(text)
|
39
|
-
end
|
40
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RSpec.describe TTY::Pager::SystemPager, '#command_exists?' do
|
4
|
-
subject(:pager) { described_class }
|
5
|
-
|
6
|
-
it "successfully checks command exists on the system" do
|
7
|
-
allow(TTY::Which).to receive(:exist?).with('less').and_return('/usr/bin/less').and_return(true)
|
8
|
-
expect(pager.command_exists?('less')).to eq(true)
|
9
|
-
end
|
10
|
-
|
11
|
-
it "fails to check command exists on the system" do
|
12
|
-
allow(TTY::Which).to receive(:exist?).with('less').and_return(false)
|
13
|
-
expect(pager.command_exists?('less')).to eq(false)
|
14
|
-
end
|
15
|
-
end
|
@@ -1,11 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RSpec.describe TTY::Pager::SystemPager do
|
4
|
-
it "provides executable names" do
|
5
|
-
allow(ENV).to receive(:[]).with('GIT_PAGER').and_return(nil)
|
6
|
-
allow(ENV).to receive(:[]).with('PAGER').and_return(nil)
|
7
|
-
allow(described_class).to receive(:command_exists?).with('git').and_return(false)
|
8
|
-
|
9
|
-
expect(described_class.executables).to eq(['less -r', 'more -r', 'most', 'cat', 'pager', 'pg'])
|
10
|
-
end
|
11
|
-
end
|
@@ -1,50 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RSpec.describe TTY::Pager::SystemPager, '#find_executable' do
|
4
|
-
let(:execs) { ['less', 'more'] }
|
5
|
-
|
6
|
-
subject(:pager) { described_class }
|
7
|
-
|
8
|
-
it 'finds available command' do
|
9
|
-
allow(pager).to receive(:executables).and_return(execs)
|
10
|
-
allow(pager).to receive(:command_exists?).with('less') { true }
|
11
|
-
allow(pager).to receive(:command_exists?).with('more') { false }
|
12
|
-
expect(pager.find_executable).to eql('less')
|
13
|
-
end
|
14
|
-
|
15
|
-
it "doesn't find command" do
|
16
|
-
allow(pager).to receive(:executables).and_return(execs)
|
17
|
-
allow(pager).to receive(:command_exists?) { false }
|
18
|
-
expect(pager.find_executable).to be_nil
|
19
|
-
end
|
20
|
-
|
21
|
-
it "takes precedence over other commands" do
|
22
|
-
allow(pager).to receive(:command_exists?).with('more') { true }
|
23
|
-
expect(pager.find_executable('more')).to eql('more')
|
24
|
-
end
|
25
|
-
|
26
|
-
it "allows to query for available command" do
|
27
|
-
allow(pager).to receive(:find_executable).with('less') { true }
|
28
|
-
expect(pager.exec_available?('less')).to eq(true)
|
29
|
-
end
|
30
|
-
|
31
|
-
context "when given nil, blank, and whitespace commands" do
|
32
|
-
let(:execs) { [nil, "", " ", "less"] }
|
33
|
-
|
34
|
-
it "does not error" do
|
35
|
-
allow(pager).to receive(:executables).and_return(execs)
|
36
|
-
allow(pager).to receive(:command_exists?).with('less') { true }
|
37
|
-
expect(pager.find_executable).to eql('less')
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
context "when given a multi-word executable" do
|
42
|
-
let(:execs) { ["diff-so-fancy | less --tabs=4 -RFX"] }
|
43
|
-
|
44
|
-
it "finds the command" do
|
45
|
-
allow(pager).to receive(:executables).and_return(execs)
|
46
|
-
allow(pager).to receive(:command_exists?).with("diff-so-fancy") { true }
|
47
|
-
expect(pager.find_executable).to eql(execs.first)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
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(:find_executable).and_return(nil)
|
6
|
-
|
7
|
-
expect {
|
8
|
-
TTY::Pager::SystemPager.new
|
9
|
-
}.to raise_error(TTY::Pager::Error, "TTY::Pager::SystemPager cannot be used on your system due to lack of appropriate pager executable. Install `less` like pager or try using `BasicPager` instead.")
|
10
|
-
end
|
11
|
-
|
12
|
-
it "accepts multiple commands" do
|
13
|
-
allow(TTY::Pager::SystemPager)
|
14
|
-
.to receive(:find_executable).and_return('more -r')
|
15
|
-
|
16
|
-
TTY::Pager::SystemPager.new(command: ['less -r', 'more -r'])
|
17
|
-
|
18
|
-
expect(TTY::Pager::SystemPager)
|
19
|
-
.to have_received(:find_executable).with('less -r', 'more -r')
|
20
|
-
end
|
21
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RSpec.describe TTY::Pager::SystemPager, '.page' do
|
4
|
-
it "executes the pager command in a subprocess" do
|
5
|
-
text = "I try all things, I achieve what I can.\n"
|
6
|
-
allow(TTY::Pager::SystemPager).to receive(:exec_available?).and_return(true)
|
7
|
-
output = double(:output, :tty? => true)
|
8
|
-
pager = described_class.new(output: output)
|
9
|
-
write_io = spy
|
10
|
-
pid = 12345
|
11
|
-
|
12
|
-
allow(pager).to receive(:open).and_return(write_io)
|
13
|
-
allow(write_io).to receive(:pid).and_return(pid)
|
14
|
-
status = double(:status, :success? => true)
|
15
|
-
allow(Process).to receive(:waitpid2).with(pid, any_args).and_return([1, status])
|
16
|
-
|
17
|
-
expect(pager.page(text)).to eq(true)
|
18
|
-
expect(write_io).to have_received(:write).with(text)
|
19
|
-
expect(write_io).to have_received(:close)
|
20
|
-
end
|
21
|
-
end
|
data/tasks/console.rake
DELETED