pry 0.10.pre.1-java → 0.10.0.pre2-java

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 (214) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +702 -0
  3. data/LICENSE +2 -2
  4. data/{README.markdown → README.md} +41 -35
  5. data/lib/pry.rb +82 -139
  6. data/lib/pry/cli.rb +77 -30
  7. data/lib/pry/code.rb +126 -182
  8. data/lib/pry/code/code_file.rb +103 -0
  9. data/lib/pry/code/code_range.rb +71 -0
  10. data/lib/pry/code/loc.rb +92 -0
  11. data/lib/pry/code_object.rb +172 -0
  12. data/lib/pry/color_printer.rb +55 -0
  13. data/lib/pry/command.rb +184 -28
  14. data/lib/pry/command_set.rb +113 -59
  15. data/lib/pry/commands.rb +4 -27
  16. data/lib/pry/commands/amend_line.rb +99 -0
  17. data/lib/pry/commands/bang.rb +20 -0
  18. data/lib/pry/commands/bang_pry.rb +17 -0
  19. data/lib/pry/commands/cat.rb +62 -0
  20. data/lib/pry/commands/cat/abstract_formatter.rb +27 -0
  21. data/lib/pry/commands/cat/exception_formatter.rb +77 -0
  22. data/lib/pry/commands/cat/file_formatter.rb +67 -0
  23. data/lib/pry/commands/cat/input_expression_formatter.rb +43 -0
  24. data/lib/pry/commands/cd.rb +41 -0
  25. data/lib/pry/commands/change_inspector.rb +27 -0
  26. data/lib/pry/commands/change_prompt.rb +26 -0
  27. data/lib/pry/commands/code_collector.rb +165 -0
  28. data/lib/pry/commands/disable_pry.rb +27 -0
  29. data/lib/pry/commands/disabled_commands.rb +2 -0
  30. data/lib/pry/commands/easter_eggs.rb +112 -0
  31. data/lib/pry/commands/edit.rb +195 -0
  32. data/lib/pry/commands/edit/exception_patcher.rb +25 -0
  33. data/lib/pry/commands/edit/file_and_line_locator.rb +36 -0
  34. data/lib/pry/commands/exit.rb +42 -0
  35. data/lib/pry/commands/exit_all.rb +29 -0
  36. data/lib/pry/commands/exit_program.rb +23 -0
  37. data/lib/pry/commands/find_method.rb +193 -0
  38. data/lib/pry/commands/fix_indent.rb +19 -0
  39. data/lib/pry/commands/gem_cd.rb +26 -0
  40. data/lib/pry/commands/gem_install.rb +32 -0
  41. data/lib/pry/commands/gem_list.rb +33 -0
  42. data/lib/pry/commands/gem_open.rb +29 -0
  43. data/lib/pry/commands/gist.rb +101 -0
  44. data/lib/pry/commands/help.rb +164 -0
  45. data/lib/pry/commands/hist.rb +180 -0
  46. data/lib/pry/commands/import_set.rb +22 -0
  47. data/lib/pry/commands/install_command.rb +53 -0
  48. data/lib/pry/commands/jump_to.rb +29 -0
  49. data/lib/pry/commands/list_inspectors.rb +35 -0
  50. data/lib/pry/commands/list_prompts.rb +35 -0
  51. data/lib/pry/commands/ls.rb +114 -0
  52. data/lib/pry/commands/ls/constants.rb +47 -0
  53. data/lib/pry/commands/ls/formatter.rb +49 -0
  54. data/lib/pry/commands/ls/globals.rb +48 -0
  55. data/lib/pry/commands/ls/grep.rb +21 -0
  56. data/lib/pry/commands/ls/instance_vars.rb +39 -0
  57. data/lib/pry/commands/ls/interrogatable.rb +18 -0
  58. data/lib/pry/commands/ls/jruby_hacks.rb +49 -0
  59. data/lib/pry/commands/ls/local_names.rb +35 -0
  60. data/lib/pry/commands/ls/local_vars.rb +39 -0
  61. data/lib/pry/commands/ls/ls_entity.rb +70 -0
  62. data/lib/pry/commands/ls/methods.rb +57 -0
  63. data/lib/pry/commands/ls/methods_helper.rb +46 -0
  64. data/lib/pry/commands/ls/self_methods.rb +32 -0
  65. data/lib/pry/commands/nesting.rb +25 -0
  66. data/lib/pry/commands/play.rb +103 -0
  67. data/lib/pry/commands/pry_backtrace.rb +25 -0
  68. data/lib/pry/commands/pry_version.rb +17 -0
  69. data/lib/pry/commands/raise_up.rb +32 -0
  70. data/lib/pry/commands/reload_code.rb +62 -0
  71. data/lib/pry/commands/reset.rb +18 -0
  72. data/lib/pry/commands/ri.rb +60 -0
  73. data/lib/pry/commands/save_file.rb +61 -0
  74. data/lib/pry/commands/shell_command.rb +48 -0
  75. data/lib/pry/commands/shell_mode.rb +25 -0
  76. data/lib/pry/commands/show_doc.rb +83 -0
  77. data/lib/pry/commands/show_info.rb +195 -0
  78. data/lib/pry/commands/show_input.rb +17 -0
  79. data/lib/pry/commands/show_source.rb +50 -0
  80. data/lib/pry/commands/simple_prompt.rb +22 -0
  81. data/lib/pry/commands/stat.rb +40 -0
  82. data/lib/pry/commands/switch_to.rb +23 -0
  83. data/lib/pry/commands/toggle_color.rb +24 -0
  84. data/lib/pry/commands/watch_expression.rb +105 -0
  85. data/lib/pry/commands/watch_expression/expression.rb +38 -0
  86. data/lib/pry/commands/whereami.rb +190 -0
  87. data/lib/pry/commands/wtf.rb +57 -0
  88. data/lib/pry/config.rb +20 -229
  89. data/lib/pry/config/behavior.rb +139 -0
  90. data/lib/pry/config/convenience.rb +26 -0
  91. data/lib/pry/config/default.rb +165 -0
  92. data/lib/pry/core_extensions.rb +59 -38
  93. data/lib/pry/editor.rb +133 -0
  94. data/lib/pry/exceptions.rb +77 -0
  95. data/lib/pry/helpers.rb +1 -0
  96. data/lib/pry/helpers/base_helpers.rb +40 -154
  97. data/lib/pry/helpers/command_helpers.rb +19 -130
  98. data/lib/pry/helpers/documentation_helpers.rb +21 -11
  99. data/lib/pry/helpers/table.rb +109 -0
  100. data/lib/pry/helpers/text.rb +8 -9
  101. data/lib/pry/history.rb +61 -45
  102. data/lib/pry/history_array.rb +11 -1
  103. data/lib/pry/hooks.rb +10 -32
  104. data/lib/pry/indent.rb +110 -38
  105. data/lib/pry/input_completer.rb +242 -0
  106. data/lib/pry/input_lock.rb +132 -0
  107. data/lib/pry/inspector.rb +27 -0
  108. data/lib/pry/last_exception.rb +61 -0
  109. data/lib/pry/method.rb +199 -200
  110. data/lib/pry/method/disowned.rb +53 -0
  111. data/lib/pry/method/patcher.rb +125 -0
  112. data/lib/pry/method/weird_method_locator.rb +186 -0
  113. data/lib/pry/module_candidate.rb +39 -33
  114. data/lib/pry/object_path.rb +82 -0
  115. data/lib/pry/output.rb +50 -0
  116. data/lib/pry/pager.rb +234 -0
  117. data/lib/pry/plugins.rb +4 -3
  118. data/lib/pry/prompt.rb +26 -0
  119. data/lib/pry/pry_class.rb +199 -227
  120. data/lib/pry/pry_instance.rb +344 -403
  121. data/lib/pry/rbx_path.rb +1 -1
  122. data/lib/pry/repl.rb +202 -0
  123. data/lib/pry/repl_file_loader.rb +20 -26
  124. data/lib/pry/rubygem.rb +82 -0
  125. data/lib/pry/terminal.rb +79 -0
  126. data/lib/pry/test/helper.rb +170 -0
  127. data/lib/pry/version.rb +1 -1
  128. data/lib/pry/wrapped_module.rb +133 -48
  129. metadata +132 -197
  130. data/.document +0 -2
  131. data/.gemtest +0 -0
  132. data/.gitignore +0 -16
  133. data/.travis.yml +0 -17
  134. data/.yardopts +0 -1
  135. data/CHANGELOG +0 -387
  136. data/CONTRIBUTORS +0 -36
  137. data/Gemfile +0 -2
  138. data/Rakefile +0 -137
  139. data/TODO +0 -117
  140. data/examples/example_basic.rb +0 -15
  141. data/examples/example_command_override.rb +0 -32
  142. data/examples/example_commands.rb +0 -36
  143. data/examples/example_hooks.rb +0 -9
  144. data/examples/example_image_edit.rb +0 -67
  145. data/examples/example_input.rb +0 -7
  146. data/examples/example_input2.rb +0 -29
  147. data/examples/example_output.rb +0 -11
  148. data/examples/example_print.rb +0 -6
  149. data/examples/example_prompt.rb +0 -9
  150. data/examples/helper.rb +0 -6
  151. data/lib/pry/completion.rb +0 -221
  152. data/lib/pry/custom_completions.rb +0 -6
  153. data/lib/pry/default_commands/cd.rb +0 -81
  154. data/lib/pry/default_commands/commands.rb +0 -62
  155. data/lib/pry/default_commands/context.rb +0 -98
  156. data/lib/pry/default_commands/easter_eggs.rb +0 -95
  157. data/lib/pry/default_commands/editing.rb +0 -420
  158. data/lib/pry/default_commands/find_method.rb +0 -169
  159. data/lib/pry/default_commands/gems.rb +0 -84
  160. data/lib/pry/default_commands/gist.rb +0 -187
  161. data/lib/pry/default_commands/help.rb +0 -127
  162. data/lib/pry/default_commands/hist.rb +0 -120
  163. data/lib/pry/default_commands/input_and_output.rb +0 -306
  164. data/lib/pry/default_commands/introspection.rb +0 -410
  165. data/lib/pry/default_commands/ls.rb +0 -272
  166. data/lib/pry/default_commands/misc.rb +0 -38
  167. data/lib/pry/default_commands/navigating_pry.rb +0 -110
  168. data/lib/pry/default_commands/whereami.rb +0 -92
  169. data/lib/pry/extended_commands/experimental.rb +0 -7
  170. data/lib/pry/rbx_method.rb +0 -13
  171. data/man/pry.1 +0 -195
  172. data/man/pry.1.html +0 -204
  173. data/man/pry.1.ronn +0 -141
  174. data/pry.gemspec +0 -46
  175. data/test/candidate_helper1.rb +0 -11
  176. data/test/candidate_helper2.rb +0 -8
  177. data/test/helper.rb +0 -223
  178. data/test/test_cli.rb +0 -78
  179. data/test/test_code.rb +0 -201
  180. data/test/test_command.rb +0 -712
  181. data/test/test_command_helpers.rb +0 -9
  182. data/test/test_command_integration.rb +0 -668
  183. data/test/test_command_set.rb +0 -610
  184. data/test/test_completion.rb +0 -62
  185. data/test/test_control_d_handler.rb +0 -45
  186. data/test/test_default_commands/example.erb +0 -5
  187. data/test/test_default_commands/test_cd.rb +0 -318
  188. data/test/test_default_commands/test_context.rb +0 -280
  189. data/test/test_default_commands/test_documentation.rb +0 -314
  190. data/test/test_default_commands/test_find_method.rb +0 -50
  191. data/test/test_default_commands/test_gems.rb +0 -18
  192. data/test/test_default_commands/test_help.rb +0 -57
  193. data/test/test_default_commands/test_input.rb +0 -428
  194. data/test/test_default_commands/test_introspection.rb +0 -511
  195. data/test/test_default_commands/test_ls.rb +0 -151
  196. data/test/test_default_commands/test_shell.rb +0 -343
  197. data/test/test_default_commands/test_show_source.rb +0 -432
  198. data/test/test_exception_whitelist.rb +0 -21
  199. data/test/test_history_array.rb +0 -65
  200. data/test/test_hooks.rb +0 -521
  201. data/test/test_indent.rb +0 -277
  202. data/test/test_input_stack.rb +0 -86
  203. data/test/test_method.rb +0 -401
  204. data/test/test_pry.rb +0 -463
  205. data/test/test_pry_defaults.rb +0 -419
  206. data/test/test_pry_history.rb +0 -84
  207. data/test/test_pry_output.rb +0 -41
  208. data/test/test_sticky_locals.rb +0 -155
  209. data/test/test_syntax_checking.rb +0 -65
  210. data/test/test_wrapped_module.rb +0 -174
  211. data/test/testrc +0 -2
  212. data/test/testrcbad +0 -2
  213. data/wiki/Customizing-pry.md +0 -397
  214. data/wiki/Home.md +0 -4
