pry 0.9.8pre7-i386-mingw32 → 0.9.8pre8-i386-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- 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|
|