forked from pantsbuild/pants
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ancestor_files_test.py
111 lines (100 loc) · 3.96 KB
/
ancestor_files_test.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# Copyright 2020 Pants project contributors (see CONTRIBUTORS.md).
# Licensed under the Apache License, Version 2.0 (see LICENSE).
from typing import List
from pants.backend.python.rules.ancestor_files import (
AncestorFiles,
AncestorFilesRequest,
find_missing_ancestor_files,
identify_missing_ancestor_files,
)
from pants.core.util_rules import stripped_source_files
from pants.core.util_rules.source_files import SourceFiles
from pants.engine.fs import DigestContents
from pants.engine.rules import RootRule
from pants.testutil.engine_util import Params
from pants.testutil.option_util import create_options_bootstrapper
from pants.testutil.test_base import TestBase
class InjectAncestorFilesTest(TestBase):
@classmethod
def rules(cls):
return (
*super().rules(),
find_missing_ancestor_files,
*stripped_source_files.rules(),
RootRule(AncestorFilesRequest),
RootRule(SourceFiles),
)
def assert_injected(
self,
*,
source_roots: List[str],
original_declared_files: List[str],
original_undeclared_files: List[str],
expected_discovered: List[str],
) -> None:
for f in original_undeclared_files:
self.create_file(f, "# undeclared")
request = AncestorFilesRequest(
"__init__.py", self.make_snapshot({fp: "# declared" for fp in original_declared_files}),
)
bootstrapper = create_options_bootstrapper(args=[f"--source-root-patterns={source_roots}"])
result = self.request_product(AncestorFiles, Params(request, bootstrapper)).snapshot
assert list(result.files) == sorted(expected_discovered)
materialized_result = self.request_product(DigestContents, result.digest)
for file_content in materialized_result:
path = file_content.path
if not path.endswith("__init__.py"):
continue
assert path in original_declared_files or path in expected_discovered
expected = b"# declared" if path in original_declared_files else b"# undeclared"
assert file_content.content == expected
def test_unstripped(self) -> None:
self.assert_injected(
source_roots=["src/python", "tests/python"],
original_declared_files=[
"src/python/project/lib.py",
"src/python/project/subdir/__init__.py",
"src/python/project/subdir/lib.py",
"src/python/no_init/lib.py",
],
original_undeclared_files=[
"src/python/project/__init__.py",
"tests/python/project/__init__.py",
],
expected_discovered=["src/python/project/__init__.py"],
)
def test_unstripped_source_root_at_buildroot(self) -> None:
self.assert_injected(
source_roots=["/"],
original_declared_files=[
"project/lib.py",
"project/subdir/__init__.py",
"project/subdir/lib.py",
"no_init/lib.py",
],
original_undeclared_files=["project/__init__.py",],
expected_discovered=["project/__init__.py"],
)
def test_identify_missing_ancestor_files() -> None:
assert {"a/__init__.py", "a/b/__init__.py", "a/b/c/d/__init__.py"} == set(
identify_missing_ancestor_files(
"__init__.py", ["a/b/foo.py", "a/b/c/__init__.py", "a/b/c/d/bar.py", "a/e/__init__.py"]
)
)
assert {
"src/__init__.py",
"src/python/__init__.py",
"src/python/a/__init__.py",
"src/python/a/b/__init__.py",
"src/python/a/b/c/d/__init__.py",
} == set(
identify_missing_ancestor_files(
"__init__.py",
[
"src/python/a/b/foo.py",
"src/python/a/b/c/__init__.py",
"src/python/a/b/c/d/bar.py",
"src/python/a/e/__init__.py",
],
)
)