pry 0.10.3 → 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 +439 -16
- data/LICENSE +1 -1
- data/README.md +362 -302
- 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 +84 -97
- data/lib/pry/code/code_file.rb +37 -26
- data/lib/pry/code/code_range.rb +7 -5
- data/lib/pry/code/loc.rb +26 -13
- data/lib/pry/code.rb +42 -31
- data/lib/pry/code_object.rb +53 -28
- data/lib/pry/color_printer.rb +46 -35
- data/lib/pry/command.rb +197 -369
- data/lib/pry/command_set.rb +89 -114
- 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 -72
- data/lib/pry/commands/cat/file_formatter.rb +56 -46
- data/lib/pry/commands/cat/input_expression_formatter.rb +35 -30
- data/lib/pry/commands/cat.rb +62 -54
- data/lib/pry/commands/cd.rb +40 -35
- data/lib/pry/commands/change_inspector.rb +29 -22
- data/lib/pry/commands/change_prompt.rb +48 -23
- 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 +34 -23
- data/lib/pry/commands/edit.rb +185 -157
- 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 -16
- data/lib/pry/commands/find_method.rb +168 -162
- data/lib/pry/commands/fix_indent.rb +16 -12
- data/lib/pry/commands/help.rb +140 -133
- data/lib/pry/commands/hist.rb +151 -149
- 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 +35 -28
- data/lib/pry/commands/ls/constants.rb +59 -31
- data/lib/pry/commands/ls/formatter.rb +42 -36
- data/lib/pry/commands/ls/globals.rb +38 -36
- data/lib/pry/commands/ls/grep.rb +17 -15
- data/lib/pry/commands/ls/instance_vars.rb +29 -28
- data/lib/pry/commands/ls/interrogatable.rb +18 -12
- data/lib/pry/commands/ls/jruby_hacks.rb +47 -41
- data/lib/pry/commands/ls/local_names.rb +26 -24
- data/lib/pry/commands/ls/local_vars.rb +38 -30
- data/lib/pry/commands/ls/ls_entity.rb +47 -52
- data/lib/pry/commands/ls/methods.rb +49 -51
- data/lib/pry/commands/ls/methods_helper.rb +46 -42
- data/lib/pry/commands/ls/self_methods.rb +23 -21
- data/lib/pry/commands/ls.rb +124 -103
- data/lib/pry/commands/nesting.rb +21 -17
- data/lib/pry/commands/play.rb +92 -82
- data/lib/pry/commands/pry_backtrace.rb +22 -17
- 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 +60 -48
- data/lib/pry/commands/reset.rb +16 -12
- data/lib/pry/commands/ri.rb +57 -42
- data/lib/pry/commands/save_file.rb +45 -43
- data/lib/pry/commands/shell_command.rb +56 -29
- data/lib/pry/commands/shell_mode.rb +22 -18
- data/lib/pry/commands/show_doc.rb +80 -70
- data/lib/pry/commands/show_info.rb +194 -155
- data/lib/pry/commands/show_input.rb +16 -11
- data/lib/pry/commands/show_source.rb +110 -42
- data/lib/pry/commands/stat.rb +35 -31
- data/lib/pry/commands/switch_to.rb +21 -15
- data/lib/pry/commands/toggle_color.rb +20 -16
- data/lib/pry/commands/watch_expression/expression.rb +32 -27
- data/lib/pry/commands/watch_expression.rb +89 -84
- data/lib/pry/commands/whereami.rb +156 -141
- 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 +310 -20
- data/lib/pry/control_d_handler.rb +28 -0
- data/lib/pry/core_extensions.rb +22 -9
- data/lib/pry/editor.rb +56 -34
- data/lib/pry/env.rb +18 -0
- data/lib/pry/exception_handler.rb +43 -0
- data/lib/pry/exceptions.rb +13 -18
- data/lib/pry/forwardable.rb +27 -0
- data/lib/pry/helpers/base_helpers.rb +20 -62
- data/lib/pry/helpers/command_helpers.rb +52 -62
- data/lib/pry/helpers/documentation_helpers.rb +21 -12
- 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 -85
- data/lib/pry/helpers.rb +3 -0
- data/lib/pry/history.rb +81 -55
- data/lib/pry/hooks.rb +60 -110
- data/lib/pry/indent.rb +74 -68
- data/lib/pry/input_completer.rb +199 -158
- data/lib/pry/input_lock.rb +7 -10
- data/lib/pry/inspector.rb +36 -24
- data/lib/pry/last_exception.rb +45 -45
- data/lib/pry/method/disowned.rb +19 -5
- data/lib/pry/method/patcher.rb +14 -8
- data/lib/pry/method/weird_method_locator.rb +79 -45
- data/lib/pry/method.rb +178 -124
- data/lib/pry/object_path.rb +37 -28
- data/lib/pry/output.rb +102 -16
- data/lib/pry/pager.rb +187 -174
- data/lib/pry/prompt.rb +213 -25
- data/lib/pry/pry_class.rb +119 -98
- data/lib/pry/pry_instance.rb +261 -224
- data/lib/pry/repl.rb +83 -29
- data/lib/pry/repl_file_loader.rb +27 -22
- 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} +35 -32
- data/lib/pry/wrapped_module.rb +68 -63
- data/lib/pry.rb +133 -149
- metadata +58 -69
- 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 -32
- 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 -101
- data/lib/pry/commands/install_command.rb +0 -53
- data/lib/pry/commands/list_prompts.rb +0 -35
- data/lib/pry/commands/simple_prompt.rb +0 -22
- data/lib/pry/commands.rb +0 -6
- data/lib/pry/config/behavior.rb +0 -139
- data/lib/pry/config/convenience.rb +0 -25
- data/lib/pry/config/default.rb +0 -161
- data/lib/pry/history_array.rb +0 -121
- data/lib/pry/plugins.rb +0 -103
- data/lib/pry/rbx_path.rb +0 -22
- data/lib/pry/rubygem.rb +0 -82
- data/lib/pry/terminal.rb +0 -79
- data/lib/pry/test/helper.rb +0 -170
data/bin/pry
CHANGED
@@ -1,16 +1,13 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
# (C) John Mair (banisterfiend)
|
4
5
|
# MIT license
|
5
6
|
|
6
7
|
$0 = 'pry'
|
7
8
|
|
8
|
-
|
9
|
-
require 'pry'
|
10
|
-
rescue LoadError
|
11
|
-
require 'rubygems'
|
12
|
-
require 'pry'
|
13
|
-
end
|
9
|
+
require 'pry'
|
14
10
|
|
15
11
|
# Process command line options and run Pry
|
16
|
-
Pry::CLI.parse_options
|
12
|
+
opts = Pry::CLI.parse_options
|
13
|
+
Pry::CLI.start(opts)
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Pry
|
4
|
+
# A super-class for Commands that are created with a single block.
|
5
|
+
#
|
6
|
+
# This class ensures that the block is called with the correct number of
|
7
|
+
# arguments and the right context.
|
8
|
+
#
|
9
|
+
# Create subclasses using {Pry::CommandSet#command}.
|
10
|
+
class BlockCommand < Command
|
11
|
+
# Call the block that was registered with this command.
|
12
|
+
# @param [Array<String>] args The arguments passed
|
13
|
+
# @return [Object] The return value of the block
|
14
|
+
def call(*args)
|
15
|
+
instance_exec(*normalize_method_args(block, args), &block)
|
16
|
+
end
|
17
|
+
|
18
|
+
def help
|
19
|
+
"#{command_options[:listing].to_s.ljust(18)} #{description}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,194 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Pry
|
4
|
+
# A super-class of Commands with structure.
|
5
|
+
#
|
6
|
+
# This class implements the bare-minimum functionality that a command should
|
7
|
+
# have, namely a --help switch, and then delegates actual processing to its
|
8
|
+
# subclasses.
|
9
|
+
#
|
10
|
+
# Create subclasses using {Pry::CommandSet#create_command}, and override the
|
11
|
+
# `options(opt)` method to set up an instance of Pry::Slop, and the `process`
|
12
|
+
# method to actually run the command. If necessary, you can also override
|
13
|
+
# `setup` which will be called before `options`, for example to require any
|
14
|
+
# gems your command needs to run, or to set up state.
|
15
|
+
class ClassCommand < Command
|
16
|
+
class << self
|
17
|
+
# Ensure that subclasses inherit the options, description and
|
18
|
+
# match from a ClassCommand super class.
|
19
|
+
def inherited(klass)
|
20
|
+
klass.match match
|
21
|
+
klass.description description
|
22
|
+
klass.command_options options
|
23
|
+
end
|
24
|
+
|
25
|
+
def source
|
26
|
+
source_object.source
|
27
|
+
end
|
28
|
+
|
29
|
+
def doc
|
30
|
+
new.help
|
31
|
+
end
|
32
|
+
|
33
|
+
def source_location
|
34
|
+
source_object.source_location
|
35
|
+
end
|
36
|
+
|
37
|
+
def source_file
|
38
|
+
source_object.source_file
|
39
|
+
end
|
40
|
+
alias file source_file
|
41
|
+
|
42
|
+
def source_line
|
43
|
+
source_object.source_line
|
44
|
+
end
|
45
|
+
alias line source_line
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
# The object used to extract the source for the command.
|
50
|
+
#
|
51
|
+
# This should be a `Pry::Method(block)` for a command made with `create_command`
|
52
|
+
# and a `Pry::WrappedModule(self)` for a command that's a standard class.
|
53
|
+
# @return [Pry::WrappedModule, Pry::Method]
|
54
|
+
def source_object
|
55
|
+
@source_object ||= if name =~ /^[A-Z]/
|
56
|
+
Pry::WrappedModule(self)
|
57
|
+
else
|
58
|
+
Pry::Method(block)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
attr_accessor :opts
|
64
|
+
attr_accessor :args
|
65
|
+
|
66
|
+
# Set up `opts` and `args`, and then call `process`.
|
67
|
+
#
|
68
|
+
# This method will display help if necessary.
|
69
|
+
#
|
70
|
+
# @param [Array<String>] args The arguments passed
|
71
|
+
# @return [Object] The return value of `process` or VOID_VALUE
|
72
|
+
def call(*args)
|
73
|
+
setup
|
74
|
+
|
75
|
+
self.opts = slop
|
76
|
+
self.args = opts.parse!(args)
|
77
|
+
|
78
|
+
if opts.present?(:help)
|
79
|
+
output.puts slop.help
|
80
|
+
void
|
81
|
+
else
|
82
|
+
process(*normalize_method_args(method(:process), args))
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# Return the help generated by Pry::Slop for this command.
|
87
|
+
def help
|
88
|
+
slop.help
|
89
|
+
end
|
90
|
+
|
91
|
+
# Return an instance of Pry::Slop that can parse either subcommands or the
|
92
|
+
# options that this command accepts.
|
93
|
+
def slop
|
94
|
+
Pry::Slop.new do |opt|
|
95
|
+
opt.banner(unindent(self.class.banner))
|
96
|
+
subcommands(opt)
|
97
|
+
options(opt)
|
98
|
+
opt.on :h, :help, 'Show this message.'
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
# Generate shell completions
|
103
|
+
# @param [String] search The line typed so far
|
104
|
+
# @return [Array<String>] the words to complete
|
105
|
+
def complete(search)
|
106
|
+
slop.flat_map do |opt|
|
107
|
+
[opt.long && "--#{opt.long} " || opt.short && "-#{opt.short}"]
|
108
|
+
end.compact + super
|
109
|
+
end
|
110
|
+
|
111
|
+
# A method called just before `options(opt)` as part of `call`.
|
112
|
+
#
|
113
|
+
# This method can be used to set up any context your command needs to run,
|
114
|
+
# for example requiring gems, or setting default values for options.
|
115
|
+
#
|
116
|
+
# @example
|
117
|
+
# def setup
|
118
|
+
# require 'gist'
|
119
|
+
# @action = :method
|
120
|
+
# end
|
121
|
+
def setup; end
|
122
|
+
|
123
|
+
# A method to setup Pry::Slop commands so it can parse the subcommands your
|
124
|
+
# command expects. If you need to set up default values, use `setup`
|
125
|
+
# instead.
|
126
|
+
#
|
127
|
+
# @example A minimal example
|
128
|
+
# def subcommands(cmd)
|
129
|
+
# cmd.command :download do |opt|
|
130
|
+
# description 'Downloads a content from a server'
|
131
|
+
#
|
132
|
+
# opt.on :verbose, 'Use verbose output'
|
133
|
+
#
|
134
|
+
# run do |options, arguments|
|
135
|
+
# ContentDownloader.download(options, arguments)
|
136
|
+
# end
|
137
|
+
# end
|
138
|
+
# end
|
139
|
+
#
|
140
|
+
# @example Define the invokation block anywhere you want
|
141
|
+
# def subcommands(cmd)
|
142
|
+
# cmd.command :download do |opt|
|
143
|
+
# description 'Downloads a content from a server'
|
144
|
+
#
|
145
|
+
# opt.on :verbose, 'Use verbose output'
|
146
|
+
# end
|
147
|
+
# end
|
148
|
+
#
|
149
|
+
# def process
|
150
|
+
# # Perform calculations...
|
151
|
+
# opts.fetch_command(:download).run do |options, arguments|
|
152
|
+
# ContentDownloader.download(options, arguments)
|
153
|
+
# end
|
154
|
+
# # More calculations...
|
155
|
+
# end
|
156
|
+
def subcommands(cmd); end
|
157
|
+
|
158
|
+
# A method to setup Pry::Slop so it can parse the options your command expects.
|
159
|
+
#
|
160
|
+
# @note Please don't do anything side-effecty in the main part of this
|
161
|
+
# method, as it may be called by Pry at any time for introspection reasons.
|
162
|
+
# If you need to set up default values, use `setup` instead.
|
163
|
+
#
|
164
|
+
# @example
|
165
|
+
# def options(opt)
|
166
|
+
# opt.banner "Gists methods or classes"
|
167
|
+
# opt.on(:c, :class, "gist a class") do
|
168
|
+
# @action = :class
|
169
|
+
# end
|
170
|
+
# end
|
171
|
+
def options(opt); end
|
172
|
+
|
173
|
+
# The actual body of your command should go here.
|
174
|
+
#
|
175
|
+
# The `opts` mehod can be called to get the options that Pry::Slop has passed,
|
176
|
+
# and `args` gives the remaining, unparsed arguments.
|
177
|
+
#
|
178
|
+
# The return value of this method is discarded unless the command was
|
179
|
+
# created with `:keep_retval => true`, in which case it is returned to the
|
180
|
+
# repl.
|
181
|
+
#
|
182
|
+
# @example
|
183
|
+
# def process
|
184
|
+
# if opts.present?(:class)
|
185
|
+
# gist_class
|
186
|
+
# else
|
187
|
+
# gist_method
|
188
|
+
# end
|
189
|
+
# end
|
190
|
+
def process
|
191
|
+
raise CommandError, "command '#{command_name}' not implemented"
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
data/lib/pry/cli.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'stringio'
|
2
4
|
|
5
|
+
class Pry
|
3
6
|
# Manage the processing of command line options
|
4
7
|
class CLI
|
5
|
-
|
6
8
|
NoOptionsError = Class.new(StandardError)
|
7
9
|
|
8
10
|
class << self
|
9
|
-
|
10
11
|
# @return [Proc] The Proc defining the valid command line options.
|
11
12
|
attr_accessor :options
|
12
13
|
|
@@ -19,7 +20,7 @@ class Pry
|
|
19
20
|
# as CLI options.
|
20
21
|
attr_accessor :input_args
|
21
22
|
|
22
|
-
# Add another set of CLI options (a Slop block)
|
23
|
+
# Add another set of CLI options (a Pry::Slop block)
|
23
24
|
def add_options(&block)
|
24
25
|
if options
|
25
26
|
old_options = options
|
@@ -34,15 +35,6 @@ class Pry
|
|
34
35
|
self
|
35
36
|
end
|
36
37
|
|
37
|
-
# Bring in options defined in plugins
|
38
|
-
def add_plugin_options
|
39
|
-
Pry.plugins.values.each do |plugin|
|
40
|
-
plugin.load_cli_options
|
41
|
-
end
|
42
|
-
|
43
|
-
self
|
44
|
-
end
|
45
|
-
|
46
38
|
# Add a block responsible for processing parsed options.
|
47
39
|
def add_option_processor(&block)
|
48
40
|
self.option_processors ||= []
|
@@ -57,66 +49,88 @@ class Pry
|
|
57
49
|
self.option_processors = nil
|
58
50
|
end
|
59
51
|
|
60
|
-
def parse_options(args=ARGV)
|
52
|
+
def parse_options(args = ARGV)
|
61
53
|
unless options
|
62
|
-
raise NoOptionsError,
|
54
|
+
raise NoOptionsError,
|
55
|
+
"No command line options defined! Use Pry::CLI.add_options to " \
|
56
|
+
"add command line options."
|
63
57
|
end
|
64
58
|
|
65
|
-
|
59
|
+
@pass_argv = args.index { |cli_arg| %w[- --].include?(cli_arg) }
|
60
|
+
if @pass_argv
|
61
|
+
slop_args = args[0...@pass_argv]
|
62
|
+
self.input_args = args.replace(args[@pass_argv + 1..-1])
|
63
|
+
else
|
64
|
+
self.input_args = slop_args = args
|
65
|
+
end
|
66
66
|
|
67
67
|
begin
|
68
|
-
opts = Slop.parse!(
|
69
|
-
|
70
|
-
:
|
71
|
-
:
|
72
|
-
:
|
68
|
+
opts = Pry::Slop.parse!(
|
69
|
+
slop_args,
|
70
|
+
help: true,
|
71
|
+
multiple_switches: false,
|
72
|
+
strict: true,
|
73
73
|
&options
|
74
74
|
)
|
75
|
-
rescue Slop::InvalidOptionError
|
75
|
+
rescue Pry::Slop::InvalidOptionError
|
76
76
|
# Display help message on unknown switches and exit.
|
77
|
-
puts Slop.new(&options)
|
78
|
-
exit
|
77
|
+
puts Pry::Slop.new(&options)
|
78
|
+
Kernel.exit
|
79
79
|
end
|
80
80
|
|
81
|
+
Pry.initial_session_setup
|
82
|
+
Pry.final_session_setup
|
83
|
+
|
81
84
|
# Option processors are optional.
|
82
|
-
if option_processors
|
83
|
-
option_processors.each { |processor| processor.call(opts) }
|
84
|
-
end
|
85
|
+
option_processors.each { |processor| processor.call(opts) } if option_processors
|
85
86
|
|
86
|
-
|
87
|
+
opts
|
87
88
|
end
|
88
89
|
|
89
|
-
|
90
|
+
def start(opts)
|
91
|
+
Kernel.exit if opts.help?
|
90
92
|
|
91
|
-
|
92
|
-
|
93
|
-
end
|
93
|
+
# invoked via cli
|
94
|
+
Pry.cli = true
|
94
95
|
|
96
|
+
# create the actual context
|
97
|
+
if opts[:context]
|
98
|
+
Pry.initial_session_setup
|
99
|
+
context = Pry.binding_for(eval(opts[:context])) # rubocop:disable Security/Eval
|
100
|
+
Pry.final_session_setup
|
101
|
+
else
|
102
|
+
context = Pry.toplevel_binding
|
103
|
+
end
|
95
104
|
|
96
|
-
|
97
|
-
|
105
|
+
if !@pass_argv && Pry::CLI.input_args.any? && Pry::CLI.input_args != ["pry"]
|
106
|
+
full_name = File.expand_path(Pry::CLI.input_args.first)
|
107
|
+
Pry.load_file_through_repl(full_name)
|
108
|
+
Kernel.exit
|
109
|
+
end
|
98
110
|
|
99
|
-
#
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
end
|
104
|
-
end.parse(ARGV.dup)
|
111
|
+
# Start the session (running any code passed with -e, if there is any)
|
112
|
+
Pry.start(context, input: StringIO.new(Pry.config.exec_string))
|
113
|
+
end
|
114
|
+
end
|
105
115
|
|
106
|
-
|
107
|
-
|
116
|
+
reset
|
117
|
+
end
|
108
118
|
end
|
109
119
|
|
110
120
|
# The default Pry command line options (before plugin options are included)
|
111
121
|
Pry::CLI.add_options do
|
112
|
-
banner
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
122
|
+
banner(
|
123
|
+
"Usage: pry [OPTIONS]\n" \
|
124
|
+
"Start a Pry session.\n" \
|
125
|
+
"See http://pry.github.io/ for more information.\n" \
|
126
|
+
"Copyright (c) 2016 John Mair (banisterfiend)" \
|
127
|
+
)
|
128
|
+
|
129
|
+
on(
|
130
|
+
:e, :exec=, "A line of code to execute in context before the session starts"
|
131
|
+
) do |input|
|
132
|
+
Pry.config.exec_string += "\n" unless Pry.config.exec_string.empty?
|
133
|
+
Pry.config.exec_string += input
|
120
134
|
end
|
121
135
|
|
122
136
|
on "no-pager", "Disable pager for long output" do
|
@@ -124,61 +138,57 @@ Copyright (c) 2013 John Mair (banisterfiend)
|
|
124
138
|
end
|
125
139
|
|
126
140
|
on "no-history", "Disable history loading" do
|
127
|
-
Pry.config.
|
141
|
+
Pry.config.history_load = false
|
128
142
|
end
|
129
143
|
|
130
144
|
on "no-color", "Disable syntax highlighting for session" do
|
131
145
|
Pry.config.color = false
|
132
146
|
end
|
133
147
|
|
134
|
-
on :f, "Suppress loading of
|
148
|
+
on :f, "Suppress loading of pryrc" do
|
135
149
|
Pry.config.should_load_rc = false
|
136
150
|
Pry.config.should_load_local_rc = false
|
137
151
|
end
|
138
152
|
|
139
|
-
on :s, "select-plugin=", "Only load specified plugin (and no others)." do |
|
140
|
-
|
141
|
-
Pry.plugins[plugin_name].activate!
|
153
|
+
on :s, "select-plugin=", "Only load specified plugin (and no others)." do |_plugin_name|
|
154
|
+
warn "The --select-plugin option is deprecated and has no effect"
|
142
155
|
end
|
143
156
|
|
144
|
-
on :d, "disable-plugin=", "Disable a specific plugin." do |
|
145
|
-
|
157
|
+
on :d, "disable-plugin=", "Disable a specific plugin." do |_plugin_name|
|
158
|
+
warn "The --disable-plugin option is deprecated and has no effect"
|
146
159
|
end
|
147
160
|
|
148
161
|
on "no-plugins", "Suppress loading of plugins." do
|
149
|
-
|
162
|
+
warn "The --no-plugins option is deprecated and has no effect"
|
150
163
|
end
|
151
164
|
|
152
165
|
on "plugins", "List installed plugins." do
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
puts "#{plugin.name}".ljust(18) << plugin.spec.summary
|
157
|
-
end
|
158
|
-
exit
|
166
|
+
warn "The --plugins option is deprecated and has no effect"
|
167
|
+
warn "Try using `gem list pry-`"
|
168
|
+
Kernel.exit
|
159
169
|
end
|
160
170
|
|
161
171
|
on "simple-prompt", "Enable simple prompt mode" do
|
162
|
-
Pry.config.prompt = Pry::
|
172
|
+
Pry.config.prompt = Pry::Prompt[:simple]
|
163
173
|
end
|
164
174
|
|
165
175
|
on "noprompt", "No prompt mode" do
|
166
|
-
Pry.config.prompt = Pry::
|
176
|
+
Pry.config.prompt = Pry::Prompt[:none]
|
167
177
|
end
|
168
178
|
|
169
179
|
on :r, :require=, "`require` a Ruby script at startup" do |file|
|
170
180
|
Pry.config.requires << file
|
171
181
|
end
|
172
182
|
|
173
|
-
on
|
183
|
+
on(:I=, "Add a path to the $LOAD_PATH", as: Array, delimiter: ":") do |load_path|
|
174
184
|
load_path.map! do |path|
|
175
|
-
|
185
|
+
%r{\A\./} =~ path ? path : File.expand_path(path)
|
176
186
|
end
|
177
187
|
|
178
188
|
$LOAD_PATH.unshift(*load_path)
|
179
189
|
end
|
180
190
|
|
181
|
-
on "gem", "Shorthand for -I./lib -rgemname" do |
|
191
|
+
on "gem", "Shorthand for -I./lib -rgemname" do |_load_path|
|
182
192
|
$LOAD_PATH.unshift("./lib")
|
183
193
|
Dir["./lib/*.rb"].each do |file|
|
184
194
|
Pry.config.requires << file
|
@@ -187,34 +197,11 @@ Copyright (c) 2013 John Mair (banisterfiend)
|
|
187
197
|
|
188
198
|
on :v, :version, "Display the Pry version" do
|
189
199
|
puts "Pry version #{Pry::VERSION} on Ruby #{RUBY_VERSION}"
|
190
|
-
exit
|
191
|
-
end
|
192
|
-
|
193
|
-
on(:c, :context=,
|
194
|
-
"Start the session in the specified context. Equivalent to `context.pry` in a session.",
|
195
|
-
:default => "Pry.toplevel_binding"
|
196
|
-
)
|
197
|
-
end.add_option_processor do |opts|
|
198
|
-
|
199
|
-
exit if opts.help?
|
200
|
-
|
201
|
-
# invoked via cli
|
202
|
-
Pry.cli = true
|
203
|
-
|
204
|
-
# create the actual context
|
205
|
-
if opts[:context]
|
206
|
-
Pry.initial_session_setup
|
207
|
-
context = Pry.binding_for(eval(opts[:context]))
|
208
|
-
else
|
209
|
-
context = Pry.toplevel_binding
|
210
|
-
end
|
211
|
-
|
212
|
-
if Pry::CLI.input_args.any? && Pry::CLI.input_args != ["pry"]
|
213
|
-
full_name = File.expand_path(Pry::CLI.input_args.first)
|
214
|
-
Pry.load_file_through_repl(full_name)
|
215
|
-
exit
|
200
|
+
Kernel.exit
|
216
201
|
end
|
217
202
|
|
218
|
-
|
219
|
-
|
203
|
+
on :c, :context=,
|
204
|
+
"Start the session in the specified context. Equivalent to " \
|
205
|
+
"`context.pry` in a session.",
|
206
|
+
default: "Pry.toplevel_binding"
|
220
207
|
end
|
data/lib/pry/code/code_file.rb
CHANGED
@@ -1,25 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'method_source'
|
4
|
+
|
1
5
|
class Pry
|
2
6
|
class CodeFile
|
3
|
-
DEFAULT_EXT = '.rb'
|
7
|
+
DEFAULT_EXT = '.rb'.freeze
|
4
8
|
|
5
9
|
# List of all supported languages.
|
6
10
|
# @return [Hash]
|
7
11
|
EXTENSIONS = {
|
8
|
-
%w
|
9
|
-
%w
|
10
|
-
%w
|
11
|
-
%w
|
12
|
-
%w
|
13
|
-
%w
|
14
|
-
%w
|
15
|
-
%w
|
16
|
-
%w
|
17
|
-
%w
|
18
|
-
%w
|
19
|
-
%w
|
20
|
-
%w
|
21
|
-
%w
|
22
|
-
}
|
12
|
+
%w[.py] => :python,
|
13
|
+
%w[.js] => :javascript,
|
14
|
+
%w[.css] => :css,
|
15
|
+
%w[.xml] => :xml,
|
16
|
+
%w[.php] => :php,
|
17
|
+
%w[.html] => :html,
|
18
|
+
%w[.diff] => :diff,
|
19
|
+
%w[.java] => :java,
|
20
|
+
%w[.json] => :json,
|
21
|
+
%w[.c .h] => :c,
|
22
|
+
%w[.rhtml] => :rhtml,
|
23
|
+
%w[.yaml .yml] => :yaml,
|
24
|
+
%w[.cpp .hpp .cc .h .cxx] => :cpp,
|
25
|
+
%w[.rb .ru .irbrc .gemspec .pryrc .rake] => :ruby
|
26
|
+
}.freeze
|
27
|
+
|
28
|
+
FILES = {
|
29
|
+
%w[Gemfile Rakefile Guardfile Capfile] => :ruby
|
30
|
+
}.freeze
|
31
|
+
|
32
|
+
# Store the current working directory. This allows show-source etc. to work if
|
33
|
+
# your process has changed directory since boot. [Issue #675]
|
34
|
+
INITIAL_PWD = Dir.pwd
|
23
35
|
|
24
36
|
# @return [Symbol] The type of code stored in this wrapper.
|
25
37
|
attr_reader :code_type
|
@@ -37,8 +49,6 @@ class Pry
|
|
37
49
|
Pry.line_buffer.drop(1)
|
38
50
|
elsif Pry::Method::Patcher.code_for(@filename)
|
39
51
|
Pry::Method::Patcher.code_for(@filename)
|
40
|
-
elsif RbxPath.is_core_path?(@filename)
|
41
|
-
File.read(RbxPath.convert_path_to_full(@filename))
|
42
52
|
else
|
43
53
|
path = abs_path
|
44
54
|
@code_type = type_from_filename(path)
|
@@ -52,16 +62,16 @@ class Pry
|
|
52
62
|
# readable for some reason.
|
53
63
|
# @return [String] absolute path for the given `filename`.
|
54
64
|
def abs_path
|
55
|
-
code_path.detect { |path| readable?(path) }
|
56
|
-
raise
|
57
|
-
"Cannot open #{
|
65
|
+
code_path.detect { |path| readable?(path) } ||
|
66
|
+
raise(MethodSource::SourceNotFoundError,
|
67
|
+
"Cannot open #{@filename.inspect} for reading.")
|
58
68
|
end
|
59
69
|
|
60
70
|
# @param [String] path
|
61
71
|
# @return [Boolean] if the path, with or without the default ext,
|
62
72
|
# is a readable file then `true`, otherwise `false`.
|
63
73
|
def readable?(path)
|
64
|
-
File.readable?(path) && !File.directory?(path)
|
74
|
+
File.readable?(path) && !File.directory?(path) ||
|
65
75
|
File.readable?(path << DEFAULT_EXT)
|
66
76
|
end
|
67
77
|
|
@@ -74,11 +84,13 @@ class Pry
|
|
74
84
|
# @param [String] filename
|
75
85
|
# @param [Symbol] default (:unknown) the file type to assume if none could be
|
76
86
|
# detected.
|
77
|
-
# @return [Symbol, nil] The
|
78
|
-
# `nil` if `:unknown`.
|
87
|
+
# @return [Symbol, nil] The SyntaxHighlighter type of a file from its
|
88
|
+
# extension, or `nil` if `:unknown`.
|
79
89
|
def type_from_filename(filename, default = :unknown)
|
80
90
|
_, @code_type = EXTENSIONS.find do |k, _|
|
81
91
|
k.any? { |ext| ext == File.extname(filename) }
|
92
|
+
end || FILES.find do |k, _|
|
93
|
+
k.any? { |file_name| file_name == File.basename(filename) }
|
82
94
|
end
|
83
95
|
|
84
96
|
code_type || default
|
@@ -91,13 +103,12 @@ class Pry
|
|
91
103
|
|
92
104
|
# @return [String]
|
93
105
|
def from_pry_init_pwd
|
94
|
-
File.expand_path(@filename,
|
106
|
+
File.expand_path(@filename, INITIAL_PWD)
|
95
107
|
end
|
96
108
|
|
97
109
|
# @return [String]
|
98
110
|
def from_load_path
|
99
111
|
$LOAD_PATH.map { |path| File.expand_path(@filename, path) }
|
100
112
|
end
|
101
|
-
|
102
113
|
end
|
103
114
|
end
|
data/lib/pry/code/code_range.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Pry
|
2
4
|
class Code
|
3
|
-
|
4
5
|
# Represents a range of lines in a code listing.
|
5
6
|
#
|
6
7
|
# @api private
|
7
8
|
class CodeRange
|
8
|
-
|
9
9
|
# @param [Integer] start_line
|
10
10
|
# @param [Integer?] end_line
|
11
11
|
def initialize(start_line, end_line = nil)
|
@@ -22,8 +22,9 @@ class Pry
|
|
22
22
|
|
23
23
|
private
|
24
24
|
|
25
|
-
|
26
|
-
|
25
|
+
attr_reader :start_line
|
26
|
+
|
27
|
+
attr_reader :end_line
|
27
28
|
|
28
29
|
# If `end_line` is equal to `nil`, then calculate it from the first
|
29
30
|
# parameter, `start_line`. Otherwise, leave it as it is.
|
@@ -48,12 +49,14 @@ class Pry
|
|
48
49
|
# @return [Integer]
|
49
50
|
def find_start_index(lines)
|
50
51
|
return start_line if start_line < 0
|
52
|
+
|
51
53
|
lines.index { |loc| loc.lineno >= start_line } || lines.length
|
52
54
|
end
|
53
55
|
|
54
56
|
# @return [Integer]
|
55
57
|
def find_end_index(lines)
|
56
58
|
return end_line if end_line < 0
|
59
|
+
|
57
60
|
(lines.index { |loc| loc.lineno > end_line } || 0) - 1
|
58
61
|
end
|
59
62
|
|
@@ -66,6 +69,5 @@ class Pry
|
|
66
69
|
@start_line = start_line.first
|
67
70
|
end
|
68
71
|
end
|
69
|
-
|
70
72
|
end
|
71
73
|
end
|