pry 0.9.8pre3-i386-mswin32 → 0.9.8pre5-i386-mswin32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/pry/cli.rb +1 -1
 - data/lib/pry/command.rb +34 -9
 - data/lib/pry/command_set.rb +8 -4
 - data/lib/pry/default_commands/context.rb +1 -4
 - data/lib/pry/default_commands/documentation.rb +15 -10
 - data/lib/pry/default_commands/input.rb +1 -1
 - data/lib/pry/extended_commands/user_command_api.rb +84 -27
 - data/lib/pry/hooks.rb +55 -1
 - data/lib/pry/method.rb +12 -0
 - data/lib/pry/pry_class.rb +6 -2
 - data/lib/pry/pry_instance.rb +25 -16
 - data/lib/pry/version.rb +1 -1
 - data/pry.gemspec +13 -13
 - data/test/test_command_integration.rb +512 -0
 - data/test/test_default_commands/test_context.rb +9 -2
 - data/test/test_hooks.rb +200 -0
 - data/test/test_pry.rb +25 -899
 - data/test/test_pry_defaults.rb +380 -0
 - data/test/test_syntax_checking.rb +16 -0
 - metadata +74 -76
 
    
        data/lib/pry/cli.rb
    CHANGED
    
    | 
         @@ -14,7 +14,7 @@ class Pry 
     | 
|
| 
       14 
14 
     | 
    
         
             
                  # @return [Array] The Procs that process the parsed options.
         
     | 
| 
       15 
15 
     | 
    
         
             
                  attr_accessor :option_processors
         
     | 
| 
       16 
16 
     | 
    
         | 
| 
       17 
     | 
    
         
            -
                  # Add another set of CLI options
         
     | 
| 
      
 17 
     | 
    
         
            +
                  # Add another set of CLI options (a Slop block)
         
     | 
| 
       18 
18 
     | 
    
         
             
                  def add_options(&block)
         
     | 
| 
       19 
19 
     | 
    
         
             
                    if options
         
     | 
| 
       20 
20 
     | 
    
         
             
                      old_options = options
         
     | 
    
        data/lib/pry/command.rb
    CHANGED
    
    | 
         @@ -14,12 +14,34 @@ class Pry 
     | 
|
| 
       14 
14 
     | 
    
         
             
                # Properties of the command itself (as passed as arguments to
         
     | 
| 
       15 
15 
     | 
    
         
             
                # {CommandSet#command} or {CommandSet#command_class}).
         
     | 
| 
       16 
16 
     | 
    
         
             
                class << self
         
     | 
| 
      
 17 
     | 
    
         
            +
                  attr_accessor :block
         
     | 
| 
       17 
18 
     | 
    
         
             
                  attr_accessor :name
         
     | 
| 
       18 
19 
     | 
    
         
             
                  attr_accessor :description
         
     | 
| 
       19 
     | 
    
         
            -
                  attr_accessor : 
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
      
 20 
     | 
    
         
            +
                  attr_accessor :command_options
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                  # Define or get the command's description
         
     | 
| 
      
 23 
     | 
    
         
            +
                  def description(arg=nil)
         
     | 
| 
      
 24 
     | 
    
         
            +
                    @description = arg if arg
         
     | 
| 
      
 25 
     | 
    
         
            +
                    @description
         
     | 
| 
      
 26 
     | 
    
         
            +
                  end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                  # Define or get the command's options
         
     | 
| 
      
 29 
     | 
    
         
            +
                  def command_options(arg=nil)
         
     | 
| 
      
 30 
     | 
    
         
            +
                    @command_options = arg if arg
         
     | 
| 
      
 31 
     | 
    
         
            +
                    @command_options
         
     | 
| 
      
 32 
     | 
    
         
            +
                  end
         
     | 
| 
      
 33 
     | 
    
         
            +
                  # backward compatibility
         
     | 
| 
      
 34 
     | 
    
         
            +
                  alias_method :options, :command_options
         
     | 
| 
      
 35 
     | 
    
         
            +
                  alias_method :options=, :command_options=
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
                  # Define or get the command's banner
         
     | 
| 
      
 38 
     | 
    
         
            +
                  def banner(arg=nil)
         
     | 
| 
      
 39 
     | 
    
         
            +
                    @banner = arg if arg
         
     | 
| 
      
 40 
     | 
    
         
            +
                    @banner || description
         
     | 
| 
      
 41 
     | 
    
         
            +
                  end
         
     | 
| 
       21 
42 
     | 
    
         
             
                end
         
     | 
| 
       22 
43 
     | 
    
         | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
       23 
