pry 0.9.12.2 → 0.14.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (237) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1141 -0
  3. data/LICENSE +2 -2
  4. data/README.md +466 -0
  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 +97 -92
  10. data/lib/pry/code/code_file.rb +114 -0
  11. data/lib/pry/code/code_range.rb +7 -4
  12. data/lib/pry/code/loc.rb +27 -14
  13. data/lib/pry/code.rb +62 -90
  14. data/lib/pry/code_object.rb +83 -39
  15. data/lib/pry/color_printer.rb +66 -0
  16. data/lib/pry/command.rb +202 -371
  17. data/lib/pry/command_set.rb +151 -133
  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 -73
  24. data/lib/pry/commands/cat/file_formatter.rb +56 -63
  25. data/lib/pry/commands/cat/input_expression_formatter.rb +35 -30
  26. data/lib/pry/commands/cat.rb +64 -47
  27. data/lib/pry/commands/cd.rb +42 -26
  28. data/lib/pry/commands/change_inspector.rb +34 -0
  29. data/lib/pry/commands/change_prompt.rb +51 -0
  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 +33 -24
  36. data/lib/pry/commands/edit.rb +183 -167
  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 -17
  40. data/lib/pry/commands/find_method.rb +167 -167
  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 +153 -132
  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 +42 -0
  47. data/lib/pry/commands/ls/constants.rb +75 -0
  48. data/lib/pry/commands/ls/formatter.rb +55 -0
  49. data/lib/pry/commands/ls/globals.rb +50 -0
  50. data/lib/pry/commands/ls/grep.rb +23 -0
  51. data/lib/pry/commands/ls/instance_vars.rb +40 -0
  52. data/lib/pry/commands/ls/interrogatable.rb +24 -0
  53. data/lib/pry/commands/ls/jruby_hacks.rb +55 -0
  54. data/lib/pry/commands/ls/local_names.rb +37 -0
  55. data/lib/pry/commands/ls/local_vars.rb +47 -0
  56. data/lib/pry/commands/ls/ls_entity.rb +65 -0
  57. data/lib/pry/commands/ls/methods.rb +55 -0
  58. data/lib/pry/commands/ls/methods_helper.rb +50 -0
  59. data/lib/pry/commands/ls/self_methods.rb +34 -0
  60. data/lib/pry/commands/ls.rb +100 -303
  61. data/lib/pry/commands/nesting.rb +21 -17
  62. data/lib/pry/commands/play.rb +93 -49
  63. data/lib/pry/commands/pry_backtrace.rb +22 -18
  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 +57 -48
  67. data/lib/pry/commands/reset.rb +16 -12
  68. data/lib/pry/commands/ri.rb +57 -38
  69. data/lib/pry/commands/save_file.rb +45 -43
  70. data/lib/pry/commands/shell_command.rb +66 -34
  71. data/lib/pry/commands/shell_mode.rb +22 -20
  72. data/lib/pry/commands/show_doc.rb +80 -65
  73. data/lib/pry/commands/show_info.rb +193 -159
  74. data/lib/pry/commands/show_input.rb +16 -11
  75. data/lib/pry/commands/show_source.rb +113 -33
  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 +21 -13
  79. data/lib/pry/commands/watch_expression/expression.rb +43 -0
  80. data/lib/pry/commands/watch_expression.rb +110 -0
  81. data/lib/pry/commands/whereami.rb +157 -134
  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 +290 -220
  88. data/lib/pry/control_d_handler.rb +28 -0
  89. data/lib/pry/core_extensions.rb +50 -27
  90. data/lib/pry/editor.rb +130 -102
  91. data/lib/pry/env.rb +18 -0
  92. data/lib/pry/exception_handler.rb +43 -0
  93. data/lib/pry/exceptions.rb +73 -0
  94. data/lib/pry/forwardable.rb +27 -0
  95. data/lib/pry/helpers/base_helpers.rb +22 -151
  96. data/lib/pry/helpers/command_helpers.rb +55 -63
  97. data/lib/pry/helpers/documentation_helpers.rb +21 -13
  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 -86
  102. data/lib/pry/helpers.rb +3 -0
  103. data/lib/pry/history.rb +101 -70
  104. data/lib/pry/hooks.rb +67 -137
  105. data/lib/pry/indent.rb +79 -73
  106. data/lib/pry/input_completer.rb +283 -0
  107. data/lib/pry/input_lock.rb +129 -0
  108. data/lib/pry/inspector.rb +39 -0
  109. data/lib/pry/last_exception.rb +61 -0
  110. data/lib/pry/method/disowned.rb +19 -5
  111. data/lib/pry/{commands/edit/method_patcher.rb → method/patcher.rb} +51 -42
  112. data/lib/pry/method/weird_method_locator.rb +80 -44
  113. data/lib/pry/method.rb +225 -176
  114. data/lib/pry/object_path.rb +91 -0
  115. data/lib/pry/output.rb +136 -0
  116. data/lib/pry/pager.rb +227 -68
  117. data/lib/pry/prompt.rb +214 -0
  118. data/lib/pry/pry_class.rb +216 -289
  119. data/lib/pry/pry_instance.rb +438 -500
  120. data/lib/pry/repl.rb +256 -0
  121. data/lib/pry/repl_file_loader.rb +34 -35
  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} +36 -43
  138. data/lib/pry/wrapped_module.rb +102 -103
  139. data/lib/pry.rb +135 -261
  140. metadata +94 -283
  141. data/.document +0 -2
  142. data/.gitignore +0 -16
  143. data/.travis.yml +0 -21
  144. data/.yardopts +0 -1
  145. data/CHANGELOG +0 -534
  146. data/CONTRIBUTORS +0 -55
  147. data/Gemfile +0 -9
  148. data/Guardfile +0 -62
  149. data/README.markdown +0 -400
  150. data/Rakefile +0 -140
  151. data/TODO +0 -117
  152. data/lib/pry/commands/disabled_commands.rb +0 -2
  153. data/lib/pry/commands/gem_cd.rb +0 -26
  154. data/lib/pry/commands/gem_install.rb +0 -29
  155. data/lib/pry/commands/gem_list.rb +0 -33
  156. data/lib/pry/commands/gem_open.rb +0 -29
  157. data/lib/pry/commands/gist.rb +0 -102
  158. data/lib/pry/commands/install_command.rb +0 -51
  159. data/lib/pry/commands/simple_prompt.rb +0 -22
  160. data/lib/pry/commands.rb +0 -6
  161. data/lib/pry/completion.rb +0 -304
  162. data/lib/pry/custom_completions.rb +0 -6
  163. data/lib/pry/history_array.rb +0 -116
  164. data/lib/pry/plugins.rb +0 -103
  165. data/lib/pry/rbx_method.rb +0 -13
  166. data/lib/pry/rbx_path.rb +0 -22
  167. data/lib/pry/rubygem.rb +0 -74
  168. data/lib/pry/terminal.rb +0 -78
  169. data/lib/pry/test/helper.rb +0 -185
  170. data/man/pry.1 +0 -195
  171. data/man/pry.1.html +0 -204
  172. data/man/pry.1.ronn +0 -141
  173. data/pry.gemspec +0 -30
  174. data/spec/Procfile +0 -3
  175. data/spec/cli_spec.rb +0 -78
  176. data/spec/code_object_spec.rb +0 -277
  177. data/spec/code_spec.rb +0 -219
  178. data/spec/command_helpers_spec.rb +0 -29
  179. data/spec/command_integration_spec.rb +0 -644
  180. data/spec/command_set_spec.rb +0 -627
  181. data/spec/command_spec.rb +0 -821
  182. data/spec/commands/amend_line_spec.rb +0 -247
  183. data/spec/commands/bang_spec.rb +0 -19
  184. data/spec/commands/cat_spec.rb +0 -164
  185. data/spec/commands/cd_spec.rb +0 -250
  186. data/spec/commands/disable_pry_spec.rb +0 -25
  187. data/spec/commands/edit_spec.rb +0 -727
  188. data/spec/commands/exit_all_spec.rb +0 -34
  189. data/spec/commands/exit_program_spec.rb +0 -19
  190. data/spec/commands/exit_spec.rb +0 -34
  191. data/spec/commands/find_method_spec.rb +0 -70
  192. data/spec/commands/gem_list_spec.rb +0 -26
  193. data/spec/commands/gist_spec.rb +0 -79
  194. data/spec/commands/help_spec.rb +0 -56
  195. data/spec/commands/hist_spec.rb +0 -181
  196. data/spec/commands/jump_to_spec.rb +0 -15
  197. data/spec/commands/ls_spec.rb +0 -181
  198. data/spec/commands/play_spec.rb +0 -140
  199. data/spec/commands/raise_up_spec.rb +0 -56
  200. data/spec/commands/save_file_spec.rb +0 -177
  201. data/spec/commands/show_doc_spec.rb +0 -510
  202. data/spec/commands/show_input_spec.rb +0 -17
  203. data/spec/commands/show_source_spec.rb +0 -782
  204. data/spec/commands/whereami_spec.rb +0 -203
  205. data/spec/completion_spec.rb +0 -239
  206. data/spec/control_d_handler_spec.rb +0 -58
  207. data/spec/documentation_helper_spec.rb +0 -73
  208. data/spec/editor_spec.rb +0 -79
  209. data/spec/exception_whitelist_spec.rb +0 -21
  210. data/spec/fixtures/candidate_helper1.rb +0 -11
  211. data/spec/fixtures/candidate_helper2.rb +0 -8
  212. data/spec/fixtures/example.erb +0 -5
  213. data/spec/fixtures/example_nesting.rb +0 -33
  214. data/spec/fixtures/show_source_doc_examples.rb +0 -15
  215. data/spec/fixtures/testrc +0 -2
  216. data/spec/fixtures/testrcbad +0 -2
  217. data/spec/fixtures/whereami_helper.rb +0 -6
  218. data/spec/helper.rb +0 -34
  219. data/spec/helpers/bacon.rb +0 -86
  220. data/spec/helpers/mock_pry.rb +0 -43
  221. data/spec/helpers/table_spec.rb +0 -105
  222. data/spec/history_array_spec.rb +0 -67
  223. data/spec/hooks_spec.rb +0 -522
  224. data/spec/indent_spec.rb +0 -301
  225. data/spec/input_stack_spec.rb +0 -90
  226. data/spec/method_spec.rb +0 -482
  227. data/spec/prompt_spec.rb +0 -60
  228. data/spec/pry_defaults_spec.rb +0 -419
  229. data/spec/pry_history_spec.rb +0 -99
  230. data/spec/pry_output_spec.rb +0 -95
  231. data/spec/pry_spec.rb +0 -504
  232. data/spec/run_command_spec.rb +0 -25
  233. data/spec/sticky_locals_spec.rb +0 -157
  234. data/spec/syntax_checking_spec.rb +0 -81
  235. data/spec/wrapped_module_spec.rb +0 -261
  236. data/wiki/Customizing-pry.md +0 -397
  237. data/wiki/Home.md +0 -4
