tty-pager 0.1.0 → 0.2.0

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
  SHA1:
3
- metadata.gz: 762884b7e1c8aed7cb329a22577247b1d13e3dec
4
- data.tar.gz: 3a0e5d127f2348ab58a7e95402b4a76c8cf1aea9
3
+ metadata.gz: 90d482658df231505821c563a80f8e47c1e57d9b
4
+ data.tar.gz: 6b2bf29fc1e0b6d3dfc60f2ff9819507dc35c62c
5
5
  SHA512:
6
- metadata.gz: 9fbcf3ac3cbbbe53591bc2ced88aa28af51825e6d094f2fe22d7aa47940293f8b0fb8abca0861d98664de6b3bb7397b12477973a5599fd36aade65b8918e7d2e
7
- data.tar.gz: a7632fc1596b11cd0e9a4aa9d2bde295020b856eca9e5e2f6b28aca8252d4db5228a4a7e177920851d68e8db5b1aae6f47800c3ff25af8f9ca3a3b5cc3b27594
6
+ metadata.gz: 891ef637078cc33f4a3821a4ed847d8703a353803bfb2183016a818cf09bb0bd9a42e813a206660654973d8adaf43ec9b9e86476938d47f9b75addd6f1f8052d
7
+ data.tar.gz: 4239ae39b7dbfe716db15869fc0768cc6f5c941d7161eba78f14991cae2b20671567c9282e73a0431a60df666bcbc6adddce2cbdeda57fef3a29ed79c3c5b790
data/CHANGELOG.md ADDED
@@ -0,0 +1,3 @@
1
+ 0.2.0 (June 27, 2015)
2
+
3
+ * Change SystemPager to correctly paginate inside a process.
data/Gemfile CHANGED
@@ -4,7 +4,7 @@ gemspec
4
4
 
5
5
  group :development do
6
6
  gem 'rake', '~> 10.4.2'
7
- gem 'rspec', '~> 3.2.0'
7
+ gem 'rspec', '~> 3.3.0'
8
8
  gem 'yard', '~> 0.8.7'
9
9
  end
10
10
 
data/README.md CHANGED
@@ -31,13 +31,13 @@ Or install it yourself as:
31
31
 
32
32
  ## 1. Usage
33
33
 
34
- The **TTY::Pager** upon initialization will choose the best available pager out of `SystemPager`, `BasicPager` or `NullPager`. If paging is disabled then a `NullPager` is used that simply prints content out to stdout, otherwise a check is performed to find native system executable to perform pagination natively with `SystemPager`. If no system executable is found, a `BasicPager` is used which is a pure Ruby implementation that will work with any ruby interpreter.
34
+ 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.
35
35
 
36
36
  ```ruby
37
37
  pager = TTY::Pager.new
38
38
  ```
39
39
 
40
- Then to perform actual content pagination invoke `page` like so:
40
+ Then to perform actual content pagination invoke `page` method with the content to paginate as the argument:
41
41
 
42
42
  ```ruby
43
43
  pager.page("Very long text...")
@@ -55,13 +55,26 @@ If you want to disable the pager pass the `:enabled` option:
55
55
  pager = TTY::Pager.new enabled: false
56
56
  ```
57
57
 
58
- For the `BasicPager` you can also pass a `:prompt` option to change the page break content:
58
+ For the `BasicPager` you can also pass a `:prompt` option to change the page break text:
59
59
 
60
60
  ```ruby
61
61
  prompt = -> (page_num) { output.puts "Page -#{page_num}- Press enter to continue" }
62
62
  pager = TTY::Pager::BasicPager.new prompt: prompt
63
63
  ```
64
64
 
65
+ 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:
66
+
67
+ ```bash
68
+ PAGER=less
69
+ export PAGER
70
+ ```
71
+
72
+ or set `PAGER` in Ruby script:
73
+
74
+ ```ruby
75
+ ENV['PAGER']='less'
76
+ ```
77
+
65
78
  ## Contributing
66
79
 
67
80
  1. Fork it ( https://github.com/peter-murach/tty-pager/fork )
@@ -43,19 +43,19 @@ module TTY
43
43
  # Use system command to page output text
44
44
  #
45
45
  # @example
46
- # page('some long text...')
46
+ # page('some long text...')
47
47
  #
48
48
  # @param [String] text
49
49
  # the text to paginate
50
50
  #
51
- # @return [nil]
51
+ # @return [Boolean]
52
+ # the success status of launching a process
52
53
  #
53
54
  # @api public
54
55
  def page(text, &callback)
55
56
  read_io, write_io = IO.pipe
56
57
 
57
- if Kernel.fork
58
- # parent process
58
+ pid = Kernel.fork do
59
59
  write_io.close
60
60
  input.reopen(read_io)
61
61
  read_io.close
@@ -68,12 +68,14 @@ module TTY
68
68
  rescue SystemCallError
69
69
  exit 1
70
70
  end
71
- else
72
- # child process
73
- read_io.close
74
- write_io.write(text)
75
- write_io.close
76
71
  end
72
+
73
+ read_io.close
74
+ write_io.write(text)
75
+ write_io.close
76
+
77
+ _, status = Process.waitpid2(pid)
78
+ status.success?
77
79
  end
78
80
 
79
81
  private
@@ -86,7 +88,7 @@ module TTY
86
88
  def self.executables
87
89
  [ENV['GIT_PAGER'], ENV['PAGER'],
88
90
  `git config --get-all core.pager`.split.first,
89
- 'less', 'more', 'cat', 'pager']
91
+ 'less', 'more', 'cat', 'pager']
90
92
  end
