module Pry::Helpers::CommandHelpers

Public Instance Methods

absolute_index_number(line_number, array_length) click to toggle source
# File lib/pry/helpers/command_helpers.rb, line 133
def absolute_index_number(line_number, array_length)
  if line_number >= 0
    line_number
  else
    [array_length + line_number, 0].max
  end
end
absolute_index_range(range_or_number, array_length) click to toggle source
# File lib/pry/helpers/command_helpers.rb, line 141
def absolute_index_range(range_or_number, array_length)
  case range_or_number
  when Range
    a = absolute_index_number(range_or_number.begin, array_length)
    b = absolute_index_number(range_or_number.end, array_length)
  else
    a = b = absolute_index_number(range_or_number, array_length)
  end

  Range.new(a, b)
end
command_error(message, omit_help, klass=CommandError) click to toggle source
# File lib/pry/helpers/command_helpers.rb, line 55
def command_error(message, omit_help, klass=CommandError)
  message += " Type `#{command_name} --help` for help." unless omit_help
  raise klass, message
end
get_method_or_raise(name, target, opts={}, omit_help=false) click to toggle source
# File lib/pry/helpers/command_helpers.rb, line 32
def get_method_or_raise(name, target, opts={}, omit_help=false)
  meth = Pry::Method.from_str(name, target, opts)

  if name && !meth
    command_error("The method '#{name}' could not be found.", omit_help, MethodNotFound)
  end

  (opts[:super] || 0).times do
    if meth.super
      meth = meth.super
    else
      command_error("'#{meth.name_with_owner}' has no super method.", omit_help, MethodNotFound)
    end
  end

  if !meth || (!name && internal_binding?(target))
    command_error("No method name given, and context is not a method.", omit_help, MethodNotFound)
  end

  set_file_and_dir_locals(meth.source_file)
  meth
end
internal_binding?(target) click to toggle source
# File lib/pry/helpers/command_helpers.rb, line 26
def internal_binding?(target)
  m = target.eval("::Kernel.__method__").to_s
  # class_eval is here because of http://jira.codehaus.org/browse/JRUBY-6753
  ["__binding__", "__pry__", "class_eval"].include?(m)
end
one_index_number(line_number) click to toggle source
# File lib/pry/helpers/command_helpers.rb, line 111
def one_index_number(line_number)
  if line_number > 0
    line_number - 1
  else
    line_number
  end
end
one_index_range(range) click to toggle source

convert a 1-index range to a 0-indexed one

# File lib/pry/helpers/command_helpers.rb, line 120
def one_index_range(range)
  Range.new(one_index_number(range.begin), one_index_number(range.end))
end
one_index_range_or_number(range_or_number) click to toggle source
# File lib/pry/helpers/command_helpers.rb, line 124
def one_index_range_or_number(range_or_number)
  case range_or_number
  when Range
    one_index_range(range_or_number)
  else
    one_index_number(range_or_number)
  end
end
render_output(str, opts={}) click to toggle source
# File lib/pry/helpers/command_helpers.rb, line 18
def render_output(str, opts={})
  if opts[:flood]
    output.puts str
  else
    stagger_output str
  end
end
restrict_to_lines(content, lines) click to toggle source

Restrict a string to the given range of lines (1-indexed) @param [String] content The string. @param [Range, Fixnum] lines The line(s) to restrict it to. @return [String] The resulting string.

# File lib/pry/helpers/command_helpers.rb, line 106
def restrict_to_lines(content, lines)
  line_range = one_index_range_or_number(lines)
  Array(content.lines.to_a[line_range]).join
end
temp_file(ext='.rb') { |file| ... } click to toggle source

Open a temp file and yield it to the block, closing it after @return [String] The path of the temp file

# File lib/pry/helpers/command_helpers.rb, line 11
def temp_file(ext='.rb')
  file = Tempfile.new(['pry', ext])
  yield file
ensure
  file.close(true) if file
end
unindent(text, left_padding = 0) click to toggle source

Remove any common leading whitespace from every line in `text`.

This can be used to make a HEREDOC line up with the left margin, without sacrificing the indentation level of the source code.

e.g.

opt.banner unindent <<-USAGE
  Lorem ipsum dolor sit amet, consectetur adipisicing elit,
  sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
    "Ut enim ad minim veniam."
USAGE

Heavily based on textwrap.dedent from Python, which is:

Copyright (C) 1999-2001 Gregory P. Ward.
Copyright (C) 2002, 2003 Python Software Foundation.
Written by Greg Ward <gward@python.net>

Licensed under <http://docs.python.org/license.html>
From <http://hg.python.org/cpython/file/6b9f0a6efaeb/Lib/textwrap.py>

@param [String] text The text from which to remove indentation @return [String] The text with indentation stripped.

# File lib/pry/helpers/command_helpers.rb, line 82
def unindent(text, left_padding = 0)
  # Empty blank lines
  text = text.sub(/^[ \t]+$/, '')

  # Find the longest common whitespace to all indented lines
  # Ignore lines containing just -- or ++ as these seem to be used by
  # comment authors as delimeters.
  margin = text.scan(/^[ \t]*(?!--\n|\+\+\n)(?=[^ \t\n])/).inject do |current_margin, next_indent|
    if next_indent.start_with?(current_margin)
      current_margin
    elsif current_margin.start_with?(next_indent)
      next_indent
    else
      ""
    end
  end

  text.gsub(/^#{margin}/, ' ' * left_padding)
end