pry 0.10.4 → 0.11.0.pre
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 +4 -4
- data/CHANGELOG.md +45 -18
- data/LICENSE +1 -1
- data/README.md +28 -26
- data/bin/pry +3 -7
- data/lib/pry.rb +3 -2
- data/lib/pry/basic_object.rb +6 -0
- data/lib/pry/cli.rb +39 -34
- data/lib/pry/code.rb +6 -1
- data/lib/pry/code/code_file.rb +8 -2
- data/lib/pry/code_object.rb +23 -0
- data/lib/pry/color_printer.rb +11 -8
- data/lib/pry/command.rb +40 -16
- data/lib/pry/command_set.rb +9 -2
- data/lib/pry/commands/cat/exception_formatter.rb +11 -10
- data/lib/pry/commands/cat/file_formatter.rb +7 -3
- data/lib/pry/commands/code_collector.rb +16 -14
- data/lib/pry/commands/easter_eggs.rb +9 -9
- data/lib/pry/commands/edit.rb +6 -2
- data/lib/pry/commands/edit/file_and_line_locator.rb +1 -1
- data/lib/pry/commands/find_method.rb +1 -1
- data/lib/pry/commands/gem_open.rb +1 -1
- data/lib/pry/commands/gem_readme.rb +25 -0
- data/lib/pry/commands/gem_search.rb +40 -0
- data/lib/pry/commands/hist.rb +2 -2
- data/lib/pry/commands/jump_to.rb +7 -7
- data/lib/pry/commands/ls/formatter.rb +1 -0
- data/lib/pry/commands/ls/jruby_hacks.rb +2 -2
- data/lib/pry/commands/ls/self_methods.rb +2 -0
- data/lib/pry/commands/play.rb +2 -2
- data/lib/pry/commands/reload_code.rb +2 -2
- data/lib/pry/commands/ri.rb +4 -0
- data/lib/pry/commands/shell_command.rb +34 -8
- data/lib/pry/commands/show_info.rb +10 -2
- data/lib/pry/commands/watch_expression/expression.rb +1 -1
- data/lib/pry/commands/whereami.rb +6 -6
- data/lib/pry/config.rb +3 -16
- data/lib/pry/config/behavior.rb +139 -49
- data/lib/pry/config/default.rb +21 -33
- data/lib/pry/config/lazy.rb +25 -0
- data/lib/pry/editor.rb +1 -1
- data/lib/pry/exceptions.rb +1 -1
- data/lib/pry/helpers/base_helpers.rb +6 -10
- data/lib/pry/helpers/documentation_helpers.rb +1 -0
- data/lib/pry/helpers/options_helpers.rb +1 -1
- data/lib/pry/helpers/text.rb +69 -76
- data/lib/pry/history.rb +22 -1
- data/lib/pry/history_array.rb +1 -1
- data/lib/pry/hooks.rb +48 -107
- data/lib/pry/indent.rb +6 -2
- data/lib/pry/input_completer.rb +118 -118
- data/lib/pry/method.rb +13 -13
- data/lib/pry/method/disowned.rb +1 -0
- data/lib/pry/method/patcher.rb +0 -3
- data/lib/pry/output.rb +37 -38
- data/lib/pry/pager.rb +11 -8
- data/lib/pry/plugins.rb +20 -5
- data/lib/pry/pry_class.rb +29 -3
- data/lib/pry/pry_instance.rb +8 -6
- data/lib/pry/repl.rb +37 -5
- data/lib/pry/repl_file_loader.rb +1 -1
- data/lib/pry/rubygem.rb +3 -1
- data/lib/pry/slop.rb +661 -0
- data/lib/pry/slop/LICENSE +20 -0
- data/lib/pry/slop/commands.rb +196 -0
- data/lib/pry/slop/option.rb +208 -0
- data/lib/pry/terminal.rb +16 -5
- data/lib/pry/test/helper.rb +11 -2
- data/lib/pry/version.rb +1 -1
- data/lib/pry/wrapped_module.rb +5 -5
- data/lib/pry/{module_candidate.rb → wrapped_module/candidate.rb} +2 -4
- metadata +14 -20
data/lib/pry/config/default.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
class Pry::Config::Default
|
2
2
|
include Pry::Config::Behavior
|
3
|
+
include Pry::Config::Lazy
|
3
4
|
|
4
|
-
|
5
|
+
lazy_implement({
|
5
6
|
input: proc {
|
6
7
|
lazy_readline
|
7
8
|
},
|
8
9
|
output: proc {
|
9
|
-
$stdout
|
10
|
+
$stdout.tap { |out| out.sync = true }
|
10
11
|
},
|
11
12
|
commands: proc {
|
12
13
|
Pry::Commands
|
@@ -110,43 +111,30 @@ class Pry::Config::Default
|
|
110
111
|
completer: proc {
|
111
112
|
require "pry/input_completer"
|
112
113
|
Pry::InputCompleter
|
114
|
+
},
|
115
|
+
gist: proc {
|
116
|
+
Pry::Config.from_hash({inspecter: proc(&:pretty_inspect)}, nil)
|
117
|
+
},
|
118
|
+
history: proc {
|
119
|
+
Pry::Config.from_hash({should_save: true, should_load: true}, nil).tap do |history|
|
120
|
+
history.file = File.expand_path("~/.pry_history") rescue nil
|
121
|
+
if history.file.nil?
|
122
|
+
self.should_load_rc = false
|
123
|
+
history.should_save = false
|
124
|
+
history.should_load = false
|
125
|
+
end
|
126
|
+
end
|
127
|
+
},
|
128
|
+
exec_string: proc {
|
129
|
+
""
|
113
130
|
}
|
114
|
-
}
|
131
|
+
})
|
115
132
|
|
116
133
|
def initialize
|
117
134
|
super(nil)
|
118
|
-
configure_gist
|
119
|
-
configure_history
|
120
|
-
end
|
121
|
-
|
122
|
-
default.each do |key, value|
|
123
|
-
define_method(key) do
|
124
|
-
if default[key].equal?(value)
|
125
|
-
default[key] = instance_eval(&value)
|
126
|
-
end
|
127
|
-
default[key]
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
private
|
132
|
-
# TODO:
|
133
|
-
# all of this configure_* stuff is a relic of old code.
|
134
|
-
# we should try move this code to being command-local.
|
135
|
-
def configure_gist
|
136
|
-
self["gist"] = Pry::Config.from_hash(inspecter: proc(&:pretty_inspect))
|
137
|
-
end
|
138
|
-
|
139
|
-
def configure_history
|
140
|
-
self["history"] = Pry::Config.from_hash "should_save" => true,
|
141
|
-
"should_load" => true
|
142
|
-
history.file = File.expand_path("~/.pry_history") rescue nil
|
143
|
-
if history.file.nil?
|
144
|
-
self.should_load_rc = false
|
145
|
-
history.should_save = false
|
146
|
-
history.should_load = false
|
147
|
-
end
|
148
135
|
end
|
149
136
|
|
137
|
+
private
|
150
138
|
def lazy_readline
|
151
139
|
require 'readline'
|
152
140
|
Readline
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Pry::Config::Lazy
|
2
|
+
LAZY_KEYS = Hash.new {|h,k| h[k] = [] }
|
3
|
+
|
4
|
+
module ClassMethods
|
5
|
+
def lazy_implement(method_name_to_func)
|
6
|
+
method_name_to_func.each do |method_name, func|
|
7
|
+
define_method(method_name) do
|
8
|
+
if method_name_to_func[method_name].equal?(func)
|
9
|
+
method_name_to_func[method_name] = instance_eval(&func)
|
10
|
+
end
|
11
|
+
method_name_to_func[method_name]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
LAZY_KEYS[self] |= method_name_to_func.keys
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.included(includer)
|
19
|
+
includer.extend(ClassMethods)
|
20
|
+
end
|
21
|
+
|
22
|
+
def lazy_keys
|
23
|
+
LAZY_KEYS[self.class]
|
24
|
+
end
|
25
|
+
end
|
data/lib/pry/editor.rb
CHANGED
data/lib/pry/exceptions.rb
CHANGED
@@ -32,7 +32,7 @@ class Pry
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def not_a_real_file?(file)
|
35
|
-
file =~
|
35
|
+
file =~ /^(\(.*\))$|^<.*>$/ || file =~ /__unknown__/ || file == "" || file == "-e"
|
36
36
|
end
|
37
37
|
|
38
38
|
def command_dependencies_met?(options)
|
@@ -94,19 +94,15 @@ class Pry
|
|
94
94
|
mri? && RUBY_VERSION =~ /^2/
|
95
95
|
end
|
96
96
|
|
97
|
-
def mri_20?
|
98
|
-
mri? && RUBY_VERSION =~ /^2\.0/
|
99
|
-
end
|
100
|
-
|
101
|
-
def mri_21?
|
102
|
-
mri? && RUBY_VERSION =~ /^2\.1/
|
103
|
-
end
|
104
|
-
|
105
97
|
# Send the given text through the best available pager (if Pry.config.pager is
|
106
98
|
# enabled). Infers where to send the output if used as a mixin.
|
107
99
|
# DEPRECATED.
|
108
100
|
def stagger_output(text, out = nil)
|
109
|
-
|
101
|
+
if _pry_
|
102
|
+
_pry_.pager.page text
|
103
|
+
else
|
104
|
+
Pry.new.pager.page text
|
105
|
+
end
|
110
106
|
end
|
111
107
|
end
|
112
108
|
end
|
@@ -12,6 +12,7 @@ class Pry
|
|
12
12
|
comment.gsub(/<code>(?:\s*\n)?(.*?)\s*<\/code>/m) { CodeRay.scan($1, :ruby).term }.
|
13
13
|
gsub(/<em>(?:\s*\n)?(.*?)\s*<\/em>/m) { "\e[1m#{$1}\e[0m" }.
|
14
14
|
gsub(/<i>(?:\s*\n)?(.*?)\s*<\/i>/m) { "\e[1m#{$1}\e[0m" }.
|
15
|
+
gsub(/<tt>(?:\s*\n)?(.*?)\s*<\/tt>/m) { CodeRay.scan($1, :ruby).term }.
|
15
16
|
gsub(/\B\+(\w+?)\+\B/) { "\e[32m#{$1}\e[0m" }.
|
16
17
|
gsub(/((?:^[ \t]+.+(?:\n+|\Z))+)/) { CodeRay.scan($1, :ruby).term }.
|
17
18
|
gsub(/`(?:\s*\n)?([^\e]*?)\s*`/) { "`#{CodeRay.scan($1, :ruby).term}`" }
|
data/lib/pry/helpers/text.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
class Pry
|
2
2
|
module Helpers
|
3
|
-
|
4
3
|
# The methods defined on {Text} are available to custom commands via {Pry::Command#text}.
|
5
4
|
module Text
|
6
|
-
|
5
|
+
extend self
|
7
6
|
COLORS =
|
8
7
|
{
|
9
8
|
"black" => 0,
|
@@ -17,91 +16,85 @@ class Pry
|
|
17
16
|
"white" => 7
|
18
17
|
}
|
19
18
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
define_method color do |text|
|
24
|
-
"\033[0;#{30+value}m#{text}\033[0m"
|
25
|
-
end
|
26
|
-
|
27
|
-
define_method "bright_#{color}" do |text|
|
28
|
-
"\033[1;#{30+value}m#{text}\033[0m"
|
29
|
-
end
|
19
|
+
COLORS.each_pair do |color, value|
|
20
|
+
define_method color do |text|
|
21
|
+
"\001\033[0;#{30+value}m\002#{text}\001\033[0m\002"
|
30
22
|
end
|
31
23
|
|
32
|
-
#
|
33
|
-
|
34
|
-
# @param [String, #to_s] text
|
35
|
-
# @return [String] _text_ stripped of any color codes.
|
36
|
-
def strip_color(text)
|
37
|
-
text.to_s.gsub(/\e\[.*?(\d)+m/ , '')
|
24
|
+
define_method "bright_#{color}" do |text|
|
25
|
+
"\001\033[1;#{30+value}m\002#{text}\001\033[0m\002"
|
38
26
|
end
|
27
|
+
end
|
39
28
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
29
|
+
# Remove any color codes from _text_.
|
30
|
+
#
|
31
|
+
# @param [String, #to_s] text
|
32
|
+
# @return [String] _text_ stripped of any color codes.
|
33
|
+
def strip_color(text)
|
34
|
+
text.to_s.gsub(/(\001)?\e\[.*?(\d)+m(\002)?/ , '')
|
35
|
+
end
|
47
36
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
end
|
56
|
-
alias_method :bright_default, :bold
|
37
|
+
# Returns _text_ as bold text for use on a terminal.
|
38
|
+
#
|
39
|
+
# @param [String, #to_s] text
|
40
|
+
# @return [String] _text_
|
41
|
+
def bold(text)
|
42
|
+
"\e[1m#{text}\e[0m"
|
43
|
+
end
|
57
44
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
end
|
45
|
+
# Returns `text` in the default foreground colour.
|
46
|
+
# Use this instead of "black" or "white" when you mean absence of colour.
|
47
|
+
#
|
48
|
+
# @param [String, #to_s] text
|
49
|
+
# @return [String]
|
50
|
+
def default(text)
|
51
|
+
text.to_s
|
52
|
+
end
|
53
|
+
alias_method :bright_default, :bold
|
68
54
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
55
|
+
# Executes the block with `Pry.config.color` set to false.
|
56
|
+
# @yield
|
57
|
+
# @return [void]
|
58
|
+
def no_color(&block)
|
59
|
+
boolean = Pry.config.color
|
60
|
+
Pry.config.color = false
|
61
|
+
yield
|
62
|
+
ensure
|
63
|
+
Pry.config.color = boolean
|
64
|
+
end
|
79
65
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
"#{self.send(color, adjusted_index)}: #{line}"
|
91
|
-
end.join
|
92
|
-
end
|
66
|
+
# Executes the block with `Pry.config.pager` set to false.
|
67
|
+
# @yield
|
68
|
+
# @return [void]
|
69
|
+
def no_pager(&block)
|
70
|
+
boolean = Pry.config.pager
|
71
|
+
Pry.config.pager = false
|
72
|
+
yield
|
73
|
+
ensure
|
74
|
+
Pry.config.pager = boolean
|
75
|
+
end
|
93
76
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
77
|
+
# Returns _text_ in a numbered list, beginning at _offset_.
|
78
|
+
#
|
79
|
+
# @param [#each_line] text
|
80
|
+
# @param [Fixnum] offset
|
81
|
+
# @return [String]
|
82
|
+
def with_line_numbers(text, offset, color=:blue)
|
83
|
+
lines = text.each_line.to_a
|
84
|
+
max_width = (offset + lines.count).to_s.length
|
85
|
+
lines.each_with_index.map do |line, index|
|
86
|
+
adjusted_index = (index + offset).to_s.rjust(max_width)
|
87
|
+
"#{self.send(color, adjusted_index)}: #{line}"
|
88
|
+
end.join
|
101
89
|
end
|
102
90
|
|
91
|
+
# Returns _text_ indented by _chars_ spaces.
|
92
|
+
#
|
93
|
+
# @param [String] text
|
94
|
+
# @param [Fixnum] chars
|
95
|
+
def indent(text, chars)
|
96
|
+
text.lines.map { |l| "#{' ' * chars}#{l}" }.join
|
97
|
+
end
|
103
98
|
end
|
104
|
-
|
105
99
|
end
|
106
100
|
end
|
107
|
-
|
data/lib/pry/history.rb
CHANGED
@@ -47,7 +47,9 @@ class Pry
|
|
47
47
|
unless line.empty? || (@history.last && line == @history.last)
|
48
48
|
@pusher.call(line)
|
49
49
|
@history << line
|
50
|
-
|
50
|
+
if !should_ignore?(line) && Pry.config.history.should_save
|
51
|
+
@saver.call(line)
|
52
|
+
end
|
51
53
|
end
|
52
54
|
line
|
53
55
|
end
|
@@ -57,6 +59,7 @@ class Pry
|
|
57
59
|
# history file.
|
58
60
|
def clear
|
59
61
|
@clearer.call
|
62
|
+
@original_lines = 0
|
60
63
|
@history = []
|
61
64
|
end
|
62
65
|
|
@@ -77,8 +80,26 @@ class Pry
|
|
77
80
|
@history.dup
|
78
81
|
end
|
79
82
|
|
83
|
+
# Filter the history with the histignore options
|
84
|
+
# @return [Array<String>] An array containing all the lines that are not
|
85
|
+
# included in the histignore.
|
86
|
+
def filter(history)
|
87
|
+
history.select { |l| l unless should_ignore?(l) }
|
88
|
+
end
|
89
|
+
|
80
90
|
private
|
81
91
|
|
92
|
+
# Check if the line match any option in the histignore
|
93
|
+
# [Pry.config.history.histignore]
|
94
|
+
# @return [Boolean] a boolean that notifies if the line was found in the
|
95
|
+
# histignore array.
|
96
|
+
def should_ignore?(line)
|
97
|
+
hist_ignore = Pry.config.history.histignore
|
98
|
+
return false if hist_ignore.nil? || hist_ignore.empty?
|
99
|
+
|
100
|
+
hist_ignore.any? { |p| line.to_s.match(p) }
|
101
|
+
end
|
102
|
+
|
82
103
|
# The default loader. Yields lines from `Pry.history.config.file`.
|
83
104
|
def read_from_file
|
84
105
|
path = history_file_path
|
data/lib/pry/history_array.rb
CHANGED
data/lib/pry/hooks.rb
CHANGED
@@ -1,36 +1,20 @@
|
|
1
1
|
class Pry
|
2
|
-
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
2
|
+
# Implements a hooks system for Pry. A hook is a callable that is associated
|
3
|
+
# with an event. A number of events are currently provided by Pry, these
|
4
|
+
# include: `:when_started`, `:before_session`, `:after_session`. A hook must
|
5
|
+
# have a name, and is connected with an event by the `Pry::Hooks#add_hook`
|
6
|
+
# method.
|
7
|
+
#
|
8
8
|
# @example Adding a hook for the `:before_session` event.
|
9
9
|
# Pry.config.hooks.add_hook(:before_session, :say_hi) do
|
10
10
|
# puts "hello"
|
11
11
|
# end
|
12
12
|
class Hooks
|
13
|
-
|
14
|
-
# Converts a hash to a `Pry::Hooks` instance. All hooks defined
|
15
|
-
# this way are anonymous. This functionality is primarily to
|
16
|
-
# provide backwards-compatibility with the old hash-based hook
|
17
|
-
# system in Pry versions < 0.9.8
|
18
|
-
# @param [Hash] hash The hash to convert to `Pry::Hooks`.
|
19
|
-
# @return [Pry::Hooks] The resulting `Pry::Hooks` instance.
|
20
|
-
def self.from_hash(hash)
|
21
|
-
return hash if hash.instance_of?(self)
|
22
|
-
instance = new
|
23
|
-
hash.each do |k, v|
|
24
|
-
instance.add_hook(k, nil, v)
|
25
|
-
end
|
26
|
-
instance
|
27
|
-
end
|
28
|
-
|
29
13
|
def initialize
|
30
|
-
@hooks = {}
|
14
|
+
@hooks = Hash.new { |h, k| h[k] = [] }
|
31
15
|
end
|
32
16
|
|
33
|
-
# Ensure that duplicates have their @hooks object
|
17
|
+
# Ensure that duplicates have their @hooks object.
|
34
18
|
def initialize_copy(orig)
|
35
19
|
hooks_dup = @hooks.dup
|
36
20
|
@hooks.each do |k, v|
|
@@ -40,63 +24,49 @@ class Pry
|
|
40
24
|
@hooks = hooks_dup
|
41
25
|
end
|
42
26
|
|
43
|
-
def hooks
|
44
|
-
@hooks
|
45
|
-
end
|
46
|
-
protected :hooks
|
47
|
-
|
48
27
|
def errors
|
49
28
|
@errors ||= []
|
50
29
|
end
|
51
30
|
|
52
31
|
# Destructively merge the contents of two `Pry:Hooks` instances.
|
32
|
+
#
|
53
33
|
# @param [Pry::Hooks] other The `Pry::Hooks` instance to merge
|
54
|
-
# @return [Pry:Hooks]
|
55
|
-
# @
|
56
|
-
# hooks = Pry::Hooks.new.add_hook(:before_session, :say_hi) { puts "hi!" }
|
57
|
-
# Pry::Hooks.new.merge!(hooks)
|
34
|
+
# @return [Pry:Hooks] The receiver.
|
35
|
+
# @see {#merge}
|
58
36
|
def merge!(other)
|
59
|
-
@hooks.merge!(other.dup.hooks) do |key,
|
60
|
-
|
61
|
-
end
|
37
|
+
@hooks.merge!(other.dup.hooks) do |key, array, other_array|
|
38
|
+
temp_hash, output = {}, []
|
62
39
|
|
63
|
-
|
64
|
-
|
40
|
+
(array + other_array).reverse_each do |pair|
|
41
|
+
temp_hash[pair.first] ||= output.unshift(pair)
|
42
|
+
end
|
65
43
|
|
66
|
-
|
67
|
-
|
68
|
-
end
|
69
|
-
private :merge_arrays
|
44
|
+
output
|
45
|
+
end
|
70
46
|
|
71
|
-
|
72
|
-
hash, output = {}, []
|
73
|
-
input.reverse.each{ |i| hash[block[i]] ||= (output.unshift i) }
|
74
|
-
output
|
47
|
+
self
|
75
48
|
end
|
76
|
-
private :uniq_keeping_last
|
77
49
|
|
78
|
-
# Return a new `Pry::Hooks` instance containing a merge of the contents of two `Pry:Hooks` instances,
|
79
|
-
# @param [Pry::Hooks] other The `Pry::Hooks` instance to merge
|
80
|
-
# @return [Pry::Hooks] The new hash.
|
81
50
|
# @example
|
82
51
|
# hooks = Pry::Hooks.new.add_hook(:before_session, :say_hi) { puts "hi!" }
|
83
52
|
# Pry::Hooks.new.merge(hooks)
|
53
|
+
# @param [Pry::Hooks] other The `Pry::Hooks` instance to merge
|
54
|
+
# @return [Pry::Hooks] a new `Pry::Hooks` instance containing a merge of the
|
55
|
+
# contents of two `Pry:Hooks` instances.
|
84
56
|
def merge(other)
|
85
57
|
self.dup.tap do |v|
|
86
58
|
v.merge!(other)
|
87
59
|
end
|
88
60
|
end
|
89
61
|
|
90
|
-
# Add a new hook to be executed for the `
|
62
|
+
# Add a new hook to be executed for the `event_name` event.
|
91
63
|
# @param [Symbol] event_name The name of the event.
|
92
64
|
# @param [Symbol] hook_name The name of the hook.
|
93
65
|
# @param [#call] callable The callable.
|
94
|
-
# @yield The block to use as the callable (if `callable`
|
95
|
-
# @return [Pry:Hooks]
|
96
|
-
# @example
|
97
|
-
# Pry::Hooks.new.add_hook(:before_session, :say_hi) { puts "hi!" }
|
66
|
+
# @yield The block to use as the callable (if no `callable` provided).
|
67
|
+
# @return [Pry:Hooks] The receiver.
|
98
68
|
def add_hook(event_name, hook_name, callable=nil, &block)
|
99
|
-
|
69
|
+
event_name = event_name.to_s
|
100
70
|
|
101
71
|
# do not allow duplicates, but allow multiple `nil` hooks
|
102
72
|
# (anonymous hooks)
|
@@ -124,13 +94,8 @@ class Pry
|
|
124
94
|
# @param [Symbol] event_name The name of the event.
|
125
95
|
# @param [Array] args The arguments to pass to each hook function.
|
126
96
|
# @return [Object] The return value of the last executed hook.
|
127
|
-
# @example
|
128
|
-
# my_hooks = Pry::Hooks.new.add_hook(:before_session, :say_hi) { puts "hi!" }
|
129
|
-
# my_hooks.exec_hook(:before_session) #=> OUTPUT: "hi!"
|
130
97
|
def exec_hook(event_name, *args, &block)
|
131
|
-
@hooks[event_name]
|
132
|
-
|
133
|
-
@hooks[event_name].map do |hook_name, callable|
|
98
|
+
@hooks[event_name.to_s].map do |hook_name, callable|
|
134
99
|
begin
|
135
100
|
callable.call(*args, &block)
|
136
101
|
rescue RescuableException => e
|
@@ -140,56 +105,38 @@ class Pry
|
|
140
105
|
end.last
|
141
106
|
end
|
142
107
|
|
143
|
-
# Return the number of hook functions registered for the `event_name` event.
|
144
108
|
# @param [Symbol] event_name The name of the event.
|
145
109
|
# @return [Fixnum] The number of hook functions for `event_name`.
|
146
|
-
# @example
|
147
|
-
# my_hooks = Pry::Hooks.new.add_hook(:before_session, :say_hi) { puts "hi!" }
|
148
|
-
# my_hooks.count(:before_session) #=> 1
|
149
110
|
def hook_count(event_name)
|
150
|
-
@hooks[event_name]
|
151
|
-
@hooks[event_name].size
|
111
|
+
@hooks[event_name.to_s].size
|
152
112
|
end
|
153
113
|
|
154
|
-
# Return a specific hook for a given event.
|
155
114
|
# @param [Symbol] event_name The name of the event.
|
156
115
|
# @param [Symbol] hook_name The name of the hook
|
157
|
-
# @return [#call]
|
158
|
-
# @example
|
159
|
-
# my_hooks = Pry::Hooks.new.add_hook(:before_session, :say_hi) { puts "hi!" }
|
160
|
-
# my_hooks.get_hook(:before_session, :say_hi).call #=> "hi!"
|
116
|
+
# @return [#call] a specific hook for a given event.
|
161
117
|
def get_hook(event_name, hook_name)
|
162
|
-
@hooks[event_name]
|
163
|
-
|
118
|
+
hook = @hooks[event_name.to_s].find do |current_hook_name, callable|
|
119
|
+
current_hook_name == hook_name
|
120
|
+
end
|
164
121
|
hook.last if hook
|
165
122
|
end
|
166
123
|
|
167
|
-
# Return the hash of hook names / hook functions for a
|
168
|
-
# given event. (Note that modifying the returned hash does not
|
169
|
-
# alter the hooks, use add_hook/delete_hook for that).
|
170
124
|
# @param [Symbol] event_name The name of the event.
|
171
125
|
# @return [Hash] The hash of hook names / hook functions.
|
172
|
-
# @
|
173
|
-
#
|
174
|
-
# my_hooks.get_hooks(:before_session) #=> {:say_hi=>#<Proc:0x00000101645e18@(pry):9>}
|
126
|
+
# @note Modifying the returned hash does not alter the hooks, use
|
127
|
+
# `add_hook`/`delete_hook` for that.
|
175
128
|
def get_hooks(event_name)
|
176
|
-
@hooks[event_name]
|
177
|
-
Hash[@hooks[event_name]]
|
129
|
+
Hash[@hooks[event_name.to_s]]
|
178
130
|
end
|
179
131
|
|
180
|
-
# Delete a hook for an event.
|
181
132
|
# @param [Symbol] event_name The name of the event.
|
182
133
|
# @param [Symbol] hook_name The name of the hook.
|
183
134
|
# to delete.
|
184
135
|
# @return [#call] The deleted hook.
|
185
|
-
# @example
|
186
|
-
# my_hooks = Pry::Hooks.new.add_hook(:before_session, :say_hi) { puts "hi!" }
|
187
|
-
# my_hooks.delete_hook(:before_session, :say_hi)
|
188
136
|
def delete_hook(event_name, hook_name)
|
189
|
-
@hooks[event_name] ||= []
|
190
137
|
deleted_callable = nil
|
191
138
|
|
192
|
-
@hooks[event_name].delete_if do |current_hook_name, callable|
|
139
|
+
@hooks[event_name.to_s].delete_if do |current_hook_name, callable|
|
193
140
|
if current_hook_name == hook_name
|
194
141
|
deleted_callable = callable
|
195
142
|
true
|
@@ -201,30 +148,24 @@ class Pry
|
|
201
148
|
end
|
202
149
|
|
203
150
|
# Clear all hooks functions for a given event.
|
151
|
+
#
|
204
152
|
# @param [String] event_name The name of the event.
|
205
|
-
# @
|
206
|
-
|
207
|
-
|
208
|
-
def delete_hooks(event_name)
|
209
|
-
@hooks[event_name] = []
|
210
|
-
end
|
211
|
-
|
212
|
-
alias_method :clear, :delete_hooks
|
213
|
-
|
214
|
-
# Remove all events and hooks, clearing out the Pry::Hooks
|
215
|
-
# instance completely.
|
216
|
-
# @example
|
217
|
-
# my_hooks = Pry::Hooks.new.add_hook(:before_session, :say_hi) { puts "hi!" }
|
218
|
-
# my_hooks.clear_all
|
219
|
-
def clear_all
|
220
|
-
@hooks = {}
|
153
|
+
# @return [void]
|
154
|
+
def clear_event_hooks(event_name)
|
155
|
+
@hooks[event_name.to_s] = []
|
221
156
|
end
|
222
157
|
|
223
158
|
# @param [Symbol] event_name Name of the event.
|
224
159
|
# @param [Symbol] hook_name Name of the hook.
|
225
|
-
# @return [Boolean] Whether the hook by the name `hook_name
|
160
|
+
# @return [Boolean] Whether the hook by the name `hook_name`.
|
226
161
|
def hook_exists?(event_name, hook_name)
|
227
|
-
|
162
|
+
@hooks[event_name.to_s].map(&:first).include?(hook_name)
|
163
|
+
end
|
164
|
+
|
165
|
+
protected
|
166
|
+
|
167
|
+
def hooks
|
168
|
+
@hooks
|
228
169
|
end
|
229
170
|
end
|
230
171
|
end
|