45 
     | 
    
         
             
                # Make those properties accessible to instances
         
     | 
| 
       24 
46 
     | 
    
         
             
                def name; self.class.name; end
         
     | 
| 
       25 
47 
     | 
    
         
             
                def description; self.class.description; end
         
     | 
| 
         @@ -47,7 +69,7 @@ class Pry 
     | 
|
| 
       47 
69 
     | 
    
         
             
                    klass.send(:include, helpers)
         
     | 
| 
       48 
70 
     | 
    
         
             
                    klass.name = name
         
     | 
| 
       49 
71 
     | 
    
         
             
                    klass.description = description
         
     | 
| 
       50 
     | 
    
         
            -
                    klass. 
     | 
| 
      
 72 
     | 
    
         
            +
                    klass.command_options = options
         
     | 
| 
       51 
73 
     | 
    
         
             
                    klass.block = block
         
     | 
| 
       52 
74 
     | 
    
         
             
                    klass
         
     | 
| 
       53 
75 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -276,10 +298,19 @@ class Pry 
     | 
|
| 
       276 
298 
     | 
    
         
             
                # backwards compatibility
         
     | 
| 
       277 
299 
     | 
    
         
             
                alias_method :opts, :context
         
     | 
| 
       278 
300 
     | 
    
         | 
| 
      
 301 
     | 
    
         
            +
                # Call the block that was registered with this command.
         
     | 
| 
      
 302 
     | 
    
         
            +
                #
         
     | 
| 
      
 303 
     | 
    
         
            +
                # @param *String  the arguments passed
         
     | 
| 
      
 304 
     | 
    
         
            +
                # @return Object  the return value of the block
         
     | 
| 
       279 
305 
     | 
    
         
             
                def call(*args)
         
     | 
| 
       280 
306 
     | 
    
         
             
                  instance_exec(*correct_arg_arity(block.arity, args), &block)
         
     | 
| 
       281 
307 
     | 
    
         
             
                end
         
     | 
| 
       282 
308 
     | 
    
         | 
| 
      
 309 
     | 
    
         
            +
                # Fix the number of arguments we pass to a block to avoid arity warnings.
         
     | 
| 
      
 310 
     | 
    
         
            +
                #
         
     | 
| 
      
 311 
     | 
    
         
            +
                # @param Number  the arity of the block
         
     | 
| 
      
 312 
     | 
    
         
            +
                # @param Array   the arguments to pass
         
     | 
| 
      
 313 
     | 
    
         
            +
                # @return Array  a (possibly shorter) array of the arguments to pass
         
     | 
| 
       283 
314 
     | 
    
         
             
                def correct_arg_arity(arity, args)
         
     | 
| 
       284 
315 
     | 
    
         
             
                  case
         
     | 
| 
       285 
316 
     | 
    
         
             
                  when arity < 0
         
     | 
| 
         @@ -304,12 +335,6 @@ class Pry 
     | 
|
| 
       304 
335 
     | 
    
         
             
              # necessary, you can also override {setup} which will be called before {options}, for example to
         
     | 
| 
       305 
336 
     | 
    
         
             
              # require any gems your command needs to run, or to set up state.
         
     | 
| 
       306 
337 
     | 
    
         
             
              class ClassCommand < Command
         
     | 
| 
       307 
     | 
    
         
            -
                class << self
         
     | 
| 
       308 
     | 
    
         
            -
                  def banner(arg=nil)
         
     | 
| 
       309 
     | 
    
         
            -
                    @banner = arg if arg
         
     | 
| 
       310 
     | 
    
         
            -
                    @banner || description
         
     | 
| 
       311 
     | 
    
         
            -
                  end
         
     | 
| 
       312 
     | 
    
         
            -
                end
         
     | 
| 
       313 
338 
     | 
    
         | 
| 
       314 
339 
     | 
    
         
             
                attr_accessor :opts
         
     | 
| 
       315 
340 
     | 
    
         
             
                attr_accessor :args
         
     | 
    
        data/lib/pry/command_set.rb
    CHANGED
    
    | 
         @@ -81,11 +81,13 @@ class Pry 
     | 
|
| 
       81 
81 
     | 
    
         
             
                #   # hello john, nice number: 10
         
     | 
| 
       82 
82 
     | 
    
         
             
                #   # pry(main)> help number
         
     | 
| 
       83 
83 
     | 
    
         
             
                #   # number-N regex command
         
     | 
| 
       84 
     | 
    
         
            -
                def  
     | 
| 
      
 84 
     | 
    
         
            +
                def block_command(name, description="No description.", options={}, &block)
         
     | 
