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/helpers.rb
CHANGED
@@ -15,16 +15,20 @@ class Pry
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
18
|
+
# Acts like send but ignores any methods defined below Object or Class in the
|
19
|
+
# inheritance hierarchy.
|
20
|
+
# This is required to introspect methods on objects like Net::HTTP::Get that
|
21
|
+
# have overridden the `method` method.
|
22
|
+
def safe_send(obj, method, *args, &block)
|
23
|
+
(Module === obj ? Module : Object).instance_method(method).bind(obj).call(*args, &block)
|
24
|
+
end
|
25
|
+
public :safe_send
|
26
|
+
|
27
|
+
def find_command(name, set = Pry::Commands)
|
28
|
+
command_match = set.find do |_, command|
|
29
|
+
(listing = command.options[:listing]) == name && listing != nil
|
30
|
+
end
|
31
|
+
command_match.last if command_match
|
28
32
|
end
|
29
33
|
|
30
34
|
def not_a_real_file?(file)
|
@@ -34,11 +38,11 @@ class Pry
|
|
34
38
|
def command_dependencies_met?(options)
|
35
39
|
return true if !options[:requires_gem]
|
36
40
|
Array(options[:requires_gem]).all? do |g|
|
37
|
-
|
41
|
+
Rubygem.installed?(g)
|
38
42
|
end
|
39
43
|
end
|
40
44
|
|
41
|
-
def set_file_and_dir_locals(file_name)
|
45
|
+
def set_file_and_dir_locals(file_name, _pry_=_pry_(), target=target())
|
42
46
|
return if !target or !file_name
|
43
47
|
_pry_.last_file = File.expand_path(file_name)
|
44
48
|
_pry_.inject_local("_file_", _pry_.last_file, target)
|
@@ -47,30 +51,8 @@ class Pry
|
|
47
51
|
_pry_.inject_local("_dir_", _pry_.last_dir, target)
|
48
52
|
end
|
49
53
|
|
50
|
-
def stub_proc(name, options)
|
51
|
-
gems_needed = Array(options[:requires_gem])
|
52
|
-
gems_not_installed = gems_needed.select { |g| !gem_installed?(g) }
|
53
|
-
proc do
|
54
|
-
output.puts "\nThe command '#{name}' requires the following gems to be installed: #{(gems_needed.join(", "))}"
|
55
|
-
output.puts "-"
|
56
|
-
output.puts "Command not available due to dependency on gems: `#{gems_not_installed.join(", ")}` not being met."
|
57
|
-
output.puts "-"
|
58
|
-
output.puts "Type `install #{name}` to install the required gems and activate this command."
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def create_command_stub(names, description, options, block)
|
63
|
-
Array(names).each do |name|
|
64
|
-
commands[name] = {
|
65
|
-
:description => "Not available. Execute #{(name)} command for more information.",
|
66
|
-
:action => stub_proc(name, options),
|
67
|
-
:stub_info => options
|
68
|
-
}
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
54
|
def use_ansi_codes?
|
73
|
-
|
55
|
+
windows_ansi? || ENV['TERM'] && ENV['TERM'] != "dumb"
|
74
56
|
end
|
75
57
|
|
76
58
|
def colorize_code(code)
|
@@ -91,10 +73,6 @@ class Pry
|
|
91
73
|
Pry.color ? "\e[1m#{text}\e[0m": text
|
92
74
|
end
|
93
75
|
|
94
|
-
def page_size
|
95
|
-
27
|
96
|
-
end
|
97
|
-
|
98
76
|
# have fun on the Windows platform.
|
99
77
|
def windows?
|
100
78
|
RbConfig::CONFIG['host_os'] =~ /mswin|mingw/
|
@@ -123,103 +101,95 @@ class Pry
|
|
123
101
|
RUBY_VERSION =~ /1.9/ && RbConfig::CONFIG['ruby_install_name'] == 'ruby'
|
124
102
|
end
|
125
103
|
|
126
|
-
# a simple pager for systems without `less`. A la windows.
|
127
|
-
def simple_pager(text, output=output())
|
128
|
-
text_array = text.lines.to_a
|
129
|
-
text_array.each_slice(page_size) do |chunk|
|
130
|
-
output.puts chunk.join
|
131
|
-
break if chunk.size < page_size
|
132
|
-
if text_array.size > page_size
|
133
|
-
output.puts "\n<page break> --- Press enter to continue ( q<enter> to break ) --- <page break>"
|
134
|
-
break if $stdin.gets.chomp == "q"
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
104
|
# Try to use `less` for paging, if it fails then use
|
140
105
|
# simple_pager. Also do not page if Pry.pager is falsey
|
141
|
-
# FIXME! Another JRuby hack
|
142
106
|
def stagger_output(text, out = nil)
|
143
107
|
out ||= case
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
if text.lines.count < page_size || !Pry.pager
|
108
|
+
when respond_to?(:output)
|
109
|
+
# Mixin.
|
110
|
+
output
|
111
|
+
when Pry.respond_to?(:output)
|
112
|
+
# Parent.
|
113
|
+
Pry.output
|
114
|
+
else
|
115
|
+
# Sys.
|
116
|
+
$stdout
|
117
|
+
end
|
118
|
+
|
119
|
+
if text.lines.count < Pry::Pager.page_size || !Pry.pager
|
156
120
|
out.puts text
|
157
|
-
return
|
158
|
-
end
|
159
|
-
|
160
|
-
# FIXME! Another JRuby hack
|
161
|
-
if jruby?
|
162
|
-
simple_pager(text, out)
|
163
121
|
else
|
164
|
-
|
122
|
+
Pry::Pager.page(text)
|
165
123
|
end
|
166
124
|
rescue Errno::ENOENT
|
167
|
-
|
125
|
+
Pry::Pager.page(text, :simple)
|
168
126
|
rescue Errno::EPIPE
|
169
127
|
end
|
170
128
|
|
171
|
-
#
|
172
|
-
#
|
173
|
-
#
|
174
|
-
#
|
175
|
-
#
|
176
|
-
|
177
|
-
# Example:
|
178
|
-
#
|
179
|
-
# lesspipe do |less|
|
180
|
-
# 50.times { less.puts "Hi mom!" }
|
181
|
-
# end
|
182
|
-
#
|
183
|
-
# The default less parameters are:
|
184
|
-
# * Allow colour
|
185
|
-
# * Don't wrap lines longer than the screen
|
186
|
-
# * Quit immediately (without paging) if there's less than one screen of text.
|
187
|
-
#
|
188
|
-
# You can change these options by passing a hash to `lesspipe`, like so:
|
189
|
-
#
|
190
|
-
# lesspipe(:wrap=>false) { |less| less.puts essay.to_s }
|
191
|
-
#
|
192
|
-
# It accepts the following boolean options:
|
193
|
-
# :color => Allow ANSI colour codes?
|
194
|
-
# :wrap => Wrap long lines?
|
195
|
-
# :always => Always page, even if there's less than one page of text?
|
196
|
-
#
|
197
|
-
def lesspipe(*args)
|
198
|
-
if args.any? and args.last.is_a?(Hash)
|
199
|
-
options = args.pop
|
200
|
-
else
|
201
|
-
options = {}
|
202
|
-
end
|
129
|
+
# @param [String] arg_string The object path expressed as a string.
|
130
|
+
# @param [Pry] _pry_ The relevant Pry instance.
|
131
|
+
# @param [Array<Binding>] old_stack The state of the old binding stack
|
132
|
+
# @return [Array<Array<Binding>, Array<Binding>>] An array
|
133
|
+
# containing two elements: The new `binding_stack` and the old `binding_stack`.
|
134
|
+
def context_from_object_path(arg_string, _pry_=nil, old_stack=[])
|
203
135
|
|
204
|
-
|
136
|
+
# Extract command arguments. Delete blank arguments like " ", but
|
137
|
+
# don't delete empty strings like "".
|
138
|
+
path = arg_string.split(/\//).delete_if { |a| a =~ /\A\s+\z/ }
|
139
|
+
stack = _pry_.binding_stack.dup
|
140
|
+
state_old_stack = old_stack
|
205
141
|
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
if options[:tail] == true
|
211
|
-
params << "+\\>"
|
212
|
-
$stderr.puts "Seeking to end of stream..."
|
142
|
+
# Special case when we only get a single "/", return to root.
|
143
|
+
if path.empty?
|
144
|
+
state_old_stack = stack.dup unless old_stack.empty?
|
145
|
+
stack = [stack.first]
|
213
146
|
end
|
214
|
-
params << "-X"
|
215
147
|
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
148
|
+
path.each_with_index do |context, i|
|
149
|
+
begin
|
150
|
+
case context.chomp
|
151
|
+
when ""
|
152
|
+
state_old_stack = stack.dup
|
153
|
+
stack = [stack.first]
|
154
|
+
when "::"
|
155
|
+
state_old_stack = stack.dup
|
156
|
+
stack.push(TOPLEVEL_BINDING)
|
157
|
+
when "."
|
158
|
+
next
|
159
|
+
when ".."
|
160
|
+
unless stack.size == 1
|
161
|
+
# Don't rewrite old_stack if we're in complex expression
|
162
|
+
# (e.g.: `cd 1/2/3/../4).
|
163
|
+
state_old_stack = stack.dup if path.first == ".."
|
164
|
+
stack.pop
|
165
|
+
end
|
166
|
+
when "-"
|
167
|
+
unless old_stack.empty?
|
168
|
+
# Interchange current stack and old stack with each other.
|
169
|
+
stack, state_old_stack = state_old_stack, stack
|
170
|
+
end
|
171
|
+
else
|
172
|
+
state_old_stack = stack.dup if i == 0
|
173
|
+
stack.push(Pry.binding_for(stack.last.eval(context)))
|
174
|
+
end
|
175
|
+
|
176
|
+
rescue RescuableException => e
|
177
|
+
# Restore old stack to its initial values.
|
178
|
+
state_old_stack = old_stack
|
179
|
+
|
180
|
+
msg = [
|
181
|
+
"Bad object path: #{arg_string}.",
|
182
|
+
"Failed trying to resolve: #{context}.",
|
183
|
+
e.inspect
|
184
|
+
].join(' ')
|
185
|
+
|
186
|
+
CommandError.new(msg).tap do |err|
|
187
|
+
err.set_backtrace e.backtrace
|
188
|
+
raise err
|
189
|
+
end
|
221
190
|
end
|
222
191
|
end
|
192
|
+
return stack, state_old_stack
|
223
193
|
end
|
224
194
|
|
225
195
|
end
|
@@ -23,24 +23,8 @@ class Pry
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
# Return the file and line for a Binding.
|
27
|
-
# @param [Binding] target The binding
|
28
|
-
# @return [Array] The file and line
|
29
|
-
def file_and_line_from_binding(target)
|
30
|
-
file = target.eval('__FILE__')
|
31
|
-
line_num = target.eval('__LINE__')
|
32
|
-
if rbx?
|
33
|
-
if !target.instance_variable_defined?(:@__actual_file__)
|
34
|
-
target.instance_variable_set(:@__actual_file__, RbxPath.convert_path_to_full(target.variables.method.file.to_s))
|
35
|
-
end
|
36
|
-
file = target.instance_variable_get(:@__actual_file__).to_s
|
37
|
-
end
|
38
|
-
|
39
|
-
[file, line_num]
|
40
|
-
end
|
41
|
-
|
42
26
|
def internal_binding?(target)
|
43
|
-
m = target.eval("__method__").to_s
|
27
|
+
m = target.eval("::Kernel.__method__").to_s
|
44
28
|
# class_eval is here because of http://jira.codehaus.org/browse/JRUBY-6753
|
45
29
|
["__binding__", "__pry__", "class_eval"].include?(m)
|
46
30
|
end
|
@@ -49,19 +33,19 @@ class Pry
|
|
49
33
|
meth = Pry::Method.from_str(name, target, opts)
|
50
34
|
|
51
35
|
if name && !meth
|
52
|
-
command_error("The method '#{name}' could not be found.", omit_help)
|
36
|
+
command_error("The method '#{name}' could not be found.", omit_help, MethodNotFound)
|
53
37
|
end
|
54
38
|
|
55
39
|
(opts[:super] || 0).times do
|
56
40
|
if meth.super
|
57
41
|
meth = meth.super
|
58
42
|
else
|
59
|
-
command_error("'#{meth.name_with_owner}' has no super method.", omit_help)
|
43
|
+
command_error("'#{meth.name_with_owner}' has no super method.", omit_help, MethodNotFound)
|
60
44
|
end
|
61
45
|
end
|
62
46
|
|
63
47
|
if !meth || (!name && internal_binding?(target))
|
64
|
-
command_error("No method name given, and context is not a method.", omit_help,
|
48
|
+
command_error("No method name given, and context is not a method.", omit_help, MethodNotFound)
|
65
49
|
end
|
66
50
|
|
67
51
|
set_file_and_dir_locals(meth.source_file)
|
@@ -73,104 +57,6 @@ class Pry
|
|
73
57
|
raise klass, message
|
74
58
|
end
|
75
59
|
|
76
|
-
def make_header(meth, content=meth.source)
|
77
|
-
header = "\n#{Pry::Helpers::Text.bold('From:')} #{meth.source_file} "
|
78
|
-
|
79
|
-
if meth.source_type == :c
|
80
|
-
header << "(C Method):\n"
|
81
|
-
else
|
82
|
-
header << "@ line #{meth.source_line}:\n"
|
83
|
-
end
|
84
|
-
|
85
|
-
header << "#{Pry::Helpers::Text.bold("Number of lines:")} #{content.each_line.count.to_s}\n"
|
86
|
-
end
|
87
|
-
|
88
|
-
def invoke_editor(file, line, reloading)
|
89
|
-
raise CommandError, "Please set Pry.config.editor or export $VISUAL or $EDITOR" unless Pry.config.editor
|
90
|
-
if Pry.config.editor.respond_to?(:call)
|
91
|
-
args = [file, line, reloading][0...(Pry.config.editor.arity)]
|
92
|
-
editor_invocation = Pry.config.editor.call(*args)
|
93
|
-
else
|
94
|
-
editor_invocation = "#{Pry.config.editor} #{blocking_flag_for_editor(reloading)} #{start_line_syntax_for_editor(file, line)}"
|
95
|
-
end
|
96
|
-
return nil unless editor_invocation
|
97
|
-
|
98
|
-
if jruby?
|
99
|
-
begin
|
100
|
-
require 'spoon'
|
101
|
-
pid = Spoon.spawnp(*editor_invocation.split)
|
102
|
-
Process.waitpid(pid)
|
103
|
-
rescue FFI::NotFoundError
|
104
|
-
system(editor_invocation)
|
105
|
-
end
|
106
|
-
else
|
107
|
-
# Note we dont want to use Pry.config.system here as that
|
108
|
-
# may be invoked non-interactively (i.e via Open4), whereas we want to
|
109
|
-
# ensure the editor is always interactive
|
110
|
-
system(editor_invocation) or raise CommandError, "`#{editor_invocation}` gave exit status: #{$?.exitstatus}"
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
# Some editors that run outside the terminal allow you to control whether or
|
115
|
-
# not to block the process from which they were launched (in this case, Pry).
|
116
|
-
# For those editors, return the flag that produces the desired behavior.
|
117
|
-
def blocking_flag_for_editor(block)
|
118
|
-
case editor_name
|
119
|
-
when /^emacsclient/
|
120
|
-
'--no-wait' unless block
|
121
|
-
when /^[gm]vim/
|
122
|
-
'--nofork' if block
|
123
|
-
when /^jedit/
|
124
|
-
'-wait' if block
|
125
|
-
when /^mate/, /^subl/
|
126
|
-
'-w' if block
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
# Return the syntax for a given editor for starting the editor
|
131
|
-
# and moving to a particular line within that file
|
132
|
-
def start_line_syntax_for_editor(file_name, line_number)
|
133
|
-
if windows?
|
134
|
-
file_name = file_name.gsub(/\//, '\\')
|
135
|
-
end
|
136
|
-
|
137
|
-
# special case for 1st line
|
138
|
-
return file_name if line_number <= 1
|
139
|
-
|
140
|
-
case editor_name
|
141
|
-
when /^[gm]?vi/, /^emacs/, /^nano/, /^pico/, /^gedit/, /^kate/
|
142
|
-
"+#{line_number} #{file_name}"
|
143
|
-
when /^mate/, /^geany/
|
144
|
-
"-l #{line_number} #{file_name}"
|
145
|
-
when /^subl/
|
146
|
-
"#{file_name}:#{line_number}"
|
147
|
-
when /^uedit32/
|
148
|
-
"#{file_name}/#{line_number}"
|
149
|
-
when /^jedit/
|
150
|
-
"#{file_name} +line:#{line_number}"
|
151
|
-
else
|
152
|
-
if windows?
|
153
|
-
"#{file_name}"
|
154
|
-
else
|
155
|
-
"+#{line_number} #{file_name}"
|
156
|
-
end
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
# Get the name of the binary that Pry.config.editor points to.
|
161
|
-
#
|
162
|
-
# This is useful for deciding which flags we pass to the editor as
|
163
|
-
# we can just use the program's name and ignore any absolute paths.
|
164
|
-
#
|
165
|
-
# @example
|
166
|
-
# Pry.config.editor="/home/conrad/bin/textmate -w"
|
167
|
-
# editor_name
|
168
|
-
# # => textmate
|
169
|
-
#
|
170
|
-
def editor_name
|
171
|
-
File.basename(Pry.config.editor).split(" ").first
|
172
|
-
end
|
173
|
-
|
174
60
|
# Remove any common leading whitespace from every line in `text`.
|
175
61
|
#
|
176
62
|
# This can be used to make a HEREDOC line up with the left margin, without
|
@@ -193,7 +79,7 @@ class Pry
|
|
193
79
|
#
|
194
80
|
# @param [String] text The text from which to remove indentation
|
195
81
|
# @return [String] The text with indentation stripped.
|
196
|
-
def unindent(text)
|
82
|
+
def unindent(text, left_padding = 0)
|
197
83
|
# Empty blank lines
|
198
84
|
text = text.sub(/^[ \t]+$/, '')
|
199
85
|
|
@@ -208,7 +94,7 @@ class Pry
|
|
208
94
|
end
|
209
95
|
end
|
210
96
|
|
211
|
-
text.gsub(/^#{margin}/, '')
|
97
|
+
text.gsub(/^#{margin}/, ' ' * left_padding)
|
212
98
|
end
|
213
99
|
|
214
100
|
# Restrict a string to the given range of lines (1-indexed)
|
@@ -262,6 +148,5 @@ class Pry
|
|
262
148
|
Range.new(a, b)
|
263
149
|
end
|
264
150
|
end
|
265
|
-
|
266
151
|
end
|
267
152
|
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
class Pry
|
2
|
+
module Helpers
|
3
|
+
def self.tablify_to_screen_width(things)
|
4
|
+
things = things.compact
|
5
|
+
|
6
|
+
if TerminalInfo.screen_size.nil?
|
7
|
+
return things.join(Pry.config.ls.separator)
|
8
|
+
end
|
9
|
+
|
10
|
+
screen_width = (TerminalInfo.screen_size || [25, 80])[1]
|
11
|
+
tablify(things, screen_width)
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.tablify(things, line_length)
|
15
|
+
table = Table.new(things, :column_count => things.size)
|
16
|
+
table.column_count -= 1 until 0 == table.column_count or
|
17
|
+
table.fits_on_line?(line_length)
|
18
|
+
table
|
19
|
+
end
|
20
|
+
|
21
|
+
class Table
|
22
|
+
attr_reader :items, :column_count
|
23
|
+
def initialize items, args = {}
|
24
|
+
@column_count = args[:column_count]
|
25
|
+
self.items = items
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_s
|
29
|
+
rows_to_s.join("\n")
|
30
|
+
end
|
31
|
+
|
32
|
+
def rows_to_s style = :color_on
|
33
|
+
widths = columns.map{|e| _max_width(e)}
|
34
|
+
@rows_without_colors.map do |r|
|
35
|
+
padded = []
|
36
|
+
r.each_with_index do |e,i|
|
37
|
+
next unless e
|
38
|
+
item = e.ljust(widths[i])
|
39
|
+
item.sub! e, _recall_color_for(e) if :color_on == style
|
40
|
+
padded << item
|
41
|
+
end
|
42
|
+
padded.join(Pry.config.ls.separator)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def items= items
|
47
|
+
@items = items
|
48
|
+
_rebuild_colorless_cache
|
49
|
+
_recolumn
|
50
|
+
items
|
51
|
+
end
|
52
|
+
|
53
|
+
def column_count= n
|
54
|
+
@column_count = n
|
55
|
+
_recolumn
|
56
|
+
end
|
57
|
+
|
58
|
+
def fits_on_line? line_length
|
59
|
+
_max_width(rows_to_s :no_color) <= line_length
|
60
|
+
end
|
61
|
+
|
62
|
+
def columns
|
63
|
+
@rows_without_colors.transpose
|
64
|
+
end
|
65
|
+
|
66
|
+
def ==(other); items == other.to_a end
|
67
|
+
def to_a; items.to_a end
|
68
|
+
|
69
|
+
private
|
70
|
+
def _max_width(things)
|
71
|
+
things.compact.map(&:size).max || 0
|
72
|
+
end
|
73
|
+
|
74
|
+
def _rebuild_colorless_cache
|
75
|
+
@colorless_cache = {}
|
76
|
+
@plain_items = []
|
77
|
+
items.map do |e|
|
78
|
+
plain = Pry::Helpers::Text.strip_color(e)
|
79
|
+
@colorless_cache[plain] = e
|
80
|
+
@plain_items << plain
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def _recolumn
|
85
|
+
@rows_without_colors = []
|
86
|
+
return if items.size.zero?
|
87
|
+
row_count = (items.size.to_f/column_count).ceil
|
88
|
+
row_count.times do |i|
|
89
|
+
row_indices = (0...column_count).map{|e| row_count*e+i}
|
90
|
+
@rows_without_colors << row_indices.map{|e| @plain_items[e]}
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def _recall_color_for thing
|
95
|
+
@colorless_cache[thing]
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|