tty-pager 0.8.0 → 0.9.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: f49536d3b9e164578f6d5ad3b561eacc9c2d6115
4
- data.tar.gz: d5db6acf71e24ae57853b0623f49c18f0b05aedc
3
+ metadata.gz: e2c1947e24364321ab077aa4a9426654ecba831c
4
+ data.tar.gz: 86a316d617688d3e644802748ab991bd599eb8fd
5
5
  SHA512:
6
- metadata.gz: f5c1a7349501d0ab69a3b626356e9c81af6af26c52e44d0fae16f0612e203ac649dec918b99e06dff930ec145acdd90db54a55d228f6648c2961053551d70c29
7
- data.tar.gz: d6b107adf86a78772c73012e1f28c61c482a470d9fd90a46706bb92e8ca3cece43a90d19c8d86fadec66ebedc8d803ec0ee5d57615f20e607e3b35548c542074
6
+ metadata.gz: 5d4a40162a5d370d66f70f6967e21b088ca09e7fc4b213d9b190e169b1111cf8cf2d37d0db421ad39372629f1213814ad6b6ceb524ee06a3c360bb6bee2865a2
7
+ data.tar.gz: 9258e5ecba6052965b5336a932e38140c6bcb64d8ceffb8220ca73d131f331ab1752ac6a3b82ee29a6fece8cbc960036dd1501abc955563bbeb84999e92d66a7
data/.travis.yml CHANGED
@@ -12,14 +12,12 @@ rvm:
12
12
  - 2.3.3
13
13
  - 2.4.1
14
14
  - ruby-head
15
- - jruby-9000
15
+ - jruby-9.1.5.0
16
16
  - jruby-head
17
- - rbx-3
18
17
  matrix:
19
18
  allow_failures:
20
19
  - rvm: ruby-head
21
20
  - rvm: jruby-head
22
- - rvm: rbx-3
23
21
  fast_finish: true
24
22
  branches:
25
23
  only: master
data/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Change log
2
2
 
3
+ ## [v0.9.0] - 2017-08-18
4
+
5
+ ### Changed
6
+ * Change SystemPager to stop using fork, instead execute pager in subprocess
7
+ and make it portable across platforms including Windows
8
+ * Change SystemPager to work on jruby
9
+ * Change NullPager to only print to stdout on tty device
10
+ * Change Pager to select SystemPager when paging command exists
11
+ * Remove jruby? checks from pager selection
12
+
3
13
  ## [v0.8.0] - 2017-07-14
4
14
 
5
15
  ### Added
@@ -52,6 +62,9 @@
52
62
  ### Changed
53
63
  * Change SystemPager to correctly paginate inside a process.
54
64
 
65
+ [v0.9.0]: https://github.com/peter-murach/tty-prompt/compare/v0.8.0...v0.9.0
66
+ [v0.8.0]: https://github.com/peter-murach/tty-prompt/compare/v0.7.1...v0.8.0
67
+ [v0.7.1]: https://github.com/peter-murach/tty-prompt/compare/v0.7.0...v0.7.1
55
68
  [v0.7.0]: https://github.com/peter-murach/tty-prompt/compare/v0.6.0...v0.7.0
56
69
  [v0.6.0]: https://github.com/peter-murach/tty-prompt/compare/v0.5.0...v0.6.0
57
70
  [v0.5.0]: https://github.com/peter-murach/tty-prompt/compare/v0.4.0...v0.5.0
data/README.md CHANGED
@@ -35,7 +35,7 @@ Or install it yourself as:
35
35
 
36
36
  ## Overview
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
+ 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, which either returns text as is or simply prints it out to stdout on tty devices. Otherwise a check is performed to find paging command to page text with `SystemPager`. However, if no paging command is found, a `BasicPager` is used which is a pure Ruby implementation that is guaranteed to work with any ruby interpreter and any platform.
39
39
 
40
40
  ## 1. Usage
41
41
 
data/appveyor.yml CHANGED
@@ -18,6 +18,8 @@ environment:
18
18
  - ruby_version: "22-x64"
19
19
  - ruby_version: "23"
20
20
  - ruby_version: "23-x64"
21
+ - ruby_version: "24"
22
+ - ruby_version: "24-x64"
21
23
  matrix:
22
24
  allow_failures:
23
25
  - ruby_version: "193"
