Module: Pry::Helpers::BaseHelpers
- Included in:
- Command, CommandSet, Indent
- Defined in:
- lib/pry/helpers/base_helpers.rb
Class Method Summary collapse
- .colorize_code(code) ⇒ Object
- .command_dependencies_met?(options) ⇒ Boolean
- .create_command_stub(names, description, options, block) ⇒ Object
- .find_command(name) ⇒ Object
- .gem_installed?(gem_name) ⇒ Boolean
-
.heading(text) ⇒ Object
formatting.
- .highlight(string, regexp, highlight_color = :bright_yellow) ⇒ Object
-
.jruby? ⇒ Boolean
are we on Jruby platform?.
-
.lesspipe(*args) ⇒ Object
Create scrollable output via less!.
- .mri_18? ⇒ Boolean
- .mri_19? ⇒ Boolean
- .not_a_real_file?(file) ⇒ Boolean
- .page_size ⇒ Object
-
.rbx? ⇒ Boolean
are we on rbx platform?.
- .set_file_and_dir_locals(file_name) ⇒ Object
- .silence_warnings ⇒ Object
-
.simple_pager(text, output = output()) ⇒ Object
a simple pager for systems without
less. -
.stagger_output(text, out = nil) ⇒ Object
Try to use
lessfor paging, if it fails then use simple_pager. - .stub_proc(name, options) ⇒ Object
- .use_ansi_codes? ⇒ Boolean
-
.windows? ⇒ Boolean
have fun on the Windows platform.
-
.windows_ansi? ⇒ Boolean
are we able to use ansi on windows?.
Instance Method Summary collapse
- #colorize_code(code) ⇒ Object private
- #command_dependencies_met?(options) ⇒ Object private
- #create_command_stub(names, description, options, block) ⇒ Object private
- #find_command(name) ⇒ Object private
- #gem_installed?(gem_name) ⇒ Object private
-
#heading(text) ⇒ Object
private
formatting.
- #highlight(string, regexp, highlight_color = :bright_yellow) ⇒ Object private
-
#jruby? ⇒ Object
private
are we on Jruby platform?.
-
#lesspipe(*args) ⇒ Object
private
Create scrollable output via less!.
- #mri_18? ⇒ Object private
- #mri_19? ⇒ Object private
- #not_a_real_file?(file) ⇒ Object private
- #page_size ⇒ Object private
-
#rbx? ⇒ Object
private
are we on rbx platform?.
- #set_file_and_dir_locals(file_name) ⇒ Object private
- #silence_warnings ⇒ Object private
-
#simple_pager(text, output = output()) ⇒ Object
private
a simple pager for systems without
less. -
#stagger_output(text, out = nil) ⇒ Object
private
Try to use
lessfor paging, if it fails then use simple_pager. - #stub_proc(name, options) ⇒ Object private
- #use_ansi_codes? ⇒ Object private
-
#windows? ⇒ Object
private
have fun on the Windows platform.
-
#windows_ansi? ⇒ Object
private
are we able to use ansi on windows?.
Class Method Details
.colorize_code(code) ⇒ Object
76 77 78 79 80 81 82 |
# File 'lib/pry/helpers/base_helpers.rb', line 76 def colorize_code(code) if Pry.color CodeRay.scan(code, :ruby).term else code end end |
.command_dependencies_met?(options) ⇒ Boolean
34 35 36 37 38 39 |
# File 'lib/pry/helpers/base_helpers.rb', line 34 def command_dependencies_met?() return true if ![:requires_gem] Array([:requires_gem]).all? do |g| gem_installed?(g) end end |
.create_command_stub(names, description, options, block) ⇒ Object
62 63 64 65 66 67 68 69 70 |
# File 'lib/pry/helpers/base_helpers.rb', line 62 def create_command_stub(names, description, , block) Array(names).each do |name| commands[name] = { :description => "Not available. Execute #{(name)} command for more information.", :action => stub_proc(name, ), :stub_info => } end end |
.find_command(name) ⇒ Object
18 19 20 21 22 23 |
# File 'lib/pry/helpers/base_helpers.rb', line 18 def find_command(name) command_match = commands.find { |_, command| command.[:listing] == name } return command_match.last if command_match nil end |
.gem_installed?(gem_name) ⇒ Boolean
25 26 27 28 |
# File 'lib/pry/helpers/base_helpers.rb', line 25 def gem_installed?(gem_name) require 'rubygems' Gem::Specification.respond_to?(:find_all_by_name) ? !Gem::Specification.find_all_by_name(gem_name).empty? : Gem.source_index.find_name(gem_name).first end |
.heading(text) ⇒ Object
formatting
89 90 91 92 |
# File 'lib/pry/helpers/base_helpers.rb', line 89 def heading(text) text = "#{text}\n--" Pry.color ? "\e[1m#{text}\e[0m": text end |
.highlight(string, regexp, highlight_color = :bright_yellow) ⇒ Object
84 85 86 |
# File 'lib/pry/helpers/base_helpers.rb', line 84 def highlight(string, regexp, highlight_color=:bright_yellow) string.gsub(regexp) { |match| "<#{highlight_color}>#{match}</#{highlight_color}>" } end |
.jruby? ⇒ Boolean
are we on Jruby platform?
109 110 111 |
# File 'lib/pry/helpers/base_helpers.rb', line 109 def jruby? RbConfig::CONFIG['ruby_install_name'] == 'jruby' end |
.lesspipe(*args) ⇒ Object
Create scrollable output via less!
This command runs less in a subprocess, and gives you the IO to its STDIN pipe
so that you can communicate with it.
Example:
lesspipe do |less| 50.times { less.puts "Hi mom!" } end
The default less parameters are:
- Allow colour
- Don't wrap lines longer than the screen
- Quit immediately (without paging) if there's less than one screen of text.
You can change these options by passing a hash to lesspipe, like so:
lesspipe(:wrap=>false) { |less| less.puts essay.to_s }
It accepts the following boolean options: :color => Allow ANSI colour codes? :wrap => Wrap long lines? :always => Always page, even if there's less than one page of text?
197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 |
# File 'lib/pry/helpers/base_helpers.rb', line 197 def lesspipe(*args) if args.any? and args.last.is_a?(Hash) = args.pop else = {} end output = args.first if args.any? params = [] params << "-R" unless [:color] == false params << "-S" unless [:wrap] == true params << "-F" unless [:always] == true if [:tail] == true params << "+\\>" $stderr.puts "Seeking to end of stream..." end params << "-X" IO.popen("less #{params * ' '}", "w") do |less| if output less.puts output else yield less end end end |
.mri_18? ⇒ Boolean
118 119 120 |
# File 'lib/pry/helpers/base_helpers.rb', line 118 def mri_18? RUBY_VERSION =~ /1.8/ && RbConfig::CONFIG['ruby_install_name'] == 'ruby' end |
.mri_19? ⇒ Boolean
122 123 124 |
# File 'lib/pry/helpers/base_helpers.rb', line 122 def mri_19? RUBY_VERSION =~ /1.9/ && RbConfig::CONFIG['ruby_install_name'] == 'ruby' end |
.not_a_real_file?(file) ⇒ Boolean
30 31 32 |
# File 'lib/pry/helpers/base_helpers.rb', line 30 def not_a_real_file?(file) file =~ /(\(.*\))|<.*>/ || file =~ /__unknown__/ || file == "" || file == "-e" end |
.page_size ⇒ Object
94 95 96 |
# File 'lib/pry/helpers/base_helpers.rb', line 94 def page_size 27 end |
.rbx? ⇒ Boolean
are we on rbx platform?
114 115 116 |
# File 'lib/pry/helpers/base_helpers.rb', line 114 def rbx? RbConfig::CONFIG['ruby_install_name'] == 'rbx' end |
.set_file_and_dir_locals(file_name) ⇒ Object
41 42 43 44 45 46 47 48 |
# File 'lib/pry/helpers/base_helpers.rb', line 41 def set_file_and_dir_locals(file_name) return if !target or !file_name _pry_.last_file = File.(file_name) _pry_.inject_local("_file_", _pry_.last_file, target) _pry_.last_dir = File.dirname(_pry_.last_file) _pry_.inject_local("_dir_", _pry_.last_dir, target) end |
.silence_warnings ⇒ Object
8 9 10 11 12 13 14 15 16 |
# File 'lib/pry/helpers/base_helpers.rb', line 8 def silence_warnings old_verbose = $VERBOSE $VERBOSE = nil begin yield ensure $VERBOSE = old_verbose end end |
.simple_pager(text, output = output()) ⇒ Object
a simple pager for systems without less. A la windows.
127 128 129 130 131 132 133 134 135 136 137 |
# File 'lib/pry/helpers/base_helpers.rb', line 127 def simple_pager(text, output=output()) text_array = text.lines.to_a text_array.each_slice(page_size) do |chunk| output.puts chunk.join break if chunk.size < page_size if text_array.size > page_size output.puts "\n<page break> --- Press enter to continue ( q<enter> to break ) --- <page break>" break if $stdin.gets.chomp == "q" end end end |
.stagger_output(text, out = nil) ⇒ Object
Try to use less for paging, if it fails then use
simple_pager. Also do not page if Pry.pager is falsey
FIXME! Another JRuby hack
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
# File 'lib/pry/helpers/base_helpers.rb', line 142 def stagger_output(text, out = nil) out ||= case when respond_to?(:output) # Mixin. output when Pry.respond_to?(:output) # Parent. Pry.output else # Sys. $stdout end if text.lines.count < page_size || !Pry.pager out.puts text return end # FIXME! Another JRuby hack if jruby? simple_pager(text, out) else lesspipe { |less| less.puts text } end rescue Errno::ENOENT simple_pager(text, out) rescue Errno::EPIPE end |
.stub_proc(name, options) ⇒ Object
50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/pry/helpers/base_helpers.rb', line 50 def stub_proc(name, ) gems_needed = Array([:requires_gem]) gems_not_installed = gems_needed.select { |g| !gem_installed?(g) } proc do output.puts "\nThe command '#{name}' requires the following gems to be installed: #{(gems_needed.join(", "))}" output.puts "-" output.puts "Command not available due to dependency on gems: `#{gems_not_installed.join(", ")}` not being met." output.puts "-" output.puts "Type `install #{name}` to install the required gems and activate this command." end end |
.use_ansi_codes? ⇒ Boolean
72 73 74 |
# File 'lib/pry/helpers/base_helpers.rb', line 72 def use_ansi_codes? windows_ansi? || ENV['TERM'] && ENV['TERM'] != "dumb" end |
.windows? ⇒ Boolean
have fun on the Windows platform.
99 100 101 |
# File 'lib/pry/helpers/base_helpers.rb', line 99 def windows? RbConfig::CONFIG['host_os'] =~ /mswin|mingw/ end |
.windows_ansi? ⇒ Boolean
are we able to use ansi on windows?
104 105 106 |
# File 'lib/pry/helpers/base_helpers.rb', line 104 def windows_ansi? defined?(Win32::Console) || ENV['ANSICON'] end |
Instance Method Details
#colorize_code(code) ⇒ Object (private)
76 77 78 79 80 81 82 |
# File 'lib/pry/helpers/base_helpers.rb', line 76 def colorize_code(code) if Pry.color CodeRay.scan(code, :ruby).term else code end end |
#command_dependencies_met?(options) ⇒ Object (private)
34 35 36 37 38 39 |
# File 'lib/pry/helpers/base_helpers.rb', line 34 def command_dependencies_met?() return true if ![:requires_gem] Array([:requires_gem]).all? do |g| gem_installed?(g) end end |
#create_command_stub(names, description, options, block) ⇒ Object (private)
62 63 64 65 66 67 68 69 70 |
# File 'lib/pry/helpers/base_helpers.rb', line 62 def create_command_stub(names, description, , block) Array(names).each do |name| commands[name] = { :description => "Not available. Execute #{(name)} command for more information.", :action => stub_proc(name, ), :stub_info => } end end |
#find_command(name) ⇒ Object (private)
18 19 20 21 22 23 |
# File 'lib/pry/helpers/base_helpers.rb', line 18 def find_command(name) command_match = commands.find { |_, command| command.[:listing] == name } return command_match.last if command_match nil end |
#gem_installed?(gem_name) ⇒ Object (private)
25 26 27 28 |
# File 'lib/pry/helpers/base_helpers.rb', line 25 def gem_installed?(gem_name) require 'rubygems' Gem::Specification.respond_to?(:find_all_by_name) ? !Gem::Specification.find_all_by_name(gem_name).empty? : Gem.source_index.find_name(gem_name).first end |
#heading(text) ⇒ Object (private)
formatting
89 90 91 92 |
# File 'lib/pry/helpers/base_helpers.rb', line 89 def heading(text) text = "#{text}\n--" Pry.color ? "\e[1m#{text}\e[0m": text end |
#highlight(string, regexp, highlight_color = :bright_yellow) ⇒ Object (private)
84 85 86 |
# File 'lib/pry/helpers/base_helpers.rb', line 84 def highlight(string, regexp, highlight_color=:bright_yellow) string.gsub(regexp) { |match| "<#{highlight_color}>#{match}</#{highlight_color}>" } end |
#jruby? ⇒ Object (private)
are we on Jruby platform?
109 110 111 |
# File 'lib/pry/helpers/base_helpers.rb', line 109 def jruby? RbConfig::CONFIG['ruby_install_name'] == 'jruby' end |
#lesspipe(*args) ⇒ Object (private)
Create scrollable output via less!
This command runs less in a subprocess, and gives you the IO to its STDIN pipe
so that you can communicate with it.
Example:
lesspipe do |less| 50.times { less.puts "Hi mom!" } end
The default less parameters are:
- Allow colour
- Don't wrap lines longer than the screen
- Quit immediately (without paging) if there's less than one screen of text.
You can change these options by passing a hash to lesspipe, like so:
lesspipe(:wrap=>false) { |less| less.puts essay.to_s }
It accepts the following boolean options: :color => Allow ANSI colour codes? :wrap => Wrap long lines? :always => Always page, even if there's less than one page of text?
197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 |
# File 'lib/pry/helpers/base_helpers.rb', line 197 def lesspipe(*args) if args.any? and args.last.is_a?(Hash) = args.pop else = {} end output = args.first if args.any? params = [] params << "-R" unless [:color] == false params << "-S" unless [:wrap] == true params << "-F" unless [:always] == true if [:tail] == true params << "+\\>" $stderr.puts "Seeking to end of stream..." end params << "-X" IO.popen("less #{params * ' '}", "w") do |less| if output less.puts output else yield less end end end |
#mri_18? ⇒ Object (private)
118 119 120 |
# File 'lib/pry/helpers/base_helpers.rb', line 118 def mri_18? RUBY_VERSION =~ /1.8/ && RbConfig::CONFIG['ruby_install_name'] == 'ruby' end |
#mri_19? ⇒ Object (private)
122 123 124 |
# File 'lib/pry/helpers/base_helpers.rb', line 122 def mri_19? RUBY_VERSION =~ /1.9/ && RbConfig::CONFIG['ruby_install_name'] == 'ruby' end |
#not_a_real_file?(file) ⇒ Object (private)
30 31 32 |
# File 'lib/pry/helpers/base_helpers.rb', line 30 def not_a_real_file?(file) file =~ /(\(.*\))|<.*>/ || file =~ /__unknown__/ || file == "" || file == "-e" end |
#page_size ⇒ Object (private)
94 95 96 |
# File 'lib/pry/helpers/base_helpers.rb', line 94 def page_size 27 end |
#rbx? ⇒ Object (private)
are we on rbx platform?
114 115 116 |
# File 'lib/pry/helpers/base_helpers.rb', line 114 def rbx? RbConfig::CONFIG['ruby_install_name'] == 'rbx' end |
#set_file_and_dir_locals(file_name) ⇒ Object (private)
41 42 43 44 45 46 47 48 |
# File 'lib/pry/helpers/base_helpers.rb', line 41 def set_file_and_dir_locals(file_name) return if !target or !file_name _pry_.last_file = File.(file_name) _pry_.inject_local("_file_", _pry_.last_file, target) _pry_.last_dir = File.dirname(_pry_.last_file) _pry_.inject_local("_dir_", _pry_.last_dir, target) end |
#silence_warnings ⇒ Object (private)
8 9 10 11 12 13 14 15 16 |
# File 'lib/pry/helpers/base_helpers.rb', line 8 def silence_warnings old_verbose = $VERBOSE $VERBOSE = nil begin yield ensure $VERBOSE = old_verbose end end |
#simple_pager(text, output = output()) ⇒ Object (private)
a simple pager for systems without less. A la windows.
127 128 129 130 131 132 133 134 135 136 137 |
# File 'lib/pry/helpers/base_helpers.rb', line 127 def simple_pager(text, output=output()) text_array = text.lines.to_a text_array.each_slice(page_size) do |chunk| output.puts chunk.join break if chunk.size < page_size if text_array.size > page_size output.puts "\n<page break> --- Press enter to continue ( q<enter> to break ) --- <page break>" break if $stdin.gets.chomp == "q" end end end |
#stagger_output(text, out = nil) ⇒ Object (private)
Try to use less for paging, if it fails then use
simple_pager. Also do not page if Pry.pager is falsey
FIXME! Another JRuby hack
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
# File 'lib/pry/helpers/base_helpers.rb', line 142 def stagger_output(text, out = nil) out ||= case when respond_to?(:output) # Mixin. output when Pry.respond_to?(:output) # Parent. Pry.output else # Sys. $stdout end if text.lines.count < page_size || !Pry.pager out.puts text return end # FIXME! Another JRuby hack if jruby? simple_pager(text, out) else lesspipe { |less| less.puts text } end rescue Errno::ENOENT simple_pager(text, out) rescue Errno::EPIPE end |
#stub_proc(name, options) ⇒ Object (private)
50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/pry/helpers/base_helpers.rb', line 50 def stub_proc(name, ) gems_needed = Array([:requires_gem]) gems_not_installed = gems_needed.select { |g| !gem_installed?(g) } proc do output.puts "\nThe command '#{name}' requires the following gems to be installed: #{(gems_needed.join(", "))}" output.puts "-" output.puts "Command not available due to dependency on gems: `#{gems_not_installed.join(", ")}` not being met." output.puts "-" output.puts "Type `install #{name}` to install the required gems and activate this command." end end |
#use_ansi_codes? ⇒ Object (private)
72 73 74 |
# File 'lib/pry/helpers/base_helpers.rb', line 72 def use_ansi_codes? windows_ansi? || ENV['TERM'] && ENV['TERM'] != "dumb" end |
#windows? ⇒ Object (private)
have fun on the Windows platform.
99 100 101 |
# File 'lib/pry/helpers/base_helpers.rb', line 99 def windows? RbConfig::CONFIG['host_os'] =~ /mswin|mingw/ end |
#windows_ansi? ⇒ Object (private)
are we able to use ansi on windows?
104 105 106 |
# File 'lib/pry/helpers/base_helpers.rb', line 104 def windows_ansi? defined?(Win32::Console) || ENV['ANSICON'] end |