pry 0.9.8pre3-java → 0.9.8pre4-java

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -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 :options
20
- attr_accessor :block
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.options = options
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
@@ -81,11 +81,12 @@ class Pry
81
81
  # # hello john, nice number: 10
82
82
  # # pry(main)> help number
83
83
  # # number-N regex command
84
- def command(name, description="No description.", options={}, &block)
84
+ def block_command(name, description="No description.", options={}, &block)
85
85
  options = default_options(name).merge!(options)
86
86
 
87
87
  commands[name] = Pry::BlockCommand.subclass(name, description, options, helper_module, &block)
88
88
  end
89
+ alias_method :command, :block_command
89
90
 
90
91
  # Defines a new Pry command class.
91
92
  #
@@ -96,7 +97,7 @@ class Pry
96
97
  # @param &Block The class body's definition.
97
98
  #
98
99
  # @example
99
- # Pry::Commands.command_class "echo", "echo's the input", :shellwords => false do
100
+ # Pry::Commands.create_command "echo", "echo's the input", :shellwords => false do
100
101
  # def options(opt)
101
102
  # opt.banner "Usage: echo [-u | -d] <string to echo>"
102
103
  # opt.on :u, :upcase, "ensure the output is all upper-case"
@@ -112,13 +113,14 @@ class Pry
112
113
  # end
113
114
  # end
114
115
  #
115
- def command_class(name, description="No description.", options={}, &block)
116
+ def create_command(name, description="No description.", options={}, &block)
116
117
  options = default_options(name).merge!(options)
117
118
 
118
119
  commands[name] = Pry::ClassCommand.subclass(name, description, options, helper_module, &block)
119
120
  commands[name].class_eval(&block)
120
121
  commands[name]
121
122
  end
123
+ alias_method :command_class, :create_command
122
124
 
123
125
  # Execute a block of code before a command is invoked. The block also
124
126
  # gets access to parameters that will be passed to the command and
@@ -24,10 +24,7 @@ class Pry
24
24
  when "."
25
25
  next
26
26
  when ".."
27
- if stack.one?
28
- _pry_.binding_stack.clear
29
- throw(:breakout)
30
- else
27
+ unless stack.size == 1
31
28
  stack.pop
32
29
  end
33
30
  else
@@ -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
- elsif opts.present?(:file)
110
+ end
111
+ if opts.present?(:file)
108
112
  file_option
109
- elsif opts.present?(:doc)
113
+ end
114
+ if opts.present?(:doc)
110
115
  doc_option
111
- elsif opts.present?(:method)
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 = restrict_to_lines(whole_file, opts[:l])
144
+ self.content << restrict_to_lines(whole_file, opts[:l])
140
145
  else
141
- self.content = whole_file
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 = meth.doc
152
+ self.content << meth.doc
148
153
  self.code_type = meth.source_type
149
154
 
150
155
  text.no_color do
151
- self.content = process_comment_markup(self.content, self.code_type)
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 = restrict_to_lines(method_source, opts[:l])
165
+ self.content << restrict_to_lines(method_source, opts[:l])
161
166
  else
162
- self.content = method_source
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, Pry.color ? CodeRay.scan(eval_string, :ruby).term : eval_string)
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
- command "reload-command", "Reload a command. reload-command CMD_NAME CMD_SET" do |command_name, set_name|
23
- if command_name.nil?
24
- raise CommandError, "Must provide command name"
25
- end
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
- if set_name.nil?
28
- raise CommandError, "Must provide command set name"
29
- end
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
- cmd = Pry.config.commands.commands[command_name]
32
- file_name = cmd.block.source_location.first
35
+ source_code = command.block.source
36
+ file, lineno = command.block.source_location
33
37
 
34
- silence_warnings do
35
- load file_name
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
- command "edit-command", "Edit a command. edit-command CMD_NAME CMD_SET" do |command_name, set_name|
43
- if command_name.nil?
44
- raise CommandError, "Must provide command name"
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
- if set_name.nil?
48
- raise CommandError, "Must provide command set name"
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
- cmd = Pry.config.commands.commands[command_name]
52
- file_name = cmd.block.source_location.first
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
- invoke_editor(*cmd.block.source_location)
55
- silence_warnings do
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
@@ -5,6 +5,59 @@ 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
+ keys = array1.map {|(k,v)| k}
41
+ hash = {}
42
+ array1.each{|(k,v)| hash[k]=v}
43
+ keys.push(*array2.map {|(k,v)| k})
44
+ array2.each{|(k,v)| hash[k]=v}
45
+ result = []
46
+ keys.uniq!
47
+ keys.each{|k| result.push([k,hash[k]]) }
48
+ result
49
+ end
50
+ private :merge_arrays
51
+
52
+ # Return a new `Pry::Hooks` instance containing a merge of the contents of two `Pry:Hooks` instances,
53
+ # @param [Pry::Hooks] other The `Pry::Hooks` instance to merge
54
+ # @return [Pry::Hooks] The new hash.
55
+ def merge(other)
56
+ self.dup.tap do |v|
57
+ v.merge!(other)
58
+ end
59
+ end
60
+
8
61
  # Add a new hook to be executed for the `name` even.
