pry 0.6.7pre4-i386-mingw32 → 0.6.8-i386-mingw32
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.
- data/CHANGELOG +88 -75
- data/LICENSE +25 -25
- data/README.markdown +321 -309
- data/Rakefile +103 -103
- data/bin/pry +83 -82
- data/examples/example_basic.rb +17 -17
- data/examples/example_command_override.rb +35 -35
- data/examples/example_commands.rb +39 -39
- data/examples/example_hooks.rb +12 -12
- data/examples/example_image_edit.rb +71 -71
- data/examples/example_input.rb +10 -10
- data/examples/example_input2.rb +32 -32
- data/examples/example_output.rb +14 -14
- data/examples/example_print.rb +9 -9
- data/examples/example_prompt.rb +12 -12
- data/lib/pry.rb +32 -32
- data/lib/pry/command_base.rb +150 -150
- data/lib/pry/commands.rb +616 -577
- data/lib/pry/completion.rb +202 -202
- data/lib/pry/core_extensions.rb +55 -55
- data/lib/pry/hooks.rb +19 -8
- data/lib/pry/print.rb +19 -19
- data/lib/pry/prompts.rb +26 -26
- data/lib/pry/pry_class.rb +219 -186
- data/lib/pry/pry_instance.rb +316 -316
- data/lib/pry/version.rb +3 -3
- data/test/test.rb +725 -681
- data/test/test_helper.rb +46 -38
- data/test/testrc +2 -0
- metadata +102 -66
data/lib/pry/completion.rb
CHANGED
@@ -1,202 +1,202 @@
|
|
1
|
-
# taken from irb
|
2
|
-
|
3
|
-
require "readline"
|
4
|
-
|
5
|
-
class Pry
|
6
|
-
|
7
|
-
# Implements tab completion for Readline in Pry
|
8
|
-
module InputCompleter
|
9
|
-
|
10
|
-
if Readline.respond_to?("basic_word_break_characters=")
|
11
|
-
Readline.basic_word_break_characters= " \t\n\"\\'`><=;|&{("
|
12
|
-
end
|
13
|
-
|
14
|
-
Readline.completion_append_character = nil
|
15
|
-
|
16
|
-
ReservedWords = [
|
17
|
-
"BEGIN", "END",
|
18
|
-
"alias", "and",
|
19
|
-
"begin", "break",
|
20
|
-
"case", "class",
|
21
|
-
"def", "defined", "do",
|
22
|
-
"else", "elsif", "end", "ensure",
|
23
|
-
"false", "for",
|
24
|
-
"if", "in",
|
25
|
-
"module",
|
26
|
-
"next", "nil", "not",
|
27
|
-
"or",
|
28
|
-
"redo", "rescue", "retry", "return",
|
29
|
-
"self", "super",
|
30
|
-
"then", "true",
|
31
|
-
"undef", "unless", "until",
|
32
|
-
"when", "while",
|
33
|
-
"yield",
|
34
|
-
]
|
35
|
-
|
36
|
-
Operators = ["%", "&", "*", "**", "+", "-", "/",
|
37
|
-
"<", "<<", "<=", "<=>", "==", "===", "=~", ">", ">=", ">>",
|
38
|
-
"[]", "[]=", "^", "!", "!=", "!~"]
|
39
|
-
|
40
|
-
# Return a new completion proc for use by Readline.
|
41
|
-
# @param [Binding] target The current binding context.
|
42
|
-
# @param [Array<String>] commands The array of Pry commands.
|
43
|
-
def self.build_completion_proc(target, commands=[""])
|
44
|
-
proc do |input|
|
45
|
-
bind = target
|
46
|
-
|
47
|
-
case input
|
48
|
-
when /^(\/[^\/]*\/)\.([^.]*)$/
|
49
|
-
# Regexp
|
50
|
-
receiver = $1
|
51
|
-
message = Regexp.quote($2)
|
52
|
-
|
53
|
-
candidates = Regexp.instance_methods.collect{|m| m.to_s}
|
54
|
-
select_message(receiver, message, candidates)
|
55
|
-
|
56
|
-
when /^([^\]]*\])\.([^.]*)$/
|
57
|
-
# Array
|
58
|
-
receiver = $1
|
59
|
-
message = Regexp.quote($2)
|
60
|
-
|
61
|
-
candidates = Array.instance_methods.collect{|m| m.to_s}
|
62
|
-
select_message(receiver, message, candidates)
|
63
|
-
|
64
|
-
when /^([^\}]*\})\.([^.]*)$/
|
65
|
-
# Proc or Hash
|
66
|
-
receiver = $1
|
67
|
-
message = Regexp.quote($2)
|
68
|
-
|
69
|
-
candidates = Proc.instance_methods.collect{|m| m.to_s}
|
70
|
-
candidates |= Hash.instance_methods.collect{|m| m.to_s}
|
71
|
-
select_message(receiver, message, candidates)
|
72
|
-
|
73
|
-
when /^(:[^:.]*)$/
|
74
|
-
# Symbol
|
75
|
-
if Symbol.respond_to?(:all_symbols)
|
76
|
-
sym = $1
|
77
|
-
candidates = Symbol.all_symbols.collect{|s| ":" + s.id2name}
|
78
|
-
candidates.grep(/^#{sym}/)
|
79
|
-
else
|
80
|
-
[]
|
81
|
-
end
|
82
|
-
|
83
|
-
when /^::([A-Z][^:\.\(]*)$/
|
84
|
-
# Absolute Constant or class methods
|
85
|
-
receiver = $1
|
86
|
-
candidates = Object.constants.collect{|m| m.to_s}
|
87
|
-
candidates.grep(/^#{receiver}/).collect{|e| "::" + e}
|
88
|
-
|
89
|
-
when /^([A-Z].*)::([^:.]*)$/
|
90
|
-
# Constant or class methods
|
91
|
-
receiver = $1
|
92
|
-
message = Regexp.quote($2)
|
93
|
-
begin
|
94
|
-
candidates = eval("#{receiver}.constants.collect{|m| m.to_s}", bind)
|
95
|
-
candidates |= eval("#{receiver}.methods.collect{|m| m.to_s}", bind)
|
96
|
-
rescue Exception
|
97
|
-
candidates = []
|
98
|
-
end
|
99
|
-
candidates.grep(/^#{message}/).collect{|e| receiver + "::" + e}
|
100
|
-
|
101
|
-
when /^(:[^:.]+)\.([^.]*)$/
|
102
|
-
# Symbol
|
103
|
-
receiver = $1
|
104
|
-
message = Regexp.quote($2)
|
105
|
-
|
106
|
-
candidates = Symbol.instance_methods.collect{|m| m.to_s}
|
107
|
-
select_message(receiver, message, candidates)
|
108
|
-
|
109
|
-
when /^(-?(0[dbo])?[0-9_]+(\.[0-9_]+)?([eE]-?[0-9]+)?)\.([^.]*)$/
|
110
|
-
# Numeric
|
111
|
-
receiver = $1
|
112
|
-
message = Regexp.quote($5)
|
113
|
-
|
114
|
-
begin
|
115
|
-
candidates = eval(receiver, bind).methods.collect{|m| m.to_s}
|
116
|
-
rescue Exception
|
117
|
-
candidates = []
|
118
|
-
end
|
119
|
-
select_message(receiver, message, candidates)
|
120
|
-
|
121
|
-
when /^(-?0x[0-9a-fA-F_]+)\.([^.]*)$/
|
122
|
-
# Numeric(0xFFFF)
|
123
|
-
receiver = $1
|
124
|
-
message = Regexp.quote($2)
|
125
|
-
|
126
|
-
begin
|
127
|
-
candidates = eval(receiver, bind).methods.collect{|m| m.to_s}
|
128
|
-
rescue Exception
|
129
|
-
candidates = []
|
130
|
-
end
|
131
|
-
select_message(receiver, message, candidates)
|
132
|
-
|
133
|
-
when /^(\$[^.]*)$/
|
134
|
-
regmessage = Regexp.new(Regexp.quote($1))
|
135
|
-
candidates = global_variables.collect{|m| m.to_s}.grep(regmessage)
|
136
|
-
|
137
|
-
when /^([^."].*)\.([^.]*)$/
|
138
|
-
# variable
|
139
|
-
receiver = $1
|
140
|
-
message = Regexp.quote($2)
|
141
|
-
|
142
|
-
gv = eval("global_variables", bind).collect{|m| m.to_s}
|
143
|
-
lv = eval("local_variables", bind).collect{|m| m.to_s}
|
144
|
-
cv = eval("self.class.constants", bind).collect{|m| m.to_s}
|
145
|
-
|
146
|
-
if (gv | lv | cv).include?(receiver) or /^[A-Z]/ =~ receiver && /\./ !~ receiver
|
147
|
-
# foo.func and foo is local var. OR
|
148
|
-
# Foo::Bar.func
|
149
|
-
begin
|
150
|
-
candidates = eval("#{receiver}.methods", bind).collect{|m| m.to_s}
|
151
|
-
rescue Exception
|
152
|
-
candidates = []
|
153
|
-
end
|
154
|
-
else
|
155
|
-
# func1.func2
|
156
|
-
candidates = []
|
157
|
-
ObjectSpace.each_object(Module){|m|
|
158
|
-
begin
|
159
|
-
name = m.name
|
160
|
-
rescue Exception
|
161
|
-
name = ""
|
162
|
-
end
|
163
|
-
next if name != "IRB::Context" and
|
164
|
-
/^(IRB|SLex|RubyLex|RubyToken)/ =~ name
|
165
|
-
candidates.concat m.instance_methods(false).collect{|x| x.to_s}
|
166
|
-
}
|
167
|
-
candidates.sort!
|
168
|
-
candidates.uniq!
|
169
|
-
end
|
170
|
-
select_message(receiver, message, candidates)
|
171
|
-
|
172
|
-
when /^\.([^.]*)$/
|
173
|
-
# unknown(maybe String)
|
174
|
-
|
175
|
-
receiver = ""
|
176
|
-
message = Regexp.quote($1)
|
177
|
-
|
178
|
-
candidates = String.instance_methods(true).collect{|m| m.to_s}
|
179
|
-
select_message(receiver, message, candidates)
|
180
|
-
|
181
|
-
else
|
182
|
-
candidates = eval("methods | private_methods | local_variables | self.class.constants", bind).collect{|m| m.to_s}
|
183
|
-
|
184
|
-
(candidates|ReservedWords|commands).grep(/^#{Regexp.quote(input)}/)
|
185
|
-
end
|
186
|
-
end
|
187
|
-
end
|
188
|
-
|
189
|
-
def self.select_message(receiver, message, candidates)
|
190
|
-
candidates.grep(/^#{message}/).collect do |e|
|
191
|
-
case e
|
192
|
-
when /^[a-zA-Z_]/
|
193
|
-
receiver + "." + e
|
194
|
-
when /^[0-9]/
|
195
|
-
when *Operators
|
196
|
-
#receiver + " " + e
|
197
|
-
end
|
198
|
-
end
|
199
|
-
end
|
200
|
-
end
|
201
|
-
end
|
202
|
-
|
1
|
+
# taken from irb
|
2
|
+
|
3
|
+
require "readline"
|
4
|
+
|
5
|
+
class Pry
|
6
|
+
|
7
|
+
# Implements tab completion for Readline in Pry
|
8
|
+
module InputCompleter
|
9
|
+
|
10
|
+
if Readline.respond_to?("basic_word_break_characters=")
|
11
|
+
Readline.basic_word_break_characters= " \t\n\"\\'`><=;|&{("
|
12
|
+
end
|
13
|
+
|
14
|
+
Readline.completion_append_character = nil
|
15
|
+
|
16
|
+
ReservedWords = [
|
17
|
+
"BEGIN", "END",
|
18
|
+
"alias", "and",
|
19
|
+
"begin", "break",
|
20
|
+
"case", "class",
|
21
|
+
"def", "defined", "do",
|
22
|
+
"else", "elsif", "end", "ensure",
|
23
|
+
"false", "for",
|
24
|
+
"if", "in",
|
25
|
+
"module",
|
26
|
+
"next", "nil", "not",
|
27
|
+
"or",
|
28
|
+
"redo", "rescue", "retry", "return",
|
29
|
+
"self", "super",
|
30
|
+
"then", "true",
|
31
|
+
"undef", "unless", "until",
|
32
|
+
"when", "while",
|
33
|
+
"yield",
|
34
|
+
]
|
35
|
+
|
36
|
+
Operators = ["%", "&", "*", "**", "+", "-", "/",
|
37
|
+
"<", "<<", "<=", "<=>", "==", "===", "=~", ">", ">=", ">>",
|
38
|
+
"[]", "[]=", "^", "!", "!=", "!~"]
|
39
|
+
|
40
|
+
# Return a new completion proc for use by Readline.
|
41
|
+
# @param [Binding] target The current binding context.
|
42
|
+
# @param [Array<String>] commands The array of Pry commands.
|
43
|
+
def self.build_completion_proc(target, commands=[""])
|
44
|
+
proc do |input|
|
45
|
+
bind = target
|
46
|
+
|
47
|
+
case input
|
48
|
+
when /^(\/[^\/]*\/)\.([^.]*)$/
|
49
|
+
# Regexp
|
50
|
+
receiver = $1
|
51
|
+
message = Regexp.quote($2)
|
52
|
+
|
53
|
+
candidates = Regexp.instance_methods.collect{|m| m.to_s}
|
54
|
+
select_message(receiver, message, candidates)
|
55
|
+
|
56
|
+
when /^([^\]]*\])\.([^.]*)$/
|
57
|
+
# Array
|
58
|
+
receiver = $1
|
59
|
+
message = Regexp.quote($2)
|
60
|
+
|
61
|
+
candidates = Array.instance_methods.collect{|m| m.to_s}
|
62
|
+
select_message(receiver, message, candidates)
|
63
|
+
|
64
|
+
when /^([^\}]*\})\.([^.]*)$/
|
65
|
+
# Proc or Hash
|
66
|
+
receiver = $1
|
67
|
+
message = Regexp.quote($2)
|
68
|
+
|
69
|
+
candidates = Proc.instance_methods.collect{|m| m.to_s}
|
70
|
+
candidates |= Hash.instance_methods.collect{|m| m.to_s}
|
71
|
+
select_message(receiver, message, candidates)
|
72
|
+
|
73
|
+
when /^(:[^:.]*)$/
|
74
|
+
# Symbol
|
75
|
+
if Symbol.respond_to?(:all_symbols)
|
76
|
+
sym = $1
|
77
|
+
candidates = Symbol.all_symbols.collect{|s| ":" + s.id2name}
|
78
|
+
candidates.grep(/^#{sym}/)
|
79
|
+
else
|
80
|
+
[]
|
81
|
+
end
|
82
|
+
|
83
|
+
when /^::([A-Z][^:\.\(]*)$/
|
84
|
+
# Absolute Constant or class methods
|
85
|
+
receiver = $1
|
86
|
+
candidates = Object.constants.collect{|m| m.to_s}
|
87
|
+
candidates.grep(/^#{receiver}/).collect{|e| "::" + e}
|
88
|
+
|
89
|
+
when /^([A-Z].*)::([^:.]*)$/
|
90
|
+
# Constant or class methods
|
91
|
+
receiver = $1
|
92
|
+
message = Regexp.quote($2)
|
93
|
+
begin
|
94
|
+
candidates = eval("#{receiver}.constants.collect{|m| m.to_s}", bind)
|
95
|
+
candidates |= eval("#{receiver}.methods.collect{|m| m.to_s}", bind)
|
96
|
+
rescue Exception
|
97
|
+
candidates = []
|
98
|
+
end
|
99
|
+
candidates.grep(/^#{message}/).collect{|e| receiver + "::" + e}
|
100
|
+
|
101
|
+
when /^(:[^:.]+)\.([^.]*)$/
|
102
|
+
# Symbol
|
103
|
+
receiver = $1
|
104
|
+
message = Regexp.quote($2)
|
105
|
+
|
106
|
+
candidates = Symbol.instance_methods.collect{|m| m.to_s}
|
107
|
+
select_message(receiver, message, candidates)
|
108
|
+
|
109
|
+
when /^(-?(0[dbo])?[0-9_]+(\.[0-9_]+)?([eE]-?[0-9]+)?)\.([^.]*)$/
|
110
|
+
# Numeric
|
111
|
+
receiver = $1
|
112
|
+
message = Regexp.quote($5)
|
113
|
+
|
114
|
+
begin
|
115
|
+
candidates = eval(receiver, bind).methods.collect{|m| m.to_s}
|
116
|
+
rescue Exception
|
117
|
+
candidates = []
|
118
|
+
end
|
119
|
+
select_message(receiver, message, candidates)
|
120
|
+
|
121
|
+
when /^(-?0x[0-9a-fA-F_]+)\.([^.]*)$/
|
122
|
+
# Numeric(0xFFFF)
|
123
|
+
receiver = $1
|
124
|
+
message = Regexp.quote($2)
|
125
|
+
|
126
|
+
begin
|
127
|
+
candidates = eval(receiver, bind).methods.collect{|m| m.to_s}
|
128
|
+
rescue Exception
|
129
|
+
candidates = []
|
130
|
+
end
|
131
|
+
select_message(receiver, message, candidates)
|
132
|
+
|
133
|
+
when /^(\$[^.]*)$/
|
134
|
+
regmessage = Regexp.new(Regexp.quote($1))
|
135
|
+
candidates = global_variables.collect{|m| m.to_s}.grep(regmessage)
|
136
|
+
|
137
|
+
when /^([^."].*)\.([^.]*)$/
|
138
|
+
# variable
|
139
|
+
receiver = $1
|
140
|
+
message = Regexp.quote($2)
|
141
|
+
|
142
|
+
gv = eval("global_variables", bind).collect{|m| m.to_s}
|
143
|
+
lv = eval("local_variables", bind).collect{|m| m.to_s}
|
144
|
+
cv = eval("self.class.constants", bind).collect{|m| m.to_s}
|
145
|
+
|
146
|
+
if (gv | lv | cv).include?(receiver) or /^[A-Z]/ =~ receiver && /\./ !~ receiver
|
147
|
+
# foo.func and foo is local var. OR
|
148
|
+
# Foo::Bar.func
|
149
|
+
begin
|
150
|
+
candidates = eval("#{receiver}.methods", bind).collect{|m| m.to_s}
|
151
|
+
rescue Exception
|
152
|
+
candidates = []
|
153
|
+
end
|
154
|
+
else
|
155
|
+
# func1.func2
|
156
|
+
candidates = []
|
157
|
+
ObjectSpace.each_object(Module){|m|
|
158
|
+
begin
|
159
|
+
name = m.name
|
160
|
+
rescue Exception
|
161
|
+
name = ""
|
162
|
+
end
|
163
|
+
next if name != "IRB::Context" and
|
164
|
+
/^(IRB|SLex|RubyLex|RubyToken)/ =~ name
|
165
|
+
candidates.concat m.instance_methods(false).collect{|x| x.to_s}
|
166
|
+
}
|
167
|
+
candidates.sort!
|
168
|
+
candidates.uniq!
|
169
|
+
end
|
170
|
+
select_message(receiver, message, candidates)
|
171
|
+
|
172
|
+
when /^\.([^.]*)$/
|
173
|
+
# unknown(maybe String)
|
174
|
+
|
175
|
+
receiver = ""
|
176
|
+
message = Regexp.quote($1)
|
177
|
+
|
178
|
+
candidates = String.instance_methods(true).collect{|m| m.to_s}
|
179
|
+
select_message(receiver, message, candidates)
|
180
|
+
|
181
|
+
else
|
182
|
+
candidates = eval("methods | private_methods | local_variables | self.class.constants", bind).collect{|m| m.to_s}
|
183
|
+
|
184
|
+
(candidates|ReservedWords|commands).grep(/^#{Regexp.quote(input)}/)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
def self.select_message(receiver, message, candidates)
|
190
|
+
candidates.grep(/^#{message}/).collect do |e|
|
191
|
+
case e
|
192
|
+
when /^[a-zA-Z_]/
|
193
|
+
receiver + "." + e
|
194
|
+
when /^[0-9]/
|
195
|
+
when *Operators
|
196
|
+
#receiver + " " + e
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
data/lib/pry/core_extensions.rb
CHANGED
@@ -1,55 +1,55 @@
|
|
1
|
-
class Pry
|
2
|
-
module ObjectExtensions
|
3
|
-
|
4
|
-
# Start a Pry REPL.
|
5
|
-
# This method differs from `Pry.start` in that it does not
|
6
|
-
# support an options hash. Also, when no parameter is provided, the Pry
|
7
|
-
# session will start on the implied receiver rather than on
|
8
|
-
# top-level (as in the case of `Pry.start`).
|
9
|
-
# It has two forms of invocation. In the first form no parameter
|
10
|
-
# should be provided and it will start a pry session on the
|
11
|
-
# receiver. In the second form it should be invoked without an
|
12
|
-
# explicit receiver and one parameter; this will start a Pry
|
13
|
-
# session on the parameter.
|
14
|
-
# @param [Object, Binding] target The receiver of the Pry session.
|
15
|
-
# @example First form
|
16
|
-
# "dummy".pry
|
17
|
-
# @example Second form
|
18
|
-
# pry "dummy"
|
19
|
-
# @example Start a Pry session on current self (whatever that is)
|
20
|
-
# pry
|
21
|
-
def pry(target=self)
|
22
|
-
Pry.start(target)
|
23
|
-
end
|
24
|
-
|
25
|
-
# Return a binding object for the receiver.
|
26
|
-
def __binding__
|
27
|
-
if is_a?(Module)
|
28
|
-
return class_eval "binding"
|
29
|
-
end
|
30
|
-
|
31
|
-
unless respond_to? :__binding_impl__
|
32
|
-
begin
|
33
|
-
instance_eval %{
|
34
|
-
def __binding_impl__
|
35
|
-
binding
|
36
|
-
end
|
37
|
-
}
|
38
|
-
rescue TypeError
|
39
|
-
self.class.class_eval %{
|
40
|
-
def __binding_impl__
|
41
|
-
binding
|
42
|
-
end
|
43
|
-
}
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
__binding_impl__
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
# bring the extensions into Object
|
53
|
-
class Object
|
54
|
-
include Pry::ObjectExtensions
|
55
|
-
end
|
1
|
+
class Pry
|
2
|
+
module ObjectExtensions
|
3
|
+
|
4
|
+
# Start a Pry REPL.
|
5
|
+
# This method differs from `Pry.start` in that it does not
|
6
|
+
# support an options hash. Also, when no parameter is provided, the Pry
|
7
|
+
# session will start on the implied receiver rather than on
|
8
|
+
# top-level (as in the case of `Pry.start`).
|
9
|
+
# It has two forms of invocation. In the first form no parameter
|
10
|
+
# should be provided and it will start a pry session on the
|
11
|
+
# receiver. In the second form it should be invoked without an
|
12
|
+
# explicit receiver and one parameter; this will start a Pry
|
13
|
+
# session on the parameter.
|
14
|
+
# @param [Object, Binding] target The receiver of the Pry session.
|
15
|
+
# @example First form
|
16
|
+
# "dummy".pry
|
17
|
+
# @example Second form
|
18
|
+
# pry "dummy"
|
19
|
+
# @example Start a Pry session on current self (whatever that is)
|
20
|
+
# pry
|
21
|
+
def pry(target=self)
|
22
|
+
Pry.start(target)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Return a binding object for the receiver.
|
26
|
+
def __binding__
|
27
|
+
if is_a?(Module)
|
28
|
+
return class_eval "binding"
|
29
|
+
end
|
30
|
+
|
31
|
+
unless respond_to? :__binding_impl__
|
32
|
+
begin
|
33
|
+
instance_eval %{
|
34
|
+
def __binding_impl__
|
35
|
+
binding
|
36
|
+
end
|
37
|
+
}
|
38
|
+
rescue TypeError
|
39
|
+
self.class.class_eval %{
|
40
|
+
def __binding_impl__
|
41
|
+
binding
|
42
|
+
end
|
43
|
+
}
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
__binding_impl__
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# bring the extensions into Object
|
53
|
+
class Object
|
54
|
+
include Pry::ObjectExtensions
|
55
|
+
end
|