data/lib/pry/hooks.rb CHANGED
@@ -1,37 +1,33 @@
1
- class Pry
1
+ # frozen_string_literal: true
2
2
 
3
- # Implements a hooks system for Pry. A hook is a callable that is
4
- # associated with an event. A number of events are currently
5
- # provided by Pry, these include: `:when_started`, `:before_session`, `:after_session`.
6
- # A hook must have a name, and is connected with an event by the
7
- # `Pry::Hooks#add_hook` method.
3
+ class Pry
4
+ # Implements a hooks system for Pry. A hook is a callable that is associated
5
+ # with an event. A number of events are currently provided by Pry, these
6
+ # include: `:when_started`, `:before_session`, `:after_session`. A hook must
7
+ # have a name, and is connected with an event by the `Pry::Hooks#add_hook`
8
+ # method.
9
+ #
8
10
  # @example Adding a hook for the `:before_session` event.
9
11
  # Pry.config.hooks.add_hook(:before_session, :say_hi) do
10
12
  # puts "hello"
11
13
  # end
12
14
  class Hooks
15
+ def self.default
16
+ hooks = new
17
+ hooks.add_hook(:before_session, :default) do |_out, _target, pry_instance|
18
+ next if pry_instance.quiet?
13
19
 
14
- # Converts a hash to a `Pry::Hooks` instance. All hooks defined
15
- # this way are anonymous. This functionality is primarily to
16
- # provide backwards-compatibility with the old hash-based hook
17
- # system in Pry versions < 0.9.8
18
- # @param [Hash] hash The hash to convert to `Pry::Hooks`.
19
- # @return [Pry::Hooks] The resulting `Pry::Hooks` instance.
20
- def self.from_hash(hash)
21
- instance = new
22
- hash.each do |k, v|
23
- instance.add_hook(k, nil, v)
20
+ pry_instance.run_command('whereami --quiet')
24
21
  end