9
62
  # @param [Symbol] event_name The name of the event.
10
63
  # @param [Symbol] hook_name The name of the hook.
@@ -91,10 +144,12 @@ class Pry
91
144
 
92
145
  # Clear all hooks functions for a given event.
93
146
  # @param [String] event_name The name of the event.
94
- def clear(event_name)
147
+ def delete_hooks(event_name)
95
148
  @hooks[event_name] = []
96
149
  end
97
150
 
151
+ alias_method :clear, :delete_hooks
152
+
98
153
  # @param [Symbol] event_name Name of the event.
99
154
  # @param [Symbol] hook_name Name of the hook.
100
155
  # @return [Boolean] Whether the hook by the name `hook_name`
@@ -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
 
@@ -111,9 +111,9 @@ class Pry
111
111
  inject_local("_in_", @input_array, target)
112
112
  inject_local("_out_", @output_array, target)
113
113
  inject_local("_pry_", self, target)
114
- inject_local("_ex_", nil, target)
115
- inject_local("_file_", nil, target)
116
- inject_local("_dir_", nil, target)
114
+ inject_local("_ex_", last_exception, target)
115
+ inject_local("_file_", last_file, target)
116
+ inject_local("_dir_", last_dir, target)
117
117
 
118
118
  # without this line we get 1 test failure, ask Mon_Ouie
119
119
  set_last_result(nil, target)
@@ -129,13 +129,13 @@ class Pry
129
129
 
130
130
  def special_locals
131
131
  {
132
- :_in_ => @input_array,
133
- :_out_ => @output_array,
134
- :_pry_ => self,
135
- :_ex_ => last_exception,
132
+ :_in_ => @input_array,
133
+ :_out_ => @output_array,
134
+ :_pry_ => self,
135
+ :_ex_ => last_exception,
136
136
  :_file_ => last_file,
137
- :_dir_ => last_dir,
138
- :_ => last_result
137
+ :_dir_ => last_dir,
138
+ :_ => last_result
139
139
  }
140
140
  end
141
141
 
@@ -566,7 +566,7 @@ class Pry
566
566
  end
567
567
 
568
568
  # Assert that a line which ends with a , or a \ is incomplete.
569
- str !~ /[,\\]$/
569
+ str !~ /[,\\]\z/
570
570
  rescue SyntaxError => e
571
571
  if incomplete_user_input_exception?(e)
572
572
  false
@@ -1,3 +1,3 @@
1
1
  class Pry
2
- VERSION = "0.9.8pre3"
2
+ VERSION = "0.9.8pre4"
3
3
  end
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "pry"
5
- s.version = "0.9.8pre3"
5
+ s.version = "0.9.8pre4"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["John Mair (banisterfiend)"]
9
- s.date = "2012-01-05"
9
+ s.date = "2012-01-12"
10
10
  s.description = "An IRB alternative and runtime developer console"
11
11
  s.email = "jrmair@gmail.com"
12
12
  s.executables = ["pry"]
@@ -141,8 +141,15 @@ describe "Pry::DefaultCommands::Context" do
141
141
  $outer.should == :outer
142
142
  end
143
143
 
144
- it 'should break out of the repl loop of Pry instance when binding_stack has only one binding with cd ..' do
145
- Pry.start(0, :input => StringIO.new("cd ..")).should == nil
144
+ it "should not leave the REPL session when given 'cd ..'" do
145
+ b = Pry.binding_for(Object.new)
146
+ input = InputTester.new "cd ..", "$obj = self", "exit-all"
147
+
148
+ redirect_pry_io(input, StringIO.new) do
149
+ b.pry
150
+ end
151
+
152
+ $obj.should == b.eval("self")
146
153
  end
147
154
 
148
155
  it 'should break out to outer-most session with cd /' do
@@ -53,6 +53,125 @@ describe Pry::Hooks do
53
53
  end
54
54
  end
55
55
 
