coderunner 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,776 @@
1
+ class CodeRunner
2
+
3
+ module InteractiveMethods
4
+ COMMANDS.each do |command|
5
+ eval("def #{command[1]}(*args)
6
+ # if args[-1].kind_of?
7
+ CodeRunner.send(#{command[0].to_sym.inspect}, *args)
8
+ end")
9
+ end
10
+ def up
11
+ ObjectSpace.each_object{|obj| obj.update if obj.class.to_s =~ /CodeRunner$/}
12
+ nil
13
+ end
14
+ def cd(dirct)
15
+ Dir.chdir(dirct)
16
+ end
17
+ def setup_interactive
18
+ @runner = CodeRunner.fetch_runner(CodeRunner::DEFAULT_COMMAND_OPTIONS.dup) unless CodeRunner::DEFAULT_COMMAND_OPTIONS[:q]
19
+ @r = @runner
20
+ end
21
+ def pwd
22
+ puts Dir.pwd
23
+ end
24
+ def runs
25
+ CodeRunner.runner.run_list
26
+ end
27
+
28
+
29
+
30
+
31
+
32
+ INTERACTIVE_METHODS = <<EOF
33
+
34
+
35
+ include CodeRunner::InteractiveMethods
36
+ setup_interactive
37
+ module Kernel
38
+
39
+ alias_method(:shell_do, "`".to_sym)
40
+ def `(cmd)
41
+ c =caller
42
+ if c[0] =~ /irb_binding/
43
+ system(cmd)
44
+ else
45
+ shell_do(cmd)
46
+ end
47
+ end
48
+ end
49
+ EOF
50
+
51
+ end # module InteractiveMethods
52
+
53
+ def CodeRunner.interactive_mode(copts={})
54
+ process_command_options(copts)
55
+ unless false and FileTest.exist? (ENV['HOME'] + '/code_runner_interactive_options.rb')
56
+ File.open(ENV['HOME'] + '/.code_runner_interactive_options.rb', 'w') do |file|
57
+ file.puts <<EOF
58
+ $has_put_startup_message_for_code_runner = true #please leave!
59
+ $code_runner_interactive_mode = true #please leave!
60
+ require 'yaml'
61
+
62
+ def reset
63
+ Dispatcher.reset_application!
64
+ end
65
+
66
+ IRB.conf[:AUTO_INDENT] = true
67
+ IRB.conf[:USE_READLINE] = true
68
+ IRB.conf[:LOAD_MODULES] = [] unless IRB.conf.key?(:LOAD_MODULES)
69
+ unless IRB.conf[:LOAD_MODULES].include?('irb/completion')
70
+ IRB.conf[:LOAD_MODULES] << 'irb/completion'
71
+ end
72
+
73
+
74
+ require 'irb/completion'
75
+ require 'irb/ext/save-history'
76
+ require 'socket'
77
+ unless ENV['CODE_RUNNER_SYSTEM'] == 'macosx'
78
+ prompt_start = "\001#{Terminal::LIGHT_GREEN}\002CodeRunner\001#{Terminal::RESET}\002 v#{CODE_RUNNER_VERSION} - \001#{Terminal::CYAN}\002#\{ENV['USER']\}@#\{Socket::gethostname\}:#\{File.basename(Dir.pwd)}\001#{Terminal::RESET}\002 timemarker\n"
79
+ prompt_start = "\001#{Terminal::LIGHT_GREEN}\002CodeRunner\001#{Terminal::RESET}\002 v#{CODE_RUNNER_VERSION} - \001#{Terminal::CYAN}\002#\{Socket::gethostname\}:#\{File.basename(Dir.pwd)}\001#{Terminal::RESET}\002 timemarker %02n,%i \n"
80
+ else
81
+ prompt_start = "CodeRunner #\{File.basename(Dir.pwd)}"
82
+ end
83
+ IRB.conf[:PROMPT][:CODE_RUNNER] = {:PROMPT_I=>"#\{prompt_start}>> %02n,%i >> ", :PROMPT_N=>"#\{prompt_start}>> %02n:%i > ", :PROMPT_S=>"#\{prompt_start}>> %02n:%i (%l)> ", :PROMPT_C=>"#\{prompt_start}>> %02n:%i >> ", :RETURN=>""}
84
+ IRB.conf[:PROMPT][:CODE_RUNNER] = {:PROMPT_I=>"#\{prompt_start}>> ", :PROMPT_N=>"#\{prompt_start}> ", :PROMPT_S=>"#\{prompt_start}(%l)> ", :PROMPT_C=>"#\{prompt_start}>> ", :RETURN=>""}
85
+ # IRB.conf[:PROMPT][:CODE_RUNNER] = {:PROMPT_I=>"#\{prompt_start} %02n,%i>> ", :PROMPT_N=>"#\{prompt_start} %02n:%i> ", :PROMPT_S=>"#\{prompt_start} %02n:%i (%l)> ", :PROMPT_C=>"#\{prompt_start} %02n:%i>> ", :RETURN=>""}
86
+
87
+
88
+ IRB.conf[:PROMPT_MODE] = :CODE_RUNNER
89
+ IRB.conf[:SAVE_HISTORY] = 400
90
+ IRB.conf[:HISTORY_FILE] = "\#\{Dir.pwd}/.code-runner-irb-save-history"
91
+ IRB.conf[:INSPECT_MODE] = false
92
+
93
+
94
+ EOF
95
+ end # File.open
96
+ end # unless
97
+ File.open(".int.tmp.rb", 'w')do |file|
98
+ file.puts "#{copts.inspect}.each do |key, val|
99
+ CodeRunner::DEFAULT_COMMAND_OPTIONS[key] = val
100
+ end"
101
+ file.puts CodeRunner::InteractiveMethods::INTERACTIVE_METHODS
102
+ end
103
+ # asdfa
104
+ exec %[#{Config::CONFIG['bindir']}/irb#{Config::CONFIG['ruby_install_name'].sub(/ruby/, '')} -f -I '#{Dir.pwd}' -I '#{SCRIPT_FOLDER}' -I '#{ENV['HOME']}' -r '.code_runner_interactive_options' -r 'coderunner' -r .int.tmp ]
105
+ end
106
+
107
+
108
+ end
109
+
110
+
111
+ require "readline"
112
+
113
+
114
+ module IRB
115
+
116
+ COMMANDS = ENV['PATH'].split(':').inject([]) do |comms,dir|
117
+ # ep dir
118
+ begin
119
+ dir = dir.sub(/~/, ENV['HOME'])
120
+ Dir.entries(dir).each do |file|
121
+ file = "#{dir}/#{file}"
122
+ # ep file
123
+ comms.push(File.basename(file)) if FileTest.executable? file #and File.file? file
124
+ end
125
+ rescue
126
+ end
127
+ comms
128
+ end
129
+ COMMANDS.delete_if{|com| com =~ /^\./}
130
+ # ep 'COMMANDS', COMMANDS
131
+
132
+ module InputCompletor
133
+
134
+ def self.complete_files(receiver, message)
135
+ # files = message.split(/\s+/)
136
+ # message = files.pop
137
+ dir = message.sub(/[^\/]*$/, '')
138
+ message = message.sub(Regexp.new("#{Regexp.escape(dir)}"), '')
139
+ dir.sub!(/^~/, ENV['HOME'])
140
+ short_dir = dir
141
+ dir = Dir.pwd + '/' + dir unless dir =~ /^\//
142
+ #$stderr.puts "Dir to scan: #{dir}"
143
+
144
+ files = Dir.entries(dir)
145
+
146
+ #$stderr.puts "entries", files
147
+ Dir.chdir(dir){files= files.map{|file| FileTest.directory?(file) ? file + "/" : file}}
148
+ #$stderr.puts "entries - directories", files
149
+
150
+ candidates = message.size > 0 ? files.find_all{|com| com[0...message.size] == message} : files
151
+ return candidates.map{|com| receiver + short_dir + com}
152
+
153
+
154
+ old_dir = message.sub(/[^\/]*$/, '')
155
+ dir = old_dir.chomp("/")
156
+ message = message.sub(Regexp.new("#{Regexp.escape(dir)}\\/"), '')
157
+ if dir.size > 0
158
+ # eputs 'dir', dir
159
+ # unless old_dir ~= /^\//
160
+ dir = Dir.pwd + '/' + dir
161
+ # end
162
+ # eputs 'dir', dir, FileTest.directory?(dir)
163
+ if FileTest.directory? dir
164
+ files = Dir.entries(dir)
165
+ else
166
+ files = []
167
+ end
168
+ else
169
+ dir = Dir.pwd
170
+ files = Dir.entries(dir)
171
+ end
172
+ # ep files
173
+ # ep 'mess', message
174
+ Dir.chdir(dir){files= files.map{|file| FileTest.directory?(file) ? file + "/" : file}}
175
+ # ep dir, files
176
+ candidates = message.size > 0 ? files.find_all{|com| com[0...message.size] == message} : files
177
+ candidates.map{|com| receiver + old_dir + com}
178
+ rescue
179
+ return []
180
+ end
181
+
182
+ @RCS_ID='-$Id: completion.rb 23233 2009-04-19 13:35:47Z yugui $-'
183
+
184
+
185
+ CodeRunnerCompletionProc = proc do |input|
186
+ bind = IRB.conf[:MAIN_CONTEXT].workspace.binding
187
+ Readline.completion_append_character = nil
188
+ # eputs "\n\ninput: #{input}"
189
+
190
+
191
+ case input
192
+ when Regexp.new("^(#{/\w+\b.*(?:\s|,)(?::p\s+\=\>|p:)\s+\[?\s*/}(?:#{Regexp.quoted_string}\\s*,\\s*)*#{/'\{(?:[^}]*\s)?:?/})(\\w+)$")
193
+ # matches CodeRunner parameter list.... command [stuff] p: '{var: value, var
194
+ receiver = $1
195
+ message = $2
196
+ # ep 'mess', message
197
+ if CodeRunner.runner and CodeRunner.runner.run_class
198
+ candidates = CodeRunner.runner.run_class.rcp.variables.map{|var| var.to_s}.find_all{|var| var[0...message.size] == message}.map{|var| receiver + var}
199
+ else
200
+ candidates = []
201
+ end
202
+ when /^('(?:(?:\\ |[^'\s])*\s+)*)((?:\\ |[^'\s])*)$/, Regexp.new("^((?:[^']|#{Regexp.quoted_string})*')([^']*)$")
203
+ #filename in a single quoted string
204
+ receiver = "#$1" # "`" #$~[1]
205
+ message = "#$2" #Regexp.quote($~[2]) # $2 #Regexp.quote($2)
206
+ # ep 'mess', message
207
+ complete_files(receiver, message)
208
+
209
+
210
+
211
+ when /^(\`\w+\s+(?:\S+\s+)*)([^`\s]*)$/, /^([^`]*`\w+\s+)([^`]*)$/
212
+ #shell command with an executable
213
+ receiver = $1 # "`" #$~[1]
214
+ message = $2 #Regexp.quote($~[2]) # $2 #Regexp.quote($2)
215
+ complete_files(receiver, message)
216
+ # files = Dir.entries(File.dirname(message))
217
+ # candidates = message.size > 0 ? files.find_all{|com| com[0...message.size] == message} : files
218
+ # candidates.map{|com| receiver + com}
219
+
220
+ when /^(\`)([^`]*)$/, /^([^`]*`)([^`]*)$/
221
+ #shell command without an excutable
222
+
223
+ # p $~
224
+ receiver = $1 # "`" #$~[1]
225
+ message = $2 #Regexp.quote($~[2]) # $2 #Regexp.quote($2)
226
+ # ep "message is", message
227
+ # ep COMMANDS.grep(//)
228
+ candidates = message.size > 0 ? COMMANDS.find_all{|com| com[0...message.size] == message} : COMMANDS
229
+ candidates.map{|com| receiver + com}
230
+ #.grep(Regexp.new("^#{message}")) #("^#{Regexp.escape(message)}")) #.map{|com| "#{com}"} #.map{|com| receiver + com}
231
+ # ep candidates
232
+ # select_message(receiver, message, COMMANDS)
233
+
234
+ when /^([^\/]*\/[^\/]*\/)\.([^.]*)$/
235
+ # Regexp
236
+ receiver = $1
237
+ message = Regexp.quote($2)
238
+
239
+ candidates = Regexp.instance_methods.collect{|m| m.to_s}
240
+ select_message(receiver, message, candidates)
241
+
242
+ when /^([^\]]*\])\.([^.]*)$/
243
+ # Array
244
+ receiver = $1
245
+ message = Regexp.quote($2)
246
+
247
+ candidates = Array.instance_methods.collect{|m| m.to_s}
248
+ select_message(receiver, message, candidates)
249
+
250
+ when /([^\}]*\})\.([^.]*)$/
251
+ # Proc or Hash
252
+ receiver = $1
253
+ message = Regexp.quote($2)
254
+
255
+ candidates = Proc.instance_methods.collect{|m| m.to_s}
256
+ candidates |= Hash.instance_methods.collect{|m| m.to_s}
257
+ select_message(receiver, message, candidates)
258
+
259
+
260
+ when /^((?:(::)?[A-Z][^:.(]*)+)\.help :(\w*)$/
261
+ # CodeRunner help method
262
+ receiver = $1
263
+ message = Regexp.quote($3)
264
+ begin
265
+ candidates = eval("(#{receiver}.constants - Object.constants).collect{|m| m.to_s}", bind)
266
+ candidates |= eval("(#{receiver}.methods - Object.methods).collect{|m| m.to_s}", bind)
267
+ begin
268
+ candidates |= eval("(#{receiver}.instance_methods - Object.instance_methods).collect{|m| m.to_s}", bind)
269
+ rescue
270
+ end
271
+ rescue Exception
272
+ candidates = []
273
+ end
274
+ candidates.grep(/^#{message}/).collect{|e| receiver + '.help :' + e}
275
+
276
+ when /^((?:.*[^:])?:[^:.]*)$/
277
+ # eputs 'found symbol'
278
+ # Symbol
279
+ if Symbol.respond_to?(:all_symbols)
280
+ sym = $1
281
+ candidates = Symbol.all_symbols.collect{|s| ":" + s.id2name}
282
+ candidates.grep(/^#{sym}/)
283
+ else
284
+ []
285
+ end
286
+
287
+ when /^(.*\s)?(((::)?[A-Z][^:.(]*)+)(::|\.)([^:.]*)$/
288
+ # Constant or class methods
289
+ # p "CCC"
290
+ start = $1
291
+ receiver = $2
292
+ message = Regexp.quote($6)
293
+ joiner = "#$5"
294
+ begin
295
+ candidates = eval("#{receiver}.constants.collect{|m| m.to_s}", bind)
296
+ candidates |= eval("#{receiver}.methods.collect{|m| m.to_s}", bind)
297
+ rescue Exception
298
+ candidates = []
299
+ end
300
+ candidates.grep(/^#{message}/).collect{|e| (start or "") + receiver + (joiner or "::") + e}
301
+
302
+
303
+ when /^(.*)(\b[A-Z][^:\.\(]*)$/
304
+ # Absolute Constant or class methods
305
+ receiver = $1
306
+ message = $2
307
+ candidates = Object.constants.collect{|m| m.to_s}
308
+ candidates.grep(/^#{message}/).collect{|e| receiver + e}
309
+
310
+
311
+
312
+ when /^(.*-?(0[dbo])?[0-9_]+(\.[0-9_]+)?([eE]-?[0-9]+)?)\.([^.]*)$/
313
+ # Numeric
314
+ receiver = $1
315
+ message = Regexp.quote($5)
316
+
317
+ begin
318
+ candidates = eval(receiver, bind).methods.collect{|m| m.to_s}
319
+ rescue Exception
320
+ candidates = []
321
+ end
322
+ select_message(receiver, message, candidates)
323
+
324
+ when /^(.*-?0x[0-9a-fA-F_]+)\.([^.]*)$/
325
+ # Numeric(0xFFFF)
326
+ receiver = $1
327
+ message = Regexp.quote($2)
328
+
329
+ begin
330
+ candidates = eval(receiver, bind).methods.collect{|m| m.to_s}
331
+ rescue Exception
332
+ candidates = []
333
+ end
334
+ select_message(receiver, message, candidates)
335
+
336
+ when /^(.*[\s\{\[])?(\$[^.]*)$/
337
+ regmessage = Regexp.new(Regexp.quote($1))
338
+ candidates = global_variables.collect{|m| m.to_s}.grep(regmessage)
339
+
340
+ # when /^(\$?(\.?[^.]+)+)\.([^.]*)$/
341
+ when /^((\.?[^.]+)+)\.([^.]*)$/
342
+ # variable
343
+ receiver = $1
344
+ message = Regexp.quote($3)
345
+
346
+ gv = eval("global_variables", bind).collect{|m| m.to_s}
347
+ lv = eval("local_variables", bind).collect{|m| m.to_s}
348
+ cv = eval("self.class.constants", bind).collect{|m| m.to_s}
349
+
350
+ if (gv | lv | cv).include?(receiver)
351
+ # foo.func and foo is local var.
352
+ candidates = eval("#{receiver}.methods", bind).collect{|m| m.to_s}
353
+ elsif /^[A-Z]/ =~ receiver and /\./ !~ receiver
354
+ # Foo::Bar.func
355
+ begin
356
+ candidates = eval("#{receiver}.methods", bind).collect{|m| m.to_s}
357
+ rescue Exception
358
+ candidates = []
359
+ end
360
+ else
361
+ # func1.func2
362
+ candidates = []
363
+ ObjectSpace.each_object(Module){|m|
364
+ begin
365
+ name = m.name
366
+ rescue Exception
367
+ name = ""
368
+ end
369
+ next if name != "IRB::Context" and
370
+ /^(IRB|SLex|RubyLex|RubyToken)/ =~ name
371
+ candidates.concat m.instance_methods(false).collect{|x| x.to_s}
372
+ }
373
+ candidates.sort!
374
+ candidates.uniq!
375
+ end
376
+ select_message(receiver, message, candidates)
377
+
378
+ when /^\.([^.]*)$/
379
+ # unknown(maybe String)
380
+
381
+ receiver = ""
382
+ message = Regexp.quote($1)
383
+
384
+ candidates = String.instance_methods(true).collect{|m| m.to_s}
385
+ select_message(receiver, message, candidates)
386
+
387
+ else
388
+ candidates = eval("methods | private_methods | local_variables | self.class.constants", bind).collect{|m| m.to_s}
389
+
390
+ (candidates|ReservedWords).grep(/^#{Regexp.quote(input)}/)
391
+
392
+ end
393
+ end
394
+
395
+ end
396
+
397
+ def self.select_message(receiver, message, candidates)
398
+ candidates.grep(/^#{message}/).collect do |e|
399
+ if receiver =~ /^.*`/
400
+ receiver + e
401
+ else
402
+ case e
403
+ when /^[a-zA-Z_]/
404
+ receiver + "." + e
405
+ when /^[0-9]/
406
+ when *Operators
407
+
408
+
409
+ #receiver + " " + e
410
+ end
411
+ end
412
+ end
413
+ end
414
+ class InputMethod
415
+ end
416
+ class ReadlineInputMethod < InputMethod
417
+ include Readline
418
+ def gets
419
+ Readline.input = @stdin
420
+ Readline.output = @stdout
421
+ prompt_end = Time.now.to_s[11...16]
422
+ begin
423
+ memsize = `ps ax -o pid,rss | grep -E "^[[:space:]]*#{Process::pid}"`.chomp.split(/\s+/).map {|s| s.strip.to_i}[1].to_i/1000
424
+ prompt_end += " #{memsize}k"
425
+ rescue
426
+ end
427
+ prompt_end +=" (#{CodeRunner::SETUP_RUN_CLASSES.join(",")})"
428
+ if l = readline(@prompt.gsub(/timemarker/, prompt_end) , false)
429
+ #HISTORY.push(l) if !l.empty? and (HISTORY.size ==0 or l != HISTORY[-1])
430
+ HISTORY.push(l) if !l.empty? and (HISTORY.size ==0 or l != HISTORY[-1])
431
+
432
+ i = 0
433
+ loop do
434
+ break if HISTORY.size == 1
435
+ (HISTORY.delete_at(i); i-=1) if HISTORY[i] == l
436
+ i+=1
437
+ #ep "i: #{i}, HS: #{HISTORY.size}"
438
+ break if i >= HISTORY.size - 1
439
+ end
440
+ #HISTORY.reverse!
441
+ #HISTORY.uniq!
442
+ #HISTORY.reverse!
443
+ #HISTORY.push(l) if !l.empty? and (HISTORY.size ==0 or !HISTORY.include? l)
444
+ @line[@line_no += 1] = l + "\n"
445
+ else
446
+ @eof = true
447
+ l
448
+ end
449
+ end
450
+ end
451
+
452
+ end #module IRB
453
+
454
+ if Readline.respond_to?("basic_word_break_characters=")
455
+ Readline.basic_word_break_characters= "\t\n><=;|&("
456
+ end
457
+ Readline.completion_append_character = "BB"
458
+ Readline.completion_proc = IRB::InputCompletor::CodeRunnerCompletionProc
459
+
460
+ begin
461
+ if Readline.respond_to?("basic_quote_characters=")
462
+ Readline.basic_quote_characters= "\"'`"
463
+ end
464
+ rescue NotImplementedError
465
+ end
466
+
467
+ module Kernel
468
+
469
+ end
470
+
471
+ require 'rdoc'
472
+ require 'rdoc/ri/driver'
473
+
474
+ class RDoc::RI::Driver
475
+ def run
476
+ if(@list_doc_dirs)
477
+ puts @doc_dirs.join("\n")
478
+ elsif @names.empty? then
479
+ @display.list_known_classes class_cache.keys.sort
480
+ else
481
+
482
+ @names.each do |name|
483
+ if class_cache.key? name then
484
+ method_map = display_class name
485
+ if(@interactive)
486
+ method_name = @display.get_class_method_choice(method_map)
487
+
488
+ if(method_name != nil)
489
+ method = lookup_method "#{name}#{method_name}", name
490
+ display_method method
491
+ end
492
+ end
493
+ elsif name =~ /::|\#|\./ then
494
+ klass, = parse_name name
495
+
496
+ orig_klass = klass
497
+ orig_name = name
498
+
499
+ loop do
500
+ method = lookup_method name, klass
501
+
502
+ break method if method
503
+
504
+ ancestor = lookup_ancestor klass, orig_klass
505
+
506
+ break unless ancestor
507
+
508
+ name = name.sub klass, ancestor
509
+ klass = ancestor
510
+ end
511
+
512
+ # return unless method
513
+
514
+ raise NotFoundError, orig_name unless method
515
+
516
+ display_method method
517
+ else
518
+ methods = select_methods(/#{name}/)
519
+
520
+ if methods.size == 0
521
+ return
522
+ raise NotFoundError, name
523
+ elsif methods.size == 1
524
+ display_method methods[0]
525
+ else
526
+ if(@interactive)
527
+ @display.display_method_list_choice methods
528
+ else
529
+ @display.display_method_list methods
530
+ end
531
+ end
532
+ end
533
+ end
534
+ end
535
+ # rescue NotFoundError => e
536
+ # eputs e
537
+ # return
538
+ end
539
+
540
+ def self.process_args(argv)
541
+ options = default_options
542
+
543
+ opts = OptionParser.new do |opt|
544
+ opt.program_name = File.basename $0
545
+ opt.version = RDoc::VERSION
546
+ opt.release = nil
547
+ opt.summary_indent = ' ' * 4
548
+
549
+ directories = [
550
+ RDoc::RI::Paths::SYSDIR,
551
+ RDoc::RI::Paths::SITEDIR,
552
+ RDoc::RI::Paths::HOMEDIR
553
+ ]
554
+
555
+ if RDoc::RI::Paths::GEMDIRS then
556
+ Gem.path.each do |dir|
557
+ directories << "#{dir}/doc/*/ri"
558
+ end
559
+ end
560
+
561
+ opt.banner = <<-EOT
562
+ Usage: #{opt.program_name} [options] [names...]
563
+
564
+ Where name can be:
565
+
566
+ Class | Class::method | Class#method | Class.method | method
567
+
568
+ All class names may be abbreviated to their minimum unambiguous form. If a name
569
+ is ambiguous, all valid options will be listed.
570
+
571
+ The form '.' method matches either class or instance methods, while #method
572
+ matches only instance and ::method matches only class methods.
573
+
574
+ For example:
575
+
576
+ #{opt.program_name} Fil
577
+ #{opt.program_name} File
578
+ #{opt.program_name} File.new
579
+ #{opt.program_name} zip
580
+
581
+ Note that shell quoting may be required for method names containing
582
+ punctuation:
583
+
584
+ #{opt.program_name} 'Array.[]'
585
+ #{opt.program_name} compact\\!
586
+
587
+ By default ri searches for documentation in the following directories:
588
+
589
+ #{directories.join "\n "}
590
+
591
+ Specifying the --system, --site, --home, --gems or --doc-dir options will
592
+ limit ri to searching only the specified directories.
593
+
594
+ Options may also be set in the 'RI' environment variable.
595
+ EOT
596
+
597
+ opt.separator nil
598
+ opt.separator "Options:"
599
+ opt.separator nil
600
+
601
+ opt.on("--fmt=FORMAT", "--format=FORMAT", "-f",
602
+ RDoc::RI::Formatter::FORMATTERS.keys,
603
+ "Format to use when displaying output:",
604
+ " #{RDoc::RI::Formatter.list}",
605
+ "Use 'bs' (backspace) with most pager",
606
+ "programs. To use ANSI, either disable the",
607
+ "pager or tell the pager to allow control",
608
+ "characters.") do |value|
609
+ options[:formatter] = RDoc::RI::Formatter.for value
610
+ end
611
+
612
+ opt.separator nil
613
+
614
+ opt.on("--doc-dir=DIRNAME", "-d", Array,
615
+ "List of directories from which to source",
616
+ "documentation in addition to the standard",
617
+ "directories. May be repeated.") do |value|
618
+ value.each do |dir|
619
+ unless File.directory? dir then
620
+ raise OptionParser::InvalidArgument, "#{dir} is not a directory"
621
+ end
622
+
623
+ options[:extra_doc_dirs] << File.expand_path(dir)
624
+ end
625
+ end
626
+
627
+ opt.separator nil
628
+
629
+ opt.on("--[no-]use-cache",
630
+ "Whether or not to use ri's cache.",
631
+ "True by default.") do |value|
632
+ options[:use_cache] = value
633
+ end
634
+
635
+ opt.separator nil
636
+
637
+ opt.on("--no-standard-docs",
638
+ "Do not include documentation from",
639
+ "the Ruby standard library, site_lib,",
640
+ "installed gems, or ~/.rdoc.",
641
+ "Equivalent to specifying",
642
+ "the options --no-system, --no-site, --no-gems,",
643
+ "and --no-home") do
644
+ options[:use_system] = false
645
+ options[:use_site] = false
646
+ options[:use_gems] = false
647
+ options[:use_home] = false
648
+ end
649
+
650
+ opt.separator nil
651
+
652
+ opt.on("--[no-]system",
653
+ "Include documentation from Ruby's standard",
654
+ "library. Defaults to true.") do |value|
655
+ options[:use_system] = value
656
+ end
657
+
658
+ opt.separator nil
659
+
660
+ opt.on("--[no-]site",
661
+ "Include documentation from libraries",
662
+ "installed in site_lib.",
663
+ "Defaults to true.") do |value|
664
+ options[:use_site] = value
665
+ end
666
+
667
+ opt.separator nil
668
+
669
+ opt.on("--[no-]gems",
670
+ "Include documentation from RubyGems.",
671
+ "Defaults to true.") do |value|
672
+ options[:use_gems] = value
673
+ end
674
+
675
+ opt.separator nil
676
+
677
+ opt.on("--[no-]home",
678
+ "Include documentation stored in ~/.rdoc.",
679
+ "Defaults to true.") do |value|
680
+ options[:use_home] = value
681
+ end
682
+
683
+ opt.separator nil
684
+
685
+ opt.on("--list-doc-dirs",
686
+ "List the directories from which ri will",
687
+ "source documentation on stdout and exit.") do
688
+ options[:list_doc_dirs] = true
689
+ end
690
+
691
+ opt.separator nil
692
+
693
+ opt.on("--no-pager", "-T",
694
+ "Send output directly to stdout,",
695
+ "rather than to a pager.") do
696
+ options[:use_stdout] = true
697
+ end
698
+
699
+ opt.on("--interactive", "-i",
700
+ "This makes ri go into interactive mode.",
701
+ "When ri is in interactive mode it will",
702
+ "allow the user to disambiguate lists of",
703
+ "methods in case multiple methods match",
704
+ "against a method search string. It also",
705
+ "will allow the user to enter in a method",
706
+ "name (with auto-completion, if readline",
707
+ "is supported) when viewing a class.") do
708
+ options[:interactive] = true
709
+ end
710
+
711
+ opt.separator nil
712
+
713
+ opt.on("--width=WIDTH", "-w", OptionParser::DecimalInteger,
714
+ "Set the width of the output.") do |value|
715
+ options[:width] = value
716
+ end
717
+ end
718
+
719
+ argv = ENV['RI'].to_s.split.concat argv
720
+
721
+ opts.parse! argv
722
+
723
+ options[:names] = argv
724
+
725
+ options[:formatter] ||= RDoc::RI::Formatter.for('plain')
726
+ options[:use_stdout] ||= !$stdout.tty?
727
+ options[:use_stdout] ||= options[:interactive]
728
+ options[:width] ||= 72
729
+
730
+ options
731
+
732
+ rescue OptionParser::InvalidArgument, OptionParser::InvalidOption => e
733
+ puts opts
734
+ puts
735
+ puts e
736
+ # exit 1
737
+ end
738
+
739
+ end
740
+
741
+
742
+ class Object
743
+ # def help
744
+ # CodeRunner.ri(self.to_s)
745
+ # end
746
+ def self.help(meth_or_const=nil)
747
+ join = ""
748
+ if meth_or_const
749
+ if self.constants.include? meth_or_const.to_sym
750
+ join = "::"
751
+ elsif self.methods.include? meth_or_const.to_sym
752
+ join = "."
753
+ elsif self.instance_methods.include? meth_or_const.to_sym
754
+ join = "#"
755
+ end
756
+ end
757
+ CodeRunner.reference("#{self.to_s}#{join}#{meth_or_const}")
758
+ end
759
+ end
760
+
761
+ class Module
762
+
763
+ def help(meth_or_const=nil)
764
+ join = ""
765
+ if meth_or_const
766
+ if self.constants.include? meth_or_const.to_sym
767
+ join = "::"
768
+ elsif self.methods.include? meth_or_const.to_sym
769
+ join = "."
770
+ elsif self.instance_methods.include? meth_or_const.to_sym
771
+ join = "#"
772
+ end
773
+ end
774
+ CodeRunner.reference("#{self.to_s}#{join}#{meth_or_const}")
775
+ end
776
+ end