pry 0.10.3 → 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 +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
|