pry 0.9.12.2 → 0.14.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +1141 -0
- data/LICENSE +2 -2
- data/README.md +466 -0
- data/bin/pry +4 -7
- data/lib/pry/basic_object.rb +10 -0
- data/lib/pry/block_command.rb +22 -0
- data/lib/pry/class_command.rb +194 -0
- data/lib/pry/cli.rb +97 -92
- data/lib/pry/code/code_file.rb +114 -0
- data/lib/pry/code/code_range.rb +7 -4
- data/lib/pry/code/loc.rb +27 -14
- data/lib/pry/code.rb +62 -90
- data/lib/pry/code_object.rb +83 -39
- data/lib/pry/color_printer.rb +66 -0
- data/lib/pry/command.rb +202 -371
- data/lib/pry/command_set.rb +151 -133
- data/lib/pry/command_state.rb +31 -0
- data/lib/pry/commands/amend_line.rb +86 -82
- data/lib/pry/commands/bang.rb +18 -14
- data/lib/pry/commands/bang_pry.rb +15 -11
- data/lib/pry/commands/cat/abstract_formatter.rb +23 -18
- data/lib/pry/commands/cat/exception_formatter.rb +85 -73
- data/lib/pry/commands/cat/file_formatter.rb +56 -63
- data/lib/pry/commands/cat/input_expression_formatter.rb +35 -30
- data/lib/pry/commands/cat.rb +64 -47
- data/lib/pry/commands/cd.rb +42 -26
- data/lib/pry/commands/change_inspector.rb +34 -0
- data/lib/pry/commands/change_prompt.rb +51 -0
- data/lib/pry/commands/clear_screen.rb +20 -0
- data/lib/pry/commands/code_collector.rb +148 -131
- data/lib/pry/commands/disable_pry.rb +23 -19
- data/lib/pry/commands/easter_eggs.rb +23 -34
- data/lib/pry/commands/edit/exception_patcher.rb +21 -17
- data/lib/pry/commands/edit/file_and_line_locator.rb +33 -24
- data/lib/pry/commands/edit.rb +183 -167
- data/lib/pry/commands/exit.rb +40 -35
- data/lib/pry/commands/exit_all.rb +24 -20
- data/lib/pry/commands/exit_program.rb +20 -17
- data/lib/pry/commands/find_method.rb +167 -167
- data/lib/pry/commands/fix_indent.rb +16 -12
- data/lib/pry/commands/help.rb +140 -133
- data/lib/pry/commands/hist.rb +153 -132
- data/lib/pry/commands/import_set.rb +20 -15
- data/lib/pry/commands/jump_to.rb +25 -21
- data/lib/pry/commands/list_inspectors.rb +42 -0
- data/lib/pry/commands/ls/constants.rb +75 -0
- data/lib/pry/commands/ls/formatter.rb +55 -0
- data/lib/pry/commands/ls/globals.rb +50 -0
- data/lib/pry/commands/ls/grep.rb +23 -0
- data/lib/pry/commands/ls/instance_vars.rb +40 -0
- data/lib/pry/commands/ls/interrogatable.rb +24 -0
- data/lib/pry/commands/ls/jruby_hacks.rb +55 -0
- data/lib/pry/commands/ls/local_names.rb +37 -0
- data/lib/pry/commands/ls/local_vars.rb +47 -0
- data/lib/pry/commands/ls/ls_entity.rb +65 -0
- data/lib/pry/commands/ls/methods.rb +55 -0
- data/lib/pry/commands/ls/methods_helper.rb +50 -0
- data/lib/pry/commands/ls/self_methods.rb +34 -0
- data/lib/pry/commands/ls.rb +100 -303
- data/lib/pry/commands/nesting.rb +21 -17
- data/lib/pry/commands/play.rb +93 -49
- data/lib/pry/commands/pry_backtrace.rb +22 -18
- data/lib/pry/commands/pry_version.rb +15 -11
- data/lib/pry/commands/raise_up.rb +33 -27
- data/lib/pry/commands/reload_code.rb +57 -48
- data/lib/pry/commands/reset.rb +16 -12
- data/lib/pry/commands/ri.rb +57 -38
- data/lib/pry/commands/save_file.rb +45 -43
- data/lib/pry/commands/shell_command.rb +66 -34
- data/lib/pry/commands/shell_mode.rb +22 -20
- data/lib/pry/commands/show_doc.rb +80 -65
- data/lib/pry/commands/show_info.rb +193 -159
- data/lib/pry/commands/show_input.rb +16 -11
- data/lib/pry/commands/show_source.rb +113 -33
- data/lib/pry/commands/stat.rb +35 -31
- data/lib/pry/commands/switch_to.rb +21 -15
- data/lib/pry/commands/toggle_color.rb +21 -13
- data/lib/pry/commands/watch_expression/expression.rb +43 -0
- data/lib/pry/commands/watch_expression.rb +110 -0
- data/lib/pry/commands/whereami.rb +157 -134
- data/lib/pry/commands/wtf.rb +78 -40
- data/lib/pry/config/attributable.rb +22 -0
- data/lib/pry/config/lazy_value.rb +29 -0
- data/lib/pry/config/memoized_value.rb +34 -0
- data/lib/pry/config/value.rb +24 -0
- data/lib/pry/config.rb +290 -220
- data/lib/pry/control_d_handler.rb +28 -0
- data/lib/pry/core_extensions.rb +50 -27
- data/lib/pry/editor.rb +130 -102
- data/lib/pry/env.rb +18 -0
- data/lib/pry/exception_handler.rb +43 -0
- data/lib/pry/exceptions.rb +73 -0
- data/lib/pry/forwardable.rb +27 -0
- data/lib/pry/helpers/base_helpers.rb +22 -151
- data/lib/pry/helpers/command_helpers.rb +55 -63
- data/lib/pry/helpers/documentation_helpers.rb +21 -13
- data/lib/pry/helpers/options_helpers.rb +15 -8
- data/lib/pry/helpers/platform.rb +55 -0
- data/lib/pry/helpers/table.rb +44 -32
- data/lib/pry/helpers/text.rb +96 -86
- data/lib/pry/helpers.rb +3 -0
- data/lib/pry/history.rb +101 -70
- data/lib/pry/hooks.rb +67 -137
- data/lib/pry/indent.rb +79 -73
- data/lib/pry/input_completer.rb +283 -0
- data/lib/pry/input_lock.rb +129 -0
- data/lib/pry/inspector.rb +39 -0
- data/lib/pry/last_exception.rb +61 -0
- data/lib/pry/method/disowned.rb +19 -5
- data/lib/pry/{commands/edit/method_patcher.rb → method/patcher.rb} +51 -42
- data/lib/pry/method/weird_method_locator.rb +80 -44
- data/lib/pry/method.rb +225 -176
- data/lib/pry/object_path.rb +91 -0
- data/lib/pry/output.rb +136 -0
- data/lib/pry/pager.rb +227 -68
- data/lib/pry/prompt.rb +214 -0
- data/lib/pry/pry_class.rb +216 -289
- data/lib/pry/pry_instance.rb +438 -500
- data/lib/pry/repl.rb +256 -0
- data/lib/pry/repl_file_loader.rb +34 -35
- data/lib/pry/ring.rb +89 -0
- data/lib/pry/slop/LICENSE +20 -0
- data/lib/pry/slop/commands.rb +190 -0
- data/lib/pry/slop/option.rb +210 -0
- data/lib/pry/slop.rb +672 -0
- data/lib/pry/syntax_highlighter.rb +26 -0
- data/lib/pry/system_command_handler.rb +17 -0
- data/lib/pry/testable/evalable.rb +24 -0
- data/lib/pry/testable/mockable.rb +22 -0
- data/lib/pry/testable/pry_tester.rb +88 -0
- data/lib/pry/testable/utility.rb +34 -0
- data/lib/pry/testable/variables.rb +52 -0
- data/lib/pry/testable.rb +68 -0
- data/lib/pry/version.rb +3 -1
- data/lib/pry/warning.rb +20 -0
- data/lib/pry/{module_candidate.rb → wrapped_module/candidate.rb} +36 -43
- data/lib/pry/wrapped_module.rb +102 -103
- data/lib/pry.rb +135 -261
- metadata +94 -283
- data/.document +0 -2
- data/.gitignore +0 -16
- data/.travis.yml +0 -21
- data/.yardopts +0 -1
- data/CHANGELOG +0 -534
- data/CONTRIBUTORS +0 -55
- data/Gemfile +0 -9
- data/Guardfile +0 -62
- data/README.markdown +0 -400
- data/Rakefile +0 -140
- data/TODO +0 -117
- data/lib/pry/commands/disabled_commands.rb +0 -2
- data/lib/pry/commands/gem_cd.rb +0 -26
- data/lib/pry/commands/gem_install.rb +0 -29
- data/lib/pry/commands/gem_list.rb +0 -33
- data/lib/pry/commands/gem_open.rb +0 -29
- data/lib/pry/commands/gist.rb +0 -102
- data/lib/pry/commands/install_command.rb +0 -51
- data/lib/pry/commands/simple_prompt.rb +0 -22
- data/lib/pry/commands.rb +0 -6
- data/lib/pry/completion.rb +0 -304
- data/lib/pry/custom_completions.rb +0 -6
- data/lib/pry/history_array.rb +0 -116
- data/lib/pry/plugins.rb +0 -103
- data/lib/pry/rbx_method.rb +0 -13
- data/lib/pry/rbx_path.rb +0 -22
- data/lib/pry/rubygem.rb +0 -74
- data/lib/pry/terminal.rb +0 -78
- data/lib/pry/test/helper.rb +0 -185
- data/man/pry.1 +0 -195
- data/man/pry.1.html +0 -204
- data/man/pry.1.ronn +0 -141
- data/pry.gemspec +0 -30
- data/spec/Procfile +0 -3
- data/spec/cli_spec.rb +0 -78
- data/spec/code_object_spec.rb +0 -277
- data/spec/code_spec.rb +0 -219
- data/spec/command_helpers_spec.rb +0 -29
- data/spec/command_integration_spec.rb +0 -644
- data/spec/command_set_spec.rb +0 -627
- data/spec/command_spec.rb +0 -821
- data/spec/commands/amend_line_spec.rb +0 -247
- data/spec/commands/bang_spec.rb +0 -19
- data/spec/commands/cat_spec.rb +0 -164
- data/spec/commands/cd_spec.rb +0 -250
- data/spec/commands/disable_pry_spec.rb +0 -25
- data/spec/commands/edit_spec.rb +0 -727
- data/spec/commands/exit_all_spec.rb +0 -34
- data/spec/commands/exit_program_spec.rb +0 -19
- data/spec/commands/exit_spec.rb +0 -34
- data/spec/commands/find_method_spec.rb +0 -70
- data/spec/commands/gem_list_spec.rb +0 -26
- data/spec/commands/gist_spec.rb +0 -79
- data/spec/commands/help_spec.rb +0 -56
- data/spec/commands/hist_spec.rb +0 -181
- data/spec/commands/jump_to_spec.rb +0 -15
- data/spec/commands/ls_spec.rb +0 -181
- data/spec/commands/play_spec.rb +0 -140
- data/spec/commands/raise_up_spec.rb +0 -56
- data/spec/commands/save_file_spec.rb +0 -177
- data/spec/commands/show_doc_spec.rb +0 -510
- data/spec/commands/show_input_spec.rb +0 -17
- data/spec/commands/show_source_spec.rb +0 -782
- data/spec/commands/whereami_spec.rb +0 -203
- data/spec/completion_spec.rb +0 -239
- data/spec/control_d_handler_spec.rb +0 -58
- data/spec/documentation_helper_spec.rb +0 -73
- data/spec/editor_spec.rb +0 -79
- data/spec/exception_whitelist_spec.rb +0 -21
- data/spec/fixtures/candidate_helper1.rb +0 -11
- data/spec/fixtures/candidate_helper2.rb +0 -8
- data/spec/fixtures/example.erb +0 -5
- data/spec/fixtures/example_nesting.rb +0 -33
- data/spec/fixtures/show_source_doc_examples.rb +0 -15
- data/spec/fixtures/testrc +0 -2
- data/spec/fixtures/testrcbad +0 -2
- data/spec/fixtures/whereami_helper.rb +0 -6
- data/spec/helper.rb +0 -34
- data/spec/helpers/bacon.rb +0 -86
- data/spec/helpers/mock_pry.rb +0 -43
- data/spec/helpers/table_spec.rb +0 -105
- data/spec/history_array_spec.rb +0 -67
- data/spec/hooks_spec.rb +0 -522
- data/spec/indent_spec.rb +0 -301
- data/spec/input_stack_spec.rb +0 -90
- data/spec/method_spec.rb +0 -482
- data/spec/prompt_spec.rb +0 -60
- data/spec/pry_defaults_spec.rb +0 -419
- data/spec/pry_history_spec.rb +0 -99
- data/spec/pry_output_spec.rb +0 -95
- data/spec/pry_spec.rb +0 -504
- data/spec/run_command_spec.rb +0 -25
- data/spec/sticky_locals_spec.rb +0 -157
- data/spec/syntax_checking_spec.rb +0 -81
- data/spec/wrapped_module_spec.rb +0 -261
- data/wiki/Customizing-pry.md +0 -397
- data/wiki/Home.md +0 -4
@@ -1,99 +1,103 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Pry
|
2
|
-
class Command
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
4
|
+
class Command
|
5
|
+
class AmendLine < Pry::ClassCommand
|
6
|
+
match(/amend-line(?: (-?\d+)(?:\.\.(-?\d+))?)?/)
|
7
|
+
group 'Editing'
|
8
|
+
description 'Amend a line of input in multi-line mode.'
|
9
|
+
command_options interpolate: false, listing: 'amend-line'
|
10
|
+
|
11
|
+
banner <<-'BANNER'
|
12
|
+
Amend a line of input in multi-line mode. `amend-line N`, where the N represents
|
13
|
+
line to replace. Can also specify a range of lines using `amend-line N..M`
|
14
|
+
syntax. Passing "!" as replacement content deletes the line(s) instead.
|
15
|
+
|
16
|
+
amend-line 1 puts 'new' # replace line 1
|
17
|
+
amend-line 1..4 ! # delete lines 1..4
|
18
|
+
amend-line 3 >puts 'bye' # insert before line 3
|
19
|
+
amend-line puts 'appended' # no line number modifies immediately preceding line
|
20
|
+
BANNER
|
21
|
+
|
22
|
+
def process
|
23
|
+
raise CommandError, "No input to amend." if eval_string.empty?
|
24
|
+
|
25
|
+
eval_string.replace(amend_input)
|
26
|
+
run "fix-indent"
|
27
|
+
run "show-input"
|
28
|
+
end
|
26
29
|
|
27
|
-
|
30
|
+
private
|
28
31
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
input_array = eval_string.each_line.to_a
|
32
|
+
# @return [String] A new string with the amendments applied to it.
|
33
|
+
def amend_input
|
34
|
+
input_array = eval_string.each_line.to_a
|
33
35
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
36
|
+
if arg_string == "!"
|
37
|
+
delete_from_array(input_array, line_range)
|
38
|
+
elsif arg_string.start_with?(">")
|
39
|
+
insert_into_array(input_array, line_range)
|
40
|
+
else
|
41
|
+
replace_in_array(input_array, line_range)
|
42
|
+
end
|
41
43
|
|
42
|
-
|
43
|
-
|
44
|
+
input_array.join
|
45
|
+
end
|
44
46
|
|
45
|
-
|
46
|
-
|
47
|
-
|
47
|
+
def delete_from_array(array, range)
|
48
|
+
array.slice!(range)
|
49
|
+
end
|
48
50
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
51
|
+
def insert_into_array(array, range)
|
52
|
+
insert_slot = Array(range).first
|
53
|
+
array.insert(insert_slot, arg_string[1..-1] << "\n")
|
54
|
+
end
|
53
55
|
|
54
|
-
|
55
|
-
|
56
|
-
|
56
|
+
def replace_in_array(array, range)
|
57
|
+
array[range] = arg_string + "\n"
|
58
|
+
end
|
57
59
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
60
|
+
# @return [Fixnum] The number of lines currently in `eval_string` (the
|
61
|
+
# input buffer)
|
62
|
+
def line_count
|
63
|
+
eval_string.lines.count
|
64
|
+
end
|
62
65
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
66
|
+
# Returns the (one-indexed) start and end lines given by the user.
|
67
|
+
# The lines in this range will be affected by the `amend-line`.
|
68
|
+
# Returns `nil` if no lines were specified by the user.
|
69
|
+
# @return [Array<Fixnum>, nil]
|
70
|
+
def start_and_end_line_number
|
71
|
+
start_line_number, end_line_number = args
|
72
|
+
end_line_number ||= start_line_number.to_i
|
70
73
|
|
71
|
-
|
72
|
-
|
74
|
+
[start_line_number.to_i, end_line_number.to_i] if start_line_number
|
75
|
+
end
|
73
76
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
77
|
+
# Takes two numbers that are 1-indexed, and returns a range (or
|
78
|
+
# number) that is 0-indexed. 1-indexed means the first element is
|
79
|
+
# indentified by 1 rather than by 0 (as is the case for Ruby arrays).
|
80
|
+
# @param [Fixnum] start_line_number One-indexed number.
|
81
|
+
# @param [Fixnum] end_line_number One-indexed number.
|
82
|
+
# @return [Range] The zero-indexed range.
|
83
|
+
def zero_indexed_range_from_one_indexed_numbers(start_line_number, end_line_number)
|
84
|
+
# FIXME: one_index_number is a horrible name for this method
|
85
|
+
one_index_number(start_line_number)..one_index_number(end_line_number)
|
86
|
+
end
|
84
87
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
88
|
+
# The lines (or line) that will be modified by the `amend-line`.
|
89
|
+
# @return [Range, Fixnum] The lines or line.
|
90
|
+
def line_range
|
91
|
+
start_line_number, end_line_number = start_and_end_line_number
|
92
|
+
if start_line_number
|
93
|
+
zero_indexed_range_from_one_indexed_numbers(start_line_number,
|
94
|
+
end_line_number)
|
95
|
+
else
|
96
|
+
line_count - 1
|
97
|
+
end
|
94
98
|
end
|
95
99
|
end
|
96
|
-
end
|
97
100
|
|
98
|
-
|
101
|
+
Pry::Commands.add_command(Pry::Command::AmendLine)
|
102
|
+
end
|
99
103
|
end
|
data/lib/pry/commands/bang.rb
CHANGED
@@ -1,20 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Pry
|
2
|
-
class Command
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
class Command
|
5
|
+
class Bang < Pry::ClassCommand
|
6
|
+
match(/^\s*!\s*$/)
|
7
|
+
group 'Editing'
|
8
|
+
description 'Clear the input buffer.'
|
9
|
+
command_options use_prefix: false, listing: '!'
|
7
10
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
11
|
+
banner <<-'BANNER'
|
12
|
+
Clear the input buffer. Useful if the parsing process goes wrong and you get
|
13
|
+
stuck in the read loop.
|
14
|
+
BANNER
|
12
15
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
+
def process
|
17
|
+
output.puts 'Input buffer cleared!'
|
18
|
+
eval_string.replace('')
|
19
|
+
end
|
16
20
|
end
|
17
|
-
end
|
18
21
|
|
19
|
-
|
22
|
+
Pry::Commands.add_command(Pry::Command::Bang)
|
23
|
+
end
|
20
24
|
end
|
@@ -1,17 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Pry
|
2
|
-
class Command
|
3
|
-
|
4
|
-
|
5
|
-
|
4
|
+
class Command
|
5
|
+
class BangPry < Pry::ClassCommand
|
6
|
+
match '!pry'
|
7
|
+
group 'Navigating Pry'
|
8
|
+
description 'Start a Pry session on current self.'
|
6
9
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
+
banner <<-'BANNER'
|
11
|
+
Start a Pry session on current self. Also works mid multi-line expression.
|
12
|
+
BANNER
|
10
13
|
|
11
|
-
|
12
|
-
|
14
|
+
def process
|
15
|
+
target.pry
|
16
|
+
end
|
13
17
|
end
|
14
|
-
end
|
15
18
|
|
16
|
-
|
19
|
+
Pry::Commands.add_command(Pry::Command::BangPry)
|
20
|
+
end
|
17
21
|
end
|
@@ -1,26 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Pry
|
2
|
-
class Command
|
3
|
-
class
|
4
|
-
|
5
|
-
|
4
|
+
class Command
|
5
|
+
class Cat
|
6
|
+
class AbstractFormatter
|
7
|
+
include Pry::Helpers::CommandHelpers
|
8
|
+
include Pry::Helpers::BaseHelpers
|
6
9
|
|
7
|
-
|
8
|
-
def decorate(content)
|
9
|
-
content.code_type = code_type
|
10
|
-
content.between(*between_lines).
|
11
|
-
with_line_numbers(use_line_numbers?)
|
12
|
-
end
|
10
|
+
private
|
13
11
|
|
14
|
-
|
15
|
-
|
16
|
-
|
12
|
+
def decorate(content)
|
13
|
+
content.code_type = code_type
|
14
|
+
content.between(*between_lines)
|
15
|
+
.with_line_numbers(use_line_numbers?).highlighted
|
16
|
+
end
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
def code_type
|
19
|
+
opts[:type] || :ruby
|
20
|
+
end
|
21
|
+
|
22
|
+
def use_line_numbers?
|
23
|
+
opts.present?(:'line-numbers') || opts.present?(:ex)
|
24
|
+
end
|
21
25
|
|
22
|
-
|
23
|
-
|
26
|
+
def between_lines
|
27
|
+
[opts[:start] || 1, opts[:end] || -1]
|
28
|
+
end
|
24
29
|
end
|
25
30
|
end
|
26
31
|
end
|
@@ -1,78 +1,90 @@
|
|
1
|
-
|
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
|
1
|
+
# frozen_string_literal: true
|
59
2
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
3
|
+
class Pry
|
4
|
+
class Command
|
5
|
+
class Cat
|
6
|
+
class ExceptionFormatter < AbstractFormatter
|
7
|
+
attr_reader :ex
|
8
|
+
attr_reader :opts
|
9
|
+
attr_reader :pry_instance
|
10
|
+
include Pry::Helpers::Text
|
11
|
+
|
12
|
+
def initialize(exception, pry_instance, opts)
|
13
|
+
@ex = exception
|
14
|
+
@opts = opts
|
15
|
+
@pry_instance = pry_instance
|
16
|
+
end
|
17
|
+
|
18
|
+
def format
|
19
|
+
check_for_errors
|
20
|
+
set_file_and_dir_locals(
|
21
|
+
backtrace_file, pry_instance, pry_instance.current_context
|
22
|
+
)
|
23
|
+
code = decorate(
|
24
|
+
Pry::Code.from_file(backtrace_file)
|
25
|
+
.between(*start_and_end_line_for_code_window)
|
26
|
+
.with_marker(backtrace_line)
|
27
|
+
)
|
28
|
+
"#{header}#{code}"
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def code_window_size
|
34
|
+
pry_instance.config.default_window_size || 5
|
35
|
+
end
|
36
|
+
|
37
|
+
def backtrace_level
|
38
|
+
@backtrace_level ||=
|
39
|
+
begin
|
40
|
+
bl =
|
41
|
+
if opts[:ex].nil?
|
42
|
+
ex.bt_index
|
43
|
+
else
|
44
|
+
ex.bt_index = absolute_index_number(opts[:ex], ex.backtrace.size)
|
45
|
+
end
|
46
|
+
|
47
|
+
increment_backtrace_level
|
48
|
+
bl
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def increment_backtrace_level
|
53
|
+
ex.inc_bt_index
|
54
|
+
end
|
55
|
+
|
56
|
+
def backtrace_file
|
57
|
+
Array(ex.bt_source_location_for(backtrace_level)).first
|
58
|
+
end
|
59
|
+
|
60
|
+
def backtrace_line
|
61
|
+
Array(ex.bt_source_location_for(backtrace_level)).last
|
62
|
+
end
|
63
|
+
|
64
|
+
def check_for_errors
|
65
|
+
raise CommandError, "No exception found." unless ex
|
66
|
+
return if backtrace_file
|
67
|
+
|
68
|
+
raise CommandError, "The given backtrace level is out of bounds."
|
69
|
+
end
|
70
|
+
|
71
|
+
def start_and_end_line_for_code_window
|
72
|
+
start_line = backtrace_line - code_window_size
|
73
|
+
start_line = 1 if start_line < 1
|
74
|
+
|
75
|
+
[start_line, backtrace_line + code_window_size]
|
76
|
+
end
|
77
|
+
|
78
|
+
def header
|
79
|
+
unindent(
|
80
|
+
"#{bold 'Exception:'} #{ex.class}: #{ex.message}\n" \
|
81
|
+
"--\n" \
|
82
|
+
"#{bold('From:')} #{backtrace_file}:#{backtrace_line} @ " \
|
83
|
+
"#{bold("level: #{backtrace_level}")} of backtrace " \
|
84
|
+
"(of #{ex.backtrace.size - 1}).\n\n"
|
85
|
+
)
|
86
|
+
end
|
74
87
|
end
|
75
|
-
|
76
88
|
end
|
77
89
|
end
|
78
90
|
end
|
@@ -1,81 +1,74 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Pry
|
2
|
-
class Command
|
3
|
-
class
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
class Command
|
5
|
+
class Cat
|
6
|
+
class FileFormatter < AbstractFormatter
|
7
|
+
attr_reader :file_with_embedded_line
|
8
|
+
attr_reader :opts
|
9
|
+
attr_reader :pry_instance
|
7
10
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
end
|
11
|
+
def initialize(file_with_embedded_line, pry_instance, opts)
|
12
|
+
unless file_with_embedded_line
|
13
|
+
raise CommandError, "Must provide a filename, --in, or --ex."
|
14
|
+
end
|
13
15
|
|
14
|
-
|
15
|
-
|
16
|
+
@file_with_embedded_line = file_with_embedded_line
|
17
|
+
@opts = opts
|
18
|
+
@pry_instance = pry_instance
|
19
|
+
@code_from_file = Pry::Code.from_file(file_name)
|
20
|
+
end
|
16
21
|
|
17
|
-
|
18
|
-
|
19
|
-
|
22
|
+
def format
|
23
|
+
set_file_and_dir_locals(file_name, pry_instance, pry_instance.current_context)
|
24
|
+
decorate(@code_from_file)
|
25
|
+
end
|
20
26
|
|
21
|
-
|
27
|
+
def file_and_line
|
28
|
+
file_name, line_num = file_with_embedded_line.split(%r{:(?!/|\\)})
|
22
29
|
|
23
|
-
|
24
|
-
|
30
|
+
[file_name, line_num ? line_num.to_i : nil]
|
31
|
+
end
|
25
32
|
|
26
|
-
|
27
|
-
end
|
33
|
+
private
|
28
34
|
|
29
|
-
|
30
|
-
|
31
|
-
|
35
|
+
def file_name
|
36
|
+
file_and_line.first
|
37
|
+
end
|
32
38
|
|
33
|
-
|
34
|
-
|
35
|
-
|
39
|
+
def line_number
|
40
|
+
file_and_line.last
|
41
|
+
end
|
36
42
|
|
37
|
-
|
38
|
-
|
39
|
-
|
43
|
+
def code_window_size
|
44
|
+
pry_instance.config.default_window_size || 7
|
45
|
+
end
|
40
46
|
|
41
|
-
|
42
|
-
|
43
|
-
|
47
|
+
def decorate(content)
|
48
|
+
if line_number
|
49
|
+
super(content.around(line_number, code_window_size))
|
50
|
+
else
|
51
|
+
super
|
52
|
+
end
|
53
|
+
end
|
44
54
|
|
45
|
-
|
46
|
-
|
47
|
-
|
55
|
+
def code_type
|
56
|
+
opts[:type] || detect_code_type_from_file(file_name)
|
57
|
+
end
|
48
58
|
|
49
|
-
|
50
|
-
|
59
|
+
def detect_code_type_from_file(file_name)
|
60
|
+
code_type = @code_from_file.code_type
|
51
61
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
when "yml", "prytheme"
|
61
|
-
:yaml
|
62
|
-
when "groovy"
|
63
|
-
:groovy
|
64
|
-
when "c"
|
65
|
-
:c
|
66
|
-
when "cpp"
|
67
|
-
:cpp
|
68
|
-
when "java"
|
69
|
-
:java
|
70
|
-
else
|
71
|
-
:text
|
72
|
-
end
|
73
|
-
else
|
74
|
-
case name
|
75
|
-
when "Rakefile", "Gemfile"
|
76
|
-
:ruby
|
62
|
+
if code_type == :unknown
|
63
|
+
name = File.basename(file_name).split('.', 2).first
|
64
|
+
case name
|
65
|
+
when "Rakefile", "Gemfile"
|
66
|
+
:ruby
|
67
|
+
else
|
68
|
+
:text
|
69
|
+
end
|
77
70
|
else
|
78
|
-
|
71
|
+
code_type
|
79
72
|
end
|
80
73
|
end
|
81
74
|
end
|