pry 0.9.0pre2-java → 0.9.0pre3-java

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/Rakefile CHANGED
@@ -25,6 +25,7 @@ def apply_spec_defaults(s)
25
25
  s.add_dependency("slop","~>1.6.0")
26
26
  s.add_dependency("method_source",">=0.4.0")
27
27
  s.add_development_dependency("bacon",">=1.1.0")
28
+ s.add_development_dependency("open4", "~>1.0.1")
28
29
  end
29
30
 
30
31
  task :test do
data/bin/pry CHANGED
@@ -20,9 +20,25 @@ See: `https://github.com/banister` for more information.
20
20
  }
21
21
 
22
22
  on :e, :exec, "A line of code to execute in context before the session starts", true
23
- on :f, "Suppress loading of ~/.pryrc"
24
- on "no-color", "Disable syntax highlighting for session"
25
- on "no-plugins", "Suppress loading of plugins."
23
+
24
+ on "no-pager", "Disable pager for long output" do
25
+ Pry.pager = false
26
+ end
27
+
28
+ on "no-color", "Disable syntax highlighting for session" do
29
+ Pry.color = false
30
+ end
31
+
32
+ on :f, "Suppress loading of ~/.pryrc" do
33
+ # load ~/.pryrc, if not suppressed with -f option
34
+ Pry.config.should_load_rc = false
35
+ end
36
+
37
+ on "no-plugins", "Suppress loading of plugins." do
38
+ # suppress plugins if given --no-plugins optino
39
+ Pry.config.plugins.enabled = false
40
+ end
41
+
26
42
  on "simple-prompt", "Enable simple prompt mode" do
27
43
  Pry.prompt = Pry::SIMPLE_PROMPT
28
44
  end
@@ -50,12 +66,6 @@ end
50
66
  # invoked via cli
51
67
  Pry.cli = true
52
68
 
53
- # load ~/.pryrc, if not suppressed with -f option
54
- Pry.config.should_load_rc = !opts.f?
55
-
56
- # suppress plugins if given --no-plugins optino
57
- Pry.config.plugins.enabled = false if opts["no-plugins"]
58
-
59
69
  # create the actual context
60
70
  context = Pry.binding_for(eval(opts[:context]))
61
71
 
data/lib/pry.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  # (C) John Mair (banisterfiend) 2011
2
2
  # MIT License
3
3
 
4
+ require 'pp'
5
+
4
6
  class Pry
5
7
  # The default hooks - display messages when beginning and ending Pry sessions.
