|
12 | 12 | # mypy, at least version PYTHON3_VERSION is needed.
|
13 | 13 | PYTHON3_VERSION_MIN: Final = (3, 8) # Keep in sync with typeshed's python support
|
14 | 14 |
|
| 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 | + |
15 | 46 | CACHE_DIR: Final = ".mypy_cache"
|
16 | 47 | 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()] |
18 | 50 | SHARED_CONFIG_FILES: Final = ["setup.cfg"]
|
19 | 51 | USER_CONFIG_FILES: Final = ["~/.config/mypy/config", "~/.mypy.ini"]
|
20 | 52 | if os.environ.get("XDG_CONFIG_HOME"):
|
|
0 commit comments