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

.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

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

.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, 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

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

  return command_match.last if command_match
  nil
end

.gem_installed?(gem_name) ⇒ Boolean

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

.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?

Returns:

  • (Boolean)


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)
    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

.mri_18?Boolean

Returns:

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

Returns:

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

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

.page_sizeObject



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

def page_size
  27
end

.rbx?Boolean

are we on rbx platform?

Returns:

  • (Boolean)


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

.silence_warningsObject



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, 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

.use_ansi_codes?Boolean

Returns:

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

Returns:

  • (Boolean)


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?

Returns:

  • (Boolean)


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?(options)
  return true if !options[:requires_gem]
  Array(options[: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, 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

#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.options[: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)
    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

#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_sizeObject (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.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

#silence_warningsObject (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, 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

#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