pry 0.9.12.6-i386-mswin32 → 0.10.0-i386-mswin32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (187) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +702 -0
  3. data/LICENSE +2 -2
  4. data/{README.markdown → README.md} +37 -31
  5. data/lib/pry.rb +38 -151
  6. data/lib/pry/cli.rb +35 -17
  7. data/lib/pry/code.rb +19 -63
  8. data/lib/pry/code/code_file.rb +103 -0
  9. data/lib/pry/code/code_range.rb +2 -1
  10. data/lib/pry/code/loc.rb +2 -2
  11. data/lib/pry/code_object.rb +40 -21
  12. data/lib/pry/color_printer.rb +55 -0
  13. data/lib/pry/command.rb +12 -9
  14. data/lib/pry/command_set.rb +81 -38
  15. data/lib/pry/commands.rb +1 -1
  16. data/lib/pry/commands/amend_line.rb +2 -2
  17. data/lib/pry/commands/bang.rb +1 -1
  18. data/lib/pry/commands/cat.rb +11 -2
  19. data/lib/pry/commands/cat/exception_formatter.rb +6 -7
  20. data/lib/pry/commands/cat/file_formatter.rb +15 -32
  21. data/lib/pry/commands/cat/input_expression_formatter.rb +1 -1
  22. data/lib/pry/commands/cd.rb +14 -3
  23. data/lib/pry/commands/change_inspector.rb +27 -0
  24. data/lib/pry/commands/change_prompt.rb +26 -0
  25. data/lib/pry/commands/code_collector.rb +4 -4
  26. data/lib/pry/commands/easter_eggs.rb +3 -3
  27. data/lib/pry/commands/edit.rb +10 -22
  28. data/lib/pry/commands/edit/exception_patcher.rb +2 -2
  29. data/lib/pry/commands/edit/file_and_line_locator.rb +0 -2
  30. data/lib/pry/commands/exit_program.rb +0 -1
  31. data/lib/pry/commands/find_method.rb +16 -22
  32. data/lib/pry/commands/gem_install.rb +5 -2
  33. data/lib/pry/commands/gem_open.rb +1 -1
  34. data/lib/pry/commands/gist.rb +10 -11
  35. data/lib/pry/commands/help.rb +14 -14
  36. data/lib/pry/commands/hist.rb +27 -8
  37. data/lib/pry/commands/install_command.rb +14 -12
  38. data/lib/pry/commands/list_inspectors.rb +35 -0
  39. data/lib/pry/commands/list_prompts.rb +35 -0
  40. data/lib/pry/commands/ls.rb +72 -296
  41. data/lib/pry/commands/ls/constants.rb +47 -0
  42. data/lib/pry/commands/ls/formatter.rb +49 -0
  43. data/lib/pry/commands/ls/globals.rb +48 -0
  44. data/lib/pry/commands/ls/grep.rb +21 -0
  45. data/lib/pry/commands/ls/instance_vars.rb +39 -0
  46. data/lib/pry/commands/ls/interrogatable.rb +18 -0
  47. data/lib/pry/commands/ls/jruby_hacks.rb +49 -0
  48. data/lib/pry/commands/ls/local_names.rb +35 -0
  49. data/lib/pry/commands/ls/local_vars.rb +39 -0
  50. data/lib/pry/commands/ls/ls_entity.rb +70 -0
  51. data/lib/pry/commands/ls/methods.rb +57 -0
  52. data/lib/pry/commands/ls/methods_helper.rb +46 -0
  53. data/lib/pry/commands/ls/self_methods.rb +32 -0
  54. data/lib/pry/commands/play.rb +44 -10
  55. data/lib/pry/commands/pry_backtrace.rb +1 -2
  56. data/lib/pry/commands/raise_up.rb +2 -2
  57. data/lib/pry/commands/reload_code.rb +16 -19
  58. data/lib/pry/commands/ri.rb +7 -3
  59. data/lib/pry/commands/shell_command.rb +18 -13
  60. data/lib/pry/commands/shell_mode.rb +2 -4
  61. data/lib/pry/commands/show_doc.rb +5 -0
  62. data/lib/pry/commands/show_info.rb +8 -13
  63. data/lib/pry/commands/show_source.rb +15 -3
  64. data/lib/pry/commands/simple_prompt.rb +1 -1
  65. data/lib/pry/commands/toggle_color.rb +8 -4
  66. data/lib/pry/commands/watch_expression.rb +105 -0
  67. data/lib/pry/commands/watch_expression/expression.rb +38 -0
  68. data/lib/pry/commands/whereami.rb +18 -10
  69. data/lib/pry/commands/wtf.rb +3 -3
  70. data/lib/pry/config.rb +20 -254
  71. data/lib/pry/config/behavior.rb +139 -0
  72. data/lib/pry/config/convenience.rb +26 -0
  73. data/lib/pry/config/default.rb +165 -0
  74. data/lib/pry/core_extensions.rb +31 -21
  75. data/lib/pry/editor.rb +107 -103
  76. data/lib/pry/exceptions.rb +77 -0
  77. data/lib/pry/helpers/base_helpers.rb +22 -109
  78. data/lib/pry/helpers/command_helpers.rb +10 -8
  79. data/lib/pry/helpers/documentation_helpers.rb +1 -2
  80. data/lib/pry/helpers/text.rb +4 -5
  81. data/lib/pry/history.rb +46 -45
  82. data/lib/pry/history_array.rb +6 -1
  83. data/lib/pry/hooks.rb +9 -29
  84. data/lib/pry/indent.rb +6 -6
  85. data/lib/pry/input_completer.rb +242 -0
  86. data/lib/pry/input_lock.rb +132 -0
  87. data/lib/pry/inspector.rb +27 -0
  88. data/lib/pry/last_exception.rb +61 -0
  89. data/lib/pry/method.rb +82 -87
  90. data/lib/pry/{commands/edit/method_patcher.rb → method/patcher.rb} +41 -38
  91. data/lib/pry/module_candidate.rb +4 -14
  92. data/lib/pry/object_path.rb +82 -0
  93. data/lib/pry/output.rb +50 -0
  94. data/lib/pry/pager.rb +193 -48
  95. data/lib/pry/plugins.rb +1 -1
  96. data/lib/pry/prompt.rb +26 -0
  97. data/lib/pry/pry_class.rb +149 -230
  98. data/lib/pry/pry_instance.rb +302 -413
  99. data/lib/pry/rbx_path.rb +1 -1
  100. data/lib/pry/repl.rb +202 -0
  101. data/lib/pry/repl_file_loader.rb +20 -26
  102. data/lib/pry/rubygem.rb +13 -5
  103. data/lib/pry/terminal.rb +2 -1
  104. data/lib/pry/test/helper.rb +26 -41
  105. data/lib/pry/version.rb +1 -1
  106. data/lib/pry/wrapped_module.rb +45 -59
  107. metadata +62 -225
  108. data/.document +0 -2
  109. data/.gitignore +0 -16
  110. data/.travis.yml +0 -25
  111. data/.yardopts +0 -1
  112. data/CHANGELOG +0 -534
  113. data/CONTRIBUTORS +0 -55
  114. data/Gemfile +0 -12
  115. data/Rakefile +0 -140
  116. data/TODO +0 -117
  117. data/lib/pry/completion.rb +0 -321
  118. data/lib/pry/custom_completions.rb +0 -6
  119. data/lib/pry/rbx_method.rb +0 -13
  120. data/man/pry.1 +0 -195
  121. data/man/pry.1.html +0 -204
  122. data/man/pry.1.ronn +0 -141
  123. data/pry.gemspec +0 -29
  124. data/spec/Procfile +0 -3
  125. data/spec/cli_spec.rb +0 -78
  126. data/spec/code_object_spec.rb +0 -277
  127. data/spec/code_spec.rb +0 -219
  128. data/spec/command_helpers_spec.rb +0 -29
  129. data/spec/command_integration_spec.rb +0 -644
  130. data/spec/command_set_spec.rb +0 -627
  131. data/spec/command_spec.rb +0 -821
  132. data/spec/commands/amend_line_spec.rb +0 -247
  133. data/spec/commands/bang_spec.rb +0 -19
  134. data/spec/commands/cat_spec.rb +0 -164
  135. data/spec/commands/cd_spec.rb +0 -250
  136. data/spec/commands/disable_pry_spec.rb +0 -25
  137. data/spec/commands/edit_spec.rb +0 -727
  138. data/spec/commands/exit_all_spec.rb +0 -34
  139. data/spec/commands/exit_program_spec.rb +0 -19
  140. data/spec/commands/exit_spec.rb +0 -34
  141. data/spec/commands/find_method_spec.rb +0 -70
  142. data/spec/commands/gem_list_spec.rb +0 -26
  143. data/spec/commands/gist_spec.rb +0 -79
  144. data/spec/commands/help_spec.rb +0 -56
  145. data/spec/commands/hist_spec.rb +0 -181
  146. data/spec/commands/jump_to_spec.rb +0 -15
  147. data/spec/commands/ls_spec.rb +0 -181
  148. data/spec/commands/play_spec.rb +0 -140
  149. data/spec/commands/raise_up_spec.rb +0 -56
  150. data/spec/commands/save_file_spec.rb +0 -177
  151. data/spec/commands/show_doc_spec.rb +0 -510
  152. data/spec/commands/show_input_spec.rb +0 -17
  153. data/spec/commands/show_source_spec.rb +0 -782
  154. data/spec/commands/whereami_spec.rb +0 -203
  155. data/spec/completion_spec.rb +0 -241
  156. data/spec/control_d_handler_spec.rb +0 -58
  157. data/spec/documentation_helper_spec.rb +0 -73
  158. data/spec/editor_spec.rb +0 -79
  159. data/spec/exception_whitelist_spec.rb +0 -21
  160. data/spec/fixtures/candidate_helper1.rb +0 -11
  161. data/spec/fixtures/candidate_helper2.rb +0 -8
  162. data/spec/fixtures/example.erb +0 -5
  163. data/spec/fixtures/example_nesting.rb +0 -33
  164. data/spec/fixtures/show_source_doc_examples.rb +0 -15
  165. data/spec/fixtures/testrc +0 -2
  166. data/spec/fixtures/testrcbad +0 -2
  167. data/spec/fixtures/whereami_helper.rb +0 -6
  168. data/spec/helper.rb +0 -34
  169. data/spec/helpers/bacon.rb +0 -86
  170. data/spec/helpers/mock_pry.rb +0 -43
  171. data/spec/helpers/table_spec.rb +0 -105
  172. data/spec/history_array_spec.rb +0 -67
  173. data/spec/hooks_spec.rb +0 -522
  174. data/spec/indent_spec.rb +0 -301
  175. data/spec/input_stack_spec.rb +0 -90
  176. data/spec/method_spec.rb +0 -482
  177. data/spec/prompt_spec.rb +0 -60
  178. data/spec/pry_defaults_spec.rb +0 -419
  179. data/spec/pry_history_spec.rb +0 -99
  180. data/spec/pry_output_spec.rb +0 -95
  181. data/spec/pry_spec.rb +0 -515
  182. data/spec/run_command_spec.rb +0 -25
  183. data/spec/sticky_locals_spec.rb +0 -157
  184. data/spec/syntax_checking_spec.rb +0 -81
  185. data/spec/wrapped_module_spec.rb +0 -261
  186. data/wiki/Customizing-pry.md +0 -397
  187. data/wiki/Home.md +0 -4
