Skip to content

Commit

Permalink
add context manager to temporarily change the cwd (#2377)
Browse files Browse the repository at this point in the history
Commit history before merge:

* add context manager to temporarily change the cwd
* Iterator, not Iterable
  • Loading branch information
JelleZijlstra committed Jul 17, 2021
1 parent 4dd100b commit 65abd10
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 28 deletions.
43 changes: 16 additions & 27 deletions tests/test_black.py
Expand Up @@ -44,6 +44,7 @@
# Import other test classes
from tests.util import (
THIS_DIR,
change_directory,
read_data,
DETERMINISTIC_HEADER,
BlackBaseTestCase,
Expand Down Expand Up @@ -2009,17 +2010,12 @@ def test_bpo_33660_workaround(self) -> None:
return

# https://bugs.python.org/issue33660

old_cwd = Path.cwd()
try:
root = Path("/")
os.chdir(str(root))
root = Path("/")
with change_directory(root):
path = Path("workspace") / "project"
report = black.Report(verbose=True)
normalized_path = black.normalize_path_maybe_ignore(path, root, report)
self.assertEqual(normalized_path, "workspace/project")
finally:
os.chdir(str(old_cwd))

def test_newline_comment_interaction(self) -> None:
source = "class A:\\\r\n# type: ignore\n pass\n"
Expand Down Expand Up @@ -2170,10 +2166,6 @@ def test_code_option_config(self) -> None:
Test that the code option finds the pyproject.toml in the current directory.
"""
with patch.object(black, "parse_pyproject_toml", return_value={}) as parse:
# Make sure we are in the project root with the pyproject file
if not Path("tests").exists():
os.chdir("..")

args = ["--code", "print"]
CliRunner().invoke(black.main, args)

Expand All @@ -2192,22 +2184,19 @@ def test_code_option_parent_config(self) -> None:
Test that the code option finds the pyproject.toml in the parent directory.
"""
with patch.object(black, "parse_pyproject_toml", return_value={}) as parse:
# Make sure we are in the tests directory
if Path("tests").exists():
os.chdir("tests")

args = ["--code", "print"]
CliRunner().invoke(black.main, args)

pyproject_path = Path(Path().cwd().parent, "pyproject.toml").resolve()
assert (
len(parse.mock_calls) >= 1
), "Expected config parse to be called with the current directory."

_, call_args, _ = parse.mock_calls[0]
assert (
call_args[0].lower() == str(pyproject_path).lower()
), "Incorrect config loaded."
with change_directory(Path("tests")):
args = ["--code", "print"]
CliRunner().invoke(black.main, args)

pyproject_path = Path(Path().cwd().parent, "pyproject.toml").resolve()
assert (
len(parse.mock_calls) >= 1
), "Expected config parse to be called with the current directory."

_, call_args, _ = parse.mock_calls[0]
assert (
call_args[0].lower() == str(pyproject_path).lower()
), "Incorrect config loaded."


with open(black.__file__, "r", encoding="utf-8") as _bf:
Expand Down
14 changes: 13 additions & 1 deletion tests/util.py
@@ -1,7 +1,8 @@
import os
import unittest
from pathlib import Path
from typing import List, Tuple, Any
from typing import Iterator, List, Tuple, Any
from contextlib import contextmanager
from functools import partial

import black
Expand Down Expand Up @@ -72,3 +73,14 @@ def read_data_from_file(file_name: Path) -> Tuple[str, str]:
# If there's no output marker, treat the entire file as already pre-formatted.
_output = _input[:]
return "".join(_input).strip() + "\n", "".join(_output).strip() + "\n"


@contextmanager
def change_directory(path: Path) -> Iterator[None]:
"""Context manager to temporarily chdir to a different directory."""
previous_dir = os.getcwd()
try:
os.chdir(path)
yield
finally:
os.chdir(previous_dir)

0 comments on commit 65abd10

Please sign in to comment.