25
-
26
- instance
22
+ hooks
27
23
  end
28
24
 
29
25
  def initialize
30
- @hooks = {}
26
+ @hooks = Hash.new { |h, k| h[k] = [] }
31
27
  end
32
28
 
33
- # Ensure that duplicates have their @hooks object
34
- def initialize_copy(orig)
29
+ # Ensure that duplicates have their @hooks object.
30
+ def initialize_copy(_orig)
35
31
  hooks_dup = @hooks.dup
36
32
  @hooks.each do |k, v|
37
33
  hooks_dup[k] = v.dup
@@ -40,79 +36,50 @@ class Pry
40
36
  @hooks = hooks_dup
41
37
  end
42
38
 
43
- def hooks
44
- @hooks
45
- end
46
- protected :hooks
47
-
48
39
  def errors
49
40
  @errors ||= []
50
41
  end
51
42
 
52
- # FIXME:
53
- # This is a hack to alert people of the new API.
54
- def [](event_name)
55
- warn "`Pry.hooks[]` is deprecated! Please use the new `Pry::Hooks` API! http://rubydoc.info/github/pry/pry/master/Pry/Hooks"
56
-
57
- get_hook(event_name, nil)
58
- end
59
-
60
- # FIXME:
61
- # This is a hack to alert people of the new API.
62
- def []=(event_name, callable)
63
- warn "`Pry.hooks[]=` is deprecated! Please use the new `Pry::Hooks` API! http://rubydoc.info/github/pry/pry/master/Pry/Hooks"
64
-
65
- add_hook(event_name, nil, callable)
66
- end
67
-
68
43
  # Destructively merge the contents of two `Pry:Hooks` instances.
44
+ #
69
45
  # @param [Pry::Hooks] other The `Pry::Hooks` instance to merge
70
- # @return [Pry:Hooks] Returns the receiver.
71
- # @example
72
- # hooks = Pry::Hooks.new.add_hook(:before_session, :say_hi) { puts "hi!" }
73
- # Pry::Hooks.new.merge!(hooks)
46
+ # @return [Pry:Hooks] The receiver.
47
+ # @see #merge
74
48
  def merge!(other)
