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
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)
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)
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"
def setUp(self) -> None: super().setUp() self.options_fingerprinter = OptionsFingerprinter()