@@ -1,301 +0,0 @@
1
- require 'helper'
2
-
3
- # Please keep in mind that any hash signs ("#") in the heredoc strings are
4
- # placed on purpose. Without these editors might remove the whitespace on empty
5
- # lines.
6
- describe Pry::Indent do
7
- before do
8
- @indent = Pry::Indent.new
9
- end
10
-
11
- it 'should indent an array' do
12
- input = "array = [\n10,\n15\n]"
13
- output = "array = [\n 10,\n 15\n]"
14
-
15
- @indent.indent(input).should == output
16
- end
17
-
18
- it 'should indent a hash' do
19
- input = "hash = {\n:name => 'Ruby'\n}"
20
- output = "hash = {\n :name => 'Ruby'\n}"
21
-
22
- @indent.indent(input).should == output
23
- end
24
-
25
- it 'should indent a function' do
26
- input = "def\nreturn 10\nend"
27
- output = "def\n return 10\nend"
28
-
29
- @indent.indent(input).should == output
30
- end
31
-
32
- it 'should indent a module and class' do
33
- input = "module Foo\n# Hello world\nend"
34
- output = "module Foo\n # Hello world\nend"
35
- input_class = "class Foo\n# Hello world\nend"
36
- output_class = "class Foo\n # Hello world\nend"
37
-
38
- @indent.indent(input).should == output
39
- @indent.indent(input_class).should == output_class
40
- end
41
-
42
- it 'should indent separate lines' do
43
- @indent.indent('def foo').should == 'def foo'
44
- @indent.indent('return 10').should == ' return 10'
45
- @indent.indent('end').should == 'end'
46
- end
47
-
48
- it 'should not indent single line statements' do
49
- input = <<TXT.strip
50
- def hello; end
51
- puts "Hello"
52
- TXT
53
-
54
- @indent.indent(input).should == input
55
- end
56
-
57
- it 'should handle multiple open and closing tokens on a line' do
58
- input = <<TXT.strip
59
- [10, 15].each do |num|
60
- puts num
61
- end
62
- TXT
63
-
64
- output = <<TXT.strip
65
- [10, 15].each do |num|
66
- puts num
67
- end
68
- TXT
69
-
70
- @indent.indent(input).should == output
71
- end
72
-
73
- it 'should properly indent nested code' do
74
- input = <<TXT.strip
75
- module A
76
- module B
77
- class C
78
- attr_accessor :test
79
- # keep
80
- def number
81
- return 10
82
- end
83
- end
84
- end
85
- end
86
- TXT
87
-
88
- output = <<TXT.strip
89
- module A
90
- module B
91
- class C
92
- attr_accessor :test
93
- # keep
94
- def number
95
- return 10
96
- end
97
- end
98
- end
99
- end
100
- TXT
101
-
102
- @indent.indent(input).should == output
103
- end
104
-
105
- it 'should indent statements such as if, else, etc' do
106
- input = <<TXT.strip
107
- if a == 10
108
- #
109
- elsif a == 15
110
- #
111
- else
112
- #
113
- end
114
- #
115
- while true
116
- #
117
- end
118
- #
119
- for num in [10, 15, 20]
120
- #
121
- end
122
- #
123
- for num in [10, 15, 20] do
124
- #
125
- end
126
- TXT
127
-
128
- output = <<TXT.strip
129
- if a == 10
130
- #
131
- elsif a == 15
132
- #
133
- else
134
- #
135
- end
136
- #
137
- while true
138
- #
139
- end
140
- #
141
- for num in [10, 15, 20]
142
- #
143
- end
144
- #
145
- for num in [10, 15, 20] do
146
- #
147
- end
148
- TXT
149
-
150
- @indent.indent(input).should == output
151
- end
152
-
153
- it "should correctly handle while <foo> do" do
154
- input = "while 5 do\n5\nend"
155
- @indent.indent(input).should == "while 5 do\n 5\nend"
156
- end
157
-
158
- it "should ident case statements" do
159
- input = <<TXT.strip
160
- case foo
161
- when 1
162
- 2
163
- when 2
164
- if 3
165
- 4
166
- end
167
- when 5
168
- #
169
- else
170
- #
171
- end
172
- TXT
173
-
174
- output = <<TXT.strip
175
- case foo
176
- when 1
177
- 2
178
- when 2
179
- if 3
180
- 4
181
- end
182
- when 5
183
- #
184
- else
185
- #
186
- end
187
- TXT
188
-
189
- @indent.indent(input).should == output
190
- end
191
-
192
- it "should indent correctly with nesting" do
193
- @indent.indent("[[\n[]]\n]").should == "[[\n []]\n]"
194
- @indent.reset.indent("[[\n[]]\n]").should == "[[\n []]\n]"
195
- @indent.reset.indent("[[{\n[] =>\n[]}]\n]").should == "[[{\n [] =>\n []}]\n]"
196
- end
197
-
198
- it "should not indent single-line ifs" do
199
- @indent.indent("foo if bar\n#").should == "foo if bar\n#"
200
- @indent.reset.indent("foo() if bar\n#").should == "foo() if bar\n#"
201
- @indent.reset.indent("foo 'hi' if bar\n#").should == "foo 'hi' if bar\n#"
202
- @indent.reset.indent("foo 1 while bar\n#").should == "foo 1 while bar\n#"
203
- @indent.reset.indent("super if true\n#").should == "super if true\n#"
204
- @indent.reset.indent("true if false\n#").should == "true if false\n#"
205
- @indent.reset.indent("String if false\n#").should == "String if false\n#"
206
- end
207
-
208
- it "should indent cunningly disguised ifs" do
209
- @indent.indent("{1 => if bar\n#").should == "{1 => if bar\n #"
210
- @indent.reset.indent("foo(if bar\n#").should == "foo(if bar\n #"
211
- @indent.reset.indent("bar(baz, if bar\n#").should == "bar(baz, if bar\n #"
212
- @indent.reset.indent("[if bar\n#").should == "[if bar\n #"
213
- @indent.reset.indent("true; while bar\n#").should == "true; while bar\n #"
214
- end
215
-
216
- it "should differentiate single/multi-line unless" do
217
- @indent.indent("foo unless bar\nunless foo\nbar\nend").should == "foo unless bar\nunless foo\n bar\nend"
218
- end
219
-
220
- it "should not indent single/multi-line until" do
221
- @indent.indent("%w{baz} until bar\nuntil foo\nbar\nend").should == "%w{baz} until bar\nuntil foo\n bar\nend"
222
- end
223
-
224
- it "should indent begin rescue end" do
225
- input = <<INPUT.strip
226
- begin
227
- doo :something => :wrong
228
- rescue => e
229
- doit :right
230
- end
231
- INPUT
232
- output = <<OUTPUT.strip
233
- begin
234
- doo :something => :wrong
235
- rescue => e
236
- doit :right
237
- end
238
- OUTPUT
239
-
240
- @indent.indent(input).should == output
241
- end
242
-
243
- it "should not indent inside strings" do
244
- @indent.indent(%(def a\n"foo\nbar"\n end)).should == %(def a\n "foo\nbar"\nend)
245
- @indent.indent(%(def a\nputs %w(foo\nbar), 'foo\nbar'\n end)).should == %(def a\n puts %w(foo\nbar), 'foo\nbar'\nend)
246
- end
247
-
248
- it "should not indent inside HEREDOCs" do
249
- @indent.indent(%(def a\nputs <<FOO\n bar\nFOO\nbaz\nend)).should == %(def a\n puts <<FOO\n bar\nFOO\n baz\nend)
250
- @indent.indent(%(def a\nputs <<-'^^'\n bar\n\t^^\nbaz\nend)).should == %(def a\n puts <<-'^^'\n bar\n\t^^\n baz\nend)
251
- end
252
-
253
- it "should not indent nested HEREDOCs" do
254
- input = <<INPUT.strip
255
- def a
256
- puts <<FOO, <<-BAR, "baz", <<-':p'
257
- foo
258
- FOO
259
- bar
260
- BAR
261
- tongue
262
- :p
263
- puts :p
264
- end
265
- INPUT
266
-
267
- output = <<OUTPUT.strip
268
- def a
269
- puts <<FOO, <<-BAR, "baz", <<-':p'
270
- foo
271
- FOO
272
- bar
273
- BAR
274
- tongue
275
- :p
276
- puts :p
277
- end
278
- OUTPUT
279
-
280
- @indent.indent(input).should == output
281
- end
282
-
283
- describe "nesting" do
284
- test = File.read("spec/fixtures/example_nesting.rb")
285
-
286
- test.lines.each_with_index do |line, i|
287
- result = line.split("#").last.strip
288
- if result == ""
289
- it "should fail to parse nesting on line #{i + 1} of example_nesting.rb" do
290
- lambda {
291
- Pry::Indent.nesting_at(test, i + 1)
292
- }.should.raise(Pry::Indent::UnparseableNestingError)
293
- end
294
- else
295
- it "should parse nesting on line #{i + 1} of example_nesting.rb" do
296
- Pry::Indent.nesting_at(test, i + 1).should == eval(result)
297
- end
298
- end
299
- end
300
- end
301
- end
@@ -1,90 +0,0 @@
1
- # coding: utf-8
2
- require 'helper'
3
-
4
- describe "Pry#input_stack" do
5
- before do
6
- @str_output = StringIO.new
7
- end
8
-
9
- it 'should accept :input_stack as a config option' do
10
- stack = [StringIO.new("test")]
11
- Pry.new(:input_stack => stack).input_stack.should == stack
12
- end
13
-
14
- it 'should use defaults from Pry.config' do
15
- Pry.config.input_stack = [StringIO.new("exit")]
16
- Pry.new.input_stack.should == Pry.config.input_stack
17
- Pry.config.input_stack = []
18
- end
19
-
20
- it 'should read from all input objects on stack and exit session (usingn repl)' do
21
- stack = [b = StringIO.new(":cloister\nexit\n"), c = StringIO.new(":baron\n")]
22
- instance = Pry.new(:input => StringIO.new(":alex\n"),
23
- :output => @str_output,
24
- :input_stack => stack)
25
-
26
- instance.repl
27
- @str_output.string.should =~ /:alex/
28
- @str_output.string.should =~ /:baron/
29
- @str_output.string.should =~ /:cloister/
30
- end
31
-
32
- it 'input objects should be popped off stack as they are used up' do
33
- stack = [StringIO.new(":cloister\n"), StringIO.new(":baron\n")]
34
- instance = Pry.new(:input => StringIO.new(":alex\n"),
35
- :output => @str_output,
36
- :input_stack => stack)
37
-
38
- stack.size.should == 2
39
-
40
- instance.rep
41
- @str_output.string.should =~ /:alex/
42
- instance.rep
43
- @str_output.string.should =~ /:baron/
44
- stack.size.should == 1
45
- instance.rep
46
- @str_output.string.should =~ /:cloister/
47
- stack.size.should == 0
48
- end
49
-
50
- it 'should revert to Pry.config.input when it runs out of input objects in input_stack' do
51
- redirect_pry_io(StringIO.new(":rimbaud\nexit\n"), StringIO.new) do
52
- stack = [StringIO.new(":cloister\n"), StringIO.new(":baron\n")]
53
- instance = Pry.new(:input => StringIO.new(":alex\n"),
54
- :output => @str_output,
55
- :input_stack => stack)
56
-
57
- instance.repl
58
- @str_output.string.should =~ /:alex/
59
- @str_output.string.should =~ /:baron/
60
- @str_output.string.should =~ /:cloister/
61
- @str_output.string.should =~ /:rimbaud/
62
- end
63
- end
64
-
65
- it 'should display error and throw(:breakout) if at end of input after using up input_stack objects' do
66
- catch(:breakout) do
67
- redirect_pry_io(StringIO.new(":rimbaud\n"), @str_output) do
68
- Pry.new(:input_stack => [StringIO.new(":a\n"), StringIO.new(":b\n")]).repl
69
- end
70
- end
71
- @str_output.string.should =~ /Error: Pry ran out of things to read/
72
- end
73
-
74
- if "".respond_to?(:encoding)
75
- after do
76
- Pry.line_buffer = [""]
77
- Pry.current_line = 1
78
- end
79
- it "should pass strings to Pry in the right encoding" do
80
- input1 = "'f。。'.encoding.name" # utf-8, see coding declaration
81
- input2 = input1.encode('Shift_JIS')
82
-
83
- mock_pry(input1, input2).should == %{=> "UTF-8"\n=> "Shift_JIS"\n\n}
84
- end
85
-
86
- it "should be able to use unicode regexes on a UTF-8 terminal" do
87
- mock_pry('":-Þ" =~ /þ/i').should == %{=> 2\n\n}
88
- end
89
- end
90
- end
@@ -1,482 +0,0 @@
1
- require 'helper'
2
- require 'set'
3
-
4
- describe Pry::Method do
5
- it "should use String names for compatibility" do
6
- klass = Class.new { def hello; end }
7
- Pry::Method.new(klass.instance_method(:hello)).name.should == "hello"
8
- end
9
-
10
- describe ".from_str" do
11
- it 'should look up instance methods if no methods available and no options provided' do
12
- klass = Class.new { def hello; end }
13
- meth = Pry::Method.from_str(:hello, Pry.binding_for(klass))
14
- meth.should == klass.instance_method(:hello)
15
- end
16
-
17
- it 'should look up methods if no instance methods available and no options provided' do
18
- klass = Class.new { def self.hello; end }
19
- meth = Pry::Method.from_str(:hello, Pry.binding_for(klass))
20
- meth.should == klass.method(:hello)
21
- end
22
-
23
- it 'should look up instance methods first even if methods available and no options provided' do
24
- klass = Class.new { def hello; end; def self.hello; end }
25
- meth = Pry::Method.from_str(:hello, Pry.binding_for(klass))
26
- meth.should == klass.instance_method(:hello)
27
- end
28
-
29
- it 'should look up instance methods if "instance-methods" option provided' do
30
- klass = Class.new { def hello; end; def self.hello; end }
31
- meth = Pry::Method.from_str(:hello, Pry.binding_for(klass), {"instance-methods" => true})
32
- meth.should == klass.instance_method(:hello)
33
- end
34
-
35
- it 'should look up methods if :methods option provided' do
36
- klass = Class.new { def hello; end; def self.hello; end }
37
- meth = Pry::Method.from_str(:hello, Pry.binding_for(klass), {:methods => true})
38
- meth.should == klass.method(:hello)
39
- end
40
-
41
- it 'should look up instance methods using the Class#method syntax' do
42
- klass = Class.new { def hello; end; def self.hello; end }
43
- meth = Pry::Method.from_str("klass#hello", Pry.binding_for(binding))
44
- meth.should == klass.instance_method(:hello)
45
- end
46
-
47
- it 'should look up methods using the object.method syntax' do
48
- klass = Class.new { def hello; end; def self.hello; end }
49
- meth = Pry::Method.from_str("klass.hello", Pry.binding_for(binding))
50
- meth.should == klass.method(:hello)
51
- end
52
-
53
- it 'should NOT look up instance methods using the Class#method syntax if no instance methods defined' do
54
- klass = Class.new { def self.hello; end }
55
- meth = Pry::Method.from_str("klass#hello", Pry.binding_for(binding))
56
- meth.should == nil
57
- end
58
-
59
- it 'should NOT look up methods using the object.method syntax if no methods defined' do
60
- klass = Class.new { def hello; end }
61
- meth = Pry::Method.from_str("klass.hello", Pry.binding_for(binding))
62
- meth.should == nil
63
- end
64
-
65
- it 'should look up methods using klass.new.method syntax' do
66
- klass = Class.new { def hello; :hello; end }
67
- meth = Pry::Method.from_str("klass.new.hello", Pry.binding_for(binding))
68
- meth.name.should == "hello"
69
- end
70
-
71
- it 'should look up instance methods using klass.meth#method syntax' do
72
- klass = Class.new { def self.meth; Class.new; end }
73
- meth = Pry::Method.from_str("klass.meth#initialize", Pry.binding_for(binding))
74
- meth.name.should == "initialize"
75
- end
76
-
77
- it 'should look up methods using instance::bar syntax' do
78
- klass = Class.new{ def self.meth; Class.new; end }
79
- meth = Pry::Method.from_str("klass::meth", Pry.binding_for(binding))
80
- meth.name.should == "meth"
81
- end
82
-
83
- it 'should not raise an exception if receiver does not exist' do
84
- lambda { Pry::Method.from_str("random_klass.meth", Pry.binding_for(binding)) }.should.not.raise
85
- end
86
- end
87
-
88
- describe '.from_binding' do
89
- it 'should be able to pick a method out of a binding' do
90
- Pry::Method.from_binding(Class.new{ def self.foo; binding; end }.foo).name.should == "foo"
91
- end
92
-
93
- it 'should NOT find a method from the toplevel binding' do
94
- Pry::Method.from_binding(TOPLEVEL_BINDING).should == nil
95
- end
96
-
97
- it "should find methods that have been undef'd" do
98
- c = Class.new do
99
- def self.bar
100
- class << self; undef bar; end
101
- binding
102
- end
103
- end
104
-
105
- m = Pry::Method.from_binding(c.bar)
106
- m.name.should == "bar"
107
- end
108
-
109
- # Our source_location trick doesn't work, due to https://github.com/rubinius/rubinius/issues/953
110
- unless Pry::Helpers::BaseHelpers.rbx?
111
- it 'should find the super method correctly' do
112
- a = Class.new{ def gag33; binding; end; def self.line; __LINE__; end }
113
- b = Class.new(a){ def gag33; super; end }
114
-
115
- g = b.new.gag33
116
- m = Pry::Method.from_binding(g)
117
-
118
- m.owner.should == a
119
- m.source_line.should == a.line
120
- m.name.should == "gag33"
121
- end
122
- end
123
-
124
- it 'should find the right method if a super method exists' do
125
- a = Class.new{ def gag; binding; end; }
126
- b = Class.new(a){ def gag; super; binding; end; def self.line; __LINE__; end }
127
-
128
- m = Pry::Method.from_binding(b.new.gag)
129
-
130
- m.owner.should == b
131
- m.source_line.should == b.line
132
- m.name.should == "gag"
133
- end
134
-
135
- if defined?(BasicObject) && !Pry::Helpers::BaseHelpers.rbx? # rubinius issue 1921
136
- it "should find the right method from a BasicObject" do
137
- a = Class.new(BasicObject) { def gag; ::Kernel.binding; end; def self.line; __LINE__; end }
138
-
139
- m = Pry::Method.from_binding(a.new.gag)
140
- m.owner.should == a
141
- m.source_file.should == __FILE__
142
- m.source_line.should == a.line
143
- end
144
- end
145
-
146
- it 'should find the right method even if it was renamed and replaced' do
147
- o = Object.new
148
- class << o
149
- def borscht
150
- "nips"
151
- binding
152
- end
153
- alias paella borscht
154
- def borscht() paella end
155
- end
156
-
157
- m = Pry::Method.from_binding(o.borscht)
158
- m.source.should == Pry::Method(o.method(:paella)).source
159
- end
160
- end
161
-
162
- describe 'super' do
163
- it 'should be able to find the super method on a bound method' do
164
- a = Class.new{ def rar; 4; end }
165
- b = Class.new(a){ def rar; super; end }
166
-
167
- obj = b.new
168
-
169
- zuper = Pry::Method(obj.method(:rar)).super
170
- zuper.owner.should == a
171
- zuper.receiver.should == obj
172
- end
173
-
174
- it 'should be able to find the super method of an unbound method' do
175
- a = Class.new{ def rar; 4; end }
176
- b = Class.new(a){ def rar; super; end }
177
-
178
- zuper = Pry::Method(b.instance_method(:rar)).super
179
- zuper.owner.should == a
180
- end
181
-
182
- it 'should return nil if no super method exists' do
183
- a = Class.new{ def rar; super; end }
184
-
185
- Pry::Method(a.instance_method(:rar)).super.should == nil
186
- end
187
-
188
- it 'should be able to find super methods defined on modules' do
189
- m = Module.new{ def rar; 4; end }
190
- a = Class.new{ def rar; super; end; include m }
191
-
192
- zuper = Pry::Method(a.new.method(:rar)).super
193
- zuper.owner.should == m
194
- end
195
-
196
- it 'should be able to find super methods defined on super-classes when there are modules in the way' do
197
- a = Class.new{ def rar; 4; end }
198
- m = Module.new{ def mooo; 4; end }
199
- b = Class.new(a){ def rar; super; end; include m }
200
-
201
- zuper = Pry::Method(b.new.method(:rar)).super
202
- zuper.owner.should == a
203
- end
204
-
205
- it 'should be able to jump up multiple levels of bound method, even through modules' do
206
- a = Class.new{ def rar; 4; end }
207
- m = Module.new{ def rar; 4; end }
208
- b = Class.new(a){ def rar; super; end; include m }
209
-
210
- zuper = Pry::Method(b.new.method(:rar)).super
211
- zuper.owner.should == m
212
- zuper.super.owner.should == a
213
- end
214
- end
215
-
216
- describe 'all_from_class' do
217
- def should_find_method(name)
218
- Pry::Method.all_from_class(@class).map(&:name).should.include(name)
219
- end
220
-
221
- it 'should be able to find public instance methods defined in a class' do
222
- @class = Class.new{ def meth; 1; end }
223
- should_find_method('meth')
224
- end
225
-
226
- it 'should be able to find private and protected instance methods defined in a class' do
227
- @class = Class.new { protected; def prot; 1; end; private; def priv; 1; end }
228
- should_find_method('priv')
229
- should_find_method('prot')
230
- end
231
-
232
- it 'should find methods all the way up to Kernel' do
233
- @class = Class.new
234
- should_find_method('exit!')
235
- end
236
-
237
- it 'should be able to find instance methods defined in a super-class' do
238
- @class = Class.new(Class.new{ def meth; 1; end }) {}
239
- should_find_method('meth')
240
- end
241
-
242
- it 'should be able to find instance methods defined in modules included into this class' do
243
- @class = Class.new{ include Module.new{ def meth; 1; end; } }
244
- should_find_method('meth')
245
- end
246
-
247
- it 'should be able to find instance methods defined in modules included into super-classes' do
248
- @class = Class.new(Class.new{ include Module.new{ def meth; 1; end; } })
249
- should_find_method('meth')
250
- end
251
-
252
- it 'should attribute overridden methods to the sub-class' do
253
- @class = Class.new(Class.new{ include Module.new{ def meth; 1; end; } }) { def meth; 2; end }
254
- Pry::Method.all_from_class(@class).detect{ |x| x.name == 'meth' }.owner.should == @class
255
- end
256
-
257
- it 'should be able to find methods defined on a singleton class' do
258
- @class = (class << Object.new; def meth; 1; end; self; end)
259
- should_find_method('meth')
260
- end
261
-
262
- it 'should be able to find methods on super-classes when given a singleton class' do
263
- @class = (class << Class.new{ def meth; 1; end}.new; self; end)
264
- should_find_method('meth')
265
- end
266
- end
267
-
268
- describe 'all_from_obj' do
269
- describe 'on normal objects' do
270
- def should_find_method(name)
271
- Pry::Method.all_from_obj(@obj).map(&:name).should.include(name)
272
- end
273
-
274
- it "should find methods defined in the object's class" do
275
- @obj = Class.new{ def meth; 1; end }.new
276
- should_find_method('meth')
277
- end
278
-
279
- it "should find methods defined in modules included into the object's class" do
280
- @obj = Class.new{ include Module.new{ def meth; 1; end } }.new
281
- should_find_method('meth')
282
- end
283
-
284
- it "should find methods defined in the object's singleton class" do
285
- @obj = Object.new
286
- class << @obj; def meth; 1; end; end
287
- should_find_method('meth')
288
- end
289
-
290
- it "should find methods in modules included into the object's singleton class" do
291
- @obj = Object.new
292
- @obj.extend Module.new{ def meth; 1; end }
293
- should_find_method('meth')
294
- end
295
-
296
- it "should find methods all the way up to Kernel" do
297
- @obj = Object.new
298
- should_find_method('exit!')
299
- end
300
-
301
- it "should not find methods defined on the classes singleton class" do
302
- @obj = Class.new{ class << self; def meth; 1; end; end }.new
303
- Pry::Method.all_from_obj(@obj).map(&:name).should.not.include('meth')
304
- end
305
-
306
- it "should work in the face of an overridden send" do
307
- @obj = Class.new{ def meth; 1; end; def send; raise EOFError; end }.new
308
- should_find_method('meth')
309
- end
310
- end
311
-
312
- describe 'on classes' do
313
- def should_find_method(name)
314
- Pry::Method.all_from_obj(@class).map(&:name).should.include(name)
315
- end
316
-
317
- it "should find methods defined in the class' singleton class" do
318
- @class = Class.new{ class << self; def meth; 1; end; end }
319
- should_find_method('meth')
320
- end
321
-
322
- it "should find methods defined on modules extended into the class" do
323
- @class = Class.new{ extend Module.new{ def meth; 1; end; } }
324
- should_find_method('meth')
325
- end
326
-
327
- it "should find methods defined on the singleton class of super-classes" do
328
- @class = Class.new(Class.new{ class << self; def meth; 1; end; end })
329
- should_find_method('meth')
330
- end
331
-
332
- it "should not find methods defined within the class" do
333
- @class = Class.new{ def meth; 1; end }
334
- Pry::Method.all_from_obj(@obj).map(&:name).should.not.include('meth')
335
- end
336
-
337
- it "should find methods defined on Class" do
338
- @class = Class.new
339
- should_find_method('allocate')
340
- end
341
-
342
- it "should find methods defined on Kernel" do
343
- @class = Class.new
344
- should_find_method('exit!')
345
- end
346
-
347
- it "should attribute overridden methods to the sub-class' singleton class" do
348
- @class = Class.new(Class.new{ class << self; def meth; 1; end; end }) { class << self; def meth; 1; end; end }
349
- Pry::Method.all_from_obj(@class).detect{ |x| x.name == 'meth' }.owner.should == (class << @class; self; end)
350
- end
351
-
352
- it "should attrbute overridden methods to the class not the module" do
353
- @class = Class.new { class << self; def meth; 1; end; end; extend Module.new{ def meth; 1; end; } }
354
- Pry::Method.all_from_obj(@class).detect{ |x| x.name == 'meth' }.owner.should == (class << @class; self; end)
355
- end
356
-
357
- it "should attribute overridden methods to the relevant singleton class in preference to Class" do
358
- @class = Class.new { class << self; def allocate; 1; end; end }
359
- Pry::Method.all_from_obj(@class).detect{ |x| x.name == 'allocate' }.owner.should == (class << @class; self; end)
360
- end
361
- end
362
-
363
- describe 'method resolution order' do
364
- module LS
365
- class Top; end
366
-
367
- class Next < Top; end
368
-
369
- module M; end
370
- module N; include M; end
371
- module O; include M; end
372
- module P; end
373
-
374
- class Low < Next; include N; include P; end
375
- class Lower < Low; extend N; end
376
- class Bottom < Lower; extend O; end
377
- end
378
-
379
- def singleton_class(obj); class << obj; self; end; end
380
-
381
- it "should look at a class and then its superclass" do
382
- Pry::Method.instance_resolution_order(LS::Next).should == [LS::Next] + Pry::Method.instance_resolution_order(LS::Top)
383
- end
384
-
385
- it "should include the included modules between a class and its superclass" do
386
- Pry::Method.instance_resolution_order(LS::Low).should == [LS::Low, LS::P, LS::N, LS::M] + Pry::Method.instance_resolution_order(LS::Next)
387
- end
388
-
389
- it "should not include modules extended into the class" do
390
- Pry::Method.instance_resolution_order(LS::Bottom).should == [LS::Bottom] + Pry::Method.instance_resolution_order(LS::Lower)
391
- end
392
-
393
- it "should include included modules for Modules" do
394
- Pry::Method.instance_resolution_order(LS::O).should == [LS::O, LS::M]
395
- end
396
-
397
- it "should include the singleton class of objects" do
398
- obj = LS::Low.new
399
- Pry::Method.resolution_order(obj).should == [singleton_class(obj)] + Pry::Method.instance_resolution_order(LS::Low)
400
- end
401
-
402
- it "should not include singleton classes of numbers" do
403
- Pry::Method.resolution_order(4).should == Pry::Method.instance_resolution_order(Fixnum)
404
- end
405
-
406
- it "should include singleton classes for classes" do
407
- Pry::Method.resolution_order(LS::Low).should == [singleton_class(LS::Low)] + Pry::Method.resolution_order(LS::Next)
408
- end
409
-
410
- it "should include modules included into singleton classes" do
411
- Pry::Method.resolution_order(LS::Lower).should == [singleton_class(LS::Lower), LS::N, LS::M] + Pry::Method.resolution_order(LS::Low)
412
- end
413
-
414
- it "should include modules at most once" do
415
- Pry::Method.resolution_order(LS::Bottom).count(LS::M).should == 1
416
- end
417
-
418
- it "should include modules at the point which they would be reached" do
419
- Pry::Method.resolution_order(LS::Bottom).should == [singleton_class(LS::Bottom), LS::O] + (Pry::Method.resolution_order(LS::Lower))
420
- end
421
-
422
- it "should include the Pry::Method.instance_resolution_order of Class after the singleton classes" do
423
- Pry::Method.resolution_order(LS::Top).should ==
424
- [singleton_class(LS::Top), singleton_class(Object), (defined? BasicObject) && singleton_class(BasicObject)].compact +
425
- Pry::Method.instance_resolution_order(Class)
426
- end
427
- end
428
- end
429
-
430
- describe 'method_name_from_first_line' do
431
- it 'should work in all simple cases' do
432
- meth = Pry::Method.new(nil)
433
- meth.send(:method_name_from_first_line, "def x").should == "x"
434
- meth.send(:method_name_from_first_line, "def self.x").should == "x"
435
- meth.send(:method_name_from_first_line, "def ClassName.x").should == "x"
436
- meth.send(:method_name_from_first_line, "def obj_name.x").should == "x"
437
- end
438
- end
439
-
440
- describe 'method aliases' do
441
- before do
442
- @class = Class.new {
443
- def eat
444
- end
445
-
446
- alias fress eat
447
- alias_method :omnomnom, :fress
448
-
449
- def eruct
450
- end
451
- }
452
- end
453
-
454
- it 'should be able to find method aliases' do
455
- meth = Pry::Method(@class.new.method(:eat))
456
- aliases = Set.new(meth.aliases)
457
-
458
- aliases.should == Set.new(["fress", "omnomnom"])
459
- end
460
-
461
- it 'should return an empty Array if cannot find aliases' do
462
- meth = Pry::Method(@class.new.method(:eruct))
463
- meth.aliases.should.be.empty
464
- end
465
-
466
- it 'should not include the own name in the list of aliases' do
467
- meth = Pry::Method(@class.new.method(:eat))
468
- meth.aliases.should.not.include "eat"
469
- end
470
-
471
- unless Pry::Helpers::BaseHelpers.mri_18?
472
- # Ruby 1.8 doesn't support this feature.
473
- it 'should be able to find aliases for methods implemented in C' do
474
- meth = Pry::Method(Hash.new.method(:key?))
475
- aliases = Set.new(meth.aliases)
476
-
477
- aliases.should == Set.new(["include?", "member?", "has_key?"])
478
- end
479
- end
480
-
481
- end
482
- end