Module: Pry::Helpers::BaseHelpers

Included in:
Command, CommandSet, Indent
Defined in:
lib/pry/helpers/base_helpers.rb

Class Method Summary (collapse)

Instance Method Summary (collapse)

Class Method Details

+ (Object) colorize_code(code)



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

+ (Boolean) command_dependencies_met?(options)

Returns:

  • (Boolean)


34
35
36
37
38
39
# File 'lib/pry/helpers/base_helpers.rb', line 34

def command_dependencies_met?(options)
  return true if !options[:requires_gem]
  Array(options[:requires_gem]).all? do |g|
    gem_installed?(g)
  end
end

+ (Object) create_command_stub(names, description, options, block)



62
63
64
65
66
67
68
69
70
# File 'lib/pry/helpers/base_helpers.rb', line 62

def create_command_stub(names, description, options, block)
  Array(names).each do |name|
    commands[name] = {
      :description => "Not available. Execute #{(name)} command for more information.",
      :action => stub_proc(name, options),
      :stub_info => options
    }
  end
end

+ (Object) find_command(name)



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.options[:listing] == name }

  return command_match.last if command_match
  nil
end

+ (Boolean) gem_installed?(gem_name)

Returns:

  • (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

+ (Object) heading(text)

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

+ (Object) highlight(string, regexp, highlight_color = :bright_yellow)



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

+ (Boolean) jruby?

are we on Jruby platform?

Returns:

  • (Boolean)


104
105
106
# File 'lib/pry/helpers/base_helpers.rb', line 104

def jruby?
  RbConfig::CONFIG['ruby_install_name'] == 'jruby'
end

+ (Object) lesspipe(*args)

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?



192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
# File 'lib/pry/helpers/base_helpers.rb', line 192

def lesspipe(*args)
  if args.any? and args.last.is_a?(Hash)
    options = args.pop
  else
    options = {}
  end

  output = args.first if args.any?

  params = []
  params << "-R" unless options[:color] == false
  params << "-S" unless options[:wrap] == true
  params << "-F" unless options[:always] == true
  if options[: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

+ (Boolean) mri_18?

Returns:

  • (Boolean)


113
114
115
# File 'lib/pry/helpers/base_helpers.rb', line 113

def mri_18?
  RUBY_VERSION =~ /1.8/ && RbConfig::CONFIG['ruby_install_name'] == 'ruby'
end

+ (Boolean) mri_19?

Returns:

  • (Boolean)


117
118
119
# File 'lib/pry/helpers/base_helpers.rb', line 117

def mri_19?
  RUBY_VERSION =~ /1.9/ && RbConfig::CONFIG['ruby_install_name'] == 'ruby'
end

+ (Boolean) not_a_real_file?(file)

Returns:

  • (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

+ (Object) page_size



94
95
96
# File 'lib/pry/helpers/base_helpers.rb', line 94

def page_size
  27
end

+ (Boolean) rbx?

are we on rbx platform?

Returns:

  • (Boolean)


109
110
111
# File 'lib/pry/helpers/base_helpers.rb', line 109

def rbx?
  RbConfig::CONFIG['ruby_install_name'] == 'rbx'
end

+ (Object) set_file_and_dir_locals(file_name)



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.expand_path(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

+ (Object) silence_warnings



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

+ (Object) simple_pager(text, output = output())

a simple pager for systems without less. A la windows.



122
123
124
125
126
127
128
129
130
131
132
# File 'lib/pry/helpers/base_helpers.rb', line 122

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

+ (Object) stagger_output(text, out = nil)

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



137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/pry/helpers/base_helpers.rb', line 137

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

+ (Object) stub_proc(name, options)



50
51
52
53
54
55
56
57
58
59
60
# File 'lib/pry/helpers/base_helpers.rb', line 50

def stub_proc(name, options)
  gems_needed = Array(options[: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

+ (Boolean) use_ansi_codes?

Returns:

  • (Boolean)


72
73
74
# File 'lib/pry/helpers/base_helpers.rb', line 72

def use_ansi_codes?
  defined?(Win32::Console) || ENV['TERM'] && ENV['TERM'] != "dumb"
end

+ (Boolean) windows?

have fun on the Windows platform.

Returns:

  • (Boolean)


99
100
101
# File 'lib/pry/helpers/base_helpers.rb', line 99

def windows?
  RbConfig::CONFIG['host_os'] =~ /mswin|mingw/
end

Instance Method Details

- (Object) colorize_code(code) (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

- (Object) command_dependencies_met?(options) (private)



34
35
36
37
38
39
# File 'lib/pry/helpers/base_helpers.rb', line 34

def command_dependencies_met?(options)
  return true if !options[:requires_gem]
  Array(options[:requires_gem]).all? do |g|
    gem_installed?(g)
  end
end

- (Object) create_command_stub(names, description, options, block) (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, options, block)
  Array(names).each do |name|
    commands[name] = {
      :description => "Not available. Execute #{(name)} command for more information.",
      :action => stub_proc(name, options),
      :stub_info => options
    }
  end
end

- (Object) find_command(name) (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.options[:listing] == name }

  return command_match.last if command_match
  nil
end

- (Object) gem_installed?(gem_name) (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

- (Object) heading(text) (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

- (Object) highlight(string, regexp, highlight_color = :bright_yellow) (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

- (Object) jruby? (private)

are we on Jruby platform?



104
105
106
# File 'lib/pry/helpers/base_helpers.rb', line 104

def jruby?
  RbConfig::CONFIG['ruby_install_name'] == 'jruby'
end

- (Object) lesspipe(*args) (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?



192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
# File 'lib/pry/helpers/base_helpers.rb', line 192

def lesspipe(*args)
  if args.any? and args.last.is_a?(Hash)
    options = args.pop
  else
    options = {}
  end

  output = args.first if args.any?

  params = []
  params << "-R" unless options[:color] == false
  params << "-S" unless options[:wrap] == true
  params << "-F" unless options[:always] == true
  if options[: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

- (Object) mri_18? (private)



113
114
115
# File 'lib/pry/helpers/base_helpers.rb', line 113

def mri_18?
  RUBY_VERSION =~ /1.8/ && RbConfig::CONFIG['ruby_install_name'] == 'ruby'
end

- (Object) mri_19? (private)



117
118
119
# File 'lib/pry/helpers/base_helpers.rb', line 117

def mri_19?
  RUBY_VERSION =~ /1.9/ && RbConfig::CONFIG['ruby_install_name'] == 'ruby'
end

- (Object) not_a_real_file?(file) (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

- (Object) page_size (private)



94
95
96
# File 'lib/pry/helpers/base_helpers.rb', line 94

def page_size
  27
end

- (Object) rbx? (private)

are we on rbx platform?



109
110
111
# File 'lib/pry/helpers/base_helpers.rb', line 109

def rbx?
  RbConfig::CONFIG['ruby_install_name'] == 'rbx'
end

- (Object) set_file_and_dir_locals(file_name) (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.expand_path(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

- (Object) silence_warnings (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

- (Object) simple_pager(text, output = output()) (private)

a simple pager for systems without less. A la windows.



122
123
124
125
126
127
128
129
130
131
132
# File 'lib/pry/helpers/base_helpers.rb', line 122

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

- (Object) stagger_output(text, out = nil) (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



137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/pry/helpers/base_helpers.rb', line 137

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

- (Object) stub_proc(name, options) (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, options)
  gems_needed = Array(options[: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

- (Object) use_ansi_codes? (private)



72
73
74
# File 'lib/pry/helpers/base_helpers.rb', line 72

def use_ansi_codes?
  defined?(Win32::Console) || ENV['TERM'] && ENV['TERM'] != "dumb"
end

- (Object) windows? (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