Module: Bio::Shell::Ghost

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

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

#cacheObject

A hash to store temporal (per session) configurations



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

def cache
  @cache
end

#configObject

A hash to store persistent configurations



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

def config
  @config
end

Instance Method Details

#check_marshalObject

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

#close_historyObject



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

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

#closing_splashObject



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

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

#config_colorObject



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

#config_echoObject



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

#config_message(str = nil) ⇒ Object



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

#config_pager(cmd = nil) ⇒ Object



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

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

#config_showObject



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

#config_splashObject



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

#configure(savedir) ⇒ Object

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

#create_flat_dir(dbname) ⇒ Object

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

#create_real_dir(dir) ⇒ Object



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

#create_save_dirObject

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

#create_save_dir_askObject



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

#find_flat_dir(dbname) ⇒ Object



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

#load_configObject

config



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

def load_config
  load_config_file(config_file)
end

#load_config_file(file) ⇒ Object



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

#load_historyObject



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

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

#load_history_file(file) ⇒ Object



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

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

#load_objectObject



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

#load_object_file(file) ⇒ Object



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

#load_pluginObject

plugin



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

def load_plugin
  load_plugin_dir(plugin_dir)
end

#load_plugin_dir(dir) ⇒ Object



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

#load_sessionObject



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

#open_historyObject

history



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

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

#opening_splashObject



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

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.join(".")}"
  STDERR.print " / Ruby #{RUBY_VERSION}"
  STDERR.puts
  STDERR.puts
end

#save_configObject



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

def save_config
  save_config_file(config_file)
end

#save_config_file(file) ⇒ Object



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

#save_historyObject

not used (use open_history/close_history instead)



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

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

#save_history_file(file) ⇒ Object



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

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

#save_objectObject



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

def save_object
  save_object_file(object_file)
end

#save_object_file(file) ⇒ Object



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
# 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 -= ["_"]
      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

#save_scriptObject



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

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

#save_script_file(file) ⇒ Object



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

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

#save_sessionObject



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

#script(mode = nil) ⇒ Object

script



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

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

#script_beginObject



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

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

#script_endObject



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

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

#splash_messageObject

splash



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

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

#splash_message_action(message = nil) ⇒ Object



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

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

#splash_message_action_color(message = nil) ⇒ Object



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

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

#splash_message_colorObject



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

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

#store_history(line) ⇒ Object



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

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