pry 0.8.3 → 0.8.4pre1
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +2 -0
- data/.gitignore +8 -0
- data/.yardopts +1 -0
- data/README.markdown +10 -6
- data/Rakefile +15 -23
- data/TODO +62 -0
- data/bin/pry +3 -1
- data/lib/pry.rb +6 -7
- data/lib/pry/command_context.rb +29 -0
- data/lib/pry/command_processor.rb +15 -28
- data/lib/pry/command_set.rb +234 -0
- data/lib/pry/commands.rb +15 -861
- data/lib/pry/core_extensions.rb +40 -48
- data/lib/pry/default_commands/context.rb +127 -0
- data/lib/pry/default_commands/documentation.rb +145 -0
- data/lib/pry/default_commands/easter_eggs.rb +71 -0
- data/lib/pry/default_commands/gems.rb +59 -0
- data/lib/pry/default_commands/input.rb +38 -0
- data/lib/pry/default_commands/introspection.rb +190 -0
- data/lib/pry/default_commands/ls.rb +199 -0
- data/lib/pry/default_commands/shell.rb +90 -0
- data/lib/pry/helpers.rb +2 -0
- data/lib/pry/{command_base_helpers.rb → helpers/base_helpers.rb} +46 -21
- data/lib/pry/{command_helpers.rb → helpers/command_helpers.rb} +34 -36
- data/lib/pry/pry_class.rb +17 -11
- data/lib/pry/pry_instance.rb +59 -2
- data/lib/pry/version.rb +1 -1
- data/test/{test_helper.rb → helper.rb} +8 -2
- data/test/test_command_helpers.rb +77 -0
- data/test/test_commandset.rb +184 -0
- data/test/{test.rb → test_pry.rb} +164 -132
- data/wiki/Customizing-pry.md +397 -0
- data/wiki/Home.md +4 -0
- metadata +61 -41
- data/lib/pry/command_base.rb +0 -202
data/.document
ADDED
data/.gitignore
ADDED
data/.yardopts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--markup markdown --private
|
data/README.markdown
CHANGED
@@ -420,11 +420,11 @@ You can use `edit-method Class#method` or `edit-method my_method`
|
|
420
420
|
your favorite editor. Pry has knowledge of a few different editors and
|
421
421
|
will attempt to open the file at the line the method is defined.
|
422
422
|
|
423
|
-
You can set the editor to use by assigning to the `Pry.editor
|
423
|
+
You can set the editor to use by assigning to the `Pry.editor`
|
424
424
|
accessor. `Pry.editor` will default to `$EDITOR` or failing that will
|
425
425
|
use `nano` as the backup default. The file that is edited will be
|
426
426
|
automatically reloaded after exiting the editor - reloading can be
|
427
|
-
suppressed by passing the
|
427
|
+
suppressed by passing the `--no-reload` option to `edit-method`
|
428
428
|
|
429
429
|
In the example below we will set our default editor to "emacsclient"
|
430
430
|
and open the `Pry#repl` method for editing:
|
@@ -432,7 +432,6 @@ and open the `Pry#repl` method for editing:
|
|
432
432
|
pry(main)> Pry.editor = "emacsclient"
|
433
433
|
pry(main)> edit-method Pry#repl
|
434
434
|
|
435
|
-
|
436
435
|
### Live Help System
|
437
436
|
|
438
437
|
Many other commands are available in Pry; to see the full list type
|
@@ -442,6 +441,11 @@ help that can be accessed via typing `command_name --help`. A command
|
|
442
441
|
will typically say in its description if the `--help` option is
|
443
442
|
avaiable.
|
444
443
|
|
444
|
+
### Use Pry as your Rails Console
|
445
|
+
|
446
|
+
pry -r./config/environment
|
447
|
+
|
448
|
+
MyArtChannel has kindly provided a hack to replace the `rails console` command in Rails 3: [https://gist.github.com/941174](https://gist.github.com/941174) This is not recommended for code bases with multiple developers, as they may not all want to use Pry.
|
445
449
|
|
446
450
|
### Other Features and limitations
|
447
451
|
|
@@ -482,13 +486,13 @@ invoke any of these methods directly depending on exactly what aspect of the fun
|
|
482
486
|
|
483
487
|
#### Limitations:
|
484
488
|
|
485
|
-
* Some Pry commands (e.g `show-command`) do not work in Ruby 1.8
|
489
|
+
* Some Pry commands (e.g `show-command`) do not work in Ruby 1.8
|
490
|
+
MRI. But many other commands do work in Ruby 1.8 MRI, e.g
|
491
|
+
`show-method`, due to a functional 1.8 source_location implementation.
|
486
492
|
* JRuby not officially supported due to currently too many quirks and
|
487
493
|
strange behaviour. Nonetheless most functionality should still work
|
488
494
|
OK in JRuby. Full JRuby support coming in a future version.
|
489
495
|
* `method_source` functionality does not work in JRuby with Ruby 1.8
|
490
|
-
* Color support does not work in JRuby with Ruby 1.9 (due to a
|
491
|
-
limitation in JRuby's regex).
|
492
496
|
* Tab completion is currently a bit broken/limited this will have a
|
493
497
|
major overhaul in a future version.
|
494
498
|
|
data/Rakefile
CHANGED
@@ -1,42 +1,38 @@
|
|
1
|
-
dlext = Config::CONFIG['DLEXT']
|
2
|
-
direc = File.dirname(__FILE__)
|
3
|
-
|
4
1
|
require 'rake/clean'
|
5
2
|
require 'rake/gempackagetask'
|
6
|
-
require "#{direc}/lib/pry/version"
|
7
3
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
4
|
+
$:.unshift 'lib'
|
5
|
+
require 'pry/version'
|
6
|
+
|
7
|
+
CLOBBER.include("**/*~", "**/*#*", "**/*.log")
|
8
|
+
CLEAN.include("**/*#*", "**/*#*.*", "**/*_flymake*.*", "**/*_flymake", "**/*.rbc")
|
12
9
|
|
13
10
|
def apply_spec_defaults(s)
|
14
11
|
s.name = "pry"
|
15
|
-
s.summary = "
|
12
|
+
s.summary = "an IRB alternative and runtime developer console"
|
16
13
|
s.version = Pry::VERSION
|
17
14
|
s.date = Time.now.strftime '%Y-%m-%d'
|
18
15
|
s.author = "John Mair (banisterfiend)"
|
19
16
|
s.email = 'jrmair@gmail.com'
|
20
17
|
s.description = s.summary
|
21
|
-
s.require_path = 'lib'
|
22
|
-
s.add_dependency("ruby_parser",">=2.0.5")
|
23
|
-
s.add_dependency("coderay",">=0.9.7")
|
24
|
-
s.add_dependency("slop",">=1.5.3")
|
25
|
-
s.add_development_dependency("bacon",">=1.1.0")
|
26
18
|
s.homepage = "http://banisterfiend.wordpress.com"
|
27
19
|
s.has_rdoc = 'yard'
|
28
20
|
s.executables = ["pry"]
|
29
|
-
s.files =
|
30
|
-
|
21
|
+
s.files = `git ls-files`.split("\n")
|
22
|
+
s.test_files = `git ls-files -- test/*`.split("\n")
|
23
|
+
s.add_dependency("ruby_parser",">=2.0.5")
|
24
|
+
s.add_dependency("coderay",">=0.9.8")
|
25
|
+
s.add_dependency("slop",">=1.5.3")
|
26
|
+
s.add_dependency("method_source",">=0.4.0")
|
27
|
+
s.add_development_dependency("bacon",">=1.1.0")
|
31
28
|
end
|
32
29
|
|
33
30
|
task :test do
|
34
|
-
sh "bacon
|
31
|
+
sh "bacon -Itest -rubygems -a"
|
35
32
|
end
|
36
33
|
|
37
34
|
desc "run pry"
|
38
35
|
task :pry do
|
39
|
-
$LOAD_PATH.unshift "#{direc}/lib"
|
40
36
|
require 'pry'
|
41
37
|
binding.pry
|
42
38
|
end
|
@@ -49,7 +45,6 @@ end
|
|
49
45
|
namespace :ruby do
|
50
46
|
spec = Gem::Specification.new do |s|
|
51
47
|
apply_spec_defaults(s)
|
52
|
-
s.add_dependency("method_source",">=0.4.0")
|
53
48
|
s.platform = Gem::Platform::RUBY
|
54
49
|
end
|
55
50
|
|
@@ -63,7 +58,6 @@ end
|
|
63
58
|
namespace v do
|
64
59
|
spec = Gem::Specification.new do |s|
|
65
60
|
apply_spec_defaults(s)
|
66
|
-
s.add_dependency("method_source",">=0.4.0")
|
67
61
|
s.add_dependency("win32console", ">=1.3.0")
|
68
62
|
s.platform = "i386-#{v}"
|
69
63
|
end
|
@@ -78,7 +72,6 @@ end
|
|
78
72
|
namespace :jruby do
|
79
73
|
spec = Gem::Specification.new do |s|
|
80
74
|
apply_spec_defaults(s)
|
81
|
-
s.add_dependency("method_source",">=0.4.0")
|
82
75
|
s.platform = "java"
|
83
76
|
end
|
84
77
|
|
@@ -88,7 +81,6 @@ namespace :jruby do
|
|
88
81
|
end
|
89
82
|
end
|
90
83
|
|
91
|
-
|
92
84
|
desc "build all platform gems at once"
|
93
85
|
task :gems => [:clean, :rmgems, "ruby:gem", "jruby:gem", "mswin32:gem", "mingw32:gem"]
|
94
86
|
|
@@ -97,7 +89,7 @@ task :rmgems => ["ruby:clobber_package"]
|
|
97
89
|
|
98
90
|
desc "build and push latest gems"
|
99
91
|
task :pushgems => :gems do
|
100
|
-
chdir("#{
|
92
|
+
chdir("#{File.dirname(__FILE__)}/pkg") do
|
101
93
|
Dir["*.gem"].each do |gemfile|
|
102
94
|
sh "gem push #{gemfile}"
|
103
95
|
end
|
data/TODO
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
|
2
|
+
FUTURE
|
3
|
+
* allows pipes (|) for commands
|
4
|
+
|
5
|
+
0.8.0
|
6
|
+
* allow #{} interpolation of all commands
|
7
|
+
* update documentation! new commands and features and change in behaviour of `run`
|
8
|
+
* add ; at end of line to suppress return value output
|
9
|
+
* Remove message spam (before/after hooks)
|
10
|
+
* stop commands returning a value
|
11
|
+
* use `redo` in the r() method when encounter a command
|
12
|
+
* shell functionality should just use system(), but redirect in and
|
13
|
+
out to Pry.input and Pry.output by reassining $stdin and $stdout
|
14
|
+
for duration of block.
|
15
|
+
* basicobject and no to_s/inspect support
|
16
|
+
* fix documentation, support rdoc and yard properly
|
17
|
+
* only load Ripper if 1.9 AND MRI (support jruby 1.9, using
|
18
|
+
RubyParser)
|
19
|
+
* shell commands invokable file .<command>
|
20
|
+
* supercharge cat-file so it can syntax highlight sourcecode files
|
21
|
+
|
22
|
+
|
23
|
+
0.7.0
|
24
|
+
* add pry-doc support with syntax highlighting for docs
|
25
|
+
* add 'mj' option to ls (restrict to singleton methods)
|
26
|
+
* add _ex_ local to hold last exception raised in an exception
|
27
|
+
|
28
|
+
0.6.8
|
29
|
+
* add whereami command, a la the `ir_b` gem
|
30
|
+
* make .pryrc be loaded by run-time pry sessions
|
31
|
+
|
32
|
+
0.6.7
|
33
|
+
* color support
|
34
|
+
* --simple-prompt for pry commandline
|
35
|
+
* -I mode for pry commandline
|
36
|
+
* --color mode for pry commandline
|
37
|
+
* clean up requires (put them all in one place)
|
38
|
+
* simple-prompt command and toggle-color commandd.
|
39
|
+
|
40
|
+
0.6.1
|
41
|
+
* !@ command alias for exit_all
|
42
|
+
* `cd /` for breaking out to pry top level (jump-to 0)
|
43
|
+
* made `-e` option work in a more effective way for `pry` command line invocation
|
44
|
+
* exit and exit-all commands now accept a parameter, this parameter becomes the return value of repl()
|
45
|
+
* `command` method from CommandBase now accepts a :keep_retval arg that determines if command value is returned to pry session or just `nil` (`nil` was old behaviour)
|
46
|
+
* tests for new :keep_retval and exit-all/exit behaviour; :keep_retval will remain undocumented.
|
47
|
+
|
48
|
+
0.5.0 release:
|
49
|
+
* !!!! UPDATE DOCUMENTATION !!!!
|
50
|
+
* Use clipped version of Pry.view() for large objects
|
51
|
+
* Exit Pry session on ^d
|
52
|
+
* Use Shellwords for breaking up parameters to pry commands
|
53
|
+
* Use OptionParser to parse options for default pry commands
|
54
|
+
* Add version command
|
55
|
+
* Refactor 'status' command: add current method info
|
56
|
+
* Add meth_name_from_binding utility lambda to commands.rb
|
57
|
+
* Add -M, -m, -v(erbose), -a(ll), -s(uper), -l(ocals), -i(ivars), -k(klass vars) options to ls
|
58
|
+
* add -i(nstance) option to show-method
|
59
|
+
* add --help option to most commands
|
60
|
+
* Get rid of ls_method and ls_imethods (subsumed by more powerful ls)
|
61
|
+
* Get rid of show_idoc and show_imethod
|
62
|
+
* Add special eval-file command that evals target file in current context
|
data/bin/pry
CHANGED
@@ -3,6 +3,8 @@
|
|
3
3
|
# (C) John Mair (banisterfiend)
|
4
4
|
# MIT license
|
5
5
|
|
6
|
+
$0 = 'pry'
|
7
|
+
|
6
8
|
begin
|
7
9
|
require 'pry'
|
8
10
|
rescue LoadError
|
@@ -48,7 +50,7 @@ end
|
|
48
50
|
# invoked via cli
|
49
51
|
Pry.cli = true
|
50
52
|
|
51
|
-
|
53
|
+
Pry::Commands.instance_eval do
|
52
54
|
command "reset", "Reset the REPL to a clean state." do
|
53
55
|
output.puts "Pry reset."
|
54
56
|
exec("pry")
|
data/lib/pry.rb
CHANGED
@@ -6,6 +6,9 @@ require 'shellwords'
|
|
6
6
|
require "readline"
|
7
7
|
require "stringio"
|
8
8
|
require "coderay"
|
9
|
+
require "optparse"
|
10
|
+
require "slop"
|
11
|
+
require "rubygems/dependency_installer"
|
9
12
|
|
10
13
|
if RUBY_PLATFORM =~ /mswin/ || RUBY_PLATFORM =~ /mingw/
|
11
14
|
begin
|
@@ -19,17 +22,13 @@ end
|
|
19
22
|
require "pry/version"
|
20
23
|
require "pry/hooks"
|
21
24
|
require "pry/print"
|
22
|
-
require "pry/
|
25
|
+
require "pry/helpers"
|
26
|
+
require "pry/command_set"
|
23
27
|
require "pry/commands"
|
28
|
+
require "pry/command_context"
|
24
29
|
require "pry/prompts"
|
25
30
|
require "pry/custom_completions"
|
26
31
|
require "pry/completion"
|
27
32
|
require "pry/core_extensions"
|
28
33
|
require "pry/pry_class"
|
29
34
|
require "pry/pry_instance"
|
30
|
-
|
31
|
-
|
32
|
-
# TEMPORARY HACK FOR BUG IN JRUBY 1.9 REGEX (which kills CodeRay)
|
33
|
-
if RUBY_VERSION =~ /1.9/ && RUBY_ENGINE =~ /jruby/
|
34
|
-
Pry.color = false
|
35
|
-
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class Pry
|
2
|
+
# Command contexts are the objects runing each command.
|
3
|
+
# Helper modules can be mixed into this class.
|
4
|
+
class CommandContext
|
5
|
+
attr_accessor :output
|
6
|
+
attr_accessor :target
|
7
|
+
attr_accessor :opts
|
8
|
+
attr_accessor :command_set
|
9
|
+
attr_accessor :command_processor
|
10
|
+
|
11
|
+
def run(name, *args)
|
12
|
+
if name.start_with? "."
|
13
|
+
cmd = name[1..-1]
|
14
|
+
command_processor.
|
15
|
+
execute_system_command([name, Shellwords.join(args)].join(' '),
|
16
|
+
target)
|
17
|
+
else
|
18
|
+
command_set.run_command(self, name, *args)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def commands
|
23
|
+
command_set.commands
|
24
|
+
end
|
25
|
+
|
26
|
+
include Pry::Helpers::BaseHelpers
|
27
|
+
include Pry::Helpers::CommandHelpers
|
28
|
+
end
|
29
|
+
end
|
@@ -68,7 +68,7 @@ class Pry
|
|
68
68
|
else
|
69
69
|
dest = File.expand_path($1)
|
70
70
|
end
|
71
|
-
|
71
|
+
|
72
72
|
@@cd_history << Dir.pwd
|
73
73
|
Dir.chdir(dest)
|
74
74
|
rescue Errno::ENOENT
|
@@ -119,11 +119,9 @@ class Pry
|
|
119
119
|
return if !pry_command?(val)
|
120
120
|
|
121
121
|
val.replace interpolate_string(val, target)
|
122
|
-
|
122
|
+
command, args_string = command_matched(val)
|
123
123
|
|
124
124
|
args = args_string ? Shellwords.shellwords(args_string) : []
|
125
|
-
action = cmd_data[:action]
|
126
|
-
keep_retval = cmd_data[:keep_retval]
|
127
125
|
|
128
126
|
options = {
|
129
127
|
:val => val,
|
@@ -132,43 +130,32 @@ class Pry
|
|
132
130
|
:commands => commands.commands
|
133
131
|
}
|
134
132
|
|
135
|
-
|
136
|
-
|
137
|
-
# return value of block only if :keep_retval is true
|
138
|
-
ret_value if keep_retval
|
133
|
+
execute_command(target, command.name, options, *args)
|
139
134
|
end
|
140
135
|
|
141
136
|
# Execute a Pry command.
|
142
137
|
# This method should not need to be invoked directly.
|
143
138
|
# @param [Binding] target The target of the Pry session.
|
144
|
-
# @param [
|
139
|
+
# @param [String] command The name of the command to be run.
|
145
140
|
# @param [Hash] options The options to set on the Commands object.
|
146
141
|
# @param [Array] args The command arguments.
|
147
|
-
def execute_command(target,
|
142
|
+
def execute_command(target, command, options, *args)
|
143
|
+
context = CommandContext.new
|
148
144
|
|
149
145
|
# set some useful methods to be used by the action blocks
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
ret_val = commands.instance_exec(*args, &action)
|
159
|
-
when 1, 0
|
160
|
-
|
161
|
-
# ensure that we get the right number of parameters
|
162
|
-
# since 1.8.7 complains about incorrect arity (1.9.2
|
163
|
-
# doesn't care)
|
164
|
-
args_with_corrected_arity = args.values_at *0..(action.arity - 1)
|
165
|
-
ret_val = commands.instance_exec(*args_with_corrected_arity, &action)
|
166
|
-
end
|
146
|
+
context.opts = options
|
147
|
+
context.target = target
|
148
|
+
context.output = output
|
149
|
+
context.command_set = commands
|
150
|
+
|
151
|
+
context.command_processor = self
|
152
|
+
|
153
|
+
ret = commands.run_command(context, command, *args)
|
167
154
|
|
168
155
|
# Tick, tock, im getting rid of this shit soon.
|
169
156
|
options[:val].clear
|
170
157
|
|
171
|
-
|
158
|
+
ret
|
172
159
|
end
|
173
160
|
end
|
174
161
|
end
|
@@ -0,0 +1,234 @@
|
|
1
|
+
class Pry
|
2
|
+
class NoCommandError < StandardError
|
3
|
+
def initialize(name, owner)
|
4
|
+
super "Command '#{name}' not found in command set #{owner}"
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
# This class used to create sets of commands. Commands can be impoted from
|
9
|
+
# different sets, aliased, removed, etc.
|
10
|
+
class CommandSet
|
11
|
+
class Command < Struct.new(:name, :description, :options, :block)
|
12
|
+
|
13
|
+
def call(context, *args)
|
14
|
+
if stub_block = options[:stub_info]
|
15
|
+
context.instance_eval(&stub_block)
|
16
|
+
else
|
17
|
+
ret = context.instance_exec(*correct_arg_arity(block.arity, args), &block)
|
18
|
+
ret if options[:keep_retval]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
def correct_arg_arity(arity, args)
|
24
|
+
case arity <=> 0
|
25
|
+
when -1
|
26
|
+
args
|
27
|
+
when 1, 0
|
28
|
+
# Keep 1.8 happy
|
29
|
+
args.values_at *0..(arity - 1)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
include Pry::Helpers::BaseHelpers
|
35
|
+
|
36
|
+
attr_reader :commands
|
37
|
+
attr_reader :name
|
38
|
+
attr_reader :helper_module
|
39
|
+
|
40
|
+
# @param [Symbol] name Name of the command set
|
41
|
+
# @param [Array<CommandSet>] imported_sets Sets which will be imported
|
42
|
+
# automatically
|
43
|
+
# @yield Optional block run to define commands
|
44
|
+
def initialize(name, *imported_sets, &block)
|
45
|
+
@name = name
|
46
|
+
@commands = {}
|
47
|
+
@helper_module = Module.new
|
48
|
+
|
49
|
+
define_default_commands
|
50
|
+
import(*imported_sets)
|
51
|
+
|
52
|
+
instance_eval(&block) if block
|
53
|
+
end
|
54
|
+
|
55
|
+
# Defines a new Pry command.
|
56
|
+
# @param [String, Array] names The name of the command (or array of
|
57
|
+
# command name aliases).
|
58
|
+
# @param [String] description A description of the command.
|
59
|
+
# @param [Hash] options The optional configuration parameters.
|
60
|
+
# @option options [Boolean] :keep_retval Whether or not to use return value
|
61
|
+
# of the block for return of `command` or just to return `nil`
|
62
|
+
# (the default).
|
63
|
+
# @yield The action to perform. The parameters in the block
|
64
|
+
# determines the parameters the command will receive. All
|
65
|
+
# parameters passed into the block will be strings. Successive
|
66
|
+
# command parameters are separated by whitespace at the Pry prompt.
|
67
|
+
# @example
|
68
|
+
# MyCommands = Pry::CommandSet.new :mine do
|
69
|
+
# command "greet", "Greet somebody" do |name|
|
70
|
+
# puts "Good afternoon #{name.capitalize}!"
|
71
|
+
# end
|
72
|
+
# end
|
73
|
+
#
|
74
|
+
# # From pry:
|
75
|
+
# # pry(main)> _pry_.commands = MyCommands
|
76
|
+
# # pry(main)> greet john
|
77
|
+
# # Good afternoon John!
|
78
|
+
# # pry(main)> help greet
|
79
|
+
# # Greet somebody
|
80
|
+
def command(names, description="No description.", options={}, &block)
|
81
|
+
first_name = Array(names).first
|
82
|
+
|
83
|
+
options = {:requires_gem => []}.merge(options)
|
84
|
+
|
85
|
+
unless command_dependencies_met? options
|
86
|
+
gems_needed = Array(options[:requires_gem])
|
87
|
+
gems_not_installed = gems_needed.select { |g| !gem_installed?(g) }
|
88
|
+
|
89
|
+
options[:stub_info] = proc do
|
90
|
+
output.puts "\n#{first_name} requires the following gems to be installed: #{(gems_needed.join(", "))}"
|
91
|
+
output.puts "Command not available due to dependency on gems: `#{gems_not_installed.join(", ")}` not being met."
|
92
|
+
output.puts "Type `install #{first_name}` to install the required gems and activate this command."
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
Array(names).each do |name|
|
97
|
+
commands[name] = Command.new(name, description, options, block)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# Removes some commands from the set
|
102
|
+
# @param [Array<String>] names name of the commands to remove
|
103
|
+
def delete(*names)
|
104
|
+
names.each { |name| commands.delete name }
|
105
|
+
end
|
106
|
+
|
107
|
+
# Imports all the commands from one or more sets.
|
108
|
+
# @param [Array<CommandSet>] sets Command sets, all of the commands of which
|
109
|
+
# will be imported.
|
110
|
+
def import(*sets)
|
111
|
+
sets.each do |set|
|
112
|
+
commands.merge! set.commands
|
113
|
+
helper_module.send :include, set.helper_module
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
# Imports some commands from a set
|
118
|
+
# @param [CommandSet] set Set to import commands from
|
119
|
+
# @param [Array<String>] names Commands to import
|
120
|
+
def import_from(set, *names)
|
121
|
+
helper_module.send :include, set.helper_module
|
122
|
+
names.each { |name| commands[name] = set.commands[name] }
|
123
|
+
end
|
124
|
+
|
125
|
+
# Aliases a command
|
126
|
+
# @param [String] new_name New name of the command.
|
127
|
+
# @param [String] old_name Old name of the command.
|
128
|
+
# @pasam [String, nil] desc New description of the command.
|
129
|
+
def alias_command(new_name, old_name, desc = nil)
|
130
|
+
commands[new_name] = commands[old_name].dup
|
131
|
+
commands[new_name].name = new_name
|
132
|
+
commands[new_name].description = desc if desc
|
133
|
+
end
|
134
|
+
|
135
|
+
# Runs a command.
|
136
|
+
# @param [Object] context Object which will be used as self during the
|
137
|
+
# command.
|
138
|
+
# @param [String] name Name of the command to be run
|
139
|
+
# @param [Array<Object>] args Arguments passed to the command
|
140
|
+
# @raise [NoCommandError] If the command is not defined in this set
|
141
|
+
def run_command(context, name, *args)
|
142
|
+
context.extend helper_module
|
143
|
+
|
144
|
+
if command = commands[name]
|
145
|
+
command.call(context, *args)
|
146
|
+
else
|
147
|
+
raise NoCommandError.new(name, self)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
# Sets the description for a command (replacing the old
|
152
|
+
# description.)
|
153
|
+
# @param [String] name The command name.
|
154
|
+
# @param [String] description The command description.
|
155
|
+
# @example
|
156
|
+
# MyCommands = Pry::CommandSet.new :test do
|
157
|
+
# desc "help", "help description"
|
158
|
+
# end
|
159
|
+
def desc(name, description)
|
160
|
+
commands[name].description = description
|
161
|
+
end
|
162
|
+
|
163
|
+
# Defines helpers methods for this command sets.
|
164
|
+
# Those helpers are only defined in this command set.
|
165
|
+
#
|
166
|
+
# @yield A block defining helper methods
|
167
|
+
# @example
|
168
|
+
# helpers do
|
169
|
+
# def hello
|
170
|
+
# puts "Hello!"
|
171
|
+
# end
|
172
|
+
#
|
173
|
+
# include OtherModule
|
174
|
+
# end
|
175
|
+
def helpers(&block)
|
176
|
+
helper_module.class_eval(&block)
|
177
|
+
end
|
178
|
+
|
179
|
+
private
|
180
|
+
def define_default_commands
|
181
|
+
command "help", "This menu." do |cmd|
|
182
|
+
if !cmd
|
183
|
+
output.puts
|
184
|
+
help_text = heading("Command List: ") + "\n"
|
185
|
+
|
186
|
+
commands.each do |key, command|
|
187
|
+
if command.description && !command.description.empty?
|
188
|
+
help_text << "#{key}".ljust(18) + command.description + "\n"
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
stagger_output(help_text)
|
193
|
+
else
|
194
|
+
if command = commands[cmd]
|
195
|
+
output.puts command.description
|
196
|
+
else
|
197
|
+
output.puts "No info for command: #{cmd}"
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
command "install", "Install a disabled command." do |name|
|
203
|
+
stub_info = commands[name].options[:stub_info]
|
204
|
+
|
205
|
+
if !stub_info
|
206
|
+
output.puts "Not a command stub. Nothing to do."
|
207
|
+
next
|
208
|
+
end
|
209
|
+
|
210
|
+
output.puts "Attempting to install `#{name}` command..."
|
211
|
+
gems_to_install = Array(commands[name].options[:requires_gem])
|
212
|
+
|
213
|
+
gem_install_failed = false
|
214
|
+
gems_to_install.each do |g|
|
215
|
+
next if gem_installed?(g)
|
216
|
+
output.puts "Installing `#{g}` gem..."
|
217
|
+
|
218
|
+
begin
|
219
|
+
Gem::DependencyInstaller.new.install(g)
|
220
|
+
rescue Gem::GemNotFoundException
|
221
|
+
output.puts "Required Gem: `#{g}` not found. Aborting command installation."
|
222
|
+
gem_install_failed = true
|
223
|
+
next
|
224
|
+
end
|
225
|
+
end
|
226
|
+
next if gem_install_failed
|
227
|
+
|
228
|
+
Gem.refresh
|
229
|
+
commands[name].options.delete :stub_info
|
230
|
+
output.puts "Installation of `#{name}` successful! Type `help #{name}` for information"
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|
234
|
+
end
|