| 
      
 85 
     | 
    
         
            +
                  description, options = ["No description.", description] if description.is_a?(Hash)
         
     | 
| 
       85 
86 
     | 
    
         
             
                  options = default_options(name).merge!(options)
         
     | 
| 
       86 
87 
     | 
    
         | 
| 
       87 
88 
     | 
    
         
             
                  commands[name] = Pry::BlockCommand.subclass(name, description, options, helper_module, &block)
         
     | 
| 
       88 
89 
     | 
    
         
             
                end
         
     | 
| 
      
 90 
     | 
    
         
            +
                alias_method :command, :block_command
         
     | 
| 
       89 
91 
     | 
    
         | 
| 
       90 
92 
     | 
    
         
             
                # Defines a new Pry command class.
         
     | 
| 
       91 
93 
     | 
    
         
             
                #
         
     | 
| 
         @@ -96,7 +98,7 @@ class Pry 
     | 
|
| 
       96 
98 
     | 
    
         
             
                # @param &Block  The class body's definition.
         
     | 
| 
       97 
99 
     | 
    
         
             
                #
         
     | 
| 
       98 
100 
     | 
    
         
             
                # @example
         
     | 
| 
       99 
     | 
    
         
            -
                #   Pry::Commands. 
     | 
| 
      
 101 
     | 
    
         
            +
                #   Pry::Commands.create_command "echo", "echo's the input", :shellwords => false do
         
     | 
| 
       100 
102 
     | 
    
         
             
                #     def options(opt)
         
     | 
| 
       101 
103 
     | 
    
         
             
                #       opt.banner "Usage: echo [-u | -d] <string to echo>"
         
     | 
| 
       102 
104 
     | 
    
         
             
                #       opt.on :u, :upcase, "ensure the output is all upper-case"
         
     | 
| 
         @@ -112,13 +114,15 @@ class Pry 
     | 
|
| 
       112 
114 
     | 
    
         
             
                #     end
         
     | 
| 
       113 
115 
     | 
    
         
             
                #   end
         
     | 
| 
       114 
116 
     | 
    
         
             
                #
         
     | 
| 
       115 
     | 
    
         
            -
                def  
     | 
| 
      
 117 
     | 
    
         
            +
                def create_command(name, description="No description.", options={}, &block)
         
     | 
| 
      
 118 
     | 
    
         
            +
                  description, options = ["No description.", description] if description.is_a?(Hash)
         
     | 
| 
       116 
119 
     | 
    
         
             
                  options = default_options(name).merge!(options)
         
     | 
| 
       117 
120 
     | 
    
         | 
| 
       118 
121 
     | 
    
         
             
                  commands[name] = Pry::ClassCommand.subclass(name, description, options, helper_module, &block)
         
     | 
| 
       119 
122 
     | 
    
         
             
                  commands[name].class_eval(&block)
         
     | 
| 
       120 
123 
     | 
    
         
             
                  commands[name]
         
     | 
| 
       121 
124 
     | 
    
         
             
                end
         
     | 
| 
      
 125 
     | 
    
         
            +
                alias_method :command_class, :create_command
         
     | 
| 
       122 
126 
     | 
    
         | 
| 
       123 
127 
     | 
    
         
             
                # Execute a block of code before a command is invoked. The block also
         
     | 
| 
       124 
128 
     | 
    
         
             
                # gets access to parameters that will be passed to the command and
         
     | 
| 
         @@ -334,7 +338,7 @@ class Pry 
     | 
|
| 
       334 
338 
     | 
    
         | 
| 
       335 
339 
     | 
    
         
             
                      help_text << commands.map do |key, command|
         
     | 
| 
       336 
340 
     | 
    
         
             
                        if command.description && !command.description.empty?
         
     | 
| 
       337 
     | 
    
         
            -
                          "#{command.options[:listing] 
     | 
| 
      
 341 
     | 
    
         
            +
                          "#{command.options[:listing].to_s.ljust(18)} #{command.description}"
         
     | 
| 
       338 
342 
     | 
    
         
             
                        end
         
     | 
| 
       339 
343 
     | 
    
         
             
                      end.compact.sort.join("\n")
         
     | 
| 
       340 
344 
     | 
    
         | 
| 
         @@ -97,18 +97,24 @@ USAGE 
     | 
|
| 
       97 
97 
     | 
    
         
             
                      opt.on :l, :lines, "Only gist a subset of lines (only works with -m and -f)", :optional => true, :as => Range, :default => 1..-1
         
     | 
| 
       98 
