11from __future__ import annotations
22
33from contextlib import contextmanager
4+ from pathlib import Path
45from typing import TYPE_CHECKING
56
67import typer
@@ -19,30 +20,35 @@ class UsethisConfig(BaseModel):
1920 frozen: Do not install dependencies, nor update lockfiles.
2021 alert_only: Suppress all output except for warnings and errors.
2122 subprocess_verbose: Verbose output for subprocesses.
23+ force_project_dir: Directory for the project. If None, defaults to the current
24+ working directory dynamically determined at runtime.
2225 """
2326
24- offline : bool
25- quiet : bool
27+ offline : bool = False
28+ quiet : bool = False
2629 frozen : bool = False
2730 alert_only : bool = False
2831 subprocess_verbose : bool = False
32+ project_dir : Path | None = None
2933
3034 @contextmanager
31- def set (
35+ def set ( # noqa: PLR0913
3236 self ,
3337 * ,
3438 offline : bool | None = None ,
3539 quiet : bool | None = None ,
3640 frozen : bool | None = None ,
3741 alert_only : bool | None = None ,
3842 subprocess_verbose : bool | None = None ,
43+ project_dir : Path | None = None ,
3944 ) -> Generator [None , None , None ]:
4045 """Temporarily change command options."""
4146 old_offline = self .offline
4247 old_quiet = self .quiet
4348 old_frozen = self .frozen
4449 old_alert_only = self .alert_only
4550 old_subprocess_verbose = self .subprocess_verbose
51+ old_roject_dir = self .project_dir
4652
4753 if offline is None :
4854 offline = old_offline
@@ -54,18 +60,28 @@ def set(
5460 alert_only = self .alert_only
5561 if subprocess_verbose is None :
5662 subprocess_verbose = old_subprocess_verbose
63+ if project_dir is None :
64+ project_dir = old_roject_dir
5765
5866 self .offline = offline
5967 self .quiet = quiet
6068 self .frozen = frozen
6169 self .alert_only = alert_only
6270 self .subprocess_verbose = subprocess_verbose
71+ self .project_dir = project_dir
6372 yield
6473 self .offline = old_offline
6574 self .quiet = old_quiet
6675 self .frozen = old_frozen
6776 self .alert_only = old_alert_only
6877 self .subprocess_verbose = old_subprocess_verbose
78+ self .project_dir = old_roject_dir
79+
80+ def cpd (self ) -> Path :
81+ """Return the current project directory."""
82+ if self .project_dir is None :
83+ return Path .cwd ()
84+ return self .project_dir
6985
7086
7187_OFFLINE_DEFAULT = False
0 commit comments