pry 0.9.12.6 → 0.10.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (186) 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 +24 -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 +5 -6
  20. data/lib/pry/commands/cat/file_formatter.rb +15 -32
  21. data/lib/pry/commands/cd.rb +14 -3
  22. data/lib/pry/commands/change_inspector.rb +27 -0
  23. data/lib/pry/commands/change_prompt.rb +26 -0
  24. data/lib/pry/commands/code_collector.rb +4 -4
  25. data/lib/pry/commands/easter_eggs.rb +3 -3
  26. data/lib/pry/commands/edit.rb +10 -22
  27. data/lib/pry/commands/edit/exception_patcher.rb +2 -2
  28. data/lib/pry/commands/edit/file_and_line_locator.rb +0 -2
  29. data/lib/pry/commands/exit_program.rb +0 -1
  30. data/lib/pry/commands/find_method.rb +16 -22
  31. data/lib/pry/commands/gem_install.rb +5 -2
  32. data/lib/pry/commands/gem_open.rb +1 -1
  33. data/lib/pry/commands/gist.rb +10 -11
  34. data/lib/pry/commands/help.rb +14 -14
  35. data/lib/pry/commands/hist.rb +27 -8
  36. data/lib/pry/commands/install_command.rb +14 -12
  37. data/lib/pry/commands/list_inspectors.rb +35 -0
  38. data/lib/pry/commands/list_prompts.rb +35 -0
  39. data/lib/pry/commands/ls.rb +72 -296
  40. data/lib/pry/commands/ls/constants.rb +47 -0
  41. data/lib/pry/commands/ls/formatter.rb +49 -0
  42. data/lib/pry/commands/ls/globals.rb +48 -0
  43. data/lib/pry/commands/ls/grep.rb +21 -0
  44. data/lib/pry/commands/ls/instance_vars.rb +39 -0
  45. data/lib/pry/commands/ls/interrogatable.rb +18 -0
  46. data/lib/pry/commands/ls/jruby_hacks.rb +49 -0
  47. data/lib/pry/commands/ls/local_names.rb +35 -0
  48. data/lib/pry/commands/ls/local_vars.rb +39 -0
  49. data/lib/pry/commands/ls/ls_entity.rb +70 -0
  50. data/lib/pry/commands/ls/methods.rb +57 -0
  51. data/lib/pry/commands/ls/methods_helper.rb +46 -0
  52. data/lib/pry/commands/ls/self_methods.rb +32 -0
  53. data/lib/pry/commands/play.rb +44 -10
  54. data/lib/pry/commands/pry_backtrace.rb +1 -2
  55. data/lib/pry/commands/raise_up.rb +2 -2
  56. data/lib/pry/commands/reload_code.rb +16 -19
  57. data/lib/pry/commands/ri.rb +7 -3
  58. data/lib/pry/commands/shell_command.rb +18 -13
  59. data/lib/pry/commands/shell_mode.rb +2 -4
  60. data/lib/pry/commands/show_doc.rb +5 -0
  61. data/lib/pry/commands/show_info.rb +8 -13
  62. data/lib/pry/commands/show_source.rb +15 -3
  63. data/lib/pry/commands/simple_prompt.rb +1 -1
  64. data/lib/pry/commands/toggle_color.rb +8 -4
  65. data/lib/pry/commands/watch_expression.rb +105 -0
  66. data/lib/pry/commands/watch_expression/expression.rb +38 -0
  67. data/lib/pry/commands/whereami.rb +18 -10
  68. data/lib/pry/commands/wtf.rb +3 -3
  69. data/lib/pry/config.rb +20 -254
  70. data/lib/pry/config/behavior.rb +139 -0
  71. data/lib/pry/config/convenience.rb +26 -0
  72. data/lib/pry/config/default.rb +165 -0
  73. data/lib/pry/core_extensions.rb +31 -21
  74. data/lib/pry/editor.rb +107 -103
  75. data/lib/pry/exceptions.rb +77 -0
  76. data/lib/pry/helpers/base_helpers.rb +22 -109
  77. data/lib/pry/helpers/command_helpers.rb +10 -8
  78. data/lib/pry/helpers/documentation_helpers.rb +1 -2
  79. data/lib/pry/helpers/text.rb +4 -5
  80. data/lib/pry/history.rb +46 -45
  81. data/lib/pry/history_array.rb +6 -1
  82. data/lib/pry/hooks.rb +9 -29
  83. data/lib/pry/indent.rb +6 -6
  84. data/lib/pry/input_completer.rb +242 -0
  85. data/lib/pry/input_lock.rb +132 -0
  86. data/lib/pry/inspector.rb +27 -0
  87. data/lib/pry/last_exception.rb +61 -0
  88. data/lib/pry/method.rb +82 -87
  89. data/lib/pry/{commands/edit/method_patcher.rb → method/patcher.rb} +41 -38
  90. data/lib/pry/module_candidate.rb +4 -14
  91. data/lib/pry/object_path.rb +82 -0
  92. data/lib/pry/output.rb +50 -0
  93. data/lib/pry/pager.rb +191 -47
  94. data/lib/pry/plugins.rb +1 -1
  95. data/lib/pry/prompt.rb +26 -0
  96. data/lib/pry/pry_class.rb +149 -230
  97. data/lib/pry/pry_instance.rb +302 -413
  98. data/lib/pry/rbx_path.rb +1 -1
  99. data/lib/pry/repl.rb +202 -0
  100. data/lib/pry/repl_file_loader.rb +20 -26
  101. data/lib/pry/rubygem.rb +13 -5
  102. data/lib/pry/terminal.rb +2 -1
  103. data/lib/pry/test/helper.rb +26 -41
  104. data/lib/pry/version.rb +1 -1
  105. data/lib/pry/wrapped_module.rb +45 -59
  106. metadata +61 -224
  107. data/.document +0 -2
  108. data/.gitignore +0 -16
  109. data/.travis.yml +0 -25
  110. data/.yardopts +0 -1
  111. data/CHANGELOG +0 -534
  112. data/CONTRIBUTORS +0 -55
  113. data/Gemfile +0 -12
  114. data/Rakefile +0 -140
  115. data/TODO +0 -117
  116. data/lib/pry/completion.rb +0 -321
  117. data/lib/pry/custom_completions.rb +0 -6
  118. data/lib/pry/rbx_method.rb +0 -13
  119. data/man/pry.1 +0 -195
  120. data/man/pry.1.html +0 -204
  121. data/man/pry.1.ronn +0 -141
  122. data/pry.gemspec +0 -29
  123. data/spec/Procfile +0 -3
  124. data/spec/cli_spec.rb +0 -78
  125. data/spec/code_object_spec.rb +0 -277
  126. data/spec/code_spec.rb +0 -219
  127. data/spec/command_helpers_spec.rb +0 -29
  128. data/spec/command_integration_spec.rb +0 -644
  129. data/spec/command_set_spec.rb +0 -627
  130. data/spec/command_spec.rb +0 -821
  131. data/spec/commands/amend_line_spec.rb +0 -247
  132. data/spec/commands/bang_spec.rb +0 -19
  133. data/spec/commands/cat_spec.rb +0 -164
  134. data/spec/commands/cd_spec.rb +0 -250
  135. data/spec/commands/disable_pry_spec.rb +0 -25
  136. data/spec/commands/edit_spec.rb +0 -727
  137. data/spec/commands/exit_all_spec.rb +0 -34
  138. data/spec/commands/exit_program_spec.rb +0 -19
  139. data/spec/commands/exit_spec.rb +0 -34
  140. data/spec/commands/find_method_spec.rb +0 -70
  141. data/spec/commands/gem_list_spec.rb +0 -26
  142. data/spec/commands/gist_spec.rb +0 -79
  143. data/spec/commands/help_spec.rb +0 -56
  144. data/spec/commands/hist_spec.rb +0 -181
  145. data/spec/commands/jump_to_spec.rb +0 -15
  146. data/spec/commands/ls_spec.rb +0 -181
  147. data/spec/commands/play_spec.rb +0 -140
  148. data/spec/commands/raise_up_spec.rb +0 -56
  149. data/spec/commands/save_file_spec.rb +0 -177
  150. data/spec/commands/show_doc_spec.rb +0 -510
  151. data/spec/commands/show_input_spec.rb +0 -17
  152. data/spec/commands/show_source_spec.rb +0 -782
  153. data/spec/commands/whereami_spec.rb +0 -203
  154. data/spec/completion_spec.rb +0 -241
  155. data/spec/control_d_handler_spec.rb +0 -58
  156. data/spec/documentation_helper_spec.rb +0 -73
  157. data/spec/editor_spec.rb +0 -79
  158. data/spec/exception_whitelist_spec.rb +0 -21
  159. data/spec/fixtures/candidate_helper1.rb +0 -11
  160. data/spec/fixtures/candidate_helper2.rb +0 -8
  161. data/spec/fixtures/example.erb +0 -5
  162. data/spec/fixtures/example_nesting.rb +0 -33
  163. data/spec/fixtures/show_source_doc_examples.rb +0 -15
  164. data/spec/fixtures/testrc +0 -2
  165. data/spec/fixtures/testrcbad +0 -2
  166. data/spec/fixtures/whereami_helper.rb +0 -6
  167. data/spec/helper.rb +0 -34
  168. data/spec/helpers/bacon.rb +0 -86
  169. data/spec/helpers/mock_pry.rb +0 -43
  170. data/spec/helpers/table_spec.rb +0 -105
  171. data/spec/history_array_spec.rb +0 -67
  172. data/spec/hooks_spec.rb +0 -522
  173. data/spec/indent_spec.rb +0 -301
  174. data/spec/input_stack_spec.rb +0 -90
  175. data/spec/method_spec.rb +0 -482
  176. data/spec/prompt_spec.rb +0 -60
  177. data/spec/pry_defaults_spec.rb +0 -419
  178. data/spec/pry_history_spec.rb +0 -99
  179. data/spec/pry_output_spec.rb +0 -95
  180. data/spec/pry_spec.rb +0 -515
  181. data/spec/run_command_spec.rb +0 -25
  182. data/spec/sticky_locals_spec.rb +0 -157
  183. data/spec/syntax_checking_spec.rb +0 -81
  184. data/spec/wrapped_module_spec.rb +0 -261
  185. data/wiki/Customizing-pry.md +0 -397
  186. data/wiki/Home.md +0 -4