91
93
  private_class_method :executables
92
94
 
@@ -104,7 +106,6 @@ module TTY
104
106
  def self.command_exists?(command)
105
107
  !TTY::Which.which(command).nil?
106
108
  end
107
- private_class_method :command_exists?
108
109
 
109
110
  # The pager command to run
110
111
  #
@@ -114,10 +115,10 @@ module TTY
114
115
  # @api private
115
116
  def pager_command(*commands)
116
117
  @pager_command = if @pager_command && commands.empty?
117
- @pager_command
118
- else
119
- self.class.available(*commands)
120
- end
118
+ @pager_command
119
+ else
120
+ self.class.available(*commands)
121
+ end
121
122
  end
122
123
  end # SystemPager
123
124
  end # Pager
@@ -2,6 +2,6 @@
2
2
 
3
3
  module TTY
4
4
  class Pager
5
- VERSION = "0.1.0"
5
+ VERSION = "0.2.0"
6
6
  end # Pager
7
7
  end # TTY
@@ -22,4 +22,9 @@ RSpec.describe TTY::Pager::SystemPager, '#available' do
22
22
  allow(pager).to receive(:command_exists?).with('more') { true }
23
23
  expect(pager.available('more')).to eql('more')
24
24
  end
25
+
26
+ it "allows to query for available command" do
27
+ allow(pager).to receive(:available).with('less') { true }
28
+ expect(pager.available?('less')).to eq(true)
29
+ end
25
30
  end
@@ -0,0 +1,15 @@
1
+ # coding: utf-8
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(:which).with('less').and_return('/usr/bin/less')
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(:which).with('less').and_return(nil)
13
+ expect(pager.command_exists?('less')).to eq(false)
14
+ end
15
+ end
@@ -1,20 +1,29 @@
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 }
4
+ let(:input) { StringIO.new }
5
+ let(:output) { StringIO.new }
6
6
 
7
7
  it "executes the pager command in a subprocess" do
8
- text = "I try all things, I achieve what I can.\n"
9
- pager = described_class.new(output: output, input: input)
8
+ text = "I try all things, I achieve what I can.\n"
9
+ pager = described_class.new(output: output, input: input)
10
+ read_io = spy
11
+ write_io = spy
10
12
 
11
- allow(pager).to receive(:exec)
12
- allow(Kernel).to receive(:fork).and_return(true)
13
- allow(pager).to receive(:pager_command).and_return('less')
14
- allow(IO).to receive(:select)
15
- allow(input).to receive(:reopen)
13
+ allow(IO).to receive(:pipe).and_return([read_io, write_io])
16
14
 
17
- pager.page(text)
15
+ allow(Kernel).to receive(:fork) do |&block|
16
+ allow(input).to receive(:reopen)
17
+ allow(IO).to receive(:select)
18
+ allow(pager).to receive(:pager_command).and_return('less')
19
+ allow(pager).to receive(:exec)
20
+ block.call
21
+ end.and_return(12345)
22
+
23
+ status = double(:status, :success? => true)
24
+ allow(Process).to receive(:waitpid2).with(12345).and_return([1, status])
25
+
26
+ expect(pager.page(text)).to eq(true)
18
27
 
19
28
  expect(IO).to have_received(:select).with([input])
20
29
  expect(pager).to have_received(:exec).with('less')
data/tasks/console.rake CHANGED
@@ -8,3 +8,4 @@ task :console do
8
8
  ARGV.clear
9
9
  IRB.start
10
10
  end
11
+ task :c => :console
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.1.0
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-05-31 00:00:00.000000000 Z
11
+ date: 2015-06-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tty-screen
@@ -78,6 +78,7 @@ files:
78
78
  - .rspec
79
79
  - .ruby-version
80
80
  - .travis.yml
81
+ - CHANGELOG.md
81
82
  - Gemfile
82
83
  - LICENSE.txt
83
84
  - README.md
@@ -93,6 +94,7 @@ files:
93
94
  - spec/unit/null/page_spec.rb
94
95
  - spec/unit/page_spec.rb
95
96
  - spec/unit/system/available_spec.rb
97
+ - spec/unit/system/command_exists_spec.rb
96
98
  - spec/unit/system/page_spec.rb
97
99
  - tasks/console.rake
98
100
  - tasks/coverage.rake
@@ -129,5 +131,6 @@ test_files:
129
131
  - spec/unit/null/page_spec.rb
130
132
  - spec/unit/page_spec.rb
131
133
  - spec/unit/system/available_spec.rb
134
+ - spec/unit/system/command_exists_spec.rb
132
135
  - spec/unit/system/page_spec.rb
133
136
  has_rdoc: