Esempio n. 1
0
    def __init__(self,name=None,description=None,epilog=None,debug_flag=True,subcommands=False):
        self.name = os.path.basename(sys.argv[0])
        setproctitle('%s %s' % (self.name,' '.join(sys.argv[1:])))
        signal.signal(signal.SIGINT, self.SIGINT)

        reload(sys)
        sys.setdefaultencoding('utf-8')

        if name is None:
            name = self.name

        # Set to True to avoid any messages from self.message to be printed
        self.silent = False

        self.logger = Logger(self.name)
        self.log = self.logger.default_stream

        self.parser = argparse.ArgumentParser(
            prog=name,
            description=description,
            epilog=epilog,
            add_help=True,
            conflict_handler='resolve',
        )
        if debug_flag:
            self.parser.add_argument('--debug',action='store_true',help='Show debug messages')

        if subcommands:
            self.commands = {}
            self.command_parsers = self.parser.add_subparsers(
                dest='command', help='Please select one command mode below',
                title='Command modes'
            )
Esempio n. 2
0
class NoseTestCase(object):
    def __init__(self,suite,node):
        self.log = Logger('nosepicker').default_stream
        self.suite = suite
        self.node = node

        self.skipped = [node for node in self.node.xpath('skipped')]
        self.errors = [NoseTestError(self,node) for node in self.node.xpath('error')]
        self.failures = [NoseTestError(self,node) for node in self.node.xpath('failure')]

        for node in self.node:
            if node.tag not in ('error','failure','skipped'):
                self.log.debug('UNEXPECTED: %s' % ET.tostring(node))
                raise ValueError('Unexpected testcase child element: %s' % node.tag)

    def __hash__(self):
        return '%s %s' % (self.classname,self.name)

    def __repr__(self):
        self.log.debug('%8s %s: %d errors %d failures %d skipped' % (
            self.status,self.name,len(self.errors),len(self.failures),len(self.errors)
        ))
        if not self.short_classnames:
            return '%-7s %-40s %s' % (self.status,self.classname,self.name)
        else:
            return '%-7s %-40s %s' % (self.status,self.testclass,self.name)

    @property
    def short_classnames(self):
        return self.suite.short_classnames

    @property
    def status(self):
        if len(self.failures):
            return 'FAILURE'
        elif len(self.errors):
            return 'ERROR'
        elif len(self.skipped):
            return 'SKIP'
        else:
            return 'OK'

    @property
    def time(self):
        return float(self.node.get('time'))

    @property
    def testclass(self):
        return self.node.get('classname').split('.')[0]

    @property
    def classname(self):
        return self.node.get('classname')

    @property
    def name(self):
        return self.node.get('name')
Esempio n. 3
0
    def __init__(self,suite,node):
        self.log = Logger('nosepicker').default_stream
        self.suite = suite
        self.node = node

        self.skipped = [node for node in self.node.xpath('skipped')]
        self.errors = [NoseTestError(self,node) for node in self.node.xpath('error')]
        self.failures = [NoseTestError(self,node) for node in self.node.xpath('failure')]

        for node in self.node:
            if node.tag not in ('error','failure','skipped'):
                self.log.debug('UNEXPECTED: %s' % ET.tostring(node))
                raise ValueError('Unexpected testcase child element: %s' % node.tag)
Esempio n. 4
0
 def __init__(self,name):
     threading.Thread.__init__(self)
     self.log = Logger(name).default_stream
     self.status = 'not running'
     self.setDaemon(True)
     self.setName(name)
     self._stop_event = threading.Event()
Esempio n. 5
0
    def __init__(self,path='noseresults.xml',short_classnames=False):
        self.log = Logger('nosepicker').default_stream
        self.path = path

        self.parser = None
        self.fd = None
        self.loaded = False
        self.__next = None
        self.short_classnames = short_classnames