98 
     | 
    
         
             
                      opt.on :i, :in, "Gist entries from Pry's input expression history. Takes an index or range.", :optional => true,
         
     | 
| 
       99 
99 
     | 
    
         
             
                      :as => Range, :default => -5..-1 do |range|
         
     | 
| 
      
 100 
     | 
    
         
            +
                        self.input_ranges ||= []
         
     | 
| 
       100 
101 
     | 
    
         
             
                        input_ranges << absolute_index_range(range, _pry_.input_array.length)
         
     | 
| 
       101 
102 
     | 
    
         
             
                      end
         
     | 
| 
       102 
103 
     | 
    
         
             
                    end
         
     | 
| 
       103 
104 
     | 
    
         | 
| 
       104 
105 
     | 
    
         
             
                    def process
         
     | 
| 
      
 106 
     | 
    
         
            +
                      self.content = ""
         
     | 
| 
      
 107 
     | 
    
         
            +
             
     | 
| 
       105 
108 
     | 
    
         
             
                      if opts.present?(:in)
         
     | 
| 
       106 
109 
     | 
    
         
             
                        in_option
         
     | 
| 
       107 
     | 
    
         
            -
                       
     | 
| 
      
 110 
     | 
    
         
            +
                      end
         
     | 
| 
      
 111 
     | 
    
         
            +
                      if opts.present?(:file)
         
     | 
| 
       108 
112 
     | 
    
         
             
                        file_option
         
     | 
| 
       109 
     | 
    
         
            -
                       
     | 
| 
      
 113 
     | 
    
         
            +
                      end
         
     | 
| 
      
 114 
     | 
    
         
            +
                      if opts.present?(:doc)
         
     | 
| 
       110 
115 
     | 
    
         
             
                        doc_option
         
     | 
| 
       111 
     | 
    
         
            -
                       
     | 
| 
      
 116 
     | 
    
         
            +
                      end
         
     | 
| 
      
 117 
     | 
    
         
            +
                      if opts.present?(:method)
         
     | 
| 
       112 
118 
     | 
    
         
             
                        method_option
         
     | 
| 
       113 
119 
     | 
    
         
             
                      end
         
     | 
| 
       114 
120 
     | 
    
         | 
| 
         @@ -117,7 +123,6 @@ USAGE 
     | 
|
| 
       117 
123 
     | 
    
         | 
| 
       118 
124 
     | 
    
         
             
                    def in_option
         
     | 
| 
       119 
125 
     | 
    
         
             
                      self.code_type = :ruby
         
     | 
| 
       120 
     | 
    
         
            -
                      self.content = ""
         
     | 
| 
       121 
126 
     | 
    
         | 
| 
       122 
127 
     | 
    
         
             
                      input_ranges.each do |range|
         
     | 
| 
       123 
128 
     | 
    
         
             
                        input_expressions = _pry_.input_array[range] || []
         
     | 
| 
         @@ -136,19 +141,19 @@ USAGE 
     | 
|
| 
       136 
141 
     | 
    
         
             
                    def file_option
         
     | 
| 
       137 
142 
     | 
    
         
             
                      whole_file = File.read(File.expand_path(opts[:f]))
         
     | 
| 
       138 
143 
     | 
    
         
             
                      if opts.present?(:lines)
         
     | 
| 
       139 
     | 
    
         
            -
                        self.content  
     | 
| 
      
 144 
     | 
    
         
            +
                        self.content << restrict_to_lines(whole_file, opts[:l])
         
     | 
| 
       140 
145 
     | 
    
         
             
                      else
         
     | 
| 
       141 
     | 
    
         
            -
                        self.content  
     | 
| 
      
 146 
     | 
    
         
            +
                        self.content << whole_file
         
     | 
| 
       142 
147 
     | 
    
         
             
                      end
         
     | 
| 
       143 
148 
     | 
    
         
             
                    end
         
     | 
| 
       144 
149 
     | 
    
         | 
| 
       145 
150 
     | 
    
         
             
                    def doc_option
         
     | 
| 
       146 
151 
     | 
    
         
             
                      meth = get_method_or_raise(opts[:d], target, {})
         
     | 
| 
       147 
     | 
    
         
            -
                      self.content  
     | 
| 
      
 152 
     | 
    
         
            +
                      self.content << meth.doc
         
     | 
| 
       148 
153 
     | 
    
         
             
                      self.code_type = meth.source_type
         
     | 
| 
       149 
154 
     | 
    
         | 
| 
       150 
155 
     | 
    
         
             
                      text.no_color do
         
     | 
| 
       151 
     | 
    
         
            -
                        self.content  
     | 