75
- @hooks.merge!(other.dup.hooks) do |key, v1, v2|
76
- merge_arrays(v1, v2)
77
- end
49
+ @hooks.merge!(other.dup.hooks) do |_key, array, other_array|
50
+ temp_hash = {}
51
+ output = []
78
52
 
79
- self
80
- end
53
+ (array + other_array).reverse_each do |pair|
54
+ temp_hash[pair.first] ||= output.unshift(pair)
55
+ end
81
56
 
82
- def merge_arrays(array1, array2)
83
- uniq_keeping_last(array1 + array2, &:first)
84
- end
85
- private :merge_arrays
57
+ output
58
+ end
86
59
 
87
- def uniq_keeping_last(input, &block)
88
- hash, output = {}, []
89
- input.reverse.each{ |i| hash[block[i]] ||= (output.unshift i) }
90
- output
60
+ self
91
61
  end
92
- private :uniq_keeping_last
93
62
 
94
- # Return a new `Pry::Hooks` instance containing a merge of the contents of two `Pry:Hooks` instances,
95
- # @param [Pry::Hooks] other The `Pry::Hooks` instance to merge
96
- # @return [Pry::Hooks] The new hash.
97
63
  # @example
98
64
  # hooks = Pry::Hooks.new.add_hook(:before_session, :say_hi) { puts "hi!" }
99
65
  # Pry::Hooks.new.merge(hooks)
66
+ # @param [Pry::Hooks] other The `Pry::Hooks` instance to merge
67
+ # @return [Pry::Hooks] a new `Pry::Hooks` instance containing a merge of the
68
+ # contents of two `Pry:Hooks` instances.
100
69
  def merge(other)
101
- self.dup.tap do |v|
70
+ dup.tap do |v|
102
71
  v.merge!(other)
103
72
  end
104
73
  end
105
74
 
106
- # Add a new hook to be executed for the `name` even.
75
+ # Add a new hook to be executed for the `event_name` event.
107
76
  # @param [Symbol] event_name The name of the event.
108
77
  # @param [Symbol] hook_name The name of the hook.
109
78
  # @param [#call] callable The callable.
110
- # @yield The block to use as the callable (if `callable` parameter not provided)
111
- # @return [Pry:Hooks] Returns the receiver.
112
- # @example
113
- # Pry::Hooks.new.add_hook(:before_session, :say_hi) { puts "hi!" }
114
- def add_hook(event_name, hook_name, callable=nil, &block)
115
- @hooks[event_name] ||= []
79
+ # @yield The block to use as the callable (if no `callable` provided).
80
+ # @return [Pry:Hooks] The receiver.
81
+ def add_hook(event_name, hook_name, callable = nil, &block)
82
+ event_name = event_name.to_s
116
83
 
117
84
  # do not allow duplicates, but allow multiple `nil` hooks
118
85
  # (anonymous hooks)
@@ -120,12 +87,10 @@ class Pry
120
87
  raise ArgumentError, "Hook with name '#{hook_name}' already defined!"
121
88
  end
122
89
 
123
- if !block && !callable
124
- raise ArgumentError, "Must provide a block or callable."
125
- end
90
+ raise ArgumentError, "Must provide a block or callable." if !block && !callable
126
91
 
127
92
  # ensure we only have one anonymous hook
128
- @hooks[event_name].delete_if { |h, k| h.nil? } if hook_name.nil?
93
+ @hooks[event_name].delete_if { |h, _k| h.nil? } if hook_name.nil?
129
94
 
130
95
  if block
131
96
  @hooks[event_name] << [hook_name, block]
@@ -140,76 +105,49 @@ class Pry
140
105
  # @param [Symbol] event_name The name of the event.
141
106
  # @param [Array] args The arguments to pass to each hook function.
142
107
  # @return [Object] The return value of the last executed hook.
143
- # @example
144
- # my_hooks = Pry::Hooks.new.add_hook(:before_session, :say_hi) { puts "hi!" }
145
- # my_hooks.exec_hook(:before_session) #=> OUTPUT: "hi!"
146
108
  def exec_hook(event_name, *args, &block)
147
- @hooks[event_name] ||= []
148
-
149
- # silence warnings to get rid of 1.8's "warning: multiple values
150
- # for a block parameter" warnings
151
- Pry::Helpers::BaseHelpers.silence_warnings do
152
- @hooks[event_name].map do |hook_name, callable|
153
- begin
154
- callable.call(*args, &block)
155
- rescue RescuableException => e
156
- errors << e
157
- e
158
- end
159
- end.last
160
- end
109
+ @hooks[event_name.to_s].map do |_hook_name, callable|
110
+ begin
111
+ callable.call(*args, &block)
112
+ rescue RescuableException => e
113
+ errors << e
114
+ e
115
+ end
116
+ end.last
161
117
  end
162
118
 
163
- # Return the number of hook functions registered for the `event_name` event.
164
119
  # @param [Symbol] event_name The name of the event.
165
120
  # @return [Fixnum] The number of hook functions for `event_name`.
