Module: Pry::Helpers::BaseHelpers

Included in:
Command, Command::Cat::AbstractFormatter, Command::FindMethod, Command::ShowInfo, CommandSet, Editor, Indent, Method, Method, WrappedModule
Defined in:
lib/pry/helpers/base_helpers.rb

Class Method Summary (collapse)

Instance Method Summary (collapse)

Class Method Details

+ (Object) colorize_code(code)



58
59
60
61
62
63
64
# File 'lib/pry/helpers/base_helpers.rb', line 58

def colorize_code(code)
  if Pry.color
    CodeRay.scan(code, :ruby).term
  else
    code
  end
end

+ (Boolean) command_dependencies_met?(options)

Returns:

  • (Boolean)


38
39
40
41
42
43
# File 'lib/pry/helpers/base_helpers.rb', line 38

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

+ (Array<Array<Binding>, Array<Binding>>) context_from_object_path(arg_string, _pry_ = nil, old_stack = [])

Returns An array containing two elements: The new binding_stack and the old binding_stack.

Parameters:

  • arg_string (String)

    The object path expressed as a string.

  • _pry_ (Pry) (defaults to: nil)

    The relevant Pry instance.

  • old_stack (Array<Binding>) (defaults to: [])

    The state of the old binding stack

Returns:

  • (Array<Array<Binding>, Array<Binding>>)

    An array containing two elements: The new binding_stack and the old binding_stack.



134
135
136
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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
# File 'lib/pry/helpers/base_helpers.rb', line 134

def context_from_object_path(arg_string, _pry_=nil, old_stack=[])

  # Extract command arguments. Delete blank arguments like " ", but
  # don't delete empty strings like "".
  path      = arg_string.split(/\//).delete_if { |a| a =~ /\A\s+\z/ }
  stack     = _pry_.binding_stack.dup
  state_old_stack = old_stack

  # Special case when we only get a single "/", return to root.
  if path.empty?
    state_old_stack = stack.dup unless old_stack.empty?
    stack = [stack.first]
  end

  path.each_with_index do |context, i|
    begin
      case context.chomp
      when ""
        state_old_stack = stack.dup
        stack = [stack.first]
      when "::"
        state_old_stack = stack.dup
        stack.push(TOPLEVEL_BINDING)
      when "."
        next
      when ".."
        unless stack.size == 1
          # Don't rewrite old_stack if we're in complex expression
          # (e.g.: `cd 1/2/3/../4).
          state_old_stack = stack.dup if path.first == ".."
          stack.pop
        end
      when "-"
        unless old_stack.empty?
          # Interchange current stack and old stack with each other.
          stack, state_old_stack = state_old_stack, stack
        end
      else
        state_old_stack = stack.dup if i == 0
        stack.push(Pry.binding_for(stack.last.eval(context)))
      end

    rescue RescuableException => e
      # Restore old stack to its initial values.
      state_old_stack = old_stack

      msg = [
        "Bad object path: #{arg_string}.",
        "Failed trying to resolve: #{context}.",
        e.inspect
      ].join(' ')

      CommandError.new(msg).tap do |err|
        err.set_backtrace e.backtrace
        raise err
      end
    end
  end
  return stack, state_old_stack
end

+ (Object) find_command(name, set = Pry::Commands)



27
28
29
30
31
32
# File 'lib/pry/helpers/base_helpers.rb', line 27

def find_command(name, set = Pry::Commands)
  command_match = set.find do |_, command|
    (listing = command.options[:listing]) == name && listing != nil
  end
  command_match.last if command_match
end

+ (Object) heading(text)

formatting



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

def heading(text)
  text = "#{text}\n--"
  Pry.color ? "\e[1m#{text}\e[0m": text
end

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



66
67
68
# File 'lib/pry/helpers/base_helpers.rb', line 66

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)


87
88
89
# File 'lib/pry/helpers/base_helpers.rb', line 87

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

+ (Boolean) mri_18?

Returns:

  • (Boolean)


96
97
98
# File 'lib/pry/helpers/base_helpers.rb', line 96

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

