pry 0.8.0pre7-java → 0.8.0pre8-java
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +17 -3
- data/lib/pry/command_base.rb +58 -9
- data/lib/pry/command_base_helpers.rb +110 -0
- data/lib/pry/command_helpers.rb +45 -57
- data/lib/pry/command_processor.rb +27 -2
- data/lib/pry/commands.rb +118 -22
- data/lib/pry/version.rb +1 -1
- data/test/test.rb +2 -1
- metadata +4 -10
data/README.markdown
CHANGED
@@ -3,9 +3,23 @@ Pry
|
|
3
3
|
|
4
4
|
(C) John Mair (banisterfiend) 2011
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
Pry is a
|
6
|
+
_Ruby voyeurism_
|
7
|
+
|
8
|
+
Pry is a powerful alternative to the standard IRB shell for Ruby. It is
|
9
|
+
written from scratch to provide a number of advanced features, some of
|
10
|
+
these include:
|
11
|
+
|
12
|
+
* Runtime invocation
|
13
|
+
* Syntax highlighting
|
14
|
+
* Command shell integration
|
15
|
+
* Source code browsing (including core C source with the pry-doc gem)
|
16
|
+
* Documentation browsing
|
17
|
+
* Exotic object support (BasicObject instances, IClasses, ...)
|
18
|
+
* A Powerful and flexible command system
|
19
|
+
* Gisting ability
|
20
|
+
* Many convenience commands
|
21
|
+
|
22
|
+
Pry is a Ruby REPL (Read-Eval-Print-Loop) that specializes in the interactive
|
9
23
|
manipulation of objects during the running of a program.
|
10
24
|
|
11
25
|
In some sense it is the opposite of IRB in that you bring a REPL
|
data/lib/pry/command_base.rb
CHANGED
@@ -1,9 +1,14 @@
|
|
1
|
+
direc = File.dirname(__FILE__)
|
2
|
+
require "#{direc}/command_base_helpers"
|
3
|
+
|
1
4
|
class Pry
|
2
5
|
|
3
6
|
# Basic command functionality. All user-defined commands must
|
4
7
|
# inherit from this class. It provides the `command` method.
|
5
8
|
class CommandBase
|
6
9
|
class << self
|
10
|
+
include CommandBaseHelpers
|
11
|
+
|
7
12
|
attr_accessor :commands
|
8
13
|
attr_accessor :opts, :output, :target
|
9
14
|
|
@@ -39,17 +44,22 @@ class Pry
|
|
39
44
|
# # Greet somebody
|
40
45
|
def command(names, description="No description.", options={}, &block)
|
41
46
|
options = {
|
42
|
-
:keep_retval => false
|
47
|
+
:keep_retval => false,
|
48
|
+
:requires_gem => nil
|
43
49
|
}.merge!(options)
|
44
50
|
|
45
51
|
@commands ||= {}
|
46
52
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
+
if command_dependencies_met?(options)
|
54
|
+
Array(names).each do |name|
|
55
|
+
commands[name] = {
|
56
|
+
:description => description,
|
57
|
+
:action => block,
|
58
|
+
:keep_retval => options[:keep_retval]
|
59
|
+
}
|
60
|
+
end
|
61
|
+
else
|
62
|
+
create_command_stub(names, description, options, block)
|
53
63
|
end
|
54
64
|
end
|
55
65
|
|
@@ -133,10 +143,16 @@ class Pry
|
|
133
143
|
command_info = opts[:commands]
|
134
144
|
|
135
145
|
if !cmd
|
136
|
-
output.puts
|
146
|
+
output.puts
|
147
|
+
help_text = heading("Command List:") + "\n"
|
137
148
|
command_info.each do |k, data|
|
138
|
-
|
149
|
+
if !data[:stub_info]
|
150
|
+
help_text << ("#{k}".ljust(18) + data[:description] + "\n") if !data[:description].empty?
|
151
|
+
else
|
152
|
+
help_text << (bold("#{k}".ljust(18) + data[:description] + "\n")) if !data[:description].empty?
|
153
|
+
end
|
139
154
|
end
|
155
|
+
stagger_output(help_text)
|
140
156
|
else
|
141
157
|
if command_info[cmd]
|
142
158
|
output.puts command_info[cmd][:description]
|
@@ -146,6 +162,39 @@ class Pry
|
|
146
162
|
end
|
147
163
|
end
|
148
164
|
|
165
|
+
command "install", "Install a disabled command." do |name|
|
166
|
+
stub_info = commands[name][:stub_info]
|
167
|
+
|
168
|
+
if !stub_info
|
169
|
+
output.puts "Not a command stub. Nothing to do."
|
170
|
+
next
|
171
|
+
end
|
172
|
+
|
173
|
+
output.puts "Attempting to install `#{name}` command..."
|
174
|
+
|
175
|
+
require 'rubygems/dependency_installer'
|
176
|
+
gems_to_install = Array(stub_info[:requires_gem])
|
177
|
+
|
178
|
+
gem_install_failed = false
|
179
|
+
gems_to_install.each do |g|
|
180
|
+
next if gem_installed?(g)
|
181
|
+
output.puts "Installing `#{g}` gem..."
|
182
|
+
|
183
|
+
begin
|
184
|
+
Gem::DependencyInstaller.new.install(g)
|
185
|
+
rescue Gem::GemNotFoundException
|
186
|
+
output.puts "Required Gem: `#{g}` not found. Aborting command installation."
|
187
|
+
gem_install_failed = true
|
188
|
+
next
|
189
|
+
end
|
190
|
+
end
|
191
|
+
next if gem_install_failed
|
192
|
+
|
193
|
+
Gem.refresh
|
194
|
+
load "#{File.dirname(__FILE__)}/commands.rb"
|
195
|
+
output.puts "Installation of `#{name}` successful! Type `help #{name}` for information"
|
196
|
+
end
|
197
|
+
|
149
198
|
# Ensures that commands can be inherited
|
150
199
|
def self.inherited(klass)
|
151
200
|
klass.commands = commands.dup
|
@@ -0,0 +1,110 @@
|
|
1
|
+
class Pry
|
2
|
+
class CommandBase
|
3
|
+
module CommandBaseHelpers
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
def gem_installed?(gem_name)
|
8
|
+
require 'rubygems'
|
9
|
+
!!Gem.source_index.find_name(gem_name).first
|
10
|
+
end
|
11
|
+
|
12
|
+
def command_dependencies_met?(options)
|
13
|
+
return true if !options[:requires_gem]
|
14
|
+
Array(options[:requires_gem]).all? do |g|
|
15
|
+
gem_installed?(g)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def stub_proc(name, options)
|
20
|
+
gems_needed = Array(options[:requires_gem])
|
21
|
+
gems_not_installed = gems_needed.select { |g| !gem_installed?(g) }
|
22
|
+
proc do
|
23
|
+
output.puts "\n`#{name}` requires the following gems to be installed: `#{gems_needed.join(", ")}`"
|
24
|
+
output.puts "Command not available due to dependency on gems: `#{gems_not_installed.join(", ")}` not being met."
|
25
|
+
output.puts "Type `install #{name}` to install the required gems and activate this command."
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def create_command_stub(names, description, options, block)
|
30
|
+
Array(names).each do |name|
|
31
|
+
commands[name] = {
|
32
|
+
:description => "Not available. Execute `#{name}` command for more information.",
|
33
|
+
:action => stub_proc(name, options),
|
34
|
+
:stub_info => options
|
35
|
+
}
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def bold(text)
|
40
|
+
Pry.color ? "\e[1m#{text}\e[0m" : text
|
41
|
+
end
|
42
|
+
|
43
|
+
# formatting
|
44
|
+
def heading(text)
|
45
|
+
text = "#{text}\n--"
|
46
|
+
Pry.color ? "\e[1m#{text}\e[0m": text
|
47
|
+
end
|
48
|
+
|
49
|
+
def page_size
|
50
|
+
27
|
51
|
+
end
|
52
|
+
|
53
|
+
# a simple pager for systems without `less`. A la windows.
|
54
|
+
def simple_pager(text)
|
55
|
+
text_array = text.lines.to_a
|
56
|
+
text_array.each_slice(page_size) do |chunk|
|
57
|
+
output.puts chunk.join
|
58
|
+
break if chunk.size < page_size
|
59
|
+
if text_array.size > page_size
|
60
|
+
output.puts "\n<page break> --- Press enter to continue ( q<enter> to break ) --- <page break>"
|
61
|
+
break if $stdin.gets.chomp == "q"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Try to use `less` for paging, if it fails then use simple_pager
|
67
|
+
def stagger_output(text)
|
68
|
+
if text.lines.count < page_size
|
69
|
+
output.puts text
|
70
|
+
return
|
71
|
+
end
|
72
|
+
lesspipe { |less| less.puts text }
|
73
|
+
rescue Exception
|
74
|
+
simple_pager(text)
|
75
|
+
end
|
76
|
+
|
77
|
+
# thanks to epitron for this method
|
78
|
+
def lesspipe(*args)
|
79
|
+
if args.any? and args.last.is_a?(Hash)
|
80
|
+
options = args.pop
|
81
|
+
else
|
82
|
+
options = {}
|
83
|
+
end
|
84
|
+
|
85
|
+
output = args.first if args.any?
|
86
|
+
|
87
|
+
params = []
|
88
|
+
params << "-R" unless options[:color] == false
|
89
|
+
params << "-S" unless options[:wrap] == true
|
90
|
+
params << "-F" unless options[:always] == true
|
91
|
+
if options[:tail] == true
|
92
|
+
params << "+\\>"
|
93
|
+
$stderr.puts "Seeking to end of stream..."
|
94
|
+
end
|
95
|
+
params << "-X"
|
96
|
+
|
97
|
+
IO.popen("less #{params * ' '}", "w") do |less|
|
98
|
+
if output
|
99
|
+
less.puts output
|
100
|
+
else
|
101
|
+
yield less
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
|
data/lib/pry/command_helpers.rb
CHANGED
@@ -27,30 +27,9 @@ class Pry
|
|
27
27
|
$_file_temp = File.expand_path(file_name)
|
28
28
|
$_dir_temp = File.dirname($_file_temp)
|
29
29
|
target.eval("_file_ = $_file_temp")
|
30
|
-
target.eval("_dir_ = $
|
30
|
+
target.eval("_dir_ = $_dir_temp")
|
31
31
|
end
|
32
|
-
|
33
|
-
# a simple pager for systems without `less`. A la windows.
|
34
|
-
def simple_pager(text)
|
35
|
-
page_size = 22
|
36
|
-
text_array = text.lines.to_a
|
37
|
-
text_array.each_slice(page_size) do |chunk|
|
38
|
-
output.puts chunk.join
|
39
|
-
break if chunk.size < page_size
|
40
|
-
if text_array.size > page_size
|
41
|
-
output.puts "\n<page break> --- Press enter to continue ( q<enter> to break ) --- <page break>"
|
42
|
-
break if $stdin.gets.chomp == "q"
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
# Try to use `less` for paging, if it fails then use simple_pager
|
48
|
-
def stagger_output(text)
|
49
|
-
lesspipe { |less| less.puts text }
|
50
|
-
rescue Exception
|
51
|
-
simple_pager(text)
|
52
|
-
end
|
53
|
-
|
32
|
+
|
54
33
|
def add_line_numbers(lines, start_line)
|
55
34
|
line_array = lines.each_line.to_a
|
56
35
|
line_array.each_with_index.map do |line, idx|
|
@@ -64,7 +43,6 @@ class Pry
|
|
64
43
|
end.join
|
65
44
|
end
|
66
45
|
|
67
|
-
# only add line numbers if start_line is not false
|
68
46
|
# if start_line is not false then add line numbers starting with start_line
|
69
47
|
def render_output(should_flood, start_line, doc)
|
70
48
|
if start_line
|
@@ -89,6 +67,45 @@ class Pry
|
|
89
67
|
text.split.drop(1).join(' ')
|
90
68
|
end
|
91
69
|
|
70
|
+
# turn off color for duration of block
|
71
|
+
def no_color(&block)
|
72
|
+
old_color_state = Pry.color
|
73
|
+
Pry.color = false
|
74
|
+
yield
|
75
|
+
ensure
|
76
|
+
Pry.color = old_color_state
|
77
|
+
end
|
78
|
+
|
79
|
+
def code_and_code_type_for(meth)
|
80
|
+
case code_type = code_type_for(meth)
|
81
|
+
when nil
|
82
|
+
return nil
|
83
|
+
when :c
|
84
|
+
code = Pry::MethodInfo.info_for(meth).source
|
85
|
+
code = strip_comments_from_c_code(code)
|
86
|
+
when :ruby
|
87
|
+
code = strip_leading_whitespace(meth.source)
|
88
|
+
set_file_and_dir_locals(meth.source_location.first)
|
89
|
+
end
|
90
|
+
|
91
|
+
[code, code_type]
|
92
|
+
end
|
93
|
+
|
94
|
+
def doc_and_code_type_for(meth)
|
95
|
+
case code_type = code_type_for(meth)
|
96
|
+
when nil
|
97
|
+
return nil
|
98
|
+
when :c
|
99
|
+
doc = Pry::MethodInfo.info_for(meth).docstring
|
100
|
+
when :ruby
|
101
|
+
doc = meth.comment
|
102
|
+
doc = strip_leading_hash_and_whitespace_from_ruby_comments(doc)
|
103
|
+
set_file_and_dir_locals(meth.source_location.first)
|
104
|
+
end
|
105
|
+
|
106
|
+
[doc, code_type]
|
107
|
+
end
|
108
|
+
|
92
109
|
def get_method_object(meth_name, target, options)
|
93
110
|
if !meth_name
|
94
111
|
return nil
|
@@ -113,12 +130,12 @@ class Pry
|
|
113
130
|
|
114
131
|
def make_header(meth, code_type, content)
|
115
132
|
file, line = meth.source_location
|
116
|
-
num_lines = "Number of lines: #{content.each_line.count}"
|
133
|
+
num_lines = "Number of lines: #{bold(content.each_line.count.to_s)}"
|
117
134
|
case code_type
|
118
135
|
when :ruby
|
119
|
-
"\
|
136
|
+
"\n#{bold('From:')} #{file} @ line #{line}:\n#{num_lines}\n\n"
|
120
137
|
else
|
121
|
-
"\
|
138
|
+
"\n#{bold('From:')} Ruby Core (C Method):\n#{num_lines}\n\n"
|
122
139
|
end
|
123
140
|
end
|
124
141
|
|
@@ -156,7 +173,7 @@ class Pry
|
|
156
173
|
{
|
157
174
|
[".c", ".h"] => :c,
|
158
175
|
[".cpp", ".hpp", ".cc", ".h", "cxx"] => :cpp,
|
159
|
-
[".rb", "Rakefile"] => :ruby,
|
176
|
+
[".rb", "Rakefile", ".irbrc", ".gemspec", ".pryrc"] => :ruby,
|
160
177
|
".py" => :python,
|
161
178
|
".diff" => :diff,
|
162
179
|
".css" => :css,
|
@@ -257,35 +274,6 @@ class Pry
|
|
257
274
|
code.sub /\A\s*\/\*.*?\*\/\s*/m, ''
|
258
275
|
end
|
259
276
|
|
260
|
-
# thanks to epitron for this method
|
261
|
-
def lesspipe(*args)
|
262
|
-
if args.any? and args.last.is_a?(Hash)
|
263
|
-
options = args.pop
|
264
|
-
else
|
265
|
-
options = {}
|
266
|
-
end
|
267
|
-
|
268
|
-
output = args.first if args.any?
|
269
|
-
|
270
|
-
params = []
|
271
|
-
params << "-R" unless options[:color] == false
|
272
|
-
params << "-S" unless options[:wrap] == true
|
273
|
-
params << "-F" unless options[:always] == true
|
274
|
-
if options[:tail] == true
|
275
|
-
params << "+\\>"
|
276
|
-
$stderr.puts "Seeking to end of stream..."
|
277
|
-
end
|
278
|
-
params << "-X"
|
279
|
-
|
280
|
-
IO.popen("less #{params * ' '}", "w") do |less|
|
281
|
-
if output
|
282
|
-
less.puts output
|
283
|
-
else
|
284
|
-
yield less
|
285
|
-
end
|
286
|
-
end
|
287
|
-
end
|
288
|
-
|
289
277
|
end
|
290
278
|
end
|
291
279
|
end
|
@@ -15,24 +15,47 @@ class Pry
|
|
15
15
|
|
16
16
|
def_delegators :@pry_instance, :commands, :nesting, :output
|
17
17
|
|
18
|
+
# Is the string a command valid?
|
19
|
+
# @param [String] val The string passed in from the Pry prompt.
|
20
|
+
# @return [Boolean] Whether the string is a valid command.
|
18
21
|
def valid_command?(val)
|
19
22
|
system_command?(val) || pry_command?(val)
|
20
23
|
end
|
21
24
|
|
25
|
+
# Is the string a valid system command?
|
26
|
+
# @param [String] val The string passed in from the Pry prompt.
|
27
|
+
# @return [Boolean] Whether the string is a valid system command.
|
22
28
|
def system_command?(val)
|
23
29
|
!!(SYSTEM_COMMAND_REGEX =~ val)
|
24
30
|
end
|
25
31
|
|
32
|
+
# Is the string a valid pry command?
|
33
|
+
# A Pry command is a command that is not a system command.
|
34
|
+
# @param [String] val The string passed in from the Pry prompt.
|
35
|
+
# @return [Boolean] Whether the string is a valid Pry command.
|
26
36
|
def pry_command?(val)
|
27
37
|
!!command_matched(val).first
|
28
38
|
end
|
29
39
|
|
40
|
+
# Revaluate the string (str) and perform interpolation.
|
41
|
+
# @param [String] str The string to reevaluate with interpolation.
|
42
|
+
# @param [Binding] target The context where the string should be
|
43
|
+
# reevaluated in.
|
44
|
+
# @return [String] The reevaluated string with interpolations
|
45
|
+
# applied (if any).
|
30
46
|
def interpolate_string(str, target)
|
31
47
|
dumped_str = str.dump
|
32
48
|
dumped_str.gsub!(/\\\#\{/, '#{')
|
33
49
|
target.eval(dumped_str)
|
34
50
|
end
|
35
|
-
|
51
|
+
|
52
|
+
# Execute a given system command.
|
53
|
+
# The commands first have interpolation applied against the
|
54
|
+
# `target` context.
|
55
|
+
# All system command are forwarded to a shell. Note that the `cd`
|
56
|
+
# command is special-cased and is converted internallly to a `Dir.chdir`
|
57
|
+
# @param [String] val The system command to execute.
|
58
|
+
# @param [Binding] target The context in which to perform string interpolation.
|
36
59
|
def execute_system_command(val, target)
|
37
60
|
SYSTEM_COMMAND_REGEX =~ val
|
38
61
|
cmd = interpolate_string($1, target)
|
@@ -47,7 +70,8 @@ class Pry
|
|
47
70
|
system(cmd)
|
48
71
|
end
|
49
72
|
|
50
|
-
|
73
|
+
# Tick, tock, im getting rid of this shit soon.
|
74
|
+
val.replace("")
|
51
75
|
end
|
52
76
|
|
53
77
|
# Determine whether a Pry command was matched and return command data
|
@@ -131,6 +155,7 @@ class Pry
|
|
131
155
|
ret_val = commands.instance_exec(*args_with_corrected_arity, &action)
|
132
156
|
end
|
133
157
|
|
158
|
+
# Tick, tock, im getting rid of this shit soon.
|
134
159
|
options[:val].clear
|
135
160
|
|
136
161
|
ret_val
|
data/lib/pry/commands.rb
CHANGED
@@ -23,6 +23,9 @@ class Pry
|
|
23
23
|
Pry.start(target)
|
24
24
|
end
|
25
25
|
|
26
|
+
command ".<shell command>", "All text following a '.' is forwarded to the shell." do
|
27
|
+
end
|
28
|
+
|
26
29
|
command "exit-program", "End the current program. Aliases: quit-program, !!!" do
|
27
30
|
exit
|
28
31
|
end
|
@@ -30,6 +33,114 @@ class Pry
|
|
30
33
|
alias_command "quit-program", "exit-program", ""
|
31
34
|
alias_command "!!!", "exit-program", ""
|
32
35
|
|
36
|
+
command "ri", "View ri documentation. e.g `ri Array#each`" do |*args|
|
37
|
+
run target, ".ri", *args
|
38
|
+
end
|
39
|
+
|
40
|
+
command "stat", "View method information and set _file_ and _dir_ locals" do |*args|
|
41
|
+
options = {}
|
42
|
+
target = target()
|
43
|
+
meth_name = nil
|
44
|
+
|
45
|
+
OptionParser.new do |opts|
|
46
|
+
opts.banner = %{Usage: stat [OPTIONS] [METH]
|
47
|
+
Show method information for method METH and set _file_ and _dir_ locals.
|
48
|
+
e.g: stat hello_method
|
49
|
+
--
|
50
|
+
}
|
51
|
+
opts.on("-M", "--instance-methods", "Operate on instance methods.") do
|
52
|
+
options[:M] = true
|
53
|
+
end
|
54
|
+
|
55
|
+
opts.on("-m", "--methods", "Operate on methods.") do
|
56
|
+
options[:m] = true
|
57
|
+
end
|
58
|
+
|
59
|
+
opts.on("-c", "--context CONTEXT", "Select object context to run under.") do |context|
|
60
|
+
target = Pry.binding_for(target.eval(context))
|
61
|
+
end
|
62
|
+
|
63
|
+
opts.on_tail("-h", "--help", "This message.") do
|
64
|
+
output.puts opts
|
65
|
+
options[:h] = true
|
66
|
+
end
|
67
|
+
end.order(args) do |v|
|
68
|
+
meth_name = v
|
69
|
+
end
|
70
|
+
|
71
|
+
next if options[:h]
|
72
|
+
|
73
|
+
meth_name = meth_name_from_binding(target) if !meth_name
|
74
|
+
|
75
|
+
if (meth = get_method_object(meth_name, target, options)).nil?
|
76
|
+
output.puts "Invalid method name: #{meth_name}. Type `stat --help` for help"
|
77
|
+
next
|
78
|
+
end
|
79
|
+
|
80
|
+
code, code_type = code_and_code_type_for(meth)
|
81
|
+
next if !code
|
82
|
+
doc, code_type = doc_and_code_type_for(meth)
|
83
|
+
|
84
|
+
output.puts make_header(meth, code_type, code)
|
85
|
+
output.puts bold("Method Name: ") + meth_name
|
86
|
+
output.puts bold("Method Language: ") + code_type.to_s.capitalize
|
87
|
+
output.puts bold("Method Type: ") + (meth.is_a?(Method) ? "Bound" : "Unbound")
|
88
|
+
output.puts bold("Method Arity: ") + meth.arity.to_s
|
89
|
+
output.puts bold("Comment length: ") + (doc.empty? ? 'No comment.' : (doc.lines.count.to_s + ' lines.'))
|
90
|
+
end
|
91
|
+
|
92
|
+
command "gist-method", "Gist a method to github.", :requires_gem => "gist" do |*args|
|
93
|
+
options = {}
|
94
|
+
meth_name = nil
|
95
|
+
|
96
|
+
OptionParser.new do |opts|
|
97
|
+
opts.banner = %{Usage: gist-method [OPTIONS] [METH]
|
98
|
+
Gist the method (doc or source) to github.
|
99
|
+
e.g: gist -m my_method
|
100
|
+
e.g: gist -d my_method
|
101
|
+
--
|
102
|
+
}
|
103
|
+
opts.on("-m", "--method", "Gist a method's source.") do |line|
|
104
|
+
options[:m] = true
|
105
|
+
end
|
106
|
+
|
107
|
+
opts.on("-d", "--doc", "Gist a method's documentation.") do
|
108
|
+
options[:d] = true
|
109
|
+
end
|
110
|
+
|
111
|
+
opts.on_tail("-h", "--help", "This message.") do
|
112
|
+
output.puts opts
|
113
|
+
options[:h] = true
|
114
|
+
end
|
115
|
+
end.order(args) do |v|
|
116
|
+
meth_name = v
|
117
|
+
end
|
118
|
+
|
119
|
+
next if options[:h]
|
120
|
+
|
121
|
+
meth_name = meth_name_from_binding(target) if !meth_name
|
122
|
+
|
123
|
+
if (meth = get_method_object(meth_name, target, options)).nil?
|
124
|
+
output.puts "Invalid method name: #{meth_name}. Type `gist-method --help` for help"
|
125
|
+
next
|
126
|
+
end
|
127
|
+
|
128
|
+
type_map = { :ruby => "rb", :c => "c", :plain => "plain" }
|
129
|
+
if !options[:d]
|
130
|
+
content, code_type = code_and_code_type_for(meth)
|
131
|
+
else
|
132
|
+
content, code_type = doc_and_code_type_for(meth)
|
133
|
+
no_color do
|
134
|
+
content = process_comment_markup(content, code_type)
|
135
|
+
end
|
136
|
+
code_type = :plain
|
137
|
+
end
|
138
|
+
|
139
|
+
IO.popen("gist -p -t #{type_map[code_type]} -", "w") do |gist|
|
140
|
+
gist.puts content
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
33
144
|
command "gem-cd", "Change working directory to specified gem's directory." do |gem_name|
|
34
145
|
require 'rubygems'
|
35
146
|
gem_spec = Gem.source_index.find_name(gem_name).first
|
@@ -116,7 +227,7 @@ class Pry
|
|
116
227
|
end
|
117
228
|
|
118
229
|
set_file_and_dir_locals(file)
|
119
|
-
output.puts "\
|
230
|
+
output.puts "\n#{bold('From:')} #{file} @ line #{line_num} in #{klass}##{meth_name}:\n\n"
|
120
231
|
|
121
232
|
# This method inspired by http://rubygems.org/gems/ir_b
|
122
233
|
File.open(file).each_with_index do |line, index|
|
@@ -491,16 +602,8 @@ e.g show-doc hello_method
|
|
491
602
|
next
|
492
603
|
end
|
493
604
|
|
494
|
-
|
495
|
-
|
496
|
-
next
|
497
|
-
when :c
|
498
|
-
doc = Pry::MethodInfo.info_for(meth).docstring
|
499
|
-
when :ruby
|
500
|
-
doc = meth.comment
|
501
|
-
doc = strip_leading_hash_and_whitespace_from_ruby_comments(doc)
|
502
|
-
set_file_and_dir_locals(meth.source_location.first)
|
503
|
-
end
|
605
|
+
doc, code_type = doc_and_code_type_for(meth)
|
606
|
+
next if !doc
|
504
607
|
|
505
608
|
next output.puts("No documentation found.") if doc.empty?
|
506
609
|
|
@@ -514,7 +617,7 @@ e.g show-doc hello_method
|
|
514
617
|
|
515
618
|
alias_command "?", "show-doc", ""
|
516
619
|
|
517
|
-
command "show-method", "Show the source for METH. Type `show-method --help` for more info. Aliases: show-source" do |*args|
|
620
|
+
command "show-method", "Show the source for METH. Type `show-method --help` for more info. Aliases: $, show-source" do |*args|
|
518
621
|
options = {}
|
519
622
|
target = target()
|
520
623
|
meth_name = nil
|
@@ -562,16 +665,8 @@ e.g: show-method hello_method
|
|
562
665
|
next
|
563
666
|
end
|
564
667
|
|
565
|
-
|
566
|
-
|
567
|
-
next
|
568
|
-
when :c
|
569
|
-
code = Pry::MethodInfo.info_for(meth).source
|
570
|
-
code = strip_comments_from_c_code(code)
|
571
|
-
when :ruby
|
572
|
-
code = strip_leading_whitespace(meth.source)
|
573
|
-
set_file_and_dir_locals(meth.source_location.first)
|
574
|
-
end
|
668
|
+
code, code_type = code_and_code_type_for(meth)
|
669
|
+
next if !code
|
575
670
|
|
576
671
|
output.puts make_header(meth, code_type, code)
|
577
672
|
if Pry.color
|
@@ -588,6 +683,7 @@ e.g: show-method hello_method
|
|
588
683
|
end
|
589
684
|
|
590
685
|
alias_command "show-source", "show-method", ""
|
686
|
+
alias_command "$", "show-method", ""
|
591
687
|
|
592
688
|
command "show-command", "Show the source for CMD. Type `show-command --help` for more info." do |*args|
|
593
689
|
options = {}
|
data/lib/pry/version.rb
CHANGED
data/test/test.rb
CHANGED
@@ -434,8 +434,9 @@ describe Pry do
|
|
434
434
|
end
|
435
435
|
end
|
436
436
|
|
437
|
-
Command2.commands.keys.size.should ==
|
437
|
+
Command2.commands.keys.size.should == 3
|
438
438
|
Command2.commands.keys.include?("help").should == true
|
439
|
+
Command2.commands.keys.include?("install").should == true
|
439
440
|
Command2.commands.keys.include?("h").should == true
|
440
441
|
|
441
442
|
Object.remove_const(:Command2)
|
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pry
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: -766259880
|
5
4
|
prerelease: true
|
6
5
|
segments:
|
7
6
|
- 0
|
8
7
|
- 8
|
9
|
-
-
|
10
|
-
version: 0.8.
|
8
|
+
- 0pre8
|
9
|
+
version: 0.8.0pre8
|
11
10
|
platform: java
|
12
11
|
authors:
|
13
12
|
- John Mair (banisterfiend)
|
@@ -15,7 +14,7 @@ autorequire:
|
|
15
14
|
bindir: bin
|
16
15
|
cert_chain: []
|
17
16
|
|
18
|
-
date: 2011-04-
|
17
|
+
date: 2011-04-13 00:00:00 +12:00
|
19
18
|
default_executable:
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
@@ -26,7 +25,6 @@ dependencies:
|
|
26
25
|
requirements:
|
27
26
|
- - ">="
|
28
27
|
- !ruby/object:Gem::Version
|
29
|
-
hash: 5
|
30
28
|
segments:
|
31
29
|
- 2
|
32
30
|
- 0
|
@@ -42,7 +40,6 @@ dependencies:
|
|
42
40
|
requirements:
|
43
41
|
- - ">="
|
44
42
|
- !ruby/object:Gem::Version
|
45
|
-
hash: 53
|
46
43
|
segments:
|
47
44
|
- 0
|
48
45
|
- 9
|
@@ -58,7 +55,6 @@ dependencies:
|
|
58
55
|
requirements:
|
59
56
|
- - ">="
|
60
57
|
- !ruby/object:Gem::Version
|
61
|
-
hash: 19
|
62
58
|
segments:
|
63
59
|
- 1
|
64
60
|
- 1
|
@@ -74,7 +70,6 @@ dependencies:
|
|
74
70
|
requirements:
|
75
71
|
- - "="
|
76
72
|
- !ruby/object:Gem::Version
|
77
|
-
hash: 23
|
78
73
|
segments:
|
79
74
|
- 0
|
80
75
|
- 2
|
@@ -104,6 +99,7 @@ files:
|
|
104
99
|
- lib/pry/completion.rb
|
105
100
|
- lib/pry/print.rb
|
106
101
|
- lib/pry/pry_class.rb
|
102
|
+
- lib/pry/command_base_helpers.rb
|
107
103
|
- lib/pry/pry_instance.rb
|
108
104
|
- lib/pry.rb
|
109
105
|
- examples/example_commands.rb
|
@@ -139,7 +135,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
139
135
|
requirements:
|
140
136
|
- - ">="
|
141
137
|
- !ruby/object:Gem::Version
|
142
|
-
hash: 3
|
143
138
|
segments:
|
144
139
|
- 0
|
145
140
|
version: "0"
|
@@ -148,7 +143,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
148
143
|
requirements:
|
149
144
|
- - ">"
|
150
145
|
- !ruby/object:Gem::Version
|
151
|
-
hash: 25
|
152
146
|
segments:
|
153
147
|
- 1
|
154
148
|
- 3
|