pry 0.9.10pre1-java → 0.9.11-java
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +3 -1
- data/CHANGELOG +63 -2
- 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 +30 -19
- 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 +7 -122
- 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 +239 -115
- 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/command_set.rb
CHANGED
@@ -81,7 +81,7 @@ class Pry
|
|
81
81
|
# # number-N regex command
|
82
82
|
def block_command(match, description="No description.", options={}, &block)
|
83
83
|
description, options = ["No description.", description] if description.is_a?(Hash)
|
84
|
-
options = default_options(match).merge!(options)
|
84
|
+
options = Pry::Command.default_options(match).merge!(options)
|
85
85
|
|
86
86
|
commands[match] = Pry::BlockCommand.subclass(match, description, options, helper_module, &block)
|
87
87
|
end
|
@@ -113,7 +113,7 @@ class Pry
|
|
113
113
|
#
|
114
114
|
def create_command(match, description="No description.", options={}, &block)
|
115
115
|
description, options = ["No description.", description] if description.is_a?(Hash)
|
116
|
-
options = default_options(match).merge!(options)
|
116
|
+
options = Pry::Command.default_options(match).merge!(options)
|
117
117
|
|
118
118
|
commands[match] = Pry::ClassCommand.subclass(match, description, options, helper_module, &block)
|
119
119
|
commands[match].class_eval(&block)
|
@@ -148,7 +148,7 @@ class Pry
|
|
148
148
|
cmd.hooks[:after] << block
|
149
149
|
end
|
150
150
|
|
151
|
-
def each
|
151
|
+
def each(&block)
|
152
152
|
@commands.each(&block)
|
153
153
|
end
|
154
154
|
|
@@ -196,16 +196,10 @@ class Pry
|
|
196
196
|
# of the command to retrieve.
|
197
197
|
# @return [Command] The command object matched.
|
198
198
|
def find_command_by_match_or_listing(match_or_listing)
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
_, cmd = commands.find { |match, command| command.options[:listing] == match_or_listing }
|
203
|
-
end
|
204
|
-
|
205
|
-
raise ArgumentError, "Cannot find a command: '#{match_or_listing}'!" if !cmd
|
206
|
-
cmd
|
199
|
+
cmd = (commands[match_or_listing] ||
|
200
|
+
Pry::Helpers::BaseHelpers.find_command(match_or_listing, commands))
|
201
|
+
cmd or raise ArgumentError, "Cannot find a command: '#{match_or_listing}'!"
|
207
202
|
end
|
208
|
-
protected :find_command_by_match_or_listing
|
209
203
|
|
210
204
|
# Aliases a command
|
211
205
|
# @param [String, Regex] match The match of the alias (can be a regex).
|
@@ -219,7 +213,8 @@ class Pry
|
|
219
213
|
# @example Pass explicit description (overriding default).
|
220
214
|
# Pry.config.commands.alias_command "lM", "ls -M", :desc => "cutiepie"
|
221
215
|
def alias_command(match, action, options={})
|
222
|
-
|
216
|
+
cmd = find_command(action) or fail "Command: `#{action}` not found"
|
217
|
+
original_options = cmd.options.dup
|
223
218
|
|
224
219
|
options = original_options.merge!({
|
225
220
|
:desc => "Alias for `#{action}`",
|
@@ -233,6 +228,12 @@ class Pry
|
|
233
228
|
run action, *args
|
234
229
|
end
|
235
230
|
|
231
|
+
c.class_eval do
|
232
|
+
define_method(:complete) do |input|
|
233
|
+
cmd.new(context).complete(input)
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
236
237
|
c.group "Aliases"
|
237
238
|
|
238
239
|
c
|
@@ -262,6 +263,17 @@ class Pry
|
|
262
263
|
commands.delete(cmd.match)
|
263
264
|
end
|
264
265
|
|
266
|
+
def deprecated_command(name_of_deprecated_command, deprecation_message, matcher=name_of_deprecated_command)
|
267
|
+
create_command name_of_deprecated_command do
|
268
|
+
match matcher
|
269
|
+
description ""
|
270
|
+
|
271
|
+
define_method(:process) do
|
272
|
+
output.puts "DEPRECATED: #{deprecation_message}"
|
273
|
+
end
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
265
277
|
# Sets or gets the description for a command (replacing the old
|
266
278
|
# description). Returns current description if no description
|
267
279
|
# parameter provided.
|
@@ -348,19 +360,18 @@ class Pry
|
|
348
360
|
command.new(context).call_safely(*args)
|
349
361
|
end
|
350
362
|
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
}
|
363
|
+
# Generate completions for the user's search.
|
364
|
+
# @param [String] search The line to search for
|
365
|
+
# @param [Hash] context The context to create the command with
|
366
|
+
# @return [Array<String>]
|
367
|
+
def complete(search, context={})
|
368
|
+
if command = find_command(search)
|
369
|
+
command.new(context).complete(search)
|
370
|
+
else
|
371
|
+
commands.keys.select do |x|
|
372
|
+
String === x && x.start_with?(search)
|
373
|
+
end.map{ |command| command + " " } + Bond::DefaultMission.completions
|
374
|
+
end
|
364
375
|
end
|
365
376
|
end
|
366
377
|
|
data/lib/pry/commands.rb
CHANGED
@@ -1,29 +1,6 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require "pry/default_commands/gems"
|
4
|
-
require "pry/default_commands/context"
|
5
|
-
require "pry/default_commands/commands"
|
6
|
-
require "pry/default_commands/input_and_output"
|
7
|
-
require "pry/default_commands/introspection"
|
8
|
-
require "pry/default_commands/editing"
|
9
|
-
require "pry/default_commands/navigating_pry"
|
10
|
-
require "pry/default_commands/easter_eggs"
|
1
|
+
# Default commands used by Pry.
|
2
|
+
Pry::Commands = Pry::CommandSet.new
|
11
3
|
|
12
|
-
|
13
|
-
|
14
|
-
class Pry
|
15
|
-
|
16
|
-
# Default commands used by Pry.
|
17
|
-
Commands = Pry::CommandSet.new do
|
18
|
-
import DefaultCommands::Misc
|
19
|
-
import DefaultCommands::Help
|
20
|
-
import DefaultCommands::Gems
|
21
|
-
import DefaultCommands::Context
|
22
|
-
import DefaultCommands::NavigatingPry
|
23
|
-
import DefaultCommands::Editing
|
24
|
-
import DefaultCommands::InputAndOutput
|
25
|
-
import DefaultCommands::Introspection
|
26
|
-
import DefaultCommands::EasterEggs
|
27
|
-
import DefaultCommands::Commands
|
28
|
-
end
|
4
|
+
Dir[File.expand_path('../commands/*.rb', __FILE__)].each do |file|
|
5
|
+
require file
|
29
6
|
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
class Pry
|
2
|
+
class Command::AmendLine < Pry::ClassCommand
|
3
|
+
match /amend-line(?: (-?\d+)(?:\.\.(-?\d+))?)?/
|
4
|
+
group 'Editing'
|
5
|
+
description 'Amend a line of input in multi-line mode.'
|
6
|
+
command_options :interpolate => false, :listing => 'amend-line'
|
7
|
+
|
8
|
+
banner <<-'BANNER'
|
9
|
+
Amend a line of input in multi-line mode. `amend-line N`, where the N represents
|
10
|
+
line to replace. Can also specify a range of lines using `amend-line N..M`
|
11
|
+
syntax. Passing "!" as replacement content deletes the line(s) instead.
|
12
|
+
|
13
|
+
amend-line 1 puts 'new' # replace line 1
|
14
|
+
amend-line 1..4 ! # delete lines 1..4
|
15
|
+
amend-line 3 >puts 'bye' # insert before line 3
|
16
|
+
amend-line puts 'appended' # no line number modifies immediately preceding line
|
17
|
+
BANNER
|
18
|
+
|
19
|
+
def process
|
20
|
+
raise CommandError, "No input to amend." if eval_string.empty?
|
21
|
+
|
22
|
+
eval_string.replace amended_input(eval_string)
|
23
|
+
run "fix-indent"
|
24
|
+
run "show-input"
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
# @param [String] string The string to amend.
|
30
|
+
# @return [String] A new string with the amendments applied to it.
|
31
|
+
def amended_input(string)
|
32
|
+
input_array = eval_string.each_line.to_a
|
33
|
+
|
34
|
+
if arg_string == "!"
|
35
|
+
delete_from_array(input_array, line_range)
|
36
|
+
elsif arg_string.start_with?(">")
|
37
|
+
insert_into_array(input_array, line_range)
|
38
|
+
else
|
39
|
+
replace_in_array(input_array, line_range)
|
40
|
+
end
|
41
|
+
|
42
|
+
input_array.join
|
43
|
+
end
|
44
|
+
|
45
|
+
def delete_from_array(array, range)
|
46
|
+
array.slice!(range)
|
47
|
+
end
|
48
|
+
|
49
|
+
def insert_into_array(array, range)
|
50
|
+
insert_slot = Array(range).first
|
51
|
+
array.insert(insert_slot, arg_string[1..-1] + "\n")
|
52
|
+
end
|
53
|
+
|
54
|
+
def replace_in_array(array, range)
|
55
|
+
array[range] = arg_string + "\n"
|
56
|
+
end
|
57
|
+
|
58
|
+
# @return [Fixnum] The number of lines currently in `eval_string` (the input buffer).
|
59
|
+
def line_count
|
60
|
+
eval_string.lines.count
|
61
|
+
end
|
62
|
+
|
63
|
+
# Returns the (one-indexed) start and end lines given by the user.
|
64
|
+
# The lines in this range will be affected by the `amend-line`.
|
65
|
+
# Returns `nil` if no lines were specified by the user.
|
66
|
+
# @return [Array<Fixnum>, nil]
|
67
|
+
def start_and_end_line_number
|
68
|
+
start_line_number, end_line_number = args
|
69
|
+
end_line_number ||= start_line_number.to_i
|
70
|
+
|
71
|
+
[start_line_number.to_i, end_line_number.to_i] if start_line_number
|
72
|
+
end
|
73
|
+
|
74
|
+
# Takes two numbers that are 1-indexed, and returns a range (or
|
75
|
+
# number) that is 0-indexed. 1-indexed means the first element is
|
76
|
+
# indentified by 1 rather than by 0 (as is the case for Ruby arrays).
|
77
|
+
# @param [Fixnum] start_line_number One-indexed number.
|
78
|
+
# @param [Fixnum] end_line_number One-indexed number.
|
79
|
+
# @return [Range] The zero-indexed range.
|
80
|
+
def zero_indexed_range_from_one_indexed_numbers(start_line_number, end_line_number)
|
81
|
+
# FIXME: one_index_number is a horrible name for this method
|
82
|
+
one_index_number(start_line_number)..one_index_number(end_line_number)
|
83
|
+
end
|
84
|
+
|
85
|
+
# The lines (or line) that will be modified by the `amend-line`.
|
86
|
+
# @return [Range, Fixnum] The lines or line.
|
87
|
+
def line_range
|
88
|
+
start_line_number, end_line_number = start_and_end_line_number
|
89
|
+
if start_line_number
|
90
|
+
zero_indexed_range_from_one_indexed_numbers(start_line_number,
|
91
|
+
end_line_number)
|
92
|
+
else
|
93
|
+
line_count - 1
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
Pry::Commands.add_command(Pry::Command::AmendLine)
|
99
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class Pry
|
2
|
+
class Command::Bang < Pry::ClassCommand
|
3
|
+
match '!'
|
4
|
+
group 'Editing'
|
5
|
+
description 'Clear the input buffer.'
|
6
|
+
command_options :use_prefix => false
|
7
|
+
|
8
|
+
banner <<-'BANNER'
|
9
|
+
Clear the input buffer. Useful if the parsing process goes wrong and you get
|
10
|
+
stuck in the read loop.
|
11
|
+
BANNER
|
12
|
+
|
13
|
+
def process
|
14
|
+
output.puts 'Input buffer cleared!'
|
15
|
+
eval_string.replace('')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
Pry::Commands.add_command(Pry::Command::Bang)
|
20
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class Pry
|
2
|
+
class Command::BangPry < Pry::ClassCommand
|
3
|
+
match '!pry'
|
4
|
+
group 'Navigating Pry'
|
5
|
+
description 'Start a Pry session on current self.'
|
6
|
+
|
7
|
+
banner <<-'BANNER'
|
8
|
+
Start a Pry session on current self. Also works mid multi-line expression.
|
9
|
+
BANNER
|
10
|
+
|
11
|
+
def process
|
12
|
+
target.pry
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
Pry::Commands.add_command(Pry::Command::BangPry)
|
17
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
class Pry
|
2
|
+
class Command::Cat < Pry::ClassCommand
|
3
|
+
require 'pry/commands/cat/abstract_formatter.rb'
|
4
|
+
require 'pry/commands/cat/input_expression_formatter.rb'
|
5
|
+
require 'pry/commands/cat/exception_formatter.rb'
|
6
|
+
require 'pry/commands/cat/file_formatter.rb'
|
7
|
+
|
8
|
+
match 'cat'
|
9
|
+
group 'Input and Output'
|
10
|
+
description "Show code from a file, Pry's input buffer, or the last exception."
|
11
|
+
|
12
|
+
banner <<-'BANNER'
|
13
|
+
Usage: cat FILE
|
14
|
+
cat --ex [STACK_INDEX]
|
15
|
+
cat --in [INPUT_INDEX_OR_RANGE]
|
16
|
+
|
17
|
+
`cat` is capable of showing part or all of a source file, the context of the
|
18
|
+
last exception, or an expression from Pry's input history.
|
19
|
+
|
20
|
+
`cat --ex` defaults to showing the lines surrounding the location of the last
|
21
|
+
exception. Invoking it more than once travels up the exception's backtrace, and
|
22
|
+
providing a number shows the context of the given index of the backtrace.
|
23
|
+
BANNER
|
24
|
+
|
25
|
+
def options(opt)
|
26
|
+
opt.on :ex, "Show the context of the last exception", :optional_argument => true, :as => Integer
|
27
|
+
opt.on :i, :in, "Show one or more entries from Pry's expression history", :optional_argument => true, :as => Range, :default => -5..-1
|
28
|
+
opt.on :s, :start, "Starting line (defaults to the first line)", :optional_argument => true, :as => Integer
|
29
|
+
opt.on :e, :end, "Ending line (defaults to the last line)", :optional_argument => true, :as => Integer
|
30
|
+
opt.on :l, :'line-numbers', "Show line numbers"
|
31
|
+
opt.on :t, :type, "The file type for syntax highlighting (e.g., 'ruby' or 'python')", :argument => true, :as => Symbol
|
32
|
+
end
|
33
|
+
|
34
|
+
def process
|
35
|
+
output = case
|
36
|
+
when opts.present?(:ex)
|
37
|
+
ExceptionFormatter.new(_pry_.last_exception, _pry_, opts).format
|
38
|
+
when opts.present?(:in)
|
39
|
+
InputExpressionFormatter.new(_pry_.input_array, opts).format
|
40
|
+
else
|
41
|
+
FileFormatter.new(args.first, _pry_, opts).format
|
42
|
+
end
|
43
|
+
|
44
|
+
stagger_output(output)
|
45
|
+
end
|
46
|
+
|
47
|
+
def complete(search)
|
48
|
+
super + Bond::Rc.files(search.split(" ").last || '')
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
Pry::Commands.add_command(Pry::Command::Cat)
|
53
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class Pry
|
2
|
+
class Command::Cat
|
3
|
+
class AbstractFormatter
|
4
|
+
include Pry::Helpers::CommandHelpers
|
5
|
+
include Pry::Helpers::BaseHelpers
|
6
|
+
|
7
|
+
private
|
8
|
+
def decorate(content)
|
9
|
+
content.code_type = code_type
|
10
|
+
content.between(*between_lines).
|
11
|
+
with_line_numbers(use_line_numbers?)
|
12
|
+
end
|
13
|
+
|
14
|
+
def code_type
|
15
|
+
opts[:type] || :ruby
|
16
|
+
end
|
17
|
+
|
18
|
+
def use_line_numbers?
|
19
|
+
opts.present?(:'line-numbers') || opts.present?(:ex)
|
20
|
+
end
|
21
|
+
|
22
|
+
def between_lines
|
23
|
+
[opts[:start] || 1, opts[:end] || -1]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
class Pry
|
2
|
+
class Command::Cat
|
3
|
+
class ExceptionFormatter < AbstractFormatter
|
4
|
+
attr_accessor :ex
|
5
|
+
attr_accessor :opts
|
6
|
+
attr_accessor :_pry_
|
7
|
+
|
8
|
+
def initialize(exception, _pry_, opts)
|
9
|
+
@ex = exception
|
10
|
+
@opts = opts
|
11
|
+
@_pry_ = _pry_
|
12
|
+
end
|
13
|
+
|
14
|
+
def format
|
15
|
+
check_for_errors
|
16
|
+
set_file_and_dir_locals(backtrace_file, _pry_, _pry_.current_context)
|
17
|
+
code = decorate(Pry::Code.from_file(backtrace_file).
|
18
|
+
between(*start_and_end_line_for_code_window).
|
19
|
+
with_marker(backtrace_line)).to_s
|
20
|
+
"#{header}#{code}"
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def code_window_size
|
26
|
+
Pry.config.default_window_size || 5
|
27
|
+
end
|
28
|
+
|
29
|
+
def backtrace_level
|
30
|
+
return @backtrace_level if @backtrace_level
|
31
|
+
|
32
|
+
bl = if opts[:ex].nil?
|
33
|
+
ex.bt_index
|
34
|
+
else
|
35
|
+
ex.bt_index = absolute_index_number(opts[:ex], ex.backtrace.size)
|
36
|
+
end
|
37
|
+
|
38
|
+
increment_backtrace_level
|
39
|
+
@backtrace_level = bl
|
40
|
+
end
|
41
|
+
|
42
|
+
def increment_backtrace_level
|
43
|
+
ex.inc_bt_index
|
44
|
+
end
|
45
|
+
|
46
|
+
def backtrace_file
|
47
|
+
file = Array(ex.bt_source_location_for(backtrace_level)).first
|
48
|
+
(file && RbxPath.is_core_path?(file)) ? RbxPath.convert_path_to_full(file) : file
|
49
|
+
end
|
50
|
+
|
51
|
+
def backtrace_line
|
52
|
+
Array(ex.bt_source_location_for(backtrace_level)).last
|
53
|
+
end
|
54
|
+
|
55
|
+
def check_for_errors
|
56
|
+
raise CommandError, "No exception found." unless ex
|
57
|
+
raise CommandError, "The given backtrace level is out of bounds." unless backtrace_file
|
58
|
+
end
|
59
|
+
|
60
|
+
def start_and_end_line_for_code_window
|
61
|
+
start_line = backtrace_line - code_window_size
|
62
|
+
start_line = 1 if start_line < 1
|
63
|
+
|
64
|
+
[start_line, backtrace_line + code_window_size]
|
65
|
+
end
|
66
|
+
|
67
|
+
def header
|
68
|
+
unindent %{
|
69
|
+
#{Helpers::Text.bold 'Exception:'} #{ex.class}: #{ex.message}
|
70
|
+
--
|
71
|
+
#{Helpers::Text.bold('From:')} #{backtrace_file} @ line #{backtrace_line} @ #{Helpers::Text.bold("level: #{backtrace_level}")} of backtrace (of #{ex.backtrace.size - 1}).
|
72
|
+
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|