Improve handling of root to get_sources (#3847)

This is a little more type safe and a little cleaner
This commit is contained in:
Shantanu 2023-08-19 08:13:05 -07:00 committed by GitHub
parent 066aa9210a
commit 6310a405f6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 26 deletions

View File

@ -560,9 +560,10 @@ def main( # noqa: C901
content=code, fast=fast, write_back=write_back, mode=mode, report=report content=code, fast=fast, write_back=write_back, mode=mode, report=report
) )
else: else:
assert root is not None # root is only None if code is not None
try: try:
sources = get_sources( sources = get_sources(
ctx=ctx, root=root,
src=src, src=src,
quiet=quiet, quiet=quiet,
verbose=verbose, verbose=verbose,
@ -615,7 +616,7 @@ def main( # noqa: C901
def get_sources( def get_sources(
*, *,
ctx: click.Context, root: Path,
src: Tuple[str, ...], src: Tuple[str, ...],
quiet: bool, quiet: bool,
verbose: bool, verbose: bool,
@ -628,7 +629,6 @@ def get_sources(
) -> Set[Path]: ) -> Set[Path]:
"""Compute the set of files to be formatted.""" """Compute the set of files to be formatted."""
sources: Set[Path] = set() sources: Set[Path] = set()
root = ctx.obj["root"]
using_default_exclude = exclude is None using_default_exclude = exclude is None
exclude = re_compile_maybe_verbose(DEFAULT_EXCLUDES) if exclude is None else exclude exclude = re_compile_maybe_verbose(DEFAULT_EXCLUDES) if exclude is None else exclude
@ -645,7 +645,7 @@ def get_sources(
if is_stdin or p.is_file(): if is_stdin or p.is_file():
normalized_path: Optional[str] = normalize_path_maybe_ignore( normalized_path: Optional[str] = normalize_path_maybe_ignore(
p, ctx.obj["root"], report p, root, report
) )
if normalized_path is None: if normalized_path is None:
if verbose: if verbose:
@ -674,7 +674,9 @@ def get_sources(
sources.add(p) sources.add(p)
elif p.is_dir(): elif p.is_dir():
p = root / normalize_path_maybe_ignore(p, ctx.obj["root"], report) p_relative = normalize_path_maybe_ignore(p, root, report)
assert p_relative is not None
p = root / p_relative
if verbose: if verbose:
out(f'Found input source directory: "{p}"', fg="blue") out(f'Found input source directory: "{p}"', fg="blue")
@ -686,7 +688,7 @@ def get_sources(
sources.update( sources.update(
gen_python_files( gen_python_files(
p.iterdir(), p.iterdir(),
ctx.obj["root"], root,
include, include,
exclude, exclude,
extend_exclude, extend_exclude,

View File

@ -507,13 +507,11 @@ def _mocked_calls() -> bool:
with patch("pathlib.Path.iterdir", return_value=target_contents), patch( with patch("pathlib.Path.iterdir", return_value=target_contents), patch(
"pathlib.Path.cwd", return_value=working_directory "pathlib.Path.cwd", return_value=working_directory
), patch("pathlib.Path.is_dir", side_effect=mock_n_calls([True])): ), patch("pathlib.Path.is_dir", side_effect=mock_n_calls([True])):
ctx = FakeContext()
# Note that the root folder (project_root) isn't the folder # Note that the root folder (project_root) isn't the folder
# named "root" (aka working_directory) # named "root" (aka working_directory)
ctx.obj["root"] = project_root
report = MagicMock(verbose=True) report = MagicMock(verbose=True)
black.get_sources( black.get_sources(
ctx=ctx, root=project_root,
src=("./child",), src=("./child",),
quiet=False, quiet=False,
verbose=True, verbose=True,
@ -2163,7 +2161,7 @@ def assert_collected_sources(
src: Sequence[Union[str, Path]], src: Sequence[Union[str, Path]],
expected: Sequence[Union[str, Path]], expected: Sequence[Union[str, Path]],
*, *,
ctx: Optional[FakeContext] = None, root: Optional[Path] = None,
exclude: Optional[str] = None, exclude: Optional[str] = None,
include: Optional[str] = None, include: Optional[str] = None,
extend_exclude: Optional[str] = None, extend_exclude: Optional[str] = None,
@ -2179,7 +2177,7 @@ def assert_collected_sources(
) )
gs_force_exclude = None if force_exclude is None else compile_pattern(force_exclude) gs_force_exclude = None if force_exclude is None else compile_pattern(force_exclude)
collected = black.get_sources( collected = black.get_sources(
ctx=ctx or FakeContext(), root=root or THIS_DIR,
src=gs_src, src=gs_src,
quiet=False, quiet=False,
verbose=False, verbose=False,
@ -2215,9 +2213,7 @@ def test_gitignore_used_as_default(self) -> None:
base / "b/.definitely_exclude/a.pyi", base / "b/.definitely_exclude/a.pyi",
] ]
src = [base / "b/"] src = [base / "b/"]
ctx = FakeContext() assert_collected_sources(src, expected, root=base, extend_exclude=r"/exclude/")
ctx.obj["root"] = base
assert_collected_sources(src, expected, ctx=ctx, extend_exclude=r"/exclude/")
def test_gitignore_used_on_multiple_sources(self) -> None: def test_gitignore_used_on_multiple_sources(self) -> None:
root = Path(DATA_DIR / "gitignore_used_on_multiple_sources") root = Path(DATA_DIR / "gitignore_used_on_multiple_sources")
@ -2225,10 +2221,8 @@ def test_gitignore_used_on_multiple_sources(self) -> None:
root / "dir1" / "b.py", root / "dir1" / "b.py",
root / "dir2" / "b.py", root / "dir2" / "b.py",
] ]
ctx = FakeContext()
ctx.obj["root"] = root
src = [root / "dir1", root / "dir2"] src = [root / "dir1", root / "dir2"]
assert_collected_sources(src, expected, ctx=ctx) assert_collected_sources(src, expected, root=root)
@patch("black.find_project_root", lambda *args: (THIS_DIR.resolve(), None)) @patch("black.find_project_root", lambda *args: (THIS_DIR.resolve(), None))
def test_exclude_for_issue_1572(self) -> None: def test_exclude_for_issue_1572(self) -> None:
@ -2334,9 +2328,7 @@ def test_gitignore_that_ignores_subfolders(self) -> None:
# If gitignore with */* is in root # If gitignore with */* is in root
root = Path(DATA_DIR / "ignore_subfolders_gitignore_tests" / "subdir") root = Path(DATA_DIR / "ignore_subfolders_gitignore_tests" / "subdir")
expected = [root / "b.py"] expected = [root / "b.py"]
ctx = FakeContext() assert_collected_sources([root], expected, root=root)
ctx.obj["root"] = root
assert_collected_sources([root], expected, ctx=ctx)
# If .gitignore with */* is nested # If .gitignore with */* is nested
root = Path(DATA_DIR / "ignore_subfolders_gitignore_tests") root = Path(DATA_DIR / "ignore_subfolders_gitignore_tests")
@ -2344,17 +2336,13 @@ def test_gitignore_that_ignores_subfolders(self) -> None:
root / "a.py", root / "a.py",
root / "subdir" / "b.py", root / "subdir" / "b.py",
] ]
ctx = FakeContext() assert_collected_sources([root], expected, root=root)
ctx.obj["root"] = root
assert_collected_sources([root], expected, ctx=ctx)
# If command is executed from outer dir # If command is executed from outer dir
root = Path(DATA_DIR / "ignore_subfolders_gitignore_tests") root = Path(DATA_DIR / "ignore_subfolders_gitignore_tests")
target = root / "subdir" target = root / "subdir"
expected = [target / "b.py"] expected = [target / "b.py"]
ctx = FakeContext() assert_collected_sources([target], expected, root=root)
ctx.obj["root"] = root
assert_collected_sources([target], expected, ctx=ctx)
def test_empty_include(self) -> None: def test_empty_include(self) -> None:
path = DATA_DIR / "include_exclude_tests" path = DATA_DIR / "include_exclude_tests"