| 
      
 156 
     | 
    
         
            +
                        self.content << process_comment_markup(self.content, self.code_type)
         
     | 
| 
       152 
157 
     | 
    
         
             
                      end
         
     | 
| 
       153 
158 
     | 
    
         
             
                      self.code_type = :plain
         
     | 
| 
       154 
159 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -157,9 +162,9 @@ USAGE 
     | 
|
| 
       157 
162 
     | 
    
         
             
                      meth = get_method_or_raise(opts[:m], target, {})
         
     | 
| 
       158 
163 
     | 
    
         
             
                      method_source = meth.source
         
     | 
| 
       159 
164 
     | 
    
         
             
                      if opts.present?(:lines)
         
     | 
| 
       160 
     | 
    
         
            -
                        self.content  
     | 
| 
      
 165 
     | 
    
         
            +
                        self.content << restrict_to_lines(method_source, opts[:l])
         
     | 
| 
       161 
166 
     | 
    
         
             
                      else
         
     | 
| 
       162 
     | 
    
         
            -
                        self.content  
     | 
| 
      
 167 
     | 
    
         
            +
                        self.content << method_source
         
     | 
| 
       163 
168 
     | 
    
         
             
                      end
         
     | 
| 
       164 
169 
     | 
    
         | 
| 
       165 
170 
     | 
    
         
             
                      self.code_type = meth.source_type
         
     | 
| 
         @@ -9,7 +9,7 @@ class Pry 
     | 
|
| 
       9 
9 
     | 
    
         
             
                  end
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
11 
     | 
    
         
             
                  command "show-input", "Show the contents of the input buffer for the current multi-line expression." do
         
     | 