166
- # @example
167
- # my_hooks = Pry::Hooks.new.add_hook(:before_session, :say_hi) { puts "hi!" }
168
- # my_hooks.count(:before_session) #=> 1
169
121
  def hook_count(event_name)
170
- @hooks[event_name] ||= []
171
- @hooks[event_name].size
122
+ @hooks[event_name.to_s].size
172
123
  end
173
124
 
174
- # Return a specific hook for a given event.
175
125
  # @param [Symbol] event_name The name of the event.
176
126
  # @param [Symbol] hook_name The name of the hook
177
- # @return [#call] The requested hook.
178
- # @example
179
- # my_hooks = Pry::Hooks.new.add_hook(:before_session, :say_hi) { puts "hi!" }
180
- # my_hooks.get_hook(:before_session, :say_hi).call #=> "hi!"
127
+ # @return [#call] a specific hook for a given event.
181
128
  def get_hook(event_name, hook_name)
182
- @hooks[event_name] ||= []
183
- hook = @hooks[event_name].find { |current_hook_name, callable| current_hook_name == hook_name }
129
+ hook = @hooks[event_name.to_s].find do |current_hook_name, _callable|
130
+ current_hook_name == hook_name
131
+ end
184
132
  hook.last if hook
185
133
  end
186
134
 
187
- # Return the hash of hook names / hook functions for a
188
- # given event. (Note that modifying the returned hash does not
189
- # alter the hooks, use add_hook/delete_hook for that).
190
135
  # @param [Symbol] event_name The name of the event.
191
136
  # @return [Hash] The hash of hook names / hook functions.
192
- # @example
193
- # my_hooks = Pry::Hooks.new.add_hook(:before_session, :say_hi) { puts "hi!" }
194
- # my_hooks.get_hooks(:before_session) #=> {:say_hi=>#<Proc:0x00000101645e18@(pry):9>}
137
+ # @note Modifying the returned hash does not alter the hooks, use
138
+ # `add_hook`/`delete_hook` for that.
195
139
  def get_hooks(event_name)
196
- @hooks[event_name] ||= []
197
- Hash[@hooks[event_name]]
140
+ Hash[@hooks[event_name.to_s]]
198
141
  end
199
142
 
200
- # Delete a hook for an event.
201
143
  # @param [Symbol] event_name The name of the event.
202
144
  # @param [Symbol] hook_name The name of the hook.
203
145
  # to delete.
204
146
  # @return [#call] The deleted hook.
205
- # @example
206
- # my_hooks = Pry::Hooks.new.add_hook(:before_session, :say_hi) { puts "hi!" }
207
- # my_hooks.delete_hook(:before_session, :say_hi)
208
147
  def delete_hook(event_name, hook_name)
209
- @hooks[event_name] ||= []
210
148
  deleted_callable = nil
211
149
 
212
- @hooks[event_name].delete_if do |current_hook_name, callable|
150
+ @hooks[event_name.to_s].delete_if do |current_hook_name, callable|
213
151
  if current_hook_name == hook_name
214
152
  deleted_callable = callable
215
153
  true
@@ -221,30 +159,22 @@ class Pry
221
159
  end
222
160
 
223
161
  # Clear all hooks functions for a given event.
162
+ #
224
163
  # @param [String] event_name The name of the event.
225
- # @example
226
- # my_hooks = Pry::Hooks.new.add_hook(:before_session, :say_hi) { puts "hi!" }
227
- # my_hooks.delete_hook(:before_session)
228
- def delete_hooks(event_name)
229
- @hooks[event_name] = []
230
- end
231
-
232
- alias_method :clear, :delete_hooks
233
-
234
- # Remove all events and hooks, clearing out the Pry::Hooks
235
- # instance completely.
236
- # @example
237
- # my_hooks = Pry::Hooks.new.add_hook(:before_session, :say_hi) { puts "hi!" }
238
- # my_hooks.clear_all
239
- def clear_all
240
- @hooks = {}
164
+ # @return [void]
165
+ def clear_event_hooks(event_name)
166
+ @hooks[event_name.to_s] = []
241
167
  end
242
168
 
243
169
  # @param [Symbol] event_name Name of the event.
244
170
  # @param [Symbol] hook_name Name of the hook.
245
- # @return [Boolean] Whether the hook by the name `hook_name`
171
+ # @return [Boolean] Whether the hook by the name `hook_name`.
246
172
  def hook_exists?(event_name, hook_name)
247
- !!(@hooks[event_name] && @hooks[event_name].find { |name, _| name == hook_name })
173
+ @hooks[event_name.to_s].map(&:first).include?(hook_name)
248
174
  end
175
+
176
+ protected
177
+
178
+ attr_reader :hooks
249
179
  end
250
180
  end
data/lib/pry/indent.rb CHANGED
@@ -1,4 +1,4 @@
1
- require 'coderay'
1
+ # frozen_string_literal: true
2
2
 
3
3
  class Pry
4
4
  ##
@@ -21,35 +21,35 @@ class Pry
21
21
  attr_reader :stack
22
22
 
23
23
  # The amount of spaces to insert for each indent level.
