def test_fingerprint_dict_with_files_order(rule_runner: RuleRunner) -> None:
    f1, f2 = (rule_runner.create_file(f, contents=c) for (f, c) in (
        ("foo/bar.config", "blah blah blah"),
        ("foo/bar.config", "meow meow meow"),
    ))
    fp1 = OptionsFingerprinter().fingerprint(dict_with_files_option,
                                             {"properties": f"{f1},{f2}"})
    fp2 = OptionsFingerprinter().fingerprint(dict_with_files_option,
                                             {"properties": f"{f2},{f1}"})
    assert fp1 == fp2
def test_fingerprint_file_list(rule_runner: RuleRunner) -> None:
    f1, f2, f3 = (rule_runner.create_file(f, contents=c) for (f, c) in (
        ("foo/bar.config", "blah blah blah"),
        ("foo/bar.config", "meow meow meow"),
        ("spam/egg.config", "blah blah blah"),
    ))
    fp1 = OptionsFingerprinter().fingerprint(file_option, [f1, f2])
    fp2 = OptionsFingerprinter().fingerprint(file_option, [f2, f1])
    fp3 = OptionsFingerprinter().fingerprint(file_option, [f1, f3])
    assert fp1 == fp2
    assert fp1 != fp3
def test_fingerprint_dict_with_file_content_change(
        rule_runner: RuleRunner) -> None:
    f1, f2 = (rule_runner.create_file(f, contents=c) for (f, c) in (
        ("foo/bar.config", "blah blah blah"),
        ("foo/bar.config", "meow meow meow"),
    ))

    fp1 = OptionsFingerprinter().fingerprint(dict_with_files_option,
                                             {"properties": f"{f1},{f2}"})
    with open(f1, "w") as f:
        f.write("123")

    fp2 = OptionsFingerprinter().fingerprint(dict_with_files_option,
                                             {"properties": f"{f1},{f2}"})
    assert fp1 != fp2
Exemple #4
0
    def __init__(self, context, workdir):
        """Subclass __init__ methods, if defined, *must* follow this idiom:

    class MyTask(Task):
      def __init__(self, *args, **kwargs):
        super(MyTask, self).__init__(*args, **kwargs)
        ...

    This allows us to change Task.__init__()'s arguments without
    changing every subclass. If the subclass does not need its own
    initialization, this method can (and should) be omitted entirely.

    :API: public
    """
        super(TaskBase, self).__init__()
        self.context = context
        self._workdir = workdir

        self._cache_key_errors = set()

        self._build_invalidator_dir = os.path.join(
            self.context.options.for_global_scope().pants_workdir,
            'build_invalidator', self.stable_name())

        self._cache_factory = CacheSetup.create_cache_factory_for_task(self)

        self._options_fingerprinter = OptionsFingerprinter(
            self.context.build_graph)
Exemple #5
0
    def __init__(self, context, workdir):
        """Subclass __init__ methods, if defined, *must* follow this idiom:

    class MyTask(Task):
      def __init__(self, *args, **kwargs):
        super(MyTask, self).__init__(*args, **kwargs)
        ...

    This allows us to change Task.__init__()'s arguments without
    changing every subclass. If the subclass does not need its own
    initialization, this method can (and should) be omitted entirely.
    """
        super(TaskBase, self).__init__()
        self.context = context
        self._workdir = workdir
        # TODO: It would be nice to use self.get_options().cache_key_gen_version here, because then
        # we could have a separate value for each scope if we really wanted to. However we can't
        # access per-task options in Task.__init__ because GroupTask.__init__ calls it with the
        # group task's scope, which isn't currently in the known scopes we generate options for.
        self._cache_key_generator = CacheKeyGenerator(
            self.context.options.for_global_scope().cache_key_gen_version)

        self._cache_key_errors = set()

        self._build_invalidator_dir = os.path.join(
            self.context.options.for_global_scope().pants_workdir,
            'build_invalidator', self.stable_name())

        self._cache_factory = CacheSetup.create_cache_factory_for_task(self)

        self._options_fingerprinter = OptionsFingerprinter(
            self.context.build_graph)
        self._fingerprint = None
def test_fingerprint_dict() -> None:
    d1 = {"b": 1, "a": 2}
    d2 = {"a": 2, "b": 1}
    d3 = {"a": 1, "b": 2}
    fp1, fp2, fp3 = (OptionsFingerprinter().fingerprint(
        DictValueComponent.create, d) for d in (d1, d2, d3))
    assert fp1 == fp2
    assert fp1 != fp3
