pry 0.9.9.6pre2-i386-mingw32 → 0.9.10-i386-mingw32
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/CHANGELOG +41 -0
- data/CONTRIBUTORS +27 -26
- data/README.markdown +4 -4
- data/Rakefile +2 -2
- data/lib/pry.rb +25 -19
- data/lib/pry/cli.rb +31 -10
- data/lib/pry/code.rb +41 -83
- data/lib/pry/command.rb +87 -76
- data/lib/pry/command_set.rb +13 -20
- data/lib/pry/completion.rb +139 -121
- data/lib/pry/config.rb +4 -0
- data/lib/pry/core_extensions.rb +88 -31
- data/lib/pry/default_commands/cd.rb +31 -8
- data/lib/pry/default_commands/context.rb +4 -58
- data/lib/pry/default_commands/easter_eggs.rb +1 -1
- data/lib/pry/default_commands/editing.rb +21 -14
- data/lib/pry/default_commands/find_method.rb +5 -7
- data/lib/pry/default_commands/gist.rb +187 -0
- data/lib/pry/default_commands/hist.rb +6 -6
- data/lib/pry/default_commands/input_and_output.rb +73 -129
- data/lib/pry/default_commands/introspection.rb +107 -52
- data/lib/pry/default_commands/ls.rb +1 -1
- data/lib/pry/default_commands/misc.rb +0 -5
- data/lib/pry/default_commands/whereami.rb +92 -0
- data/lib/pry/helpers/base_helpers.rb +6 -1
- data/lib/pry/helpers/command_helpers.rb +30 -9
- data/lib/pry/helpers/documentation_helpers.rb +7 -7
- data/lib/pry/helpers/options_helpers.rb +1 -1
- data/lib/pry/helpers/text.rb +7 -9
- data/lib/pry/history.rb +15 -2
- data/lib/pry/hooks.rb +1 -1
- data/lib/pry/indent.rb +17 -10
- data/lib/pry/method.rb +35 -19
- data/lib/pry/module_candidate.rb +130 -0
- data/lib/pry/pry_class.rb +54 -22
- data/lib/pry/pry_instance.rb +71 -14
- data/lib/pry/repl_file_loader.rb +80 -0
- data/lib/pry/version.rb +1 -1
- data/lib/pry/wrapped_module.rb +121 -142
- data/pry.gemspec +13 -13
- data/test/candidate_helper1.rb +11 -0
- data/test/candidate_helper2.rb +8 -0
- data/test/helper.rb +16 -0
- data/test/test_code.rb +1 -1
- data/test/test_command.rb +364 -270
- data/test/test_command_integration.rb +235 -267
- data/test/test_completion.rb +36 -0
- data/test/test_control_d_handler.rb +45 -0
- data/test/test_default_commands/example.erb +5 -0
- data/test/test_default_commands/test_cd.rb +316 -11
- data/test/test_default_commands/test_context.rb +143 -192
- data/test/test_default_commands/test_documentation.rb +81 -14
- data/test/test_default_commands/test_find_method.rb +10 -2
- data/test/test_default_commands/test_input.rb +102 -111
- data/test/test_default_commands/test_introspection.rb +17 -12
- data/test/test_default_commands/test_ls.rb +8 -6
- data/test/test_default_commands/test_shell.rb +18 -15
- data/test/test_default_commands/test_show_source.rb +170 -44
- data/test/test_exception_whitelist.rb +6 -2
- data/test/test_hooks.rb +32 -0
- data/test/test_input_stack.rb +19 -16
- data/test/test_method.rb +0 -4
- data/test/test_prompt.rb +60 -0
- data/test/test_pry.rb +23 -31
- data/test/test_pry_defaults.rb +75 -57
- data/test/test_syntax_checking.rb +12 -11
- data/test/test_wrapped_module.rb +103 -0
- metadata +72 -26
data/lib/pry/command.rb
CHANGED
@@ -68,15 +68,12 @@ class Pry
|
|
68
68
|
end
|
69
69
|
|
70
70
|
# Create a new command with the given properties.
|
71
|
-
#
|
72
|
-
# @param String
|
73
|
-
# @param
|
74
|
-
# @param
|
75
|
-
# @
|
76
|
-
# @
|
77
|
-
#
|
78
|
-
# @return Class (a subclass of Pry::Command)
|
79
|
-
#
|
71
|
+
# @param [String, Regex] match The thing that triggers this command
|
72
|
+
# @param [String] description The description to appear in `help`
|
73
|
+
# @param [Hash] options Behavioral options (see {Pry::CommandSet#command})
|
74
|
+
# @param [Module] helpers A module of helper functions to be included.
|
75
|
+
# @yield optional, used for BlockCommands
|
76
|
+
# @return [Class] (a subclass of {Pry::Command})
|
80
77
|
def subclass(match, description, options, helpers, &block)
|
81
78
|
klass = Class.new(self)
|
82
79
|
klass.send(:include, helpers)
|
@@ -88,9 +85,8 @@ class Pry
|
|
88
85
|
end
|
89
86
|
|
90
87
|
# Should this command be called for the given line?
|
91
|
-
#
|
92
|
-
# @
|
93
|
-
# @return Boolean
|
88
|
+
# @param [String] val A line input at the REPL
|
89
|
+
# @return [Boolean]
|
94
90
|
def matches?(val)
|
95
91
|
command_regex =~ val
|
96
92
|
end
|
@@ -109,8 +105,8 @@ class Pry
|
|
109
105
|
# /\.*(.*)/.match_score("...foo") #=> 3
|
110
106
|
# 'hi'.match_score("hi there") #=> 2
|
111
107
|
#
|
112
|
-
# @param String
|
113
|
-
# @return Fixnum
|
108
|
+
# @param [String] val A line input at the REPL
|
109
|
+
# @return [Fixnum]
|
114
110
|
def match_score(val)
|
115
111
|
if command_regex =~ val
|
116
112
|
Regexp.last_match.size > 1 ? Regexp.last_match.begin(1) : Regexp.last_match.end(0)
|
@@ -147,25 +143,26 @@ class Pry
|
|
147
143
|
# This is usually auto-generated from directory naming, but it can be
|
148
144
|
# manually overridden if necessary.
|
149
145
|
def group(name=nil)
|
150
|
-
@group
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
146
|
+
@group ||= if name
|
147
|
+
name
|
148
|
+
else
|
149
|
+
case Pry::Method(block).source_file
|
150
|
+
when %r{/pry/.*_commands/(.*).rb}
|
151
|
+
$1.capitalize.gsub(/_/, " ")
|
152
|
+
when %r{(pry-\w+)-([\d\.]+([\w\d\.]+)?)}
|
153
|
+
name, version = $1, $2
|
154
|
+
"#{name.to_s} (v#{version.to_s})"
|
155
|
+
when /pryrc/
|
156
|
+
"~/.pryrc"
|
157
|
+
else
|
158
|
+
"(other)"
|
159
|
+
end
|
160
|
+
end
|
164
161
|
end
|
165
162
|
end
|
166
163
|
|
167
164
|
# Properties of one execution of a command (passed by {Pry#run_command} as a hash of
|
168
|
-
# context and expanded in
|
165
|
+
# context and expanded in `#initialize`
|
169
166
|
attr_accessor :output
|
170
167
|
attr_accessor :target
|
171
168
|
attr_accessor :captures
|
@@ -214,8 +211,7 @@ class Pry
|
|
214
211
|
|
215
212
|
|
216
213
|
# Instantiate a command, in preparation for calling it.
|
217
|
-
#
|
218
|
-
# @param Hash context The runtime context to use with this command.
|
214
|
+
# @param [Hash] context The runtime context to use with this command.
|
219
215
|
def initialize(context={})
|
220
216
|
self.context = context
|
221
217
|
self.target = context[:target]
|
@@ -225,9 +221,20 @@ class Pry
|
|
225
221
|
self._pry_ = context[:pry_instance]
|
226
222
|
end
|
227
223
|
|
228
|
-
# The value of
|
224
|
+
# @return [Object] The value of `self` inside the `target` binding.
|
229
225
|
def target_self; target.eval('self'); end
|
230
226
|
|
227
|
+
# @return [Hash] Pry commands can store arbitrary state
|
228
|
+
# here. This state persists between subsequent command invocations.
|
229
|
+
# All state saved here is unique to the command, it does not
|
230
|
+
# need to be namespaced.
|
231
|
+
# @example
|
232
|
+
# state.my_state = "my state" # this will not conflict with any
|
233
|
+
# # `state.my_state` used in another command.
|
234
|
+
def state
|
235
|
+
_pry_.command_state[match] ||= OpenStruct.new
|
236
|
+
end
|
237
|
+
|
231
238
|
# Revaluate the string (str) and perform interpolation.
|
232
239
|
# @param [String] str The string to reevaluate with interpolation.
|
233
240
|
#
|
@@ -244,8 +251,6 @@ class Pry
|
|
244
251
|
|
245
252
|
# Display a warning if a command collides with a local/method in
|
246
253
|
# the current scope.
|
247
|
-
# @param [String] command_name_match The name of the colliding command.
|
248
|
-
# @param [Binding] target The current binding context.
|
249
254
|
def check_for_command_collision(command_match, arg_string)
|
250
255
|
collision_type = target.eval("defined?(#{command_match})")
|
251
256
|
collision_type ||= 'local-variable' if arg_string.match(%r{\A\s*[-+*/%&|^]*=})
|
@@ -257,15 +262,20 @@ class Pry
|
|
257
262
|
rescue Pry::RescuableException
|
258
263
|
end
|
259
264
|
|
260
|
-
# Extract necessary information from a line that Command.matches? this
|
265
|
+
# Extract necessary information from a line that Command.matches? this
|
266
|
+
# command.
|
267
|
+
#
|
268
|
+
# Returns an array of four elements:
|
261
269
|
#
|
262
|
-
#
|
263
|
-
#
|
264
|
-
#
|
265
|
-
#
|
266
|
-
#
|
267
|
-
#
|
268
|
-
#
|
270
|
+
# ```
|
271
|
+
# [String] the portion of the line that matched with the Command match
|
272
|
+
# [String] a string of all the arguments (i.e. everything but the match)
|
273
|
+
# [Array] the captures caught by the command_regex
|
274
|
+
# [Array] the arguments obtained by splitting the arg_string
|
275
|
+
# ```
|
276
|
+
#
|
277
|
+
# @param [String] val The line of input
|
278
|
+
# @return [Array]
|
269
279
|
def tokenize(val)
|
270
280
|
val.replace(interpolate_string(val)) if command_options[:interpolate]
|
271
281
|
|
@@ -294,9 +304,8 @@ class Pry
|
|
294
304
|
end
|
295
305
|
|
296
306
|
# Process a line that Command.matches? this command.
|
297
|
-
#
|
298
|
-
# @
|
299
|
-
# @return Object or Command::VOID_VALUE
|
307
|
+
# @param [String] line The line to process
|
308
|
+
# @return [Object, Command::VOID_VALUE]
|
300
309
|
def process_line(line)
|
301
310
|
command_match, arg_string, captures, args = tokenize(line)
|
302
311
|
|
@@ -316,7 +325,7 @@ class Pry
|
|
316
325
|
# Note that if we find the '| do' or '| {' we delete this and the
|
317
326
|
# elements following it from `arg_string`.
|
318
327
|
def pass_block(arg_string)
|
319
|
-
block_index = arg_string.rindex
|
328
|
+
block_index = arg_string.rindex(/\| *(?:do|\{)/)
|
320
329
|
|
321
330
|
return if !block_index
|
322
331
|
|
@@ -338,12 +347,14 @@ class Pry
|
|
338
347
|
|
339
348
|
private :pass_block
|
340
349
|
|
341
|
-
# Run the command with the given
|
350
|
+
# Run the command with the given `args`.
|
342
351
|
#
|
343
|
-
# This is a public wrapper around
|
352
|
+
# This is a public wrapper around `#call` which ensures all preconditions
|
353
|
+
# are met.
|
344
354
|
#
|
345
|
-
# @param
|
346
|
-
# @return Object
|
355
|
+
# @param [Array<String>] args The arguments to pass to this command.
|
356
|
+
# @return [Object] The return value of the `#call` method, or
|
357
|
+
# {Command::VOID_VALUE}.
|
347
358
|
def call_safely(*args)
|
348
359
|
unless dependencies_met?
|
349
360
|
gems_needed = Array(command_options[:requires_gem])
|
@@ -371,10 +382,9 @@ class Pry
|
|
371
382
|
|
372
383
|
private
|
373
384
|
|
374
|
-
# Run the
|
375
|
-
#
|
376
|
-
# @
|
377
|
-
# @return Object the return value from #{call}
|
385
|
+
# Run the `#call` method and all the registered hooks.
|
386
|
+
# @param [Array<String>] args The arguments to `#call`
|
387
|
+
# @return [Object] The return value from `#call`
|
378
388
|
def call_with_hooks(*args)
|
379
389
|
self.class.hooks[:before].each do |block|
|
380
390
|
instance_exec(*args, &block)
|
@@ -390,10 +400,9 @@ class Pry
|
|
390
400
|
end
|
391
401
|
|
392
402
|
# Fix the number of arguments we pass to a block to avoid arity warnings.
|
393
|
-
#
|
394
|
-
# @param
|
395
|
-
# @
|
396
|
-
# @return Array a (possibly shorter) array of the arguments to pass
|
403
|
+
# @param [Fixnum] arity The arity of the block
|
404
|
+
# @param [Array] args The arguments to pass
|
405
|
+
# @return [Array] A (possibly shorter) array of the arguments to pass
|
397
406
|
def correct_arg_arity(arity, args)
|
398
407
|
case
|
399
408
|
when arity < 0
|
@@ -417,9 +426,8 @@ class Pry
|
|
417
426
|
alias_method :opts, :context
|
418
427
|
|
419
428
|
# Call the block that was registered with this command.
|
420
|
-
#
|
421
|
-
# @
|
422
|
-
# @return Object the return value of the block
|
429
|
+
# @param [Array<String>] args The arguments passed
|
430
|
+
# @return [Object] The return value of the block
|
423
431
|
def call(*args)
|
424
432
|
instance_exec(*correct_arg_arity(block.arity, args), &block)
|
425
433
|
end
|
@@ -431,24 +439,26 @@ class Pry
|
|
431
439
|
|
432
440
|
# A super-class ofr Commands with structure.
|
433
441
|
#
|
434
|
-
# This class implements the bare-minimum functionality that a command should
|
435
|
-
# namely a --help switch, and then delegates actual processing to its
|
442
|
+
# This class implements the bare-minimum functionality that a command should
|
443
|
+
# have, namely a --help switch, and then delegates actual processing to its
|
444
|
+
# subclasses.
|
436
445
|
#
|
437
|
-
# Create subclasses using {Pry::CommandSet#create_command}, and override the
|
438
|
-
# to set up an instance of Slop, and the
|
439
|
-
#
|
440
|
-
#
|
446
|
+
# Create subclasses using {Pry::CommandSet#create_command}, and override the
|
447
|
+
# `options(opt)` method to set up an instance of Slop, and the `process`
|
448
|
+
# method to actually run the command. If necessary, you can also override
|
449
|
+
# `setup` which will be called before `options`, for example to require any
|
450
|
+
# gems your command needs to run, or to set up state.
|
441
451
|
class ClassCommand < Command
|
442
452
|
|
443
453
|
attr_accessor :opts
|
444
454
|
attr_accessor :args
|
445
455
|
|
446
|
-
# Set up
|
456
|
+
# Set up `opts` and `args`, and then call `process`.
|
447
457
|
#
|
448
458
|
# This function will display help if necessary.
|
449
459
|
#
|
450
|
-
# @param
|
451
|
-
# @return Object
|
460
|
+
# @param [Array<String>] args The arguments passed
|
461
|
+
# @return [Object] The return value of `process` or VOID_VALUE
|
452
462
|
def call(*args)
|
453
463
|
setup
|
454
464
|
|
@@ -477,7 +487,7 @@ class Pry
|
|
477
487
|
end
|
478
488
|
end
|
479
489
|
|
480
|
-
# A function called just before
|
490
|
+
# A function called just before `options(opt)` as part of `call`.
|
481
491
|
#
|
482
492
|
# This function can be used to set up any context your command needs to run, for example
|
483
493
|
# requiring gems, or setting default values for options.
|
@@ -493,7 +503,7 @@ class Pry
|
|
493
503
|
#
|
494
504
|
# NOTE: please don't do anything side-effecty in the main part of this method,
|
495
505
|
# as it may be called by Pry at any time for introspection reasons. If you need
|
496
|
-
# to set up default values, use
|
506
|
+
# to set up default values, use `setup` instead.
|
497
507
|
#
|
498
508
|
# @example
|
499
509
|
# def options(opt)
|
@@ -506,11 +516,12 @@ class Pry
|
|
506
516
|
|
507
517
|
# The actual body of your command should go here.
|
508
518
|
#
|
509
|
-
# The
|
510
|
-
# and
|
519
|
+
# The `opts` mehod can be called to get the options that Slop has passed,
|
520
|
+
# and `args` gives the remaining, unparsed arguments.
|
511
521
|
#
|
512
|
-
# The return value of this method is discarded unless the command was
|
513
|
-
# with
|
522
|
+
# The return value of this method is discarded unless the command was
|
523
|
+
# created with `:keep_retval => true`, in which case it is returned to the
|
524
|
+
# repl.
|
514
525
|
#
|
515
526
|
# @example
|
516
527
|
# def process
|
data/lib/pry/command_set.rb
CHANGED
@@ -92,7 +92,7 @@ class Pry
|
|
92
92
|
# @param [String, Regexp] match The start of invocations of this command.
|
93
93
|
# @param [String] description A description of the command.
|
94
94
|
# @param [Hash] options The optional configuration parameters, see {#command}
|
95
|
-
# @
|
95
|
+
# @yield The class body's definition.
|
96
96
|
#
|
97
97
|
# @example
|
98
98
|
# Pry::Commands.create_command "echo", "echo's the input", :shellwords => false do
|
@@ -153,7 +153,7 @@ class Pry
|
|
153
153
|
end
|
154
154
|
|
155
155
|
# Add a given command object to this set.
|
156
|
-
# @param Command
|
156
|
+
# @param [Command] command The subclass of Pry::Command you wish to add.
|
157
157
|
def add_command(command)
|
158
158
|
commands[command.match] = command
|
159
159
|
end
|
@@ -208,8 +208,6 @@ class Pry
|
|
208
208
|
protected :find_command_by_match_or_listing
|
209
209
|
|
210
210
|
# Aliases a command
|
211
|
-
# Note that if `desc` parameter is `nil` then the default
|
212
|
-
# description is used.
|
213
211
|
# @param [String, Regex] match The match of the alias (can be a regex).
|
214
212
|
# @param [String] action The action to be performed (typically
|
215
213
|
# another command).
|
@@ -242,7 +240,7 @@ class Pry
|
|
242
240
|
|
243
241
|
# Rename a command. Accepts either match or listing for the search.
|
244
242
|
#
|
245
|
-
# @param [String, Regexp]
|
243
|
+
# @param [String, Regexp] new_match The new match for the command.
|
246
244
|
# @param [String, Regexp] search The command's current match or listing.
|
247
245
|
# @param [Hash] options The optional configuration parameters,
|
248
246
|
# accepts the same as the `command` method, but also allows the
|
@@ -267,8 +265,8 @@ class Pry
|
|
267
265
|
# Sets or gets the description for a command (replacing the old
|
268
266
|
# description). Returns current description if no description
|
269
267
|
# parameter provided.
|
270
|
-
# @param [String, Regexp]
|
271
|
-
# @param [String] description The command description.
|
268
|
+
# @param [String, Regexp] search The command match.
|
269
|
+
# @param [String?] description (nil) The command description.
|
272
270
|
# @example Setting
|
273
271
|
# MyCommands = Pry::CommandSet.new do
|
274
272
|
# desc "help", "help description"
|
@@ -305,8 +303,7 @@ class Pry
|
|
305
303
|
end
|
306
304
|
|
307
305
|
# Find a command that matches the given line
|
308
|
-
#
|
309
|
-
# @param [String] the line that may be a command invocation
|
306
|
+
# @param [String] val The line that might be a command invocation
|
310
307
|
# @return [Pry::Command, nil]
|
311
308
|
def find_command(val)
|
312
309
|
commands.values.select{ |c| c.matches?(val) }.sort_by{ |c| c.match_score(val) }.last
|
@@ -314,9 +311,8 @@ class Pry
|
|
314
311
|
alias_method :[], :find_command
|
315
312
|
|
316
313
|
# Find the command that the user might be trying to refer to.
|
317
|
-
#
|
318
|
-
# @
|
319
|
-
# @return [Pry::Command, nil]
|
314
|
+
# @param [String] search The user's search.
|
315
|
+
# @return [Pry::Command?]
|
320
316
|
def find_command_for_help(search)
|
321
317
|
find_command(search) || (begin
|
322
318
|
find_command_by_match_or_listing(search)
|
@@ -326,19 +322,16 @@ class Pry
|
|
326
322
|
end
|
327
323
|
|
328
324
|
# Is the given line a command invocation?
|
329
|
-
#
|
330
|
-
# @param [String]
|
325
|
+
# @param [String] val
|
331
326
|
# @return [Boolean]
|
332
327
|
def valid_command?(val)
|
333
328
|
!!find_command(val)
|
334
329
|
end
|
335
330
|
|
336
331
|
# Process the given line to see whether it needs executing as a command.
|
337
|
-
#
|
338
|
-
# @param
|
339
|
-
# @
|
340
|
-
# @return CommandSet::Result
|
341
|
-
#
|
332
|
+
# @param [String] val The line to execute
|
333
|
+
# @param [Hash] context The context to execute the commands with
|
334
|
+
# @return [CommandSet::Result]
|
342
335
|
def process_line(val, context={})
|
343
336
|
if command = find_command(val)
|
344
337
|
context = context.merge(:command_set => self)
|
@@ -349,7 +342,7 @@ class Pry
|
|
349
342
|
end
|
350
343
|
end
|
351
344
|
|
352
|
-
# @
|
345
|
+
# @private (used for testing)
|
353
346
|
def run_command(context, match, *args)
|
354
347
|
command = commands[match] or raise NoCommandError.new(match, self)
|
355
348
|
command.new(context).call_safely(*args)
|
data/lib/pry/completion.rb
CHANGED
@@ -8,7 +8,7 @@ class Pry
|
|
8
8
|
module InputCompleter
|
9
9
|
|
10
10
|
if Readline.respond_to?("basic_word_break_characters=")
|
11
|
-
Readline.basic_word_break_characters= " \t\n\"\\'`><=;|&{("
|
11
|
+
Readline.basic_word_break_characters = " \t\n\"\\'`><=;|&{("
|
12
12
|
end
|
13
13
|
|
14
14
|
Readline.completion_append_character = nil
|
@@ -43,146 +43,164 @@ class Pry
|
|
43
43
|
# @param [Array<String>] commands The array of Pry commands.
|
44
44
|
def self.build_completion_proc(target, commands=[""])
|
45
45
|
proc do |input|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
# Absolute Constant or class methods
|
86
|
-
receiver = $1
|
87
|
-
candidates = Object.constants.collect{|m| m.to_s}
|
88
|
-
candidates.grep(/^#{receiver}/).collect{|e| "::" + e}
|
89
|
-
|
90
|
-
when /^([A-Z].*)::([^:.]*)$/
|
91
|
-
# Constant or class methods
|
92
|
-
receiver = $1
|
93
|
-
message = Regexp.quote($2)
|
94
|
-
begin
|
95
|
-
candidates = eval("#{receiver}.constants.collect{|m| m.to_s}", bind)
|
96
|
-
candidates |= eval("#{receiver}.methods.collect{|m| m.to_s}", bind)
|
97
|
-
rescue RescuableException
|
98
|
-
candidates = []
|
99
|
-
end
|
100
|
-
candidates.grep(/^#{message}/).collect{|e| receiver + "::" + e}
|
101
|
-
|
102
|
-
when /^(:[^:.]+)\.([^.]*)$/
|
103
|
-
# Symbol
|
104
|
-
receiver = $1
|
105
|
-
message = Regexp.quote($2)
|
106
|
-
|
107
|
-
candidates = Symbol.instance_methods.collect{|m| m.to_s}
|
108
|
-
select_message(receiver, message, candidates)
|
46
|
+
begin
|
47
|
+
bind = target
|
48
|
+
|
49
|
+
case input
|
50
|
+
when /^(\/[^\/]*\/)\.([^.]*)$/
|
51
|
+
# Regexp
|
52
|
+
receiver = $1
|
53
|
+
message = Regexp.quote($2)
|
54
|
+
|
55
|
+
candidates = Regexp.instance_methods.collect{|m| m.to_s}
|
56
|
+
select_message(receiver, message, candidates)
|
57
|
+
|
58
|
+
when /^([^\]]*\])\.([^.]*)$/
|
59
|
+
# Array
|
60
|
+
receiver = $1
|
61
|
+
message = Regexp.quote($2)
|
62
|
+
|
63
|
+
candidates = Array.instance_methods.collect{|m| m.to_s}
|
64
|
+
select_message(receiver, message, candidates)
|
65
|
+
|
66
|
+
when /^([^\}]*\})\.([^.]*)$/
|
67
|
+
# Proc or Hash
|
68
|
+
receiver = $1
|
69
|
+
message = Regexp.quote($2)
|
70
|
+
|
71
|
+
candidates = Proc.instance_methods.collect{|m| m.to_s}
|
72
|
+
candidates |= Hash.instance_methods.collect{|m| m.to_s}
|
73
|
+
select_message(receiver, message, candidates)
|
74
|
+
|
75
|
+
when /^(:[^:.]*)$/
|
76
|
+
# Symbol
|
77
|
+
if Symbol.respond_to?(:all_symbols)
|
78
|
+
sym = Regexp.quote($1)
|
79
|
+
candidates = Symbol.all_symbols.collect{|s| ":" + s.id2name}
|
80
|
+
|
81
|
+
candidates.grep(/^#{sym}/)
|
82
|
+
else
|
83
|
+
[]
|
84
|
+
end
|
109
85
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
86
|
+
when /^::([A-Z][^:\.\(]*)$/
|
87
|
+
# Absolute Constant or class methods
|
88
|
+
receiver = $1
|
89
|
+
candidates = Object.constants.collect{|m| m.to_s}
|
90
|
+
candidates.grep(/^#{receiver}/).collect{|e| "::" + e}
|
114
91
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
92
|
+
when /^([A-Z].*)::([^:.]*)$/
|
93
|
+
# Constant or class methods
|
94
|
+
receiver = $1
|
95
|
+
message = Regexp.quote($2)
|
96
|
+
begin
|
97
|
+
candidates = eval("#{receiver}.constants.collect{|m| m.to_s}", bind)
|
98
|
+
candidates |= eval("#{receiver}.methods.collect{|m| m.to_s}", bind)
|
99
|
+
rescue RescuableException
|
100
|
+
candidates = []
|
101
|
+
end
|
102
|
+
candidates.grep(/^#{message}/).collect{|e| receiver + "::" + e}
|
121
103
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
104
|
+
when /^(:[^:.]+)\.([^.]*)$/
|
105
|
+
# Symbol
|
106
|
+
receiver = $1
|
107
|
+
message = Regexp.quote($2)
|
126
108
|
|
127
|
-
|
128
|
-
|
129
|
-
rescue RescuableException
|
130
|
-
candidates = []
|
131
|
-
end
|
132
|
-
select_message(receiver, message, candidates)
|
109
|
+
candidates = Symbol.instance_methods.collect{|m| m.to_s}
|
110
|
+
select_message(receiver, message, candidates)
|
133
111
|
|
134
|
-
|
135
|
-
|
136
|
-
|
112
|
+
when /^(-?(0[dbo])?[0-9_]+(\.[0-9_]+)?([eE]-?[0-9]+)?)\.([^.]*)$/
|
113
|
+
# Numeric
|
114
|
+
receiver = $1
|
115
|
+
message = Regexp.quote($5)
|
137
116
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
117
|
+
begin
|
118
|
+
candidates = eval(receiver, bind).methods.collect{|m| m.to_s}
|
119
|
+
rescue RescuableException
|
120
|
+
candidates = []
|
121
|
+
end
|
122
|
+
select_message(receiver, message, candidates)
|
142
123
|
|
143
|
-
|
144
|
-
|
145
|
-
|
124
|
+
when /^(-?0x[0-9a-fA-F_]+)\.([^.]*)$/
|
125
|
+
# Numeric(0xFFFF)
|
126
|
+
receiver = $1
|
127
|
+
message = Regexp.quote($2)
|
146
128
|
|
147
|
-
if (gv | lv | cv).include?(receiver) or /^[A-Z]/ =~ receiver && /\./ !~ receiver
|
148
|
-
# foo.func and foo is local var. OR
|
149
|
-
# Foo::Bar.func
|
150
129
|
begin
|
151
|
-
candidates = eval(
|
130
|
+
candidates = eval(receiver, bind).methods.collect{|m| m.to_s}
|
152
131
|
rescue RescuableException
|
153
132
|
candidates = []
|
154
133
|
end
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
134
|
+
select_message(receiver, message, candidates)
|
135
|
+
|
136
|
+
when /^(\$[^.]*)$/
|
137
|
+
regmessage = Regexp.new(Regexp.quote($1))
|
138
|
+
candidates = global_variables.collect{|m| m.to_s}.grep(regmessage)
|
139
|
+
|
140
|
+
when /^([^."].*)\.([^.]*)$/
|
141
|
+
# variable
|
142
|
+
receiver = $1
|
143
|
+
message = Regexp.quote($2)
|
144
|
+
|
145
|
+
gv = eval("global_variables", bind).collect{|m| m.to_s}
|
146
|
+
lv = eval("local_variables", bind).collect{|m| m.to_s}
|
147
|
+
cv = eval("self.class.constants", bind).collect{|m| m.to_s}
|
148
|
+
|
149
|
+
if (gv | lv | cv).include?(receiver) or /^[A-Z]/ =~ receiver && /\./ !~ receiver
|
150
|
+
# foo.func and foo is local var. OR
|
151
|
+
# Foo::Bar.func
|
159
152
|
begin
|
160
|
-
|
153
|
+
candidates = eval("#{receiver}.methods", bind).collect{|m| m.to_s}
|
161
154
|
rescue RescuableException
|
162
|
-
|
155
|
+
candidates = []
|
163
156
|
end
|
164
|
-
|
165
|
-
|
166
|
-
candidates
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
157
|
+
else
|
158
|
+
# func1.func2
|
159
|
+
candidates = []
|
160
|
+
ObjectSpace.each_object(Module){|m|
|
161
|
+
begin
|
162
|
+
name = m.name.to_s
|
163
|
+
rescue RescuableException
|
164
|
+
name = ""
|
165
|
+
end
|
166
|
+
next if name != "IRB::Context" and
|
167
|
+
/^(IRB|SLex|RubyLex|RubyToken)/ =~ name
|
168
|
+
|
169
|
+
# jruby doesn't always provide #instance_methods() on each
|
170
|
+
# object.
|
171
|
+
if m.respond_to?(:instance_methods)
|
172
|
+
candidates.concat m.instance_methods(false).collect{|x| x.to_s}
|
173
|
+
end
|
174
|
+
}
|
175
|
+
candidates.sort!
|
176
|
+
candidates.uniq!
|
177
|
+
end
|
178
|
+
select_message(receiver, message, candidates)
|
172
179
|
|
173
|
-
|
174
|
-
|
180
|
+
when /^\.([^.]*)$/
|
181
|
+
# unknown(maybe String)
|
175
182
|
|
176
|
-
|
177
|
-
|
183
|
+
receiver = ""
|
184
|
+
message = Regexp.quote($1)
|
178
185
|
|
179
|
-
|
180
|
-
|
186
|
+
candidates = String.instance_methods(true).collect{|m| m.to_s}
|
187
|
+
select_message(receiver, message, candidates)
|
181
188
|
|
182
|
-
|
183
|
-
|
189
|
+
else
|
190
|
+
candidates = eval(
|
191
|
+
"methods | private_methods | local_variables | " \
|
192
|
+
"self.class.constants | instance_variables",
|
193
|
+
bind
|
194
|
+
).collect{|m| m.to_s}
|
195
|
+
|
196
|
+
if eval("respond_to?(:class_variables)", bind)
|
197
|
+
candidates += eval("class_variables", bind).collect { |m| m.to_s }
|
198
|
+
end
|
184
199
|
|
185
|
-
|
200
|
+
(candidates|ReservedWords|commands).grep(/^#{Regexp.quote(input)}/)
|
201
|
+
end
|
202
|
+
rescue RescuableException
|
203
|
+
[]
|
186
204
|
end
|
187
205
|
end
|
188
206
|
end
|