24
- SPACES = ' '
24
+ SPACES = ' '.freeze
25
25
 
26
26
  # Hash containing all the tokens that should increase the indentation
27
27
  # level. The keys of this hash are open tokens, the values the matching
28
28
  # tokens that should prevent a line from being indented if they appear on
29
29
  # the same line.
30
30
  OPEN_TOKENS = {
31
- 'def' => 'end',
32
- 'class' => 'end',
31
+ 'def' => 'end',
32
+ 'class' => 'end',
33
33
  'module' => 'end',
34
- 'do' => 'end',
35
- 'if' => 'end',
34
+ 'do' => 'end',
35
+ 'if' => 'end',
36
36
  'unless' => 'end',
37
- 'while' => 'end',
38
- 'until' => 'end',
39
- 'for' => 'end',
40
- 'case' => 'end',
41
- 'begin' => 'end',
42
- '[' => ']',
43
- '{' => '}',
44
- '(' => ')'
45
- }
37
+ 'while' => 'end',
38
+ 'until' => 'end',
39
+ 'for' => 'end',
40
+ 'case' => 'end',
41
+ 'begin' => 'end',
42
+ '[' => ']',
43
+ '{' => '}',
44
+ '(' => ')'
45
+ }.freeze
46
46
 
47
47
  # Which tokens can either be open tokens, or appear as modifiers on
48
48
  # a single-line.
49
- SINGLELINE_TOKENS = %w(if while until unless rescue)
49
+ SINGLELINE_TOKENS = %w[if while until unless rescue].freeze
50
50
 
51
51
  # Which tokens can be followed by an optional "do" keyword.
52
- OPTIONAL_DO_TOKENS = %w(for while until)
52
+ OPTIONAL_DO_TOKENS = %w[for while until].freeze
53
53
 
54
54
  # Collection of token types that should be ignored. Without this list
55
55
  # keywords such as "class" inside strings would cause the code to be
@@ -57,8 +57,8 @@ class Pry
57
57
  #
58
58
  # :pre_constant and :preserved_constant are the CodeRay 0.9.8 and 1.0.0
59
59
  # classifications of "true", "false", and "nil".
60
- IGNORE_TOKENS = [:space, :content, :string, :method, :ident,
61
- :constant, :pre_constant, :predefined_constant]
60
+ IGNORE_TOKENS = %i[space content string method ident
61
+ constant pre_constant predefined_constant].freeze
62
62
 
63
63
  # Tokens that indicate the end of a statement (i.e. that, if they appear
64
64
  # directly before an "if" indicates that that if applies to the same line,
@@ -66,12 +66,14 @@ class Pry
66
66
  #
67
67
  # :reserved and :keywords are the CodeRay 0.9.8 and 1.0.0 respectively
68
68
  # classifications of "super", "next", "return", etc.
69
- STATEMENT_END_TOKENS = IGNORE_TOKENS + [:regexp, :integer, :float, :keyword,
70
- :delimiter, :reserved]
69
+ STATEMENT_END_TOKENS = IGNORE_TOKENS + %i[regexp integer float
70
+ keyword delimiter reserved
71
+ instance_variable
72
+ class_variable global_variable]
71
73
 
72
74
  # Collection of tokens that should appear dedented even though they
73
75
  # don't affect the surrounding code.
74
- MIDWAY_TOKENS = %w(when else elsif ensure rescue)
76
+ MIDWAY_TOKENS = %w[when else elsif ensure rescue].freeze
75
77
 
76
78
  # Clean the indentation of a fragment of ruby.
77
79
  #
@@ -94,19 +96,20 @@ class Pry
94
96
  indent = new
95
97
  lines = str.split("\n")
96
98
  n = line_number - 1
97
- to_indent = lines[0...n] + (lines[n] || "").split("def").first(1)
98
- indent.indent(to_indent.join("\n") + "\n")
99
+ to_indent = lines[0...n] << (lines[n] || "").split("def").first(1)
100
+ indent.indent(to_indent.join("\n") << "\n")
99
101
  indent.module_nesting
100
102
  end
101
103
 
102
- def initialize
104
+ def initialize(pry_instance = Pry.new)
105
+ @pry_instance = pry_instance
103
106
  reset
104
107
  end
105
108
 
106
109
  # reset internal state
107
110
  def reset
108
111
  @stack = []
109
- @indent_level = ''
112
+ @indent_level = String.new # rubocop:disable Style/EmptyLiteral
110
113
  @heredoc_queue = []
111
114
  @close_heredocs = {}
112
115
  @string_start = nil
@@ -141,10 +144,11 @@ class Pry
141
144
  prefix = indent_level
142
145
 
143
146
  input.lines.each do |line|
144
-
145
147
  if in_string?
146
148
  tokens = tokenize("#{open_delimiters_line}\n#{line}")
147
- tokens = tokens.drop_while{ |token, type| !(String === token && token.include?("\n")) }
149
+ tokens = tokens.drop_while do |token, _type|
150
+ !(token.is_a?(String) && token.include?("\n"))
151
+ end
148
152
  previously_in_string = true
