2012-08-11 20:22:29 -04:00
|
|
|
class Pry
|
2012-08-11 21:26:59 -04:00
|
|
|
Pry::Commands.create_command "save-file" do
|
|
|
|
group 'Input and Output'
|
|
|
|
description "Export to a file using content from the REPL."
|
|
|
|
|
2012-08-11 20:22:29 -04:00
|
|
|
banner <<-USAGE
|
|
|
|
Usage: save-file [OPTIONS] [FILE]
|
|
|
|
Save REPL content to a file.
|
|
|
|
e.g: save-file -m my_method -m my_method2 ./hello.rb
|
|
|
|
e.g: save-file -i 1..10 ./hello.rb --append
|
|
|
|
e.g: save-file -k show-method ./my_command.rb
|
|
|
|
e.g: save-file -f sample_file --lines 2..10 ./output_file.rb
|
|
|
|
USAGE
|
|
|
|
|
|
|
|
attr_accessor :content
|
|
|
|
attr_accessor :file_name
|
|
|
|
|
|
|
|
def setup
|
|
|
|
self.content = ""
|
|
|
|
end
|
|
|
|
|
|
|
|
def convert_to_range(n)
|
|
|
|
if !n.is_a?(Range)
|
|
|
|
(n..n)
|
|
|
|
else
|
|
|
|
n
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def options(opt)
|
|
|
|
opt.on :m, :method, "Save a method's source.", :argument => true do |meth_name|
|
|
|
|
meth = get_method_or_raise(meth_name, target, {})
|
|
|
|
self.content << meth.source
|
|
|
|
end
|
|
|
|
opt.on :c, :class, "Save a class's source.", :argument => true do |class_name|
|
|
|
|
mod = Pry::WrappedModule.from_str(class_name, target)
|
|
|
|
self.content << mod.source
|
|
|
|
end
|
|
|
|
opt.on :k, :command, "Save a command's source.", :argument => true do |command_name|
|
|
|
|
command = find_command(command_name)
|
|
|
|
block = Pry::Method.new(command.block)
|
|
|
|
self.content << block.source
|
|
|
|
end
|
|
|
|
opt.on :f, :file, "Save a file.", :argument => true do |file|
|
|
|
|
self.content << File.read(File.expand_path(file))
|
|
|
|
end
|
|
|
|
opt.on :l, :lines, "Only save a subset of lines.", :optional_argument => true, :as => Range, :default => 1..-1
|
|
|
|
opt.on :o, :out, "Save entries from Pry's output result history. Takes an index or range.", :optional_argument => true,
|
|
|
|
:as => Range, :default => -5..-1 do |range|
|
|
|
|
range = convert_to_range(range)
|
|
|
|
|
|
|
|
range.each do |v|
|
|
|
|
self.content << Pry.config.gist.inspecter.call(_pry_.output_array[v])
|
|
|
|
end
|
|
|
|
|
|
|
|
self.content << "\n"
|
|
|
|
end
|
|
|
|
opt.on :i, :in, "Save entries from Pry's input expression history. Takes an index or range.", :optional_argument => true,
|
|
|
|
:as => Range, :default => -5..-1 do |range|
|
|
|
|
input_expressions = _pry_.input_array[range] || []
|
|
|
|
Array(input_expressions).each { |v| self.content << v }
|
|
|
|
end
|
|
|
|
opt.on :a, :append, "Append to the given file instead of overwriting it."
|
|
|
|
end
|
|
|
|
|
|
|
|
def process
|
|
|
|
if args.empty?
|
|
|
|
raise CommandError, "Must specify a file name."
|
|
|
|
end
|
|
|
|
|
|
|
|
self.file_name = File.expand_path(args.first)
|
|
|
|
|
|
|
|
save_file
|
|
|
|
end
|
|
|
|
|
|
|
|
def save_file
|
|
|
|
if self.content.empty?
|
|
|
|
raise CommandError, "Found no code to save."
|
|
|
|
end
|
|
|
|
|
|
|
|
File.open(file_name, mode) do |f|
|
|
|
|
if opts.present?(:lines)
|
|
|
|
f.puts restrict_to_lines(content, opts[:l])
|
|
|
|
else
|
|
|
|
f.puts content
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def mode
|
|
|
|
if opts.present?(:append)
|
|
|
|
"a"
|
|
|
|
else
|
|
|
|
"w"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|