class Pry::Command::WatchExpression
def add_expression
def add_expression expressions << Expression.new(pry_instance, target, arg_string) output.puts "Watching #{Code.new(arg_string).highlighted}" end
def add_hook
def add_hook hook = %i[after_eval watch_expression] return if pry_instance.hooks.hook_exists?(*hook) pry_instance.hooks.add_hook(*hook) do |_, pry_instance| eval_and_print_changed pry_instance.output end end
def delete(index)
def delete(index) if index output.puts "Deleting watch expression ##{index}: #{expressions[index - 1]}" expressions.delete_at(index - 1) else output.puts "Deleting all watched expressions" expressions.clear end end
def eval_and_print_changed(output)
def eval_and_print_changed(output) expressions.each do |expr| expr.eval! output.puts "#{blue 'watch'}: #{expr}" if expr.changed? end end
def expressions
def expressions state.watch_expressions ||= [] end
def list
def list if expressions.empty? output.puts "No watched expressions" else pry_instance.pager.open do |pager| pager.puts "Listing all watched expressions:" pager.puts "" expressions.each_with_index do |expr, index| pager.print with_line_numbers(expr.to_s, index + 1) end pager.puts "" end end end
def options(opt)
def options(opt) opt.on :d, :delete, "Delete the watch expression with the given index. If no index " \ "is given; clear all watch expressions.", optional_argument: true, as: Integer opt.on :l, :list, "Show all current watch expressions and their values. Calling " \ "watch with no expressions or options will also show the watch " \ "expressions." end
def process
def process if opts.present?(:delete) delete opts[:delete] elsif opts.present?(:list) || args.empty? list else add_hook add_expression end end