class Pry::Command::Edit
Public Instance Methods
apply_runtime_patch()
click to toggle source
# File lib/pry/commands/edit.rb, line 78 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) code_object.redefine Pry::Editor.new(_pry_).edit_tempfile_with_content(code_object.source) 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 147 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 133 def code_object @code_object ||= !probably_a_file?(filename_argument) && Pry::CodeObject.lookup(filename_argument, _pry_) end
ensure_file_name_is_valid(file_name)
click to toggle source
# File lib/pry/commands/edit.rb, line 90 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 99 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 95 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 70 def file_based_exception? opts.present?(:ex) && !opts.present?(:patch) end
file_edit()
click to toggle source
# File lib/pry/commands/edit.rb, line 114 def file_edit file_name, line = file_and_line ensure_file_name_is_valid(file_name) Pry::Editor.new(_pry_).invoke_editor(file_name, line, reload?(file_name)) set_file_and_dir_locals(file_name) if reload?(file_name) silence_warnings do load file_name end end end
filename_argument()
click to toggle source
# File lib/pry/commands/edit.rb, line 129 def filename_argument args.join(' ') end
initial_temp_file_content()
click to toggle source
# File lib/pry/commands/edit.rb, line 175 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 152 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 167 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 25 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 file" 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 143 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 188 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 40 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 138 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 171 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 163 def reloadable? opts.present?(:reload) || opts.present?(:ex) end
repl_edit()
click to toggle source
# File lib/pry/commands/edit.rb, line 62 def repl_edit content = Pry::Editor.new(_pry_).edit_tempfile_with_content(initial_temp_file_content, initial_temp_file_content.lines.count) silence_warnings do eval_string.replace content end end
repl_edit?()
click to toggle source
# File lib/pry/commands/edit.rb, line 57 def repl_edit? !opts.present?(:ex) && !opts.present?(:current) && !opts.present?(:method) && filename_argument.empty? end
runtime_patch?()
click to toggle source
# File lib/pry/commands/edit.rb, line 74 def runtime_patch? !file_based_exception? && (opts.present?(:patch) || pry_method?(code_object)) end