228 lines
5.6 KiB
Python
228 lines
5.6 KiB
Python
|
#!/usr/local/bin/python3.4
|
||
|
'''
|
||
|
obi -- shortdesc
|
||
|
|
||
|
obi is a description
|
||
|
|
||
|
It defines classes_and_methods
|
||
|
|
||
|
@author: user_name
|
||
|
|
||
|
@copyright: 2014 organization_name. All rights reserved.
|
||
|
|
||
|
@license: license
|
||
|
|
||
|
@contact: user_email
|
||
|
@deffield updated: Updated
|
||
|
'''
|
||
|
|
||
|
import sys
|
||
|
import pkgutil
|
||
|
import argparse
|
||
|
import logging
|
||
|
import json
|
||
|
|
||
|
default_config = {
|
||
|
|
||
|
'obi' : { 'log' : True,
|
||
|
'loglevel' : 'INFO',
|
||
|
'version' : False,
|
||
|
'progress' : True
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
from obitools3 import command
|
||
|
from obitools3.version import version
|
||
|
|
||
|
__all__ = []
|
||
|
__version__ = version
|
||
|
__date__ = '2014-09-28'
|
||
|
__updated__ = '2014-09-28'
|
||
|
|
||
|
DEBUG = 1
|
||
|
TESTRUN = 0
|
||
|
PROFILE = 0
|
||
|
|
||
|
|
||
|
|
||
|
def loadCommand(name,loader):
|
||
|
'''
|
||
|
Load a command module from its name and an ImpLoader
|
||
|
|
||
|
This function is for internal use
|
||
|
|
||
|
@param name: name of the module
|
||
|
@type name: str
|
||
|
@param loader: the module loader
|
||
|
@type loader: ImpLoader
|
||
|
|
||
|
@return the loaded module
|
||
|
@rtype: module
|
||
|
'''
|
||
|
|
||
|
module = loader.find_module(name).load_module(name)
|
||
|
return module
|
||
|
|
||
|
def getCommandsList():
|
||
|
'''
|
||
|
Returns the list of sub-commands available to the main `obi` command
|
||
|
|
||
|
@return: a dict instance with key corresponding to each command and
|
||
|
value corresponding to the module
|
||
|
|
||
|
@rtype: dict
|
||
|
'''
|
||
|
cmds = dict((x[1],loadCommand(x[1],x[0]))
|
||
|
for x in pkgutil.iter_modules(command.__path__)
|
||
|
if not x[2])
|
||
|
return cmds
|
||
|
|
||
|
def getLogger(config):
|
||
|
'''
|
||
|
Returns the logger as defined by the command line option
|
||
|
or by the config file
|
||
|
:param config:
|
||
|
'''
|
||
|
|
||
|
output = config['obi']['outputfilename']
|
||
|
level = config['obi']['loglevel']
|
||
|
logfile= config['obi']['log']
|
||
|
|
||
|
rootlogger = logging.getLogger()
|
||
|
logFormatter = logging.Formatter("%(asctime)s [%(levelname)-5.5s] %(message)s")
|
||
|
|
||
|
stderrHandler = logging.StreamHandler(sys.stderr)
|
||
|
stderrHandler.setFormatter(logFormatter)
|
||
|
|
||
|
rootlogger.addHandler(stderrHandler)
|
||
|
|
||
|
if logfile:
|
||
|
fileHandler = logging.FileHandler("%s.log" % output)
|
||
|
fileHandler.setFormatter(logFormatter)
|
||
|
rootlogger.addHandler(fileHandler)
|
||
|
|
||
|
try:
|
||
|
loglevel = getattr(logging, level)
|
||
|
except:
|
||
|
loglevel = logging.INFO
|
||
|
|
||
|
rootlogger.setLevel(loglevel)
|
||
|
|
||
|
config['obi']['logger']=rootlogger
|
||
|
|
||
|
return rootlogger
|
||
|
|
||
|
|
||
|
class ObiParser(argparse.ArgumentParser):
|
||
|
def error(self, message):
|
||
|
sys.stderr.write('error: %s\n' % message)
|
||
|
self.print_help()
|
||
|
sys.exit(2)
|
||
|
|
||
|
def buildArgumentParser():
|
||
|
parser = ObiParser()
|
||
|
|
||
|
parser.add_argument('--version', dest='obi:version',
|
||
|
action='store_true',
|
||
|
default=False,
|
||
|
help='Print the version of the OBITools')
|
||
|
|
||
|
parser.add_argument('--no-log', dest='obi:log',
|
||
|
action='store_false',
|
||
|
default=None,
|
||
|
help='Do not create a logfile for the data analyze')
|
||
|
|
||
|
parser.add_argument('--no-progress', dest='obi:progress',
|
||
|
action='store_false',
|
||
|
default=None,
|
||
|
help='Do not print the progress bar during analyzes')
|
||
|
|
||
|
subparsers = parser.add_subparsers(title='subcommands',
|
||
|
description='valid subcommands',
|
||
|
help='additional help')
|
||
|
|
||
|
commands = getCommandsList()
|
||
|
|
||
|
for c in commands:
|
||
|
module = commands[c]
|
||
|
|
||
|
if hasattr(module, "run"):
|
||
|
if hasattr(module, "__title__"):
|
||
|
sub = subparsers.add_parser(c,help=module.__title__)
|
||
|
else:
|
||
|
sub = subparsers.add_parser(c)
|
||
|
|
||
|
if hasattr(module, "addOptions"):
|
||
|
module.addOptions(sub)
|
||
|
|
||
|
sub.set_defaults(**{'obi:module' : module})
|
||
|
|
||
|
return parser
|
||
|
|
||
|
def buildDefaultConfiguration():
|
||
|
global default_config
|
||
|
|
||
|
commands = getCommandsList()
|
||
|
|
||
|
for c in commands:
|
||
|
module = commands[c]
|
||
|
|
||
|
assert hasattr(module, "run")
|
||
|
|
||
|
if hasattr(module, 'default_config'):
|
||
|
default_config[c]=module.default_config
|
||
|
else:
|
||
|
default_config[c]={}
|
||
|
|
||
|
return default_config
|
||
|
|
||
|
|
||
|
def getConfiguration():
|
||
|
global default_config
|
||
|
|
||
|
if '__done__' in default_config:
|
||
|
return default_config
|
||
|
|
||
|
parser = buildArgumentParser()
|
||
|
options = vars(parser.parse_args())
|
||
|
|
||
|
config = buildDefaultConfiguration()
|
||
|
|
||
|
|
||
|
for k in options:
|
||
|
section,key = k.split(':')
|
||
|
s = config[section]
|
||
|
if options[k] is not None:
|
||
|
s[key]=options[k]
|
||
|
|
||
|
if config['obi']['version']:
|
||
|
print("The OBITools - Version %s" % __version__)
|
||
|
sys.exit(0)
|
||
|
|
||
|
if not 'module' in config['obi']:
|
||
|
print('\nError: No obi command specified',file=sys.stderr)
|
||
|
parser.print_help()
|
||
|
sys.exit(2)
|
||
|
|
||
|
|
||
|
if config['obi']['outputfilename'] is None:
|
||
|
config['obi']['outputfilename']=config['obi']['indexfilename']
|
||
|
|
||
|
getLogger(config)
|
||
|
|
||
|
config['__done__']=True
|
||
|
|
||
|
return config
|
||
|
|
||
|
|
||
|
if __name__ =="__main__":
|
||
|
|
||
|
config = getConfiguration()
|
||
|
|
||
|
config['obi']['module'].run(config)
|
||
|
|
||
|
|
||
|
|