def mainloop(self): """Plugin main loop.""" LOG.info('registered %d plugins', len(self.plugins)) backlog = [] # Early exit if no plug-in are scheduled to be run if not self.plugins: self.info('nothing to do') return # Execute each plug-in in order try: for cls in self.plugins: try: # Create a new instance plugin, elapsed = cls(), None # Execute the plug-in elapsed = self.execute(plugin) except KeyboardInterrupt: raise except Exception as why: LOG.exception('plug-in execution failed') self.error('%s: unexpected error: %s', plugin.name, why) finally: if plugin.exec_status != GNAThub.NOT_EXECUTED: # A plugin could not have been executed depending on # the command line (--runners-only/--reporters-only). backlog.append((plugin.name, { 'time': elapsed or 0, 'success': (plugin.exec_status == GNAThub.EXEC_SUCCESS) })) except KeyboardInterrupt: self.info(os.linesep + 'Interrupt caught...') # Write results to file fname = os.path.join(GNAThub.root(), 'gnathub.backlog') try: with open(fname, 'w') as fd: fd.write(json.dumps(backlog)) except IOError as why: LOG.exception('could not write result file %s', fname) self.error('%s: unexpected error: %s', fname, why) if not GNAThub.dry_run() and not GNAThub.quiet(): # Display a summary for plugin, results in backlog: if results['success']: Console.ok(plugin) else: Console.ko(plugin)
def mainloop(self): """Plugin main loop.""" LOG.info('registered %d plugins', len(self.plugins)) backlog = [] # Early exit if no plug-in are scheduled to be run if not self.plugins: self.info('nothing to do') return # Execute each plug-in in order try: for cls in self.plugins: try: # Create a new instance plugin, elapsed = cls(), None # Execute the plug-in elapsed = self.execute(plugin) except KeyboardInterrupt: raise except Exception as why: LOG.exception('plug-in execution failed') self.error('%s: unexpected error: %s', plugin.name, why) finally: if plugin.exec_status != GNAThub.NOT_EXECUTED: # A plugin could not have been executed depending on # the command line (--runners-only/--reporters-only). backlog.append((plugin.name, { 'time': elapsed or 0, 'success': ( plugin.exec_status == GNAThub.EXEC_SUCCESS) })) except KeyboardInterrupt: self.info(os.linesep + 'Interrupt caught...') # Write results to file fname = os.path.join(GNAThub.root(), 'gnathub.backlog') try: with open(fname, 'w') as fd: fd.write(json.dumps(backlog)) except IOError as why: LOG.exception('could not write result file %s', fname) self.error('%s: unexpected error: %s', fname, why) if not GNAThub.dry_run() and not GNAThub.quiet(): # Display a summary for plugin, results in backlog: if results['success']: Console.ok(plugin) else: Console.ko(plugin)
def execute(cls, plugin): """Execute the plugin. Call methods setup, execute and teardown for a plugin instance. :param GNAThub.Plugin plugin: instance of the plugin to execute :return: the execution time in seconds :rtype: int """ elapsed = 0 if cls.should_execute(plugin): cls.info('execute plug-in %s', plugin.name) if GNAThub.dry_run(): # Early exit if dry-run mode is enabled plugin.exec_status = GNAThub.EXEC_SUCCESS return 0 LOG.info('%s: set up environment', plugin.name) start = time.time() plugin.setup() if cls.execute_runners() and cls.is_runner(plugin): LOG.info('%s: produce results', plugin.name) plugin.exec_status = plugin.run() if (cls.execute_reporters() and cls.is_reporter(plugin) and plugin.exec_status in ( GNAThub.EXEC_SUCCESS, GNAThub.NOT_EXECUTED)): LOG.info('%s: collect results', plugin.name) plugin.exec_status = plugin.report() LOG.info('%s: post execution', plugin.name) plugin.teardown() elapsed = time.time() - start if plugin.exec_status == GNAThub.EXEC_SUCCESS: plugin.info('completed (in %d seconds)' % elapsed) elif plugin.exec_status == GNAThub.EXEC_FAILURE: plugin.error('execution failed') else: assert plugin.exec_status == GNAThub.NOT_EXECUTED plugin.info('not executed') return elapsed
def execute(cls, plugin): """Execute the plugin. Call methods setup, execute and teardown for a plugin instance. :param GNAThub.Plugin plugin: instance of the plugin to execute :return: the execution time in seconds :rtype: int """ elapsed = 0 if cls.should_execute(plugin): cls.info('execute plug-in %s', plugin.name) if GNAThub.dry_run(): # Early exit if dry-run mode is enabled plugin.exec_status = GNAThub.EXEC_SUCCESS return 0 LOG.info('%s: set up environment', plugin.name) start = time.time() plugin.setup() if cls.execute_runners() and cls.is_runner(plugin): LOG.info('%s: produce results', plugin.name) plugin.exec_status = plugin.run() if (cls.execute_reporters() and cls.is_reporter(plugin) and plugin.exec_status in (GNAThub.EXEC_SUCCESS, GNAThub.NOT_EXECUTED)): LOG.info('%s: collect results', plugin.name) plugin.exec_status = plugin.report() LOG.info('%s: post execution', plugin.name) plugin.teardown() elapsed = time.time() - start if plugin.exec_status == GNAThub.EXEC_SUCCESS: plugin.info('completed (in %d seconds)' % elapsed) elif plugin.exec_status == GNAThub.EXEC_FAILURE: plugin.error('execution failed') else: assert plugin.exec_status == GNAThub.NOT_EXECUTED plugin.info('not executed') return elapsed
:returns: str """ return os.path.relpath(path, BASEDIR) assertTrue(os.path.isdir(GNAThub.root())) assertEqual(relpath(GNAThub.root()), os.path.join('obj', 'gnathub')) assertTrue(os.path.isdir(GNAThub.logs())) assertEqual(relpath(GNAThub.logs()), os.path.join('obj', 'gnathub', 'logs')) assertTrue(GNAThub.quiet()) assertFalse(GNAThub.verbose()) assertFalse(GNAThub.dry_run()) assertTrue(GNAThub.runners_only()) assertFalse(GNAThub.reporters_only()) assertTrue(os.path.isfile(GNAThub.database())) assertEqual( relpath(GNAThub.database()), os.path.join('obj', 'gnathub', 'gnathub.db') ) # Default for jobs number is 0 assertEqual(GNAThub.jobs(), 0) # The plugin list is expected to be empty assertEqual(len(GNAThub.plugins()), 0)