pry 0.9.0pre3-java → 0.9.4pre2-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. data/.gitignore +1 -0
  2. data/CHANGELOG +84 -6
  3. data/CONTRIBUTORS +13 -0
  4. data/README.markdown +23 -183
  5. data/Rakefile +22 -19
  6. data/TODO +36 -6
  7. data/bin/pry +12 -1
  8. data/lib/pry.rb +60 -12
  9. data/lib/pry/command_context.rb +21 -0
  10. data/lib/pry/command_processor.rb +62 -16
  11. data/lib/pry/command_set.rb +25 -11
  12. data/lib/pry/commands.rb +0 -3
  13. data/lib/pry/completion.rb +6 -6
  14. data/lib/pry/config.rb +25 -5
  15. data/lib/pry/default_commands/basic.rb +27 -6
  16. data/lib/pry/default_commands/context.rb +84 -35
  17. data/lib/pry/default_commands/documentation.rb +69 -31
  18. data/lib/pry/default_commands/easter_eggs.rb +5 -0
  19. data/lib/pry/default_commands/input.rb +193 -56
  20. data/lib/pry/default_commands/introspection.rb +98 -50
  21. data/lib/pry/default_commands/ls.rb +51 -21
  22. data/lib/pry/default_commands/shell.rb +57 -13
  23. data/lib/pry/extended_commands/experimental.rb +0 -32
  24. data/lib/pry/extended_commands/user_command_api.rb +33 -2
  25. data/lib/pry/helpers/base_helpers.rb +30 -10
  26. data/lib/pry/helpers/command_helpers.rb +75 -16
  27. data/lib/pry/helpers/text.rb +12 -11
  28. data/lib/pry/history.rb +61 -0
  29. data/lib/pry/plugins.rb +23 -12
  30. data/lib/pry/pry_class.rb +51 -50
  31. data/lib/pry/pry_instance.rb +129 -119
  32. data/lib/pry/version.rb +1 -1
  33. data/pry.gemspec +46 -0
  34. data/test/helper.rb +37 -3
  35. data/test/test_command_processor.rb +62 -19
  36. data/test/test_command_set.rb +40 -2
  37. data/test/test_completion.rb +27 -0
  38. data/test/test_default_commands/test_context.rb +185 -1
  39. data/test/test_default_commands/test_documentation.rb +10 -0
  40. data/test/test_default_commands/test_input.rb +207 -11
  41. data/test/test_default_commands/test_introspection.rb +20 -1
  42. data/test/test_default_commands/test_shell.rb +18 -0
  43. data/test/test_pry.rb +261 -45
  44. data/test/test_pry_history.rb +82 -0
  45. data/test/test_pry_output.rb +44 -0
  46. data/test/test_special_locals.rb +35 -0
  47. metadata +185 -159
data/lib/pry/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class Pry
2
- VERSION = "0.9.0pre3"
2
+ VERSION = "0.9.4pre2"
3
3
  end
