class Pry::Command::Edit

Public Instance Methods

apply_runtime_patch() click to toggle source
# File lib/pry/commands/edit.rb, line 81
def apply_runtime_patch
  if patch_exception?
    ExceptionPatcher.new(_pry_, state, file_and_line_for_current_exception).perform_patch
  else
    if code_object.is_a?(Pry::Method)
      MethodPatcher.new(_pry_, code_object).perform_patch
    else
      raise NotImplementedError, "Cannot yet patch #{code_object} objects!"
    end
  end
end
bad_option_combination?() click to toggle source
# File lib/pry/commands/edit.rb, line 150
def bad_option_combination?
  [opts.present?(:ex), opts.present?(:temp),
   opts.present?(:in), opts.present?(:method), !filename_argument.empty?].count(true) > 1
end
code_object() click to toggle source
# File lib/pry/commands/edit.rb, line 136
def code_object
  @code_object ||= !probably_a_file?(filename_argument) &&
    Pry::CodeObject.lookup(filename_argument, _pry_)
end
complete(search) click to toggle source
# File lib/pry/commands/edit.rb, line 201
def complete(search)
  super + Bond::Rc.files(search.split(" ").last || '')
end
ensure_file_name_is_valid(file_name) click to toggle source
# File lib/pry/commands/edit.rb, line 93
def ensure_file_name_is_valid(file_name)
  raise CommandError, "Cannot find a valid file for #{filename_argument}" if !file_name
  raise CommandError, "#{file_name} is not a valid file name, cannot edit!" if not_a_real_file?(file_name)
end
file_and_line() click to toggle source
# File lib/pry/commands/edit.rb, line 102
def file_and_line
  file_name, line = if opts.present?(:current)
                      FileAndLineLocator.from_binding(target)
                    elsif opts.present?(:ex)
                      file_and_line_for_current_exception
                    elsif code_object
                      FileAndLineLocator.from_code_object(code_object, filename_argument)
                    else
                      # when file and line are passed as a single arg, e.g my_file.rb:30
                      FileAndLineLocator.from_filename_argument(filename_argument)
                    end

  [file_name, opts.present?(:line) ? opts[:l].to_i : line]
end
file_and_line_for_current_exception() click to toggle source
# File lib/pry/commands/edit.rb, line 98
def file_and_line_for_current_exception
  FileAndLineLocator.from_exception(_pry_.last_exception, opts[:ex].to_i)
end
file_based_exception?() click to toggle source
# File lib/pry/commands/edit.rb, line 73
def file_based_exception?
  opts.present?(:ex) && !opts.present?(:patch)
end
file_edit() click to toggle source
# File lib/pry/commands/edit.rb, line 117
def file_edit
  file_name, line = file_and_line

  ensure_file_name_is_valid(file_name)

  Pry::Editor.invoke_editor(file_name, line, reload?(file_name))
  set_file_and_dir_locals(file_name)

  if reload?(file_name)
    silence_warnings do
      TOPLEVEL_BINDING.eval(File.read(file_name), file_name)
    end
  end
end
filename_argument() click to toggle source
# File lib/pry/commands/edit.rb, line 132
def filename_argument
  args.join(' ')
end
initial_temp_file_content() click to toggle source
# File lib/pry/commands/edit.rb, line 183
def initial_temp_file_content
  case
  when opts.present?(:temp)
    ""
  when opts.present?(:in)
    input_expression
  when eval_string.strip != ""
    eval_string
  else
    _pry_.input_array.reverse_each.find { |x| x && x.strip != "" } || ""
  end
end
input_expression() click to toggle source
# File lib/pry/commands/edit.rb, line 155
def input_expression
  case opts[:i]
  when Range
    (_pry_.input_array[opts[:i]] || []).join
  when Fixnum
    _pry_.input_array[opts[:i]] || ""
  else
    raise Pry::CommandError, "Not a valid range: #{opts[:i]}"
  end
end
never_reload?() click to toggle source
# File lib/pry/commands/edit.rb, line 170
def never_reload?
  opts.present?(:'no-reload') || Pry.config.disable_auto_reload
end
options(opt) click to toggle source
# File lib/pry/commands/edit.rb, line 26
def options(opt)
  opt.on :e, :ex,      "Open the file that raised the most recent exception (_ex_.file)",
                       :optional_argument => true, :as => Integer
  opt.on :i, :in,      "Open a temporary file containing the Nth input expression. N may be a range",
                       :optional_argument => true, :as => Range, :default => -1..-1
  opt.on :t, :temp,    "Open an empty temporary file"
  opt.on :l, :line,    "Jump to this line in the opened file",
                       :argument => true, :as => Integer
  opt.on :n, :"no-reload", "Don't automatically reload the edited code"
  opt.on :c, :current, "Open the current __FILE__ and at __LINE__ (as returned by `whereami`)"
  opt.on :r, :reload,  "Reload the edited code immediately (default for ruby files)"
  opt.on :p, :patch,   "Instead of editing the object's file, try to edit in a tempfile and apply as a monkey patch"
  opt.on :m, :method,  "Explicitly edit the _current_ method (when inside a method context)."
end
patch_exception?() click to toggle source
# File lib/pry/commands/edit.rb, line 146
def patch_exception?
  opts.present?(:ex) && opts.present?(:patch)
end
probably_a_file?(str) click to toggle source
# File lib/pry/commands/edit.rb, line 196
def probably_a_file?(str)
  [".rb", ".c", ".py", ".yml", ".gemspec"].include? File.extname(str) ||
    str =~ /\/|\/
end
process() click to toggle source
# File lib/pry/commands/edit.rb, line 41
def process
  if bad_option_combination?
    raise CommandError, "Only one of --ex, --temp, --in, --method and FILE may be specified."
  end

  if repl_edit?
    # code defined in pry, eval'd within pry.
    repl_edit
  elsif runtime_patch?
    # patch code without persisting changes
    apply_runtime_patch
  else
    # code stored in actual files, eval'd at top-level
    file_edit
  end
end
pry_method?(code_object) click to toggle source
# File lib/pry/commands/edit.rb, line 141
def pry_method?(code_object)
  code_object.is_a?(Pry::Method) &&
    code_object.pry_method?
end
reload?(file_name="") click to toggle source
# File lib/pry/commands/edit.rb, line 179
def reload?(file_name="")
  (reloadable? || file_name.end_with?(".rb")) && !never_reload?
end
reloadable?() click to toggle source
# File lib/pry/commands/edit.rb, line 166
def reloadable?
  opts.present?(:reload) || opts.present?(:ex)
end
repl_edit() click to toggle source
# File lib/pry/commands/edit.rb, line 63
def repl_edit
  content = Pry::Editor.edit_tempfile_with_content(initial_temp_file_content,
                                                   initial_temp_file_content.lines.count)
  if repl_reload?
    silence_warnings do
      eval_string.replace content
    end
  end
end
repl_edit?() click to toggle source
# File lib/pry/commands/edit.rb, line 58
def repl_edit?
  !opts.present?(:ex) && !opts.present?(:current) && !opts.present?(:method) &&
    filename_argument.empty?
end
repl_reload?() click to toggle source

conditions much less strict than for reload? (which is for file-based reloads)

# File lib/pry/commands/edit.rb, line 175
def repl_reload?
  !never_reload?
end
runtime_patch?() click to toggle source
# File lib/pry/commands/edit.rb, line 77
def runtime_patch?
   !file_based_exception? && (opts.present?(:patch) || pry_method?(code_object))
end