+ (Boolean) mri_19?

Returns:

  • (Boolean)


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

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

+ (Boolean) not_a_real_file?(file)

Returns:

  • (Boolean)


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

def not_a_real_file?(file)
  file =~ /(\(.*\))|<.*>/ || file =~ /__unknown__/ || file == "" || file == "-e"
end

+ (Boolean) rbx?

are we on rbx platform?

Returns:

  • (Boolean)


92
93
94
# File 'lib/pry/helpers/base_helpers.rb', line 92

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

+ (Object) safe_send(obj, method, *args, &block)

Acts like send but ignores any methods defined below Object or Class in the inheritance hierarchy. This is required to introspect methods on objects like Net::HTTP::Get that have overridden the method method.



22
23
24
# File 'lib/pry/helpers/base_helpers.rb', line 22

def safe_send(obj, method, *args, &block)
  (Module === obj ? Module : Object).instance_method(method).bind(obj).call(*args, &block)
end

+ (Object) set_file_and_dir_locals(file_name, _pry_ = _pry_(), target = target())



45
46
47
48
49
50
51
52
# File 'lib/pry/helpers/base_helpers.rb', line 45

def set_file_and_dir_locals(file_name, _pry_=_pry_(), target=target())
  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) 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



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/pry/helpers/base_helpers.rb', line 106

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 < Pry::Pager.page_size || !Pry.pager
    out.puts text
  else
    Pry::Pager.page(text)
  end
rescue Errno::ENOENT
  Pry::Pager.page(text, :simple)
rescue Errno::EPIPE
end

+ (Boolean) use_ansi_codes?

Returns:

  • (Boolean)


54
55
56
# File 'lib/pry/helpers/base_helpers.rb', line 54

def use_ansi_codes?
  windows_ansi? || ENV['TERM'] && ENV['TERM'] != "dumb"
end

+ (Boolean) windows?

have fun on the Windows platform.

Returns:

  • (Boolean)


77
78
79
# File 'lib/pry/helpers/base_helpers.rb', line 77

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

+ (Boolean) windows_ansi?

are we able to use ansi on windows?

Returns:

  • (Boolean)


82
83
84
# File 'lib/pry/helpers/base_helpers.rb', line 82

def windows_ansi?
  defined?(Win32::Console) || ENV['ANSICON']
end

Instance Method Details

- (Object) colorize_code(code) (private)



58
59
60
61
62
63
64
# File 'lib/pry/helpers/base_helpers.rb', line 58

def colorize_code(code)
  if Pry.color
    CodeRay.scan(code, :ruby).term
  else
    code
  end
end

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



38
39
40
41
42
43
# File 'lib/pry/helpers/base_helpers.rb', line 38

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

- (Array<Array<Binding>, Array<Binding>>) context_from_object_path(arg_string, _pry_ = nil, old_stack = []) (private)

Returns An array containing two elements: The new binding_stack and the old binding_stack.

Parameters:

  • arg_string (String)

    The object path expressed as a string.

  • _pry_ (Pry) (defaults to: nil)

    The relevant Pry instance.

  • old_stack (Array<Binding>) (defaults to: [])

    The state of the old binding stack

Returns:

  • (Array<Array<Binding>, Array<Binding>>)

    An array containing two elements: The new binding_stack and the old binding_stack.



134
135
136
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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
# File 'lib/pry/helpers/base_helpers.rb', line 134

