add context manager to temporarily change the cwd (#2377)

Commit history before merge:

* add context manager to temporarily change the cwd
* Iterator, not Iterable
This commit is contained in:
Jelle Zijlstra 2021-07-16 19:21:34 -07:00 committed by GitHub
parent 4dd100bff2
commit 65abd1006b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 26 deletions

View File

@ -44,6 +44,7 @@
# Import other test classes
from tests.util import (
THIS_DIR,
change_directory,
read_data,
DETERMINISTIC_HEADER,
BlackBaseTestCase,
@ -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"
@ -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)
@ -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")
with change_directory(Path("tests")):
args = ["--code", "print"]
CliRunner().invoke(black.main, args)
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."
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."
_, 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:

View File

@ -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
@ -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)