@@ -1,55 +0,0 @@
1
- 1068 John Mair
2
- 372 Conrad Irwin
3
- 215 Ryan Fitzgerald
4
- 108 Kyrylo Silin
5
- 92 Rob Gleeson
6
- 54 Mon ouïe
7
- 51 Lee Jarvis
8
- 47 ☈king
9
- 40 Jordon Bedwell
10
- 28 Yorick Peterse
11
- 18 David Palm
12
- 18 Robert Gleeson
13
- 15 epitron
14
- 12 Andrew Vos
15
- 11 Reginald Tan
16
- 10 Matt Carey
17
- 8 Eero Saynatkari
18
- 8 Trey Lawrence
19
- 6 Jason Laster
20
- 3 misfo
21
- 3 fowlmouth
22
- 3 Darrick Wiebe
23
- 2 Kelsey Judson
24
- 2 Ben Langfeld
25
- 2 Bram Swenson
26
- 2 Erik Michaels-Ober
27
- 2 Ingrid
28
- 2 Vít Ondruch
29
- 2 Xavier Shay
30
- 2 Jonathan Soeder
31
- 2 Eric Christopherson
32
- 2 robgleeson
33
- 1 Ben Pickles
34
- 1 Zeh Rizzatti
35
- 1 shirmung
36
- 1 sonnym
37
- 1 Shawn Anderson
38
- 1 Joe Peduto
39
- 1 Greg Stearns
40
- 1 Jonathan Jackson
41
- 1 Jordan Running
42
- 1 Gosha Arinich
43
- 1 Josh Cheek
44
- 1 Kirill Lashuk
45
- 1 Gerbert Olivé
46
- 1 Larry Gilbert
47
- 1 Lars Haugseth
48
- 1 Loic Nageleisen
49
- 1 Matthew Carey
50
- 1 Michael Bensoussan
51
- 1 Renato Mascarenhas
52
- 1 Havenwood
53
- 1 Sherin C
54
- 1 Sonali Sridhar
55
- 1 Tim Pope
data/Gemfile DELETED
@@ -1,12 +0,0 @@
1
- source 'https://rubygems.org'
2
- gemspec
3
-
4
- group :development do
5
- gem 'jist'
6
- end
7
-
8
- if RbConfig::CONFIG['ruby_install_name'] == 'rbx'
9
- gem 'rubysl-singleton'
10
- gem 'rubysl-prettyprint'
11
- gem 'rb-readline'
12
- end
data/Rakefile DELETED
@@ -1,140 +0,0 @@
1
- require 'rake/clean'
2
- require 'rubygems/package_task'
3
-
4
- $:.unshift 'lib'
5
- require 'pry/version'
6
-
7
- CLOBBER.include('**/*~', '**/*#*', '**/*.log')
8
- CLEAN.include('**/*#*', '**/*#*.*', '**/*_flymake*.*', '**/*_flymake', '**/*.rbc', '**/.#*.*')
9
-
10
- def check_dependencies
11
- require 'bundler'
12
- Bundler.definition.missing_specs
13
-
14
- eval('nil', TOPLEVEL_BINDING, '<main>') # workaround for issue #395
15
- rescue LoadError
16
- # if Bundler isn't installed, we'll just assume your setup is ok.
17
- rescue Bundler::GemNotFound
18
- raise RuntimeError, "You're missing one or more required gems. Run `bundle install` first."
19
- end
20
-
21
- desc "Set up and run tests"
22
- task :default => [:test]
23
-
24
- unless [].respond_to? :shuffle!
25
- class Array
26
- def shuffle!
27
- # TODO: fill this in if anyone cares
28
- self
29
- end
30
- end
31
- end
32
-
33
- def run_specs paths
34
- quiet = ENV['VERBOSE'] ? '' : '-q'
35
- exec "bacon -Ispec -rubygems #{quiet} #{paths.join ' '}"
36
- end
37
-
38
- desc "Run tests"
39
- task :test do
40
- check_dependencies unless ENV['SKIP_DEP_CHECK']
41
- paths =
42
- if explicit_list = ENV['run']
43
- explicit_list.split(',')
44
- else
45
- Dir['spec/**/*_spec.rb'].shuffle!
46
- end
47
- run_specs paths
48
- end
49
- task :spec => :test
50
-
51
- task :recspec do
52
- all = Dir['spec/**/*_spec.rb'].sort_by{|path| File.mtime(path)}.reverse
53
- warn "Running all, sorting by mtime: #{all[0..2].join(' ')} ...etc."
54
- run_specs all
55
- end
56
-
57
- desc "Run pry"
58
- task :pry do
59
- check_dependencies unless ENV['SKIP_DEP_CHECK']
60
- load 'bin/pry'
61
- end
62
-
63
- desc "Show pry version"
64
- task :version do
65
- puts "Pry version: #{Pry::VERSION}"
66
- end
67
-
68
- desc "Profile pry's startup time"
69
- task :profile do
70
- require 'profile'
71
- require 'pry'
72
- Pry.start(TOPLEVEL_BINDING, :input => StringIO.new('exit'))
73
- end
74
-
75
- def modify_base_gemspec
76
- eval(File.read('pry.gemspec')).tap { |s| yield s }
77
- end
78
-
79
- namespace :ruby do
80
- spec = modify_base_gemspec do |s|
81
- s.platform = Gem::Platform::RUBY
82
- end
83
-
84
- Gem::PackageTask.new(spec) do |pkg|
85
- pkg.need_zip = false
86
- pkg.need_tar = false
87
- end
88
- end
89
-
90
- namespace :jruby do
91
- spec = modify_base_gemspec do |s|
92
- s.add_dependency('spoon', '~> 0.0')
93
- s.platform = 'java'
94
- end
95
-
96
- Gem::PackageTask.new(spec) do |pkg|
97
- pkg.need_zip = false
98
- pkg.need_tar = false
99
- end
100
- end
101
-
102
-
103
- [:mingw32, :mswin32].each do |v|
104
- namespace v do
105
- spec = modify_base_gemspec do |s|
106
- s.add_dependency('win32console', '~> 1.3')
107
- s.platform = "i386-#{v}"
108
- end
109
-
110
- Gem::PackageTask.new(spec) do |pkg|
111
- pkg.need_zip = false
112
- pkg.need_tar = false
113
- end
114
- end
115
- end
116
-
117
- desc "build all platform gems at once"
118
- task :gems => [:clean, :rmgems, 'ruby:gem', 'mswin32:gem', 'mingw32:gem', 'jruby:gem']
119
-
120
- desc "remove all platform gems"
121
- task :rmgems => ['ruby:clobber_package']
122
- task :rm_gems => :rmgems
123
- task :rm_pkgs => :rmgems
124
-
125
- desc "reinstall gem"
126
- task :reinstall => :gems do
127
- sh "gem uninstall pry" rescue nil
128
- sh "gem install #{File.dirname(__FILE__)}/pkg/pry-#{Pry::VERSION}.gem"
129
- end
130
-
131
- task :install => :reinstall
132
-
133
- desc "build and push latest gems"
134
- task :pushgems => :gems do
135
- chdir("#{File.dirname(__FILE__)}/pkg") do
136
- Dir["*.gem"].each do |gemfile|
137
- sh "gem push #{gemfile}"
138
- end
139
- end
140
- end
data/TODO DELETED
@@ -1,117 +0,0 @@
1
- 0.9.5
2
- * include method visiblity in show-doc and stat output
3
- * tempfile should end in .rb (for edit -t)
4
- * ls output should not be in array format
5
- * exceptions should allow access to previous items in the backtrace
6
- * input should allow multiple objects which are switched to automatically when EOF is reached on the preceding one
7
- * pry -r should happen in pry
8
- * more plugin-related commands in pry - see installed ones, see activated ones, see available on rubygems
9
- * should also allow plugins be explicitly activated as a command line option
10
- * should not raise if plugin activation fails (should show warning instead)
11
- * more documentation on CommandContext, etc and also command helpers
12
- * fix history saving (should not save all of Readline::HISTORY, but only what changed)
13
- * prevent blank lines going to Readline::HISTORY
14
- * ensure that cat --ex emulates the `whereami` format - includes line numbers and formatted the same, etc
15
- * rename inp and out to _inp_ and _out_ otherwise than can overwrite locals by those names when debugging (not good)
16
- * add source file to stat command
17
- * make plugins use hash instead of array
18
- * ensure edit -t has 'edit' alias (no parameters) and dumps eval_string into buffer
19
- * whitelist exceptions
20
- * hooks system
21
- * jruby shell command support
22
-
23
- 0.9.3
24
- * hist command now excludes last line of input (the command invocation itself)
25
- * hist now has `history` alias
26
- * `pry -r` requires now happen after plugin loading (so as not to interfere with
27
- * new Pry.config.disable_auto_reload option, for turning off auto reloading by edit-method and related
28
- * add better error messages for `cd` command
29
- * add command_prefix
30
- * change some command names to include hyphen, e.g version => pry-version, install => install-command
31
- * do cat --ex and edit --ex
32
- * add reload-method
33
- * fixed exotic object regression - BasicObject.new etc now return "=> unknown"
34
- * converted: import => import-set, version => pry-version, install => install-command
35
- * fix show-doc bug for ruby 1.8 and Kernel.fork
36
- * edit -t (opens a temporary file and evals it in current context when closed)
37
-
38
- 0.9.0
39
- Major features
40
- --------------
41
- * Restructure command system and helpers (almost complete)
42
- * Delete unnecessary commands, add a couple of new ones (e.g amend-line)
43
- * Readline history
44
- * Plugin support
45
- * Support Rubinius core methods
46
- * in[] and out[] arrays
47
- * Improve test coverage (test some commands, etc)
48
-
49
- Minor changes
50
- -------------
51
- * improve edit-method support for various editors
52
- * ensure all commands have appropriate error handing and informative error messages
53
- * show-doc should include signature of method
54
-
55
- Optional
56
- --------
57
- * multi-line readline support
58
-
59
-
60
- 0.8.0
61
- * allow #{} interpolation of all commands
62
- * update documentation! new commands and features and change in behaviour of `run`
63
- * add ; at end of line to suppress return value output
64
- * Remove message spam (before/after hooks)
65
- * stop commands returning a value
66
- * use `redo` in the r() method when encounter a command
67
- * shell functionality should just use system(), but redirect in and
68
- out to Pry.input and Pry.output by reassining $stdin and $stdout
69
- for duration of block.
70
- * basicobject and no to_s/inspect support
71
- * fix documentation, support rdoc and yard properly
72
- * only load Ripper if 1.9 AND MRI (support jruby 1.9, using
73
- RubyParser)
74
- * shell commands invokable file .<command>
75
- * supercharge cat-file so it can syntax highlight sourcecode files
76
-
77
-
78
- 0.7.0
79
- * add pry-doc support with syntax highlighting for docs
80
- * add 'mj' option to ls (restrict to singleton methods)
81
- * add _ex_ local to hold last exception raised in an exception
82
-
83
- 0.6.8
84
- * add whereami command, a la the `ir_b` gem
85
- * make .pryrc be loaded by run-time pry sessions
86
-
87
- 0.6.7
88
- * color support
89
- * --simple-prompt for pry commandline
90
- * -I mode for pry commandline
91
- * --color mode for pry commandline
92
- * clean up requires (put them all in one place)
93
- * simple-prompt command and toggle-color commandd.
94
-
95
- 0.6.1
96
- * !@ command alias for exit_all
97
- * `cd /` for breaking out to pry top level (jump-to 0)
98
- * made `-e` option work in a more effective way for `pry` command line invocation
99
- * exit and exit-all commands now accept a parameter, this parameter becomes the return value of repl()
100
- * `command` method from CommandBase now accepts a :keep_retval arg that determines if command value is returned to pry session or just `nil` (`nil` was old behaviour)
101
- * tests for new :keep_retval and exit-all/exit behaviour; :keep_retval will remain undocumented.
102
-
103
- 0.5.0 release:
104
- * !!!! UPDATE DOCUMENTATION !!!!
105
- * Use clipped version of Pry.view() for large objects
106
- * Exit Pry session on ^d
107
- * Use Shellwords for breaking up parameters to pry commands
108
- * Use OptionParser to parse options for default pry commands
109
- * Add version command
110
- * Refactor 'status' command: add current method info
111
- * Add meth_name_from_binding utility lambda to commands.rb
112
- * Add -M, -m, -v(erbose), -a(ll), -s(uper), -l(ocals), -i(ivars), -k(klass vars) options to ls
113
- * add -i(nstance) option to show-method
114
- * add --help option to most commands
115
- * Get rid of ls_method and ls_imethods (subsumed by more powerful ls)
116
- * Get rid of show_idoc and show_imethod
117
- * Add special eval-file command that evals target file in current context
@@ -1,321 +0,0 @@
1
- # taken from irb
2
-
3
- class Pry
4
-
5
- module BondCompleter
6
-
7
- def self.build_completion_proc(target, pry=nil, commands=[""])
8
- Pry.require_readline
9
-
10
- # If we're using libedit or bond gem not installed, don't use Bond.
11
- if Readline::VERSION =~ /editline/i || !defined?(Bond)
12
- Pry.config.completer = InputCompleter
13
- return InputCompleter.build_completion_proc(target, pry, commands)
14
- end
15
-
16
- if !@started
17
- @started = true
18
- start
19
- end
20
-
21
- Pry.current[:pry] = pry
22
- proc{ |*a| Bond.agent.call(*a) }
23
- end
24
-
25
- def self.start
26
- Bond.start(:eval_binding => lambda{ Pry.current[:pry].current_context })
27
- Bond.complete(:on => /\A/) do |input|
28
- Pry.commands.complete(input.line,
29
- :pry_instance => Pry.current[:pry],
30
- :target => Pry.current[:pry].current_context,
31
- :command_set => Pry.current[:pry].commands)
32
- end
33
- end
34
-
35
- end
36
-
37
- # Implements tab completion for Readline in Pry
38
- module InputCompleter
39
- ReservedWords = [
40
- "BEGIN", "END",
41
- "alias", "and",
42
- "begin", "break",
43
- "case", "class",
44
- "def", "defined", "do",
45
- "else", "elsif", "end", "ensure",
46
- "false", "for",
47
- "if", "in",
48
- "module",
49
- "next", "nil", "not",
50
- "or",
51
- "redo", "rescue", "retry", "return",
52
- "self", "super",
53
- "then", "true",
54
- "undef", "unless", "until",
55
- "when", "while",
56
- "yield" ]
57
-
58
- Operators = [
59
- "%", "&", "*", "**", "+", "-", "/",
60
- "<", "<<", "<=", "<=>", "==", "===", "=~", ">", ">=", ">>",
61
- "[]", "[]=", "^", "!", "!=", "!~"
62
- ]
63
-
64
- # If we haven't configured Readline for completion yet, do it now.
65
- # @private
66
- def self.initialize_readline
67
- Pry.require_readline
68
- return if @initialized_readline
69
-
70
- if Readline.respond_to?("basic_word_break_characters=")
71
- Readline.basic_word_break_characters = " \t\n\"\\'`><=;|&{("
72
- end
73
-
74
- Readline.completion_append_character = nil
75
-
76
- @initialized_readline = true
77
- end
78
-
79
- # Return a new completion proc for use by Readline.
80
- # @param [Binding] target The current binding context.
81
- # @param [Array<String>] commands The array of Pry commands.
82
- def self.build_completion_proc(target, pry=nil, commands=[""])
83
- initialize_readline
84
-
85
- proc do |input|
86
-
87
- # if there are multiple contexts e.g. cd 1/2/3
88
- # get new target for 1/2 and find candidates for 3
89
- path, input = build_path(input)
90
-
91
- # We silence warnings here or Ruby 1.8 cries about "multiple values for
92
- # block 0 for 1".
93
- Helpers::BaseHelpers.silence_warnings do
94
- unless path.call.empty?
95
- target = begin
96
- ctx = Helpers::BaseHelpers.context_from_object_path(path.call, pry)
97
- ctx.first
98
- rescue Pry::CommandError
99
- []
100
- end
101
- target = target.last
102
- end
103
- end
104
-
105
- begin
106
- bind = target
107
-
108
- case input
109
-
110
-
111
- # Complete stdlib symbols
112
-
113
- when /^(\/[^\/]*\/)\.([^.]*)$/
114
- # Regexp
115
- receiver = $1
116
- message = Regexp.quote($2)
117
-
118
- candidates = Regexp.instance_methods.collect(&:to_s)
119
- select_message(path, receiver, message, candidates)
120
-
121
- when /^([^\]]*\])\.([^.]*)$/
122
- # Array
123
- receiver = $1
124
- message = Regexp.quote($2)
125
-
126
- candidates = Array.instance_methods.collect(&:to_s)
127
- select_message(path, receiver, message, candidates)
128
-
129
- when /^([^\}]*\})\.([^.]*)$/
130
- # Proc or Hash
131
- receiver = $1
132
- message = Regexp.quote($2)
133
-
134
- candidates = Proc.instance_methods.collect(&:to_s)
135
- candidates |= Hash.instance_methods.collect(&:to_s)
136
- select_message(path, receiver, message, candidates)
137
-
138
- when /^(:[^:.]*)$/
139
- # Symbol
140
- if Symbol.respond_to?(:all_symbols)
141
- sym = Regexp.quote($1)
142
- candidates = Symbol.all_symbols.collect{|s| ":" + s.id2name}
143
-
144
- candidates.grep(/^#{sym}/)
145
- else
146
- []
147
- end
148
-
149
- when /^::([A-Z][^:\.\(]*)$/
150
- # Absolute Constant or class methods
151
- receiver = $1
152
- candidates = Object.constants.collect(&:to_s)
153
- candidates.grep(/^#{receiver}/).collect{|e| "::" + e}
154
-
155
-
156
- # Complete target symbols
157
-
158
- when /^([A-Z][A-Za-z0-9]*)$/
159
- # Constant
160
- message = $1
161
-
162
- begin
163
- context = target.eval("self")
164
- context = context.class unless context.respond_to? :constants
165
- candidates = context.constants.collect(&:to_s)
166
- rescue
167
- candidates = []
168
- end
169
- candidates = candidates.grep(/^#{message}/).collect(&path)
170
-
171
- when /^([A-Z].*)::([^:.]*)$/
172
- # Constant or class methods
173
- receiver = $1
174
- message = Regexp.quote($2)
175
- begin
176
- candidates = eval("#{receiver}.constants.collect(&:to_s)", bind)
177
- candidates |= eval("#{receiver}.methods.collect(&:to_s)", bind)
178
- rescue RescuableException
179
- candidates = []
180
- end
181
- candidates.grep(/^#{message}/).collect{|e| receiver + "::" + e}
182
-
183
- when /^(:[^:.]+)\.([^.]*)$/
184
- # Symbol
185
- receiver = $1
186
- message = Regexp.quote($2)
187
-
188
- candidates = Symbol.instance_methods.collect(&:to_s)
189
- select_message(path, receiver, message, candidates)
190
-
191
- when /^(-?(0[dbo])?[0-9_]+(\.[0-9_]+)?([eE]-?[0-9]+)?)\.([^.]*)$/
192
- # Numeric
193
- receiver = $1
194
- message = Regexp.quote($5)
195
-
196
- begin
197
- candidates = eval(receiver, bind).methods.collect(&:to_s)
198
- rescue RescuableException
199
- candidates = []
200
- end
201
- select_message(path, receiver, message, candidates)
202
-
203
- when /^(-?0x[0-9a-fA-F_]+)\.([^.]*)$/#
204
- # Numeric(0xFFFF)
205
- receiver = $1
206
- message = Regexp.quote($2)
207
-
208
- begin
209
- candidates = eval(receiver, bind).methods.collect(&:to_s)
210
- rescue RescuableException
211
- candidates = []
212
- end
213
- select_message(path, receiver, message, candidates)
214
-
215
- when /^(\$[^.]*)$/
216
- # Global variables
217
- regmessage = Regexp.new(Regexp.quote($1))
218
- candidates = global_variables.collect(&:to_s).grep(regmessage)
219
-
220
- when /^([^."].*)\.([^.]*)$/
221
- # Variable
222
- receiver = $1
223
- message = Regexp.quote($2)
224
-
225
- gv = eval("global_variables", bind).collect(&:to_s)
226
- lv = eval("local_variables", bind).collect(&:to_s)
227
- cv = eval("self.class.constants", bind).collect(&:to_s)
228
-
229
- if (gv | lv | cv).include?(receiver) or /^[A-Z]/ =~ receiver && /\./ !~ receiver
230
- # foo.func and foo is local var. OR
231
- # Foo::Bar.func
232
- begin
233
- candidates = eval("#{receiver}.methods", bind).collect(&:to_s)
234
- rescue RescuableException
235
- candidates = []
236
- end
237
- else
238
- # func1.func2
239
- candidates = []
240
- ObjectSpace.each_object(Module){|m|
241
- begin
242
- name = m.name.to_s
243
- rescue RescuableException
244
- name = ""
245
- end
246
- next if name != "IRB::Context" and
247
- /^(IRB|SLex|RubyLex|RubyToken)/ =~ name
248
-
249
- # jruby doesn't always provide #instance_methods() on each
250
- # object.
251
- if m.respond_to?(:instance_methods)
252
- candidates.concat m.instance_methods(false).collect(&:to_s)
253
- end
254
- }
255
- candidates.sort!
256
- candidates.uniq!
257
- end
258
- select_message(path, receiver, message, candidates)
259
-
260
- when /^\.([^.]*)$/
261
- # Unknown(maybe String)
262
- receiver = ""
263
- message = Regexp.quote($1)
264
-
265
- candidates = String.instance_methods(true).collect(&:to_s)
266
- select_message(path, receiver, message, candidates)
267
-
268
- else
269
-
270
- candidates = eval(
271
- "methods | private_methods | local_variables | " \
272
- "self.class.constants | instance_variables",
273
- bind
274
- ).collect(&:to_s)
275
-
276
- if eval("respond_to?(:class_variables)", bind)
277
- candidates += eval("class_variables", bind).collect(&:to_s)
278
- end
279
- candidates = (candidates|ReservedWords|commands).grep(/^#{Regexp.quote(input)}/)
280
- candidates.collect(&path)
281
- end
282
- rescue RescuableException
283
- []
284
- end
285
- end
286
- end
287
-
288
- def self.select_message(path, receiver, message, candidates)
289
- candidates.grep(/^#{message}/).collect { |e|
290
- case e
291
- when /^[a-zA-Z_]/
292
- path.call(receiver + "." + e)
293
- when /^[0-9]/
294
- when *Operators
295
- #receiver + " " + e
296
- end
297
- }.compact
298
- end
299
-
300
- # build_path seperates the input into two parts: path and input.
301
- # input is the partial string that should be completed
302
- # path is a proc that takes an input and builds a full path.
303
- def self.build_path(input)
304
-
305
- # check to see if the input is a regex
306
- return proc {|input| input.to_s }, input if input[/\/\./]
307
-
308
- trailing_slash = input.end_with?('/')
309
- contexts = input.chomp('/').split(/\//)
310
- input = contexts[-1]
311
-
312
- path = Proc.new do |input|
313
- p = contexts[0..-2].push(input).join('/')
314
- p += '/' if trailing_slash && !input.nil?
315
- p
316
- end
317
-
318
- return path, input
319
- end
320
- end
321
- end