pry 0.11.3 → 0.12.0
Sign up to get free protection for your applications and to get access to all the features.
- 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 +17 -29
- 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
|