Skip to content

Commit 5da2cc0

Browse files
committed
Find pyproject.toml only once, and use it in CONFIG_FILES
1 parent 65324b8 commit 5da2cc0

File tree

2 files changed

+34
-26
lines changed

2 files changed

+34
-26
lines changed

mypy/config_parser.py

+1-25
Original file line numberDiff line numberDiff line change
@@ -229,28 +229,6 @@ def split_commas(value: str) -> list[str]:
229229
)
230230

231231

232-
def _find_pyproject() -> list[str]:
233-
"""Search for file pyproject.toml in the parent directories recursively.
234-
235-
It resolves symlinks, so if there is any symlink up in the tree, it does not respect them
236-
"""
237-
# We start from the parent dir, since 'pyproject.toml' is already parsed
238-
current_dir = os.path.abspath(os.path.join(os.path.curdir, os.path.pardir))
239-
is_root = False
240-
while not is_root:
241-
for pyproject_name in defaults.PYPROJECT_CONFIG_FILES:
242-
config_file = os.path.join(current_dir, pyproject_name)
243-
if os.path.isfile(config_file):
244-
return [os.path.abspath(config_file)]
245-
parent = os.path.abspath(os.path.join(current_dir, os.path.pardir))
246-
is_root = current_dir == parent or any(
247-
os.path.isdir(os.path.join(current_dir, cvs_root)) for cvs_root in (".git", ".hg")
248-
)
249-
current_dir = parent
250-
251-
return []
252-
253-
254232
def parse_config_file(
255233
options: Options,
256234
set_strict_flags: Callable[[], None],
@@ -270,9 +248,7 @@ def parse_config_file(
270248
if filename is not None:
271249
config_files: tuple[str, ...] = (filename,)
272250
else:
273-
config_files_iter: Iterable[str] = map(
274-
os.path.expanduser, defaults.CONFIG_FILES + _find_pyproject()
275-
)
251+
config_files_iter: Iterable[str] = map(os.path.expanduser, defaults.CONFIG_FILES)
276252
config_files = tuple(config_files_iter)
277253

278254
config_parser = configparser.RawConfigParser()

mypy/defaults.py

+33-1
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,41 @@
1212
# mypy, at least version PYTHON3_VERSION is needed.
1313
PYTHON3_VERSION_MIN: Final = (3, 8) # Keep in sync with typeshed's python support
1414

15+
16+
def find_pyproject() -> str:
17+
"""Search for file pyproject.toml in the parent directories recursively.
18+
19+
It resolves symlinks, so if there is any symlink up in the tree, it does not respect them
20+
21+
If the file is not found until the root of FS or repository, PYPROJECT_FILE is used
22+
"""
23+
24+
def is_root(current_dir: str) -> bool:
25+
parent = os.path.join(current_dir, os.path.pardir)
26+
return os.path.samefile(current_dir, parent) or any(
27+
os.path.isdir(os.path.join(current_dir, cvs_root)) for cvs_root in (".git", ".hg")
28+
)
29+
30+
# Preserve the original behavior, returning PYPROJECT_FILE if exists
31+
if os.path.isfile(PYPROJECT_FILE) or is_root(os.path.curdir):
32+
return PYPROJECT_FILE
33+
34+
# And iterate over the tree
35+
current_dir = os.path.pardir
36+
while not is_root(current_dir):
37+
config_file = os.path.join(current_dir, PYPROJECT_FILE)
38+
if os.path.isfile(config_file):
39+
return config_file
40+
parent = os.path.join(current_dir, os.path.pardir)
41+
current_dir = parent
42+
43+
return PYPROJECT_FILE
44+
45+
1546
CACHE_DIR: Final = ".mypy_cache"
1647
CONFIG_FILE: Final = ["mypy.ini", ".mypy.ini"]
17-
PYPROJECT_CONFIG_FILES: Final = ["pyproject.toml"]
48+
PYPROJECT_FILE: Final = "pyproject.toml"
49+
PYPROJECT_CONFIG_FILES: Final = [find_pyproject()]
1850
SHARED_CONFIG_FILES: Final = ["setup.cfg"]
1951
USER_CONFIG_FILES: Final = ["~/.config/mypy/config", "~/.mypy.ini"]
2052
if os.environ.get("XDG_CONFIG_HOME"):

0 commit comments

Comments
 (0)