@@ -0,0 +1,57 @@
1
+ class Pry
2
+ class Command::Wtf < Pry::ClassCommand
3
+ match(/wtf([?!]*)/)
4
+ group 'Context'
5
+ description 'Show the backtrace of the most recent exception.'
6
+ options :listing => 'wtf?'
7
+
8
+ banner <<-'BANNER'
9
+ Usage: wtf[?|!]
10
+
11
+ Show's a few lines of the backtrace of the most recent exception (also available
12
+ as `_ex_.backtrace`). If you want to see more lines, add more question marks or
13
+ exclamation marks.
14
+
15
+ wtf?
16
+ wtf?!???!?!?
17
+
18
+ # To see the entire backtrace, pass the `-v` or `--verbose` flag.
19
+ wtf -v
20
+ BANNER
21
+
22
+ def options(opt)
23
+ opt.on :v, :verbose, "Show the full backtrace"
24
+ end
25
+
26
+ def process
27
+ raise Pry::CommandError, "No most-recent exception" unless exception
28
+
29
+ output.puts "#{text.bold('Exception:')} #{exception.class}: #{exception}\n--"
30
+ if opts.verbose?
31
+ output.puts with_line_numbers(backtrace)
32
+ else
33
+ output.puts with_line_numbers(backtrace.first(size_of_backtrace))
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ def exception
40
+ _pry_.last_exception
41
+ end
42
+
43
+ def with_line_numbers(bt)
44
+ Pry::Code.new(bt, 0, :text).with_line_numbers.to_s
45
+ end
46
+
47
+ def backtrace
48
+ exception.backtrace
49
+ end
50
+
51
+ def size_of_backtrace
52
+ [captures[0].size, 0.5].max * 10
53
+ end
54
+ end
55
+
56
+ Pry::Commands.add_command(Pry::Command::Wtf)
57
+ end
@@ -1,233 +1,24 @@
1
- require 'ostruct'
2
-
3
- class Pry
4
- class Config < OpenStruct
5
-
6
- # Get/Set the object to use for input by default by all Pry instances.
7
- # Pry.config.input is an option determining the input object - the object from
8
- # which Pry retrieves its lines of input. Pry accepts any object that implements the readline method.
9
- # This includes IO objects, StringIO, Readline, File and custom objects.
10
- # @return [#readline] The object to use for input by default by all
11
- # Pry instances.
12
- # @example
13
- # Pry.config.input = StringIO.new("@x = 10\nexit")
14
- attr_accessor :input
15
-
16
- # Get/Set the object to use for output by default by all Pry instances.
17
- # Pry.config.output is an option determining the output object - the object to which
18
- # Pry writes its output. Pry accepts any object that implements the puts method. This
19
- # includes IO objects, StringIO, File and custom objects.
20
- # @return [#puts] The object to use for output by default by all
21
- # Pry instances.
22
- # @example
23
- # Pry.config.output = StringIO.new
24
- attr_accessor :output
25
-
26
- # Get/Set the object to use for commands by default by all Pry instances.
27
- # @return [Pry::CommandBase] The object to use for commands by default by all
28
- # Pry instances.
29
- # @example
30
- # Pry.config.commands = Pry::CommandSet.new do
31
- # import_from Pry::Commands, "ls"
32
- #
33
- # command "greet" do |name|
34
- # output.puts "hello #{name}"
35
- # end
36
- # end
37
- attr_accessor :commands
38
-
39
- # Get/Set the Proc to use for printing by default by all Pry
40
- # instances.
41
- # Two parameters are passed to the print Proc: these are (1) the
42
- # output object for the current session and (2) the expression value to print. It is important
43
- # that you write to the output object instead of just stdout so that all Pry output can be redirected if necessary.
44
- # This is the 'print' component of the REPL.
45
- # @return [Proc] The Proc to use for printing by default by all
46
- # Pry instances.
47
- # @example
48
- # Pry.config.print = proc { |output, value| output.puts "=> #{value.inspect}" }
49
- attr_accessor :print
50
-
51
- # Pry.config.exception_handler is an option determining the exception handler object - the
52
- # Proc responsible for dealing with exceptions raised by user input to the REPL.
53
- # Three parameters are passed to the exception handler Proc: these
54
- # are (1) the output object for the current session, (2) the
55
- # exception object that was raised inside the Pry session, and (3)
56
- # a reference to the associated Pry instance.
57
- # @return [Proc] The Proc to use for printing exceptions by default by all
58
- # Pry instances.
59
- # @example
60
- # Pry.config.exception_handler = proc do |output, exception, _|
61
- # output.puts "#{exception.class}: #{exception.message}"
62
- # output.puts "from #{exception.backtrace.first}"
63
- # end
64
- attr_accessor :exception_handler
65
-
66
- # @return [Array] The classes of exception that will not be caught by Pry.
67
- # @example
68
- # Pry.config.exception_whitelist = [SystemExit, SignalException]
69
- attr_accessor :exception_whitelist
70
-
71
- # @return [Fixnum] The number of lines of context to show before and after
72
- # exceptions, etc.
73
- # @example
74
- # Pry.config.default_window_size = 10
75
- attr_accessor :default_window_size
76
-
77
- # Get/Set the `Pry::Hooks` instance that defines Pry hooks used by default by all Pry
78
- # instances.
79
- # @return [Pry::Hooks] The hooks used by default by all Pry instances.
80
- # @example
81
- # Pry.config.hooks = Pry::Hooks.new.add_hook(:before_session,
82
- # :default) { |output, target, _pry_| output.puts "Good morning!" }
83
- attr_reader :hooks
1
+ class Pry::Config
2
+ require_relative 'config/behavior'
3
+ require_relative 'config/default'
4
+ require_relative 'config/convenience'
5
+ include Pry::Config::Behavior
6
+
7
+ def self.shortcuts
8
+ Convenience::SHORTCUTS
9
+ end
84
10
 
