Module: Bio::Shell::Ghost

Includes:
Core
Included in:
Bio::Shell
Defined in:
lib/bio/shell/core.rb

Constant Summary

Constant Summary

Constants included from Core

Core::BIOFLAT, Core::CONFIG, Core::DATADIR, Core::ESC_SEQ, Core::HISTORY, Core::MARSHAL, Core::MESSAGE, Core::OBJECT, Core::PLUGIN, Core::SCRIPT, Core::SESSION, Core::SHELLDIR

Instance Attribute Summary (collapse)

Instance Method Summary (collapse)

Methods included from Core

#ask_yes_or_no, #bioflat_dir, #colors, #config_file, #data_dir, #history_file, #object_file, #plugin_dir, #script_dir, #script_file, #session_dir, #shell_dir

Instance Attribute Details

- (Object) cache

A hash to store temporal (per session) configurations



111
112
113
# File 'lib/bio/shell/core.rb', line 111

def cache
  @cache
end

- (Object) config

A hash to store persistent configurations



108
109
110
# File 'lib/bio/shell/core.rb', line 108

def config
  @config
end

Instance Method Details

- (Object) check_marshal

object



299
300
301
302
303
# File 'lib/bio/shell/core.rb', line 299

def check_marshal
  if @config[:marshal] and @config[:marshal] != MARSHAL
    raise "Marshal version mismatch"
  end
end

- (Object) close_history



382
383
384
385
386
387
388
# File 'lib/bio/shell/core.rb', line 382

def close_history
  if @cache[:histfile]
    STDERR.print "Saving history (#{history_file}) ... "
    @cache[:histfile].close
    STDERR.puts "done"
  end
end

- (Object) closing_splash



566
567
568
569
570
571
572
573
574
575
576
# File 'lib/bio/shell/core.rb', line 566

def closing_splash
  STDERR.puts
  STDERR.puts
  if @config[:color]
    STDERR.print splash_message_color
  else
    STDERR.print splash_message
  end
  STDERR.puts
  STDERR.puts
end

- (Object) config_color



251
252
253
254
255
256
257
258
259
260
261
262
# File 'lib/bio/shell/core.rb', line 251

def config_color
  bind = Bio::Shell.cache[:binding]
  flag = ! @config[:color]
  @config[:color] = flag
  if flag
    IRB.conf[:PROMPT_MODE] = :BIORUBY_COLOR
    eval("conf.prompt_mode = :BIORUBY_COLOR", bind)
  else
    IRB.conf[:PROMPT_MODE] = :BIORUBY
    eval("conf.prompt_mode = :BIORUBY", bind)
  end
end

- (Object) config_echo



243
244
245
246
247
248
249
# File 'lib/bio/shell/core.rb', line 243

def config_echo
  bind = Bio::Shell.cache[:binding]
  flag = ! @config[:echo]
  @config[:echo] = IRB.conf[:ECHO] = flag
  eval("conf.echo = #{flag}", bind)
  STDERR.puts "Echo #{flag ? 'on' : 'off'}"
end

- (Object) config_message(str = nil)



275
276
277
278
279
# File 'lib/bio/shell/core.rb', line 275

def config_message(str = nil)
  str ||= MESSAGE
  @config[:message] = str
  opening_splash
end

- (Object) config_pager(cmd = nil)



264
265
266
# File 'lib/bio/shell/core.rb', line 264

def config_pager(cmd = nil)
  @config[:pager] = cmd
end

- (Object) config_show



237
238
239
240
241
# File 'lib/bio/shell/core.rb', line 237

def config_show
  @config.each do |k, v|
    STDERR.puts "#{k}\t= #{v.inspect}"
  end
end

- (Object) config_splash



268
269
270
271
272
273
# File 'lib/bio/shell/core.rb', line 268

def config_splash
  flag = ! @config[:splash]
  @config[:splash] = flag
  STDERR.puts "Splash #{flag ? 'on' : 'off'}"
  opening_splash
end

- (Object) configure(savedir)

save/restore the environment



115
116
117
118
119
120
121
122
123
124
# File 'lib/bio/shell/core.rb', line 115

def configure(savedir)
  @config = {}
  @cache  = {
    :savedir => savedir,
    :workdir => Dir.pwd,
  }
  create_save_dir
  load_config
  load_plugin
end

- (Object) create_flat_dir(dbname)

bioflat



188
189
190
191
192
193
194
# File 'lib/bio/shell/core.rb', line 188