Esempio n. 6
0
class Script(object):
    """
    Class for common CLI tool script
    """
    def __init__(self,name=None,description=None,epilog=None,debug_flag=True,subcommands=False):
        self.name = os.path.basename(sys.argv[0])
        setproctitle('%s %s' % (self.name,' '.join(sys.argv[1:])))
        signal.signal(signal.SIGINT, self.SIGINT)

        reload(sys)
        sys.setdefaultencoding('utf-8')

        if name is None:
            name = self.name

        # Set to True to avoid any messages from self.message to be printed
        self.silent = False

        self.logger = Logger(self.name)
        self.log = self.logger.default_stream

        self.parser = argparse.ArgumentParser(
            prog=name,
            description=description,
            epilog=epilog,
            add_help=True,
            conflict_handler='resolve',
        )
        if debug_flag:
            self.parser.add_argument('--debug',action='store_true',help='Show debug messages')

        if subcommands:
            self.commands = {}
            self.command_parsers = self.parser.add_subparsers(
                dest='command', help='Please select one command mode below',
                title='Command modes'
            )

    def SIGINT(self,signum,frame):
        """
        Parse SIGINT signal by quitting the program cleanly with exit code 1
        """
        for t in filter(lambda t: t.name!='MainThread', threading.enumerate()):
            t.stop()
        for t in filter(lambda t: t.name!='MainThread', threading.enumerate()):
            t.join()
        self.exit(1)

    def wait(self,poll_interval=1):
        """
        Wait for running threads to finish.
        Poll interval is time to wait between checks for threads
        """
        while True:
            active = filter(lambda t: t.name!='MainThread', threading.enumerate())
            if not len(active):
                break
            self.log.debug('Waiting for %d threads' % len(active))
            time.sleep(poll_interval)

    def exit(self,value=0,message=None):
        """
        Exit the script with given exit value.
        If message is not None, it is printed on screen.
        """
        if message is not None:
            self.message(message)
        for t in filter(lambda t: t.name!='MainThread', threading.enumerate()):
            t.stop()
        while True:
            active = filter(lambda t: t.name!='MainThread', threading.enumerate())
            if not len(active):
                break
            time.sleep(1)
        sys.exit(value)

    def message(self,message):
        if self.silent:
            return
        sys.stdout.write('%s\n' % message)

    def error(self,message):
        sys.stderr.write('%s\n' % message)

    def register_subcommand(self,command,name,description,epilog=None):
        if name in self.commands:
            raise MusaScriptError('Duplicate sub command name: %s' % name)
        self.commands[name] = command
        return self.command_parsers.add_parser(name,help=description,description=description,epilog=epilog)

    def usage_error(self,*args,**kwargs):
        return self.parser.error(*args,**kwargs)


    def add_argument(self,*args,**kwargs):
        """
        Shortcut to add argument to main argumentparser instance
        """
        self.parser.add_argument(*args,**kwargs)

    def parse_args(self):
        """
        Call parse_args for parser and check for default logging flags
        """
        args = self.parser.parse_args()

        if hasattr(args,'debug') and getattr(args,'debug'):
            self.logger.set_level('DEBUG')
        elif hasattr(args,'quiet') and getattr(args,'quiet'):
            self.silent = True
        elif hasattr(args,'verbose') and getattr(args,'verbose'):
            self.logger.set_level('INFO')

        return args

    def execute(self,args,dryrun=False):
        """
        Default wrapper to execute given interactive shell command
        """
        if not isinstance(args,list):
            raise ValueError('Execute arguments must be a list')

        if dryrun:
            self.log.debug('would execute: %s' % ' '.join(args))
            return 0

        p = Popen(args,stdin=sys.stdin,stdout=sys.stdout,stderr=sys.stderr)
        p.wait()
        return p.returncode
Esempio n. 7
0
 def __init__(self,testcase,node):
     self.log = Logger('nosepicker').default_stream
     self.testcase = testcase
     self.node = node
Esempio n. 8
0
 def __init__(self,parent,node):
     self.log = Logger('nosepicker').default_stream
     self.parent = parent
     self.node = node