85
- # FIXME:
86
- # This is a hack to alert people of the new API.
87
- # @param [Pry::Hooks] v Only accept `Pry::Hooks` now!
88
- def hooks=(v)
89
- if v.is_a?(Hash)
90
- warn "Hash-based hooks are now deprecated! Use a `Pry::Hooks` object instead! http://rubydoc.info/github/pry/pry/master/Pry/Hooks"
91
- @hooks = Pry::Hooks.from_hash(v)
92
- else
93
- @hooks = v
94
- end
11
+ #
12
+ # FIXME
13
+ # @param [Pry::Hooks] hooks
14
+ #
15
+ def hooks=(hooks)
16
+ if hooks.is_a?(Hash)
17
+ warn "Hash-based hooks are now deprecated! Use a `Pry::Hooks` object " \
18
+ "instead! http://rubydoc.info/github/pry/pry/master/Pry/Hooks"
19
+ self["hooks"] = Pry::Hooks.from_hash(hooks)
20
+ else
21
+ self["hooks"] = hooks
95
22
  end
96
-
97
- # Get/Set the stack of input objects that a Pry instance switches
98
- # to when its current input object encounters EOF.
99
- # @return [Array] The array of input objects.
100
- # @example
101
- # Pry.config.input_stack = [StringIO.new("puts 'hello world'\nexit")]
102
- attr_accessor :input_stack
103
-
104
- # Get the array of Procs (or single Proc) to be used for the prompts by default by
105
- # all Pry instances.
106
- # Three parameters are passed into the prompt procs, (1) the
107
- # object that is the target of the session, (2) the current
108
- # nesting level, and (3) a reference to the associated Pry instance. These objects can be used in the prompt, if desired.
109
- # @return [Array<Proc>, Proc] The array of Procs to be used for the
110
- # prompts by default by all Pry instances.
111
- # @example
112
- # Pry.config.prompt = proc { |obj, nest_level, _pry_| "#{obj}:#{nest_level}> " }
113
- attr_accessor :prompt
114
-
115
- # The default editor to use. Defaults to $VISUAL, $EDITOR, or a sensible fallback
116
- # for the platform.
117
- # If `editor` is a String then that string is used as the shell
118
- # command to invoke the editor. If `editor` is callable (e.g a
119
- # Proc) then `file`, `line`, and `reloading` are passed in as parameters and the
120
- # return value of that callable invocation is used as the exact
121
- # shell command to invoke the editor. `reloading` indicates whether Pry will be
122
- # reloading code after the shell command returns. Any or all of these parameters
123
- # can be omitted from the callable's signature.
124
- # @example String
125
- # Pry.config.editor = "emacsclient"
126
- # @example Callable
127
- # Pry.config.editor = proc { |file, line| "emacsclient #{file} +#{line}" }
128
- # @example Callable waiting only if reloading
129
- # Pry.config.editor = proc { |file, line, reloading| "subl #{'--wait' if reloading} #{file}:#{line}" }
130
- # @return [String, #call]
131
- attr_accessor :editor
132
-
133
- # A string that must precede all Pry commands (e.g., if command_prefix is
134
- # set to "%", the "cd" command must be invoked as "%cd").
135
- # @return [String]
136
- attr_accessor :command_prefix
137
-
138
- # @return [Boolean] Toggle Pry color on and off.
139
- attr_accessor :color
140
-
141
- # @return [Boolean] Toggle paging on and off.
142
- attr_accessor :pager
143
-
144
- # Determines whether the rc file (~/.pryrc) should be loaded.
145
- # @return [Boolean]
146
- attr_accessor :should_load_rc
147
-
148
- # Determines whether the local rc file (./.pryrc) should be loaded.
149
- # @return [Boolean]
150
- attr_accessor :should_load_local_rc
151
-
152
- # Determines whether plugins should be loaded.
153
- # @return [Boolean]
154
- attr_accessor :should_load_plugins
155
-
156
- # Determines whether to load files specified with the -r flag.
157
- # @return [Boolean]
158
- attr_accessor :should_load_requires
159
-
160
- # Determines whether to disable edit-method's auto-reloading behavior.
161
- # @return [Boolean]
162
- attr_accessor :disable_auto_reload
163
-
164
- # Determines whether Pry should trap SIGINT and cause it to raise an
165
- # Interrupt exception. This is only useful on jruby, MRI does this
166
- # for us.
167
- # @return [Boolean]
168
- attr_accessor :should_trap_interrupts
169
-
170
- # Config option for history.
171
- # sub-options include history.file, history.load, and history.save
172
- # history.file is the file to save/load history to, e.g
173
- # Pry.config.history.file = "~/.pry_history".
174
- # history.should_load is a boolean that determines whether history will be
175
- # loaded from history.file at session start.
176
- # history.should_save is a boolean that determines whether history will be
177
- # saved to history.file at session end.
178
- # @return [OpenStruct]
179
- attr_accessor :history
180
-
181
- # Config option for plugins:
182
- # sub-options include:
183
- # `plugins.strict_loading` (Boolean) which toggles whether referring to a non-existent plugin should raise an exception (defaults to `false`)
184
- # @return [OpenStruct]
185
- attr_accessor :plugins
186
-
187
- # @return [Array<String>] Ruby files to be required after loading any plugins.
188
- attr_accessor :requires
189
-
190
- # @return [Integer] Amount of results that will be stored into out
191
- attr_accessor :memory_size
192
-
193
- # @return [Proc] The proc that manages ^D presses in the REPL.
194
- # The proc is passed the current eval_string and the current pry instance.
195
- attr_accessor :control_d_handler
196
-
197
- # @return [Proc] The proc that runs system commands
198
- # The proc is passed the pry output object, the command string
199
- # to eval, and a reference to the pry instance
200
- attr_accessor :system
201
-
202
- # @return [Boolean] Whether or not code should be indented
203
- # using Pry::Indent.
204
- attr_accessor :auto_indent
205
-
206
- # @return [Boolean] Whether or not indentation should be corrected
207
- # after hitting enter. This feature is not supported by all terminals.
208
- attr_accessor :correct_indent
209
-
210
- # @return [Boolean] Whether or not a warning will be displayed when
211
- # a command name collides with a method/local in the current context.
212
- attr_accessor :collision_warning
213
-
214
-
215
- # Config option for gist.
216
- # sub-options include `gist.inspecter`,
217
- # `gist.inspecter` is a callable that defines how the expression output
218
- # will be displayed when using the `gist -i` command.
219
- # @example Pretty inspect output
220
- # Pry.config.gist.inspecter = proc { |v| v.pretty_inspect }
221
- # @example Regular inspect
222
- # Pry.config.gist.inspecter = proc &:inspect
223
- # @return [OpenStruct]
224
- attr_accessor :gist
225
-
226
- # @return [Hash] Additional sticky locals (to the standard ones) to use in Pry sessions.
227
- # @example Inject `random_number` sticky local into Pry session
228
- # Pry.config.extra_sticky_locals = { :random_number => proc {
229
- # rand(10) } }
230
- attr_accessor :extra_sticky_locals
231
23
  end