def test_fingerprint_file_outside_buildroot(tmp_path: Path,
                                            rule_runner: RuleRunner) -> None:
    outside_buildroot = rule_runner.write_files({
        (tmp_path / "foobar").as_posix():
        "foobar"
    })[0]
    with pytest.raises(ValueError):
        OptionsFingerprinter().fingerprint(file_option, outside_buildroot)
def test_fingerprint_file(rule_runner: RuleRunner) -> None:
    fp1, fp2, fp3 = (OptionsFingerprinter().fingerprint(
        file_option, rule_runner.create_file(f, contents=c)) for (f, c) in (
            ("foo/bar.config", "blah blah blah"),
            ("foo/bar.config", "meow meow meow"),
            ("spam/egg.config", "blah blah blah"),
        ))
    assert fp1 != fp2
    assert fp1 != fp3
    assert fp2 != fp3
def test_fingerprint_dir(rule_runner: RuleRunner) -> None:
    d1 = rule_runner.create_dir("a")
    d2 = rule_runner.create_dir("b")
    d3 = rule_runner.create_dir("c")

    rule_runner.write_files({
        "a/bar/bar.config": "blah blah blah",
        "a/foo/foo.config": "meow meow meow",
        "b/foo/foo.config": "meow meow meow",
        "b/bar/bar.config": "blah blah blah",
        "c/bar/bar.config": "blah meow blah",
    })

    dp1 = OptionsFingerprinter().fingerprint(dir_option, [d1])
    dp2 = OptionsFingerprinter().fingerprint(dir_option, [d1, d2])
    dp3 = OptionsFingerprinter().fingerprint(dir_option, [d2, d1])
    dp4 = OptionsFingerprinter().fingerprint(dir_option, [d3])

    assert dp1 == dp1
    assert dp2 == dp2
    assert dp1 != dp3
    assert dp1 != dp4
    assert dp2 != dp3
def test_fingerprint_dir(rule_runner: RuleRunner) -> None:
    d1 = rule_runner.create_dir("a")
    d2 = rule_runner.create_dir("b")
    d3 = rule_runner.create_dir("c")

    for f, c in [
        ("a/bar/bar.config", "blah blah blah"),
        ("a/foo/foo.config", "meow meow meow"),
        ("b/foo/foo.config", "meow meow meow"),
        ("b/bar/bar.config", "blah blah blah"),
        ("c/bar/bar.config", "blah meow blah"),
    ]:
        rule_runner.create_file(f, contents=c)

    dp1 = OptionsFingerprinter().fingerprint(dir_option, [d1])
    dp2 = OptionsFingerprinter().fingerprint(dir_option, [d1, d2])
    dp3 = OptionsFingerprinter().fingerprint(dir_option, [d2, d1])
    dp4 = OptionsFingerprinter().fingerprint(dir_option, [d3])

    assert dp1 == dp1
    assert dp2 == dp2
    assert dp1 != dp3
    assert dp1 != dp4
    assert dp2 != dp3
def test_fingerprint_unset_bool() -> None:
    fp1 = OptionsFingerprinter().fingerprint(UnsetBool, UnsetBool)
    fp2 = OptionsFingerprinter().fingerprint(UnsetBool, UnsetBool)
    assert fp1 == fp2
def test_fingerprint_primitive() -> None:
    fp1, fp2 = (OptionsFingerprinter().fingerprint("", v) for v in ("foo", 5))
    assert fp1 != fp2
def test_fingerprint_file_outside_buildroot(tmp_path: Path,
                                            rule_runner: RuleRunner) -> None:
    outside_buildroot = rule_runner.create_file(
        (tmp_path / "foobar").as_posix(), contents="foobar")
    with pytest.raises(ValueError):
        OptionsFingerprinter().fingerprint(file_option, outside_buildroot)
def test_fingerprint_list() -> None:
    l1 = [1, 2, 3]
    l2 = [1, 3, 2]
    fp1, fp2 = (OptionsFingerprinter().fingerprint(ListValueComponent.create,
                                                   l) for l in (l1, l2))
    assert fp1 != fp2
 def setUp(self) -> None:
     super().setUp()
     self.options_fingerprinter = OptionsFingerprinter(
         self.context().build_graph)
Exemple #16
0
 def setUp(self):
     super(OptionsFingerprinterTest, self).setUp()
     self.options_fingerprinter = OptionsFingerprinter(
         self.context().build_graph)
def test_fingerprint_dict_with_non_string_keys() -> None:
    d = {("a", 2): (3, 4)}
    fp = OptionsFingerprinter().fingerprint(DictValueComponent.create, d)
    assert fp == "3852a094612ce1c22c08ee2ddcdc03d09e87ad97"
Exemple #18
0
 def setUp(self) -> None:
     super().setUp()
     self.options_fingerprinter = OptionsFingerprinter()