Source code for typed_settings._file_utils
from pathlib import Path
from typing import Iterable, Optional, Union
ROOT_DIR = Path().resolve().root
[docs]
def find(
filename: str,
stop_dir: Union[str, Path] = ROOT_DIR,
stop_files: Iterable[str] = (".git", ".hg"),
*,
start_dir: Optional[Path] = None,
) -> Path:
"""
Search for a file in the current directory and its parents and return its
path.
If the file cannot be found until *stop_dir* is reached or a directory
contains *stop_file*, return the input *filename*.
Args:
filename: The name of the file to find.
stop_dir: Stop searching if the current search dir equals this one.
stop_files: Stop searching if the current search dir contains
this file.
start_dir: Start directory for the search, defaults to the current directory.
Returns:
The resolved path to *filename* if found, else ``Path(filename)``.
Examples:
Find :file:`settings.toml` until the root of the current directory
is reached::
find("settings.py")
Find :file:`pyproject.toml` only in the current Git project::
find("pyproject.toml", stop_file=".git")
.. versionchanged:: 23.1.0
Added the *start_dir* parameter.
"""
if start_dir is None:
start_dir = Path.cwd()
start = start_dir.joinpath(filename)
for path in start.parents:
p = path.joinpath(filename)
if p.exists():
return p
if path == stop_dir:
return start
for stop_file in stop_files:
if path.joinpath(stop_file).exists():
return start
return start