232
24
  end
233
-
@@ -0,0 +1,139 @@
1
+ module Pry::Config::Behavior
2
+ ASSIGNMENT = "=".freeze
3
+ NODUP = [TrueClass, FalseClass, NilClass, Symbol, Numeric, Module, Proc].freeze
4
+ INSPECT_REGEXP = /#{Regexp.escape "default=#<"}/
5
+
6
+ module Builder
7
+ def from_hash(hash, default = nil)
8
+ new(default).tap do |config|
9
+ config.merge!(hash)
10
+ end
11
+ end
12
+ end
13
+
14
+ def self.included(klass)
15
+ unless defined?(RESERVED_KEYS)
16
+ const_set :RESERVED_KEYS, instance_methods(false).map(&:to_s).freeze
17
+ end
18
+ klass.extend(Builder)
19
+ end
20
+
21
+ def initialize(default = Pry.config)
22
+ @default = default
23
+ @lookup = {}
24
+ end
25
+
26
+ #
27
+ # @return [Pry::Config::Behavior]
28
+ # returns the default used if a matching value for a key isn't found in self
29
+ #
30
+ def default
31
+ @default
32
+ end
33
+
34
+ def [](key)
35
+ @lookup[key.to_s]
36
+ end
37
+
38
+ def []=(key, value)
39
+ key = key.to_s
40
+ if RESERVED_KEYS.include?(key)
41
+ raise ArgumentError, "few things are reserved by pry, but using '#{key}' as a configuration key is."
42
+ end
43
+ @lookup[key] = value
44
+ end
45
+
46
+ def method_missing(name, *args, &block)
47
+ key = name.to_s
48
+ if key[-1] == ASSIGNMENT
49
+ short_key = key[0..-2]
50
+ self[short_key] = args[0]
51
+ elsif key?(key)
52
+ self[key]
53
+ elsif @default.respond_to?(name)
54
+ value = @default.public_send(name, *args, &block)
55
+ # FIXME: refactor Pry::Hook so that it stores config on the config object,
56
+ # so that we can use the normal strategy.
57
+ self[key] = value.dup if key == 'hooks'
58
+ value
59
+ else
60
+ nil
61
+ end
62
+ end
63
+
64
+ def merge!(other)
65
+ other = try_convert_to_hash(other)
66
+ raise TypeError, "unable to convert argument into a Hash" unless other
67
+ other.each do |key, value|
68
+ self[key] = value
69
+ end
70
+ end
71
+
72
+ def ==(other)
73
+ @lookup == try_convert_to_hash(other)
74
+ end
75
+ alias_method :eql?, :==
76
+
77
+ def respond_to_missing?(key, include_private=false)
78
+ key?(key) or @default.respond_to?(key) or super(key, include_private)
79
+ end
80
+
81
+ def key?(key)
82
+ key = key.to_s
83
+ @lookup.key?(key)
84
+ end
85
+
86
+ def clear
87
+ @lookup.clear
88
+ true
89
+ end
90
+ alias_method :refresh, :clear
91
+
92
+ def forget(key)
93
+ @lookup.delete(key.to_s)
94
+ end
95
+
96
+ def keys
97
+ @lookup.keys
98
+ end
99
+
100
+ def to_hash
101
+ @lookup.dup
102
+ end
103
+ alias_method :to_h, :to_hash
104
+
105
+
106
+ def inspect
107
+ key_str = keys.map { |key| "'#{key}'" }.join(",")
108
+ "#<#{_clip_inspect(self)} local_keys=[#{key_str}] default=#{@default.inspect}>"
109
+ end
110
+
111
+ def pretty_print(q)
112
+ q.text inspect[1..-1].gsub(INSPECT_REGEXP, "default=<")
113
+ end
114
+
115
+ private
116
+ def _clip_inspect(obj)
117
+ "#{obj.class}:0x%x" % obj.object_id << 1
118
+ end
119
+
120
+ def _dup(value)
121
+ if NODUP.any? { |klass| klass === value }
122
+ value
123
+ else
124
+ value.dup
125
+ end
126
+ end
127
+
128
+ def try_convert_to_hash(obj)
129
+ if Hash === obj
130
+ obj
131
+ elsif obj.respond_to?(:to_h)
132
+ obj.to_h
133
+ elsif obj.respond_to?(:to_hash)
134
+ obj.to_hash
135
+ else
136
+ nil
137
+ end
138
+ end
139
+ end