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' )
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')
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 __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()
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
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
def __init__(self,testcase,node): self.log = Logger('nosepicker').default_stream self.testcase = testcase self.node = node
def __init__(self,parent,node): self.log = Logger('nosepicker').default_stream self.parent = parent self.node = node