data/lib/tty/pager.rb CHANGED
@@ -84,26 +84,19 @@ module TTY
84
84
  #
85
85
  # If the user disabled paging then a NullPager is returned,
86
86
  # otherwise a check is performed to find native system
87
- # utility to perform pagination with SystemPager. Finally,
88
- # if no system utility exists a BasicPager is used which
89
- # is pure Ruby implementation.
87
+ # command to perform pagination with SystemPager. Finally,
88
+ # if no system command is found, a BasicPager is used which
89
+ # is a pure Ruby implementation known to work on any platform.
90
90
  #
91
91
  # @api private
92
92
  def find_available(options)
93
93
  if !enabled?
94
94
  NullPager.new
95
- elsif !Pager.jruby? && SystemPager.can?
95
+ elsif SystemPager.available?
96
96
  SystemPager.new(options)
97
97
  else
98
98
  BasicPager.new(options)
99
99
  end
100
100
  end
101
-
102
- # Check if running on jruby
103
- #
104
- # @api private
105
- def self.jruby?
106
- RbConfig::CONFIG['ruby_install_name'] == 'jruby'
107
- end
108
101
  end # Pager
109
102
  end # TTY
@@ -1,5 +1,5 @@
1
+ # encoding: utf-8
1
2
  # frozen_string_literal: true
2
- # coding: utf-8
3
3
 
4
4
  require 'verse'
5
5
 
@@ -1,4 +1,5 @@
1
- # coding: utf-8
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module TTY
4
5
  class Pager
@@ -7,6 +8,8 @@ module TTY
7
8
  #
8
9
  # @api public
9
10
  def page(text, &callback)
11
+ return text unless output.tty?
12
+
10
13
  output.puts(text)
11
14
  end
12
15
  end
@@ -1,4 +1,5 @@
1
- # coding: utf-8
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'tty-which'
4
5
 
@@ -19,9 +20,11 @@ module TTY
19
20
  def initialize(options = {})
20
21
  super
21
22
  @pager_command = options[:command]
22
- unless self.class.can?
23
+ unless self.class.available?
23
24
  raise TTY::Pager::Error, "#{self.class.name} cannot be used on your" \
24
- " system. Try using BasicPager instead."
25
+ " system due to lack of appropriate pager" \
26
+ " executable. Install `less` like pager or" \
27
+ " try using `BasicPager` instead." \
25
28
  end
26
29
  end
27
30
 
@@ -60,28 +63,6 @@ module TTY
60
63
  !available(*commands).nil?
61
64
  end
62
65
 
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
-
85
66
  # Use system command to page output text
86
67
  #
87
68
  # @example
@@ -95,29 +76,19 @@ module TTY
95
76
  #
96
77
  # @api public
97
78
  def page(text, &callback)
98
- read_io, write_io = IO.pipe
79
+ return text unless output.tty?
99
80
 
100
- pid = fork do
101
- write_io.close
102
- input.reopen(read_io)
103
- read_io.close
81
+ write_io = open("|#{pager_command}", 'w')
82
+ pid = write_io.pid
104
83
 
105
- # Wait until we have input before we start the pager
106
- IO.select [input]
107
-
108
- begin
109
- exec(pager_command)
110
- rescue SystemCallError
111
- exit 1
112
- end
113
- end
114
-
115
- read_io.close
116
84
  write_io.write(text)
117
85
  write_io.close
118
86
 
119
- _, status = Process.waitpid2(pid)
87
+ _, status = Process.waitpid2(pid, Process::WNOHANG)
120
88
  status.success?
89
+ rescue Errno::ECHILD
90
+ # on jruby 9x waiting on pid raises
91
+ true
121
92
  end
122
93
 
123
94
  private
@@ -1,7 +1,7 @@
1
- # coding: utf-8
1
+ # encoding: utf-8
2
2
 
3
3
  module TTY
4
4
  class Pager
5
- VERSION = "0.8.0"
5
+ VERSION = "0.9.0"
6
6
  end # Pager
7
7
  end # TTY
@@ -3,10 +3,21 @@
3
3
  RSpec.describe TTY::Pager::NullPager, '.page' do
4
4
  let(:output) { StringIO.new }
5
5
 
6
- it "doesn't paginate empty string" do
6
+ it "prints content to stdout when tty device" do
7
+ allow(output).to receive(:tty?).and_return(true)
7
8
  pager = described_class.new(output: output)