def create_flat_dir(dbname)
  dir = File.join(bioflat_dir, dbname.to_s.strip)
  unless File.directory?(dir)
    FileUtils.makedirs(dir)
  end
  return dir
end

- (Object) create_real_dir(dir)



174
175
176
177
178
179
180
181
182
183
184
# File 'lib/bio/shell/core.rb', line 174

def create_real_dir(dir)
  unless File.directory?(dir)
    begin
      STDERR.print "Creating directory (#{dir}) ... "
      FileUtils.makedirs(dir)
      STDERR.puts "done"
    rescue
      warn "Error: Failed to create directory (#{dir}) : #{$!}"
    end
  end
end

- (Object) create_save_dir

directories



150
151
152
153
154
# File 'lib/bio/shell/core.rb', line 150

def create_save_dir
  create_real_dir(session_dir)
  create_real_dir(plugin_dir)
  create_real_dir(data_dir)
end

- (Object) create_save_dir_ask



156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# File 'lib/bio/shell/core.rb', line 156

def create_save_dir_ask
  if File.directory?(session_dir)
    @cache[:save] = true
  end
  unless @cache[:save]
    if ask_yes_or_no("Save session in '#{@cache[:workdir]}' directory? [y/n] ")
      create_real_dir(session_dir)
      create_real_dir(plugin_dir)
      create_real_dir(data_dir)
      create_real_dir(bioflat_dir)
      @cache[:save] = true
    else
      @cache[:save] = false
    end
  end
  return @cache[:save]
end

- (Object) find_flat_dir(dbname)



196
197
198
199
200
201
202
203
# File 'lib/bio/shell/core.rb', line 196

def find_flat_dir(dbname)
  dir = File.join(bioflat_dir, dbname.to_s.strip)
  if File.exists?(dir)
    return dir
  else
    return nil
  end
end

- (Object) load_config

config



207
208
209
# File 'lib/bio/shell/core.rb', line 207

def load_config
  load_config_file(config_file)
end

- (Object) load_config_file(file)



211
212
213
214
215
216
217
218
219
# File 'lib/bio/shell/core.rb', line 211

def load_config_file(file)
  if File.exists?(file)
    STDERR.print "Loading config (#{file}) ... "
    if hash = YAML.load(File.read(file))
      @config.update(hash)
    end
    STDERR.puts "done"
  end
end

- (Object) load_history



390
391
392
393
394
# File 'lib/bio/shell/core.rb', line 390

def load_history
  if @cache[:readline]
    load_history_file(history_file)
  end
end

- (Object) load_history_file(file)



396
397
398
399
400
401
402
403
404
405
406
# File 'lib/bio/shell/core.rb', line 396