6
8
  DEFAULT_HOOKS = {
@@ -19,7 +21,7 @@ class Pry
19
21
  # The default prints
20
22
  DEFAULT_PRINT = proc do |output, value|
21
23
  if Pry.color
22
- output.puts "=> #{CodeRay.scan(Pry.view(value), :ruby).term}"
24
+ output.puts "=> #{CodeRay.scan(value.pretty_inspect, :ruby).term}"
23
25
  else
24
26
  output.puts "=> #{Pry.view(value)}"
25
27
  end
@@ -79,6 +81,7 @@ if RUBY_PLATFORM =~ /mswin/ || RUBY_PLATFORM =~ /mingw/
79
81
  end
80
82
 
81
83
  require "pry/version"
84
+ require "pry/history_array"
82
85
  require "pry/helpers"
83
86
  require "pry/command_set"
84
87
  require "pry/commands"
@@ -88,4 +91,4 @@ require "pry/completion"
88
91
  require "pry/plugins"
89
92
  require "pry/core_extensions"
90
93
  require "pry/pry_class"
91
- require "pry/pry_instance"
94
+ require "pry/pry_instance"
@@ -12,13 +12,16 @@ class Pry
12
12
 
13
13
  def_delegators :@pry_instance, :commands, :nesting, :output
14
14
 
15
- # Is the string a command valid?
15
+ # Is the string a valid command?
16
16
  # @param [String] val The string passed in from the Pry prompt.
17
17
  # @return [Boolean] Whether the string is a valid command.
18
18
  def valid_command?(val)
19
- !!(command_matched(val)[0])
19
+ !!(command_matched(val, binding)[0])
20
20
  end
21
21
 
22
+ # Convert the object to a form that can be interpolated into a
23
+ # Regexp cleanly.
24
+ # @return [String] The string to interpolate into a Regexp
22
25
  def convert_to_regex(obj)
23
26
  case obj
24
27
  when String
@@ -44,10 +47,20 @@ class Pry
44
47
  # and argument string.
45
48
  # This method should not need to be invoked directly.
46
49
  # @param [String] val The line of input.
50
+ # @param [Binding] target The binding to perform string
51
+ # interpolation against.
47
52
  # @return [Array] The command data and arg string pair
48
- def command_matched(val)
49
- _, cmd_data = commands.commands.find do |name, cmd_data|
50
- /^#{convert_to_regex(name)}(?!\S)/ =~ val
53
+ def command_matched(val, target)
54
+ _, cmd_data = commands.commands.find do |name, data|
55
+
56
+ interp_val = interpolate_string(val, target)
57
+ command_regex = /^#{convert_to_regex(name)}(?!\S)/
58
+
59
+ if data.options[:interpolate] && (command_regex =~ interp_val)
60
+ val.replace interp_val
61
+ else
62
+ command_regex =~ val
63
+ end
51
64
  end
52
65
 
53
66
  [cmd_data, (Regexp.last_match ? Regexp.last_match.captures : nil), (Regexp.last_match ? Regexp.last_match.end(0) : nil)]
@@ -65,18 +78,10 @@ class Pry
65
78
  def process_commands(val, eval_string, target)
66
79
 
67
80
  # no command was matched, so return to caller
68
- return if !valid_command?(val)
69
- command, captures, pos = command_matched(val)
70
-
71
-
72
- # perform ruby interpolation for commands
73
- if command.options[:interpolate]
74
- val.replace interpolate_string(val, target)
75
- # command, captures, pos = command_matched(val)
76
- # captures = captures.map { |v| interpolate_string(v, target) if v }
77
- end
78
-
81
+ command, captures, pos = command_matched(val, target)
82
+ return if !command
79
83
  arg_string = val[pos..-1].strip
84
+
80
85
  args = arg_string ? Shellwords.shellwords(arg_string) : []
81
86
 
82
87
  options = {
@@ -88,6 +88,9 @@ class Pry
88
88
  # `plugins.strict_loading` (Boolean) which toggles whether referring to a non-existent plugin should raise an exception (defaults to `false`)
89
89
  # @return [OpenStruct]
90
90
  attr_accessor :plugins
91
+
92
+ # @return [Integer] Amount of results that will be stored into _out_
93
+ attr_accessor :memory_size
91
94
  end
92
95
  end
93
96
 
@@ -33,12 +33,12 @@ class Pry
33
33
  end
34
34
 
35
35
  gems.each do |gem, specs|
36
- specs.sort! do |a,b|
37
- Gem::Version.new(b.version) <=> Gem::Version.new(a.version)
36
+ specs.sort! do |a,b|
37
+ Gem::Version.new(b.version) <=> Gem::Version.new(a.version)
38
38
  end
39
-
40
- versions = specs.map.with_index do |spec, index|
41
- index == 0 ? text.bright_green(spec.version.to_s) : text.green(spec.version.to_s)
39
+
40
+ versions = specs.each_with_index.map do |spec, index|
41
+ index == 0 ? text.bright_green(spec.version.to_s) : text.green(spec.version.to_s)
42
42
  end
43
43
 
44
44
  output.puts "#{text.white gem} (#{versions.join ', '})"
@@ -12,8 +12,8 @@ class Pry
12
12
  render_output(false, 0, Pry.color ? CodeRay.scan(eval_string, :ruby).term : eval_string)
13
13
  end
14
14
 
15
- command /amend-line-?(\d+)?/, "Experimental amend-line, where the N in amend-line-N represents line to replace. Aliases: %N",
16
- :interpolate => false, :listing => "amend-line-N" do |line_number, replacement_line|
15
+ command(/amend-line-?(\d+)?/, "Experimental amend-line, where the N in amend-line-N represents line to replace. Aliases: %N",
16
+ :interpolate => false, :listing => "amend-line-N") do |line_number, replacement_line|
17
17
  replacement_line = "" if !replacement_line
18
18
  input_array = eval_string.each_line.to_a
19
19
  line_num = line_number ? line_number.to_i : input_array.size - 1
@@ -21,7 +21,7 @@ class Pry
21
21
  eval_string.replace input_array.join
22
22
  end
23
23
 
24
- alias_command /%(\d+)?/, /amend-line-?(\d+)?/, ""
24
+ alias_command(/%(\d+)?/, /amend-line-?(\d+)?/, "")
25
25
 
26
26
  command "hist", "Show and replay Readline history. Type `hist --help` for more info." do |*args|
27
27
  Slop.parse(args) do |opt|
@@ -109,8 +109,8 @@ class Pry
109
109
 
110
110
  opt.on :M, "instance-methods", "Operate on instance methods."
111
111
  opt.on :m, :methods, "Operate on methods."
112
- opt.on "no-reload", "Do not automatically reload the method's file after editting."
113
- opt.on :n, "no-jump", "Do not fast forward editor to first line of method."
112
+ opt.on :n, "no-reload", "Do not automatically reload the method's file after editting."
113
+ opt.on "no-jump", "Do not fast forward editor to first line of method."
114
114
  opt.on :c, :context, "Select object context to run under.", true do |context|
115
115
  target = Pry.binding_for(target.eval(context))
116
116
  end
@@ -143,13 +143,13 @@ class Pry
143
143
  editor_invocation = Pry.editor.call(file, line)
144
144
  else
145
145
  # only use start line if -n option is not used
146
- start_line_syntax = opts.n? ? "" : start_line_for_editor(line)
146
+ start_line_syntax = opts["no-jump"] ? "" : start_line_for_editor(line)
147
147
  editor_invocation = "#{Pry.editor} #{start_line_syntax} #{file}"
148
148
  end
149
149
 
150
150
  run ".#{editor_invocation}"
151
151
  silence_warnings do
152
- load file if !opts["no-reload"]
152
+ load file if !opts.n?
153
153
  end
154
154
  end
155
155
  end
@@ -180,9 +180,9 @@ Shows local and instance variables by default.
180
180
  list = list.grep(options[:grep]) if list
181
181
  list.uniq! if list
182
182
  if Pry.color
183
- text << CodeRay.scan(Pry.view(list), :ruby).term + "\n"
183
+ text << CodeRay.scan(list.inspect, :ruby).term + "\n"
184
184
  else
185
- text << Pry.view(list) + "\n"
185
+ text << list.inspect + "\n"
186
186
  end
187
187
  if !options[:f]
188
188
  stagger_output(text)
@@ -3,7 +3,7 @@ class Pry
3
3
 
4
4
  Shell = Pry::CommandSet.new do
5
5
 
6
- command /\.(.*)/, "All text following a '.' is forwarded to the shell.", :listing => ".<shell command>" do |cmd|
6
+ command(/\.(.*)/, "All text following a '.' is forwarded to the shell.", :listing => ".<shell command>") do |cmd|
7
7
  if cmd =~ /^cd\s+(.+)/i
8
8
  dest = $1
9
9
  begin
@@ -0,0 +1,105 @@
1
+ class Pry
2
+ # A history array is an array to which you can only add elements. Older
3
+ # entries are removed progressively, so that the aray never contains more than
4
+ # N elements.
5
+ #
6
+ # History arrays are used by Pry to store the output of the last commands.
7
+ #
8
+ # @example
9
+ # ary = Pry::HistoryArray.new 10
10
+ # ary << 1 << 2 << 3
11
+ # ary[0] # => 1
12
+ # ary[1] # => 2
13
+ # 10.times { |n| ary << n }
14
+ # ary[0] # => nil
15
+ # ary[-1] # => 9
16
+ class HistoryArray
17
+ include Enumerable
18
+
19
+ # @param [Integer] size Maximum amount of objects in the array
20
+ def initialize(size)
21
+ @max_size = size
22
+
23
+ @hash = {}
24
+ @count = 0
25
+ end
26
+
27
+ # Pushes an object at the end of the array
28
+ # @param [Object] value Object to be added
29
+ def <<(value)
30
+ @hash[@count] = value
31
+
32
+ if @hash.size > max_size
33
+ @hash.delete(@count - max_size)
34
+ end
35
+
36
+ @count += 1
37
+
38
+ self
39
+ end
40
+
41
+ # @overload [](index)
42
+ # @param [Integer] index Index of the item to access.
43
+ # @return [Object, nil] Item at that index or nil if it has been removed.
44
+ # @overload [](index, size)
45
+ # @param [Integer] index Index of the first item to access.
46
+ # @param [Integer] size Amount of items to access
47
+ # @return [Array, nil] The selected items. Nil if index is greater than
48
+ # the size of the array.
49
+ # @overload [](range)
50
+ # @param [Range<Integer>] range Range of indices to access.
51
+ # @return [Array, nil] The selected items. Nil if index is greater than
52
+ # the size of the array.
53
+ def [](index_or_range, size = nil)
54
+ if index_or_range.is_a? Integer
55
+ index = convert_index(index_or_range)
56
+
57
+ if size
58
+ end_index = index + size
59
+ index > @count ? nil : (index...[end_index, @count].min).map do |n|
60
+ @hash[n]
61
+ end
62
+ else
63
+ @hash[index]
64
+ end
65
+ else
66
+ range = convert_range(index_or_range)
67
+ range.begin > @count ? nil : range.map { |n| @hash[n] }
68
+ end
69
+ end
70
+
71
+ # @return [Integer] Amount of objects in the array
72
+ def size
73
+ @count
74
+ end
75
+
76
+ def each
77
+ ((@count - size)...@count).each do |n|
78
+ yield @hash[n]
79
+ end
80
+ end
81
+
82
+ def to_a
83
+ ((@count - size)...@count).map { |n| @hash[n] }
84
+ end
85
+
86
+ def inspect
87
+ "#<#{self.class} size=#{size} first=#{@count - size} max_size=#{max_size}>"
88
+ end
89
+
90
+ # @return [Integer] Maximum amount of objects in the array
91
+ attr_reader :max_size
92
+
93
+ private
94
+ def convert_index(n)
95
+ n >= 0 ? n : @count + n
96
+ end
97
+
98
+ def convert_range(range)
99
+ end_index = convert_index(range.end)
100
+ end_index += 1 unless range.exclude_end?
101
+
102
+ Range.new(convert_index(range.begin), [end_index, @count].min, true)
103
+ end
104
+ end
105
+ end
@@ -69,7 +69,7 @@ class Pry
69
69
  def_delegators :@plugin_manager, :plugins, :load_plugins, :locate_plugins
70
70
 
71
71
  delegate_accessors :@config, :input, :output, :commands, :prompt, :print, :exception_handler,
72
- :hooks, :color, :pager, :editor
72
+ :hooks, :color, :pager, :editor, :memory_size
73
73
  end
74
74
 
75
75
  # Load the rc files given in the `Pry::RC_FILES` array.
@@ -105,12 +105,12 @@ class Pry
105
105
  new(options).repl(target)
106
106
  end
107
107
 
108
- # A custom version of `Kernel#inspect`.
108
+ # A custom version of `Kernel#pretty_inspect`.
109
109
  # This method should not need to be accessed directly.
110
110
  # @param obj The object to view.
111
111
  # @return [String] The string representation of `obj`.
112
112
  def self.view(obj)
113
- obj.inspect
113
+ obj.pretty_inspect
114
114
 
115
115
  rescue NoMethodError
116
116
  "unknown"
@@ -122,8 +122,8 @@ class Pry
122
122
  # @param max_size The maximum number of chars before clipping occurs.
123
123
  # @return [String] The string representation of `obj`.
124
124
  def self.view_clip(obj, max_size=60)
125
- if Pry.view(obj).size < max_size
126
- Pry.view(obj)
125
+ if obj.inspect.size < max_size
126
+ obj.inspect
127
127
  else
128
128
  "#<#{obj.class}:%#x>" % (obj.object_id << 1)
129
129
  end
@@ -199,6 +199,8 @@ class Pry
199
199
  config.history.save = true
200
200
  config.history.load = true
201
201
  config.history.file = File.expand_path("~/.pry_history")
202
+
203
+ config.memory_size = 100
202
204
  end
203
205
 
204
206
  # Set all the configurable options back to their default values
@@ -26,6 +26,7 @@ class Pry
26
26
  # component of the REPL. (see print.rb)
27
27
  def initialize(options={})
28
28
  refresh(options)
29
+
29
30
  @command_processor = CommandProcessor.new(self)
30
31
  end
31
32
 
@@ -38,7 +39,7 @@ class Pry
38
39
  attributes = [
39
40
  :input, :output, :commands, :print,
40
41
  :exception_handler, :hooks, :custom_completions,
41
- :prompt
42
+ :prompt, :memory_size
42
43
  ]
43
44
 
44
45
  attributes.each do |attribute|
@@ -48,6 +49,7 @@ class Pry
48
49
  defaults.merge!(options).each do |key, value|
49
50
  send "#{key}=", value
50
51
  end
52
+
51
53
  true
52
54
  end
53
55
 
@@ -71,6 +73,17 @@ class Pry
71
73
  end
72
74
  end
73
75
 
76
+ # @return [Integer] The maximum amount of objects remembered by the inp and
77
+ # out arrays. Defaults to 100.
78
+ def memory_size
79
+ @output_array.max_size
80
+ end
81
+
82
+ def memory_size=(size)
83
+ @input_array = Pry::HistoryArray.new(size)
84
+ @output_array = Pry::HistoryArray.new(size)
85
+ end
86
+
74
87
  # Get nesting data.
75
88
  # This method should not need to be accessed directly.
76
89
  # @return [Array] The unparsed nesting information.
@@ -111,8 +124,13 @@ class Pry
111
124
  Pry.active_instance = self
112
125
 
113
126
  # Make sure special locals exist
127
+ target.eval("inp = ::Pry.active_instance.instance_eval { @input_array }")
128
+ target.eval("out = ::Pry.active_instance.instance_eval { @output_array }")
129
+
114
130
  set_active_instance(target)
131
+ @input_array << nil # add empty input so inp and out match
115
132
  set_last_result(Pry.last_result, target)
133
+
116
134
  self.session_target = target
117
135
  end
118
136
 
@@ -193,19 +211,29 @@ class Pry
193
211
  Readline.completion_proc = Pry::InputCompleter.build_completion_proc target, instance_eval(&custom_completions)
194
212
  end
195
213
 
214
+ # save the pry instance to active_instance
215
+ Pry.active_instance = self
216
+
217
+ target.eval("inp = ::Pry.active_instance.instance_eval { @input_array }")
218
+ target.eval("out = ::Pry.active_instance.instance_eval { @output_array }")
219
+
196
220
  @last_result_is_exception = false
197
221
  set_active_instance(target)
198
- expr = r(target)
199
222
 
200
- Pry.line_buffer.push(*expr.each_line)
201
- set_last_result(target.eval(expr, Pry.eval_path, Pry.current_line), target)
223
+ code = r(target)
224
+
225
+ Pry.line_buffer.push(*code.each_line)
226
+ res = set_last_result(target.eval(code, Pry.eval_path, Pry.current_line), target)
227
+ res
202
228
  rescue SystemExit => e
203
229
  exit
204
230
  rescue Exception => e
205
231
  @last_result_is_exception = true
232
+ @output_array << e
206
233
  set_last_exception(e, target)
207
234
  ensure
208
- Pry.current_line += expr.each_line.count if expr
235
+ @input_array << code
236
+ Pry.current_line += code.each_line.count if code
209
237
  end
210
238
 
211
239
  # Perform a read.
@@ -292,6 +320,7 @@ class Pry
292
320
  # @param [Binding] target The binding to set `_` on.
293
321
  def set_last_result(result, target)
294
322
  Pry.last_result = result
323
+ @output_array << result
295
324
  target.eval("_ = ::Pry.last_result")
296
325
  end
297
326
 
@@ -1,3 +1,3 @@
1
1
  class Pry
2
- VERSION = "0.9.0pre2"
2
+ VERSION = "0.9.0pre3"
3
3
  end
@@ -4,6 +4,7 @@ unless Object.const_defined? 'Pry'
4
4
  end
5
5
 
6
6
  require 'bacon'
7
+ require 'open4'
7
8
 
8
9
  # Ensure we do not execute any rc files
9
10
  Pry::RC_FILES.clear
@@ -1,7 +1,6 @@
1
1
  require 'helper'
2
2
 
3
3
  describe "Pry::CommandProcessor" do
4
-
5
4
  before do
6
5
  @pry = Pry.new
7
6
  @pry.commands = Pry::CommandSet.new
@@ -12,9 +11,21 @@ describe "Pry::CommandProcessor" do
12
11
  @pry.commands = Pry::CommandSet.new
13
12
  end
14
13
 
14
+ it 'should accurately determine if a command is valid' do
15
+ @pry.commands.command("test-command") {}
16
+ valid = @command_processor.valid_command? "test-command"
17
+ valid.should == true
18
+
19
+ valid = @command_processor.valid_command? "blah"
20
+ valid.should == false
21
+
22
+ a = "test-command"
23
+ lambda { @command_processor.valid_command? '#{a}' }.should.raise NameError
24
+ end
25
+
15
26
  it 'should correctly match a simple string command' do
16
27
  @pry.commands.command("test-command") {}
17
- command, captures, pos = @command_processor.command_matched "test-command"
28
+ command, captures, pos = @command_processor.command_matched "test-command", binding
18
29
 
19
30
  command.name.should == "test-command"
20
31
  captures.should == []
@@ -23,7 +34,7 @@ describe "Pry::CommandProcessor" do
23
34
 
24
35
  it 'should correctly match a simple string command with parameters' do
25
36
  @pry.commands.command("test-command") { |arg|}
26
- command, captures, pos = @command_processor.command_matched "test-command hello"
37
+ command, captures, pos = @command_processor.command_matched "test-command hello", binding
27
38
 
28
39
  command.name.should == "test-command"
29
40
  captures.should == []
@@ -31,7 +42,7 @@ describe "Pry::CommandProcessor" do
31
42
  end
32
43
 
33
44
  it 'should not match when the relevant command does not exist' do
34
- command, captures, pos = @command_processor.command_matched "test-command"
45
+ command, captures, pos = @command_processor.command_matched "test-command", binding
35
46
 
36
47
  command.should == nil
37
48
  captures.should == nil
@@ -39,7 +50,7 @@ describe "Pry::CommandProcessor" do
39
50
 
40
51
  it 'should correctly match a regex command' do
41
52
  @pry.commands.command(/rue(.?)/) { }
42
- command, captures, pos = @command_processor.command_matched "rue hello"
53
+ command, captures, pos = @command_processor.command_matched "rue hello", binding
43
54
 
44
55
  command.name.should == /rue(.?)/
45
56
  captures.should == [""]
@@ -48,7 +59,7 @@ describe "Pry::CommandProcessor" do
48
59
 
49
60
  it 'should correctly match a regex command and extract the capture groups' do
50
61
  @pry.commands.command(/rue(.?)/) { }
51
- command, captures, pos = @command_processor.command_matched "rue5 hello"
62
+ command, captures, pos = @command_processor.command_matched "rue5 hello", binding
52
63
 
53
64
  command.name.should == /rue(.?)/
54
65
  captures.should == ["5"]
@@ -57,7 +68,7 @@ describe "Pry::CommandProcessor" do
57
68
 
58
69
  it 'should correctly match a string command with spaces in its name' do
59
70
  @pry.commands.command("test command") {}
60
- command, captures, pos = @command_processor.command_matched "test command"
71
+ command, captures, pos = @command_processor.command_matched "test command", binding
61
72
 
62
73
  command.name.should == "test command"
63
74
  captures.should == []
@@ -66,7 +77,7 @@ describe "Pry::CommandProcessor" do
66
77
 
67
78
  it 'should correctly match a string command with spaces in its name with parameters' do
68
79
  @pry.commands.command("test command") {}
69
- command, captures, pos = @command_processor.command_matched "test command param1 param2"
80
+ command, captures, pos = @command_processor.command_matched "test command param1 param2", binding
70
81
 
71
82
  command.name.should == "test command"
72
83
  captures.should == []
@@ -78,7 +89,7 @@ describe "Pry::CommandProcessor" do
78
89
  @pry.commands.command(regex_command_name) {}
79
90
 
80
91
  sample_text = "test friendship command"
81
- command, captures, pos = @command_processor.command_matched sample_text
92
+ command, captures, pos = @command_processor.command_matched sample_text, binding
82
93
 
83
94
  command.name.should == regex_command_name
84
95
  captures.should == ["friendship"]
@@ -90,10 +101,33 @@ describe "Pry::CommandProcessor" do
90
101
  @pry.commands.command(regex_command_name) {}
91
102
 
92
103
  sample_text = ".cd ~/pry"
93
- command, captures, pos = @command_processor.command_matched sample_text
104
+ command, captures, pos = @command_processor.command_matched sample_text, binding
94
105
 
95
106
  command.name.should == regex_command_name
96
107
  captures.should == ["cd ~/pry"]
97
108
  pos.should == sample_text.size
98
109
  end
110
+
111
+ it 'should correctly match a command whose name is interpolated' do
112
+ @pry.commands.command("blah") {}
113
+ a = "bl"
114
+ b = "ah"
115
+ command, captures, pos = @command_processor.command_matched '#{a}#{b}', binding
116
+
117
+ command.name.should == "blah"
118
+ captures.should == []
119
+ pos.should == command.name.length
120
+ end
121
+
122
+ it 'should NOT match a command whose name is interpolated when :interpolate => false' do
123
+ @pry.commands.command("boast", "", :interpolate => false) {}
124
+ a = "boa"
125
+ b = "st"
126
+
127
+ # remember to use '' instead of "" when testing interpolation or
128
+ # you'll cause yourself incredible confusion
129
+ command, captures, pos = @command_processor.command_matched '#{a}#{b}', binding
130
+
131
+ command.should == nil
132
+ end
99
133
  end
@@ -0,0 +1,14 @@
1
+ require 'helper'
2
+
3
+ describe "Pry::DefaultCommands::Gems" do
4
+ describe "gem-list" do
5
+
6
+ # fixing bug for 1.8 compat
7
+ it 'should not raise when invoked' do
8
+ str_output = StringIO.new
9
+ Pry.start self, :input => InputTester.new("gem-list", "exit-all"), :output => str_output
10
+ str_output.string.should.not =~ /NoMethodError/
11
+ end
12
+ end
13
+ end
14
+
@@ -0,0 +1,65 @@
1
+ require 'helper'
2
+
3
+ describe Pry::HistoryArray do
4
+ before do
5
+ @array = Pry::HistoryArray.new 10
6
+ end
7
+
8
+ it 'should have a maximum size specifed at creation time' do
9
+ @array.max_size.should == 10
10
+ end
11
+
12
+ it 'should be able to be added objects to' do
13
+ @array << 1 << 2 << 3
14
+ @array.size.should == 3
15
+ @array.to_a.should == [1, 2, 3]
16
+ end
17
+
18
+ it 'should be able to access single elements' do
19
+ @array << 1 << 2 << 3
20
+ @array[2].should == 3
21
+ end
22
+
23
+ it 'should be able to access negative indices' do
24
+ @array << 1 << 2 << 3
25
+ @array[-1].should == 3
26
+ end
27
+
28
+ it 'should be able to access ranges' do
29
+ @array << 1 << 2 << 3 << 4
30
+ @array[1..2].should == [2, 3]
31
+ end
32
+
33
+ it 'should be able to access ranges starting from a negative index' do
34
+ @array << 1 << 2 << 3 << 4
35
+ @array[-2..3].should == [3, 4]
36
+ end
37
+
38
+ it 'should be able to access ranges ending at a negative index' do
39
+ @array << 1 << 2 << 3 << 4
40
+ @array[2..-1].should == [3, 4]
41
+ end
42
+
43
+ it 'should be able to access ranges using only negative indices' do
44
+ @array << 1 << 2 << 3 << 4
45
+ @array[-2..-1].should == [3, 4]
46
+ end
47
+
48
+ it 'should be able to use range where end is excluded' do
49
+ @array << 1 << 2 << 3 << 4
50
+ @array[-2...-1].should == [3]
51
+ end
52
+
53
+ it 'should be able to access slices using a size' do
54
+ @array << 1 << 2 << 3 << 4
55
+ @array[-3, 2].should == [2, 3]
56
+ end
57
+
58
+ it 'should remove older entries' do
59
+ 11.times { |n| @array << n }
60
+
61
+ @array[0].should == nil
62
+ @array[1].should == 1
63
+ @array[10].should == 10
64
+ end
65
+ end
@@ -6,6 +6,15 @@ puts "With method_source version #{MethodSource::VERSION}"
6
6
  puts "--"
7
7
 
8
8
  describe Pry do
9
+
10
+ describe 'warning emissions' do
11
+ it 'should emit no warnings' do
12
+ Open4.popen4 'ruby -I lib -rubygems -r"pry" -W -e "exit"' do |pid, stdin, stdout, stderr|
13
+ stderr.read.empty?.should == true
14
+ end
15
+ end
16
+ end
17
+
9
18
  describe "open a Pry session on an object" do
10
19
  describe "rep" do
11
20
  before do
@@ -134,6 +143,67 @@ describe Pry do
134
143
  end
135
144
  end
136
145
 
146
+ describe "history arrays" do
147
+ it 'sets _ to the last result' do
148
+ res = []
149
+ input = InputTester.new *[":foo", "self << _", "42", "self << _"]
150
+ pry = Pry.new(:input => input, :output => Pry::NullOutput)
151
+ pry.repl(res)
152
+
153
+ res.should == [:foo, 42]
154
+ end
155
+
156
+ it 'sets out to an array with the result' do
157
+ res = {}
158
+ input = InputTester.new *[":foo", "42", "self[:res] = out"]
159
+ pry = Pry.new(:input => input, :output => Pry::NullOutput)
160
+ pry.repl(res)
161
+
162
+ res[:res].should.be.kind_of Pry::HistoryArray
163
+ res[:res][1..2].should == [:foo, 42]
164
+ end
165
+
166
+ it 'sets inp to an array with the entered lines' do
167
+ res = {}
168
+ input = InputTester.new *[":foo", "42", "self[:res] = inp"]
169
+ pry = Pry.new(:input => input, :output => Pry::NullOutput)
170
+ pry.repl(res)
171
+
172
+ res[:res].should.be.kind_of Pry::HistoryArray
173
+ res[:res][1..2].should == [":foo\n", "42\n"]
174
+ end
175
+
176
+ it 'uses 100 as the size of inp and out' do
177
+ res = []
178
+ input = InputTester.new *["self << out.max_size << inp.max_size"]
179
+ pry = Pry.new(:input => input, :output => Pry::NullOutput)
180
+ pry.repl(res)
181
+
182
+ res.should == [100, 100]
183
+ end
184
+
185
+ it 'can change the size of the history arrays' do
186
+ res = []
187
+ input = InputTester.new *["self << out.max_size << inp.max_size"]
188
+ pry = Pry.new(:input => input, :output => Pry::NullOutput,
189
+ :memory_size => 1000)
190
+ pry.repl(res)
191
+
192
+ res.should == [1000, 1000]
193
+ end
194
+
195
+ it 'store exceptions' do
196
+ res = []
197
+ input = InputTester.new *["foo!","self << inp[-1] << out[-1]"]
198
+ pry = Pry.new(:input => input, :output => Pry::NullOutput,
199
+ :memory_size => 1000)
200
+ pry.repl(res)
201
+
202
+ res.first.should == "foo!\n"
203
+ res.last.should.be.kind_of NoMethodError
204
+ end
205
+ end
206
+
137
207
  describe "test loading rc files" do
138
208
 
139
209
  before do
@@ -492,11 +562,33 @@ describe Pry do
492
562
  Pry.new(:commands => set).rep
493
563
  end
494
564
 
495
- # binding.pry
496
565
  str_output.string.should =~ /hello bing/
497
566
  $obj = nil
498
567
  end
499
568
 
569
+ it 'should create a regex command and arg_string should be interpolated' do
570
+ set = Pry::CommandSet.new do
571
+ command /hello(\w+)/, "" do |c1, a1, a2, a3|
572
+ output.puts "hello #{c1} #{a1} #{a2} #{a3}"
573
+ end
574
+ end
575
+
576
+ str_output = StringIO.new
577
+ $a1 = "bing"
578
+ $a2 = "bong"
579
+ $a3 = "bang"
580
+ redirect_pry_io(InputTester.new('hellojohn #{$a1} #{$a2} #{$a3}'), str_output) do
581
+ Pry.new(:commands => set).rep
582
+ end
583
+
584
+ str_output.string.should =~ /hello john bing bong bang/
585
+
586
+ $a1 = nil
587
+ $a2 = nil
588
+ $a3 = nil
589
+ end
590
+
591
+
500
592
  it 'if a regex capture is missing it should be nil' do
501
593
  set = Pry::CommandSet.new do
502
594
  command /hello(.)?/, "" do |c1, a1|
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.0pre2
5
+ version: 0.9.0pre3
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: 2011-06-04 00:00:00 Z
13
+ date: 2011-06-09 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: ruby_parser
@@ -67,6 +67,17 @@ dependencies:
67
67
  version: 1.1.0
68
68
  type: :development
69
69
  version_requirements: *id005
70
+ - !ruby/object:Gem::Dependency
71
+ name: open4
72
+ prerelease: false
73
+ requirement: &id006 !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ~>
77
+ - !ruby/object:Gem::Version
78
+ version: 1.0.1
79
+ type: :development
80
+ version_requirements: *id006
70
81
  description: an IRB alternative and runtime developer console
71
82
  email: jrmair@gmail.com
72
83
  executables:
@@ -121,6 +132,7 @@ files:
121
132
  - lib/pry/helpers/base_helpers.rb
122
133
  - lib/pry/helpers/command_helpers.rb
123
134
  - lib/pry/helpers/text.rb
135
+ - lib/pry/history_array.rb
124
136
  - lib/pry/plugins.rb
125
137
  - lib/pry/pry_class.rb
126
138
  - lib/pry/pry_instance.rb
@@ -132,8 +144,10 @@ files:
132
144
  - test/test_default_commands.rb
133
145
  - test/test_default_commands/test_context.rb
134
146
  - test/test_default_commands/test_documentation.rb
147
+ - test/test_default_commands/test_gems.rb
135
148
  - test/test_default_commands/test_input.rb
136
149
  - test/test_default_commands/test_introspection.rb
150
+ - test/test_history_array.rb
137
151
  - test/test_pry.rb
138
152
  - test/testrc
139
153
  - wiki/Customizing-pry.md
@@ -173,7 +187,9 @@ test_files:
173
187
  - test/test_default_commands.rb
174
188
  - test/test_default_commands/test_context.rb
175
189
  - test/test_default_commands/test_documentation.rb
190
+ - test/test_default_commands/test_gems.rb
176
191
  - test/test_default_commands/test_input.rb
177
192
  - test/test_default_commands/test_introspection.rb
193
+ - test/test_history_array.rb
178
194
  - test/test_pry.rb
179
195
  - test/testrc