56
+ describe "Pry::Hooks#merge" do
57
+ describe "merge!" do
58
+ it 'should merge in the Pry::Hooks' do
59
+ h1 = Pry::Hooks.new.add_hook(:test_hook, :testing) {}
60
+ h2 = Pry::Hooks.new
61
+
62
+ h2.merge!(h1)
63
+ h2.get_hook(:test_hook, :testing).should == h1.get_hook(:test_hook, :testing)
64
+ end
65
+
66
+ it 'should not share merged elements with original' do
67
+ h1 = Pry::Hooks.new.add_hook(:test_hook, :testing) {}
68
+ h2 = Pry::Hooks.new
69
+
70
+ h2.merge!(h1)
71
+ h2.add_hook(:test_hook, :testing2) {}
72
+ h2.get_hook(:test_hook, :testing2).should.not == h1.get_hook(:test_hook, :testing2)
73
+ end
74
+
75
+ it 'should NOT overwrite hooks belonging to shared event in receiver' do
76
+ h1 = Pry::Hooks.new.add_hook(:test_hook, :testing) {}
77
+ callable = proc {}
78
+ h2 = Pry::Hooks.new.add_hook(:test_hook, :testing2, callable)
79
+
80
+ h2.merge!(h1)
81
+ h2.get_hook(:test_hook, :testing2).should == callable
82
+ end
83
+
84
+ it 'should overwrite identical hook in receiver' do
85
+ callable1 = proc { :one }
86
+ h1 = Pry::Hooks.new.add_hook(:test_hook, :testing, callable1)
87
+ callable2 = proc { :two }
88
+ h2 = Pry::Hooks.new.add_hook(:test_hook, :testing, callable2)
89
+
90
+ h2.merge!(h1)
91
+ h2.get_hook(:test_hook, :testing).should == callable1
92
+ h2.hook_count(:test_hook).should == 1
93
+ end
94
+
95
+ it 'should preserve hook order' do
96
+ name = ""
97
+ h1 = Pry::Hooks.new
98
+ h1.add_hook(:test_hook, :testing3) { name << "h" }
99
+ h1.add_hook(:test_hook, :testing4) { name << "n" }
100
+
101
+ h2 = Pry::Hooks.new
102
+ h2.add_hook(:test_hook, :testing1) { name << "j" }
103
+ h2.add_hook(:test_hook, :testing2) { name << "o" }
104
+
105
+ h2.merge!(h1)
106
+ h2.exec_hook(:test_hook)
107
+
108
+ name.should == "john"
109
+ end
110
+
111
+ describe "merge" do
112
+ it 'should return a fresh, independent instance' do
113
+ h1 = Pry::Hooks.new.add_hook(:test_hook, :testing) {}
114
+ h2 = Pry::Hooks.new
115
+
116
+ h3 = h2.merge(h1)
117
+ h3.should.not == h1
118
+ h3.should.not == h2
119
+ end
120
+
121
+ it 'should contain hooks from original instance' do
122
+ h1 = Pry::Hooks.new.add_hook(:test_hook, :testing) {}
123
+ h2 = Pry::Hooks.new.add_hook(:test_hook2, :testing) {}
124
+
125
+ h3 = h2.merge(h1)
126
+ h3.get_hook(:test_hook, :testing).should == h1.get_hook(:test_hook, :testing)
127
+ h3.get_hook(:test_hook2, :testing).should == h2.get_hook(:test_hook2, :testing)
128
+ end
129
+
130
+ it 'should not affect original instances when new hooks are added' do
131
+ h1 = Pry::Hooks.new.add_hook(:test_hook, :testing) {}
132
+ h2 = Pry::Hooks.new.add_hook(:test_hook2, :testing) {}
133
+
134
+ h3 = h2.merge(h1)
135
+ h3.add_hook(:test_hook3, :testing) {}
136
+
137
+ h1.get_hook(:test_hook3, :testing).should == nil
138
+ h2.get_hook(:test_hook3, :testing).should == nil
139
+ end
140
+ end
141
+
142
+ end
143
+ end
144
+
145
+ describe "dupping a Pry::Hooks instance" do
146
+ it 'should share hooks with original' do
147
+ @hooks.add_hook(:test_hook, :testing) do
148
+ :none_such
149
+ end
150
+
151
+ hooks_dup = @hooks.dup
152
+ hooks_dup.get_hook(:test_hook, :testing).should == @hooks.get_hook(:test_hook, :testing)
153
+ end
154
+
155
+ it 'adding a new event to dupped instance should not affect original' do
156
+ @hooks.add_hook(:test_hook, :testing) { :none_such }
157
+ hooks_dup = @hooks.dup
158
+
159
+ hooks_dup.add_hook(:other_test_hook, :testing) { :okay_man }
160
+
161
+ hooks_dup.get_hook(:other_test_hook, :testing).should.not == @hooks.get_hook(:other_test_hook, :testing)
162
+ end
163
+
164
+ it 'adding a new hook to dupped instance should not affect original' do
165
+ @hooks.add_hook(:test_hook, :testing) { :none_such }
166
+ hooks_dup = @hooks.dup
167
+
168
+ hooks_dup.add_hook(:test_hook, :testing2) { :okay_man }
169
+
170
+ hooks_dup.get_hook(:test_hook, :testing2).should.not == @hooks.get_hook(:test_hook, :testing2)
171
+ end
172
+
173
+ end
174
+
56
175
  describe "getting hooks" do
57
176
  describe "get_hook" do
58
177
  it 'should return the correct requested hook' do
@@ -44,4 +44,15 @@ describe Pry do
44
44
  end
45
45
  output.string.should =~ /SyntaxError/
46
46
  end
47
+
48
+ it "should allow trailing , to continue the line" do
49
+ pry = Pry.new
50
+
51
+ pry.complete_expression?("puts 1, 2,").should == false
52
+ end
53
+
54
+ it "should complete an expression that contains a line ending with a ," do
55
+ pry = Pry.new
56
+ pry.complete_expression?("puts 1, 2,\n3").should == true
57
+ end
47
58
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: pry
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease: 5
5
- version: 0.9.8pre3
5
+ version: 0.9.8pre4
6
6
  platform: java
7
7
  authors:
8
8
  - John Mair (banisterfiend)
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2012-01-05 00:00:00 Z
13
+ date: 2012-01-12 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: coderay