Source code for thamos.utils
#!/usr/bin/env python3
# thamos
# Copyright(C) 2018 - 2021 Fridolin Pokorny
#
# This program is free software: you can redistribute it and / or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""Utility and helper functions for Thamos."""
from typing import Optional
from contextlib import contextmanager
import logging
import os
import sys
from thoth.common import cwd
from .exceptions import NoProjectDirError
# Limit traversing to parent directories so we handle root - we do not loop over and over in root and we also
# handle cyclic symlinks natively.
_WORKDIR_DEPTH_LEN = 33
_LOGGER = logging.getLogger(__name__)
[docs]@contextmanager # type: ignore
def workdir(file_lookup: Optional[str] = None, warn_on_dir_change: bool = True) -> None:
"""Find project directory and cd into it."""
file_lookup = file_lookup or ".thoth.yaml"
project_dir = os.getcwd()
original_project_dir = project_dir
for _ in range(_WORKDIR_DEPTH_LEN):
file = os.path.join(project_dir, file_lookup)
if os.path.isfile(file):
with cwd(project_dir):
if project_dir != original_project_dir and warn_on_dir_change:
_LOGGER.warning("Using %r as project root directory", project_dir)
yield project_dir
break
project_dir = os.path.dirname(project_dir)
else:
raise NoProjectDirError(
f"No {file_lookup} found in the current directory {os.getcwd()!r} or in any of its parent "
f"directories, you can generate it using '{sys.argv[0]} config'"
)