pry 0.10.3 → 0.14.2

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.
Files changed (159) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +439 -16
  3. data/LICENSE +1 -1
  4. data/README.md +362 -302
  5. data/bin/pry +4 -7
  6. data/lib/pry/basic_object.rb +10 -0
  7. data/lib/pry/block_command.rb +22 -0
  8. data/lib/pry/class_command.rb +194 -0
  9. data/lib/pry/cli.rb +84 -97
  10. data/lib/pry/code/code_file.rb +37 -26
  11. data/lib/pry/code/code_range.rb +7 -5
  12. data/lib/pry/code/loc.rb +26 -13
  13. data/lib/pry/code.rb +42 -31
  14. data/lib/pry/code_object.rb +53 -28
  15. data/lib/pry/color_printer.rb +46 -35
  16. data/lib/pry/command.rb +197 -369
  17. data/lib/pry/command_set.rb +89 -114
  18. data/lib/pry/command_state.rb +31 -0
  19. data/lib/pry/commands/amend_line.rb +86 -82
  20. data/lib/pry/commands/bang.rb +18 -14
  21. data/lib/pry/commands/bang_pry.rb +15 -11
  22. data/lib/pry/commands/cat/abstract_formatter.rb +23 -18
  23. data/lib/pry/commands/cat/exception_formatter.rb +85 -72
  24. data/lib/pry/commands/cat/file_formatter.rb +56 -46
  25. data/lib/pry/commands/cat/input_expression_formatter.rb +35 -30
  26. data/lib/pry/commands/cat.rb +62 -54
  27. data/lib/pry/commands/cd.rb +40 -35
  28. data/lib/pry/commands/change_inspector.rb +29 -22
  29. data/lib/pry/commands/change_prompt.rb +48 -23
  30. data/lib/pry/commands/clear_screen.rb +20 -0
  31. data/lib/pry/commands/code_collector.rb +148 -131
  32. data/lib/pry/commands/disable_pry.rb +23 -19
  33. data/lib/pry/commands/easter_eggs.rb +23 -34
  34. data/lib/pry/commands/edit/exception_patcher.rb +21 -17
  35. data/lib/pry/commands/edit/file_and_line_locator.rb +34 -23
  36. data/lib/pry/commands/edit.rb +185 -157
  37. data/lib/pry/commands/exit.rb +40 -35
  38. data/lib/pry/commands/exit_all.rb +24 -20
  39. data/lib/pry/commands/exit_program.rb +20 -16
  40. data/lib/pry/commands/find_method.rb +168 -162
  41. data/lib/pry/commands/fix_indent.rb +16 -12
  42. data/lib/pry/commands/help.rb +140 -133
  43. data/lib/pry/commands/hist.rb +151 -149
  44. data/lib/pry/commands/import_set.rb +20 -15
  45. data/lib/pry/commands/jump_to.rb +25 -21
  46. data/lib/pry/commands/list_inspectors.rb +35 -28
  47. data/lib/pry/commands/ls/constants.rb +59 -31
  48. data/lib/pry/commands/ls/formatter.rb +42 -36
  49. data/lib/pry/commands/ls/globals.rb +38 -36
  50. data/lib/pry/commands/ls/grep.rb +17 -15
  51. data/lib/pry/commands/ls/instance_vars.rb +29 -28
  52. data/lib/pry/commands/ls/interrogatable.rb +18 -12
  53. data/lib/pry/commands/ls/jruby_hacks.rb +47 -41
  54. data/lib/pry/commands/ls/local_names.rb +26 -24
  55. data/lib/pry/commands/ls/local_vars.rb +38 -30
  56. data/lib/pry/commands/ls/ls_entity.rb +47 -52
  57. data/lib/pry/commands/ls/methods.rb +49 -51
  58. data/lib/pry/commands/ls/methods_helper.rb +46 -42
  59. data/lib/pry/commands/ls/self_methods.rb +23 -21
  60. data/lib/pry/commands/ls.rb +124 -103
  61. data/lib/pry/commands/nesting.rb +21 -17
  62. data/lib/pry/commands/play.rb +92 -82
  63. data/lib/pry/commands/pry_backtrace.rb +22 -17
  64. data/lib/pry/commands/pry_version.rb +15 -11
  65. data/lib/pry/commands/raise_up.rb +33 -27
  66. data/lib/pry/commands/reload_code.rb +60 -48
  67. data/lib/pry/commands/reset.rb +16 -12
  68. data/lib/pry/commands/ri.rb +57 -42
  69. data/lib/pry/commands/save_file.rb +45 -43
  70. data/lib/pry/commands/shell_command.rb +56 -29
  71. data/lib/pry/commands/shell_mode.rb +22 -18
  72. data/lib/pry/commands/show_doc.rb +80 -70
  73. data/lib/pry/commands/show_info.rb +194 -155
  74. data/lib/pry/commands/show_input.rb +16 -11
  75. data/lib/pry/commands/show_source.rb +110 -42
  76. data/lib/pry/commands/stat.rb +35 -31
  77. data/lib/pry/commands/switch_to.rb +21 -15
  78. data/lib/pry/commands/toggle_color.rb +20 -16
  79. data/lib/pry/commands/watch_expression/expression.rb +32 -27
  80. data/lib/pry/commands/watch_expression.rb +89 -84
  81. data/lib/pry/commands/whereami.rb +156 -141
  82. data/lib/pry/commands/wtf.rb +78 -40
  83. data/lib/pry/config/attributable.rb +22 -0
  84. data/lib/pry/config/lazy_value.rb +29 -0
  85. data/lib/pry/config/memoized_value.rb +34 -0
  86. data/lib/pry/config/value.rb +24 -0
  87. data/lib/pry/config.rb +310 -20
  88. data/lib/pry/control_d_handler.rb +28 -0
  89. data/lib/pry/core_extensions.rb +22 -9
  90. data/lib/pry/editor.rb +56 -34
  91. data/lib/pry/env.rb +18 -0
  92. data/lib/pry/exception_handler.rb +43 -0
  93. data/lib/pry/exceptions.rb +13 -18
  94. data/lib/pry/forwardable.rb +27 -0
  95. data/lib/pry/helpers/base_helpers.rb +20 -62
  96. data/lib/pry/helpers/command_helpers.rb +52 -62
  97. data/lib/pry/helpers/documentation_helpers.rb +21 -12
  98. data/lib/pry/helpers/options_helpers.rb +15 -8
  99. data/lib/pry/helpers/platform.rb +55 -0
  100. data/lib/pry/helpers/table.rb +44 -32
  101. data/lib/pry/helpers/text.rb +96 -85
  102. data/lib/pry/helpers.rb +3 -0
  103. data/lib/pry/history.rb +81 -55
  104. data/lib/pry/hooks.rb +60 -110
  105. data/lib/pry/indent.rb +74 -68
  106. data/lib/pry/input_completer.rb +199 -158
  107. data/lib/pry/input_lock.rb +7 -10
  108. data/lib/pry/inspector.rb +36 -24
  109. data/lib/pry/last_exception.rb +45 -45
  110. data/lib/pry/method/disowned.rb +19 -5
  111. data/lib/pry/method/patcher.rb +14 -8
  112. data/lib/pry/method/weird_method_locator.rb +79 -45
  113. data/lib/pry/method.rb +178 -124
  114. data/lib/pry/object_path.rb +37 -28
  115. data/lib/pry/output.rb +102 -16
  116. data/lib/pry/pager.rb +187 -174
  117. data/lib/pry/prompt.rb +213 -25
  118. data/lib/pry/pry_class.rb +119 -98
  119. data/lib/pry/pry_instance.rb +261 -224
  120. data/lib/pry/repl.rb +83 -29
  121. data/lib/pry/repl_file_loader.rb +27 -22
  122. data/lib/pry/ring.rb +89 -0
  123. data/lib/pry/slop/LICENSE +20 -0
  124. data/lib/pry/slop/commands.rb +190 -0
  125. data/lib/pry/slop/option.rb +210 -0
  126. data/lib/pry/slop.rb +672 -0
  127. data/lib/pry/syntax_highlighter.rb +26 -0
  128. data/lib/pry/system_command_handler.rb +17 -0
  129. data/lib/pry/testable/evalable.rb +24 -0
  130. data/lib/pry/testable/mockable.rb +22 -0
  131. data/lib/pry/testable/pry_tester.rb +88 -0
  132. data/lib/pry/testable/utility.rb +34 -0
  133. data/lib/pry/testable/variables.rb +52 -0
  134. data/lib/pry/testable.rb +68 -0
  135. data/lib/pry/version.rb +3 -1
  136. data/lib/pry/warning.rb +20 -0
  137. data/lib/pry/{module_candidate.rb → wrapped_module/candidate.rb} +35 -32
  138. data/lib/pry/wrapped_module.rb +68 -63
  139. data/lib/pry.rb +133 -149
  140. metadata +58 -69
  141. data/lib/pry/commands/disabled_commands.rb +0 -2
  142. data/lib/pry/commands/gem_cd.rb +0 -26
  143. data/lib/pry/commands/gem_install.rb +0 -32
  144. data/lib/pry/commands/gem_list.rb +0 -33
  145. data/lib/pry/commands/gem_open.rb +0 -29
  146. data/lib/pry/commands/gist.rb +0 -101
  147. data/lib/pry/commands/install_command.rb +0 -53
  148. data/lib/pry/commands/list_prompts.rb +0 -35
  149. data/lib/pry/commands/simple_prompt.rb +0 -22
  150. data/lib/pry/commands.rb +0 -6
  151. data/lib/pry/config/behavior.rb +0 -139
  152. data/lib/pry/config/convenience.rb +0 -25
  153. data/lib/pry/config/default.rb +0 -161
  154. data/lib/pry/history_array.rb +0 -121
  155. data/lib/pry/plugins.rb +0 -103
  156. data/lib/pry/rbx_path.rb +0 -22
  157. data/lib/pry/rubygem.rb +0 -82
  158. data/lib/pry/terminal.rb +0 -79
  159. data/lib/pry/test/helper.rb +0 -170
