Module: Pry::Helpers::BaseHelpers

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.colorize_code(code) ⇒ Object



49
50
51
52
53
54
55
# File 'lib/pry/helpers/base_helpers.rb', line 49

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

.command_dependencies_met?(options) ⇒ 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

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



128
129
130
131
132
133
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
# File 'lib/pry/helpers/base_helpers.rb', line 128

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

.find_command(name, set = Pry::Commands) ⇒ Object



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

.heading(text) ⇒ Object

formatting



62
63
64
65
# File 'lib/pry/helpers/base_helpers.rb', line 62

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

.highlight(string, regexp, highlight_color = :bright_yellow) ⇒ Object



57
58
59
# File 'lib/pry/helpers/base_helpers.rb', line 57

def highlight(string, regexp, highlight_color=:bright_yellow)
  string.gsub(regexp) { |match| "<#{highlight_color}>#{match}</#{highlight_color}>" }
end

.jruby?Boolean



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

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

.jruby_19?Boolean



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

def jruby_19?
  jruby? && RbConfig::CONFIG['ruby_version'] == '1.9'
end

.mri?Boolean



89
90
91
# File 'lib/pry/helpers/base_helpers.rb', line 89

def mri?
  RbConfig::CONFIG['ruby_install_name'] == 'ruby'
end

.mri_19?Boolean



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

def mri_19?
  mri? && RUBY_VERSION =~ /1.9/
end

.mri_20?Boolean



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

def mri_20?
  mri? && RUBY_VERSION =~ /2.0/
end

.mri_21?Boolean



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

def mri_21?
  mri? && RUBY_VERSION =~ /2.1/
end

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

.rbx?Boolean



85
86
87
# File 'lib/pry/helpers/base_helpers.rb', line 85

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

.safe_send(obj, method, *args, &block) ⇒ Object

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

.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

.stagger_output(text, out = nil) ⇒ Object

Send the given text through the best available pager (if Pry.pager is enabled). Infers where to send the output if used as a mixin.



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/pry/helpers/base_helpers.rb', line 107

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

  Pry::Pager.page(text, out)
end

.use_ansi_codes?Boolean



45
46
47
# File 'lib/pry/helpers/base_helpers.rb', line 45

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

.windows?Boolean

have fun on the Windows platform.



68
69
70
# File 'lib/pry/helpers/base_helpers.rb', line 68

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

.windows_ansi?Boolean

are we able to use ansi on windows?



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

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

Instance Method Details

#colorize_code(code) ⇒ Object (private)



49
50
51
52
53
54
55
# File 'lib/pry/helpers/base_helpers.rb', line 49

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

#command_dependencies_met?(options) ⇒ Object (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

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



128
129
130
131
132
133
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
# File 'lib/pry/helpers/base_helpers.rb', line 128

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

#find_command(name, set = Pry::Commands) ⇒ Object (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

#heading(text) ⇒ Object (private)

formatting



62
63
64
65
# File 'lib/pry/helpers/base_helpers.rb', line 62

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

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



57
58
59
# File 'lib/pry/helpers/base_helpers.rb', line 57

def highlight(string, regexp, highlight_color=:bright_yellow)
  string.gsub(regexp) { |match| "<#{highlight_color}>#{match}</#{highlight_color}>" }
end

#jruby?Object (private)



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

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

#jruby_19?Object (private)



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

def jruby_19?
  jruby? && RbConfig::CONFIG['ruby_version'] == '1.9'
end

#mri?Object (private)



89
90
91
# File 'lib/pry/helpers/base_helpers.rb', line 89

def mri?
  RbConfig::CONFIG['ruby_install_name'] == 'ruby'
end

#mri_19?Object (private)



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

def mri_19?
  mri? && RUBY_VERSION =~ /1.9/
end

#mri_20?Object (private)



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

def mri_20?
  mri? && RUBY_VERSION =~ /2.0/
end

#mri_21?Object (private)



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

def mri_21?
  mri? && RUBY_VERSION =~ /2.1/
end

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

#rbx?Object (private)



85
86
87
# File 'lib/pry/helpers/base_helpers.rb', line 85

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

#safe_send(obj, method, *args, &block) ⇒ Object (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

#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

#stagger_output(text, out = nil) ⇒ Object (private)

Send the given text through the best available pager (if Pry.pager is enabled). Infers where to send the output if used as a mixin.



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/pry/helpers/base_helpers.rb', line 107

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

  Pry::Pager.page(text, out)
end

#use_ansi_codes?Object (private)



45
46
47
# File 'lib/pry/helpers/base_helpers.rb', line 45

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

#windows?Object (private)

have fun on the Windows platform.



68
69
70
# File 'lib/pry/helpers/base_helpers.rb', line 68

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

#windows_ansi?Object (private)

are we able to use ansi on windows?



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

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