Skip to content

Commit 70f00d6

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

File tree

2 files changed

+29
-26
lines changed

2 files changed

+29
-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

+28-1
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,36 @@
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+
# Preserve the original behavior, returning PYPROJECT_FILE if exists
24+
if os.path.isfile(PYPROJECT_FILE):
25+
return PYPROJECT_FILE
26+
current_dir = os.path.pardir
27+
is_root = False
28+
while not is_root:
29+
config_file = os.path.join(current_dir, PYPROJECT_FILE)
30+
if os.path.isfile(config_file):
31+
return config_file
32+
parent = os.path.join(current_dir, os.path.pardir)
33+
is_root = os.path.samefile(current_dir, parent) or any(
34+
os.path.isdir(os.path.join(current_dir, cvs_root)) for cvs_root in (".git", ".hg")
35+
)
36+
current_dir = parent
37+
38+
return PYPROJECT_FILE
39+
40+
1541
CACHE_DIR: Final = ".mypy_cache"
1642
CONFIG_FILE: Final = ["mypy.ini", ".mypy.ini"]
17-
PYPROJECT_CONFIG_FILES: Final = ["pyproject.toml"]
43+
PYPROJECT_FILE: Final = "pyproject.toml"
44+
PYPROJECT_CONFIG_FILES: Final = [find_pyproject()]
1845
SHARED_CONFIG_FILES: Final = ["setup.cfg"]
1946
USER_CONFIG_FILES: Final = ["~/.config/mypy/config", "~/.mypy.ini"]
2047
if os.environ.get("XDG_CONFIG_HOME"):

0 commit comments

Comments
 (0)