pry 0.10.4 → 0.14.2

Sign up to get free protection for your applications and to get access to all the features.
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 +41 -32
  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 +193 -160
  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 +155 -146
  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 -177
  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} +34 -32
  138. data/lib/pry/wrapped_module.rb +67 -63
  139. data/lib/pry.rb +133 -149
  140. metadata +52 -63
  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).