pry 0.9.0pre3 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +25 -6
- data/README.markdown +10 -3
- data/Rakefile +6 -17
- data/bin/pry +11 -0
- data/lib/pry.rb +3 -7
- data/lib/pry/command_processor.rb +19 -7
- data/lib/pry/commands.rb +0 -3
- data/lib/pry/config.rb +7 -3
- data/lib/pry/default_commands/context.rb +1 -0
- data/lib/pry/default_commands/documentation.rb +32 -14
- data/lib/pry/default_commands/input.rb +186 -54
- data/lib/pry/default_commands/introspection.rb +59 -13
- data/lib/pry/default_commands/ls.rb +21 -7
- data/lib/pry/extended_commands/experimental.rb +0 -31
- data/lib/pry/extended_commands/user_command_api.rb +1 -1
- data/lib/pry/helpers/base_helpers.rb +9 -1
- data/lib/pry/plugins.rb +4 -4
- data/lib/pry/pry_class.rb +4 -3
- data/lib/pry/pry_instance.rb +11 -4
- data/lib/pry/version.rb +1 -1
- data/pry.gemspec +45 -0
- data/test/helper.rb +2 -2
- data/test/test_command_processor.rb +73 -1
- data/test/test_default_commands/test_input.rb +172 -2
- data/test/test_default_commands/test_introspection.rb +9 -0
- data/test/test_pry.rb +26 -0
- metadata +8 -7
@@ -12,6 +12,8 @@ class Pry
|
|
12
12
|
"e.g: show-method hello_method"
|
13
13
|
|
14
14
|
opt.on :l, "line-numbers", "Show line numbers."
|
15
|
+
opt.on :b, "base-one", "Show line numbers but start numbering at 1 (useful for `amend-line` and `play` commands)."
|
16
|
+
|
15
17
|
opt.on :M, "instance-methods", "Operate on instance methods."
|
16
18
|
opt.on :m, :methods, "Operate on methods."
|
17
19
|
opt.on :f, :flood, "Do not use a pager to view text longer than one screen."
|
@@ -44,6 +46,9 @@ class Pry
|
|
44
46
|
start_line = meth.source_location ? meth.source_location.last : 1
|
45
47
|
end
|
46
48
|
|
49
|
+
start_line = opts.b? ? 1 : start_line
|
50
|
+
|
51
|
+
|
47
52
|
render_output(opts.flood?, start_line, code)
|
48
53
|
code
|
49
54
|
end
|
@@ -98,6 +103,39 @@ class Pry
|
|
98
103
|
end
|
99
104
|
end
|
100
105
|
|
106
|
+
command "edit", "Invoke the default editor on a file. Type `edit --help` for more info" do |*args|
|
107
|
+
opts = Slop.parse!(args) do |opt|
|
108
|
+
opt.banner "Usage: edit [OPTIONS] [FILE]\n" \
|
109
|
+
"Edit the method FILE in an editor.\n" \
|
110
|
+
"Ensure #{text.bold("Pry.editor")} is set to your editor of choice.\n" \
|
111
|
+
"e.g: edit sample.rb"
|
112
|
+
|
113
|
+
opt.on :r, "reload", "Eval file content after editing (using `load`)"
|
114
|
+
opt.on :p, "play", "Use the pry `play` command to eval the file content after editing (instead of the `load` method)."
|
115
|
+
opt.on :l, "line", "Specify line number to jump to in file", true, :as => Integer
|
116
|
+
opt.on :h, :help, "This message." do
|
117
|
+
output.puts opt
|
118
|
+
end
|
119
|
+
end
|
120
|
+
next if opts.h?
|
121
|
+
|
122
|
+
next output.puts("Need to specify a file.") if !args.first
|
123
|
+
file_name = File.expand_path(args.first)
|
124
|
+
|
125
|
+
invoke_editor(file_name, opts[:l].to_i)
|
126
|
+
set_file_and_dir_locals(file_name)
|
127
|
+
|
128
|
+
if opts[:r]
|
129
|
+
silence_warnings do
|
130
|
+
load file_name
|
131
|
+
end
|
132
|
+
elsif opts[:p]
|
133
|
+
silence_warnings do
|
134
|
+
Pry.active_instance.input = StringIO.new(File.readlines(file_name).join)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
101
139
|
command "edit-method", "Edit a method. Type `edit-method --help` for more info." do |*args|
|
102
140
|
target = target()
|
103
141
|
|
@@ -139,34 +177,42 @@ class Pry
|
|
139
177
|
file, line = path_line_for(meth)
|
140
178
|
set_file_and_dir_locals(file)
|
141
179
|
|
180
|
+
invoke_editor(file, opts["no-jump"] ? 0 : line)
|
181
|
+
silence_warnings do
|
182
|
+
load file if !opts.n?
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
helpers do
|
188
|
+
|
189
|
+
def invoke_editor(file, line)
|
142
190
|
if Pry.editor.respond_to?(:call)
|
143
191
|
editor_invocation = Pry.editor.call(file, line)
|
144
192
|
else
|
145
|
-
|
146
|
-
start_line_syntax = opts["no-jump"] ? "" : start_line_for_editor(line)
|
147
|
-
editor_invocation = "#{Pry.editor} #{start_line_syntax} #{file}"
|
193
|
+
editor_invocation = "#{Pry.editor} #{start_line_syntax_for_editor(file, line)}"
|
148
194
|
end
|
149
195
|
|
150
196
|
run ".#{editor_invocation}"
|
151
|
-
silence_warnings do
|
152
|
-
load file if !opts.n?
|
153
|
-
end
|
154
197
|
end
|
155
|
-
end
|
156
198
|
|
157
|
-
|
199
|
+
def start_line_syntax_for_editor(file_name, line_number)
|
200
|
+
file_name.gsub!(/\//, '\\') if RUBY_PLATFORM =~ /mswin|mingw/
|
158
201
|
|
159
|
-
def start_line_for_editor(line_number)
|
160
202
|
case Pry.editor
|
161
203
|
when /^[gm]?vi/, /^emacs/, /^nano/, /^pico/, /^gedit/, /^kate/
|
162
|
-
"+#{line_number}"
|
204
|
+
"+#{line_number} #{file_name}"
|
163
205
|
when /^mate/, /^geany/
|
164
|
-
"-l #{line_number}"
|
206
|
+
"-l #{line_number} #{file_name}"
|
207
|
+
when /^uedit32/
|
208
|
+
"#{file_name}/#{line_number}"
|
209
|
+
when /^jedit/
|
210
|
+
"#{file_name} +#{line_number}"
|
165
211
|
else
|
166
212
|
if RUBY_PLATFORM =~ /mswin|mingw/
|
167
|
-
""
|
213
|
+
"#{file_name}"
|
168
214
|
else
|
169
|
-
"+#{line_number}"
|
215
|
+
"+#{line_number} #{file_name}"
|
170
216
|
end
|
171
217
|
end
|
172
218
|
end
|
@@ -3,6 +3,16 @@ class Pry
|
|
3
3
|
|
4
4
|
Ls = Pry::CommandSet.new do
|
5
5
|
|
6
|
+
helpers do
|
7
|
+
def trim_methods(options, visibility)
|
8
|
+
if options[:e]
|
9
|
+
[]
|
10
|
+
else
|
11
|
+
Object.send("#{visibility}_methods")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
6
16
|
command "ls", "Show the list of vars and methods in the current scope. Type `ls --help` for more info." do |*args|
|
7
17
|
options = {}
|
8
18
|
# Set target local to the default -- note that we can set a different target for
|
@@ -59,10 +69,14 @@ Shows local and instance variables by default.
|
|
59
69
|
options[:j] = true
|
60
70
|
end
|
61
71
|
|
62
|
-
opts.on("-s", "--super", "Include superclass entries (relevant to constant and methods options).") do
|
72
|
+
opts.on("-s", "--super", "Include superclass entries excluding Object (relevant to constant and methods options).") do
|
63
73
|
options[:s] = true
|
64
74
|
end
|
65
75
|
|
76
|
+
opts.on("-e", "--everything", "Include superclass entries including Object (relevant to constant and methods options).") do
|
77
|
+
options[:e] = true
|
78
|
+
end
|
79
|
+
|
66
80
|
opts.on("-a", "--all", "Display all types of entries.") do
|
67
81
|
options[:a] = true
|
68
82
|
end
|
@@ -126,19 +140,19 @@ Shows local and instance variables by default.
|
|
126
140
|
|
127
141
|
info["global variables"] = [Array(target.eval("global_variables")).sort, i += 1] if options[:g] || options[:a]
|
128
142
|
|
129
|
-
info["public methods"] = [Array(target.eval("public_methods(#{options[:s]})")).uniq.sort, i += 1] if (options[:m] && options[:P]) || options[:a]
|
143
|
+
info["public methods"] = [Array(target.eval("public_methods(#{options[:s]})")).uniq.sort - trim_methods(options, :public), i += 1] if (options[:m] && options[:P]) || options[:a]
|
130
144
|
|
131
|
-
info["protected methods"] = [Array(target.eval("protected_methods(#{options[:s]})")).sort, i += 1] if (options[:m] && options[:r]) || options[:a]
|
145
|
+
info["protected methods"] = [Array(target.eval("protected_methods(#{options[:s]})")).sort - trim_methods(options, :protected), i += 1] if (options[:m] && options[:r]) || options[:a]
|
132
146
|
|
133
|
-
info["private methods"] = [Array(target.eval("private_methods(#{options[:s]})")).sort, i += 1] if (options[:m] && options[:p]) || options[:a]
|
147
|
+
info["private methods"] = [Array(target.eval("private_methods(#{options[:s]})")).sort - trim_methods(options, :private), i += 1] if (options[:m] && options[:p]) || options[:a]
|
134
148
|
|
135
149
|
info["just singleton methods"] = [Array(target.eval("methods(#{options[:s]})")).sort, i += 1] if (options[:m] && options[:j]) || options[:a]
|
136
150
|
|
137
|
-
info["public instance methods"] = [Array(target.eval("public_instance_methods(#{options[:s]})")).uniq.sort, i += 1] if target_self.is_a?(Module) && ((options[:M] && options[:P]) || options[:a])
|
151
|
+
info["public instance methods"] = [Array(target.eval("public_instance_methods(#{options[:s]})")).uniq.sort - trim_methods(options, :public), i += 1] if target_self.is_a?(Module) && ((options[:M] && options[:P]) || options[:a])
|
138
152
|
|
139
|
-
info["protected instance methods"] = [Array(target.eval("protected_instance_methods(#{options[:s]})")).uniq.sort, i += 1] if target_self.is_a?(Module) && ((options[:M] && options[:r]) || options[:a])
|
153
|
+
info["protected instance methods"] = [Array(target.eval("protected_instance_methods(#{options[:s]})")).uniq.sort - trim_methods(options, :protected), i += 1] if target_self.is_a?(Module) && ((options[:M] && options[:r]) || options[:a])
|
140
154
|
|
141
|
-
info["private instance methods"] = [Array(target.eval("private_instance_methods(#{options[:s]})")).uniq.sort, i += 1] if target_self.is_a?(Module) && ((options[:M] && options[:p]) || options[:a])
|
155
|
+
info["private instance methods"] = [Array(target.eval("private_instance_methods(#{options[:s]})")).uniq.sort - trim_methods(options, :private), i += 1] if target_self.is_a?(Module) && ((options[:M] && options[:p]) || options[:a])
|
142
156
|
|
143
157
|
# dealing with 1.8/1.9 compatibility issues :/
|
144
158
|
csuper = options[:s]
|
@@ -3,7 +3,6 @@ class Pry
|
|
3
3
|
|
4
4
|
Experimental = Pry::CommandSet.new do
|
5
5
|
|
6
|
-
|
7
6
|
command "reload-method", "Reload the source specifically for a method", :requires_gem => "method_reload" do |meth_name|
|
8
7
|
if (meth = get_method_object(meth_name, target, {})).nil?
|
9
8
|
output.puts "Invalid method name: #{meth_name}."
|
@@ -13,36 +12,6 @@ class Pry
|
|
13
12
|
meth.reload
|
14
13
|
end
|
15
14
|
|
16
|
-
command "play", "Play a string as input" do |*args|
|
17
|
-
Slop.parse!(args) do |opt|
|
18
|
-
opt.banner "Usage: play-method [--replay START..END] [--clear] [--grep PATTERN] [--help]\n"
|
19
|
-
|
20
|
-
opt.on :l, :lines, 'The line (or range of lines) to replay.', true, :as => Range
|
21
|
-
opt.on :m, :method, 'Play a method.', true do |meth_name|
|
22
|
-
if (meth = get_method_object(meth_name, target, {})).nil?
|
23
|
-
output.puts "Invalid method name: #{meth_name}."
|
24
|
-
next
|
25
|
-
end
|
26
|
-
code, code_type = code_and_code_type_for(meth)
|
27
|
-
next if !code
|
28
|
-
|
29
|
-
range = opt.l? ? opt[:l] : (0..-1)
|
30
|
-
|
31
|
-
Pry.active_instance.input = StringIO.new(code[range])
|
32
|
-
end
|
33
|
-
|
34
|
-
opt.on :f, "file", 'The line (or range of lines) to replay.', true do |file_name|
|
35
|
-
text = File.read File.expand_path(file_name)
|
36
|
-
range = opt.l? ? opt[:l] : (0..-1)
|
37
|
-
|
38
|
-
Pry.active_instance.input = StringIO.new(text[range])
|
39
|
-
end
|
40
|
-
|
41
|
-
opt.on :h, :help, "This message." do
|
42
|
-
output.puts opt
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
15
|
end
|
47
16
|
end
|
48
17
|
end
|
@@ -3,7 +3,7 @@ class Pry
|
|
3
3
|
|
4
4
|
UserCommandAPI = Pry::CommandSet.new do
|
5
5
|
|
6
|
-
command "define-command", "
|
6
|
+
command "define-command", "Define a command in the session, use same syntax as `command` method for command API" do |arg|
|
7
7
|
next output.puts("Provide an arg!") if arg.nil?
|
8
8
|
|
9
9
|
prime_string = "command #{arg_string}\n"
|
@@ -63,6 +63,14 @@ class Pry
|
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
66
|
+
def colorize_code(code)
|
67
|
+
if Pry.color
|
68
|
+
CodeRay.scan(code, :ruby).term
|
69
|
+
else
|
70
|
+
code
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
66
74
|
def highlight(string, regexp, highlight_color=:bright_yellow)
|
67
75
|
highlighted = string.gsub(regexp) { |match| "<#{highlight_color}>#{match}</#{highlight_color}>" }
|
68
76
|
end
|
@@ -93,7 +101,7 @@ class Pry
|
|
93
101
|
# Try to use `less` for paging, if it fails then use
|
94
102
|
# simple_pager. Also do not page if Pry.pager is falsey
|
95
103
|
# FIXME! Another JRuby hack
|
96
|
-
def stagger_output(text)
|
104
|
+
def stagger_output(text, output=output())
|
97
105
|
if text.lines.count < page_size || !Pry.pager
|
98
106
|
output.puts text
|
99
107
|
return
|
data/lib/pry/plugins.rb
CHANGED
@@ -6,10 +6,10 @@ class Pry
|
|
6
6
|
MessageSink = Object.new.tap { |o| def o.method_missing(*args) end }
|
7
7
|
|
8
8
|
class Plugin
|
9
|
-
attr_accessor :name, :gem_name, :enabled, :active
|
9
|
+
attr_accessor :name, :gem_name, :enabled, :spec, :active
|
10
10
|
|
11
|
-
def initialize(name, gem_name, enabled)
|
12
|
-
@name, @gem_name, @enabled = name, gem_name, enabled
|
11
|
+
def initialize(name, gem_name, spec, enabled)
|
12
|
+
@name, @gem_name, @enabled, @spec = name, gem_name, enabled, spec
|
13
13
|
end
|
14
14
|
|
15
15
|
# Disable a plugin.
|
@@ -47,7 +47,7 @@ class Pry
|
|
47
47
|
(Gem::Specification.respond_to?(:each) ? Gem::Specification : Gem.source_index.find_name('')).each do |gem|
|
48
48
|
next if gem.name !~ PRY_PLUGIN_PREFIX
|
49
49
|
plugin_name = gem.name.split('-', 2).last
|
50
|
-
@plugins << Plugin.new(plugin_name, gem.name, true) if !gem_located?(gem.name)
|
50
|
+
@plugins << Plugin.new(plugin_name, gem.name, gem, true) if !gem_located?(gem.name)
|
51
51
|
end
|
52
52
|
@plugins
|
53
53
|
end
|
data/lib/pry/pry_class.rb
CHANGED
@@ -97,7 +97,7 @@ class Pry
|
|
97
97
|
# multiple times per each new session (i.e in debugging)
|
98
98
|
load_rc if Pry.config.should_load_rc
|
99
99
|
load_plugins if Pry.config.plugins.enabled
|
100
|
-
load_history if Pry.config.history.
|
100
|
+
load_history if Pry.config.history.should_load
|
101
101
|
|
102
102
|
@initial_session = false
|
103
103
|
end
|
@@ -196,11 +196,12 @@ class Pry
|
|
196
196
|
config.plugins.strict_loading = true
|
197
197
|
|
198
198
|
config.history ||= OpenStruct.new
|
199
|
-
config.history.
|
200
|
-
config.history.
|
199
|
+
config.history.should_save = true
|
200
|
+
config.history.should_load = true
|
201
201
|
config.history.file = File.expand_path("~/.pry_history")
|
202
202
|
|
203
203
|
config.memory_size = 100
|
204
|
+
config.results_pager = true
|
204
205
|
end
|
205
206
|
|
206
207
|
# Set all the configurable options back to their default values
|
data/lib/pry/pry_instance.rb
CHANGED
@@ -149,7 +149,7 @@ class Pry
|
|
149
149
|
throw :breakout, break_data
|
150
150
|
end
|
151
151
|
|
152
|
-
save_history if Pry.config.history.
|
152
|
+
save_history if Pry.config.history.should_save && finished_top_level_session?
|
153
153
|
|
154
154
|
return_value
|
155
155
|
end
|
@@ -302,15 +302,15 @@ class Pry
|
|
302
302
|
# This method should not need to be invoked directly.
|
303
303
|
# @param [String] val The line to process.
|
304
304
|
# @param [String] eval_string The cumulative lines of input.
|
305
|
-
# @
|
305
|
+
# @param [Binding] target The target of the Pry session.
|
306
306
|
def process_line(val, eval_string, target)
|
307
|
-
val.rstrip!
|
308
307
|
Pry.cmd_ret_value = @command_processor.process_commands(val, eval_string, target)
|
309
308
|
|
310
309
|
if Pry.cmd_ret_value
|
311
310
|
eval_string << "Pry.cmd_ret_value\n"
|
312
311
|
else
|
313
|
-
|
312
|
+
# only commands (with no ret_value) should have an empty `val` so this ignores their result
|
313
|
+
eval_string << "#{val.rstrip}\n" if !val.empty?
|
314
314
|
end
|
315
315
|
end
|
316
316
|
|
@@ -329,6 +329,13 @@ class Pry
|
|
329
329
|
# @param [Exception] ex The exception.
|
330
330
|
# @param [Binding] target The binding to set `_ex_` on.
|
331
331
|
def set_last_exception(ex, target)
|
332
|
+
class << ex
|
333
|
+
attr_accessor :file, :line
|
334
|
+
end
|
335
|
+
|
336
|
+
ex.backtrace.first =~ /(.*):(\d+)/
|
337
|
+
ex.file, ex.line = $1, $2.to_i
|
338
|
+
|
332
339
|
Pry.last_exception = ex
|
333
340
|
target.eval("_ex_ = ::Pry.last_exception")
|
334
341
|
end
|
data/lib/pry/version.rb
CHANGED
data/pry.gemspec
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.unshift File.expand_path('../lib', __FILE__)
|
3
|
+
require 'pry/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = %q{pry}
|
7
|
+
s.version = Pry::VERSION
|
8
|
+
|
9
|
+
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
|
10
|
+
s.authors = [%q{John Mair (banisterfiend)}]
|
11
|
+
s.description = %q{an IRB alternative and runtime developer console}
|
12
|
+
s.email = %q{jrmair@gmail.com}
|
13
|
+
s.executables = [%q{pry}]
|
14
|
+
s.files = [%q{.document}, %q{.gemtest}, %q{.gitignore}, %q{.yardopts}, %q{CHANGELOG}, %q{LICENSE}, %q{README.markdown}, %q{Rakefile}, %q{TODO}, %q{bin/pry}, %q{examples/example_basic.rb}, %q{examples/example_command_override.rb}, %q{examples/example_commands.rb}, %q{examples/example_hooks.rb}, %q{examples/example_image_edit.rb}, %q{examples/example_input.rb}, %q{examples/example_input2.rb}, %q{examples/example_output.rb}, %q{examples/example_print.rb}, %q{examples/example_prompt.rb}, %q{examples/helper.rb}, %q{lib/pry.rb}, %q{lib/pry/command_context.rb}, %q{lib/pry/command_processor.rb}, %q{lib/pry/command_set.rb}, %q{lib/pry/commands.rb}, %q{lib/pry/completion.rb}, %q{lib/pry/config.rb}, %q{lib/pry/core_extensions.rb}, %q{lib/pry/custom_completions.rb}, %q{lib/pry/default_commands/basic.rb}, %q{lib/pry/default_commands/context.rb}, %q{lib/pry/default_commands/documentation.rb}, %q{lib/pry/default_commands/easter_eggs.rb}, %q{lib/pry/default_commands/gems.rb}, %q{lib/pry/default_commands/input.rb}, %q{lib/pry/default_commands/introspection.rb}, %q{lib/pry/default_commands/ls.rb}, %q{lib/pry/default_commands/shell.rb}, %q{lib/pry/extended_commands/experimental.rb}, %q{lib/pry/extended_commands/user_command_api.rb}, %q{lib/pry/helpers.rb}, %q{lib/pry/helpers/base_helpers.rb}, %q{lib/pry/helpers/command_helpers.rb}, %q{lib/pry/helpers/text.rb}, %q{lib/pry/history_array.rb}, %q{lib/pry/plugins.rb}, %q{lib/pry/pry_class.rb}, %q{lib/pry/pry_instance.rb}, %q{lib/pry/version.rb}, %q{pry.gemspec}, %q{test/helper.rb}, %q{test/test_command_helpers.rb}, %q{test/test_command_processor.rb}, %q{test/test_command_set.rb}, %q{test/test_default_commands.rb}, %q{test/test_default_commands/test_context.rb}, %q{test/test_default_commands/test_documentation.rb}, %q{test/test_default_commands/test_gems.rb}, %q{test/test_default_commands/test_input.rb}, %q{test/test_default_commands/test_introspection.rb}, %q{test/test_history_array.rb}, %q{test/test_pry.rb}, %q{test/testrc}, %q{wiki/Customizing-pry.md}, %q{wiki/Home.md}]
|
15
|
+
s.homepage = %q{http://banisterfiend.wordpress.com}
|
16
|
+
s.summary = %q{an IRB alternative and runtime developer console}
|
17
|
+
s.test_files = [%q{test/helper.rb}, %q{test/test_command_helpers.rb}, %q{test/test_command_processor.rb}, %q{test/test_command_set.rb}, %q{test/test_default_commands.rb}, %q{test/test_default_commands/test_context.rb}, %q{test/test_default_commands/test_documentation.rb}, %q{test/test_default_commands/test_gems.rb}, %q{test/test_default_commands/test_input.rb}, %q{test/test_default_commands/test_introspection.rb}, %q{test/test_history_array.rb}, %q{test/test_pry.rb}, %q{test/testrc}]
|
18
|
+
|
19
|
+
if s.respond_to? :specification_version then
|
20
|
+
s.specification_version = 3
|
21
|
+
|
22
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
23
|
+
s.add_runtime_dependency(%q<ruby_parser>, [">= 2.0.5"])
|
24
|
+
s.add_runtime_dependency(%q<coderay>, [">= 0.9.8"])
|
25
|
+
s.add_runtime_dependency(%q<slop>, ["~> 1.7.0"])
|
26
|
+
s.add_runtime_dependency(%q<method_source>, [">= 0.4.0"])
|
27
|
+
s.add_development_dependency(%q<bacon>, [">= 1.1.0"])
|
28
|
+
s.add_development_dependency(%q<open4>, ["~> 1.0.1"])
|
29
|
+
else
|
30
|
+
s.add_dependency(%q<ruby_parser>, [">= 2.0.5"])
|
31
|
+
s.add_dependency(%q<coderay>, [">= 0.9.8"])
|
32
|
+
s.add_dependency(%q<slop>, ["~> 1.7.0"])
|
33
|
+
s.add_dependency(%q<method_source>, [">= 0.4.0"])
|
34
|
+
s.add_dependency(%q<bacon>, [">= 1.1.0"])
|
35
|
+
s.add_dependency(%q<open4>, ["~> 1.0.1"])
|
36
|
+
end
|
37
|
+
else
|
38
|
+
s.add_dependency(%q<ruby_parser>, [">= 2.0.5"])
|
39
|
+
s.add_dependency(%q<coderay>, [">= 0.9.8"])
|
40
|
+
s.add_dependency(%q<slop>, ["~> 1.7.0"])
|
41
|
+
s.add_dependency(%q<method_source>, [">= 0.4.0"])
|
42
|
+
s.add_dependency(%q<bacon>, [">= 1.1.0"])
|
43
|
+
s.add_dependency(%q<open4>, ["~> 1.0.1"])
|
44
|
+
end
|
45
|
+
end
|
data/test/helper.rb
CHANGED
@@ -20,8 +20,8 @@ class << Pry
|
|
20
20
|
Pry.pager = false
|
21
21
|
Pry.config.should_load_rc = false
|
22
22
|
Pry.config.plugins.enabled = false
|
23
|
-
Pry.config.history.
|
24
|
-
Pry.config.history.
|
23
|
+
Pry.config.history.should_load = false
|
24
|
+
Pry.config.history.should_save = false
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
@@ -19,8 +19,17 @@ describe "Pry::CommandProcessor" do
|
|
19
19
|
valid = @command_processor.valid_command? "blah"
|
20
20
|
valid.should == false
|
21
21
|
|
22
|
+
|
22
23
|
a = "test-command"
|
23
|
-
|
24
|
+
|
25
|
+
# not passing in a binding so 'a' shouldn't exist and no command
|
26
|
+
# will be matched
|
27
|
+
valid = @command_processor.valid_command?('#{a}')
|
28
|
+
valid.should == false
|
29
|
+
|
30
|
+
# passing in the optional binding (against which interpolation is performed)
|
31
|
+
valid = @command_processor.valid_command? '#{a}', binding
|
32
|
+
valid.should == true
|
24
33
|
end
|
25
34
|
|
26
35
|
it 'should correctly match a simple string command' do
|
@@ -119,6 +128,59 @@ describe "Pry::CommandProcessor" do
|
|
119
128
|
pos.should == command.name.length
|
120
129
|
end
|
121
130
|
|
131
|
+
it 'should correctly match a regex command and interpolation should not break the regex' do
|
132
|
+
regex_command_name = /blah(\d)/
|
133
|
+
@pry.commands.command(regex_command_name) {}
|
134
|
+
|
135
|
+
sample_text = "blah5"
|
136
|
+
a = "5"
|
137
|
+
command, captures, pos = @command_processor.command_matched 'blah#{a}', binding
|
138
|
+
|
139
|
+
command.name.should == regex_command_name
|
140
|
+
captures.should == ["5"]
|
141
|
+
pos.should == sample_text.size
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'should NOT match a regex command that is interpolated when :interpolate => false' do
|
145
|
+
regex_command_name = /blah(\d)/
|
146
|
+
@pry.commands.command(regex_command_name, "", :interpolate => false) {}
|
147
|
+
|
148
|
+
sample_text = "blah5"
|
149
|
+
a = "5"
|
150
|
+
command, captures, pos = @command_processor.command_matched 'blah#{a}', binding
|
151
|
+
|
152
|
+
command.should == nil
|
153
|
+
end
|
154
|
+
|
155
|
+
it 'should correctly match a regex command and interpolation should not break the regex where entire regex command is interpolated' do
|
156
|
+
regex_command_name = /blah(\d)/
|
157
|
+
@pry.commands.command(regex_command_name) {}
|
158
|
+
|
159
|
+
sample_text = "blah5"
|
160
|
+
a = "bl"
|
161
|
+
b = "ah"
|
162
|
+
c = "5"
|
163
|
+
|
164
|
+
command, captures, pos = @command_processor.command_matched '#{a}#{b}#{c}', binding
|
165
|
+
|
166
|
+
command.name.should == regex_command_name
|
167
|
+
captures.should == ["5"]
|
168
|
+
pos.should == sample_text.size
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'should NOT match a regex command where entire regex command is interpolated and :interpolate => false' do
|
172
|
+
regex_command_name = /blah(\d)/
|
173
|
+
@pry.commands.command(regex_command_name, "", :interpolate => false) {}
|
174
|
+
|
175
|
+
sample_text = "blah5"
|
176
|
+
a = "bl"
|
177
|
+
b = "ah"
|
178
|
+
c = "5"
|
179
|
+
|
180
|
+
command, captures, pos = @command_processor.command_matched '#{a}#{b}#{c}', binding
|
181
|
+
command.should == nil
|
182
|
+
end
|
183
|
+
|
122
184
|
it 'should NOT match a command whose name is interpolated when :interpolate => false' do
|
123
185
|
@pry.commands.command("boast", "", :interpolate => false) {}
|
124
186
|
a = "boa"
|
@@ -130,4 +192,14 @@ describe "Pry::CommandProcessor" do
|
|
130
192
|
|
131
193
|
command.should == nil
|
132
194
|
end
|
195
|
+
|
196
|
+
|
197
|
+
it 'commands that have :interpolate => false should not be interpolated (interpolate_string should *not* be called)' do
|
198
|
+
@pry.commands.command("boast", "", :interpolate => false) {}
|
199
|
+
|
200
|
+
# remember to use '' instead of "" when testing interpolation or
|
201
|
+
# you'll cause yourself incredible confusion
|
202
|
+
lambda { @command_processor.command_matched('boast #{c}', binding) }.should.not.raise NameError
|
203
|
+
end
|
204
|
+
|
133
205
|
end
|