Example #1
0
 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()
Example #2
0
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()