pry 0.9.10 → 0.9.11
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +3 -1
- data/CHANGELOG +60 -1
- data/CONTRIBUTORS +43 -25
- data/Gemfile +7 -0
- data/Guardfile +62 -0
- data/README.markdown +4 -4
- data/Rakefile +34 -35
- data/lib/pry.rb +107 -54
- data/lib/pry/cli.rb +34 -11
- data/lib/pry/code.rb +165 -182
- data/lib/pry/code/code_range.rb +70 -0
- data/lib/pry/code/loc.rb +92 -0
- data/lib/pry/code_object.rb +153 -0
- data/lib/pry/command.rb +160 -22
- data/lib/pry/command_set.rb +37 -26
- data/lib/pry/commands.rb +4 -27
- data/lib/pry/commands/amend_line.rb +99 -0
- data/lib/pry/commands/bang.rb +20 -0
- data/lib/pry/commands/bang_pry.rb +17 -0
- data/lib/pry/commands/cat.rb +53 -0
- data/lib/pry/commands/cat/abstract_formatter.rb +27 -0
- data/lib/pry/commands/cat/exception_formatter.rb +78 -0
- data/lib/pry/commands/cat/file_formatter.rb +84 -0
- data/lib/pry/commands/cat/input_expression_formatter.rb +43 -0
- data/lib/pry/commands/cd.rb +30 -0
- data/lib/pry/commands/code_collector.rb +165 -0
- data/lib/pry/commands/deprecated_commands.rb +2 -0
- data/lib/pry/commands/disable_pry.rb +27 -0
- data/lib/pry/commands/easter_eggs.rb +112 -0
- data/lib/pry/commands/edit.rb +206 -0
- data/lib/pry/commands/edit/exception_patcher.rb +25 -0
- data/lib/pry/commands/edit/file_and_line_locator.rb +38 -0
- data/lib/pry/commands/edit/method_patcher.rb +122 -0
- data/lib/pry/commands/exit.rb +42 -0
- data/lib/pry/commands/exit_all.rb +29 -0
- data/lib/pry/commands/exit_program.rb +24 -0
- data/lib/pry/commands/find_method.rb +199 -0
- data/lib/pry/commands/fix_indent.rb +19 -0
- data/lib/pry/commands/gem_cd.rb +26 -0
- data/lib/pry/commands/gem_install.rb +29 -0
- data/lib/pry/commands/gem_list.rb +33 -0
- data/lib/pry/commands/gem_open.rb +29 -0
- data/lib/pry/commands/gist.rb +95 -0
- data/lib/pry/commands/help.rb +164 -0
- data/lib/pry/commands/hist.rb +161 -0
- data/lib/pry/commands/import_set.rb +22 -0
- data/lib/pry/commands/install_command.rb +51 -0
- data/lib/pry/commands/jump_to.rb +29 -0
- data/lib/pry/commands/ls.rb +339 -0
- data/lib/pry/commands/nesting.rb +25 -0
- data/lib/pry/commands/play.rb +69 -0
- data/lib/pry/commands/pry_backtrace.rb +26 -0
- data/lib/pry/commands/pry_version.rb +17 -0
- data/lib/pry/commands/raise_up.rb +32 -0
- data/lib/pry/commands/reload_code.rb +39 -0
- data/lib/pry/commands/reset.rb +18 -0
- data/lib/pry/commands/ri.rb +56 -0
- data/lib/pry/commands/save_file.rb +61 -0
- data/lib/pry/commands/shell_command.rb +43 -0
- data/lib/pry/commands/shell_mode.rb +27 -0
- data/lib/pry/commands/show_doc.rb +78 -0
- data/lib/pry/commands/show_info.rb +139 -0
- data/lib/pry/commands/show_input.rb +17 -0
- data/lib/pry/commands/show_source.rb +37 -0
- data/lib/pry/commands/simple_prompt.rb +22 -0
- data/lib/pry/commands/stat.rb +40 -0
- data/lib/pry/commands/switch_to.rb +23 -0
- data/lib/pry/commands/toggle_color.rb +20 -0
- data/lib/pry/commands/whereami.rb +114 -0
- data/lib/pry/commands/wtf.rb +57 -0
- data/lib/pry/completion.rb +120 -46
- data/lib/pry/config.rb +11 -0
- data/lib/pry/core_extensions.rb +27 -16
- data/lib/pry/editor.rb +129 -0
- data/lib/pry/helpers.rb +1 -0
- data/lib/pry/helpers/base_helpers.rb +89 -119
- data/lib/pry/helpers/command_helpers.rb +6 -121
- data/lib/pry/helpers/table.rb +100 -0
- data/lib/pry/helpers/text.rb +4 -4
- data/lib/pry/history_array.rb +5 -0
- data/lib/pry/hooks.rb +1 -3
- data/lib/pry/indent.rb +104 -30
- data/lib/pry/method.rb +66 -22
- data/lib/pry/module_candidate.rb +26 -15
- data/lib/pry/pager.rb +70 -0
- data/lib/pry/plugins.rb +1 -2
- data/lib/pry/pry_class.rb +63 -22
- data/lib/pry/pry_instance.rb +58 -37
- data/lib/pry/rubygem.rb +74 -0
- data/lib/pry/terminal_info.rb +43 -0
- data/lib/pry/test/helper.rb +185 -0
- data/lib/pry/version.rb +1 -1
- data/lib/pry/wrapped_module.rb +58 -24
- data/pry.gemspec +21 -37
- data/{test/test_cli.rb → spec/cli_spec.rb} +0 -0
- data/spec/code_object_spec.rb +277 -0
- data/{test/test_code.rb → spec/code_spec.rb} +19 -1
- data/{test/test_command_helpers.rb → spec/command_helpers_spec.rb} +0 -0
- data/{test/test_command_integration.rb → spec/command_integration_spec.rb} +38 -46
- data/{test/test_command_set.rb → spec/command_set_spec.rb} +18 -1
- data/{test/test_command.rb → spec/command_spec.rb} +250 -149
- data/spec/commands/amend_line_spec.rb +247 -0
- data/spec/commands/bang_spec.rb +19 -0
- data/spec/commands/cat_spec.rb +164 -0
- data/spec/commands/cd_spec.rb +250 -0
- data/spec/commands/disable_pry_spec.rb +25 -0
- data/spec/commands/edit_spec.rb +727 -0
- data/spec/commands/exit_all_spec.rb +34 -0
- data/spec/commands/exit_program_spec.rb +19 -0
- data/spec/commands/exit_spec.rb +34 -0
- data/{test/test_default_commands/test_find_method.rb → spec/commands/find_method_spec.rb} +27 -7
- data/spec/commands/gem_list_spec.rb +26 -0
- data/spec/commands/gist_spec.rb +75 -0
- data/{test/test_default_commands/test_help.rb → spec/commands/help_spec.rb} +8 -9
- data/spec/commands/hist_spec.rb +181 -0
- data/spec/commands/jump_to_spec.rb +15 -0
- data/spec/commands/ls_spec.rb +177 -0
- data/spec/commands/play_spec.rb +140 -0
- data/spec/commands/raise_up_spec.rb +56 -0
- data/spec/commands/save_file_spec.rb +177 -0
- data/spec/commands/show_doc_spec.rb +378 -0
- data/spec/commands/show_input_spec.rb +17 -0
- data/spec/commands/show_source_spec.rb +597 -0
- data/spec/commands/whereami_spec.rb +154 -0
- data/spec/completion_spec.rb +233 -0
- data/spec/control_d_handler_spec.rb +58 -0
- data/spec/editor_spec.rb +79 -0
- data/{test/test_exception_whitelist.rb → spec/exception_whitelist_spec.rb} +0 -0
- data/{test → spec/fixtures}/candidate_helper1.rb +0 -0
- data/{test → spec/fixtures}/candidate_helper2.rb +0 -0
- data/{test/test_default_commands → spec/fixtures}/example.erb +0 -0
- data/spec/fixtures/example_nesting.rb +33 -0
- data/spec/fixtures/show_source_doc_examples.rb +15 -0
- data/{test → spec/fixtures}/testrc +0 -0
- data/{test → spec/fixtures}/testrcbad +0 -0
- data/spec/helper.rb +34 -0
- data/spec/helpers/bacon.rb +86 -0
- data/spec/helpers/mock_pry.rb +43 -0
- data/spec/helpers/table_spec.rb +83 -0
- data/{test/test_history_array.rb → spec/history_array_spec.rb} +21 -19
- data/{test/test_hooks.rb → spec/hooks_spec.rb} +0 -0
- data/{test/test_indent.rb → spec/indent_spec.rb} +24 -0
- data/{test/test_input_stack.rb → spec/input_stack_spec.rb} +4 -0
- data/{test/test_method.rb → spec/method_spec.rb} +65 -1
- data/{test/test_prompt.rb → spec/prompt_spec.rb} +0 -0
- data/{test/test_pry_defaults.rb → spec/pry_defaults_spec.rb} +14 -14
- data/{test/test_pry_history.rb → spec/pry_history_spec.rb} +15 -0
- data/spec/pry_output_spec.rb +95 -0
- data/{test/test_pry.rb → spec/pry_spec.rb} +74 -32
- data/{test/test_sticky_locals.rb → spec/sticky_locals_spec.rb} +27 -25
- data/{test/test_syntax_checking.rb → spec/syntax_checking_spec.rb} +17 -1
- data/{test/test_wrapped_module.rb → spec/wrapped_module_spec.rb} +92 -5
- metadata +236 -112
- data/examples/example_basic.rb +0 -15
- data/examples/example_command_override.rb +0 -32
- data/examples/example_commands.rb +0 -36
- data/examples/example_hooks.rb +0 -9
- data/examples/example_image_edit.rb +0 -67
- data/examples/example_input.rb +0 -7
- data/examples/example_input2.rb +0 -29
- data/examples/example_output.rb +0 -11
- data/examples/example_print.rb +0 -6
- data/examples/example_prompt.rb +0 -9
- data/examples/helper.rb +0 -6
- data/lib/pry/default_commands/cd.rb +0 -81
- data/lib/pry/default_commands/commands.rb +0 -62
- data/lib/pry/default_commands/context.rb +0 -98
- data/lib/pry/default_commands/easter_eggs.rb +0 -95
- data/lib/pry/default_commands/editing.rb +0 -420
- data/lib/pry/default_commands/find_method.rb +0 -169
- data/lib/pry/default_commands/gems.rb +0 -84
- data/lib/pry/default_commands/gist.rb +0 -187
- data/lib/pry/default_commands/help.rb +0 -127
- data/lib/pry/default_commands/hist.rb +0 -120
- data/lib/pry/default_commands/input_and_output.rb +0 -306
- data/lib/pry/default_commands/introspection.rb +0 -410
- data/lib/pry/default_commands/ls.rb +0 -272
- data/lib/pry/default_commands/misc.rb +0 -38
- data/lib/pry/default_commands/navigating_pry.rb +0 -110
- data/lib/pry/default_commands/whereami.rb +0 -92
- data/lib/pry/extended_commands/experimental.rb +0 -7
- data/test/helper.rb +0 -223
- data/test/test_completion.rb +0 -62
- data/test/test_control_d_handler.rb +0 -45
- data/test/test_default_commands/test_cd.rb +0 -321
- data/test/test_default_commands/test_context.rb +0 -288
- data/test/test_default_commands/test_documentation.rb +0 -315
- data/test/test_default_commands/test_gems.rb +0 -18
- data/test/test_default_commands/test_input.rb +0 -428
- data/test/test_default_commands/test_introspection.rb +0 -511
- data/test/test_default_commands/test_ls.rb +0 -151
- data/test/test_default_commands/test_shell.rb +0 -343
- data/test/test_default_commands/test_show_source.rb +0 -432
- data/test/test_pry_output.rb +0 -41
data/lib/pry/completion.rb
CHANGED
@@ -1,9 +1,31 @@
|
|
1
1
|
# taken from irb
|
2
2
|
|
3
|
-
require "readline"
|
4
|
-
|
5
3
|
class Pry
|
6
4
|
|
5
|
+
module BondCompleter
|
6
|
+
|
7
|
+
def self.build_completion_proc(target, pry=nil, commands=[""])
|
8
|
+
if !@started
|
9
|
+
@started = true
|
10
|
+
start
|
11
|
+
end
|
12
|
+
|
13
|
+
Pry.current[:pry] = pry
|
14
|
+
proc{ |*a| Bond.agent.call(*a) }
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.start
|
18
|
+
Bond.start(:eval_binding => lambda{ Pry.current[:pry].current_context })
|
19
|
+
Bond.complete(:on => /\A/) do |input|
|
20
|
+
Pry.commands.complete(input.line,
|
21
|
+
:pry_instance => Pry.current[:pry],
|
22
|
+
:target => Pry.current[:pry].current_context,
|
23
|
+
:command_set => Pry.current[:pry].commands)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
7
29
|
# Implements tab completion for Readline in Pry
|
8
30
|
module InputCompleter
|
9
31
|
|
@@ -41,36 +63,51 @@ class Pry
|
|
41
63
|
# Return a new completion proc for use by Readline.
|
42
64
|
# @param [Binding] target The current binding context.
|
43
65
|
# @param [Array<String>] commands The array of Pry commands.
|
44
|
-
def self.build_completion_proc(target, commands=[""])
|
66
|
+
def self.build_completion_proc(target, pry=nil, commands=[""])
|
67
|
+
|
45
68
|
proc do |input|
|
69
|
+
|
70
|
+
# if there are multiple contexts e.g. cd 1/2/3
|
71
|
+
# get new target for 1/2 and find candidates for 3
|
72
|
+
path, input = build_path(input)
|
73
|
+
|
74
|
+
unless path.call.empty?
|
75
|
+
target, _ = Pry::Helpers::BaseHelpers.context_from_object_path(path.call, pry)
|
76
|
+
target = target.last
|
77
|
+
end
|
78
|
+
|
46
79
|
begin
|
47
80
|
bind = target
|
48
81
|
|
49
82
|
case input
|
83
|
+
|
84
|
+
|
85
|
+
# Complete stdlib symbols
|
86
|
+
|
50
87
|
when /^(\/[^\/]*\/)\.([^.]*)$/
|
51
88
|
# Regexp
|
52
89
|
receiver = $1
|
53
90
|
message = Regexp.quote($2)
|
54
91
|
|
55
|
-
candidates = Regexp.instance_methods.collect
|
56
|
-
select_message(receiver, message, candidates)
|
92
|
+
candidates = Regexp.instance_methods.collect(&:to_s)
|
93
|
+
select_message(path, receiver, message, candidates)
|
57
94
|
|
58
95
|
when /^([^\]]*\])\.([^.]*)$/
|
59
96
|
# Array
|
60
97
|
receiver = $1
|
61
98
|
message = Regexp.quote($2)
|
62
99
|
|
63
|
-
candidates = Array.instance_methods.collect
|
64
|
-
select_message(receiver, message, candidates)
|
100
|
+
candidates = Array.instance_methods.collect(&:to_s)
|
101
|
+
select_message(path, receiver, message, candidates)
|
65
102
|
|
66
103
|
when /^([^\}]*\})\.([^.]*)$/
|
67
104
|
# Proc or Hash
|
68
105
|
receiver = $1
|
69
106
|
message = Regexp.quote($2)
|
70
107
|
|
71
|
-
candidates = Proc.instance_methods.collect
|
72
|
-
candidates |= Hash.instance_methods.collect
|
73
|
-
select_message(receiver, message, candidates)
|
108
|
+
candidates = Proc.instance_methods.collect(&:to_s)
|
109
|
+
candidates |= Hash.instance_methods.collect(&:to_s)
|
110
|
+
select_message(path, receiver, message, candidates)
|
74
111
|
|
75
112
|
when /^(:[^:.]*)$/
|
76
113
|
# Symbol
|
@@ -86,16 +123,32 @@ class Pry
|
|
86
123
|
when /^::([A-Z][^:\.\(]*)$/
|
87
124
|
# Absolute Constant or class methods
|
88
125
|
receiver = $1
|
89
|
-
candidates = Object.constants.collect
|
126
|
+
candidates = Object.constants.collect(&:to_s)
|
90
127
|
candidates.grep(/^#{receiver}/).collect{|e| "::" + e}
|
91
128
|
|
129
|
+
|
130
|
+
# Complete target symbols
|
131
|
+
|
132
|
+
when /^([A-Z][A-Za-z0-9]*)$/
|
133
|
+
# Constant
|
134
|
+
message = $1
|
135
|
+
|
136
|
+
begin
|
137
|
+
context = target.eval("self")
|
138
|
+
context = context.class unless context.respond_to? :constants
|
139
|
+
candidates = context.constants.collect(&:to_s)
|
140
|
+
rescue
|
141
|
+
candidates = []
|
142
|
+
end
|
143
|
+
candidates = candidates.grep(/^#{message}/).collect(&path)
|
144
|
+
|
92
145
|
when /^([A-Z].*)::([^:.]*)$/
|
93
146
|
# Constant or class methods
|
94
147
|
receiver = $1
|
95
148
|
message = Regexp.quote($2)
|
96
149
|
begin
|
97
|
-
candidates = eval("#{receiver}.constants.collect
|
98
|
-
candidates |= eval("#{receiver}.methods.collect
|
150
|
+
candidates = eval("#{receiver}.constants.collect(&:to_s)", bind)
|
151
|
+
candidates |= eval("#{receiver}.methods.collect(&:to_s)", bind)
|
99
152
|
rescue RescuableException
|
100
153
|
candidates = []
|
101
154
|
end
|
@@ -106,8 +159,8 @@ class Pry
|
|
106
159
|
receiver = $1
|
107
160
|
message = Regexp.quote($2)
|
108
161
|
|
109
|
-
candidates = Symbol.instance_methods.collect
|
110
|
-
select_message(receiver, message, candidates)
|
162
|
+
candidates = Symbol.instance_methods.collect(&:to_s)
|
163
|
+
select_message(path, receiver, message, candidates)
|
111
164
|
|
112
165
|
when /^(-?(0[dbo])?[0-9_]+(\.[0-9_]+)?([eE]-?[0-9]+)?)\.([^.]*)$/
|
113
166
|
# Numeric
|
@@ -115,42 +168,43 @@ class Pry
|
|
115
168
|
message = Regexp.quote($5)
|
116
169
|
|
117
170
|
begin
|
118
|
-
candidates = eval(receiver, bind).methods.collect
|
171
|
+
candidates = eval(receiver, bind).methods.collect(&:to_s)
|
119
172
|
rescue RescuableException
|
120
173
|
candidates = []
|
121
174
|
end
|
122
|
-
select_message(receiver, message, candidates)
|
175
|
+
select_message(path, receiver, message, candidates)
|
123
176
|
|
124
|
-
when /^(-?0x[0-9a-fA-F_]+)\.([^.]*)
|
177
|
+
when /^(-?0x[0-9a-fA-F_]+)\.([^.]*)$/#
|
125
178
|
# Numeric(0xFFFF)
|
126
179
|
receiver = $1
|
127
180
|
message = Regexp.quote($2)
|
128
181
|
|
129
182
|
begin
|
130
|
-
candidates = eval(receiver, bind).methods.collect
|
183
|
+
candidates = eval(receiver, bind).methods.collect(&:to_s)
|
131
184
|
rescue RescuableException
|
132
185
|
candidates = []
|
133
186
|
end
|
134
|
-
select_message(receiver, message, candidates)
|
187
|
+
select_message(path, receiver, message, candidates)
|
135
188
|
|
136
189
|
when /^(\$[^.]*)$/
|
190
|
+
# Global variables
|
137
191
|
regmessage = Regexp.new(Regexp.quote($1))
|
138
|
-
candidates = global_variables.collect
|
192
|
+
candidates = global_variables.collect(&:to_s).grep(regmessage)
|
139
193
|
|
140
194
|
when /^([^."].*)\.([^.]*)$/
|
141
|
-
#
|
195
|
+
# Variable
|
142
196
|
receiver = $1
|
143
197
|
message = Regexp.quote($2)
|
144
198
|
|
145
|
-
gv = eval("global_variables", bind).collect
|
146
|
-
lv = eval("local_variables", bind).collect
|
147
|
-
cv = eval("self.class.constants", bind).collect
|
199
|
+
gv = eval("global_variables", bind).collect(&:to_s)
|
200
|
+
lv = eval("local_variables", bind).collect(&:to_s)
|
201
|
+
cv = eval("self.class.constants", bind).collect(&:to_s)
|
148
202
|
|
149
203
|
if (gv | lv | cv).include?(receiver) or /^[A-Z]/ =~ receiver && /\./ !~ receiver
|
150
204
|
# foo.func and foo is local var. OR
|
151
205
|
# Foo::Bar.func
|
152
206
|
begin
|
153
|
-
candidates = eval("#{receiver}.methods", bind).collect
|
207
|
+
candidates = eval("#{receiver}.methods", bind).collect(&:to_s)
|
154
208
|
rescue RescuableException
|
155
209
|
candidates = []
|
156
210
|
end
|
@@ -169,35 +223,35 @@ class Pry
|
|
169
223
|
# jruby doesn't always provide #instance_methods() on each
|
170
224
|
# object.
|
171
225
|
if m.respond_to?(:instance_methods)
|
172
|
-
candidates.concat m.instance_methods(false).collect
|
226
|
+
candidates.concat m.instance_methods(false).collect(&:to_s)
|
173
227
|
end
|
174
228
|
}
|
175
229
|
candidates.sort!
|
176
230
|
candidates.uniq!
|
177
231
|
end
|
178
|
-
select_message(receiver, message, candidates)
|
232
|
+
select_message(path, receiver, message, candidates)
|
179
233
|
|
180
234
|
when /^\.([^.]*)$/
|
181
|
-
#
|
182
|
-
|
235
|
+
# Unknown(maybe String)
|
183
236
|
receiver = ""
|
184
237
|
message = Regexp.quote($1)
|
185
238
|
|
186
|
-
candidates = String.instance_methods(true).collect
|
187
|
-
select_message(receiver, message, candidates)
|
239
|
+
candidates = String.instance_methods(true).collect(&:to_s)
|
240
|
+
select_message(path, receiver, message, candidates)
|
188
241
|
|
189
242
|
else
|
243
|
+
|
190
244
|
candidates = eval(
|
191
245
|
"methods | private_methods | local_variables | " \
|
192
246
|
"self.class.constants | instance_variables",
|
193
247
|
bind
|
194
|
-
).collect
|
248
|
+
).collect(&:to_s)
|
195
249
|
|
196
250
|
if eval("respond_to?(:class_variables)", bind)
|
197
|
-
candidates += eval("class_variables", bind).collect
|
251
|
+
candidates += eval("class_variables", bind).collect(&:to_s)
|
198
252
|
end
|
199
|
-
|
200
|
-
|
253
|
+
candidates = (candidates|ReservedWords|commands).grep(/^#{Regexp.quote(input)}/)
|
254
|
+
candidates.collect(&path)
|
201
255
|
end
|
202
256
|
rescue RescuableException
|
203
257
|
[]
|
@@ -205,17 +259,37 @@ class Pry
|
|
205
259
|
end
|
206
260
|
end
|
207
261
|
|
208
|
-
def self.select_message(receiver, message, candidates)
|
209
|
-
candidates.grep(/^#{message}/).collect
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
262
|
+
def self.select_message(path, receiver, message, candidates)
|
263
|
+
candidates.grep(/^#{message}/).collect { |e|
|
264
|
+
case e
|
265
|
+
when /^[a-zA-Z_]/
|
266
|
+
path.call(receiver + "." + e)
|
267
|
+
when /^[0-9]/
|
268
|
+
when *Operators
|
269
|
+
#receiver + " " + e
|
270
|
+
end
|
271
|
+
}.compact
|
272
|
+
end
|
273
|
+
|
274
|
+
# build_path seperates the input into two parts: path and input.
|
275
|
+
# input is the partial string that should be completed
|
276
|
+
# path is a proc that takes an input and builds a full path.
|
277
|
+
def self.build_path(input)
|
278
|
+
|
279
|
+
# check to see if the input is a regex
|
280
|
+
return proc {|input| input.to_s }, input if input[/\/\./]
|
281
|
+
|
282
|
+
trailing_slash = input.end_with?('/')
|
283
|
+
contexts = input.chomp('/').split(/\//)
|
284
|
+
input = contexts[-1]
|
285
|
+
|
286
|
+
path = proc do |input|
|
287
|
+
p = contexts[0..-2].push(input).join('/')
|
288
|
+
p += '/' if trailing_slash && !input.nil?
|
289
|
+
p
|
217
290
|
end
|
291
|
+
|
292
|
+
return path, input
|
218
293
|
end
|
219
294
|
end
|
220
295
|
end
|
221
|
-
|
data/lib/pry/config.rb
CHANGED
@@ -112,6 +112,14 @@ class Pry
|
|
112
112
|
# Pry.config.prompt = proc { |obj, nest_level, _pry_| "#{obj}:#{nest_level}> " }
|
113
113
|
attr_accessor :prompt
|
114
114
|
|
115
|
+
# The display name that is part of the prompt. Default is 'pry'.
|
116
|
+
# You can set your own name so you can identify which project your current pry session
|
117
|
+
# is using. This is useful if you have a local pryrc file in a Rails project for example.
|
118
|
+
# @return [String]
|
119
|
+
# @example
|
120
|
+
# Pry.config.prompt_name = 'my_rails_project'
|
121
|
+
attr_accessor :prompt_name
|
122
|
+
|
115
123
|
# The default editor to use. Defaults to $VISUAL, $EDITOR, or a sensible fallback
|
116
124
|
# for the platform.
|
117
125
|
# If `editor` is a String then that string is used as the shell
|
@@ -228,6 +236,9 @@ class Pry
|
|
228
236
|
# Pry.config.extra_sticky_locals = { :random_number => proc {
|
229
237
|
# rand(10) } }
|
230
238
|
attr_accessor :extra_sticky_locals
|
239
|
+
|
240
|
+
# @return [#build_completion_proc] A completer to use.
|
241
|
+
attr_accessor :completer
|
231
242
|
end
|
232
243
|
end
|
233
244
|
|
data/lib/pry/core_extensions.rb
CHANGED
@@ -1,3 +1,24 @@
|
|
1
|
+
class Pry
|
2
|
+
# @return [Array] Code of the method used when implementing Pry's
|
3
|
+
# __binding__, along with line indication to be used with instance_eval (and
|
4
|
+
# friends).
|
5
|
+
#
|
6
|
+
# @see Object#__binding__
|
7
|
+
BINDING_METHOD_IMPL = [<<-METHOD, __FILE__, __LINE__ + 1]
|
8
|
+
# Get a binding with 'self' set to self, and no locals.
|
9
|
+
#
|
10
|
+
# The default definee is determined by the context in which the
|
11
|
+
# definition is eval'd.
|
12
|
+
#
|
13
|
+
# Please don't call this method directly, see {__binding__}.
|
14
|
+
#
|
15
|
+
# @return [Binding]
|
16
|
+
def __pry__
|
17
|
+
binding
|
18
|
+
end
|
19
|
+
METHOD
|
20
|
+
end
|
21
|
+
|
1
22
|
class Object
|
2
23
|
# Start a Pry REPL on self.
|
3
24
|
#
|
@@ -45,6 +66,10 @@ class Object
|
|
45
66
|
#
|
46
67
|
# @return [Binding]
|
47
68
|
def __binding__
|
69
|
+
# If you ever feel like changing this method, be careful about variables
|
70
|
+
# that you use. They shouldn't be inserted into the binding that will
|
71
|
+
# eventually be returning.
|
72
|
+
|
48
73
|
# When you're cd'd into a class, methods you define should be added to it.
|
49
74
|
if is_a?(Module)
|
50
75
|
# class_eval sets both self and the default definee to this class.
|
@@ -52,20 +77,6 @@ class Object
|
|
52
77
|
end
|
53
78
|
|
54
79
|
unless respond_to?(:__pry__)
|
55
|
-
binding_impl_method = [<<-METHOD, __FILE__, __LINE__ + 1]
|
56
|
-
# Get a binding with 'self' set to self, and no locals.
|
57
|
-
#
|
58
|
-
# The default definee is determined by the context in which the
|
59
|
-
# definition is eval'd.
|
60
|
-
#
|
61
|
-
# Please don't call this method directly, see {__binding__}.
|
62
|
-
#
|
63
|
-
# @return [Binding]
|
64
|
-
def __pry__
|
65
|
-
binding
|
66
|
-
end
|
67
|
-
METHOD
|
68
|
-
|
69
80
|
# The easiest way to check whether an object has a working singleton class
|
70
81
|
# is to try and define a method on it. (just checking for the presence of
|
71
82
|
# the singleton class gives false positives for `true` and `false`).
|
@@ -73,14 +84,14 @@ class Object
|
|
73
84
|
# it has the nice property that we can memoize this check.
|
74
85
|
begin
|
75
86
|
# instance_eval sets the default definee to the object's singleton class
|
76
|
-
instance_eval
|
87
|
+
instance_eval *Pry::BINDING_METHOD_IMPL
|
77
88
|
|
78
89
|
# If we can't define methods on the Object's singleton_class. Then we fall
|
79
90
|
# back to setting the default definee to be the Object's class. That seems
|
80
91
|
# nicer than having a REPL in which you can't define methods.
|
81
92
|
rescue TypeError
|
82
93
|
# class_eval sets the default definee to self.class
|
83
|
-
self.class.class_eval
|
94
|
+
self.class.class_eval *Pry::BINDING_METHOD_IMPL
|
84
95
|
end
|
85
96
|
end
|
86
97
|
|
data/lib/pry/editor.rb
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
class Pry
|
2
|
+
class Editor
|
3
|
+
extend Pry::Helpers::BaseHelpers
|
4
|
+
extend Pry::Helpers::CommandHelpers
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def edit_tempfile_with_content(initial_content, line=1)
|
8
|
+
temp_file do |f|
|
9
|
+
f.puts(initial_content)
|
10
|
+
f.flush
|
11
|
+
f.close(false)
|
12
|
+
invoke_editor(f.path, line, true)
|
13
|
+
File.read(f.path)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def invoke_editor(file, line, blocking=true)
|
18
|
+
raise CommandError, "Please set Pry.config.editor or export $VISUAL or $EDITOR" unless Pry.config.editor
|
19
|
+
|
20
|
+
editor_invocation = build_editor_invocation_string(file, line, blocking)
|
21
|
+
return nil unless editor_invocation
|
22
|
+
|
23
|
+
if jruby?
|
24
|
+
open_editor_on_jruby(editor_invocation)
|
25
|
+
else
|
26
|
+
open_editor(editor_invocation)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
# Generate the string that's used to start the editor. This includes
|
33
|
+
# all the flags we want as well as the file and line number we
|
34
|
+
# want to open at.
|
35
|
+
def build_editor_invocation_string(file, line, blocking)
|
36
|
+
|
37
|
+
if Pry.config.editor.respond_to?(:call)
|
38
|
+
args = [file, line, blocking][0...(Pry.config.editor.arity)]
|
39
|
+
Pry.config.editor.call(*args)
|
40
|
+
else
|
41
|
+
sanitized_file = if windows?
|
42
|
+
file.gsub(/\//, '\\')
|
43
|
+
else
|
44
|
+
Shellwords.escape(file)
|
45
|
+
end
|
46
|
+
|
47
|
+
"#{Pry.config.editor} #{blocking_flag_for_editor(blocking)} #{start_line_syntax_for_editor(sanitized_file, line)}"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# Start the editor running, using the calculated invocation string
|
52
|
+
def open_editor(editor_invocation)
|
53
|
+
# Note we dont want to use Pry.config.system here as that
|
54
|
+
# may be invoked non-interactively (i.e via Open4), whereas we want to
|
55
|
+
# ensure the editor is always interactive
|
56
|
+
system(editor_invocation) or raise CommandError, "`#{editor_invocation}` gave exit status: #{$?.exitstatus}"
|
57
|
+
end
|
58
|
+
|
59
|
+
# We need JRuby specific code here cos just shelling out using
|
60
|
+
# system() appears to be pretty broken :/
|
61
|
+
def open_editor_on_jruby(editor_invocation)
|
62
|
+
begin
|
63
|
+
require 'spoon'
|
64
|
+
pid = Spoon.spawnp(*editor_invocation.split)
|
65
|
+
Process.waitpid(pid)
|
66
|
+
rescue FFI::NotFoundError
|
67
|
+
system(editor_invocation)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# Some editors that run outside the terminal allow you to control whether or
|
72
|
+
# not to block the process from which they were launched (in this case, Pry).
|
73
|
+
# For those editors, return the flag that produces the desired behavior.
|
74
|
+
def blocking_flag_for_editor(blocking)
|
75
|
+
case editor_name
|
76
|
+
when /^emacsclient/
|
77
|
+
'--no-wait' unless blocking
|
78
|
+
when /^[gm]vim/
|
79
|
+
'--nofork' if blocking
|
80
|
+
when /^jedit/
|
81
|
+
'-wait' if blocking
|
82
|
+
when /^mate/, /^subl/
|
83
|
+
'-w' if blocking
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# Return the syntax for a given editor for starting the editor
|
88
|
+
# and moving to a particular line within that file
|
89
|
+
def start_line_syntax_for_editor(file_name, line_number)
|
90
|
+
# special case for 1st line
|
91
|
+
return file_name if line_number <= 1
|
92
|
+
|
93
|
+
case editor_name
|
94
|
+
when /^[gm]?vi/, /^emacs/, /^nano/, /^pico/, /^gedit/, /^kate/
|
95
|
+
"+#{line_number} #{file_name}"
|
96
|
+
when /^mate/, /^geany/
|
97
|
+
"-l #{line_number} #{file_name}"
|
98
|
+
when /^subl/
|
99
|
+
"#{file_name}:#{line_number}"
|
100
|
+
when /^uedit32/
|
101
|
+
"#{file_name}/#{line_number}"
|
102
|
+
when /^jedit/
|
103
|
+
"#{file_name} +line:#{line_number}"
|
104
|
+
else
|
105
|
+
if windows?
|
106
|
+
"#{file_name}"
|
107
|
+
else
|
108
|
+
"+#{line_number} #{file_name}"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
# Get the name of the binary that Pry.config.editor points to.
|
114
|
+
#
|
115
|
+
# This is useful for deciding which flags we pass to the editor as
|
116
|
+
# we can just use the program's name and ignore any absolute paths.
|
117
|
+
#
|
118
|
+
# @example
|
119
|
+
# Pry.config.editor="/home/conrad/bin/textmate -w"
|
120
|
+
# editor_name
|
121
|
+
# # => textmate
|
122
|
+
#
|
123
|
+
def editor_name
|
124
|
+
File.basename(Pry.config.editor).split(" ").first
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|