data/pry.gemspec ADDED
@@ -0,0 +1,46 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{pry}
5
+ s.version = "0.9.4pre1"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
8
+ s.authors = [%q{John Mair (banisterfiend)}]
9
+ s.date = %q{2011-09-07}
10
+ s.description = %q{An IRB alternative and runtime developer console}
11
+ s.email = %q{jrmair@gmail.com}
12
+ s.executables = [%q{pry}]
13
+ s.files = [%q{.document}, %q{.gemtest}, %q{.gitignore}, %q{.yardopts}, %q{CHANGELOG}, %q{CONTRIBUTORS}, %q{LICENSE}, %q{README.markdown}, %q{Rakefile}, %q{TODO}, %q{bin/pry}, %q{examples/example_basic.rb}, %q{examples/example_command_override.rb}, %q{examples/example_commands.rb}, %q{examples/example_hooks.rb}, %q{examples/example_image_edit.rb}, %q{examples/example_input.rb}, %q{examples/example_input2.rb}, %q{examples/example_output.rb}, %q{examples/example_print.rb}, %q{examples/example_prompt.rb}, %q{examples/helper.rb}, %q{lib/pry.rb}, %q{lib/pry/command_context.rb}, %q{lib/pry/command_processor.rb}, %q{lib/pry/command_set.rb}, %q{lib/pry/commands.rb}, %q{lib/pry/completion.rb}, %q{lib/pry/config.rb}, %q{lib/pry/core_extensions.rb}, %q{lib/pry/custom_completions.rb}, %q{lib/pry/default_commands/basic.rb}, %q{lib/pry/default_commands/context.rb}, %q{lib/pry/default_commands/documentation.rb}, %q{lib/pry/default_commands/easter_eggs.rb}, %q{lib/pry/default_commands/gems.rb}, %q{lib/pry/default_commands/input.rb}, %q{lib/pry/default_commands/introspection.rb}, %q{lib/pry/default_commands/ls.rb}, %q{lib/pry/default_commands/shell.rb}, %q{lib/pry/extended_commands/experimental.rb}, %q{lib/pry/extended_commands/user_command_api.rb}, %q{lib/pry/helpers.rb}, %q{lib/pry/helpers/base_helpers.rb}, %q{lib/pry/helpers/command_helpers.rb}, %q{lib/pry/helpers/text.rb}, %q{lib/pry/history.rb}, %q{lib/pry/history_array.rb}, %q{lib/pry/plugins.rb}, %q{lib/pry/pry_class.rb}, %q{lib/pry/pry_instance.rb}, %q{lib/pry/version.rb}, %q{pry.gemspec}, %q{test/helper.rb}, %q{test/test_command_helpers.rb}, %q{test/test_command_processor.rb}, %q{test/test_command_set.rb}, %q{test/test_completion.rb}, %q{test/test_default_commands.rb}, %q{test/test_default_commands/test_context.rb}, %q{test/test_default_commands/test_documentation.rb}, %q{test/test_default_commands/test_gems.rb}, %q{test/test_default_commands/test_input.rb}, %q{test/test_default_commands/test_introspection.rb}, %q{test/test_default_commands/test_shell.rb}, %q{test/test_history_array.rb}, %q{test/test_pry.rb}, %q{test/test_pry_history.rb}, %q{test/test_pry_output.rb}, %q{test/test_special_locals.rb}, %q{test/testrc}, %q{wiki/Customizing-pry.md}, %q{wiki/Home.md}]
14
+ s.homepage = %q{http://pry.github.com}
15
+ s.require_paths = [%q{lib}]
16
+ s.rubygems_version = %q{1.8.6}
17
+ s.summary = %q{An IRB alternative and runtime developer console}
18
+ s.test_files = [%q{test/helper.rb}, %q{test/test_command_helpers.rb}, %q{test/test_command_processor.rb}, %q{test/test_command_set.rb}, %q{test/test_completion.rb}, %q{test/test_default_commands.rb}, %q{test/test_default_commands/test_context.rb}, %q{test/test_default_commands/test_documentation.rb}, %q{test/test_default_commands/test_gems.rb}, %q{test/test_default_commands/test_input.rb}, %q{test/test_default_commands/test_introspection.rb}, %q{test/test_default_commands/test_shell.rb}, %q{test/test_history_array.rb}, %q{test/test_pry.rb}, %q{test/test_pry_history.rb}, %q{test/test_pry_output.rb}, %q{test/test_special_locals.rb}, %q{test/testrc}]
19
+
20
+ if s.respond_to? :specification_version then
21
+ s.specification_version = 3
22
+
23
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
24
+ s.add_runtime_dependency(%q<ruby_parser>, [">= 2.0.5"])
25
+ s.add_runtime_dependency(%q<coderay>, [">= 0.9.8"])
26
+ s.add_runtime_dependency(%q<slop>, ["~> 2.1.0"])
27
+ s.add_runtime_dependency(%q<method_source>, [">= 0.6.0"])
28
+ s.add_development_dependency(%q<bacon>, [">= 1.1.0"])
29
+ s.add_development_dependency(%q<open4>, ["~> 1.0.1"])
30
+ else
31
+ s.add_dependency(%q<ruby_parser>, [">= 2.0.5"])
32
+ s.add_dependency(%q<coderay>, [">= 0.9.8"])
33
+ s.add_dependency(%q<slop>, ["~> 2.1.0"])
34
+ s.add_dependency(%q<method_source>, [">= 0.6.0"])
35
+ s.add_dependency(%q<bacon>, [">= 1.1.0"])
36
+ s.add_dependency(%q<open4>, ["~> 1.0.1"])
37
+ end
38
+ else
39
+ s.add_dependency(%q<ruby_parser>, [">= 2.0.5"])
40
+ s.add_dependency(%q<coderay>, [">= 0.9.8"])
41
+ s.add_dependency(%q<slop>, ["~> 2.1.0"])
42
+ s.add_dependency(%q<method_source>, [">= 0.6.0"])
43
+ s.add_dependency(%q<bacon>, [">= 1.1.0"])
44
+ s.add_dependency(%q<open4>, ["~> 1.0.1"])
45
+ end
46
+ end
data/test/helper.rb CHANGED
@@ -20,18 +20,38 @@ class << Pry
20
20
  Pry.pager = false
21
21
  Pry.config.should_load_rc = false
22
22
  Pry.config.plugins.enabled = false
23
- Pry.config.history.load = false
24
- Pry.config.history.save = false
23
+ Pry.config.history.should_load = false
24
+ Pry.config.history.should_save = false
25
25
  end
26
26
  end
27
27
 
28
+ # are we on Jruby platform?
29
+ def jruby?
30
+ defined?(RUBY_ENGINE) && RUBY_ENGINE =~ /jruby/
31
+ end
32
+
33
+ # are we on rbx platform?
34
+ def rbx?
35
+ defined?(RUBY_ENGINE) && RUBY_ENGINE =~ /rbx/
36
+ end
37
+
28
38
  Pry.reset_defaults
29
39
 
40
+ # this is to test exception code (cat --ex)
41
+ def broken_method
42
+ this method is broken
43
+ end
44
+
30
45
  # sample doc
31
46
  def sample_method
32
47
  :sample
33
48
  end
34
49
 
50
+ # another sample doc
51
+ def another_sample_method
52
+ :another_sample
53
+ end
54
+
35
55
  def redirect_pry_io(new_in, new_out)
36
56
  old_in = Pry.input
37
57
  old_out = Pry.output
@@ -46,6 +66,17 @@ def redirect_pry_io(new_in, new_out)
46
66
  end
47
67
  end
48
68
 
69
+ def mock_pry(*args)
70
+ input = InputTester.new(*args)
71
+ output = StringIO.new
72
+
73
+ redirect_pry_io(input, output) do
74
+ Pry.start
75
+ end
76
+
77
+ output.string
78
+ end
79
+
49
80
  def redirect_global_pry_input(new_io)
50
81
  old_io = Pry.input
51
82
  Pry.input = new_io
@@ -74,12 +105,15 @@ end
74
105
 
75
106
  class InputTester
76
107
  def initialize(*actions)
108
+ if actions.last.is_a?(Hash) && actions.last.keys == [:history]
109
+ @hist = actions.pop[:history]
110
+ end
77
111
  @orig_actions = actions.dup
78
112
  @actions = actions
79
113
  end
80
114
 
81
115
  def readline(*)
82
- @actions.shift
116
+ @actions.shift.tap{ |line| @hist << line if @hist }
83
117
  end
84
118
 
85
119
  def rewind
@@ -18,9 +18,6 @@ describe "Pry::CommandProcessor" do
18
18
 
19
19
  valid = @command_processor.valid_command? "blah"
20
20
  valid.should == false
21
-
22
- a = "test-command"
23
- lambda { @command_processor.valid_command? '#{a}' }.should.raise NameError
24
21
  end
25
22
 
26
23
  it 'should correctly match a simple string command' do
@@ -84,6 +81,57 @@ describe "Pry::CommandProcessor" do
84
81
  pos.should == command.name.length
85
82
  end
86
83
 
84
+ it 'should correctly match a command preceded by the command_prefix if one is defined' do
85
+ Pry.config.command_prefix = "%"
86
+
87
+ @pry.commands.command("test-command") {}
88
+ command, captures, pos = @command_processor.command_matched "%test-command hello", binding
89
+
90
+ command.name.should == "test-command"
91
+ captures.should == []
92
+ pos.should == "test-command".length + "%".length
93
+
94
+ Pry.config.command_prefix = ''
95
+ end
96
+
97
+ it 'should not match a command not preceded by the command_prefix if one is defined' do
98
+ Pry.config.command_prefix = "%"
99
+
100
+ @pry.commands.command("test-command") {}
101
+ command, captures, pos = @command_processor.command_matched "test-command hello", binding
102
+
103
+ command.should == nil
104
+ captures.should == nil
105
+
106
+ Pry.config.command_prefix = ''
107
+ end
108
+
109
+ it 'should match a command preceded by the command_prefix when :use_prefix => false' do
110
+ Pry.config.command_prefix = "%"
111
+
112
+ @pry.commands.command("test-command", "", :use_prefix => false) {}
113
+ command, captures, pos = @command_processor.command_matched "%test-command hello", binding
114
+
115
+ command.name.should == "test-command"
116
+ captures.should == []
117
+ pos.should == "test-command".length + "%".length
118
+
119
+ Pry.config.command_prefix = ''
120
+ end
121
+
122
+ it 'should match a command not preceded by the command_prefix when :use_prefix => false' do
123
+ Pry.config.command_prefix = "%"
124
+
125
+ @pry.commands.command("test-command", "", :use_prefix => false) {}
126
+ command, captures, pos = @command_processor.command_matched "test-command hello", binding
127
+
128
+ command.name.should == "test-command"
129
+ captures.should == []
130
+ pos.should == "test-command".length
131
+
132
+ Pry.config.command_prefix = ''
133
+ end
134
+
87
135
  it 'should correctly match a regex command with spaces in its name' do
88
136
  regex_command_name = /test\s+(.+)\s+command/
89
137
  @pry.commands.command(regex_command_name) {}
@@ -108,26 +156,21 @@ describe "Pry::CommandProcessor" do
108
156
  pos.should == sample_text.size
109
157
  end
110
158
 
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
159
+ it 'should not interpolate commands that have :interpolate => false (interpolate_string should *not* be called)' do
123
160
  @pry.commands.command("boast", "", :interpolate => false) {}
124
- a = "boa"
125
- b = "st"
126
161
 
127
162
  # remember to use '' instead of "" when testing interpolation or
128
163
  # you'll cause yourself incredible confusion
129
- command, captures, pos = @command_processor.command_matched '#{a}#{b}', binding
164
+ lambda { @command_processor.command_matched('boast #{c}', binding) }.should.not.raise NameError
165
+ end
130
166
 
131
- command.should == nil
167
+ it 'should only execute the contents of an interpolation once' do
168
+ $obj = 'a'
169
+
170
+ redirect_pry_io(InputTester.new('cat #{$obj.succ!}'), StringIO.new) do
171
+ Pry.new.rep
172
+ end
173
+
174
+ $obj.should == 'b'
132
175
  end
133
176
  end
@@ -112,9 +112,9 @@ describe Pry::CommandSet do
112
112
  @set.commands['foo'].description.should == 'baz'
113
113
  end
114
114
 
115
- it 'should return nil for commands by default' do
115
+ it 'should return Pry::CommandContext::VOID_VALUE for commands by default' do
116
116
  @set.command('foo') { 3 }
117
- @set.run_command(nil, 'foo').should == nil
117
+ @set.run_command(nil, 'foo').should == Pry::CommandContext::VOID_VALUE
118
118
  end
119
119
 
120
120
  it 'should be able to keep return values' do
@@ -122,6 +122,11 @@ describe Pry::CommandSet do
122
122
  @set.run_command(nil, 'foo').should == 3
123
123
  end
124
124
 
125
+ it 'should be able to keep return values, even if return value is nil' do
126
+ @set.command('foo', '', :keep_retval => true) { nil }
127
+ @set.run_command(nil, 'foo').should == nil
128
+ end
129
+
125
130
  it 'should be able to have its own helpers' do
126
131
  @set.command('foo') do
127
132
  should.respond_to :my_helper
@@ -187,4 +192,37 @@ describe Pry::CommandSet do
187
192
  @set.command 'foo', "", :listing => 'bar' do;end
188
193
  @set.commands['foo'].options[:listing].should == 'bar'
189
194
  end
195
+
196
+ it "should provide a 'help' command" do
197
+ context = Pry::CommandContext.new
198
+ context.command_set = @set
199
+ context.output = StringIO.new
200
+
201
+ lambda {
202
+ @set.run_command(context, 'help')
203
+ }.should.not.raise
204
+ end
205
+
206
+ it "should sort the output of the 'help' command" do
207
+ @set.command 'foo', "Fooerizes" do; end
208
+ @set.command 'goo', "Gooerizes" do; end
209
+ @set.command 'moo', "Mooerizes" do; end
210
+ @set.command 'boo', "Booerizes" do; end
211
+
212
+ context = Pry::CommandContext.new
213
+ context.command_set = @set
214
+ context.output = StringIO.new
215
+
216
+ @set.run_command(context, 'help')
217
+
218
+ doc = context.output.string
219
+
220
+ order = [doc.index("boo"),
221
+ doc.index("foo"),
222
+ doc.index("goo"),
223
+ doc.index("help"),
224
+ doc.index("moo")]
225
+
226
+ order.should == order.sort
227
+ end
190
228
  end
@@ -0,0 +1,27 @@
1
+ require 'helper'
2
+
3
+ describe Pry::InputCompleter do
4
+
5
+ before do
6
+ # The AMQP gem has some classes like this:
7
+ # pry(main)> AMQP::Protocol::Test::ContentOk.name
8
+ # => :content_ok
9
+ module SymbolyName
10
+ def self.name; :symboly_name; end
11
+ end
12
+ end
13
+
14
+ after do
15
+ Object.remove_const :SymbolyName
16
+ end
17
+
18
+ # another jruby hack :((
19
+ if !jruby?
20
+ it "should not crash if there's a Module that has a symbolic name." do
21
+ completer = Pry::InputCompleter.build_completion_proc(Pry.binding_for(Object.new))
22
+ binding.pry
23
+ lambda{ completer.call "a.to_s." }.should.not.raise Exception
24
+ end
25
+ end
26
+ end
27
+
@@ -1,6 +1,104 @@
1
1
  require 'helper'
2
2
 
3
3
  describe "Pry::DefaultCommands::Context" do
4
+ describe "exit-all" do
5
+ it 'should break out of the repl loop of Pry instance (returning target of session)' do
6
+ redirect_pry_io(InputTester.new("exit-all"), StringIO.new) do
7
+ Pry.new.repl(0).should == 0
8
+ end
9
+ end
10
+
11
+ it 'should break out of the repl loop of Pry instance wth a user specified value' do
12
+ redirect_pry_io(InputTester.new("exit-all 'message'"), StringIO.new) do
13
+ Pry.new.repl(0).should == 'message'
14
+ end
15
+ end
16
+
17
+ it 'should break of the repl loop even if multiple bindings still on stack' do
18
+ ins = nil
19
+ redirect_pry_io(InputTester.new("cd 1", "cd 2", "exit-all 'message'"), StringIO.new) do
20
+ ins = Pry.new.tap { |v| v.repl(0).should == 'message' }
21
+ end
22
+ end
23
+
24
+ it 'binding_stack should be empty after breaking out of the repl loop' do
25
+ ins = nil
26
+ redirect_pry_io(InputTester.new("cd 1", "cd 2", "exit-all"), StringIO.new) do
27
+ ins = Pry.new.tap { |v| v.repl(0) }
28
+ end
29
+
30
+ ins.binding_stack.empty?.should == true
31
+ end
32
+ end
33
+
34
+ describe "exit" do
35
+ it 'should pop a binding with exit' do
36
+ b = Pry.binding_for(:outer)
37
+ b.eval("x = :inner")
38
+
39
+ redirect_pry_io(InputTester.new("cd x", "$inner = self;", "exit", "$outer = self", "exit-all"), StringIO.new) do
40
+ b.pry
41
+ end
42
+ $inner.should == :inner
43
+ $outer.should == :outer
44
+ end
45
+
46
+ it 'should break out of the repl loop of Pry instance when binding_stack has only one binding with exit' do
47
+ Pry.start(0, :input => StringIO.new("exit")).should == 0
48
+ end
49
+
50
+ it 'should break out of the repl loop of Pry instance when binding_stack has only one binding with exit, and return user-given value' do
51
+ Pry.start(0, :input => StringIO.new("exit :john")).should == :john
52
+ end
53
+ end
54
+
55
+ describe "jump-to" do
56
+ it 'should jump to the proper binding index in the stack' do
57
+ outp = StringIO.new
58
+ redirect_pry_io(InputTester.new("cd 1", "cd 2", "jump-to 1", "$blah = self", "exit-all"), outp) do
59
+ Pry.start(0)
60
+ end
61
+
62
+ $blah.should == 1
63
+ end
64
+
65
+ it 'should print error when trying to jump to a non-existent binding index' do
66
+ outp = StringIO.new
67
+ redirect_pry_io(InputTester.new("cd 1", "cd 2", "jump-to 100", "exit-all"), outp) do
68
+ Pry.start(0)
69
+ end
70
+
71
+ outp.string.should =~ /Invalid nest level/
72
+ end
73
+
74
+ it 'should print error when trying to jump to the same binding index' do
75
+ outp = StringIO.new
76
+ redirect_pry_io(InputTester.new("cd 1", "cd 2", "jump-to 2", "exit-all"), outp) do
77
+ Pry.new.repl(0)
78
+ end
79
+
80
+ outp.string.should =~ /Already/
81
+ end
82
+ end
83
+
84
+ describe "exit-program" do
85
+ it 'should raise SystemExit' do
86
+ redirect_pry_io(InputTester.new("exit-program"), StringIO.new) do
87
+ lambda { Pry.new.repl(0).should == 0 }.should.raise SystemExit
88
+ end
89
+ end
90
+
91
+ it 'should exit the program with the provided value' do
92
+ redirect_pry_io(InputTester.new("exit-program 66"), StringIO.new) do
93
+ begin
94
+ Pry.new.repl(0)
95
+ rescue SystemExit => e
96
+ e.status.should == 66
97
+ end
98
+ end
99
+ end
100
+ end
101
+
4
102
  describe "cd" do
5
103
  after do
6
104
  $obj = nil
@@ -28,6 +126,10 @@ describe "Pry::DefaultCommands::Context" do
28
126
  $outer.should == :outer
29
127
  end
30
128
 
129
+ it 'should break out of the repl loop of Pry instance when binding_stack has only one binding with cd ..' do
130
+ Pry.start(0, :input => StringIO.new("cd ..")).should == 0
131
+ end
132
+
31
133
  it 'should break out to outer-most session with cd /' do
32
134
  b = Pry.binding_for(:outer)
33
135
  b.eval("x = :inner")
@@ -40,9 +142,91 @@ describe "Pry::DefaultCommands::Context" do
40
142
  $outer.should == :outer
41
143
  end
42
144
 
43
- it 'should start a session on TOPLEVEL_BINDING with cd ::' do
145
+ it 'should break out to outer-most session with just cd (no args)' do
44
146
  b = Pry.binding_for(:outer)
147
+ b.eval("x = :inner")
148
+
149
+ redirect_pry_io(InputTester.new("cd x", "$inner = self;", "cd 5", "$five = self", "cd", "$outer = self", "exit-all"), StringIO.new) do
150
+ b.pry
151
+ end
152
+ $inner.should == :inner
153
+ $five.should == 5
154
+ $outer.should == :outer
155
+ end
156
+
157
+ it 'should cd into an object and its ivar using cd obj/@ivar syntax' do
158
+ $obj = Object.new
159
+ $obj.instance_variable_set(:@x, 66)
160
+
161
+ redirect_pry_io(InputTester.new("cd $obj/@x", "$result = _pry_.binding_stack.dup", "exit-all"), StringIO.new) do
162
+ Pry.start
163
+ end
164
+ $result.size.should == 3
165
+ $result[1].eval('self').should == $obj
166
+ $result[2].eval('self').should == 66
167
+ end
45
168
 
169
+ it 'should cd into an object and its ivar using cd obj/@ivar/ syntax (note following /)' do
170
+ $obj = Object.new
171
+ $obj.instance_variable_set(:@x, 66)
172
+
173
+ redirect_pry_io(InputTester.new("cd $obj/@x/", "$result = _pry_.binding_stack.dup", "exit-all"), StringIO.new) do
174
+ Pry.start
175
+ end
176
+ $result.size.should == 3
177
+ $result[1].eval('self').should == $obj
178
+ $result[2].eval('self').should == 66
179
+ end
180
+
181
+ it 'should cd into previous object and its local using cd ../local syntax' do
182
+ $obj = Object.new
183
+ $obj.instance_variable_set(:@x, 66)
184
+
185
+ redirect_pry_io(InputTester.new("cd $obj", "local = :local", "cd @x", "cd ../local", "$result = _pry_.binding_stack.dup", "exit-all"), StringIO.new) do
186
+ Pry.start
187
+ end
188
+ $result.size.should == 3
189
+ $result[1].eval('self').should == $obj
190
+ $result[2].eval('self').should == :local
191
+ end
192
+
193
+ it 'should cd into an object and its ivar and back again using cd obj/@ivar/.. syntax' do
194
+ $obj = Object.new
195
+ $obj.instance_variable_set(:@x, 66)
196
+
197
+ redirect_pry_io(InputTester.new("cd $obj/@x/..", "$result = _pry_.binding_stack.dup", "exit-all"), StringIO.new) do
198
+ Pry.start
199
+ end
200
+ $result.size.should == 2
201
+ $result[1].eval('self').should == $obj
202
+ end
203
+
204
+ it 'should cd into an object and its ivar and back and then into another ivar using cd obj/@ivar/../@y syntax' do
205
+ $obj = Object.new
206
+ $obj.instance_variable_set(:@x, 66)
207
+ $obj.instance_variable_set(:@y, 79)
208
+
209
+ redirect_pry_io(InputTester.new("cd $obj/@x/../@y", "$result = _pry_.binding_stack.dup", "exit-all"), StringIO.new) do
210
+ Pry.start
211
+ end
212
+ $result.size.should == 3
213
+ $result[1].eval('self').should == $obj
214
+ $result[2].eval('self').should == 79
215
+ end
216
+
217
+ it 'should cd back to top-level and then into another ivar using cd /@ivar/ syntax' do
218
+ $obj = Object.new
219
+ $obj.instance_variable_set(:@x, 66)
220
+ TOPLEVEL_BINDING.eval('@z = 20')
221
+
222
+ redirect_pry_io(InputTester.new("cd $obj/@x/", "cd /@z", "$result = _pry_.binding_stack.dup", "exit-all"), StringIO.new) do
223
+ Pry.start
224
+ end
225
+ $result.size.should == 2
226
+ $result[1].eval('self').should == 20
227
+ end
228
+
229
+ it 'should start a session on TOPLEVEL_BINDING with cd ::' do
46
230
  redirect_pry_io(InputTester.new("cd ::", "$obj = self", "exit-all"), StringIO.new) do
47
231
  5.pry
48
232
  end