| 
       12 
     | 
    
         
            -
                    render_output(false, 1,  
     | 
| 
      
 12 
     | 
    
         
            +
                    render_output(false, 1, colorize_code(eval_string))
         
     | 
| 
       13 
13 
     | 
    
         
             
                  end
         
     | 
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         
             
                  command(/amend-line(?: (-?\d+)(?:\.\.(-?\d+))?)?/, "Amend a line of input in multi-line mode. Type `amend-line --help` for more information. Aliases %",
         
     | 
| 
         @@ -19,45 +19,102 @@ class Pry 
     | 
|
| 
       19 
19 
     | 
    
         | 
| 
       20 
20 
     | 
    
         
             
                  end
         
     | 
| 
       21 
21 
     | 
    
         | 
| 
       22 
     | 
    
         
            -
                   
     | 
| 
       23 
     | 
    
         
            -
                     
     | 
| 
       24 
     | 
    
         
            -
                       
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
      
 22 
     | 
    
         
            +
                  command_class "reload-command", "Reload a Pry command." do
         
     | 
| 
      
 23 
     | 
    
         
            +
                    banner <<-BANNER
         
     | 
| 
      
 24 
     | 
    
         
            +
                      Usage: reload-command command
         
     | 
| 
      
 25 
     | 
    
         
            +
                      Reload a Pry command.
         
     | 
| 
      
 26 
     | 
    
         
            +
                    BANNER
         
     | 
| 
       26 
27 
     | 
    
         | 
| 
       27 
     | 
    
         
            -
                     
     | 
| 
       28 
     | 
    
         
            -
                       
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
      
 28 
     | 
    
         
            +
                    def process
         
     | 
| 
      
 29 
     | 
    
         
            +
                      command = _pry_.commands.find_command(args.first)
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                      if command.nil?
         
     | 
| 
      
 32 
     | 
    
         
            +
                        raise Pry::CommandError, 'No command found.'
         
     | 
| 
      
 33 
     | 
    
         
            +
                      end
         
     | 
| 
       30 
34 
     | 
    
         | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
      
 35 
     | 
    
         
            +
                      source_code = command.block.source
         
     | 
| 
      
 36 
     | 
    
         
            +
                      file, lineno = command.block.source_location
         
     | 
| 
       33 
37 
     | 
    
         | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
      
 38 
     | 
    
         
            +
                      set = Pry::CommandSet.new do
         
     | 
| 
      
 39 
     | 
    
         
            +
                        eval(source_code, binding, file, lineno)
         
     | 
| 
      
 40 
     | 
    
         
            +
                      end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                      _pry_.commands.delete(command.name)
         
     | 
| 
      
 43 
     | 
    
         
            +
                      _pry_.commands.import(set)
         
     | 
| 
       36 
44 
     | 
    
         
             
                    end
         
     | 
| 
       37 
     | 
    
         
            -
                    Pry.config.commands.import target.eval(set_name)
         
     | 
| 
       38 
     | 
    
         
            -
                    _pry_.commands.import target.eval(set_name)
         
     | 
| 
       39 
     | 
    
         
            -
                    set_file_and_dir_locals(file_name)
         
     | 
| 
       40 
45 
     | 
    
         
             
                  end
         
     | 
| 
       41 
46 
     | 
    
         | 
| 
       42 
     | 
    
         
            -
                   
     | 
| 
       43 
     | 
    
         
            -
                     
     | 
| 
       44 
     | 
    
         
            -
                       
     | 
| 
      
 47 
     | 
    
         
            +
                  command_class "edit-command", "Edit a Pry command." do
         
     | 
| 
      
 48 
     | 
    
         
            +
                    banner <<-BANNER
         
     | 
| 
      
 49 
     | 
    
         
            +
                      Usage: edit-command [options] command
         
     | 
| 
      
 50 
     | 
    
         
            +
                      Edit a Pry command.
         
     | 
| 
      
 51 
     | 
    
         
            +
                    BANNER
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
                    def initialize env
         
     | 
| 
      
 54 
     | 
    
         
            +
                      @pry = env[:pry_instance]
         
     | 
| 
      
 55 
     | 
    
         
            +
                      @command = nil
         
     | 
| 
      
 56 
     | 
    
         
            +
                      super(env)
         
     | 
| 
       45 
57 
     | 
    
         
             
                    end
         
     | 
| 
       46 
58 
     | 
    
         | 
| 
       47 
     | 
    
         
            -
                     
     | 
| 
       48 
     | 
    
         
            -
                       
     | 
| 
      
 59 
     | 
    
         
            +
                    def options(opt)
         
     | 
| 
      
 60 
     | 
    
         
            +
                      opt.on :p, :patch, 'Perform a in-memory edit of a command'
         
     | 
| 
      
 61 
     | 
    
         
            +
                    end
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
                    def process
         
     | 
| 
      
 64 
     | 
    
         
            +
                      @command = @pry.commands.find_command(args.first)
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                      if @command.nil?
         
     | 
| 
      
 67 
     | 
    
         
            +
                        raise Pry::CommandError, 'Command not found.'
         
     | 
| 
      
 68 
     | 
    
         
            +
                      end
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                      case
         
     | 
| 
      
 71 
     | 
    
         
            +
                      when opts.present?(:patch)
         
     | 
| 
      
 72 
     | 
    
         
            +
                        edit_temporarily
         
     | 
| 
      
 73 
     | 
    
         
            +
                      else
         
     | 
| 
      
 74 
     | 
    
         
            +
                        edit_permanently
         
     | 
| 
      
 75 
     | 
    
         
            +
                      end
         
     | 
| 
       49 
76 
     | 
    
         
             
                    end
         
     | 
| 
       50 
77 
     | 
    
         | 
| 
       51 
     | 
    
         
            -
                     
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
      
 78 
     | 
    
         
            +
                    def edit_permanently
         
     | 
| 
      
 79 
     | 
    
         
            +
                      file, lineno = @command.block.source_location
         
     | 
| 
      
 80 
     | 
    
         
            +
                      invoke_editor(file, lineno)
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
                      command_set = silence_warnings do
         
     | 
| 
      
 83 
     | 
    
         
            +
                        eval File.read(file), TOPLEVEL_BINDING, file, 1
         
     | 
| 
      
 84 
     | 
    
         
            +
                      end
         
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
      
 86 
     | 
    
         
            +
                      unless command_set.is_a?(Pry::CommandSet)
         
     | 
| 
      
 87 
     | 
    
         
            +
                        raise Pry::CommandError,
         
     | 
| 
      
 88 
     | 
    
         
            +
                              "Expected file '#{file}' to return a CommandSet"
         
     | 
| 
      
 89 
     | 
    
         
            +
                      end
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
                      @pry.commands.delete(@command.name)
         
     | 
| 
      
 92 
     | 
    
         
            +
                      @pry.commands.import(command_set)
         
     | 
| 
      
 93 
     | 
    
         
            +
                      set_file_and_dir_locals(file)
         
     | 
| 
      
 94 
     | 
    
         
            +
                    end
         
     | 
| 
      
 95 
     | 
    
         
            +
             
     | 
| 
      
 96 
     | 
    
         
            +
                    def edit_temporarily
         
     | 
| 
      
 97 
     | 
    
         
            +
                      source_code = Pry::Method(@command.block).source
         
     | 
| 
      
 98 
     | 
    
         
            +
                      modified_code = nil
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
      
 100 
     | 
    
         
            +
                      temp_file do |f|
         
     | 
| 
      
 101 
     | 
    
         
            +
                        f.write(source_code)
         
     | 
| 
      
 102 
     | 
    
         
            +
                        f.flush
         
     | 
| 
      
 103 
     | 
    
         
            +
             
     | 
| 
      
 104 
     | 
    
         
            +
                        invoke_editor(f.path, 1)
         
     | 
| 
      
 105 
     | 
    
         
            +
                        modified_code = File.read(f.path)
         
     | 
| 
      
 106 
     | 
    
         
            +
                      end
         
     | 
| 
      
 107 
     | 
    
         
            +
             
     | 
| 
      
 108 
     | 
    
         
            +
                      command_set = CommandSet.new do
         
     | 
| 
      
 109 
     | 
    
         
            +
                        silence_warnings do
         
     | 
| 
      
 110 
     | 
    
         
            +
                          pry = Pry.new :input => StringIO.new(modified_code)
         
     | 
| 
      
 111 
     | 
    
         
            +
                          pry.rep(binding)
         
     | 
| 
      
 112 
     | 
    
         
            +
                        end
         
     | 
| 
      
 113 
     | 
    
         
            +
                      end
         
     | 
| 
       53 
114 
     | 
    
         | 
| 
       54 
     | 
    
         
            -
             
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
                      load file_name
         
     | 
| 
      
 115 
     | 
    
         
            +
                      @pry.commands.delete(@command.name)
         
     | 
| 
      
 116 
     | 
    
         
            +
                      @pry.commands.import(command_set)
         
     | 
| 
       57 
117 
     | 
    
         
             
                    end
         
     | 
| 
       58 
     | 
    
         
            -
                    Pry.config.commands.import target.eval(set_name)
         
     | 
| 
       59 
     | 
    
         
            -
                    _pry_.commands.import target.eval(set_name)
         
     | 
| 
       60 
     | 
    
         
            -
                    set_file_and_dir_locals(file_name)
         
     | 
| 
       61 
118 
     | 
    
         
             
                  end
         
     | 
| 
       62 
119 
     | 
    
         | 
| 
       63 
120 
     | 
    
         
             
                end
         
     | 
    
        data/lib/pry/hooks.rb
    CHANGED
    
    | 
         @@ -5,6 +5,58 @@ class Pry 
     | 
|
| 
       5 
5 
     | 
    
         
             
                  @hooks = {}
         
     | 
| 
       6 
6 
     | 
    
         
             
                end
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
      
 8 
     | 
    
         
            +
                # Ensure that duplicates have their @hooks object
         
     | 
| 
      
 9 
     | 
    
         
            +
                def initialize_copy(orig)
         
     | 
| 
      
 10 
     | 
    
         
            +
                  hooks_dup = @hooks.dup
         
     | 
| 
      
 11 
     | 
    
         
            +
                  @hooks.each do |k, v|
         
     | 
| 
      
 12 
     | 
    
         
            +
                    hooks_dup[k] = v.dup
         
     | 
| 
      
 13 
     | 
    
         
            +
                  end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                  @hooks = hooks_dup
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                def hooks
         
     | 
| 
      
 19 
     | 
    
         
            +
                  @hooks
         
     | 
| 
      
 20 
     | 
    
         
            +
                end
         
     | 
| 
      
 21 
     | 
    
         
            +
                protected :hooks
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                # Destructively merge the contents of two `Pry:Hooks` instances.
         
     | 
| 
      
 24 
     | 
    
         
            +
                # @param [Pry::Hooks] other The `Pry::Hooks` instance to merge
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                # TODO: implement by iterating over parameter and only overwriting
         
     | 
| 
      
 29 
     | 
    
         
            +
                # elements in receiver if they exist in parameter, and adding
         
     | 
| 
      
 30 
     | 
    
         
            +
                # other paramater elements to the end of the original's array
         
     | 
| 
      
 31 
     | 
    
         
            +
                def merge!(other)
         
     | 
| 
      
 32 
     | 
    
         
            +
                  @hooks.merge!(other.dup.hooks) do |key, v1, v2|
         
     | 
| 
      
 33 
     | 
    
         
            +
                    merge_arrays(v1, v2)
         
     | 
| 
      
 34 
     | 
    
         
            +
                  end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                  self
         
     | 
| 
      
 37 
     | 
    
         
            +
                end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                def merge_arrays(array1, array2)
         
     | 
| 
      
 40 
     | 
    
         
            +
                  uniq_keeping_last(array1 + array2, &:first)
         
     | 
| 
      
 41 
     | 
    
         
            +
                end
         
     | 
| 
      
 42 
     | 
    
         
            +
                private :merge_arrays
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                def uniq_keeping_last(input, &block)
         
     | 
| 
      
 45 
     | 
    
         
            +
                  hash, output = {}, []
         
     | 
| 
      
 46 
     | 
    
         
            +
                  input.reverse.each{ |i| hash[block[i]] ||= (output.unshift i) }
         
     | 
| 
      
 47 
     | 
    
         
            +
                  output
         
     | 
| 
      
 48 
     | 
    
         
            +
                end
         
     | 
| 
      
 49 
     | 
    
         
            +
                private :uniq_keeping_last
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                # Return a new `Pry::Hooks` instance containing a merge of the contents of two `Pry:Hooks` instances,
         
     | 
| 
      
 52 
     | 
    
         
            +
                # @param [Pry::Hooks] other The `Pry::Hooks` instance to merge
         
     | 
| 
      
 53 
     | 
    
         
            +
                # @return [Pry::Hooks] The new hash.
         
     | 
| 
      
 54 
     | 
    
         
            +
                def merge(other)
         
     | 
| 
      
 55 
     | 
    
         
            +
                  self.dup.tap do |v|
         
     | 
| 
      
 56 
     | 
    
         
            +
                    v.merge!(other)
         
     | 
| 
      
 57 
     | 
    
         
            +
                  end
         
     | 
| 
      
 58 
     | 
    
         
            +
                end
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
       8 
60 
     | 
    
         
             
                # Add a new hook to be executed for the `name` even.
         
     | 
| 
       9 
61 
     | 
    
         
             
                # @param [Symbol] event_name The name of the event.
         
     | 
| 
       10 
62 
     | 
    
         
             
                # @param [Symbol] hook_name The name of the hook.
         
     | 
| 
         @@ -91,10 +143,12 @@ class Pry 
     | 
|
| 
       91 
143 
     | 
    
         | 
| 
       92 
144 
     | 
    
         
             
                # Clear all hooks functions for a given event.
         
     | 
| 
       93 
145 
     | 
    
         
             
                # @param [String] event_name The name of the event.
         
     | 
| 
       94 
     | 
    
         
            -
                def  
     | 
| 
      
 146 
     | 
    
         
            +
                def delete_hooks(event_name)
         
     | 
| 
       95 
147 
     | 
    
         
             
                  @hooks[event_name] = []
         
     | 
| 
       96 
148 
     | 
    
         
             
                end
         
     | 
| 
       97 
149 
     | 
    
         | 
| 
      
 150 
     | 
    
         
            +
                alias_method :clear, :delete_hooks
         
     | 
| 
      
 151 
     | 
    
         
            +
             
     | 
| 
       98 
152 
     | 
    
         
             
                # @param [Symbol] event_name Name of the event.
         
     | 
| 
       99 
153 
     | 
    
         
             
                # @param [Symbol] hook_name Name of the hook.
         
     | 
| 
       100 
154 
     | 
    
         
             
                # @return [Boolean] Whether the hook by the name `hook_name`
         
     | 
    
        data/lib/pry/method.rb
    CHANGED
    
    | 
         @@ -1,5 +1,17 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # -*- coding: utf-8 -*-
         
     | 
| 
       2 
2 
     | 
    
         
             
            class Pry
         
     | 
| 
      
 3 
     | 
    
         
            +
              class << self
         
     | 
| 
      
 4 
     | 
    
         
            +
                # If the given object is a `Pry::Method`, return it unaltered. If it's
         
     | 
| 
      
 5 
     | 
    
         
            +
                # anything else, return it wrapped in a `Pry::Method` instance.
         
     | 
| 
      
 6 
     | 
    
         
            +
                def Method(obj)
         
     | 
| 
      
 7 
     | 
    
         
            +
                  if obj.is_a? Pry::Method
         
     | 
| 
      
 8 
     | 
    
         
            +
                    obj
         
     | 
| 
      
 9 
     | 
    
         
            +
                  else
         
     | 
| 
      
 10 
     | 
    
         
            +
                    Pry::Method.new(obj)
         
     | 
| 
      
 11 
     | 
    
         
            +
                  end
         
     | 
| 
      
 12 
     | 
    
         
            +
                end
         
     | 
| 
      
 13 
     | 
    
         
            +
              end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
       3 
15 
     | 
    
         
             
              class Method
         
     | 
| 
       4 
16 
     | 
    
         
             
                include RbxMethod if Helpers::BaseHelpers.rbx?
         
     | 
| 
       5 
17 
     | 
    
         |