pry 0.11.3-java → 0.12.0-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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +139 -1
- data/LICENSE +1 -1
- data/README.md +13 -30
- data/bin/pry +0 -4
- data/lib/pry.rb +17 -47
- data/lib/pry/cli.rb +17 -24
- data/lib/pry/code.rb +6 -6
- data/lib/pry/code/code_file.rb +5 -4
- data/lib/pry/code/code_range.rb +3 -3
- data/lib/pry/code/loc.rb +14 -8
- data/lib/pry/code_object.rb +4 -4
- data/lib/pry/color_printer.rb +1 -0
- data/lib/pry/command.rb +36 -29
- data/lib/pry/command_set.rb +17 -52
- data/lib/pry/commands/amend_line.rb +3 -4
- data/lib/pry/commands/bang.rb +1 -1
- data/lib/pry/commands/cat.rb +7 -6
- data/lib/pry/commands/cat/exception_formatter.rb +9 -8
- data/lib/pry/commands/cat/input_expression_formatter.rb +1 -1
- data/lib/pry/commands/change_prompt.rb +29 -9
- data/lib/pry/commands/clear_screen.rb +14 -0
- data/lib/pry/commands/code_collector.rb +9 -9
- data/lib/pry/commands/easter_eggs.rb +3 -3
- data/lib/pry/commands/edit.rb +8 -7
- data/lib/pry/commands/exit.rb +2 -1
- data/lib/pry/commands/find_method.rb +11 -13
- data/lib/pry/commands/gem_cd.rb +1 -1
- data/lib/pry/commands/gem_install.rb +2 -2
- data/lib/pry/commands/gem_list.rb +2 -2
- data/lib/pry/commands/gem_open.rb +1 -1
- data/lib/pry/commands/gem_search.rb +2 -2
- data/lib/pry/commands/gem_stats.rb +83 -0
- data/lib/pry/commands/gist.rb +7 -6
- data/lib/pry/commands/help.rb +3 -3
- data/lib/pry/commands/hist.rb +9 -8
- data/lib/pry/commands/import_set.rb +2 -1
- data/lib/pry/commands/install_command.rb +7 -6
- data/lib/pry/commands/list_inspectors.rb +2 -2
- data/lib/pry/commands/ls.rb +27 -30
- data/lib/pry/commands/ls/constants.rb +4 -4
- data/lib/pry/commands/ls/formatter.rb +3 -2
- data/lib/pry/commands/ls/globals.rb +0 -2
- data/lib/pry/commands/ls/grep.rb +0 -2
- data/lib/pry/commands/ls/instance_vars.rb +0 -1
- data/lib/pry/commands/ls/local_names.rb +0 -2
- data/lib/pry/commands/ls/local_vars.rb +0 -2
- data/lib/pry/commands/ls/ls_entity.rb +0 -1
- data/lib/pry/commands/ls/methods.rb +0 -3
- data/lib/pry/commands/ls/methods_helper.rb +1 -1
- data/lib/pry/commands/ls/self_methods.rb +0 -1
- data/lib/pry/commands/play.rb +1 -2
- data/lib/pry/commands/pry_backtrace.rb +1 -1
- data/lib/pry/commands/raise_up.rb +2 -1
- data/lib/pry/commands/ri.rb +5 -4
- data/lib/pry/commands/shell_command.rb +3 -2
- data/lib/pry/commands/shell_mode.rb +6 -6
- data/lib/pry/commands/show_doc.rb +5 -7
- data/lib/pry/commands/show_info.rb +25 -18
- data/lib/pry/commands/show_source.rb +5 -2
- data/lib/pry/commands/stat.rb +1 -1
- data/lib/pry/commands/watch_expression.rb +9 -7
- data/lib/pry/commands/whereami.rb +4 -4
- data/lib/pry/commands/wtf.rb +15 -2
- data/lib/pry/config.rb +33 -9
- data/lib/pry/config/behavior.rb +229 -205
- data/lib/pry/config/convenience.rb +24 -21
- data/lib/pry/config/default.rb +153 -143
- data/lib/pry/config/memoization.rb +41 -37
- data/lib/pry/core_extensions.rb +4 -3
- data/lib/pry/editor.rb +5 -12
- data/lib/pry/exceptions.rb +0 -2
- data/lib/pry/helpers.rb +1 -0
- data/lib/pry/helpers/base_helpers.rb +133 -4
- data/lib/pry/helpers/command_helpers.rb +5 -4
- data/lib/pry/helpers/documentation_helpers.rb +2 -2
- data/lib/pry/helpers/options_helpers.rb +5 -5
- data/lib/pry/helpers/platform.rb +58 -0
- data/lib/pry/helpers/table.rb +20 -15
- data/lib/pry/helpers/text.rb +3 -4
- data/lib/pry/history.rb +21 -8
- data/lib/pry/hooks.rb +3 -3
- data/lib/pry/indent.rb +15 -17
- data/lib/pry/input_completer.rb +12 -7
- data/lib/pry/input_lock.rb +0 -2
- data/lib/pry/last_exception.rb +1 -1
- data/lib/pry/method.rb +37 -31
- data/lib/pry/method/disowned.rb +2 -1
- data/lib/pry/method/patcher.rb +2 -2
- data/lib/pry/method/weird_method_locator.rb +7 -8
- data/lib/pry/object_path.rb +5 -4
- data/lib/pry/output.rb +3 -2
- data/lib/pry/pager.rb +4 -3
- data/lib/pry/platform.rb +79 -81
- data/lib/pry/plugins.rb +7 -3
- data/lib/pry/prompt.rb +144 -25
- data/lib/pry/pry_class.rb +53 -29
- data/lib/pry/pry_instance.rb +88 -55
- data/lib/pry/repl.rb +33 -4
- data/lib/pry/repl_file_loader.rb +1 -2
- data/lib/pry/ring.rb +84 -0
- data/lib/pry/rubygem.rb +6 -6
- data/lib/pry/slop.rb +17 -17
- data/lib/pry/slop/commands.rb +3 -4
- data/lib/pry/slop/option.rb +19 -21
- data/lib/pry/terminal.rb +2 -1
- data/lib/pry/testable/mockable.rb +2 -2
- data/lib/pry/testable/pry_tester.rb +1 -1
- data/lib/pry/testable/utility.rb +2 -2
- data/lib/pry/testable/variables.rb +1 -1
- data/lib/pry/version.rb +1 -1
- data/lib/pry/wrapped_module.rb +15 -15
- data/lib/pry/wrapped_module/candidate.rb +2 -2
- metadata +19 -31
- data/lib/pry/commands/list_prompts.rb +0 -35
- data/lib/pry/commands/simple_prompt.rb +0 -22
- data/lib/pry/history_array.rb +0 -121
- data/lib/pry/rbx_path.rb +0 -22
data/lib/pry/method/disowned.rb
CHANGED
@@ -20,7 +20,7 @@ class Pry
|
|
20
20
|
#
|
21
21
|
# @param [Object] receiver
|
22
22
|
# @param [String] method_name
|
23
|
-
def initialize(receiver, method_name
|
23
|
+
def initialize(receiver, method_name)
|
24
24
|
@receiver, @name = receiver, method_name
|
25
25
|
@method = nil
|
26
26
|
end
|
@@ -47,6 +47,7 @@ class Pry
|
|
47
47
|
# Raise a more useful error message instead of trying to forward to nil.
|
48
48
|
def method_missing(meth_name, *args, &block)
|
49
49
|
raise "Cannot call '#{meth_name}' on an undef'd method." if method(:name).respond_to?(meth_name)
|
50
|
+
|
50
51
|
Object.instance_method(:method_missing).bind(self).call(meth_name, *args, &block)
|
51
52
|
end
|
52
53
|
end
|
data/lib/pry/method/patcher.rb
CHANGED
@@ -94,7 +94,7 @@ class Pry
|
|
94
94
|
def wrap_for_owner(source)
|
95
95
|
Pry.current[:pry_owner] = method.owner
|
96
96
|
owner_source = definition_for_owner(source)
|
97
|
-
visibility_fix = "#{method.visibility
|
97
|
+
visibility_fix = "#{method.visibility} #{method.name.to_sym.inspect}"
|
98
98
|
"Pry.current[:pry_owner].class_eval do; #{owner_source}\n#{visibility_fix}\nend"
|
99
99
|
end
|
100
100
|
|
@@ -113,7 +113,7 @@ class Pry
|
|
113
113
|
def wrap_for_nesting(source)
|
114
114
|
nesting = Pry::Code.from_file(method.source_file).nesting_at(method.source_line)
|
115
115
|
|
116
|
-
(nesting + [source] + nesting.map{ "end" } + [""]).join(";")
|
116
|
+
(nesting + [source] + nesting.map { "end" } + [""]).join(";")
|
117
117
|
rescue Pry::Indent::UnparseableNestingError
|
118
118
|
source
|
119
119
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
class Pry
|
2
2
|
class Method
|
3
|
-
|
4
3
|
# This class is responsible for locating the *real* `Pry::Method`
|
5
4
|
# object captured by a binding.
|
6
5
|
#
|
@@ -16,7 +15,6 @@ class Pry
|
|
16
15
|
# Pry::Method and return it, or return nil if we fail.
|
17
16
|
class WeirdMethodLocator
|
18
17
|
class << self
|
19
|
-
|
20
18
|
# Whether the given method object matches the associated binding.
|
21
19
|
# If the method object does not match the binding, then it's
|
22
20
|
# most likely not the method captured by the binding, and we
|
@@ -67,7 +65,7 @@ class Pry
|
|
67
65
|
|
68
66
|
def skip_superclass_search?
|
69
67
|
target_mod = @target.eval('self').class
|
70
|
-
target_mod.ancestors.take_while {|mod| mod != target_mod }.any?
|
68
|
+
target_mod.ancestors.take_while { |mod| mod != target_mod }.any?
|
71
69
|
end
|
72
70
|
|
73
71
|
def normal_method?(method)
|
@@ -100,8 +98,7 @@ class Pry
|
|
100
98
|
# __FILE__ and __LINE__ the binding is at, we can hope to disambiguate these cases.
|
101
99
|
#
|
102
100
|
# This obviously won't work if the source is unavaiable for some reason, or if both
|
103
|
-
# methods have the same __FILE__ and __LINE__
|
104
|
-
# is broken.
|
101
|
+
# methods have the same __FILE__ and __LINE__.
|
105
102
|
#
|
106
103
|
# @return [Pry::Method, nil] The Pry::Method representing the
|
107
104
|
# superclass method.
|
@@ -110,6 +107,7 @@ class Pry
|
|
110
107
|
if skip_superclass_search?
|
111
108
|
return guess
|
112
109
|
end
|
110
|
+
|
113
111
|
while guess
|
114
112
|
# needs rescue if this is a Disowned method or a C method or something...
|
115
113
|
# TODO: Fix up the exception handling so we don't need a bare rescue
|
@@ -122,9 +120,9 @@ class Pry
|
|
122
120
|
end
|
123
121
|
end
|
124
122
|
|
125
|
-
# Uhoh... none of the methods in the chain had the right __FILE__ and
|
126
|
-
#
|
127
|
-
#
|
123
|
+
# Uhoh... none of the methods in the chain had the right `__FILE__` and
|
124
|
+
# `__LINE__` due to unknown circumstances.
|
125
|
+
# TODO: we should warn the user when this happens.
|
128
126
|
nil
|
129
127
|
end
|
130
128
|
|
@@ -136,6 +134,7 @@ class Pry
|
|
136
134
|
# renamed method
|
137
135
|
def find_renamed_method
|
138
136
|
return if !valid_file?(target_file)
|
137
|
+
|
139
138
|
alias_name = all_methods_for(target_self).find do |v|
|
140
139
|
expanded_source_location(target_self.method(v).source_location) == renamed_method_source_location
|
141
140
|
end
|
data/lib/pry/object_path.rb
CHANGED
@@ -28,7 +28,7 @@ class Pry
|
|
28
28
|
stack = @current_stack.dup
|
29
29
|
|
30
30
|
begin
|
31
|
-
next_segment
|
31
|
+
next_segment = ""
|
32
32
|
|
33
33
|
loop do
|
34
34
|
# Scan for as long as we don't see a slash
|
@@ -74,9 +74,10 @@ class Pry
|
|
74
74
|
"Exception: #{err.inspect}"
|
75
75
|
].join("\n")
|
76
76
|
|
77
|
-
|
78
|
-
|
79
|
-
|
77
|
+
command_error = CommandError.new(msg)
|
78
|
+
command_error.set_backtrace(err.backtrace)
|
79
|
+
|
80
|
+
raise command_error
|
80
81
|
end
|
81
82
|
end
|
82
83
|
end
|
data/lib/pry/output.rb
CHANGED
@@ -8,8 +8,9 @@ class Pry::Output
|
|
8
8
|
|
9
9
|
def puts(*objs)
|
10
10
|
return print "\n" if objs.empty?
|
11
|
+
|
11
12
|
objs.each do |obj|
|
12
|
-
if ary = Array.try_convert(obj)
|
13
|
+
if (ary = Array.try_convert(obj))
|
13
14
|
puts(*ary)
|
14
15
|
else
|
15
16
|
print "#{obj.to_s.chomp}\n"
|
@@ -35,7 +36,7 @@ class Pry::Output
|
|
35
36
|
@boxed_io.__send__(name, *args, &block)
|
36
37
|
end
|
37
38
|
|
38
|
-
def respond_to_missing?(m, include_all=false)
|
39
|
+
def respond_to_missing?(m, include_all = false)
|
39
40
|
@boxed_io.respond_to?(m, include_all)
|
40
41
|
end
|
41
42
|
|
data/lib/pry/pager.rb
CHANGED
@@ -51,7 +51,7 @@ class Pry::Pager
|
|
51
51
|
def best_available
|
52
52
|
if !_pry_.config.pager
|
53
53
|
NullPager.new(_pry_.output)
|
54
|
-
elsif !SystemPager.available? ||
|
54
|
+
elsif !SystemPager.available? || Helpers::Platform.jruby?
|
55
55
|
SimplePager.new(_pry_.output)
|
56
56
|
else
|
57
57
|
SystemPager.new(_pry_.output)
|
@@ -111,6 +111,7 @@ class Pry::Pager
|
|
111
111
|
@out.print "<page break> --- Press enter to continue " \
|
112
112
|
"( q<enter> to break ) --- <page break>\n"
|
113
113
|
raise StopPaging if Readline.readline("").chomp == "q"
|
114
|
+
|
114
115
|
@tracker.reset
|
115
116
|
end
|
116
117
|
end
|
@@ -138,8 +139,8 @@ class Pry::Pager
|
|
138
139
|
if @system_pager.nil?
|
139
140
|
@system_pager = begin
|
140
141
|
pager_executable = default_pager.split(' ').first
|
141
|
-
if
|
142
|
-
`where #{pager_executable}`
|
142
|
+
if Helpers::Platform.windows? || Helpers::Platform.windows_ansi?
|
143
|
+
`where /Q #{pager_executable}`
|
143
144
|
else
|
144
145
|
`which #{pager_executable}`
|
145
146
|
end
|
data/lib/pry/platform.rb
CHANGED
@@ -1,93 +1,91 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
class Pry
|
2
|
+
module Platform
|
3
|
+
extend self
|
3
4
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
5
|
+
#
|
6
|
+
# @return [Boolean]
|
7
|
+
# Returns true if Pry is running on Mac OSX.
|
8
|
+
#
|
9
|
+
# @note
|
10
|
+
# Queries RbConfig::CONFIG['host_os'] with a best guess.
|
11
|
+
#
|
12
|
+
def mac_osx?
|
13
|
+
!!(RbConfig::CONFIG['host_os'] =~ /\Adarwin/i)
|
14
|
+
end
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
16
|
+
#
|
17
|
+
# @return [Boolean]
|
18
|
+
# Returns true if Pry is running on Linux.
|
19
|
+
#
|
20
|
+
# @note
|
21
|
+
# Queries RbConfig::CONFIG['host_os'] with a best guess.
|
22
|
+
#
|
23
|
+
def linux?
|
24
|
+
!!(RbConfig::CONFIG['host_os'] =~ /linux/i)
|
25
|
+
end
|
25
26
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
27
|
+
#
|
28
|
+
# @return [Boolean]
|
29
|
+
# Returns true if Pry is running on Windows.
|
30
|
+
#
|
31
|
+
# @note
|
32
|
+
# Queries RbConfig::CONFIG['host_os'] with a best guess.
|
33
|
+
#
|
34
|
+
def windows?
|
35
|
+
!!(RbConfig::CONFIG['host_os'] =~ /mswin|mingw/)
|
36
|
+
end
|
36
37
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
!!(defined?(Win32::Console) or ENV['ANSICON'] or mri_2?)
|
44
|
-
end
|
38
|
+
#
|
39
|
+
# @return [Boolean]
|
40
|
+
# Returns true when Pry is running on Windows with ANSI support.
|
41
|
+
#
|
42
|
+
def windows_ansi?
|
43
|
+
return false if not windows?
|
45
44
|
|
46
|
-
|
47
|
-
|
48
|
-
# Returns true when Pry is being run from JRuby.
|
49
|
-
#
|
50
|
-
def jruby?
|
51
|
-
RbConfig::CONFIG['ruby_install_name'] == 'jruby'
|
52
|
-
end
|
45
|
+
!!(defined?(Win32::Console) or ENV['ANSICON'] or mri_2?)
|
46
|
+
end
|
53
47
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
48
|
+
#
|
49
|
+
# @return [Boolean]
|
50
|
+
# Returns true when Pry is being run from JRuby.
|
51
|
+
#
|
52
|
+
def jruby?
|
53
|
+
RbConfig::CONFIG['ruby_install_name'] == 'jruby'
|
54
|
+
end
|
61
55
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
56
|
+
#
|
57
|
+
# @return [Boolean]
|
58
|
+
# Returns true when Pry is being run from JRuby in 1.9 mode.
|
59
|
+
#
|
60
|
+
def jruby_19?
|
61
|
+
jruby? and RbConfig::CONFIG['ruby_version'] == '1.9'
|
62
|
+
end
|
69
63
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
64
|
+
#
|
65
|
+
# @return [Boolean]
|
66
|
+
# Returns true when Pry is being run from MRI (CRuby).
|
67
|
+
#
|
68
|
+
def mri?
|
69
|
+
RbConfig::CONFIG['ruby_install_name'] == 'ruby'
|
70
|
+
end
|
77
71
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
72
|
+
#
|
73
|
+
# @return [Boolean]
|
74
|
+
# Returns true when Pry is being run from MRI v1.9+ (CRuby).
|
75
|
+
#
|
76
|
+
def mri_19?
|
77
|
+
!!(mri? and RUBY_VERSION =~ /\A1\.9/)
|
78
|
+
end
|
85
79
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
80
|
+
#
|
81
|
+
# @return [Boolean]
|
82
|
+
# Returns true when Pry is being run from MRI v2+ (CRuby).
|
83
|
+
#
|
84
|
+
def mri_2?
|
85
|
+
!!(mri? and RUBY_VERSION =~ /\A2/)
|
86
|
+
end
|
92
87
|
end
|
88
|
+
|
89
|
+
# Not supported on MRI 2.2 and lower.
|
90
|
+
deprecate_constant(:Platform) if respond_to?(:deprecate_constant)
|
93
91
|
end
|
data/lib/pry/plugins.rb
CHANGED
@@ -8,7 +8,7 @@ class Pry
|
|
8
8
|
@name = name
|
9
9
|
end
|
10
10
|
|
11
|
-
def method_missing(*
|
11
|
+
def method_missing(*_args)
|
12
12
|
warn "Warning: The plugin '#{@name}' was not found! (no gem found)"
|
13
13
|
end
|
14
14
|
end
|
@@ -35,8 +35,12 @@ class Pry
|
|
35
35
|
# Load the Command line options defined by this plugin (if they exist)
|
36
36
|
def load_cli_options
|
37
37
|
cli_options_file = File.join(spec.full_gem_path, "lib/#{spec.name}/cli.rb")
|
38
|
-
|
38
|
+
return unless File.exist?(cli_options_file)
|
39
|
+
|
40
|
+
cli_options_file = File.realpath(cli_options_file) if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("2.4.4")
|
41
|
+
require cli_options_file
|
39
42
|
end
|
43
|
+
|
40
44
|
# Activate the plugin (require the gem - enables/loads the
|
41
45
|
# plugin immediately at point of call, even if plugin is
|
42
46
|
# disabled)
|
@@ -80,6 +84,7 @@ class Pry
|
|
80
84
|
def locate_plugins
|
81
85
|
gem_list.each do |gem|
|
82
86
|
next if gem.name !~ PRY_PLUGIN_PREFIX
|
87
|
+
|
83
88
|
plugin_name = gem.name.split('-', 2).last
|
84
89
|
plugin = Plugin.new(plugin_name, gem.name, gem, false)
|
85
90
|
@plugins << plugin.tap(&:enable!) if plugin.supported? && !plugin_located?(plugin)
|
@@ -114,5 +119,4 @@ class Pry
|
|
114
119
|
Gem::Specification.respond_to?(:each) ? Gem::Specification : Gem.source_index.find_name('')
|
115
120
|
end
|
116
121
|
end
|
117
|
-
|
118
122
|
end
|
data/lib/pry/prompt.rb
CHANGED
@@ -1,26 +1,145 @@
|
|
1
|
-
class Pry
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
1
|
+
class Pry
|
2
|
+
# Prompt represents the Pry prompt, which can be used with Readline-like
|
3
|
+
# libraries. It defines a few default prompts (default prompt, simple prompt,
|
4
|
+
# etc) and also provides an API to add custom prompts.
|
5
|
+
#
|
6
|
+
# @example
|
7
|
+
# Pry::Prompt.add(
|
8
|
+
# :ipython,
|
9
|
+
# 'IPython-like prompt', [':', '...:']
|
10
|
+
# ) do |_context, _nesting, _pry_, sep|
|
11
|
+
# sep == ':' ? "In [#{_pry_.input_ring.count}]: " : ' ...: '
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# # Produces:
|
15
|
+
# # In [3]: def foo
|
16
|
+
# # ...: puts 'foo'
|
17
|
+
# # ...: end
|
18
|
+
# # => :foo
|
19
|
+
# # In [4]:
|
20
|
+
# @since v0.11.0
|
21
|
+
# @api public
|
22
|
+
module Prompt
|
23
|
+
# @return [String]
|
24
|
+
DEFAULT_NAME = 'pry'.freeze
|
25
|
+
|
26
|
+
# @return [Array<Object>] the list of objects that are known to have a
|
27
|
+
# 1-line #inspect output suitable for prompt
|
28
|
+
SAFE_CONTEXTS = [String, Numeric, Symbol, nil, true, false].freeze
|
29
|
+
|
30
|
+
# @deprecated Use {Pry::Prompt.add} instead.
|
31
|
+
MAP = {}
|
32
|
+
deprecate_constant(:MAP) if respond_to?(:deprecate_constant)
|
33
|
+
|
34
|
+
# A Hash that holds all prompts. The keys of the Hash are prompt
|
35
|
+
# names, the values are Hash instances of the format {:description, :value}.
|
36
|
+
@prompts = {}
|
37
|
+
|
38
|
+
class << self
|
39
|
+
# Retrieves a prompt.
|
40
|
+
#
|
41
|
+
# @example
|
42
|
+
# Prompt[:my_prompt][:value]
|
43
|
+
#
|
44
|
+
# @param [Symbol] prompt_name The name of the prompt you want to access
|
45
|
+
# @return [Hash{Symbol=>Object}]
|
46
|
+
# @since v0.12.0
|
47
|
+
def [](prompt_name)
|
48
|
+
all[prompt_name.to_s]
|
49
|
+
end
|
50
|
+
|
51
|
+
# @return [Hash{Symbol=>Hash}] the duplicate of the internal prompts hash
|
52
|
+
# @note Use this for read-only operations
|
53
|
+
# @since v0.12.0
|
54
|
+
def all
|
55
|
+
@prompts.dup
|
56
|
+
end
|
57
|
+
|
58
|
+
# Adds a new prompt to the prompt hash.
|
59
|
+
#
|
60
|
+
# @param [Symbol] prompt_name
|
61
|
+
# @param [String] description
|
62
|
+
# @param [Array<String>] separators The separators to differentiate
|
63
|
+
# between prompt modes (default mode and class/method definition mode).
|
64
|
+
# The Array *must* have a size of 2.
|
65
|
+
# @yield [context, nesting, _pry_, sep]
|
66
|
+
# @yieldparam context [Object] the context where Pry is currently in
|
67
|
+
# @yieldparam nesting [Integer] whether the context is nested
|
68
|
+
# @yieldparam _pry_ [Pry] the Pry instance
|
69
|
+
# @yieldparam separator [String] separator string
|
70
|
+
# @return [nil]
|
71
|
+
# @raise [ArgumentError] if the size of `separators` is not 2
|
72
|
+
# @since v0.12.0
|
73
|
+
def add(prompt_name, description = '', separators = %w[> *])
|
74
|
+
unless separators.size == 2
|
75
|
+
raise ArgumentError, "separators size must be 2, given #{separators.size}"
|
76
|
+
end
|
77
|
+
|
78
|
+
@prompts[prompt_name.to_s] = {
|
79
|
+
description: description,
|
80
|
+
value: separators.map do |sep|
|
81
|
+
proc { |context, nesting, _pry_| yield(context, nesting, _pry_, sep) }
|
82
|
+
end
|
83
|
+
}
|
84
|
+
|
85
|
+
nil
|
86
|
+
end
|
87
|
+
|
88
|
+
private
|
89
|
+
|
90
|
+
def prompt_name(name)
|
91
|
+
return name unless name.is_a?(Pry::Config::Lazy)
|
92
|
+
|
93
|
+
name.call
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
add(:default, <<DESC) do |context, nesting, _pry_, sep|
|
98
|
+
The default Pry prompt. Includes information about the current expression
|
99
|
+
number, evaluation context, and nesting level, plus a reminder that you're
|
100
|
+
using Pry.
|
101
|
+
DESC
|
102
|
+
format(
|
103
|
+
"[%<in_count>s] %<name>s(%<context>s)%<nesting>s%<separator>s ",
|
104
|
+
in_count: _pry_.input_ring.count,
|
105
|
+
name: prompt_name(_pry_.config.prompt_name),
|
106
|
+
context: Pry.view_clip(context),
|
107
|
+
nesting: (nesting > 0 ? ":#{nesting}" : ''),
|
108
|
+
separator: sep
|
109
|
+
)
|
110
|
+
end
|
111
|
+
|
112
|
+
add(:simple, "A simple `>>`.\n", ['>> ', ' | ']) do |_, _, _, sep|
|
113
|
+
sep
|
114
|
+
end
|
115
|
+
|
116
|
+
add(:nav, <<DESC, %w[> *]) do |context, nesting, _pry_, sep|
|
117
|
+
A prompt that displays the binding stack as a path and includes information
|
118
|
+
about #{Helpers::Text.bold('_in_')} and #{Helpers::Text.bold('_out_')}.
|
119
|
+
DESC
|
120
|
+
tree = _pry_.binding_stack.map { |b| Pry.view_clip(b.eval('self')) }
|
121
|
+
format(
|
122
|
+
"[%<in_count>s] (%<name>s) %<tree>s: %<stack_size>s%<separator>s ",
|
123
|
+
in_count: _pry_.input_ring.count,
|
124
|
+
name: prompt_name(_pry_.config.prompt_name),
|
125
|
+
tree: tree.join(' / '),
|
126
|
+
stack_size: _pry_.binding_stack.size - 1,
|
127
|
+
separator: sep
|
128
|
+
)
|
129
|
+
end
|
130
|
+
|
131
|
+
add(:shell, <<DESC, %w[$ *]) do |context, nesting, _pry_, sep|
|
132
|
+
A prompt that displays `$PWD` as you change it.
|
133
|
+
DESC
|
134
|
+
format(
|
135
|
+
"%<name>s %<context>s:%<pwd>s %<separator>s ",
|
136
|
+
name: prompt_name(_pry_.config.prompt_name),
|
137
|
+
context: Pry.view_clip(context),
|
138
|
+
pwd: Dir.pwd,
|
139
|
+
separator: sep
|
140
|
+
)
|
141
|
+
end
|
142
|
+
|
143
|
+
add(:none, 'Wave goodbye to the Pry prompt.', Array.new(2)) { '' }
|
144
|
+
end
|
26
145
|
end
|