--- /dev/null
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+'''
+@author: Frank Brehm
+@contact: frank@brehm-online.com
+@copyright: (c) 2010-2011 by Frank Brehm, Berlin
+@license: GPL3
+@version: 0.0.2
+@summary: This module handle all getopt stuff
+'''
+
+__author__ = 'Frank Brehm <frank@brehm-online.com>'
+__copyright__ = '(C) 2010 by Frank Brehm, Berlin'
+__version__ = '0.0.2'
+
+import os
+import sys
+
+from optparse import OptionError
+from optparse import OptionParser
+from optparse import OptionConflictError
+
+class BaseOptParser(object):
+ '''
+ This is the base class for Option Parsing. All other getopts classes should
+ derived from this class. This class adds the default cmd named options like
+ '--test' and '--verbose'.
+ It implements also all callback functions/methods - so no class has to
+ write its own callback and every callback is reusable for every class.
+ @author: Robin Wittler / Frank Brehm
+ @contact: robin.wittler@profitbricks.com / frank@brehm-online.com
+ '''
+
+ #---------------------------------------------------------------------
+ def __init__( self, prog = '%prog',
+ version = None,
+ description = '',
+ usage = 'Usage: %s [options]',
+ test_option = False
+ ):
+ '''
+ Costructor.
+ @param prog: The name of the calling process (e.g. sys.argv[0])
+ @type prog: str
+ @param version: The version string to use
+ @type version: str
+ @param description: The Description the process should use
+ @type description: str
+ @param usage: An usage string fro the help screen, must have a '%s' for the program name
+ @type usage: str
+ @param test_option: should a test/simulate option be created? - default False
+ @type test_option: boolean
+ @return: None
+ '''
+
+ self.prog = prog
+ self.version = version
+ self.description = description
+ self.usage = usage %(prog)
+
+ self.options = None
+ self.args = None
+ self.__options_set = False
+ self.__action_set = None
+ self.parsed = False
+
+ self.parser = OptionParser(
+ prog = self.prog,
+ version = self.version,
+ description = self.description,
+ usage = self.usage
+ )
+
+ if test_option:
+ self.addOption(
+ '--simulate',
+ '--test',
+ '-T',
+ default = False,
+ action = 'store_true',
+ dest = 'test',
+ help = 'set this do simulate commands'
+ )
+
+ self.addOption(
+ '--verbose',
+ '-v',
+ default = False,
+ action = 'count',
+ dest = 'verbose',
+ help = 'set the verbosity level'
+ )
+
+ #----------------------------------------------------------------------
+ def getOpts(self):
+ '''
+ The baseimplentation of getOpts. It ensures that evry class
+ which derived from the base class have to call the 'addOption'
+ method first to add some options.
+ @return: None
+ '''
+ if not self.__options_set:
+ raise RuntimeError(
+ 'You must call addOption first.'
+ )
+ if not self.parsed:
+ self.options, self.args = self.parser.parse_args()
+ self.parsed = True
+
+ #----------------------------------------------------------------------
+ def addOption(self, *targs, **kwargs):
+ '''
+ This Method adds the options to the parser instance.
+ @param targs: The getopts cmd param names (e.g. '--help', '-h')
+ @type targs: tuple
+ @param kwargs: The named getopts options (e.g. 'dest', 'help',
+ 'callback')
+ @type kwargs: dict
+ @return: None
+ @rtype: None
+ '''
+ self.parser.add_option(*targs, **kwargs)
+ if not self.__options_set:
+ self.__options_set = True
+
+ #----------------------------------------------------------------------
+ def setBaseOptionHelp( self, option_name, option_help ):
+ '''This method sets the help text of the named option.
+ @param option_name: The name of the option to change
+ @type option_name: str
+ @param option_help: The new option help text
+ @type option_help: str
+ @return: None
+ @rtype: None
+ '''
+
+ if not len(option_name):
+ raise SyntaxError( "empty option name given." )
+
+ as_long_option = True
+ if len(option_name) == 1: as_long_option = False
+
+ for option in self.parser.option_list:
+ opt_found = False
+ if as_long_option:
+ o = '--' + option_name
+ for opt in option._long_opts:
+ if o == opt:
+ opt_found = True
+ break
+ else:
+ o = '-' + option_name
+ for opt in option._short_opts:
+ if o == opt:
+ opt_found = True
+ break
+ if opt_found:
+ option.help = option_help
+ break
+
+ #---------------------------------------------------------------------
+
+
+
+# vim: fileencoding=utf-8 filetype=python ts=4 expandtab
--- /dev/null
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+'''
+@author: Frank Brehm
+@contact: frank@brehm-online.com
+@copyright: (c) 2010-2011 by Frank Brehm, Berlin
+@license: GPL3
+@version: 0.0.1
+@summary: This module includes the base logging object
+'''
+
+__author__ = 'Frank Brehm <frank@brehm-online.com>'
+__copyright__ = '(C) 2010 by Frank Brehm, Berlin'
+__contact__ = 'frank@brehm-online.com'
+__version__ = '0.0.1'
+__license__ = 'GPL3'
+
+import logging
+
+class LoggingObject(object):
+ """Base object with a verbose level and a logging facility.
+ """
+
+ #------------------------------------------------------
+ def __init__( self, verbose = 0, logger = None ):
+ """Constructor.
+ @param verbose: verbosity level (default: 0)
+ @type verbose: int
+ @param logger: a logger object for debugging a.s.o., will be created, if None
+ @type logger: a logging.Logger object or None
+ @return: None
+ @rtype: None
+ """
+
+ if not isinstance( verbose, int ):
+ raise Exception( "verbose is not an integer object" )
+
+ self.verbose = verbose
+
+ # Logging-Setup
+ if logger is None:
+ base_logger = self.init_base_logger()
+ self.logger = self.init_logger(base_logger)
+ elif isinstance( logger, logging.Logger ):
+ self.logger = self.init_logger( logger )
+ elif isinstance( logger, logging.LoggerAdapter ):
+ self.logger = logger
+ raise "self.logger is not a Logger or LoggerAdapter object"
+
+ #------------------------------------------------------
+ def init_logger( self, logger ):
+ """Initializes a LoggerAdapter object and returns it.
+ @param logger: a logger object for debugging a.s.o., will be created, if None
+ @type logger: a logging.Logger object or None
+ @return: None
+ @rtype: None
+ """
+
+ new_logger = logging.LoggerAdapter( logger, { 'class_name': self.__class__.__name__ } )
+
+ return new_logger
+
+ #------------------------------------------------------
+ def init_base_logger( self, logger_name = 'base_logger' ):
+ """Initializes a logger object and returns it, maybe overwritten.
+ @param logger_name: The name of the logging object
+ @type logger_name: str
+ @return: logger object
+ @rtype: logging.Logger
+ """
+
+ # Logging-Setup
+ loglevel = logging.WARNING
+ logformat = '%(levelname)s: %(message)s'
+ if self.verbose == 1:
+ loglevel = logging.INFO
+ elif self.verbose > 1:
+ loglevel = logging.DEBUG
+ logformat = '%(class_name)s - %(module)s.%(funcName)s(%(lineno)d) - %(levelname)s: %(message)s'
+
+ base_logger = logging.getLogger(logger_name)
+ base_logger.setLevel(loglevel)
+
+ ch = logging.StreamHandler()
+ ch.setLevel(loglevel)
+
+ formatter = logging.Formatter(logformat)
+ ch.setFormatter(formatter)
+
+ base_logger.addHandler(ch)
+
+ return base_logger
+
+#-------------------------------------------------------------------------------------------------
+
+# vim: fileencoding=utf-8 filetype=python ts=4 expandtab