def load_history_file(file)
  if File.exists?(file)
    STDERR.print "Loading history (#{file}) ... "
    File.open(file).each do |line|
      unless line[/^# /]
        Readline::HISTORY.push line.chomp
      end
    end
    STDERR.puts "done"
  end
end

- (Object) load_object



305
306
307
308
309
310
311
312
# File 'lib/bio/shell/core.rb', line 305

def load_object
  begin
    check_marshal
    load_object_file(object_file)
  rescue
    warn "Error: Load aborted : #{$!}"
  end
end

- (Object) load_object_file(file)



314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
# File 'lib/bio/shell/core.rb', line 314

def load_object_file(file)
  if File.exists?(file)
    STDERR.print "Loading object (#{file}) ... "
    begin
      bind = Bio::Shell.cache[:binding]
      hash = Marshal.load(File.read(file))
      hash.each do |k, v|
        begin
          Thread.current[:restore_value] = v
          eval("#{k} = Thread.current[:restore_value]", bind)
        rescue
          STDERR.puts "Warning: object '#{k}' couldn't be loaded : #{$!}"
        end
      end
    rescue
      warn "Error: Failed to load (#{file}) : #{$!}"
    end
    STDERR.puts "done"
  end
end

- (Object) load_plugin

plugin



283
284
285
# File 'lib/bio/shell/core.rb', line 283

def load_plugin
  load_plugin_dir(plugin_dir)
end

- (Object) load_plugin_dir(dir)



287
288
289
290
291
292
293
294
295
# File 'lib/bio/shell/core.rb', line 287

def load_plugin_dir(dir)
  if File.directory?(dir)
    Dir.glob("#{dir}/*.rb").sort.each do |file|
      STDERR.print "Loading plugin (#{file}) ... "
      load file
      STDERR.puts "done"
    end
  end
end

- (Object) load_session



126
127
128
129
130
131
132
133
# File 'lib/bio/shell/core.rb', line 126

def load_session
  load_object
  unless @cache[:mode] == :script
    load_history
    opening_splash
    open_history
  end
end

- (Object) open_history

history



372
373
374
375
# File 'lib/bio/shell/core.rb', line 372

def open_history
  @cache[:histfile] = File.open(history_file, "a")
  @cache[:histfile].sync = true
end

- (Object) opening_splash



544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
# File 'lib/bio/shell/core.rb', line 544

def opening_splash
  STDERR.puts
  if @config[:splash]
    if @config[:color]
      splash_message_action_color
    else
      splash_message_action
    end
  end
  if @config[:color]
    STDERR.print splash_message_color
  else
    STDERR.print splash_message
  end
  STDERR.puts
  STDERR.puts
  STDERR.print "  Version : BioRuby #{Bio::BIORUBY_VERSION_ID}"
  STDERR.print " / Ruby #{RUBY_VERSION}"
  STDERR.puts
  STDERR.puts
end

- (Object) save_config



221
222
223
# File 'lib/bio/shell/core.rb', line 221

def save_config
  save_config_file(config_file)
end

- (Object) save_config_file(file)



225
226
227
228
229
230
231
232
233
234
235
# File 'lib/bio/shell/core.rb', line 225

def save_config_file(file)
  begin
    STDERR.print "Saving config (#{file}) ... "
    File.open(file, "w") do |f|
      f.puts @config.to_yaml
    end
    STDERR.puts "done"
  rescue
    warn "Error: Failed to save (#{file}) : #{$!}"
  end
end

- (Object) save_history

not used (use open_history/close_history instead)



409
410
411
412
413
# File 'lib/bio/shell/core.rb', line 409

def save_history
  if @cache[:readline]
    save_history_file(history_file)
  end
end

- (Object) save_history_file(file)



415
416
417
418
419
420
421
422
423
424
425
# File 'lib/bio/shell/core.rb', line 415

def save_history_file(file)
  begin
    STDERR.print "Saving history (#{file}) ... "
    File.open(file, "w") do |f|
      f.puts Readline::HISTORY.to_a
    end
    STDERR.puts "done"
  rescue
    warn "Error: Failed to save (#{file}) : #{$!}"
  end
end

- (Object) save_object



335
336
337
# File 'lib/bio/shell/core.rb', line 335

def save_object
  save_object_file(object_file)
end

- (Object) save_object_file(file)



339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
# File 'lib/bio/shell/core.rb', line 339

def save_object_file(file)
  begin
    STDERR.print "Saving object (#{file}) ... "
    File.rename(file, "#{file}.old") if File.exist?(file)
    File.open(file, "w") do |f|
      bind = Bio::Shell.cache[:binding]
      list = eval("local_variables", bind)
      list.collect! { |x| x.to_s }
      list -= ["_"]
      hash = {}
      list.each do |elem|
        value = eval(elem, bind)
        if value
          begin
            Marshal.dump(value)
            hash[elem] = value
          rescue
            # value could not be dumped.
          end
        end
      end
      Marshal.dump(hash, f)
      @config[:marshal] = MARSHAL
    end
    STDERR.puts "done"
  rescue
    File.rename("#{file}.old", file) if File.exist?("#{file}.old")
    warn "Error: Failed to save (#{file}) : #{$!}"
  end
end

- (Object) save_script



460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
# File 'lib/bio/shell/core.rb', line 460

def save_script
  if @script_begin and @script_end and @script_begin <= @script_end
    if File.exists?(script_file)
      message = "Overwrite script file (#{script_file})? [y/n] "
    else
      message = "Save script file (#{script_file})? [y/n] "
    end
    if ask_yes_or_no(message)
      save_script_file(script_file)
    else
      STDERR.puts " ... save aborted."
    end
  elsif @script_begin and @script_end and @script_begin - @script_end == 1
    STDERR.puts " ... script aborted."
  else
    STDERR.puts "Error: Script range #{@script_begin}..#{@script_end} is invalid"
  end
end

- (Object) save_script_file(file)



479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
# File 'lib/bio/shell/core.rb', line 479

def save_script_file(file)
  begin
    STDERR.print "Saving script (#{file}) ... "
    File.open(file, "w") do |f|
      f.puts "#!/usr/bin/env bioruby"
      f.puts
      f.puts Readline::HISTORY.to_a[@script_begin..@script_end]
      f.puts
    end
    STDERR.puts "done"
  rescue
    @script_begin = nil
    warn "Error: Failed to save (#{file}) : #{$!}"
  end
end

- (Object) save_session



135
136
137
138
139
140
141
142
143
144
145
146
# File 'lib/bio/shell/core.rb', line 135

def save_session
  unless @cache[:mode] == :script
    closing_splash
  end
  if create_save_dir_ask
    #save_history	# changed to use our own...
    close_history
    save_object
    save_config
  end
  #STDERR.puts "Leaving directory '#{@cache[:workdir]}'"
end

- (Object) script(mode = nil)

script



429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
# File 'lib/bio/shell/core.rb', line 429

def script(mode = nil)
  case mode
  when :begin, "begin", :start, "start"
    @cache[:script] = true
    script_begin
  when :end, "end", :stop, "stop"
    @cache[:script] = false
    script_end
    save_script
  else
    if @cache[:script]
      @cache[:script] = false
      script_end
      save_script
    else
      @cache[:script] = true
      script_begin
    end
  end
end

- (Object) script_begin



450
451
452
453
# File 'lib/bio/shell/core.rb', line 450

def script_begin
  STDERR.puts "-- 8< -- 8< -- 8< --  Script  -- 8< -- 8< -- 8< --"
  @script_begin = Readline::HISTORY.size
end

- (Object) script_end



455
456
457
458
# File 'lib/bio/shell/core.rb', line 455

def script_end
  STDERR.puts "-- >8 -- >8 -- >8 --  Script  -- >8 -- >8 -- >8 --"
  @script_end = Readline::HISTORY.size - 2
end

- (Object) splash_message

splash



497
498
499
500
# File 'lib/bio/shell/core.rb', line 497

def splash_message
  @config[:message] ||= MESSAGE
  @config[:message].to_s.split(//).join(" ")
end

- (Object) splash_message_action(message = nil)



509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
# File 'lib/bio/shell/core.rb', line 509

def splash_message_action(message = nil)
  s = message || splash_message
  l = s.length
  x = " "
  0.step(l,2) do |i|
    l1 = l-i;  l2 = l1/2;  l4 = l2/2
    STDERR.print "#{s[0,i]}#{x*l1}#{s[i,1]}\r"
    sleep(0.001)
    STDERR.print "#{s[0,i]}#{x*l2}#{s[i,1]}#{x*(l1-l2)}\r"
    sleep(0.002)
    STDERR.print "#{s[0,i]}#{x*l4}#{s[i,1]}#{x*(l2-l4)}\r"
    sleep(0.004)
    STDERR.print "#{s[0,i+1]}#{x*l4}\r"
    sleep(0.008)
  end
end

- (Object) splash_message_action_color(message = nil)



526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
# File 'lib/bio/shell/core.rb', line 526

def splash_message_action_color(message = nil)
  s = message || splash_message
  l = s.length
  c = colors
  x = " "
  0.step(l,2) do |i|
    l1 = l-i;  l2 = l1/2;  l4 = l2/2
    STDERR.print "#{c[:n]}#{s[0,i]}#{x*l1}#{c[:y]}#{s[i,1]}\r"
    sleep(0.001)
    STDERR.print "#{c[:n]}#{s[0,i]}#{x*l2}#{c[:g]}#{s[i,1]}#{x*(l1-l2)}\r"
    sleep(0.002)
    STDERR.print "#{c[:n]}#{s[0,i]}#{x*l4}#{c[:r]}#{s[i,1]}#{x*(l2-l4)}\r"
    sleep(0.004)
    STDERR.print "#{c[:n]}#{s[0,i+1]}#{x*l4}\r"
    sleep(0.008)
  end
end

- (Object) splash_message_color



502
503
504
505
506
507
# File 'lib/bio/shell/core.rb', line 502

def splash_message_color
  str = splash_message
  ruby = colors[:ruby]
  none = colors[:none]
  return str.sub(/R u b y/) { "#{ruby}R u b y#{none}" }
end

- (Object) store_history(line)



377
378
379
380
# File 'lib/bio/shell/core.rb', line 377

def store_history(line)
  Bio::Shell.cache[:histfile].puts "# #{Time.now}"
  Bio::Shell.cache[:histfile].puts line
end