149
153
  else
150
154
  tokens = tokenize(line)
@@ -153,7 +157,7 @@ class Pry
153
157
 
154
158
  before, after = indentation_delta(tokens)
155
159
 
156
- before.times{ prefix.sub! SPACES, '' }
160
+ before.times { prefix.sub! SPACES, '' }
157
161
  new_prefix = prefix + SPACES * after
158
162
 
159
163
  line = prefix + line.lstrip unless previously_in_string
@@ -165,7 +169,7 @@ class Pry
165
169
 
166
170
  @indent_level = prefix
167
171
 
168
- return output
172
+ output
169
173
  end
170
174
 
171
175
  # Get the indentation for the start of the next line.
@@ -192,7 +196,6 @@ class Pry
192
196
  # @return [Array[Integer]]
193
197
  #
194
198
  def indentation_delta(tokens)
195
-
196
199
  # We need to keep track of whether we've seen a "for" on this line because
197
200
  # if the line ends with "do" then that "do" should be discounted (i.e. we're
198
201
  # only opening one level not two) To do this robustly we want to keep track
@@ -203,29 +206,37 @@ class Pry
203
206
  # When deciding whether an "if" token is the start of a multiline statement,
204
207
  # or just the middle of a single-line if statement, we just look at the
205
208
  # preceding token, which is tracked here.
206
- last_token, last_kind = [nil, nil]
209
+ last_token = nil
210
+ last_kind = nil
207
211
 
208
212
  # delta keeps track of the total difference from the start of each line after
209
213
  # the given token, 0 is just the level at which the current line started for
210
214
  # reference.
211
- remove_before, add_after = [0, 0]
215
+ remove_before = 0
216
+ add_after = 0
212
217
 
213
218
  # If the list of tokens contains a matching closing token the line should
214
219
  # not be indented (and thus we should return true).
215
220
  tokens.each do |token, kind|
216
- is_singleline_if = (SINGLELINE_TOKENS.include?(token)) && end_of_statement?(last_token, last_kind)
221
+ is_singleline_if =
222
+ SINGLELINE_TOKENS.include?(token) && end_of_statement?(last_token, last_kind)
217
223
  is_optional_do = (token == "do" && seen_for_at.include?(add_after - 1))
218
224
 
219
- last_token, last_kind = token, kind unless kind == :space
225
+ unless kind == :space
226
+ last_token = token
227
+ last_kind = kind
228
+ end
220
229
  next if IGNORE_TOKENS.include?(kind)
221
230
 
222
231
  track_module_nesting(token, kind)
223
232
 
224
233
  seen_for_at << add_after if OPTIONAL_DO_TOKENS.include?(token)
225
234
 
235
+ next if is_singleline_if
236
+
226
237
  if kind == :delimiter
227
238
  track_delimiter(token)
228
- elsif OPEN_TOKENS.keys.include?(token) && !is_optional_do && !is_singleline_if
239
+ elsif OPEN_TOKENS.key?(token) && !is_optional_do && !is_singleline_if
229
240
  @stack << token
230
241
  add_after += 1
231
242
  elsif token == OPEN_TOKENS[@stack.last]
@@ -244,20 +255,21 @@ class Pry
244
255
  end
245
256
  end
246
257
 
247
- return [remove_before, add_after]
258
+ [remove_before, add_after]
248
259
  end
249
260
 
250
- # If the code just before an "if" or "while" token on a line looks like the end of a statement,
251
- # then we want to treat that "if" as a singleline, not multiline statement.
261
+ # If the code just before an "if" or "while" token on a line looks like the
262
+ # end of a statement, then we want to treat that "if" as a singleline, not
263
+ # multiline statement.
252
264
  def end_of_statement?(last_token, last_kind)
253
- (last_token =~ /^[)\]}\/]$/ || STATEMENT_END_TOKENS.include?(last_kind))
265
+ (last_token =~ %r{^[)\]\}/]$} || STATEMENT_END_TOKENS.include?(last_kind))
254
266
  end
255
267
 
256
268
  # Are we currently in the middle of a string literal.
257
269
  #
258
- # This is used to determine whether to re-indent a given line, we mustn't re-indent
259
- # within string literals because to do so would actually change the value of the
260
- # String!
270
+ # This is used to determine whether to re-indent a given line, we mustn't
271
+ # re-indent within string literals because to do so would actually change
272
+ # the value of the String!
261
273
  #
262
274
  # @return Boolean
263
275
  def in_string?
@@ -269,16 +281,17 @@ class Pry
269
281
  # @param [String] string The Ruby to lex
270
282
  # @return [Array] An Array of pairs of [token_value, token_type]
271
283
  def tokenize(string)
272
- tokens = CodeRay.scan(string, :ruby)
284
+ tokens = SyntaxHighlighter.tokenize(string)
273
285
  tokens = tokens.tokens.each_slice(2) if tokens.respond_to?(:tokens) # Coderay 1.0.0
274
286
  tokens.to_a
275
287
  end
276
288
 
277
289
  # Update the internal state about what kind of strings are open.
278
290
  #
