class Copycats::Tool

Public Instance Methods

run( args ) click to toggle source
# File lib/copycats/tool.rb, line 7
def run( args )
  opts = {}

  parser = OptionParser.new do |cmd|
    cmd.banner = "Usage: kitty [options]"

    cmd.separator ""
    cmd.separator "  Database options:"

    cmd.on("-n", "--dbname=NAME", "Database name (default: kitties.db)") do |name|
      opts[:db_name] = name
    end

    cmd.on("-d", "--dbpath=PATH", "Database path (default: .)") do |path|
      opts[:db_path] = path
    end

    cmd.separator ""
    cmd.separator "  Data options:"

    cmd.on("-i", "--include=DIR", "Data directory (default: ./data for in-memory queries and . for setup)") do |name|
      opts[:data_dir] = name
    end

    cmd.separator ""
    cmd.separator "  General options:"

    cmd.on("-h", "--help", "Prints this help") do
      puts cmd
      exit
    end
  end

  parser.parse!( args )
  pp opts
  pp args


  db_path = opts[:db_path] || '.'
  db_name = opts[:db_name] || 'kitties.db'
  database = "#{db_path}/#{db_name}"


  if args.size == 1 && args[0] == 'setup'   ## setup database
    connect( adapter: 'sqlite3',
             database: database )

    setup_db
    setup_traits  # note: also builds TRAIT_IDS_CACHE for read_datafiles for now

    data_dir = opts[:data_dir] || '.'    ## for setup assume local dir for data
    read_datafiles( data_dir: data_dir )
  else
    ## check if (local) database exists?
    if File.exist?( database )   ##   if yes, use "cached" local database
      connect( adapter: 'sqlite3',
               database: database )
    else                         ##  otherwise use (new) on-demand in-memory database
      puts "note: database >#{database}<; setting up in-memory database"
      connect( adapter:  'sqlite3',
               database: ':memory:' )

      setup_db
      setup_traits  # note: also builds TRAIT_IDS_CACHE for read_datafiles for now

      data_dir = opts[:data_dir] || './data'
      read_datafiles( data_dir: data_dir )
    end



    if args.size == 1
      id = args[0].to_i
      kitty = Copycats::Model::Kitty.find( id )

      ## pp kitty
      ## pp kitty.genes
      ## pp kitty.body
      ## pp kitty.pattern
      ## pp kitty.genes.to_a

      buf = KittyReport.new( kitty ).build

      puts buf
    elsif args.size == 2
      matron_id = args[0].to_i
      sire_id   = args[1].to_i

      matron = Copycats::Model::Kitty.find( matron_id )
      sire   = Copycats::Model::Kitty.find( sire_id )
      ## pp matron

      buf = MixReport.new( matron, sire ).build

      puts buf
    else
      puts "error: too many arguments (expected setup or one or two kitty ids / names / genes)"
    end
  end
end