class Project(object): def __init__(self, desc, name=None, logger=None, base_path=None): self._log = logger or woklogger.get_logger(_LOGGER_NAME) self.name = name or desc.get("name") self._flow_loader = None platform = desc.get("platform") self.path = desc.get("path") self.conf = desc.get("conf", default=Data.element) if isinstance(self.conf, basestring): self.conf = ConfigLoader(os.path.join(base_path or "", self.conf)).load() self.conf_rules = [] if self.path is not None: self.conf_rules += [ConfRule(dict(set=[[rtconf.PROJECT_PATH, self.path]]), base_path, platform)] self.conf_rules += [ConfRule(rule, base_path, platform) for rule in desc.get("conf_rules", default=Data.list)] self.flows = desc.get("flows", default=Data.list) def extend(self, pdesc, base_path=None): platform = pdesc.get("platform") if platform is not None and "path" in pdesc: self.conf_rules += [ConfRule(dict(set=[[rtconf.PROJECT_PATH, pdesc["path"]]]), base_path, platform)] if "conf" in pdesc: if platform is None: self.conf.merge(pdesc["conf"]) else: self.conf_rules += [ConfRule(dict(merge=pdesc["conf"]), base_path, platform)] self.conf_rules += [ConfRule(rule, base_path, platform) for rule in pdesc.get("conf_rules", default=Data.list)] self.flows += pdesc.get("flows", default=Data.list) def initialize(self): self._log.info("Initializing project {} ...".format(self.name)) if self.path is None: raise Exception("Project 'path' not defined: {}".format(self.name)) flow_paths = [os.path.join(self.path, flow) for flow in self.flows] self._flow_loader = FlowLoader(flow_paths) for uri, path in self._flow_loader.flow_files.items(): self._log.debug("{0} : {1}".format(uri, path)) def load_flow(self, flow_name, version=None): flow = self._flow_loader.load_from_canonical(flow_name, version=version) flow.project = self return flow def load_from_ref(self, ref): flow = self._flow_loader.load_from_ref(ref) flow.project = self return flow def get_conf(self, task_name=None, platform_name=None): conf = self.conf.clone() for rule in self.conf_rules: pname = conf.get(rtconf.PLATFORM_TARGET, platform_name) if rule.match(task_name=task_name, platform=pname): rule.apply(conf) if rtconf.PROJECT_PATH not in conf: conf[rtconf.PROJECT_PATH] = self.path return conf def _repr(self, sb, indent=0): sb += ["Project [{}]".format(self.name)] sb += [" path={}".format(self.path)] sb += [" flows={}".format(self.flows)] sb += [" conf={}".format(self.conf)] sb += [" conf_rules={}".format(self.conf_rules)] for platform_name in sorted(self._platforms.keys()): self._platforms[platform_name]._repr(sb, 2) def __repr__(self): sb = [] self._repr(sb) return "\n".join(sb)
class Project(object): def __init__(self, desc, name=None, logger=None, base_path=None): self._log = logger or woklogger.get_logger(_LOGGER_NAME) self.name = name or desc.get("name") self._flow_loader = None platform = desc.get("platform") self.path = desc.get("path") self.conf = desc.get("conf", default=Data.element) if isinstance(self.conf, basestring): self.conf = ConfigLoader(os.path.join(base_path or "", self.conf)).load() self.conf_rules = [] if self.path is not None: self.conf_rules += [ ConfRule(dict(set=[[rtconf.PROJECT_PATH, self.path]]), base_path, platform) ] self.conf_rules += [ ConfRule(rule, base_path, platform) for rule in desc.get("conf_rules", default=Data.list) ] self.flows = desc.get("flows", default=Data.list) def extend(self, pdesc, base_path=None): platform = pdesc.get("platform") if platform is not None and "path" in pdesc: self.conf_rules += [ ConfRule(dict(set=[[rtconf.PROJECT_PATH, pdesc["path"]]]), base_path, platform) ] if "conf" in pdesc: if platform is None: self.conf.merge(pdesc["conf"]) else: self.conf_rules += [ ConfRule(dict(merge=pdesc["conf"]), base_path, platform) ] self.conf_rules += [ ConfRule(rule, base_path, platform) for rule in pdesc.get("conf_rules", default=Data.list) ] self.flows += pdesc.get("flows", default=Data.list) def initialize(self): self._log.info("Initializing project {} ...".format(self.name)) if self.path is None: raise Exception("Project 'path' not defined: {}".format(self.name)) flow_paths = [os.path.join(self.path, flow) for flow in self.flows] self._flow_loader = FlowLoader(flow_paths) for uri, path in self._flow_loader.flow_files.items(): self._log.debug("{0} : {1}".format(uri, path)) def load_flow(self, flow_name, version=None): flow = self._flow_loader.load_from_canonical(flow_name, version=version) flow.project = self return flow def load_from_ref(self, ref): flow = self._flow_loader.load_from_ref(ref) flow.project = self return flow def get_conf(self, task_name=None, platform_name=None): conf = self.conf.clone() for rule in self.conf_rules: pname = conf.get(rtconf.PLATFORM_TARGET, platform_name) if rule.match(task_name=task_name, platform=pname): rule.apply(conf) if rtconf.PROJECT_PATH not in conf: conf[rtconf.PROJECT_PATH] = self.path return conf def _repr(self, sb, indent=0): sb += ["Project [{}]".format(self.name)] sb += [" path={}".format(self.path)] sb += [" flows={}".format(self.flows)] sb += [" conf={}".format(self.conf)] sb += [" conf_rules={}".format(self.conf_rules)] for platform_name in sorted(self._platforms.keys()): self._platforms[platform_name]._repr(sb, 2) def __repr__(self): sb = [] self._repr(sb) return "\n".join(sb)