pry 0.9.12.2 → 0.14.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG.md +1141 -0
- data/LICENSE +2 -2
- data/README.md +466 -0
- data/bin/pry +4 -7
- data/lib/pry/basic_object.rb +10 -0
- data/lib/pry/block_command.rb +22 -0
- data/lib/pry/class_command.rb +194 -0
- data/lib/pry/cli.rb +97 -92
- data/lib/pry/code/code_file.rb +114 -0
- data/lib/pry/code/code_range.rb +7 -4
- data/lib/pry/code/loc.rb +27 -14
- data/lib/pry/code.rb +62 -90
- data/lib/pry/code_object.rb +83 -39
- data/lib/pry/color_printer.rb +66 -0
- data/lib/pry/command.rb +202 -371
- data/lib/pry/command_set.rb +151 -133
- data/lib/pry/command_state.rb +31 -0
- data/lib/pry/commands/amend_line.rb +86 -82
- data/lib/pry/commands/bang.rb +18 -14
- data/lib/pry/commands/bang_pry.rb +15 -11
- data/lib/pry/commands/cat/abstract_formatter.rb +23 -18
- data/lib/pry/commands/cat/exception_formatter.rb +85 -73
- data/lib/pry/commands/cat/file_formatter.rb +56 -63
- data/lib/pry/commands/cat/input_expression_formatter.rb +35 -30
- data/lib/pry/commands/cat.rb +64 -47
- data/lib/pry/commands/cd.rb +42 -26
- data/lib/pry/commands/change_inspector.rb +34 -0
- data/lib/pry/commands/change_prompt.rb +51 -0
- data/lib/pry/commands/clear_screen.rb +20 -0
- data/lib/pry/commands/code_collector.rb +148 -131
- data/lib/pry/commands/disable_pry.rb +23 -19
- data/lib/pry/commands/easter_eggs.rb +23 -34
- data/lib/pry/commands/edit/exception_patcher.rb +21 -17
- data/lib/pry/commands/edit/file_and_line_locator.rb +33 -24
- data/lib/pry/commands/edit.rb +183 -167
- data/lib/pry/commands/exit.rb +40 -35
- data/lib/pry/commands/exit_all.rb +24 -20
- data/lib/pry/commands/exit_program.rb +20 -17
- data/lib/pry/commands/find_method.rb +167 -167
- data/lib/pry/commands/fix_indent.rb +16 -12
- data/lib/pry/commands/help.rb +140 -133
- data/lib/pry/commands/hist.rb +153 -132
- data/lib/pry/commands/import_set.rb +20 -15
- data/lib/pry/commands/jump_to.rb +25 -21
- data/lib/pry/commands/list_inspectors.rb +42 -0
- data/lib/pry/commands/ls/constants.rb +75 -0
- data/lib/pry/commands/ls/formatter.rb +55 -0
- data/lib/pry/commands/ls/globals.rb +50 -0
- data/lib/pry/commands/ls/grep.rb +23 -0
- data/lib/pry/commands/ls/instance_vars.rb +40 -0
- data/lib/pry/commands/ls/interrogatable.rb +24 -0
- data/lib/pry/commands/ls/jruby_hacks.rb +55 -0
- data/lib/pry/commands/ls/local_names.rb +37 -0
- data/lib/pry/commands/ls/local_vars.rb +47 -0
- data/lib/pry/commands/ls/ls_entity.rb +65 -0
- data/lib/pry/commands/ls/methods.rb +55 -0
- data/lib/pry/commands/ls/methods_helper.rb +50 -0
- data/lib/pry/commands/ls/self_methods.rb +34 -0
- data/lib/pry/commands/ls.rb +100 -303
- data/lib/pry/commands/nesting.rb +21 -17
- data/lib/pry/commands/play.rb +93 -49
- data/lib/pry/commands/pry_backtrace.rb +22 -18
- data/lib/pry/commands/pry_version.rb +15 -11
- data/lib/pry/commands/raise_up.rb +33 -27
- data/lib/pry/commands/reload_code.rb +57 -48
- data/lib/pry/commands/reset.rb +16 -12
- data/lib/pry/commands/ri.rb +57 -38
- data/lib/pry/commands/save_file.rb +45 -43
- data/lib/pry/commands/shell_command.rb +66 -34
- data/lib/pry/commands/shell_mode.rb +22 -20
- data/lib/pry/commands/show_doc.rb +80 -65
- data/lib/pry/commands/show_info.rb +193 -159
- data/lib/pry/commands/show_input.rb +16 -11
- data/lib/pry/commands/show_source.rb +113 -33
- data/lib/pry/commands/stat.rb +35 -31
- data/lib/pry/commands/switch_to.rb +21 -15
- data/lib/pry/commands/toggle_color.rb +21 -13
- data/lib/pry/commands/watch_expression/expression.rb +43 -0
- data/lib/pry/commands/watch_expression.rb +110 -0
- data/lib/pry/commands/whereami.rb +157 -134
- data/lib/pry/commands/wtf.rb +78 -40
- data/lib/pry/config/attributable.rb +22 -0
- data/lib/pry/config/lazy_value.rb +29 -0
- data/lib/pry/config/memoized_value.rb +34 -0
- data/lib/pry/config/value.rb +24 -0
- data/lib/pry/config.rb +290 -220
- data/lib/pry/control_d_handler.rb +28 -0
- data/lib/pry/core_extensions.rb +50 -27
- data/lib/pry/editor.rb +130 -102
- data/lib/pry/env.rb +18 -0
- data/lib/pry/exception_handler.rb +43 -0
- data/lib/pry/exceptions.rb +73 -0
- data/lib/pry/forwardable.rb +27 -0
- data/lib/pry/helpers/base_helpers.rb +22 -151
- data/lib/pry/helpers/command_helpers.rb +55 -63
- data/lib/pry/helpers/documentation_helpers.rb +21 -13
- data/lib/pry/helpers/options_helpers.rb +15 -8
- data/lib/pry/helpers/platform.rb +55 -0
- data/lib/pry/helpers/table.rb +44 -32
- data/lib/pry/helpers/text.rb +96 -86
- data/lib/pry/helpers.rb +3 -0
- data/lib/pry/history.rb +101 -70
- data/lib/pry/hooks.rb +67 -137
- data/lib/pry/indent.rb +79 -73
- data/lib/pry/input_completer.rb +283 -0
- data/lib/pry/input_lock.rb +129 -0
- data/lib/pry/inspector.rb +39 -0
- data/lib/pry/last_exception.rb +61 -0
- data/lib/pry/method/disowned.rb +19 -5
- data/lib/pry/{commands/edit/method_patcher.rb → method/patcher.rb} +51 -42
- data/lib/pry/method/weird_method_locator.rb +80 -44
- data/lib/pry/method.rb +225 -176
- data/lib/pry/object_path.rb +91 -0
- data/lib/pry/output.rb +136 -0
- data/lib/pry/pager.rb +227 -68
- data/lib/pry/prompt.rb +214 -0
- data/lib/pry/pry_class.rb +216 -289
- data/lib/pry/pry_instance.rb +438 -500
- data/lib/pry/repl.rb +256 -0
- data/lib/pry/repl_file_loader.rb +34 -35
- data/lib/pry/ring.rb +89 -0
- data/lib/pry/slop/LICENSE +20 -0
- data/lib/pry/slop/commands.rb +190 -0
- data/lib/pry/slop/option.rb +210 -0
- data/lib/pry/slop.rb +672 -0
- data/lib/pry/syntax_highlighter.rb +26 -0
- data/lib/pry/system_command_handler.rb +17 -0
- data/lib/pry/testable/evalable.rb +24 -0
- data/lib/pry/testable/mockable.rb +22 -0
- data/lib/pry/testable/pry_tester.rb +88 -0
- data/lib/pry/testable/utility.rb +34 -0
- data/lib/pry/testable/variables.rb +52 -0
- data/lib/pry/testable.rb +68 -0
- data/lib/pry/version.rb +3 -1
- data/lib/pry/warning.rb +20 -0
- data/lib/pry/{module_candidate.rb → wrapped_module/candidate.rb} +36 -43
- data/lib/pry/wrapped_module.rb +102 -103
- data/lib/pry.rb +135 -261
- metadata +94 -283
- data/.document +0 -2
- data/.gitignore +0 -16
- data/.travis.yml +0 -21
- data/.yardopts +0 -1
- data/CHANGELOG +0 -534
- data/CONTRIBUTORS +0 -55
- data/Gemfile +0 -9
- data/Guardfile +0 -62
- data/README.markdown +0 -400
- data/Rakefile +0 -140
- data/TODO +0 -117
- data/lib/pry/commands/disabled_commands.rb +0 -2
- data/lib/pry/commands/gem_cd.rb +0 -26
- data/lib/pry/commands/gem_install.rb +0 -29
- data/lib/pry/commands/gem_list.rb +0 -33
- data/lib/pry/commands/gem_open.rb +0 -29
- data/lib/pry/commands/gist.rb +0 -102
- data/lib/pry/commands/install_command.rb +0 -51
- data/lib/pry/commands/simple_prompt.rb +0 -22
- data/lib/pry/commands.rb +0 -6
- data/lib/pry/completion.rb +0 -304
- data/lib/pry/custom_completions.rb +0 -6
- data/lib/pry/history_array.rb +0 -116
- data/lib/pry/plugins.rb +0 -103
- data/lib/pry/rbx_method.rb +0 -13
- data/lib/pry/rbx_path.rb +0 -22
- data/lib/pry/rubygem.rb +0 -74
- data/lib/pry/terminal.rb +0 -78
- data/lib/pry/test/helper.rb +0 -185
- data/man/pry.1 +0 -195
- data/man/pry.1.html +0 -204
- data/man/pry.1.ronn +0 -141
- data/pry.gemspec +0 -30
- data/spec/Procfile +0 -3
- data/spec/cli_spec.rb +0 -78
- data/spec/code_object_spec.rb +0 -277
- data/spec/code_spec.rb +0 -219
- data/spec/command_helpers_spec.rb +0 -29
- data/spec/command_integration_spec.rb +0 -644
- data/spec/command_set_spec.rb +0 -627
- data/spec/command_spec.rb +0 -821
- data/spec/commands/amend_line_spec.rb +0 -247
- data/spec/commands/bang_spec.rb +0 -19
- data/spec/commands/cat_spec.rb +0 -164
- data/spec/commands/cd_spec.rb +0 -250
- data/spec/commands/disable_pry_spec.rb +0 -25
- data/spec/commands/edit_spec.rb +0 -727
- data/spec/commands/exit_all_spec.rb +0 -34
- data/spec/commands/exit_program_spec.rb +0 -19
- data/spec/commands/exit_spec.rb +0 -34
- data/spec/commands/find_method_spec.rb +0 -70
- data/spec/commands/gem_list_spec.rb +0 -26
- data/spec/commands/gist_spec.rb +0 -79
- data/spec/commands/help_spec.rb +0 -56
- data/spec/commands/hist_spec.rb +0 -181
- data/spec/commands/jump_to_spec.rb +0 -15
- data/spec/commands/ls_spec.rb +0 -181
- data/spec/commands/play_spec.rb +0 -140
- data/spec/commands/raise_up_spec.rb +0 -56
- data/spec/commands/save_file_spec.rb +0 -177
- data/spec/commands/show_doc_spec.rb +0 -510
- data/spec/commands/show_input_spec.rb +0 -17
- data/spec/commands/show_source_spec.rb +0 -782
- data/spec/commands/whereami_spec.rb +0 -203
- data/spec/completion_spec.rb +0 -239
- data/spec/control_d_handler_spec.rb +0 -58
- data/spec/documentation_helper_spec.rb +0 -73
- data/spec/editor_spec.rb +0 -79
- data/spec/exception_whitelist_spec.rb +0 -21
- data/spec/fixtures/candidate_helper1.rb +0 -11
- data/spec/fixtures/candidate_helper2.rb +0 -8
- data/spec/fixtures/example.erb +0 -5
- data/spec/fixtures/example_nesting.rb +0 -33
- data/spec/fixtures/show_source_doc_examples.rb +0 -15
- data/spec/fixtures/testrc +0 -2
- data/spec/fixtures/testrcbad +0 -2
- data/spec/fixtures/whereami_helper.rb +0 -6
- data/spec/helper.rb +0 -34
- data/spec/helpers/bacon.rb +0 -86
- data/spec/helpers/mock_pry.rb +0 -43
- data/spec/helpers/table_spec.rb +0 -105
- data/spec/history_array_spec.rb +0 -67
- data/spec/hooks_spec.rb +0 -522
- data/spec/indent_spec.rb +0 -301
- data/spec/input_stack_spec.rb +0 -90
- data/spec/method_spec.rb +0 -482
- data/spec/prompt_spec.rb +0 -60
- data/spec/pry_defaults_spec.rb +0 -419
- data/spec/pry_history_spec.rb +0 -99
- data/spec/pry_output_spec.rb +0 -95
- data/spec/pry_spec.rb +0 -504
- data/spec/run_command_spec.rb +0 -25
- data/spec/sticky_locals_spec.rb +0 -157
- data/spec/syntax_checking_spec.rb +0 -81
- data/spec/wrapped_module_spec.rb +0 -261
- data/wiki/Customizing-pry.md +0 -397
- data/wiki/Home.md +0 -4
data/lib/pry/pry_class.rb
CHANGED
@@ -1,93 +1,100 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require '
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'stringio'
|
4
|
+
require 'pathname'
|
4
5
|
|
5
6
|
class Pry
|
7
|
+
LOCAL_RC_FILE = "./.pryrc".freeze
|
6
8
|
|
7
|
-
#
|
8
|
-
|
9
|
-
|
9
|
+
# @return [Boolean] true if this Ruby supports safe levels and tainting,
|
10
|
+
# to guard against using deprecated or unsupported features
|
11
|
+
HAS_SAFE_LEVEL = (
|
12
|
+
RUBY_ENGINE == 'ruby' &&
|
13
|
+
Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.7')
|
14
|
+
)
|
10
15
|
|
11
|
-
# @return [Hash] Pry's `Thread.current` hash
|
12
|
-
def self.current
|
13
|
-
Thread.current[:__pry__] ||= {}
|
14
|
-
end
|
15
|
-
|
16
|
-
# class accessors
|
17
16
|
class << self
|
18
|
-
extend Forwardable
|
19
|
-
|
20
|
-
# convenience method
|
21
|
-
def self.delegate_accessors(delagatee, *names)
|
22
|
-
def_delegators delagatee, *names
|
23
|
-
def_delegators delagatee, *names.map { |v| "#{v}=" }
|
24
|
-
end
|
25
|
-
|
26
|
-
# Get/Set the Proc that defines extra Readline completions (on top
|
27
|
-
# of the ones defined for IRB).
|
28
|
-
# @return [Proc] The Proc that defines extra Readline completions (on top
|
29
|
-
# @example Add file names to completion list
|
30
|
-
# Pry.custom_completions = proc { Dir.entries('.') }
|
17
|
+
extend Pry::Forwardable
|
31
18
|
attr_accessor :custom_completions
|
32
|
-
|
33
|
-
# @return [Fixnum] The current input line.
|
34
19
|
attr_accessor :current_line
|
35
|
-
|
36
|
-
# @return [Array] The Array of evaluated expressions.
|
37
20
|
attr_accessor :line_buffer
|
38
|
-
|
39
|
-
# @return [String] The __FILE__ for the `eval()`. Should be "(pry)"
|
40
|
-
# by default.
|
41
21
|
attr_accessor :eval_path
|
42
|
-
|
43
|
-
# @return [OpenStruct] Return Pry's config object.
|
44
|
-
attr_accessor :config
|
45
|
-
|
46
|
-
# @return [History] Return Pry's line history object.
|
47
|
-
attr_accessor :history
|
48
|
-
|
49
|
-
# @return [Boolean] Whether Pry was activated from the command line.
|
50
22
|
attr_accessor :cli
|
51
|
-
|
52
|
-
# @return [Boolean] Whether Pry sessions are quiet by default.
|
53
23
|
attr_accessor :quiet
|
54
|
-
|
55
|
-
# @return [Binding] A top level binding with no local variables
|
56
|
-
attr_accessor :toplevel_binding
|
57
|
-
|
58
|
-
# @return [Exception, nil] The last pry internal error.
|
59
|
-
# (a CommandError in most cases)
|
60
24
|
attr_accessor :last_internal_error
|
25
|
+
attr_accessor :config
|
61
26
|
|
62
|
-
|
63
|
-
|
27
|
+
def_delegators(
|
28
|
+
:@config, :input, :input=, :output, :output=, :commands,
|
29
|
+
:commands=, :print, :print=, :exception_handler, :exception_handler=,
|
30
|
+
:hooks, :hooks=, :color, :color=, :pager, :pager=, :editor, :editor=,
|
31
|
+
:memory_size, :memory_size=, :extra_sticky_locals, :extra_sticky_locals=,
|
32
|
+
:prompt, :prompt=, :history, :history=
|
33
|
+
)
|
34
|
+
|
35
|
+
#
|
36
|
+
# @example
|
37
|
+
# Pry.configure do |config|
|
38
|
+
# config.eager_load! # optional
|
39
|
+
# config.input = # ..
|
40
|
+
# config.foo = 2
|
41
|
+
# end
|
42
|
+
#
|
43
|
+
# @yield [config]
|
44
|
+
# Yields a block with {Pry.config} as its argument.
|
45
|
+
#
|
46
|
+
def configure
|
47
|
+
yield config
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
#
|
52
|
+
# @return [main]
|
53
|
+
# returns the special instance of Object, "main".
|
54
|
+
#
|
55
|
+
def self.main
|
56
|
+
@main ||= TOPLEVEL_BINDING.eval "self"
|
57
|
+
end
|
64
58
|
|
65
|
-
|
66
|
-
|
59
|
+
#
|
60
|
+
# @return [Pry::Config]
|
61
|
+
# Returns a value store for an instance of Pry running on the current thread.
|
62
|
+
#
|
63
|
+
def self.current
|
64
|
+
Thread.current[:__pry__] ||= {}
|
67
65
|
end
|
68
66
|
|
69
67
|
# Load the given file in the context of `Pry.toplevel_binding`
|
70
|
-
# @param [String]
|
71
|
-
def self.load_file_at_toplevel(
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
rescue RescuableException => e
|
76
|
-
puts "Error loading #{file_name}: #{e}\n#{e.backtrace.first}"
|
77
|
-
end
|
68
|
+
# @param [String] file The unexpanded file path.
|
69
|
+
def self.load_file_at_toplevel(file)
|
70
|
+
toplevel_binding.eval(File.read(file), file)
|
71
|
+
rescue RescuableException => e
|
72
|
+
puts "Error loading #{file}: #{e}\n#{e.backtrace.first}"
|
78
73
|
end
|
79
74
|
|
80
|
-
# Load
|
81
|
-
#
|
82
|
-
def self.
|
83
|
-
|
75
|
+
# Load RC files if appropriate This method can also be used to reload the
|
76
|
+
# files if they have changed.
|
77
|
+
def self.load_rc_files
|
78
|
+
rc_files_to_load.each do |file|
|
79
|
+
critical_section do
|
80
|
+
load_file_at_toplevel(file)
|
81
|
+
end
|
82
|
+
end
|
84
83
|
end
|
85
84
|
|
86
85
|
# Load the local RC file (./.pryrc)
|
87
|
-
def self.
|
88
|
-
|
89
|
-
|
90
|
-
|
86
|
+
def self.rc_files_to_load
|
87
|
+
files = []
|
88
|
+
files << Pry.config.rc_file if Pry.config.rc_file && Pry.config.should_load_rc
|
89
|
+
files << LOCAL_RC_FILE if Pry.config.should_load_local_rc
|
90
|
+
files.map { |file| real_path_to(file) }.compact.uniq
|
91
|
+
end
|
92
|
+
|
93
|
+
# Expand a file to its canonical name (following symlinks as appropriate)
|
94
|
+
def self.real_path_to(file)
|
95
|
+
Pathname.new(File.expand_path(file)).realpath.to_s
|
96
|
+
rescue Errno::ENOENT, Errno::EACCES
|
97
|
+
nil
|
91
98
|
end
|
92
99
|
|
93
100
|
# Load any Ruby files specified with the -r flag on the command line.
|
@@ -100,74 +107,91 @@ class Pry
|
|
100
107
|
# Trap interrupts on jruby, and make them behave like MRI so we can
|
101
108
|
# catch them.
|
102
109
|
def self.load_traps
|
103
|
-
trap('INT'){ raise Interrupt }
|
110
|
+
trap('INT') { raise Interrupt }
|
104
111
|
end
|
105
112
|
|
106
|
-
|
107
|
-
|
108
|
-
|
113
|
+
def self.load_win32console
|
114
|
+
require 'win32console'
|
115
|
+
# The mswin and mingw versions of pry require win32console, so this should
|
116
|
+
# only fail on jruby (where win32console doesn't work).
|
117
|
+
# Instead we'll recommend ansicon, which does.
|
118
|
+
rescue LoadError
|
119
|
+
warn <<-WARNING if Pry.config.windows_console_warning
|
120
|
+
For a better Pry experience on Windows, please use ansicon:
|
121
|
+
https://github.com/adoxa/ansicon
|
122
|
+
If you use an alternative to ansicon and don't want to see this warning again,
|
123
|
+
you can add "Pry.config.windows_console_warning = false" to your pryrc.
|
124
|
+
WARNING
|
125
|
+
end
|
126
|
+
|
127
|
+
# Do basic setup for initial session including: loading pryrc, plugins,
|
128
|
+
# requires, and history.
|
109
129
|
def self.initial_session_setup
|
130
|
+
return unless initial_session?
|
110
131
|
|
111
|
-
|
132
|
+
@initial_session = false
|
112
133
|
|
113
|
-
# note these have to be loaded here rather than in
|
134
|
+
# note these have to be loaded here rather than in _pry_ as
|
114
135
|
# we only want them loaded once per entire Pry lifetime.
|
115
|
-
|
116
|
-
|
117
|
-
|
136
|
+
load_rc_files
|
137
|
+
end
|
138
|
+
|
139
|
+
def self.final_session_setup
|
140
|
+
return if @session_finalized
|
141
|
+
|
142
|
+
@session_finalized = true
|
118
143
|
load_requires if Pry.config.should_load_requires
|
119
|
-
load_history if Pry.config.
|
144
|
+
load_history if Pry.config.history_load
|
120
145
|
load_traps if Pry.config.should_trap_interrupts
|
121
|
-
|
122
|
-
@initial_session = false
|
146
|
+
load_win32console if Helpers::Platform.windows? && !Helpers::Platform.windows_ansi?
|
123
147
|
end
|
124
148
|
|
125
149
|
# Start a Pry REPL.
|
126
|
-
# This method also loads the
|
127
|
-
# first time it is invoked.
|
150
|
+
# This method also loads `pryrc` as necessary the first time it is invoked.
|
128
151
|
# @param [Object, Binding] target The receiver of the Pry session
|
129
152
|
# @param [Hash] options
|
130
153
|
# @option options (see Pry#initialize)
|
131
154
|
# @example
|
132
155
|
# Pry.start(Object.new, :input => MyInput.new)
|
133
|
-
def self.start(target=nil, options={})
|
134
|
-
return if
|
156
|
+
def self.start(target = nil, options = {})
|
157
|
+
return if Pry::Env['DISABLE_PRY']
|
158
|
+
if Pry::Env['FAIL_PRY']
|
159
|
+
raise 'You have FAIL_PRY set to true, which results in Pry calls failing'
|
160
|
+
end
|
161
|
+
|
162
|
+
options = options.to_hash
|
135
163
|
|
136
164
|
if in_critical_section?
|
137
165
|
output.puts "ERROR: Pry started inside Pry."
|
138
|
-
output.puts "This can happen if you have a binding.pry inside a #to_s
|
166
|
+
output.puts "This can happen if you have a binding.pry inside a #to_s " \
|
167
|
+
"or #inspect function."
|
139
168
|
return
|
140
169
|
end
|
141
170
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
# save backtrace
|
149
|
-
pry_instance.backtrace = caller
|
171
|
+
unless mutex_available?
|
172
|
+
output.puts "ERROR: Unable to obtain mutex lock."
|
173
|
+
output.puts "This can happen if binding.pry is called from a signal handler"
|
174
|
+
return
|
175
|
+
end
|
150
176
|
|
151
|
-
|
152
|
-
|
177
|
+
options[:target] = Pry.binding_for(target || toplevel_binding)
|
178
|
+
initial_session_setup
|
179
|
+
final_session_setup
|
153
180
|
|
154
|
-
#
|
155
|
-
|
181
|
+
# Unless we were given a backtrace, save the current one
|
182
|
+
if options[:backtrace].nil?
|
183
|
+
options[:backtrace] = caller
|
156
184
|
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
185
|
+
# If Pry was started via `binding.pry`, elide that from the backtrace
|
186
|
+
if options[:backtrace].first =~ /pry.*core_extensions.*pry/
|
187
|
+
options[:backtrace].shift
|
188
|
+
end
|
161
189
|
end
|
162
190
|
|
163
|
-
|
164
|
-
# https://github.com/pry/pry/issues/566
|
165
|
-
if Pry.config.auto_indent
|
166
|
-
Kernel.print Pry::Helpers::BaseHelpers.windows_ansi? ? "\e[0F" : "\e[0G"
|
167
|
-
end
|
191
|
+
driver = options[:driver] || Pry::REPL
|
168
192
|
|
169
193
|
# Enter the matrix
|
170
|
-
|
194
|
+
driver.start(options)
|
171
195
|
rescue Pry::TooSafeException
|
172
196
|
puts "ERROR: Pry cannot work with $SAFE > 0"
|
173
197
|
raise
|
@@ -176,27 +200,49 @@ class Pry
|
|
176
200
|
# Execute the file through the REPL loop, non-interactively.
|
177
201
|
# @param [String] file_name File name to load through the REPL.
|
178
202
|
def self.load_file_through_repl(file_name)
|
179
|
-
require "pry/repl_file_loader"
|
180
203
|
REPLFileLoader.new(file_name).load
|
181
204
|
end
|
182
205
|
|
206
|
+
#
|
183
207
|
# An inspector that clips the output to `max_length` chars.
|
184
208
|
# In case of > `max_length` chars the `#<Object...> notation is used.
|
185
|
-
#
|
186
|
-
# @param
|
187
|
-
#
|
188
|
-
|
189
|
-
|
209
|
+
#
|
210
|
+
# @param [Object] obj
|
211
|
+
# The object to view.
|
212
|
+
#
|
213
|
+
# @param [Hash] options
|
214
|
+
# @option options [Integer] :max_length (60)
|
215
|
+
# The maximum number of chars before clipping occurs.
|
216
|
+
#
|
217
|
+
# @option options [Boolean] :id (false)
|
218
|
+
# Boolean to indicate whether or not a hex reprsentation of the object ID
|
219
|
+
# is attached to the return value when the length of inspect is greater than
|
220
|
+
# value of `:max_length`.
|
221
|
+
#
|
222
|
+
# @return [String]
|
223
|
+
# The string representation of `obj`.
|
224
|
+
#
|
225
|
+
def self.view_clip(obj, options = {})
|
226
|
+
max = options.fetch :max_length, 60
|
227
|
+
id = options.fetch :id, false
|
228
|
+
if obj.is_a?(Module) && obj.name.to_s != "" && obj.name.to_s.length <= max
|
190
229
|
obj.name.to_s
|
191
|
-
elsif
|
192
|
-
#
|
230
|
+
elsif Pry.main == obj
|
231
|
+
# Special-case to support jruby. Fixed as of:
|
232
|
+
# https://github.com/jruby/jruby/commit/d365ebd309cf9df3dde28f5eb36ea97056e0c039
|
233
|
+
# we can drop in the future.
|
193
234
|
obj.to_s
|
194
|
-
|
235
|
+
# rubocop:disable Style/CaseEquality
|
236
|
+
elsif Pry.config.prompt_safe_contexts.any? { |v| v === obj } &&
|
237
|
+
obj.inspect.length <= max
|
238
|
+
# rubocop:enable Style/CaseEquality
|
239
|
+
|
195
240
|
obj.inspect
|
241
|
+
elsif id
|
242
|
+
format("#<#{obj.class}:0x%<id>x>", id: obj.object_id << 1)
|
196
243
|
else
|
197
|
-
"#<#{obj.class}>"
|
244
|
+
"#<#{obj.class}>"
|
198
245
|
end
|
199
|
-
|
200
246
|
rescue RescuableException
|
201
247
|
"unknown"
|
202
248
|
end
|
@@ -206,11 +252,6 @@ class Pry
|
|
206
252
|
Pry.history.load
|
207
253
|
end
|
208
254
|
|
209
|
-
# Save new lines of Readline history if required.
|
210
|
-
def self.save_history
|
211
|
-
Pry.history.save
|
212
|
-
end
|
213
|
-
|
214
255
|
# @return [Boolean] Whether this is the first time a Pry session has
|
215
256
|
# been started since loading the Pry class.
|
216
257
|
def self.initial_session?
|
@@ -218,206 +259,84 @@ class Pry
|
|
218
259
|
end
|
219
260
|
|
220
261
|
# Run a Pry command from outside a session. The commands available are
|
221
|
-
# those referenced by `Pry.commands` (the default command set).
|
262
|
+
# those referenced by `Pry.config.commands` (the default command set).
|
222
263
|
# @param [String] command_string The Pry command (including arguments,
|
223
264
|
# if any).
|
224
265
|
# @param [Hash] options Optional named parameters.
|
225
|
-
# @return [
|
226
|
-
# @option options [Object, Binding] :
|
266
|
+
# @return [nil]
|
267
|
+
# @option options [Object, Binding] :target The object to run the
|
227
268
|
# command under. Defaults to `TOPLEVEL_BINDING` (main).
|
228
269
|
# @option options [Boolean] :show_output Whether to show command
|
229
270
|
# output. Defaults to true.
|
230
271
|
# @example Run at top-level with no output.
|
231
272
|
# Pry.run_command "ls"
|
232
273
|
# @example Run under Pry class, returning only public methods.
|
233
|
-
# Pry.run_command "ls -m", :
|
274
|
+
# Pry.run_command "ls -m", :target => Pry
|
234
275
|
# @example Display command output.
|
235
276
|
# Pry.run_command "ls -av", :show_output => true
|
236
|
-
def self.run_command(command_string, options={})
|
277
|
+
def self.run_command(command_string, options = {})
|
237
278
|
options = {
|
238
|
-
:
|
239
|
-
:
|
240
|
-
:
|
241
|
-
:
|
279
|
+
target: TOPLEVEL_BINDING,
|
280
|
+
show_output: true,
|
281
|
+
output: Pry.config.output,
|
282
|
+
commands: Pry.config.commands
|
242
283
|
}.merge!(options)
|
243
284
|
|
285
|
+
# :context for compatibility with <= 0.9.11.4
|
286
|
+
target = options[:context] || options[:target]
|
244
287
|
output = options[:show_output] ? options[:output] : StringIO.new
|
245
288
|
|
246
|
-
Pry.new(:output
|
247
|
-
|
248
|
-
|
289
|
+
pry = Pry.new(output: output, target: target, commands: options[:commands])
|
290
|
+
pry.eval command_string
|
291
|
+
nil
|
249
292
|
end
|
250
293
|
|
251
|
-
def self.
|
252
|
-
|
253
|
-
return ENV['EDITOR'] if ENV['EDITOR'] and not ENV['EDITOR'].empty?
|
294
|
+
def self.auto_resize!
|
295
|
+
Pry.config.input # by default, load Readline
|
254
296
|
|
255
|
-
if
|
256
|
-
|
257
|
-
|
258
|
-
%w(editor nano vi).detect do |editor|
|
259
|
-
system("which #{editor} > /dev/null 2>&1")
|
260
|
-
end
|
297
|
+
if !defined?(Readline) || Pry.config.input != Readline
|
298
|
+
warn "Sorry, you must be using Readline for Pry.auto_resize! to work."
|
299
|
+
return
|
261
300
|
end
|
262
|
-
end
|
263
301
|
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
warn <<-EOT
|
268
|
-
Readline version #{ver} detected - will not auto_resize! correctly.
|
302
|
+
if Readline::VERSION =~ /edit/i
|
303
|
+
warn(<<-WARN)
|
304
|
+
Readline version #{Readline::VERSION} detected - will not auto_resize! correctly.
|
269
305
|
For the fix, use GNU Readline instead:
|
270
|
-
https://github.com/guard/guard/wiki/Add-
|
271
|
-
|
306
|
+
https://github.com/guard/guard/wiki/Add-Readline-support-to-Ruby-on-Mac-OS-X
|
307
|
+
WARN
|
272
308
|
return
|
273
309
|
end
|
310
|
+
|
274
311
|
trap :WINCH do
|
275
312
|
begin
|
276
|
-
Readline.set_screen_size
|
277
|
-
rescue => e
|
313
|
+
Readline.set_screen_size(*output.size)
|
314
|
+
rescue StandardError => e
|
278
315
|
warn "\nPry.auto_resize!'s Readline.set_screen_size failed: #{e}"
|
279
316
|
end
|
280
317
|
begin
|
281
318
|
Readline.refresh_line
|
282
|
-
rescue => e
|
319
|
+
rescue StandardError => e
|
283
320
|
warn "\nPry.auto_resize!'s Readline.refresh_line failed: #{e}"
|
284
321
|
end
|
285
322
|
end
|
286
323
|
end
|
287
324
|
|
288
|
-
def self.set_config_defaults
|
289
|
-
config.input = Readline
|
290
|
-
config.output = $stdout
|
291
|
-
config.commands = Pry::Commands
|
292
|
-
config.prompt_name = DEFAULT_PROMPT_NAME
|
293
|
-
config.prompt = DEFAULT_PROMPT
|
294
|
-
config.print = DEFAULT_PRINT
|
295
|
-
config.exception_handler = DEFAULT_EXCEPTION_HANDLER
|
296
|
-
config.exception_whitelist = DEFAULT_EXCEPTION_WHITELIST
|
297
|
-
config.default_window_size = 5
|
298
|
-
config.hooks = DEFAULT_HOOKS
|
299
|
-
config.input_stack = []
|
300
|
-
config.color = Helpers::BaseHelpers.use_ansi_codes?
|
301
|
-
config.pager = true
|
302
|
-
config.system = DEFAULT_SYSTEM
|
303
|
-
config.editor = default_editor_for_platform
|
304
|
-
config.should_load_rc = true
|
305
|
-
config.should_load_local_rc = true
|
306
|
-
config.should_trap_interrupts = Helpers::BaseHelpers.jruby?
|
307
|
-
config.disable_auto_reload = false
|
308
|
-
config.command_prefix = ""
|
309
|
-
config.auto_indent = Helpers::BaseHelpers.use_ansi_codes?
|
310
|
-
config.correct_indent = true
|
311
|
-
config.collision_warning = false
|
312
|
-
config.output_prefix = "=> "
|
313
|
-
|
314
|
-
if defined?(Bond) && Readline::VERSION !~ /editline/i
|
315
|
-
config.completer = Pry::BondCompleter
|
316
|
-
else
|
317
|
-
config.completer = Pry::InputCompleter
|
318
|
-
end
|
319
|
-
|
320
|
-
config.gist ||= OpenStruct.new
|
321
|
-
config.gist.inspecter = proc(&:pretty_inspect)
|
322
|
-
|
323
|
-
config.should_load_plugins = true
|
324
|
-
|
325
|
-
config.requires ||= []
|
326
|
-
config.should_load_requires = true
|
327
|
-
|
328
|
-
config.history ||= OpenStruct.new
|
329
|
-
config.history.should_save = true
|
330
|
-
config.history.should_load = true
|
331
|
-
config.history.file = File.expand_path("~/.pry_history") rescue nil
|
332
|
-
|
333
|
-
if config.history.file.nil?
|
334
|
-
config.should_load_rc = false
|
335
|
-
config.history.should_save = false
|
336
|
-
config.history.should_load = false
|
337
|
-
end
|
338
|
-
|
339
|
-
config.control_d_handler = DEFAULT_CONTROL_D_HANDLER
|
340
|
-
|
341
|
-
config.memory_size = 100
|
342
|
-
|
343
|
-
config.extra_sticky_locals = {}
|
344
|
-
|
345
|
-
config.ls ||= OpenStruct.new({
|
346
|
-
:heading_color => :bright_blue,
|
347
|
-
|
348
|
-
:public_method_color => :default,
|
349
|
-
:private_method_color => :blue,
|
350
|
-
:protected_method_color => :blue,
|
351
|
-
:method_missing_color => :bright_red,
|
352
|
-
|
353
|
-
:local_var_color => :yellow,
|
354
|
-
:pry_var_color => :default, # e.g. _, _pry_, _file_
|
355
|
-
|
356
|
-
:instance_var_color => :blue, # e.g. @foo
|
357
|
-
:class_var_color => :bright_blue, # e.g. @@foo
|
358
|
-
|
359
|
-
:global_var_color => :default, # e.g. $CODERAY_DEBUG, $eventmachine_library
|
360
|
-
:builtin_global_color => :cyan, # e.g. $stdin, $-w, $PID
|
361
|
-
:pseudo_global_color => :cyan, # e.g. $~, $1..$9, $LAST_MATCH_INFO
|
362
|
-
|
363
|
-
:constant_color => :default, # e.g. VERSION, ARGF
|
364
|
-
:class_constant_color => :blue, # e.g. Object, Kernel
|
365
|
-
:exception_constant_color => :magenta, # e.g. Exception, RuntimeError
|
366
|
-
:unloaded_constant_color => :yellow, # Any constant that is still in .autoload? state
|
367
|
-
|
368
|
-
# What should separate items listed by ls? (TODO: we should allow a columnar layout)
|
369
|
-
:separator => " ",
|
370
|
-
|
371
|
-
# Any methods defined on these classes, or modules included into these classes, will not
|
372
|
-
# be shown by ls unless the -v flag is used.
|
373
|
-
# A user of Rails may wih to add ActiveRecord::Base to the list.
|
374
|
-
# add the following to your .pryrc:
|
375
|
-
# Pry.config.ls.ceiling << ActiveRecord::Base if defined? ActiveRecordBase
|
376
|
-
:ceiling => [Object, Module, Class]
|
377
|
-
})
|
378
|
-
end
|
379
|
-
|
380
325
|
# Set all the configurable options back to their default values
|
381
326
|
def self.reset_defaults
|
382
|
-
set_config_defaults
|
383
|
-
|
384
327
|
@initial_session = true
|
328
|
+
@session_finalized = nil
|
385
329
|
|
386
|
-
self.
|
330
|
+
self.config = Pry::Config.new
|
387
331
|
self.cli = false
|
388
332
|
self.current_line = 1
|
389
333
|
self.line_buffer = [""]
|
390
334
|
self.eval_path = "(pry)"
|
391
|
-
|
392
|
-
fix_coderay_colors
|
393
|
-
end
|
394
|
-
|
395
|
-
# To avoid mass-confusion, we change the default colour of "white" to
|
396
|
-
# "blue" enabling global legibility
|
397
|
-
def self.fix_coderay_colors
|
398
|
-
to_fix = if (CodeRay::Encoders::Terminal::TOKEN_COLORS rescue nil)
|
399
|
-
# CodeRay 1.0.0
|
400
|
-
CodeRay::Encoders::Terminal::TOKEN_COLORS
|
401
|
-
else
|
402
|
-
# CodeRay 0.9
|
403
|
-
begin
|
404
|
-
require 'coderay/encoders/term'
|
405
|
-
CodeRay::Encoders::Term::TOKEN_COLORS
|
406
|
-
rescue
|
407
|
-
end
|
408
|
-
end
|
409
|
-
|
410
|
-
to_fix[:comment] = "0;34" if to_fix
|
411
335
|
end
|
412
336
|
|
413
337
|
# Basic initialization.
|
414
338
|
def self.init
|
415
|
-
@plugin_manager ||= PluginManager.new
|
416
|
-
self.config ||= Config.new
|
417
|
-
self.history ||= History.new
|
418
|
-
|
419
339
|
reset_defaults
|
420
|
-
locate_plugins
|
421
340
|
end
|
422
341
|
|
423
342
|
# Return a `Binding` object for `target` or return `target` if it is
|
@@ -426,19 +345,14 @@ Readline version #{ver} detected - will not auto_resize! correctly.
|
|
426
345
|
# @param [Object] target The object to get a `Binding` object for.
|
427
346
|
# @return [Binding] The `Binding` object.
|
428
347
|
def self.binding_for(target)
|
429
|
-
if Binding === target
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
TOPLEVEL_BINDING
|
434
|
-
else
|
435
|
-
target.__binding__
|
436
|
-
end
|
437
|
-
end
|
348
|
+
return target if Binding === target # rubocop:disable Style/CaseEquality
|
349
|
+
return TOPLEVEL_BINDING if Pry.main == target
|
350
|
+
|
351
|
+
target.__binding__
|
438
352
|
end
|
439
353
|
|
440
354
|
def self.toplevel_binding
|
441
|
-
unless @toplevel_binding
|
355
|
+
unless defined?(@toplevel_binding) && @toplevel_binding
|
442
356
|
# Grab a copy of the TOPLEVEL_BINDING without any local variables.
|
443
357
|
# This binding has a default definee of Object, and new methods are
|
444
358
|
# private (just as in TOPLEVEL_BINDING).
|
@@ -454,16 +368,29 @@ Readline version #{ver} detected - will not auto_resize! correctly.
|
|
454
368
|
@toplevel_binding
|
455
369
|
end
|
456
370
|
|
371
|
+
class << self
|
372
|
+
attr_writer :toplevel_binding
|
373
|
+
end
|
374
|
+
|
457
375
|
def self.in_critical_section?
|
458
|
-
|
376
|
+
Thread.current[:pry_critical_section] ||= 0
|
377
|
+
Thread.current[:pry_critical_section] > 0
|
459
378
|
end
|
460
379
|
|
461
|
-
def self.critical_section
|
462
|
-
|
380
|
+
def self.critical_section
|
381
|
+
Thread.current[:pry_critical_section] ||= 0
|
382
|
+
Thread.current[:pry_critical_section] += 1
|
463
383
|
yield
|
464
384
|
ensure
|
465
|
-
|
385
|
+
Thread.current[:pry_critical_section] -= 1
|
386
|
+
end
|
387
|
+
|
388
|
+
def self.mutex_available?
|
389
|
+
Mutex.new.synchronize { true }
|
390
|
+
rescue ThreadError
|
391
|
+
false
|
466
392
|
end
|
393
|
+
private_class_method :mutex_available?
|
467
394
|
end
|
468
395
|
|
469
396
|
Pry.init
|