Example #1
0
class TaskMng(object):

    def __init__(self, filenames = ()):
        self._cp = ConfigParser()
        self._cp.read(filenames)
        self._mng = AppsMng()

    def resolve(self, taskname):
        def listify_values(section, d):
            list_keys = []

            if section == 'global':
                list_keys += ['notifiers']

            elif section.startswith('task.'):
                list_keys += ['zizi.include', 'zizi.subtasks']

            for k in list_keys:
                if k in d:
                    d[k] = re.split(r',\s+', d[k])


        if not self._cp.has_section(taskname):
            raise Exception('task not found', taskname)

        d = { k : v for (k, v) in self._cp[taskname].items() }
        listify_values(taskname, d)

        # Resolve subtasks
        if 'zizi.subtasks' in d:
            r = []
            for x in [self.resolve(x) for x in d['zizi.subtasks']]:
                r += x
            return r

        # Resolve includes
        if 'zizi.include' in d:
            tmp = {}
            for subtask in [self.resolve(x) for x in d['zizi.include']]:
                tmp.update(subtask)
            d.update(tmp)
            del(d['zizi.include'])

        # Check for app key
        if not 'zizi.app' in d:
            raise Exception('Task %s must specify zizi.app (%s)' % (taskname, repr(d)))

        return [{ k.replace('-','_') : v for (k, v) in d.items() if k == 'zizi.app' or not k.startswith('zizi.') }]

    def execute(self, taskname):
        tasks = self.resolve(taskname)
        for task in tasks:
            app = task['zizi.app']
            del (task['zizi.app'])

            cls = self._mng.get_addon(app)
            try:
                cls().run(**task)
            except Exception as e:
                print("Task %s(%s) failed: %s" % (app, task, repr(e)))
Example #2
0
 def __init__(self, filenames = ()):
     self._cp = ConfigParser()
     self._cp.read(filenames)
     self._mng = AppsMng()