pry 0.9.12.2 → 0.14.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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,23 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Pry
|
2
|
-
class Command
|
3
|
-
|
4
|
-
|
5
|
-
|
4
|
+
class Command
|
5
|
+
class SwitchTo < Pry::ClassCommand
|
6
|
+
match 'switch-to'
|
7
|
+
group 'Navigating Pry'
|
8
|
+
description 'Start a new subsession on a binding in the current stack.'
|
6
9
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
+
banner <<-'BANNER'
|
11
|
+
Start a new subsession on a binding in the current stack (numbered by nesting).
|
12
|
+
BANNER
|
10
13
|
|
11
|
-
|
12
|
-
|
14
|
+
def process(selection)
|
15
|
+
selection = selection.to_i
|
13
16
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
17
|
+
if selection < 0 || selection > pry_instance.binding_stack.size - 1
|
18
|
+
raise CommandError,
|
19
|
+
"Invalid binding index #{selection} - use `nesting` command " \
|
20
|
+
"to view valid indices."
|
21
|
+
else
|
22
|
+
Pry.start(pry_instance.binding_stack[selection])
|
23
|
+
end
|
18
24
|
end
|
19
25
|
end
|
20
|
-
end
|
21
26
|
|
22
|
-
|
27
|
+
Pry::Commands.add_command(Pry::Command::SwitchTo)
|
28
|
+
end
|
23
29
|
end
|
@@ -1,20 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Pry
|
2
|
-
class Command
|
3
|
-
|
4
|
-
|
5
|
-
|
4
|
+
class Command
|
5
|
+
class ToggleColor < Pry::ClassCommand
|
6
|
+
match 'toggle-color'
|
7
|
+
group 'Misc'
|
8
|
+
description 'Toggle syntax highlighting.'
|
9
|
+
|
10
|
+
banner <<-'BANNER'
|
11
|
+
Usage: toggle-color
|
6
12
|
|
7
|
-
|
8
|
-
|
13
|
+
Toggle syntax highlighting.
|
14
|
+
BANNER
|
9
15
|
|
10
|
-
|
11
|
-
|
16
|
+
def process
|
17
|
+
pry_instance.color = color_toggle
|
18
|
+
output.puts "Syntax highlighting #{pry_instance.color ? 'on' : 'off'}"
|
19
|
+
end
|
12
20
|
|
13
|
-
|
14
|
-
|
15
|
-
|
21
|
+
def color_toggle
|
22
|
+
!pry_instance.color
|
23
|
+
end
|
24
|
+
|
25
|
+
Pry::Commands.add_command(self)
|
16
26
|
end
|
17
27
|
end
|
18
|
-
|
19
|
-
Pry::Commands.add_command(Pry::Command::ToggleColor)
|
20
28
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Pry
|
4
|
+
class Command
|
5
|
+
class WatchExpression
|
6
|
+
class Expression
|
7
|
+
attr_reader :target, :source, :value, :previous_value, :pry_instance
|
8
|
+
|
9
|
+
def initialize(pry_instance, target, source)
|
10
|
+
@pry_instance = pry_instance
|
11
|
+
@target = target
|
12
|
+
@source = Code.new(source).strip
|
13
|
+
end
|
14
|
+
|
15
|
+
def eval!
|
16
|
+
@previous_value = value
|
17
|
+
@value = Pry::ColorPrinter.pp(target_eval(target, source), ''.dup)
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_s
|
21
|
+
"#{Code.new(source).highlighted.strip} => #{value}"
|
22
|
+
end
|
23
|
+
|
24
|
+
# Has the value of the expression changed?
|
25
|
+
#
|
26
|
+
# We use the pretty-printed string represenation to detect differences
|
27
|
+
# as this avoids problems with dup (causes too many differences) and ==
|
28
|
+
# (causes too few)
|
29
|
+
def changed?
|
30
|
+
(value != previous_value)
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def target_eval(target, source)
|
36
|
+
target.eval(source)
|
37
|
+
rescue StandardError => e
|
38
|
+
e
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Pry
|
4
|
+
class Command
|
5
|
+
class WatchExpression < Pry::ClassCommand
|
6
|
+
match 'watch'
|
7
|
+
group 'Context'
|
8
|
+
description 'Watch the value of an expression and print a notification ' \
|
9
|
+
'whenever it changes.'
|
10
|
+
command_options use_prefix: false
|
11
|
+
|
12
|
+
banner <<-'BANNER'
|
13
|
+
Usage: watch [EXPRESSION]
|
14
|
+
watch
|
15
|
+
watch --delete [INDEX]
|
16
|
+
|
17
|
+
watch [EXPRESSION] adds an expression to the list of those being watched.
|
18
|
+
It will be re-evaluated every time you hit enter in pry. If its value has
|
19
|
+
changed, the new value will be printed to the console.
|
20
|
+
|
21
|
+
This is useful if you are step-through debugging and want to see how
|
22
|
+
something changes over time. It's also useful if you're trying to write
|
23
|
+
a method inside pry and want to check that it gives the right answers
|
24
|
+
every time you redefine it.
|
25
|
+
|
26
|
+
watch on its own displays all the currently watched expressions and their
|
27
|
+
values, and watch --delete [INDEX] allows you to delete expressions from
|
28
|
+
the list being watched.
|
29
|
+
BANNER
|
30
|
+
|
31
|
+
def options(opt)
|
32
|
+
opt.on :d, :delete,
|
33
|
+
"Delete the watch expression with the given index. If no index " \
|
34
|
+
"is given; clear all watch expressions.",
|
35
|
+
optional_argument: true, as: Integer
|
36
|
+
opt.on :l, :list,
|
37
|
+
"Show all current watch expressions and their values. Calling " \
|
38
|
+
"watch with no expressions or options will also show the watch " \
|
39
|
+
"expressions."
|
40
|
+
end
|
41
|
+
|
42
|
+
def process
|
43
|
+
if opts.present?(:delete)
|
44
|
+
delete opts[:delete]
|
45
|
+
elsif opts.present?(:list) || args.empty?
|
46
|
+
list
|
47
|
+
else
|
48
|
+
add_hook
|
49
|
+
add_expression(args)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def expressions
|
56
|
+
state.watch_expressions ||= []
|
57
|
+
end
|
58
|
+
|
59
|
+
def delete(index)
|
60
|
+
if index
|
61
|
+
output.puts "Deleting watch expression ##{index}: #{expressions[index - 1]}"
|
62
|
+
expressions.delete_at(index - 1)
|
63
|
+
else
|
64
|
+
output.puts "Deleting all watched expressions"
|
65
|
+
expressions.clear
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def list
|
70
|
+
if expressions.empty?
|
71
|
+
output.puts "No watched expressions"
|
72
|
+
else
|
73
|
+
pry_instance.pager.open do |pager|
|
74
|
+
pager.puts "Listing all watched expressions:"
|
75
|
+
pager.puts ""
|
76
|
+
expressions.each_with_index do |expr, index|
|
77
|
+
pager.print with_line_numbers(expr.to_s, index + 1)
|
78
|
+
end
|
79
|
+
pager.puts ""
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def eval_and_print_changed(output)
|
85
|
+
expressions.each do |expr|
|
86
|
+
expr.eval!
|
87
|
+
output.puts "#{blue 'watch'}: #{expr}" if expr.changed?
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# TODO: fix arguments.
|
92
|
+
# https://github.com/pry/pry/commit/b031df2f2f5850ee6e9018f33d35f3485a9b0423
|
93
|
+
def add_expression(_arguments)
|
94
|
+
expressions << Expression.new(pry_instance, target, arg_string)
|
95
|
+
output.puts "Watching #{Code.new(arg_string).highlighted}"
|
96
|
+
end
|
97
|
+
|
98
|
+
def add_hook
|
99
|
+
hook = %i[after_eval watch_expression]
|
100
|
+
return if pry_instance.hooks.hook_exists?(*hook)
|
101
|
+
|
102
|
+
pry_instance.hooks.add_hook(*hook) do |_, pry_instance|
|
103
|
+
eval_and_print_changed pry_instance.output
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
Pry::Commands.add_command(Pry::Command::WatchExpression)
|
109
|
+
end
|
110
|
+
end
|
@@ -1,182 +1,205 @@
|
|
1
|
-
|
2
|
-
class Command::Whereami < Pry::ClassCommand
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
|
-
|
5
|
-
attr_accessor :method_size_cutoff
|
6
|
-
end
|
3
|
+
require 'method_source'
|
7
4
|
|
8
|
-
|
5
|
+
class Pry
|
6
|
+
class Command
|
7
|
+
class Whereami < Pry::ClassCommand
|
8
|
+
def initialize(*)
|
9
|
+
super
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
group 'Context'
|
11
|
+
@method_code = nil
|
12
|
+
end
|
13
13
|
|
14
|
-
|
15
|
-
|
14
|
+
class << self
|
15
|
+
attr_accessor :method_size_cutoff
|
16
|
+
end
|
16
17
|
|
17
|
-
|
18
|
-
whereami will print out the source for that method.
|
18
|
+
@method_size_cutoff = 30
|
19
19
|
|
20
|
-
|
21
|
-
|
20
|
+
match 'whereami'
|
21
|
+
description 'Show code surrounding the current context.'
|
22
|
+
group 'Context'
|
22
23
|
|
23
|
-
|
24
|
-
|
25
|
-
you when you arrive at a `binding.pry`.
|
24
|
+
banner <<-'BANNER'
|
25
|
+
Usage: whereami [-qn] [LINES]
|
26
26
|
|
27
|
-
|
28
|
-
|
27
|
+
Describe the current location. If you use `binding.pry` inside a method then
|
28
|
+
whereami will print out the source for that method.
|
29
29
|
|
30
|
-
|
31
|
-
|
32
|
-
BANNER
|
30
|
+
If a number is passed, then LINES lines before and after the current line will be
|
31
|
+
shown instead of the method itself.
|
33
32
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
@method = Pry::Method.from_binding(target)
|
38
|
-
end
|
33
|
+
The `-q` flag can be used to suppress error messages in the case that there's
|
34
|
+
no code to show. This is used by pry in the default before_session hook to show
|
35
|
+
you when you arrive at a `binding.pry`.
|
39
36
|
|
40
|
-
|
41
|
-
|
42
|
-
opt.on :n, :"no-line-numbers", "Do not display line numbers"
|
43
|
-
opt.on :m, :"method", "Show the complete source for the current method."
|
44
|
-
opt.on :c, :"class", "Show the complete source for the current class or module."
|
45
|
-
opt.on :f, :"file", "Show the complete source for the current file."
|
46
|
-
end
|
37
|
+
The `-n` flag can be used to hide line numbers so that code can be copy/pasted
|
38
|
+
effectively.
|
47
39
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
elsif opts.present?(:c)
|
52
|
-
class_code or raise CommandError, "Cannot find class code."
|
53
|
-
elsif opts.present?(:f)
|
54
|
-
Pry::Code.from_file(@file)
|
55
|
-
elsif args.any?
|
56
|
-
code_window
|
57
|
-
else
|
58
|
-
default_code
|
59
|
-
end
|
60
|
-
end
|
40
|
+
When pry was started on an Object and there is no associated method, whereami
|
41
|
+
will instead output a brief description of the current object.
|
42
|
+
BANNER
|
61
43
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
44
|
+
def setup
|
45
|
+
if target.respond_to?(:source_location)
|
46
|
+
file, @line = target.source_location
|
47
|
+
@file = expand_path(file)
|
48
|
+
else
|
49
|
+
@file = expand_path(target.eval('__FILE__'))
|
50
|
+
@line = target.eval('__LINE__')
|
51
|
+
end
|
52
|
+
@method = Pry::Method.from_binding(target)
|
53
|
+
end
|
67
54
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
55
|
+
def options(opt)
|
56
|
+
opt.on :q, :quiet, "Don't display anything in case of an error"
|
57
|
+
opt.on :n, :"no-line-numbers", "Do not display line numbers"
|
58
|
+
opt.on :m, :method, "Show the complete source for the current method."
|
59
|
+
opt.on :c, :class, "Show the complete source for the current class or module."
|
60
|
+
opt.on :f, :file, "Show the complete source for the current file."
|
61
|
+
end
|
72
62
|
|
73
|
-
|
74
|
-
|
75
|
-
|
63
|
+
def code
|
64
|
+
@code ||= if opts.present?(:m)
|
65
|
+
method_code || raise(CommandError, "Cannot find method code.")
|
66
|
+
elsif opts.present?(:c)
|
67
|
+
class_code || raise(CommandError, "Cannot find class code.")
|
68
|
+
elsif opts.present?(:f)
|
69
|
+
Pry::Code.from_file(@file)
|
70
|
+
elsif args.any?
|
71
|
+
code_window
|
72
|
+
else
|
73
|
+
default_code
|
74
|
+
end
|
75
|
+
end
|
76
76
|
|
77
|
-
|
78
|
-
|
79
|
-
|
77
|
+
def code?
|
78
|
+
!!code
|
79
|
+
rescue MethodSource::SourceNotFoundError
|
80
|
+
false
|
80
81
|
end
|
81
82
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
handle_internal_binding
|
86
|
-
return
|
83
|
+
def bad_option_combination?
|
84
|
+
[opts.present?(:m), opts.present?(:f),
|
85
|
+
opts.present?(:c), args.any?].count(true) > 1
|
87
86
|
end
|
88
87
|
|
89
|
-
|
88
|
+
def location
|
89
|
+
"#{@file}:#{@line} #{@method && @method.name_with_owner}"
|
90
|
+
end
|
90
91
|
|
91
|
-
|
92
|
-
|
92
|
+
def process
|
93
|
+
if bad_option_combination?
|
94
|
+
raise CommandError, "Only one of -m, -c, -f, and LINES may be specified."
|
95
|
+
end
|
93
96
|
|
94
|
-
|
95
|
-
end
|
97
|
+
return if nothing_to_do?
|
96
98
|
|
97
|
-
|
99
|
+
if internal_binding?(target)
|
100
|
+
handle_internal_binding
|
101
|
+
return
|
102
|
+
end
|
98
103
|
|
99
|
-
|
100
|
-
opts.quiet? && (internal_binding?(target) || !code?)
|
101
|
-
end
|
104
|
+
set_file_and_dir_locals(@file)
|
102
105
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
+
pretty_code = code.with_line_numbers(use_line_numbers?)
|
107
|
+
.with_marker(marker)
|
108
|
+
.highlighted
|
109
|
+
pry_instance.pager.page(
|
110
|
+
"\n#{bold('From:')} #{location}:\n\n" + pretty_code + "\n"
|
111
|
+
)
|
112
|
+
end
|
106
113
|
|
107
|
-
|
108
|
-
!opts.present?(:n) && @line
|
109
|
-
end
|
114
|
+
private
|
110
115
|
|
111
|
-
|
112
|
-
|
113
|
-
|
116
|
+
def nothing_to_do?
|
117
|
+
opts.quiet? && (internal_binding?(target) || !code?)
|
118
|
+
end
|
114
119
|
|
115
|
-
|
116
|
-
|
117
|
-
output.puts "At the top level."
|
118
|
-
else
|
119
|
-
output.puts "Inside #{Pry.view_clip(target_self)}."
|
120
|
+
def use_line_numbers?
|
121
|
+
!opts.present?(:n)
|
120
122
|
end
|
121
|
-
end
|
122
123
|
|
123
|
-
|
124
|
-
|
125
|
-
|
124
|
+
def marker
|
125
|
+
!opts.present?(:n) && @line
|
126
|
+
end
|
126
127
|
|
127
|
-
|
128
|
-
|
129
|
-
method_code
|
130
|
-
else
|
131
|
-
code_window
|
128
|
+
def top_level?
|
129
|
+
target_self == Pry.main
|
132
130
|
end
|
133
|
-
end
|
134
131
|
|
135
|
-
|
136
|
-
|
137
|
-
|
132
|
+
def handle_internal_binding
|
133
|
+
if top_level?
|
134
|
+
output.puts "At the top level."
|
135
|
+
else
|
136
|
+
output.puts "Inside #{Pry.view_clip(target_self)}."
|
137
|
+
end
|
138
|
+
end
|
138
139
|
|
139
|
-
|
140
|
-
|
140
|
+
def small_method?
|
141
|
+
@method.source_range.count < self.class.method_size_cutoff
|
142
|
+
end
|
141
143
|
|
142
|
-
|
143
|
-
|
144
|
+
def default_code
|
145
|
+
if method_code && small_method?
|
146
|
+
method_code
|
147
|
+
else
|
148
|
+
code_window
|
149
|
+
end
|
144
150
|
end
|
145
|
-
end
|
146
151
|
|
147
|
-
|
148
|
-
|
152
|
+
def code_window
|
153
|
+
Pry::Code.from_file(@file).around(@line, window_size)
|
154
|
+
end
|
149
155
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
@
|
156
|
+
def method_code
|
157
|
+
return @method_code if @method_code
|
158
|
+
|
159
|
+
@method_code = Pry::Code.from_method(@method) if valid_method?
|
154
160
|
end
|
155
|
-
end
|
156
161
|
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
162
|
+
# This either returns the `target_self`
|
163
|
+
# or it returns the class of `target_self` if `target_self` is not a class.
|
164
|
+
# @return [Pry::WrappedModule]
|
165
|
+
def target_class
|
166
|
+
return Pry::WrappedModule(target_self) if target_self.is_a?(Module)
|
161
167
|
|
162
|
-
|
163
|
-
|
168
|
+
Pry::WrappedModule(target_self.class)
|
169
|
+
end
|
164
170
|
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
171
|
+
def class_code
|
172
|
+
@class_code ||=
|
173
|
+
begin
|
174
|
+
mod = @method ? Pry::WrappedModule(@method.owner) : target_class
|
175
|
+
idx = mod.candidates.find_index { |v| expand_path(v.source_file) == @file }
|
176
|
+
idx && Pry::Code.from_module(mod, idx)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
def valid_method?
|
181
|
+
@method && @method.source? && expand_path(@method.source_file) == @file &&
|
182
|
+
@method.source_range.include?(@line)
|
169
183
|
end
|
170
|
-
end
|
171
184
|
|
172
|
-
|
173
|
-
|
174
|
-
Pry.
|
175
|
-
|
176
|
-
|
185
|
+
def expand_path(filename)
|
186
|
+
return unless filename
|
187
|
+
return filename if Pry.eval_path == filename
|
188
|
+
|
189
|
+
File.expand_path(filename)
|
190
|
+
end
|
191
|
+
|
192
|
+
def window_size
|
193
|
+
if args.empty?
|
194
|
+
pry_instance.config.default_window_size
|
195
|
+
else
|
196
|
+
args.first.to_i
|
197
|
+
end
|
177
198
|
end
|
178
199
|
end
|
179
|
-
end
|
180
200
|
|
181
|
-
|
201
|
+
Pry::Commands.add_command(Pry::Command::Whereami)
|
202
|
+
Pry::Commands.alias_command '@', 'whereami'
|
203
|
+
Pry::Commands.alias_command(/whereami[!?]+/, 'whereami')
|
204
|
+
end
|
182
205
|
end
|