def context_from_object_path(arg_string, _pry_=nil, old_stack=[])

  # Extract command arguments. Delete blank arguments like " ", but
  # don't delete empty strings like "".
  path      = arg_string.split(/\//).delete_if { |a| a =~ /\A\s+\z/ }
  stack     = _pry_.binding_stack.dup
  state_old_stack = old_stack

  # Special case when we only get a single "/", return to root.
  if path.empty?
    state_old_stack = stack.dup unless old_stack.empty?
    stack = [stack.first]
  end

  path.each_with_index do |context, i|
    begin
      case context.chomp
      when ""
        state_old_stack = stack.dup
        stack = [stack.first]
      when "::"
        state_old_stack = stack.dup
        stack.push(TOPLEVEL_BINDING)
      when "."
        next
      when ".."
        unless stack.size == 1
          # Don't rewrite old_stack if we're in complex expression
          # (e.g.: `cd 1/2/3/../4).
          state_old_stack = stack.dup if path.first == ".."
          stack.pop
        end
      when "-"
        unless old_stack.empty?
          # Interchange current stack and old stack with each other.
          stack, state_old_stack = state_old_stack, stack
        end
      else
        state_old_stack = stack.dup if i == 0
        stack.push(Pry.binding_for(stack.last.eval(context)))
      end

    rescue RescuableException => e
      # Restore old stack to its initial values.
      state_old_stack = old_stack

      msg = [
        "Bad object path: #{arg_string}.",
        "Failed trying to resolve: #{context}.",
        e.inspect
      ].join(' ')

      CommandError.new(msg).tap do |err|
        err.set_backtrace e.backtrace
        raise err
      end
    end
  end
  return stack, state_old_stack
end

- (Object) find_command(name, set = Pry::Commands) (private)



27
28
29
30
31
32
# File 'lib/pry/helpers/base_helpers.rb', line 27

def find_command(name, set = Pry::Commands)
  command_match = set.find do |_, command|
    (listing = command.options[:listing]) == name && listing != nil
  end
  command_match.last if command_match
end

- (Object) heading(text) (private)

formatting



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

def heading(text)
  text = "#{text}\n--"
  Pry.color ? "\e[1m#{text}\e[0m": text
end

- (Object) highlight(string, regexp, highlight_color = :bright_yellow) (private)



66
67
68
# File 'lib/pry/helpers/base_helpers.rb', line 66

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?



87
88
89
# File 'lib/pry/helpers/base_helpers.rb', line 87

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

- (Object) mri_18? (private)



96
97
98
# File 'lib/pry/helpers/base_helpers.rb', line 96

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

- (Object) mri_19? (private)



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

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

- (Object) not_a_real_file?(file) (private)



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

def not_a_real_file?(file)
  file =~ /(\(.*\))|<.*>/ || file =~ /__unknown__/ || file == "" || file == "-e"
end

- (Object) rbx? (private)

are we on rbx platform?



92
93
94
# File 'lib/pry/helpers/base_helpers.rb', line 92

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

- (Object) safe_send(obj, method, *args, &block) (private)

Acts like send but ignores any methods defined below Object or Class in the inheritance hierarchy. This is required to introspect methods on objects like Net::HTTP::Get that have overridden the method method.



22
23
24
# File 'lib/pry/helpers/base_helpers.rb', line 22

def safe_send(obj, method, *args, &block)
  (Module === obj ? Module : Object).instance_method(method).bind(obj).call(*args, &block)
end

- (Object) set_file_and_dir_locals(file_name, _pry_ = _pry_(), target = target()) (private)



45
46
47
48
49
50
51
52
# File 'lib/pry/helpers/base_helpers.rb', line 45

def set_file_and_dir_locals(file_name, _pry_=_pry_(), target=target())
  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) 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



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/pry/helpers/base_helpers.rb', line 106

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 < Pry::Pager.page_size || !Pry.pager
    out.puts text
  else
    Pry::Pager.page(text)
  end
rescue Errno::ENOENT
  Pry::Pager.page(text, :simple)
rescue Errno::EPIPE
end

- (Object) use_ansi_codes? (private)



54
55
56
# File 'lib/pry/helpers/base_helpers.rb', line 54

def use_ansi_codes?
  windows_ansi? || ENV['TERM'] && ENV['TERM'] != "dumb"
end

- (Object) windows? (private)

have fun on the Windows platform.



77
78
79
# File 'lib/pry/helpers/base_helpers.rb', line 77

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

- (Object) windows_ansi? (private)

are we able to use ansi on windows?



82
83
84
# File 'lib/pry/helpers/base_helpers.rb', line 82

def windows_ansi?
  defined?(Win32::Console) || ENV['ANSICON']
end