8
9
  text = "I try all things, I achieve what I can.\n"
10
+
9
11
  pager.page(text)
12
+
10
13
  expect(output.string).to eq(text)
11
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
12
23
  end
@@ -14,10 +14,9 @@ RSpec.describe TTY::Pager, '.page' do
14
14
  expect(TTY::Pager::NullPager).to have_received(:new)
15
15
  end
16
16
 
17
- it "selects basic pager on non tty systems" do
17
+ it "selects BasicPager when no paging command is available" do
18
18
  basic_pager = spy(:basic_pager)
19
- allow(described_class).to receive(:jruby?) { false }
20
- allow(TTY::Pager::SystemPager).to receive(:can?) { false }
19
+ allow(TTY::Pager::SystemPager).to receive(:available?) { false }
21
20
  allow(TTY::Pager::BasicPager).to receive(:new) { basic_pager }
22
21
 
23
22
  pager = described_class.new
@@ -27,10 +26,9 @@ RSpec.describe TTY::Pager, '.page' do
27
26
  expect(basic_pager).to have_received(:page).with(text)
28
27
  end
29
28
 
30
- it "selects system pager on systems with tty" do
29
+ it "selects SystemPager when paging command is available" do
31
30
  system_pager = spy(:system_pager)
32
- allow(described_class).to receive(:jruby?) { false }
33
- allow(TTY::Pager::SystemPager).to receive(:can?) { true }
31
+ allow(TTY::Pager::SystemPager).to receive(:available?) { true }
34
32
  allow(TTY::Pager::SystemPager).to receive(:new) { system_pager }
35
33
 
36
34
  pager = described_class.new
@@ -2,9 +2,9 @@
2
2
 
3
3
  RSpec.describe TTY::Pager::SystemPager, '#new' do
4
4
  it "raises error if system paging is not supported" do
5
- allow(TTY::Pager::SystemPager).to receive(:can?).and_return(false)
5
+ allow(TTY::Pager::SystemPager).to receive(:available?).and_return(false)
6
6
  expect {
7
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.")
8
+ }.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.")
9
9
  end
10
10
  end
@@ -1,39 +1,21 @@
1
1
  # coding: utf-8
2
2
 
3
3
  RSpec.describe TTY::Pager::SystemPager, '.page' do
4
- let(:input) { StringIO.new }
5
- let(:output) { StringIO.new }
6
-
7
4
  it "executes the pager command in a subprocess" do
8
5
  text = "I try all things, I achieve what I can.\n"
9
- allow(TTY::Pager::SystemPager).to receive(:can?).and_return(true)
10
- pager = described_class.new(output: output, input: input)
11
- read_io = spy
6
+ allow(TTY::Pager::SystemPager).to receive(:available?).and_return(true)
7
+ output = double(:output, :tty? => true)
8
+ pager = described_class.new(output: output)
12
9
  write_io = spy
10
+ pid = 12345
13
11
 
14
- if !pager.respond_to?(:fork)
15
- described_class.send :define_method, :fork, lambda { |*args|
16
- yield if block_given?
17
- }
18
- end
19
-
20
- allow(IO).to receive(:pipe).and_return([read_io, write_io])
21
-
22
- allow(pager).to receive(:fork) do |&block|
23
- allow(input).to receive(:reopen)
24
- allow(IO).to receive(:select)
25
- allow(pager).to receive(:pager_command).and_return('less')
26
- allow(pager).to receive(:exec)
27
- block.call
28
- end.and_return(12345)
29
-
12
+ allow(pager).to receive(:open).and_return(write_io)
13
+ allow(write_io).to receive(:pid).and_return(pid)
30
14
  status = double(:status, :success? => true)
31
- allow(Process).to receive(:waitpid2).with(12345).and_return([1, status])
15
+ allow(Process).to receive(:waitpid2).with(pid, any_args).and_return([1, status])
32
16
 
33
17
  expect(pager.page(text)).to eq(true)
34
-
35
- expect(IO).to have_received(:select).with([input])
36
- expect(pager).to have_received(:exec).with('less')
37
- expect(output.read).to eq('')
18
+ expect(write_io).to have_received(:write).with(text)
19
+ expect(write_io).to have_received(:close)
38
20
  end
39
21
  end
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.8.0
4
+ version: 0.9.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-07-14 00:00:00.000000000 Z
11
+ date: 2017-08-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tty-screen