279
- # Most of the complication here comes from the fact that HEREDOCs can be nested. For
280
- # normal strings (which can't be nested) we assume that CodeRay correctly pairs
281
- # open-and-close delimiters so we don't bother checking what they are.
291
+ # Most of the complication here comes from the fact that HEREDOCs can be
292
+ # nested. For normal strings (which can't be nested) we assume that CodeRay
293
+ # correctly pairs open-and-close delimiters so we don't bother checking what
294
+ # they are.
282
295
  #
283
296
  # @param [String] token The token (of type :delimiter)
284
297
  def track_delimiter(token)
@@ -289,11 +302,7 @@ class Pry
289
302
  when @close_heredocs[@heredoc_queue.first]
290
303
  @heredoc_queue.shift
291
304
  else
292
- if @string_start
293
- @string_start = nil
294
- else
295
- @string_start = token
296
- end
305
+ @string_start = @string_start ? nil : token
297
306
  end
298
307
  end
299
308
 
@@ -309,7 +318,7 @@ class Pry
309
318
  #
310
319
  # @return String
311
320
  def open_delimiters_line
312
- "puts #{open_delimiters.join(", ")}"
321
+ "puts #{open_delimiters.join(', ')}"
313
322
  end
314
323
 
315
324
  # Update the internal state relating to module nesting.
@@ -320,7 +329,7 @@ class Pry
320
329
  # [ ["class", "Foo"], ["module", "Bar::Baz"], ["class <<", "self"] ]
321
330
  #
322
331
  # A nil value in the @module_nesting array happens in two places: either
323
- # when @awaiting_token is true and we're still waiting for the string to
332
+ # when @awaiting_class is true and we're still waiting for the string to
324
333
  # fill that space, or when a parse was rejected.
325
334
  #
326
335
  # At the moment this function is quite restricted about what formats it will
@@ -330,7 +339,7 @@ class Pry
330
339
  # @param [String] token a token from Coderay
331
340
  # @param [Symbol] kind the kind of that token
332
341
  def track_module_nesting(token, kind)
333
- if kind == :keyword && (token == "class" || token == "module")
342
+ if kind == :keyword && %w[class module].include?(token)
334
343
  @module_nesting << [token, nil]
335
344
  @awaiting_class = true
336
345
  elsif @awaiting_class
@@ -341,7 +350,7 @@ class Pry
341
350
  @module_nesting.last[1] = token if kind == :class
342
351
  @awaiting_class = false
343
352
  else
344
- # leave @nesting[-1][
353
+ # leave @module_nesting[-1]
345
354
  @awaiting_class = false
346
355
  end
347
356
  end
@@ -354,10 +363,8 @@ class Pry
354
363
  #
355
364
  # @param [String] token a token from Coderay
356
365
  # @param [Symbol] kind the kind of that token
357
- def track_module_nesting_end(token, kind=:keyword)
358
- if kind == :keyword && (token == "class" || token == "module")
359
- @module_nesting.pop
360
- end
366
+ def track_module_nesting_end(token, kind = :keyword)
367
+ @module_nesting.pop if kind == :keyword && %w[class module].include?(token)
361
368
  end
362
369
 
363
370
  # Return a list of strings which can be used to re-construct the Module.nesting at
@@ -378,25 +385,24 @@ class Pry
378
385
  # the correct indentation. Mostly useful for fixing 'end'.
379
386
  #
380
387
  # @param [String] prompt The user's prompt
381
- # @param [String] code The code the user just typed in.
382
- # @param [Fixnum] overhang (0) The number of chars to erase afterwards (i.e.,
383
- # the difference in length between the old line and the new one).
384
- # @return [String]
385
- def correct_indentation(prompt, code, overhang=0)
388
+ # @param [String] code The code the user just typed in
389
+ # @param [Integer] overhang The number of characters to erase afterwards (the
390
+ # the difference in length between the old line and the new one)
391
+ #
392
+ # @return [String] correctly indented line
393
+ def correct_indentation(prompt, code, overhang = 0)
386
394
  prompt = prompt.delete("\001\002")
387
- full_line = prompt + code
395
+ line_to_measure = Pry::Helpers::Text.strip_color(prompt) << code
388
396
  whitespace = ' ' * overhang
389
397
 
390
- _, cols = Terminal.screen_size
391
-
392
- cols = cols.to_i
393
- lines = cols != 0 ? (full_line.length / cols + 1) : 1
398
+ cols = @pry_instance.output.width
399
+ lines = cols == 0 ? 1 : (line_to_measure.length / cols + 1).to_i
394
400
 
395
- if Pry::Helpers::BaseHelpers.windows_ansi?
396
- move_up = "\e[#{lines}F"
401
+ if Helpers::Platform.windows_ansi?
402
+ move_up = "\e[#{lines}F"
397
403
  move_down = "\e[#{lines}E"
398
404
  else
399
- move_up = "\e[#{lines}A\e[0G"
405
+ move_up = "\e[#{lines}A\e[0G"
400
406
  move_down = "\e[#{lines}B\e[0G"
401
407
  end
402
408