module Pry::Helpers::CommandHelpers - pry-0.10.1 Documentation

# 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 125
    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 133
    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 47
    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 24
    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 18
    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 103
    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 112
    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 116
    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

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 98
    def restrict_to_lines(content, lines)
      line_range = one_index_range_or_number(lines)
      Array(content.lines.to_a[line_range]).join
    end

set_file_and_dir_locals(file_name, _pry_=_pry_(), target=target()) click to toggle source

    # File lib/pry/helpers/command_helpers.rb, line 145
    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

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