data/README.md CHANGED
@@ -1,31 +1,61 @@
1
- [![Build Status](https://img.shields.io/travis/pry/pry.svg)](https://travis-ci.org/pry/pry)
2
- [![Code Climate](https://img.shields.io/codeclimate/github/pry/pry.svg)](https://codeclimate.com/github/pry/pry)
3
- [![Inline docs](http://inch-ci.org/github/pry/pry.svg)](http://inch-ci.org/github/pry/pry)
1
+ Pry
2
+ ===
4
3
 
5
- <center>
6
- ![The Pry Logo](https://dl.dropbox.com/u/26521875/pry%20stuff/logo/pry_logo_350.png)
4
+ [![Pry Build Status](https://github.com/pry/pry/workflows/pry/badge.svg)](https://github.com/pry/pry/actions)
5
+ [![Code Climate](https://codeclimate.com/github/pry/pry.svg)](https://codeclimate.com/github/pry/pry)
6
+ [![Gem Version](https://badge.fury.io/rb/pry.svg)](https://badge.fury.io/rb/pry)
7
+ [![Documentation Status](https://inch-ci.org/github/pry/pry.svg?branch=master)](https://inch-ci.org/github/pry/pry)
8
+ [![Downloads](https://img.shields.io/gem/dt/pry.svg?style=flat)](https://rubygems.org/gems/pry)
7
9
 
8
- © John Mair ([banisterfiend](https://twitter.com/banisterfiend)) 2013<br>
10
+ ![Pry logo](https://www.dropbox.com/s/zp8o63kquby2rln/pry_logo_350.png?raw=1)
9
11
 
10
- **Please** [DONATE](http://www.pledgie.com/campaigns/15899) to the Pry project - Pry was a **huge** amount of work and every donation received is encouraging and supports Pry's continued development!
12
+ © John Mair ([banisterfiend](https://twitter.com/banisterfiend)) 2018<br> (Creator)
11
13
 
12
- **Sponsors**
14
+ © Kyrylo Silin ([kyrylosilin](https://twitter.com/kyrylosilin)) 2018<br> (Maintainer)
13
15
 
14
- [Tealeaf Academy](http://www.gotealeaf.com)<br/>
15
- [Atomic Object](http://www.atomicobject.com/)<br/>
16
- [Hashrocket](http://hashrocket.com/)<br/>
17
- [Intridea](http://intridea.com/)<br/>
18
- [Gaslight](http://gaslight.co/home)<br/>
16
+ **Alumni:**
19
17
 
20
- **Other Resources**
18
+ * Conrad Irwin
19
+ * Ryan Fitzgerald
20
+ * Robert Gleeson
21
21
 
22
- [Skip to the website (recommended)](http://pry.github.com) <br />
23
- [Skip to the wiki](https://github.com/pry/pry/wiki)
24
- </center>
22
+ **Links:**
25
23
 
26
- Pry is a powerful alternative to the standard IRB shell for Ruby. It is
27
- written from scratch to provide a number of advanced features,
28
- including:
24
+ * https://pry.github.io/
25
+ * [YARD API documentation](https://www.rubydoc.info/gems/pry)
26
+ * [Wiki](https://github.com/pry/pry/wiki)
27
+
28
+ Table of Contents
29
+ =================
30
+
31
+ * [Introduction](#introduction)
32
+ * [Key features](#key-features)
33
+ * [Installation](#installation)
34
+ * [Overview](#overview)
35
+ * [Commands](#commands)
36
+ * [Navigating around state](#navigating-around-state)
37
+ * [Runtime invocation](#runtime-invocation)
38
+ * [Command Shell Integration](#command-shell-integration)
39
+ * [Code Browsing](#code-browsing)
40
+ * [Documentation Browsing](#documentation-browsing)
41
+ * [Edit methods](#edit-methods)
42
+ * [Live Help System](#live-help-system)
43
+ * [Use Pry as your Rails Console](#use-pry-as-your-rails-console)
44
+ * [Syntax Highlighting](#syntax-highlighting)
45
+ * [Supported Rubies](#supported-rubies)
46
+ * [Contact](#contact)
47
+ * [License](#license)
48
+ * [Contributors](#contributors)
49
+
50
+ Introduction
51
+ ------------
52
+
53
+ Pry is a runtime developer console and IRB alternative with powerful
54
+ introspection capabilities. Pry aims to be more than an IRB replacement. It is
55
+ an attempt to bring REPL driven programming to the Ruby language.
56
+
57
+ Key features
58
+ ------------
29
59
 
30
60
  * Source code browsing (including core C source with the pry-doc gem)
31
61
  * Documentation browsing
@@ -37,370 +67,400 @@ including:
37
67
  * Navigation around state (`cd`, `ls` and friends)
38
68
  * Runtime invocation (use Pry as a developer console or debugger)
39
69
  * Exotic object support (BasicObject instances, IClasses, ...)
40
- * A Powerful and flexible command system
70
+ * A powerful and flexible command system
41
71
  * Ability to view and replay history
42
- * Many convenience commands inspired by IPython, Smalltalk and other advanced REPLs
43
- * A wide-range number of [plugins](https://github.com/pry/pry/wiki/Available-plugins) that provide remote sessions, full debugging functionality, and more.
44
-
45
- Pry also aims to be more than an IRB replacement; it is an
46
- attempt to bring REPL driven programming to the Ruby language. It is
47
- currently not as powerful as tools like [SLIME](http://en.wikipedia.org/wiki/SLIME) for lisp, but that is the
48
- general direction Pry is heading.
49
-
50
- Pry is also fairly flexible and allows significant user
51
- [customization](https://github.com/pry/pry/wiki/Customization-and-configuration)
52
- is trivial to set it to read from any object that has a `readline` method and write to any object that has a
53
- `puts` method - many other aspects of Pry are also configurable making
54
- it a good choice for implementing custom shells.
55
-
56
- Pry comes with an executable so it can be invoked at the command line.
57
- Just enter `pry` to start. A `.pryrc` file in the user's home directory will
58
- be loaded if it exists. Type `pry --help` at the command line for more
59
- information.
60
-
61
- Try `gem install pry-doc` for additional documentation on Ruby Core
62
- methods. The additional docs are accessed through the `show-doc` and
63
- `show-method` commands.
64
-
65
- * Install the [gem](https://rubygems.org/gems/pry): `gem install pry`
66
- * Browse the comprehensive [documentation at the official Pry wiki](https://github.com/pry/pry/wiki)
67
- * Read the [YARD API documentation](http://rdoc.info/github/pry/pry/master/file/README.markdown)
68
- * See the [source code](http://github.com/pry/pry)
72
+ * Many convenience commands inspired by IPython, Smalltalk and other advanced
73
+ REPLs
74
+ * A wide-range number of
75
+ [plugins](https://github.com/pry/pry/wiki/Available-plugins) that provide
76
+ remote sessions, full debugging functionality, and more.
77
+
78
+ Installation
79
+ ------------
80
+
81
+ ### Bundler
82
+
83
+ ```ruby
84
+ gem 'pry', '~> 0.13.1'
85
+ ```
86
+
87
+ ### Manual
88
+
89
+ ```sh
90
+ gem install pry
91
+ ```
92
+
93
+ Overview
94
+ --------
95
+
96
+ Pry is fairly flexible and allows significant user
97
+ [customization](https://github.com/pry/pry/wiki/Customization-and-configuration).
98
+ It is trivial to read from any object that has a `readline` method and
99
+ write to any object that has a `puts` method. Many other aspects of Pry are
100
+ also configurable, making it a good choice for implementing custom shells.
101
+
102
+ Pry comes with an executable so it can be invoked at the command line. Just
103
+ enter `pry` to start. A `pryrc` file in `$XDG_CONFIG_HOME/pry/` or the user's
104
+ home directory will be loaded if it exists. Type `pry --help` at the command
105
+ line for more information.
69
106
 
70
107
  ### Commands
71
108
 
72
- Nearly every piece of functionality in a Pry session is implemented as
73
- a command. Commands are not methods and must start at the beginning of a line, with no
74
- whitespace in between. Commands support a flexible syntax and allow
75
- 'options' in the same way as shell commands, for example the following
76
- Pry command will show a list of all private instance methods (in
77
- scope) that begin with 'pa'
109
+ Nearly every piece of functionality in a Pry session is implemented as a
110
+ command. Commands are not methods and must start at the beginning of a line,
111
+ with no whitespace in between. Commands support a flexible syntax and allow
112
+ 'options' in the same way as shell commands, for example the following Pry
113
+ command will show a list of all private instance methods (in scope) that begin
114
+ with 'pa'
78
115
 
79
- pry(YARD::Parser::SourceParser):5> ls -Mp --grep ^pa
80
- YARD::Parser::SourceParser#methods: parse parser_class parser_type parser_type= parser_type_for_filename
116
+ ```ruby
117
+ pry(YARD::Parser::SourceParser):5> ls -Mp --grep ^pa
118
+ YARD::Parser::SourceParser#methods: parse parser_class parser_type parser_type= parser_type_for_filename
119
+ ```
81
120
 
82
121
  ### Navigating around state
83
122
 
84
- Pry allows us to pop in and out of different scopes (objects) using
85
- the `cd` command. This enables us to explore the run-time view of a
86
- program or library. To view which variables and methods are available
87
- within a particular scope we use the versatile [ls command.](https://gist.github.com/c0fc686ef923c8b87715)
88
-
89
- Here we will begin Pry at top-level, then Pry on a class and then on
90
- an instance variable inside that class:
91
-
92
- pry(main)> class Hello
93
- pry(main)* @x = 20
94
- pry(main)* end
95
- => 20
96
- pry(main)> cd Hello
97
- pry(Hello):1> ls -i
98
- instance variables: @x
99
- pry(Hello):1> cd @x
100
- pry(20):2> self + 10
101
- => 30
102
- pry(20):2> cd ..
103
- pry(Hello):1> cd ..
104
- pry(main)> cd ..
105
-
106
- The number after the `:` in the pry prompt indicates the nesting
107
- level. To display more information about nesting, use the `nesting`
108
- command. E.g
109
-
110
- pry("friend"):3> nesting
111
- Nesting status:
112
- 0. main (Pry top level)
113
- 1. Hello
114
- 2. 100
115
- 3. "friend"
116
- => nil
117
-
118
- We can then jump back to any of the previous nesting levels by using
119
- the `jump-to` command:
120
-
121
- pry("friend"):3> jump-to 1
122
- => 100
123
- pry(Hello):1>
123
+ Pry allows us to pop in and out of different scopes (objects) using the `cd`
124
+ command. This enables us to explore the run-time view of a program or
125
+ library. To view which variables and methods are available within a particular
126
+ scope we use the versatile [ls
127
+ command.](https://gist.github.com/c0fc686ef923c8b87715)
128
+
129
+ Here we will begin Pry at top-level, then Pry on a class and then on an instance
130
+ variable inside that class:
131
+
132
+ ```ruby
133
+ pry(main)> class Hello
134
+ pry(main)* @x = 20
135
+ pry(main)* end
136
+ => 20
137
+ pry(main)> cd Hello
138
+ pry(Hello):1> ls -i
139
+ instance variables: @x
140
+ pry(Hello):1> cd @x
141
+ pry(20):2> self + 10
142
+ => 30
143
+ pry(20):2> cd ..
144
+ pry(Hello):1> cd ..
145
+ pry(main)> cd ..
146
+ ```
147
+
148
+ The number after the `:` in the pry prompt indicates the nesting level. To
149
+ display more information about nesting, use the `nesting` command. E.g
150
+
151
+ ```ruby
152
+ pry("friend"):3> nesting
153
+ Nesting status:
154
+ 0. main (Pry top level)
155
+ 1. Hello
156
+ 2. 100
157
+ 3. "friend"
158
+ => nil
159
+ ```
160
+
161
+ We can then jump back to any of the previous nesting levels by using the
162
+ `jump-to` command:
163
+
164
+ ```ruby
165
+ pry("friend"):3> jump-to 1
166
+ => 100
167
+ pry(Hello):1>
168
+ ```
124
169
 
125
170
  ### Runtime invocation
126
171
 
127
- Pry can be invoked in the middle of a running program. It opens a Pry
128
- session at the point it's called and makes all program state at that
129
- point available. It can be invoked on any object using the
130
- `my_object.pry` syntax or on the current binding (or any binding)
131
- using `binding.pry`. The Pry session will then begin within the scope
132
- of the object (or binding). When the session ends the program continues with any
133
- modifications you made to it.
172
+ Pry can be invoked in the middle of a running program. It opens a Pry session at
173
+ the point it's called and makes all program state at that point available. It
174
+ can be invoked on any object using the `my_object.pry` syntax or on the current
175
+ binding (or any binding) using `binding.pry`. The Pry session will then begin
176
+ within the scope of the object (or binding). When the session ends the program
177
+ continues with any modifications you made to it.
134
178
 
135
- This functionality can be used for such things as: debugging,
136
- implementing developer consoles and applying hot patches.
179
+ This functionality can be used for such things as: debugging, implementing
180
+ developer consoles and applying hot patches.
137
181
 
138
182
  code:
139
183
 
140
- # test.rb
141
- require 'pry'
184
+ ```ruby
185
+ # test.rb
186
+ require 'pry'
142
187
 
143
- class A
144
- def hello() puts "hello world!" end
145
- end
188
+ class A
189
+ def hello() puts "hello world!" end
190
+ end
146
191
 
147
- a = A.new
192
+ a = A.new
148
193
 
149
- # start a REPL session
150
- binding.pry
194
+ # start a REPL session
195
+ binding.pry
151
196
 
152
- # program resumes here (after pry session)
153
- puts "program resumes here."
197
+ # program resumes here (after pry session)
198
+ puts "program resumes here."
199
+ ```
154
200
 
155
201
  Pry session:
156
202
 
157
- pry(main)> a.hello
158
- hello world!
159
- => nil
160
- pry(main)> def a.goodbye
161
- pry(main)* puts "goodbye cruel world!"
162
- pry(main)* end
163
- => nil
164
- pry(main)> a.goodbye
165
- goodbye cruel world!
166
- => nil
167
- pry(main)> exit
168
-
169
- program resumes here.
203
+ ```ruby
204
+ pry(main)> a.hello
205
+ hello world!
206
+ => nil
207
+ pry(main)> def a.goodbye
208
+ pry(main)* puts "goodbye cruel world!"
209
+ pry(main)* end
210
+ => :goodbye
211
+ pry(main)> a.goodbye
212
+ goodbye cruel world!
213
+ => nil
214
+ pry(main)> exit
215
+
216
+ program resumes here.
217
+ ```
170
218
 
171
219
  ### Command Shell Integration
172
220
 
173
- A line of input that begins with a '.' will be forwarded to the
174
- command shell. This enables us to navigate the file system, spawn
175
- editors, and run git and rake directly from within Pry.
221
+ A line of input that begins with a '.' will be forwarded to the command
222
+ shell. This enables us to navigate the file system, spawn editors, and run git
223
+ and rake directly from within Pry.
176
224
 
177
- Further, we can use the `shell-mode` command to incorporate the
178
- present working directory into the Pry prompt and bring in (limited at this stage, sorry) file name completion.
179
- We can also interpolate Ruby code directly into the shell by
225
+ Further, we can use the `shell-mode` command to incorporate the present working
226
+ directory into the Pry prompt and bring in (limited at this stage, sorry) file
227
+ name completion. We can also interpolate Ruby code directly into the shell by
180
228
  using the normal `#{}` string interpolation syntax.
181
229
 
182
- In the code below we're going to switch to `shell-mode` and edit the
183
- `.pryrc` file in the home directory. We'll then cat its contents and
184
- reload the file.
185
-
186
- pry(main)> shell-mode
187
- pry main:/home/john/ruby/projects/pry $ .cd ~
188
- pry main:/home/john $ .emacsclient .pryrc
189
- pry main:/home/john $ .cat .pryrc
190
- def hello_world
191
- puts "hello world!"
192
- end
193
- pry main:/home/john $ load ".pryrc"
194
- => true
195
- pry main:/home/john $ hello_world
196
- hello world!
197
-
198
- We can also interpolate Ruby code into the shell. In the
199
- example below we use the shell command `cat` on a random file from the
200
- current directory and count the number of lines in that file with
201
- `wc`:
202
-
203
- pry main:/home/john $ .cat #{Dir['*.*'].sample} | wc -l
204
- 44
230
+ In the code below we're going to switch to `shell-mode` and edit the `pryrc`
231
+ file. We'll then cat its contents and reload the file.
232
+
233
+ ```ruby
234
+ pry(main)> shell-mode
235
+ pry main:/home/john/ruby/projects/pry $ .cd ~
236
+ pry main:/home/john $ .emacsclient .pryrc
237
+ pry main:/home/john $ .cat .pryrc
238
+ def hello_world
239
+ puts "hello world!"
240
+ end
241
+ pry main:/home/john $ load ".pryrc"
242
+ => true
243
+ pry main:/home/john $ hello_world
244
+ hello world!
245
+ ```
246
+
247
+ We can also interpolate Ruby code into the shell. In the example below we use
248
+ the shell command `cat` on a random file from the current directory and count
249
+ the number of lines in that file with `wc`:
250
+
251
+ ```ruby
252
+ pry main:/home/john $ .cat #{Dir['*.*'].sample} | wc -l
253
+ 44
254
+ ```
205
255
 
206
256
  ### Code Browsing
207
257
 
208
- You can browse method source code with the `show-method` command. Nearly all Ruby methods (and some C methods, with the pry-doc
209
- gem) can have their source viewed. Code that is longer than a page is
210
- sent through a pager (such as less), and all code is properly syntax
211
- highlighted (even C code).
212
-
213
- The `show-method` command accepts two syntaxes, the typical ri
214
- `Class#method` syntax and also simply the name of a method that's in
215
- scope. You can optionally pass the `-l` option to show-method to
216
- include line numbers in the output.
217
-
218
- In the following example we will enter the `Pry` class, list the
219
- instance methods beginning with 're' and display the source code for the `rep` method:
220
-
221
- pry(main)> cd Pry
222
- pry(Pry):1> ls -M --grep re
223
- Pry#methods: re readline refresh rep repl repl_epilogue repl_prologue retrieve_line
224
- pry(Pry):1> show-method rep -l
225
-
226
- From: /home/john/ruby/projects/pry/lib/pry/pry_instance.rb @ line 143:
227
- Number of lines: 6
228
-
229
- 143: def rep(target=TOPLEVEL_BINDING)
230
- 144: target = Pry.binding_for(target)
231
- 145: result = re(target)
232
- 146:
233
- 147: show_result(result) if should_print?
234
- 148: end
258
+ You can browse method source code with the `show-source` command. Nearly all
259
+ Ruby methods (and some C methods, with the pry-doc gem) can have their source
260
+ viewed. Code that is longer than a page is sent through a pager (such as less),
261
+ and all code is properly syntax highlighted (even C code).
262
+
263
+ The `show-source` command accepts two syntaxes, the typical ri `Class#method`
264
+ syntax and also simply the name of a method that's in scope. You can optionally
265
+ pass the `-l` option to `show-source` to include line numbers in the output.
266
+
267
+ In the following example we will enter the `Pry` class, list the instance
268
+ methods beginning with 'se' and display the source code for the `set_last_result` method:
269
+
270
+ ```ruby
271
+ pry(main)> cd Pry
272
+ pry(Pry):1> ls -M --grep se
273
+ Pry#methods: raise_up raise_up! raise_up_common reset_eval_string select_prompt set_last_result
274
+ pry(Pry):1> show-source set_last_result -l
275
+
276
+ From: /home/john/ruby/projects/pry/lib/pry/pry_instance.rb:405:
277
+ Owner: Pry
278
+ Visibility: public
279
+ Signature: set_last_result(result, code=?)
280
+ Number of lines: 6
281
+
282
+ 405: def set_last_result(result, code = "")
283
+ 406: @last_result_is_exception = false
284
+ 407: @output_ring << result
285
+ 408:
286
+ 409: self.last_result = result unless code =~ /\A\s*\z/
287
+ 410: end
288
+ ```
235
289
 
236
290
  Note that we can also view C methods (from Ruby Core) using the
237
291
  `pry-doc` plugin; we also show off the alternate syntax for
238
- `show-method`:
292
+ `show-source`:
239
293
 
240
- pry(main)> show-method Array#select
294
+ ```ruby
295
+ pry(main)> show-source Array#select
241
296
 
242
- From: array.c in Ruby Core (C Method):
243
- Number of lines: 15
297
+ From: array.c in Ruby Core (C Method):
298
+ Number of lines: 15
244
299
 
245
- static VALUE
246
- rb_ary_select(VALUE ary)
247
- {
248
- VALUE result;
249
- long i;
300
+ static VALUE
301
+ rb_ary_select(VALUE ary)
302
+ {
303
+ VALUE result;
304
+ long i;
250
305
 
251
- RETURN_ENUMERATOR(ary, 0, 0);
252
- result = rb_ary_new2(RARRAY_LEN(ary));
253
- for (i = 0; i < RARRAY_LEN(ary); i++) {
254
- if (RTEST(rb_yield(RARRAY_PTR(ary)[i]))) {
255
- rb_ary_push(result, rb_ary_elt(ary, i));
256
- }
306
+ RETURN_ENUMERATOR(ary, 0, 0);
307
+ result = rb_ary_new2(RARRAY_LEN(ary));
308
+ for (i = 0; i < RARRAY_LEN(ary); i++) {
309
+ if (RTEST(rb_yield(RARRAY_PTR(ary)[i]))) {
310
+ rb_ary_push(result, rb_ary_elt(ary, i));
257
311
  }
258
- return result;
259
312
  }
313
+ return result;
314
+ }
315
+ ```
260
316
 
261
317
  ### Documentation Browsing
262
318
 
263
- One use-case for Pry is to explore a program at run-time by `cd`-ing
264
- in and out of objects and viewing and invoking methods. In the course
265
- of exploring it may be useful to read the documentation for a
266
- specific method that you come across. Like `show-method` the `show-doc` command supports
267
- two syntaxes - the normal `ri` syntax as well as accepting the name of
268
- any method that is currently in scope.
269
-
270
- The Pry documentation system does not rely on pre-generated `rdoc` or
271
- `ri`, instead it grabs the comments directly above the method on
272
- demand. This results in speedier documentation retrieval and allows
273
- the Pry system to retrieve documentation for methods that would not be
274
- picked up by `rdoc`. Pry also has a basic understanding of both the
275
- rdoc and yard formats and will attempt to syntax highlight the
276
- documentation appropriately.
277
-
278
- Nonetheless, the `ri` functionality is very good and
279
- has an advantage over Pry's system in that it allows documentation
280
- lookup for classes as well as methods. Pry therefore has good
281
- integration with `ri` through the `ri` command. The syntax
282
- for the command is exactly as it would be in command-line -
319
+ One use-case for Pry is to explore a program at run-time by `cd`-ing in and out
320
+ of objects and viewing and invoking methods. In the course of exploring it may
321
+ be useful to read the documentation for a specific method that you come
322
+ across. `show-source` command supports two syntaxes - the
323
+ normal `ri` syntax as well as accepting the name of any method that is currently
324
+ in scope.
325
+
326
+ The Pry documentation system does not rely on pre-generated `rdoc` or `ri`,
327
+ instead it grabs the comments directly above the method on demand. This results
328
+ in speedier documentation retrieval and allows the Pry system to retrieve
329
+ documentation for methods that would not be picked up by `rdoc`. Pry also has a
330
+ basic understanding of both the rdoc and yard formats and will attempt to syntax
331
+ highlight the documentation appropriately.
332
+
333
+ Nonetheless, the `ri` functionality is very good and has an advantage over Pry's
334
+ system in that it allows documentation lookup for classes as well as
335
+ methods. Pry therefore has good integration with `ri` through the `ri`
336
+ command. The syntax for the command is exactly as it would be in command-line -
283
337
  so it is not necessary to quote strings.
284
338
 
285
- In our example we will enter the `Gem` class and view the
286
- documentation for the `try_activate` method:
339
+ In our example we will enter the `Gem` class and view the documentation for the
340
+ `try_activate` method:
287
341
 
288
- pry(main)> cd Gem
289
- pry(Gem):1> show-doc try_activate
342
+ ```ruby
343
+ pry(main)> cd Gem
344
+ pry(Gem):1> show-source try_activate -d
290
345
 
291
- From: /Users/john/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/site_ruby/1.9.1/rubygems.rb @ line 201:
292
- Number of lines: 3
346
+ From: /Users/john/rbenv/versions/2.7.1/lib/ruby/2.7.0/rubygems.rb:194:
347
+ Owner: #<Class:Gem>
348
+ Visibility: public
349
+ Signature: try_activate(path)
350
+ Number of lines: 28
293
351
 
294
- Try to activate a gem containing path. Returns true if
295
- activation succeeded or wasn't needed because it was already
296
- activated. Returns false if it can't find the path in a gem.
297
- pry(Gem):1>
352
+ Try to activate a gem containing path. Returns true if
353
+ activation succeeded or wasn't needed because it was already
354
+ activated. Returns false if it can't find the path in a gem.
298
355
 
299
- We can also use `ri` in the normal way:
300
-
301
- pry(main) ri Array#each
302
- ----------------------------------------------------------- Array#each
303
- array.each {|item| block } -> array
304
- ------------------------------------------------------------------------
305
- Calls _block_ once for each element in _self_, passing that element
306
- as a parameter.
307
-
308
- a = [ "a", "b", "c" ]
309
- a.each {|x| print x, " -- " }
356
+ def self.try_activate(path)
357
+ # finds the _latest_ version... regardless of loaded specs and their deps
358
+ # if another gem had a requirement that would mean we shouldn't
359
+ # activate the latest version, then either it would already be activated
360
+ # or if it was ambiguous (and thus unresolved) the code in our custom
361
+ # require will try to activate the more specific version.
310
362
 
311
- produces:
363
+ spec = Gem::Specification.find_by_path path
364
+ pry(Gem):1>
365
+ ```
312
366
 
313
- a -- b -- c --
367
+ We can also use `ri` in the normal way:
314
368
 
315
- ### Gist integration
369
+ ```ruby
370
+ pry(main) ri Array#each
371
+ ----------------------------------------------------------- Array#each
372
+ array.each {|item| block } -> array
373
+ ------------------------------------------------------------------------
374
+ Calls _block_ once for each element in _self_, passing that element
375
+ as a parameter.
316
376
 
317
- If the `gist` gem is installed then method source or documentation can be gisted to github with the
318
- `gist` command. The `gist` command is capable of gisting [almost any REPL content](https://gist.github.com/cae143e4533416529726), including methods, documentation,
319
- input expressions, command source, and so on. In the example below we will gist the C source
320
- code for the `Symbol#to_proc` method to github:
377
+ a = [ "a", "b", "c" ]
378
+ a.each {|x| print x, " -- " }
321
379
 
322
- pry(main)> gist -m Symbol#to_proc
323
- Gist created at https://gist.github.com/5332c38afc46d902ce46 and added to clipboard.
324
- pry(main)>
380
+ produces:
325
381
 
326
- You can see the actual gist generated here: [https://gist.github.com/5332c38afc46d902ce46](https://gist.github.com/5332c38afc46d902ce46)
382
+ a -- b -- c --
383
+ ```
327
384
 
328
385
  ### Edit methods
329
386
 
330
- You can use `edit Class#method` or `edit my_method`
331
- (if the method is in scope) to open a method for editing directly in
332
- your favorite editor. Pry has knowledge of a few different editors and
333
- will attempt to open the file at the line the method is defined.
387
+ You can use `edit Class#method` or `edit my_method` (if the method is in scope)
388
+ to open a method for editing directly in your favorite editor. Pry has knowledge
389
+ of a few different editors and will attempt to open the file at the line the
390
+ method is defined.
334
391
 
335
392
  You can set the editor to use by assigning to the `Pry.editor`
336
- accessor. `Pry.editor` will default to `$EDITOR` or failing that will
337
- use `nano` as the backup default. The file that is edited will be
338
- automatically reloaded after exiting the editor - reloading can be
339
- suppressed by passing the `--no-reload` option to `edit`
393
+ accessor. `Pry.editor` will default to `$EDITOR` or failing that will use `nano`
394
+ as the backup default. The file that is edited will be automatically reloaded
395
+ after exiting the editor - reloading can be suppressed by passing the
396
+ `--no-reload` option to `edit`
340
397
 
341
- In the example below we will set our default editor to "emacsclient"
342
- and open the `Pry#repl` method for editing:
398
+ In the example below we will set our default editor to "emacsclient" and open
399
+ the `Pry#repl` method for editing:
343
400
 
344
- pry(main)> Pry.editor = "emacsclient"
345
- pry(main)> edit Pry#repl
401
+ ```ruby
402
+ pry(main)> Pry.editor = "emacsclient"
403
+ pry(main)> edit Pry#repl
404
+ ```
346
405
 
347
406
  ### Live Help System
348
407
 
349
- Many other commands are available in Pry; to see the full list type
350
- `help` at the prompt. A short description of each command is provided
351
- with basic instructions for use; some commands have a more extensive
352
- help that can be accessed via typing `command_name --help`. A command
353
- will typically say in its description if the `--help` option is
354
- avaiable.
408
+ Many other commands are available in Pry; to see the full list type `help` at
409
+ the prompt. A short description of each command is provided with basic
410
+ instructions for use; some commands have a more extensive help that can be
411
+ accessed via typing `command_name --help`. A command will typically say in its
412
+ description if the `--help` option is available.
355
413
 
356
414
  ### Use Pry as your Rails Console
357
415
 
358
- The recommended way to use Pry as your Rails console is to add
359
- [the `pry-rails` gem](https://github.com/rweng/pry-rails) to
360
- your Gemfile. This replaces the default console with Pry, in
361
- addition to loading the Rails console helpers and adding some
362
- useful Rails-specific commands.
416
+ The recommended way to use Pry as your Rails console is to add [the `pry-rails`
417
+ gem](https://github.com/rweng/pry-rails) to your Gemfile. This replaces the
418
+ default console with Pry, in addition to loading the Rails console helpers and
419
+ adding some useful Rails-specific commands.
363
420
 
364
- If you don't want to change your Gemfile, you can still run a Pry
365
- console in your app's environment using Pry's `-r` flag:
421
+ If you don't want to change your Gemfile, you can still run a Pry console in
422
+ your app's environment using Pry's `-r` flag:
366
423
 
367
- pry -r ./config/environment
424
+ ```sh
425
+ pry -r ./config/environment
426
+ ```
368
427
 
369
- Also check out the [wiki](https://github.com/pry/pry/wiki/Setting-up-Rails-or-Heroku-to-use-Pry)
428
+ Also check out the
429
+ [wiki](https://github.com/pry/pry/wiki/Setting-up-Rails-or-Heroku-to-use-Pry)
370
430
  for more information about integrating Pry with Rails.
371
431
 
372
- ### Limitations:
432
+ ### Syntax Highlighting
373
433
 
374
- * Tab completion is currently a bit broken/limited this will have a
375
- major overhaul in a future version.
434
+ Syntax highlighting is on by default in Pry. If you want to change the colors,
435
+ check out the [pry-theme](https://github.com/kyrylo/pry-theme) gem.
376
436
 
377
- ### Syntax Highlighting
437
+ You can toggle the syntax highlighting on and off in a session by using the
438
+ `toggle-color` command. Alternatively, you can turn it off permanently by
439
+ putting the line `Pry.color = false` in your `pryrc` file.
378
440
 
379
- Syntax highlighting is on by default in Pry. If you want to change
380
- the colors, check out the [pry-theme](https://github.com/kyrylo/pry-theme)
381
- gem.
441
+ Supported Rubies
442
+ ----------------
382
443
 
383
- You can toggle the syntax highlighting on and off in a session by
384
- using the `toggle-color` command. Alternatively, you can turn it off
385
- permanently by putting the line `Pry.color = false` in your `~/.pryrc`
386
- file.
444
+ * CRuby >= 2.0.0
445
+ * JRuby >= 9.0
387
446
 
388
- ### Future Directions
447
+ Contact
448
+ -------
389
449
 
390
- Many new features are planned such as:
450
+ In case you have a problem, question or a bug report, feel free to:
391
451
 
392
- * Increase modularity (rely more on plugin system)
393
- * Much improved documentation system, better support for YARD
394
- * Better support for code and method reloading and saving code
395
- * Extended and more sophisticated command system, allowing piping
396
- between commands and running commands in background
452
+ * ask a question on IRC (#pry on Freenode)
453
+ * [file an issue](https://github.com/pry/pry/issues)
454
+ * [tweet at us](https://twitter.com/pryruby)
397
455
 
398
- ### Contact
456
+ License
457
+ -------
399
458
 
400
- Problems or questions? file an issue at [github](https://github.com/pry/pry/issues)
459
+ The project uses the MIT License. See LICENSE.md for details.
401
460
 
402
- ### Contributors
461
+ Contributors
462
+ ------------
403
463
 
404
- Pry is primarily the work of [John Mair (banisterfiend)](http://github.com/banister), for full list
464
+ Pry is primarily the work of [John Mair (banisterfiend)](https://github.com/banister), for full list
405
465
  of contributors see the
406
- [CONTRIBUTORS](https://github.com/pry/pry/blob/master/CONTRIBUTORS) file.
466
+ [contributors graph](https://github.com/pry/pry/graphs/contributors).