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.
- 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
|