pry 0.9.8pre7-java → 0.9.8pre8-java
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.
- data/lib/pry.rb +10 -2
- data/lib/pry/code.rb +8 -1
- data/lib/pry/command.rb +3 -3
- data/lib/pry/command_set.rb +36 -33
- data/lib/pry/config.rb +13 -1
- data/lib/pry/default_commands/context.rb +9 -4
- data/lib/pry/default_commands/documentation.rb +69 -99
- data/lib/pry/default_commands/input.rb +57 -49
- data/lib/pry/default_commands/introspection.rb +20 -15
- data/lib/pry/default_commands/ls.rb +1 -1
- data/lib/pry/default_commands/shell.rb +76 -1
- data/lib/pry/helpers/command_helpers.rb +9 -0
- data/lib/pry/hooks.rb +89 -10
- data/lib/pry/plugins.rb +3 -3
- data/lib/pry/pry_class.rb +6 -4
- data/lib/pry/pry_instance.rb +16 -1
- data/lib/pry/version.rb +1 -1
- data/test/helper.rb +6 -1
- data/test/test_command.rb +17 -17
- data/test/test_command_set.rb +4 -4
- data/test/test_default_commands/test_documentation.rb +20 -8
- data/test/test_default_commands/test_input.rb +71 -32
- data/test/test_default_commands/test_shell.rb +190 -0
- data/test/test_hooks.rb +72 -2
- metadata +76 -70
data/lib/pry.rb
CHANGED
@@ -148,6 +148,14 @@ class Pry
|
|
148
148
|
# indicate an exceptional condition that's fatal to the current command.
|
149
149
|
class CommandError < StandardError; end
|
150
150
|
class NonMethodContextError < CommandError; end
|
151
|
+
|
152
|
+
# indicates obsolete API
|
153
|
+
class ObsoleteError < StandardError; end
|
154
|
+
|
155
|
+
# This is to keep from breaking under Rails 3.2 for people who are doing that
|
156
|
+
# IRB = Pry thing.
|
157
|
+
module ExtendCommandBundle
|
158
|
+
end
|
151
159
|
end
|
152
160
|
|
153
161
|
require "method_source"
|
@@ -163,7 +171,7 @@ if Pry::Helpers::BaseHelpers.jruby?
|
|
163
171
|
begin
|
164
172
|
require 'ffi'
|
165
173
|
rescue LoadError
|
166
|
-
|
174
|
+
warn "Need to `gem install ffi`"
|
167
175
|
end
|
168
176
|
end
|
169
177
|
|
@@ -171,7 +179,7 @@ if Pry::Helpers::BaseHelpers.windows?
|
|
171
179
|
begin
|
172
180
|
require 'win32console'
|
173
181
|
rescue LoadError
|
174
|
-
|
182
|
+
warn "Need to `gem install win32console`"
|
175
183
|
exit 1
|
176
184
|
end
|
177
185
|
end
|
data/lib/pry/code.rb
CHANGED
@@ -122,7 +122,7 @@ class Pry
|
|
122
122
|
# @return [String] The inserted line.
|
123
123
|
def push(line, line_num=nil)
|
124
124
|
line_num = @lines.last.last + 1 unless line_num
|
125
|
-
@lines.push([line, line_num])
|
125
|
+
@lines.push([line.chomp, line_num])
|
126
126
|
line
|
127
127
|
end
|
128
128
|
alias << push
|
@@ -305,6 +305,13 @@ class Pry
|
|
305
305
|
lines.map { |l| "#{l.first}\n" }.join
|
306
306
|
end
|
307
307
|
|
308
|
+
# Return an unformatted String of the code.
|
309
|
+
#
|
310
|
+
# @return [String]
|
311
|
+
def raw
|
312
|
+
@lines.map(&:first).join("\n")
|
313
|
+
end
|
314
|
+
|
308
315
|
# Return the number of lines stored.
|
309
316
|
#
|
310
317
|
# @return [Fixnum]
|
data/lib/pry/command.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
class Pry
|
2
2
|
|
3
3
|
# The super-class of all commands, new commands should be created by calling
|
4
|
-
# {Pry::CommandSet#command} which creates a BlockCommand or {Pry::CommandSet#
|
4
|
+
# {Pry::CommandSet#command} which creates a BlockCommand or {Pry::CommandSet#create_command}
|
5
5
|
# which creates a ClassCommand. Please don't use this class directly.
|
6
6
|
class Command
|
7
7
|
|
@@ -12,7 +12,7 @@ class Pry
|
|
12
12
|
def VOID_VALUE.inspect() "void" end
|
13
13
|
|
14
14
|
# Properties of the command itself (as passed as arguments to
|
15
|
-
# {CommandSet#command} or {CommandSet#
|
15
|
+
# {CommandSet#command} or {CommandSet#create_command}).
|
16
16
|
class << self
|
17
17
|
attr_accessor :block
|
18
18
|
attr_accessor :name
|
@@ -331,7 +331,7 @@ class Pry
|
|
331
331
|
# This class implements the bare-minimum functionality that a command should have,
|
332
332
|
# namely a --help switch, and then delegates actual processing to its subclasses.
|
333
333
|
#
|
334
|
-
# Create subclasses using {Pry::CommandSet#
|
334
|
+
# Create subclasses using {Pry::CommandSet#create_command}, and override the {options(opt)} method
|
335
335
|
# to set up an instance of Slop, and the {process} method to actually run the command. If
|
336
336
|
# necessary, you can also override {setup} which will be called before {options}, for example to
|
337
337
|
# require any gems your command needs to run, or to set up state.
|
data/lib/pry/command_set.rb
CHANGED
@@ -122,7 +122,6 @@ class Pry
|
|
122
122
|
commands[name].class_eval(&block)
|
123
123
|
commands[name]
|
124
124
|
end
|
125
|
-
alias_method :command_class, :create_command
|
126
125
|
|
127
126
|
# Execute a block of code before a command is invoked. The block also
|
128
127
|
# gets access to parameters that will be passed to the command and
|
@@ -365,45 +364,49 @@ class Pry
|
|
365
364
|
end
|
366
365
|
end
|
367
366
|
|
368
|
-
|
369
|
-
require 'rubygems/dependency_installer' unless defined? Gem::DependencyInstaller
|
370
|
-
command = find_command(name)
|
367
|
+
create_command "install-command", "Install a disabled command." do |name|
|
371
368
|
|
372
|
-
|
373
|
-
|
374
|
-
next
|
375
|
-
end
|
369
|
+
banner <<-BANNER
|
370
|
+
Usage: install-command COMMAND
|
376
371
|
|
377
|
-
|
378
|
-
|
372
|
+
Installs the gems necessary to run the given COMMAND. You will generally not
|
373
|
+
need to run this unless told to by an error message.
|
374
|
+
BANNER
|
379
375
|
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
output.puts "Installing `#{g}` gem..."
|
376
|
+
def process(name)
|
377
|
+
require 'rubygems/dependency_installer' unless defined? Gem::DependencyInstaller
|
378
|
+
command = find_command(name)
|
384
379
|
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
output.puts "Required Gem: `#{g}` not found. Aborting command installation."
|
389
|
-
gem_install_failed = true
|
390
|
-
next
|
380
|
+
if command_dependencies_met?(command.options)
|
381
|
+
output.puts "Dependencies for #{command.name} are met. Nothing to do."
|
382
|
+
return
|
391
383
|
end
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
384
|
+
|
385
|
+
output.puts "Attempting to install `#{name}` command..."
|
386
|
+
gems_to_install = Array(command.options[:requires_gem])
|
387
|
+
|
388
|
+
gems_to_install.each do |g|
|
389
|
+
next if gem_installed?(g)
|
390
|
+
output.puts "Installing `#{g}` gem..."
|
391
|
+
|
392
|
+
begin
|
393
|
+
Gem::DependencyInstaller.new.install(g)
|
394
|
+
rescue Gem::GemNotFoundException
|
395
|
+
raise CommandError, "Required Gem: `#{g}` not found. Aborting command installation."
|
396
|
+
end
|
397
|
+
end
|
398
|
+
|
399
|
+
Gem.refresh
|
400
|
+
gems_to_install.each do |g|
|
401
|
+
begin
|
402
|
+
require g
|
403
|
+
rescue LoadError
|
404
|
+
raise CommandError, "Required Gem: `#{g}` installed but not found?!. Aborting command installation."
|
405
|
+
end
|
402
406
|
end
|
403
|
-
end
|
404
|
-
next if gem_install_failed
|
405
407
|
|
406
|
-
|
408
|
+
output.puts "Installation of `#{name}` successful! Type `help #{name}` for information"
|
409
|
+
end
|
407
410
|
end
|
408
411
|
end
|
409
412
|
end
|
data/lib/pry/config.rb
CHANGED
@@ -42,7 +42,19 @@ class Pry
|
|
42
42
|
# @example
|
43
43
|
# Pry.hooks :before_session => proc { puts "hello" },
|
44
44
|
# :after_session => proc { puts "goodbye" }
|
45
|
-
|
45
|
+
attr_reader :hooks
|
46
|
+
|
47
|
+
# FIXME:
|
48
|
+
# This is a hack to alert people of the new API.
|
49
|
+
# @param [Pry::Hooks] v Only accept `Pry::Hooks` now!
|
50
|
+
def hooks=(v)
|
51
|
+
if v.is_a?(Hash)
|
52
|
+
warn "Hash-based hooks are now deprecated! Use a `Pry::Hooks` object instead! http://rubydoc.info/github/pry/pry/master/Pry/Hooks"
|
53
|
+
@hooks = Pry::Hooks.from_hash(v)
|
54
|
+
else
|
55
|
+
@hooks = v
|
56
|
+
end
|
57
|
+
end
|
46
58
|
|
47
59
|
# Get/Set the stack of input objects that a Pry instance switches
|
48
60
|
# to when its current input object encounters EOF.
|
@@ -6,7 +6,7 @@ class Pry
|
|
6
6
|
Context = Pry::CommandSet.new do
|
7
7
|
import Ls
|
8
8
|
|
9
|
-
|
9
|
+
create_command "cd" do
|
10
10
|
description "Move into a new context (object or scope). Type `cd --help` for more information."
|
11
11
|
|
12
12
|
banner <<-BANNER
|
@@ -106,7 +106,7 @@ class Pry
|
|
106
106
|
|
107
107
|
alias_command "!!@", "exit-all"
|
108
108
|
|
109
|
-
|
109
|
+
create_command "exit" do
|
110
110
|
description "Pop the previous binding (does NOT exit program). Type `exit --help` for more information. Aliases: quit"
|
111
111
|
|
112
112
|
banner <<-BANNER
|
@@ -164,11 +164,16 @@ class Pry
|
|
164
164
|
target.pry
|
165
165
|
end
|
166
166
|
|
167
|
-
|
167
|
+
create_command "pry-backtrace", "Show the backtrace for the Pry session." do
|
168
168
|
banner <<-BANNER
|
169
169
|
Usage: pry-backtrace [OPTIONS] [--help]
|
170
170
|
|
171
|
-
Show the backtrace for the Pry
|
171
|
+
Show the backtrace for the position in the code where Pry was started. This can be used to
|
172
|
+
infer the behavior of the program immediately before it entered Pry, just like the backtrace
|
173
|
+
property of an exception.
|
174
|
+
|
175
|
+
(NOTE: if you are looking for the backtrace of the most recent exception raised,
|
176
|
+
just type: `_ex_.backtrace` instead, see https://github.com/pry/pry/wiki/Special-Locals)
|
172
177
|
|
173
178
|
e.g: pry-backtrace
|
174
179
|
BANNER
|
@@ -3,7 +3,7 @@ class Pry
|
|
3
3
|
|
4
4
|
Documentation = Pry::CommandSet.new do
|
5
5
|
|
6
|
-
|
6
|
+
create_command "ri", "View ri documentation. e.g `ri Array#each`" do
|
7
7
|
banner <<-BANNER
|
8
8
|
Usage: ri [spec]
|
9
9
|
e.g. ri Array#each
|
@@ -16,7 +16,7 @@ class Pry
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
|
19
|
+
create_command "show-doc", "Show the comments above METH. Type `show-doc --help` for more info. Aliases: \?", :shellwords => false do |*args|
|
20
20
|
banner <<-BANNER
|
21
21
|
Usage: show-doc [OPTIONS] [METH]
|
22
22
|
Show the comments above method METH. Tries instance methods first and then methods by default.
|
@@ -25,6 +25,8 @@ class Pry
|
|
25
25
|
|
26
26
|
def options(opt)
|
27
27
|
method_options(opt)
|
28
|
+
opt.on :l, "line-numbers", "Show line numbers."
|
29
|
+
opt.on :b, "base-one", "Show line numbers but start numbering at 1 (useful for `amend-line` and `play` commands)."
|
28
30
|
opt.on :f, :flood, "Do not use a pager to view text longer than one screen."
|
29
31
|
end
|
30
32
|
|
@@ -39,13 +41,27 @@ class Pry
|
|
39
41
|
output.puts "#{text.bold("Signature:")} #{meth.signature}"
|
40
42
|
output.puts
|
41
43
|
|
44
|
+
if opts.present?(:b) || opts.present?(:l)
|
45
|
+
doc = Code.new(doc, start_line, :text).
|
46
|
+
with_line_numbers(true)
|
47
|
+
end
|
48
|
+
|
42
49
|
render_output(doc, opts)
|
43
50
|
end
|
51
|
+
|
52
|
+
def start_line
|
53
|
+
if opts.present?(:'base-one')
|
54
|
+
1
|
55
|
+
else
|
56
|
+
(method_object.source_line - method_object.doc.lines.count) || 1
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
44
60
|
end
|
45
61
|
|
46
62
|
alias_command "?", "show-doc"
|
47
63
|
|
48
|
-
|
64
|
+
create_command "stat", "View method information and set _file_ and _dir_ locals. Type `stat --help` for more info.", :shellwords => false do |*args|
|
49
65
|
banner <<-BANNER
|
50
66
|
Usage: stat [OPTIONS] [METH]
|
51
67
|
Show method information for method METH and set _file_ and _dir_ locals.
|
@@ -72,67 +88,55 @@ class Pry
|
|
72
88
|
end
|
73
89
|
end
|
74
90
|
|
75
|
-
|
91
|
+
create_command "gist", "Gist a method or expression history to github. Type `gist --help` for more info.", :requires_gem => "gist", :shellwords => false do
|
92
|
+
banner <<-USAGE
|
93
|
+
Usage: gist [OPTIONS] [METH]
|
94
|
+
Gist method (doc or source) or input expression to github.
|
95
|
+
Ensure the `gist` gem is properly working before use. http://github.com/defunkt/gist for instructions.
|
96
|
+
e.g: gist -m my_method
|
97
|
+
e.g: gist -d my_method
|
98
|
+
e.g: gist -i 1..10
|
99
|
+
e.g: gist -c show-method
|
100
|
+
e.g: gist -m hello_world --lines 2..-2
|
101
|
+
USAGE
|
102
|
+
|
76
103
|
attr_accessor :content
|
77
104
|
attr_accessor :code_type
|
78
|
-
attr_accessor :input_ranges
|
79
105
|
|
80
106
|
def setup
|
81
107
|
require 'gist'
|
108
|
+
self.content = ""
|
109
|
+
self.code_type = :ruby
|
82
110
|
end
|
83
111
|
|
84
112
|
def options(opt)
|
85
|
-
opt.
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
e.g: gist -m my_method
|
90
|
-
e.g: gist -d my_method
|
91
|
-
e.g: gist -i 1..10
|
92
|
-
e.g: gist -c show-method
|
93
|
-
USAGE
|
94
|
-
|
95
|
-
opt.on :d, :doc, "Gist a method's documentation.", true
|
96
|
-
opt.on :m, :method, "Gist a method's source.", true
|
97
|
-
opt.on :c, :command, "Gist a command's source.", true
|
98
|
-
opt.on :f, :file, "Gist a file.", true
|
99
|
-
opt.on :p, :public, "Create a public gist (default: false)", :default => false
|
100
|
-
opt.on :l, :lines, "Only gist a subset of lines (only works with -m and -f)", :optional => true, :as => Range, :default => 1..-1
|
101
|
-
opt.on :i, :in, "Gist entries from Pry's input expression history. Takes an index or range.", :optional => true,
|
102
|
-
:as => Range, :default => -5..-1 do |range|
|
103
|
-
self.input_ranges ||= []
|
104
|
-
input_ranges << absolute_index_range(range, _pry_.input_array.length)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
def process
|
109
|
-
self.content = ""
|
110
|
-
|
111
|
-
if opts.present?(:in)
|
112
|
-
in_option
|
113
|
-
end
|
114
|
-
if opts.present?(:file)
|
115
|
-
file_option
|
113
|
+
opt.on :m, :method, "Gist a method's source.", true do |meth_name|
|
114
|
+
meth = get_method_or_raise(meth_name, target, {})
|
115
|
+
self.content << meth.source
|
116
|
+
self.code_type = meth.source_type
|
116
117
|
end
|
117
|
-
|
118
|
-
|
118
|
+
opt.on :d, :doc, "Gist a method's documentation.", true do |meth_name|
|
119
|
+
meth = get_method_or_raise(meth_name, target, {})
|
120
|
+
text.no_color do
|
121
|
+
self.content << process_comment_markup(meth.doc, self.code_type)
|
122
|
+
end
|
123
|
+
self.code_type = :plain
|
119
124
|
end
|
120
|
-
|
121
|
-
|
125
|
+
opt.on :c, :command, "Gist a command's source.", true do |command_name|
|
126
|
+
command = find_command(command_name)
|
127
|
+
block = Pry::Method.new(find_command(command_name).block)
|
128
|
+
self.content << block.source
|
122
129
|
end
|
123
|
-
|
124
|
-
|
130
|
+
opt.on :f, :file, "Gist a file.", true do |file|
|
131
|
+
self.content << File.read(File.expand_path(file))
|
125
132
|
end
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
self.code_type = :ruby
|
132
|
-
|
133
|
-
input_ranges.each do |range|
|
133
|
+
opt.on :p, :public, "Create a public gist (default: false)", :default => false
|
134
|
+
opt.on :l, :lines, "Only gist a subset of lines.", :optional => true, :as => Range, :default => 1..-1
|
135
|
+
opt.on :i, :in, "Gist entries from Pry's input expression history. Takes an index or range.", :optional => true,
|
136
|
+
:as => Range, :default => -5..-1 do |range|
|
137
|
+
range = convert_to_range(range)
|
134
138
|
input_expressions = _pry_.input_array[range] || []
|
135
|
-
input_expressions.each_with_index
|
139
|
+
Array(input_expressions).each_with_index do |code, index|
|
136
140
|
corrected_index = index + range.first
|
137
141
|
if code && code != ""
|
138
142
|
self.content << code
|
@@ -144,49 +148,8 @@ USAGE
|
|
144
148
|
end
|
145
149
|
end
|
146
150
|
|
147
|
-
def
|
148
|
-
|
149
|
-
if opts.present?(:lines)
|
150
|
-
self.content << restrict_to_lines(whole_file, opts[:l])
|
151
|
-
else
|
152
|
-
self.content << whole_file
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
def doc_option
|
157
|
-
meth = get_method_or_raise(opts[:d], target, {})
|
158
|
-
self.content << meth.doc
|
159
|
-
self.code_type = meth.source_type
|
160
|
-
|
161
|
-
text.no_color do
|
162
|
-
self.content << process_comment_markup(self.content, self.code_type)
|
163
|
-
end
|
164
|
-
self.code_type = :plain
|
165
|
-
end
|
166
|
-
|
167
|
-
def method_option
|
168
|
-
meth = get_method_or_raise(opts[:m], target, {})
|
169
|
-
method_source = meth.source
|
170
|
-
if opts.present?(:lines)
|
171
|
-
self.content << restrict_to_lines(method_source, opts[:l])
|
172
|
-
else
|
173
|
-
self.content << method_source
|
174
|
-
end
|
175
|
-
|
176
|
-
self.code_type = meth.source_type
|
177
|
-
end
|
178
|
-
|
179
|
-
def command_option
|
180
|
-
command = find_command(opts[:c])
|
181
|
-
command_source = command.block.source
|
182
|
-
|
183
|
-
if opts.present?(:lines)
|
184
|
-
self.content << restrict_to_lines(command_source, opts[:l])
|
185
|
-
else
|
186
|
-
self.content << command_source
|
187
|
-
end
|
188
|
-
|
189
|
-
self.code_type = :ruby
|
151
|
+
def process
|
152
|
+
perform_gist
|
190
153
|
end
|
191
154
|
|
192
155
|
def perform_gist
|
@@ -200,6 +163,10 @@ USAGE
|
|
200
163
|
begin
|
201
164
|
extname = opts.present?(:file) ? ".#{gist_file_extension(opts[:f])}" : ".#{type_map[self.code_type]}"
|
202
165
|
|
166
|
+
if opts.present?(:lines)
|
167
|
+
self.content = restrict_to_lines(content, opts[:l])
|
168
|
+
end
|
169
|
+
|
203
170
|
link = Gist.write([:extension => extname,
|
204
171
|
:input => self.content],
|
205
172
|
!opts[:p])
|
@@ -212,15 +179,18 @@ USAGE
|
|
212
179
|
end
|
213
180
|
end
|
214
181
|
|
215
|
-
def restrict_to_lines(content, lines)
|
216
|
-
line_range = one_index_range(lines)
|
217
|
-
content.lines.to_a[line_range].join
|
218
|
-
end
|
219
|
-
|
220
182
|
def gist_file_extension(file_name)
|
221
183
|
file_name.split(".").last
|
222
184
|
end
|
223
185
|
|
186
|
+
def convert_to_range(n)
|
187
|
+
if !n.is_a?(Range)
|
188
|
+
(n..n)
|
189
|
+
else
|
190
|
+
n
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
224
194
|
def comment_expression_result_for_gist(result)
|
225
195
|
content = ""
|
226
196
|
result.lines.each_with_index do |line, index|
|