def build(self, build_context): for dependency in self._deps: dependency.build(build_context) self._build_info_reader = OnDiskBuildInfoReader(build_context.get_project_filesystem(), self._build_target) self._build_info_writer = OnDiskBuildInfoWriter( build_context.get_project_filesystem(), self._build_target, self._get_rule_key_pair() ) status = self._build_once_dependencies_are_built(build_context) if status is SUCCESS: self._build_info_writer.write_metadata_to_disk() # Upload metadata to the artifact cache. self._build_info_writer.upload_to_artifact_cache(build_context.get_artifact_cache()) else: raise NotImplementedError()
class RuleBase(object): """This class is base class for any rule. raises: TypeError """ PARAMETERS_MAPPING = _Dict({"name": {"type": "string"}}) def __init__(self, config, build_target, rule_resolver): self._config = config self._build_target = build_target self._rule_resolver = rule_resolver self._rule_key_pair = None self._deps = [] @classmethod def get_parameters_schema(clazz): return {"type": "object", "properties": clazz.PARAMETERS_MAPPING} @classmethod def get_parameters_builder(clazz): def builder(*args, **kwargs): DefaultValidator(clazz.get_parameters_schema()).validate(kwargs) return kwargs return builder def _build_once_dependencies_are_built(self, build_context): """This method is invoked once all of this rule's dependencies are built.""" # Compute the current RuleKey and compare it to the one stored on # disk. Build buildable locally if necessary. rule_key = self.get_rule_key() cached_rule_key = self._build_info_reader.read_rule_key() if not cached_rule_key is None and rule_key == cached_rule_key: build_context.get_console().stdout.write("Unchanged %s.\n" % self._build_target.get_full_name()) return SUCCESS # Execute the commands for this build rule. print("Building %s..." % self._build_target.get_full_name()) step_runner = build_context.get_step_runner() steps = self.get_build_steps(build_context) for step in steps: step_runner.run_step(step) # Once buildable has built successfully, record that the output file has # been written. self._build_info_writer.record_artifact(self.get_path_to_output_file()) return SUCCESS # AbstractBuildRule.getRuleKeyPair() def _get_rule_key_pair(self): if self._rule_key_pair is None: rule_key_builder = RuleKeyBuilder(self) self.update_rule_key_builder(rule_key_builder) self._rule_key_pair = rule_key_builder.build() return self._rule_key_pair def build(self, build_context): for dependency in self._deps: dependency.build(build_context) self._build_info_reader = OnDiskBuildInfoReader(build_context.get_project_filesystem(), self._build_target) self._build_info_writer = OnDiskBuildInfoWriter( build_context.get_project_filesystem(), self._build_target, self._get_rule_key_pair() ) status = self._build_once_dependencies_are_built(build_context) if status is SUCCESS: self._build_info_writer.write_metadata_to_disk() # Upload metadata to the artifact cache. self._build_info_writer.upload_to_artifact_cache(build_context.get_artifact_cache()) else: raise NotImplementedError() def update_rule_key_builder(self, builder): if isinstance(self, RuleWithSources): builder.add_field("srcs", self.get_source_paths()) def process_raw_parameters(self, raw_parameters): deps = raw_parameters.pop("deps", []) self._deps = self.get_dependencies_as_rules(deps) if isinstance(self, RuleWithSources): RuleWithSources.process_raw_parameters(self, raw_parameters) def get_build_steps(self, build_context): return [] def get_build_target(self): """Returns build target targeted by this rule.""" return self._build_target def get_dependencies(self): return self._deps def get_dependencies_as_rules(self, deps): build_rules = [] for target in deps: build_rules.append(self._rule_resolver.get(target)) return build_rules # AbstractBuildRule.getRuleKey() def get_rule_key(self): key_pair = self._get_rule_key_pair() return key_pair.get_total_rule_key()