test
This commit is contained in:
		| @ -0,0 +1,340 @@ | ||||
| """ | ||||
| Utilities for determining application-specific dirs. See <https://github.com/platformdirs/platformdirs> for details and | ||||
| usage. | ||||
| """ | ||||
| from __future__ import annotations | ||||
|  | ||||
| import os | ||||
| import sys | ||||
| from pathlib import Path | ||||
| from typing import TYPE_CHECKING | ||||
|  | ||||
| if TYPE_CHECKING: | ||||
|     from pip._vendor.typing_extensions import Literal  # pragma: no cover | ||||
|  | ||||
| from .api import PlatformDirsABC | ||||
| from .version import __version__, __version_info__ | ||||
|  | ||||
|  | ||||
| def _set_platform_dir_class() -> type[PlatformDirsABC]: | ||||
|     if sys.platform == "win32": | ||||
|         from pip._vendor.platformdirs.windows import Windows as Result | ||||
|     elif sys.platform == "darwin": | ||||
|         from pip._vendor.platformdirs.macos import MacOS as Result | ||||
|     else: | ||||
|         from pip._vendor.platformdirs.unix import Unix as Result | ||||
|  | ||||
|     if os.getenv("ANDROID_DATA") == "/data" and os.getenv("ANDROID_ROOT") == "/system": | ||||
|  | ||||
|         if os.getenv("SHELL") is not None: | ||||
|             return Result | ||||
|  | ||||
|         from pip._vendor.platformdirs.android import _android_folder | ||||
|  | ||||
|         if _android_folder() is not None: | ||||
|             from pip._vendor.platformdirs.android import Android | ||||
|  | ||||
|             return Android  # return to avoid redefinition of result | ||||
|  | ||||
|     return Result | ||||
|  | ||||
|  | ||||
| PlatformDirs = _set_platform_dir_class()  #: Currently active platform | ||||
| AppDirs = PlatformDirs  #: Backwards compatibility with appdirs | ||||
|  | ||||
|  | ||||
| def user_data_dir( | ||||
|     appname: str | None = None, | ||||
|     appauthor: str | None | Literal[False] = None, | ||||
|     version: str | None = None, | ||||
|     roaming: bool = False, | ||||
| ) -> str: | ||||
|     """ | ||||
|     :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. | ||||
|     :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. | ||||
|     :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. | ||||
|     :param roaming: See `roaming <platformdirs.api.PlatformDirsABC.version>`. | ||||
|     :returns: data directory tied to the user | ||||
|     """ | ||||
|     return PlatformDirs(appname=appname, appauthor=appauthor, version=version, roaming=roaming).user_data_dir | ||||
|  | ||||
|  | ||||
| def site_data_dir( | ||||
|     appname: str | None = None, | ||||
|     appauthor: str | None | Literal[False] = None, | ||||
|     version: str | None = None, | ||||
|     multipath: bool = False, | ||||
| ) -> str: | ||||
|     """ | ||||
|     :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. | ||||
|     :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. | ||||
|     :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. | ||||
|     :param multipath: See `roaming <platformdirs.api.PlatformDirsABC.multipath>`. | ||||
|     :returns: data directory shared by users | ||||
|     """ | ||||
|     return PlatformDirs(appname=appname, appauthor=appauthor, version=version, multipath=multipath).site_data_dir | ||||
|  | ||||
|  | ||||
| def user_config_dir( | ||||
|     appname: str | None = None, | ||||
|     appauthor: str | None | Literal[False] = None, | ||||
|     version: str | None = None, | ||||
|     roaming: bool = False, | ||||
| ) -> str: | ||||
|     """ | ||||
|     :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. | ||||
|     :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. | ||||
|     :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. | ||||
|     :param roaming: See `roaming <platformdirs.api.PlatformDirsABC.version>`. | ||||
|     :returns: config directory tied to the user | ||||
|     """ | ||||
|     return PlatformDirs(appname=appname, appauthor=appauthor, version=version, roaming=roaming).user_config_dir | ||||
|  | ||||
|  | ||||
| def site_config_dir( | ||||
|     appname: str | None = None, | ||||
|     appauthor: str | None | Literal[False] = None, | ||||
|     version: str | None = None, | ||||
|     multipath: bool = False, | ||||
| ) -> str: | ||||
|     """ | ||||
|     :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. | ||||
|     :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. | ||||
|     :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. | ||||
|     :param multipath: See `roaming <platformdirs.api.PlatformDirsABC.multipath>`. | ||||
|     :returns: config directory shared by the users | ||||
|     """ | ||||
|     return PlatformDirs(appname=appname, appauthor=appauthor, version=version, multipath=multipath).site_config_dir | ||||
|  | ||||
|  | ||||
| def user_cache_dir( | ||||
|     appname: str | None = None, | ||||
|     appauthor: str | None | Literal[False] = None, | ||||
|     version: str | None = None, | ||||
|     opinion: bool = True, | ||||
| ) -> str: | ||||
|     """ | ||||
|     :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. | ||||
|     :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. | ||||
|     :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. | ||||
|     :param opinion: See `roaming <platformdirs.api.PlatformDirsABC.opinion>`. | ||||
|     :returns: cache directory tied to the user | ||||
|     """ | ||||
|     return PlatformDirs(appname=appname, appauthor=appauthor, version=version, opinion=opinion).user_cache_dir | ||||
|  | ||||
|  | ||||
| def user_state_dir( | ||||
|     appname: str | None = None, | ||||
|     appauthor: str | None | Literal[False] = None, | ||||
|     version: str | None = None, | ||||
|     roaming: bool = False, | ||||
| ) -> str: | ||||
|     """ | ||||
|     :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. | ||||
|     :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. | ||||
|     :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. | ||||
|     :param roaming: See `roaming <platformdirs.api.PlatformDirsABC.version>`. | ||||
|     :returns: state directory tied to the user | ||||
|     """ | ||||
|     return PlatformDirs(appname=appname, appauthor=appauthor, version=version, roaming=roaming).user_state_dir | ||||
|  | ||||
|  | ||||
| def user_log_dir( | ||||
|     appname: str | None = None, | ||||
|     appauthor: str | None | Literal[False] = None, | ||||
|     version: str | None = None, | ||||
|     opinion: bool = True, | ||||
| ) -> str: | ||||
|     """ | ||||
|     :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. | ||||
|     :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. | ||||
|     :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. | ||||
|     :param opinion: See `roaming <platformdirs.api.PlatformDirsABC.opinion>`. | ||||
|     :returns: log directory tied to the user | ||||
|     """ | ||||
|     return PlatformDirs(appname=appname, appauthor=appauthor, version=version, opinion=opinion).user_log_dir | ||||
|  | ||||
|  | ||||
| def user_documents_dir() -> str: | ||||
|     """ | ||||
|     :returns: documents directory tied to the user | ||||
|     """ | ||||
|     return PlatformDirs().user_documents_dir | ||||
|  | ||||
|  | ||||
| def user_runtime_dir( | ||||
|     appname: str | None = None, | ||||
|     appauthor: str | None | Literal[False] = None, | ||||
|     version: str | None = None, | ||||
|     opinion: bool = True, | ||||
| ) -> str: | ||||
|     """ | ||||
|     :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. | ||||
|     :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. | ||||
|     :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. | ||||
|     :param opinion: See `opinion <platformdirs.api.PlatformDirsABC.opinion>`. | ||||
|     :returns: runtime directory tied to the user | ||||
|     """ | ||||
|     return PlatformDirs(appname=appname, appauthor=appauthor, version=version, opinion=opinion).user_runtime_dir | ||||
|  | ||||
|  | ||||
| def user_data_path( | ||||
|     appname: str | None = None, | ||||
|     appauthor: str | None | Literal[False] = None, | ||||
|     version: str | None = None, | ||||
|     roaming: bool = False, | ||||
| ) -> Path: | ||||
|     """ | ||||
|     :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. | ||||
|     :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. | ||||
|     :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. | ||||
|     :param roaming: See `roaming <platformdirs.api.PlatformDirsABC.version>`. | ||||
|     :returns: data path tied to the user | ||||
|     """ | ||||
|     return PlatformDirs(appname=appname, appauthor=appauthor, version=version, roaming=roaming).user_data_path | ||||
|  | ||||
|  | ||||
| def site_data_path( | ||||
|     appname: str | None = None, | ||||
|     appauthor: str | None | Literal[False] = None, | ||||
|     version: str | None = None, | ||||
|     multipath: bool = False, | ||||
| ) -> Path: | ||||
|     """ | ||||
|     :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. | ||||
|     :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. | ||||
|     :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. | ||||
|     :param multipath: See `multipath <platformdirs.api.PlatformDirsABC.multipath>`. | ||||
|     :returns: data path shared by users | ||||
|     """ | ||||
|     return PlatformDirs(appname=appname, appauthor=appauthor, version=version, multipath=multipath).site_data_path | ||||
|  | ||||
|  | ||||
| def user_config_path( | ||||
|     appname: str | None = None, | ||||
|     appauthor: str | None | Literal[False] = None, | ||||
|     version: str | None = None, | ||||
|     roaming: bool = False, | ||||
| ) -> Path: | ||||
|     """ | ||||
|     :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. | ||||
|     :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. | ||||
|     :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. | ||||
|     :param roaming: See `roaming <platformdirs.api.PlatformDirsABC.version>`. | ||||
|     :returns: config path tied to the user | ||||
|     """ | ||||
|     return PlatformDirs(appname=appname, appauthor=appauthor, version=version, roaming=roaming).user_config_path | ||||
|  | ||||
|  | ||||
| def site_config_path( | ||||
|     appname: str | None = None, | ||||
|     appauthor: str | None | Literal[False] = None, | ||||
|     version: str | None = None, | ||||
|     multipath: bool = False, | ||||
| ) -> Path: | ||||
|     """ | ||||
|     :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. | ||||
|     :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. | ||||
|     :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. | ||||
|     :param multipath: See `roaming <platformdirs.api.PlatformDirsABC.multipath>`. | ||||
|     :returns: config path shared by the users | ||||
|     """ | ||||
|     return PlatformDirs(appname=appname, appauthor=appauthor, version=version, multipath=multipath).site_config_path | ||||
|  | ||||
|  | ||||
| def user_cache_path( | ||||
|     appname: str | None = None, | ||||
|     appauthor: str | None | Literal[False] = None, | ||||
|     version: str | None = None, | ||||
|     opinion: bool = True, | ||||
| ) -> Path: | ||||
|     """ | ||||
|     :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. | ||||
|     :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. | ||||
|     :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. | ||||
|     :param opinion: See `roaming <platformdirs.api.PlatformDirsABC.opinion>`. | ||||
|     :returns: cache path tied to the user | ||||
|     """ | ||||
|     return PlatformDirs(appname=appname, appauthor=appauthor, version=version, opinion=opinion).user_cache_path | ||||
|  | ||||
|  | ||||
| def user_state_path( | ||||
|     appname: str | None = None, | ||||
|     appauthor: str | None | Literal[False] = None, | ||||
|     version: str | None = None, | ||||
|     roaming: bool = False, | ||||
| ) -> Path: | ||||
|     """ | ||||
|     :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. | ||||
|     :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. | ||||
|     :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. | ||||
|     :param roaming: See `roaming <platformdirs.api.PlatformDirsABC.version>`. | ||||
|     :returns: state path tied to the user | ||||
|     """ | ||||
|     return PlatformDirs(appname=appname, appauthor=appauthor, version=version, roaming=roaming).user_state_path | ||||
|  | ||||
|  | ||||
| def user_log_path( | ||||
|     appname: str | None = None, | ||||
|     appauthor: str | None | Literal[False] = None, | ||||
|     version: str | None = None, | ||||
|     opinion: bool = True, | ||||
| ) -> Path: | ||||
|     """ | ||||
|     :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. | ||||
|     :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. | ||||
|     :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. | ||||
|     :param opinion: See `roaming <platformdirs.api.PlatformDirsABC.opinion>`. | ||||
|     :returns: log path tied to the user | ||||
|     """ | ||||
|     return PlatformDirs(appname=appname, appauthor=appauthor, version=version, opinion=opinion).user_log_path | ||||
|  | ||||
|  | ||||
| def user_documents_path() -> Path: | ||||
|     """ | ||||
|     :returns: documents path tied to the user | ||||
|     """ | ||||
|     return PlatformDirs().user_documents_path | ||||
|  | ||||
|  | ||||
| def user_runtime_path( | ||||
|     appname: str | None = None, | ||||
|     appauthor: str | None | Literal[False] = None, | ||||
|     version: str | None = None, | ||||
|     opinion: bool = True, | ||||
| ) -> Path: | ||||
|     """ | ||||
|     :param appname: See `appname <platformdirs.api.PlatformDirsABC.appname>`. | ||||
|     :param appauthor: See `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`. | ||||
|     :param version: See `version <platformdirs.api.PlatformDirsABC.version>`. | ||||
|     :param opinion: See `opinion <platformdirs.api.PlatformDirsABC.opinion>`. | ||||
|     :returns: runtime path tied to the user | ||||
|     """ | ||||
|     return PlatformDirs(appname=appname, appauthor=appauthor, version=version, opinion=opinion).user_runtime_path | ||||
|  | ||||
|  | ||||
| __all__ = [ | ||||
|     "__version__", | ||||
|     "__version_info__", | ||||
|     "PlatformDirs", | ||||
|     "AppDirs", | ||||
|     "PlatformDirsABC", | ||||
|     "user_data_dir", | ||||
|     "user_config_dir", | ||||
|     "user_cache_dir", | ||||
|     "user_state_dir", | ||||
|     "user_log_dir", | ||||
|     "user_documents_dir", | ||||
|     "user_runtime_dir", | ||||
|     "site_data_dir", | ||||
|     "site_config_dir", | ||||
|     "user_data_path", | ||||
|     "user_config_path", | ||||
|     "user_cache_path", | ||||
|     "user_state_path", | ||||
|     "user_log_path", | ||||
|     "user_documents_path", | ||||
|     "user_runtime_path", | ||||
|     "site_data_path", | ||||
|     "site_config_path", | ||||
| ] | ||||
| @ -0,0 +1,46 @@ | ||||
| from __future__ import annotations | ||||
|  | ||||
| from pip._vendor.platformdirs import PlatformDirs, __version__ | ||||
|  | ||||
| PROPS = ( | ||||
|     "user_data_dir", | ||||
|     "user_config_dir", | ||||
|     "user_cache_dir", | ||||
|     "user_state_dir", | ||||
|     "user_log_dir", | ||||
|     "user_documents_dir", | ||||
|     "user_runtime_dir", | ||||
|     "site_data_dir", | ||||
|     "site_config_dir", | ||||
| ) | ||||
|  | ||||
|  | ||||
| def main() -> None: | ||||
|     app_name = "MyApp" | ||||
|     app_author = "MyCompany" | ||||
|  | ||||
|     print(f"-- platformdirs {__version__} --") | ||||
|  | ||||
|     print("-- app dirs (with optional 'version')") | ||||
|     dirs = PlatformDirs(app_name, app_author, version="1.0") | ||||
|     for prop in PROPS: | ||||
|         print(f"{prop}: {getattr(dirs, prop)}") | ||||
|  | ||||
|     print("\n-- app dirs (without optional 'version')") | ||||
|     dirs = PlatformDirs(app_name, app_author) | ||||
|     for prop in PROPS: | ||||
|         print(f"{prop}: {getattr(dirs, prop)}") | ||||
|  | ||||
|     print("\n-- app dirs (without optional 'appauthor')") | ||||
|     dirs = PlatformDirs(app_name) | ||||
|     for prop in PROPS: | ||||
|         print(f"{prop}: {getattr(dirs, prop)}") | ||||
|  | ||||
|     print("\n-- app dirs (with disabled 'appauthor')") | ||||
|     dirs = PlatformDirs(app_name, appauthor=False) | ||||
|     for prop in PROPS: | ||||
|         print(f"{prop}: {getattr(dirs, prop)}") | ||||
|  | ||||
|  | ||||
| if __name__ == "__main__": | ||||
|     main() | ||||
							
								
								
									
										120
									
								
								lib/python3.11/site-packages/pip/_vendor/platformdirs/android.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								lib/python3.11/site-packages/pip/_vendor/platformdirs/android.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,120 @@ | ||||
| from __future__ import annotations | ||||
|  | ||||
| import os | ||||
| import re | ||||
| import sys | ||||
| from functools import lru_cache | ||||
| from typing import cast | ||||
|  | ||||
| from .api import PlatformDirsABC | ||||
|  | ||||
|  | ||||
| class Android(PlatformDirsABC): | ||||
|     """ | ||||
|     Follows the guidance `from here <https://android.stackexchange.com/a/216132>`_. Makes use of the | ||||
|     `appname <platformdirs.api.PlatformDirsABC.appname>` and | ||||
|     `version <platformdirs.api.PlatformDirsABC.version>`. | ||||
|     """ | ||||
|  | ||||
|     @property | ||||
|     def user_data_dir(self) -> str: | ||||
|         """:return: data directory tied to the user, e.g. ``/data/user/<userid>/<packagename>/files/<AppName>``""" | ||||
|         return self._append_app_name_and_version(cast(str, _android_folder()), "files") | ||||
|  | ||||
|     @property | ||||
|     def site_data_dir(self) -> str: | ||||
|         """:return: data directory shared by users, same as `user_data_dir`""" | ||||
|         return self.user_data_dir | ||||
|  | ||||
|     @property | ||||
|     def user_config_dir(self) -> str: | ||||
|         """ | ||||
|         :return: config directory tied to the user, e.g. ``/data/user/<userid>/<packagename>/shared_prefs/<AppName>`` | ||||
|         """ | ||||
|         return self._append_app_name_and_version(cast(str, _android_folder()), "shared_prefs") | ||||
|  | ||||
|     @property | ||||
|     def site_config_dir(self) -> str: | ||||
|         """:return: config directory shared by the users, same as `user_config_dir`""" | ||||
|         return self.user_config_dir | ||||
|  | ||||
|     @property | ||||
|     def user_cache_dir(self) -> str: | ||||
|         """:return: cache directory tied to the user, e.g. e.g. ``/data/user/<userid>/<packagename>/cache/<AppName>``""" | ||||
|         return self._append_app_name_and_version(cast(str, _android_folder()), "cache") | ||||
|  | ||||
|     @property | ||||
|     def user_state_dir(self) -> str: | ||||
|         """:return: state directory tied to the user, same as `user_data_dir`""" | ||||
|         return self.user_data_dir | ||||
|  | ||||
|     @property | ||||
|     def user_log_dir(self) -> str: | ||||
|         """ | ||||
|         :return: log directory tied to the user, same as `user_cache_dir` if not opinionated else ``log`` in it, | ||||
|           e.g. ``/data/user/<userid>/<packagename>/cache/<AppName>/log`` | ||||
|         """ | ||||
|         path = self.user_cache_dir | ||||
|         if self.opinion: | ||||
|             path = os.path.join(path, "log") | ||||
|         return path | ||||
|  | ||||
|     @property | ||||
|     def user_documents_dir(self) -> str: | ||||
|         """ | ||||
|         :return: documents directory tied to the user e.g. ``/storage/emulated/0/Documents`` | ||||
|         """ | ||||
|         return _android_documents_folder() | ||||
|  | ||||
|     @property | ||||
|     def user_runtime_dir(self) -> str: | ||||
|         """ | ||||
|         :return: runtime directory tied to the user, same as `user_cache_dir` if not opinionated else ``tmp`` in it, | ||||
|           e.g. ``/data/user/<userid>/<packagename>/cache/<AppName>/tmp`` | ||||
|         """ | ||||
|         path = self.user_cache_dir | ||||
|         if self.opinion: | ||||
|             path = os.path.join(path, "tmp") | ||||
|         return path | ||||
|  | ||||
|  | ||||
| @lru_cache(maxsize=1) | ||||
| def _android_folder() -> str | None: | ||||
|     """:return: base folder for the Android OS or None if cannot be found""" | ||||
|     try: | ||||
|         # First try to get path to android app via pyjnius | ||||
|         from jnius import autoclass | ||||
|  | ||||
|         Context = autoclass("android.content.Context")  # noqa: N806 | ||||
|         result: str | None = Context.getFilesDir().getParentFile().getAbsolutePath() | ||||
|     except Exception: | ||||
|         # if fails find an android folder looking path on the sys.path | ||||
|         pattern = re.compile(r"/data/(data|user/\d+)/(.+)/files") | ||||
|         for path in sys.path: | ||||
|             if pattern.match(path): | ||||
|                 result = path.split("/files")[0] | ||||
|                 break | ||||
|         else: | ||||
|             result = None | ||||
|     return result | ||||
|  | ||||
|  | ||||
| @lru_cache(maxsize=1) | ||||
| def _android_documents_folder() -> str: | ||||
|     """:return: documents folder for the Android OS""" | ||||
|     # Get directories with pyjnius | ||||
|     try: | ||||
|         from jnius import autoclass | ||||
|  | ||||
|         Context = autoclass("android.content.Context")  # noqa: N806 | ||||
|         Environment = autoclass("android.os.Environment")  # noqa: N806 | ||||
|         documents_dir: str = Context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS).getAbsolutePath() | ||||
|     except Exception: | ||||
|         documents_dir = "/storage/emulated/0/Documents" | ||||
|  | ||||
|     return documents_dir | ||||
|  | ||||
|  | ||||
| __all__ = [ | ||||
|     "Android", | ||||
| ] | ||||
							
								
								
									
										156
									
								
								lib/python3.11/site-packages/pip/_vendor/platformdirs/api.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										156
									
								
								lib/python3.11/site-packages/pip/_vendor/platformdirs/api.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,156 @@ | ||||
| from __future__ import annotations | ||||
|  | ||||
| import os | ||||
| import sys | ||||
| from abc import ABC, abstractmethod | ||||
| from pathlib import Path | ||||
|  | ||||
| if sys.version_info >= (3, 8):  # pragma: no branch | ||||
|     from typing import Literal  # pragma: no cover | ||||
|  | ||||
|  | ||||
| class PlatformDirsABC(ABC): | ||||
|     """ | ||||
|     Abstract base class for platform directories. | ||||
|     """ | ||||
|  | ||||
|     def __init__( | ||||
|         self, | ||||
|         appname: str | None = None, | ||||
|         appauthor: str | None | Literal[False] = None, | ||||
|         version: str | None = None, | ||||
|         roaming: bool = False, | ||||
|         multipath: bool = False, | ||||
|         opinion: bool = True, | ||||
|     ): | ||||
|         """ | ||||
|         Create a new platform directory. | ||||
|  | ||||
|         :param appname: See `appname`. | ||||
|         :param appauthor: See `appauthor`. | ||||
|         :param version: See `version`. | ||||
|         :param roaming: See `roaming`. | ||||
|         :param multipath: See `multipath`. | ||||
|         :param opinion: See `opinion`. | ||||
|         """ | ||||
|         self.appname = appname  #: The name of application. | ||||
|         self.appauthor = appauthor | ||||
|         """ | ||||
|         The name of the app author or distributing body for this application. Typically, it is the owning company name. | ||||
|         Defaults to `appname`. You may pass ``False`` to disable it. | ||||
|         """ | ||||
|         self.version = version | ||||
|         """ | ||||
|         An optional version path element to append to the path. You might want to use this if you want multiple versions | ||||
|         of your app to be able to run independently. If used, this would typically be ``<major>.<minor>``. | ||||
|         """ | ||||
|         self.roaming = roaming | ||||
|         """ | ||||
|         Whether to use the roaming appdata directory on Windows. That means that for users on a Windows network setup | ||||
|         for roaming profiles, this user data will be synced on login (see | ||||
|         `here <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>`_). | ||||
|         """ | ||||
|         self.multipath = multipath | ||||
|         """ | ||||
|         An optional parameter only applicable to Unix/Linux which indicates that the entire list of data dirs should be | ||||
|         returned. By default, the first item would only be returned. | ||||
|         """ | ||||
|         self.opinion = opinion  #: A flag to indicating to use opinionated values. | ||||
|  | ||||
|     def _append_app_name_and_version(self, *base: str) -> str: | ||||
|         params = list(base[1:]) | ||||
|         if self.appname: | ||||
|             params.append(self.appname) | ||||
|             if self.version: | ||||
|                 params.append(self.version) | ||||
|         return os.path.join(base[0], *params) | ||||
|  | ||||
|     @property | ||||
|     @abstractmethod | ||||
|     def user_data_dir(self) -> str: | ||||
|         """:return: data directory tied to the user""" | ||||
|  | ||||
|     @property | ||||
|     @abstractmethod | ||||
|     def site_data_dir(self) -> str: | ||||
|         """:return: data directory shared by users""" | ||||
|  | ||||
|     @property | ||||
|     @abstractmethod | ||||
|     def user_config_dir(self) -> str: | ||||
|         """:return: config directory tied to the user""" | ||||
|  | ||||
|     @property | ||||
|     @abstractmethod | ||||
|     def site_config_dir(self) -> str: | ||||
|         """:return: config directory shared by the users""" | ||||
|  | ||||
|     @property | ||||
|     @abstractmethod | ||||
|     def user_cache_dir(self) -> str: | ||||
|         """:return: cache directory tied to the user""" | ||||
|  | ||||
|     @property | ||||
|     @abstractmethod | ||||
|     def user_state_dir(self) -> str: | ||||
|         """:return: state directory tied to the user""" | ||||
|  | ||||
|     @property | ||||
|     @abstractmethod | ||||
|     def user_log_dir(self) -> str: | ||||
|         """:return: log directory tied to the user""" | ||||
|  | ||||
|     @property | ||||
|     @abstractmethod | ||||
|     def user_documents_dir(self) -> str: | ||||
|         """:return: documents directory tied to the user""" | ||||
|  | ||||
|     @property | ||||
|     @abstractmethod | ||||
|     def user_runtime_dir(self) -> str: | ||||
|         """:return: runtime directory tied to the user""" | ||||
|  | ||||
|     @property | ||||
|     def user_data_path(self) -> Path: | ||||
|         """:return: data path tied to the user""" | ||||
|         return Path(self.user_data_dir) | ||||
|  | ||||
|     @property | ||||
|     def site_data_path(self) -> Path: | ||||
|         """:return: data path shared by users""" | ||||
|         return Path(self.site_data_dir) | ||||
|  | ||||
|     @property | ||||
|     def user_config_path(self) -> Path: | ||||
|         """:return: config path tied to the user""" | ||||
|         return Path(self.user_config_dir) | ||||
|  | ||||
|     @property | ||||
|     def site_config_path(self) -> Path: | ||||
|         """:return: config path shared by the users""" | ||||
|         return Path(self.site_config_dir) | ||||
|  | ||||
|     @property | ||||
|     def user_cache_path(self) -> Path: | ||||
|         """:return: cache path tied to the user""" | ||||
|         return Path(self.user_cache_dir) | ||||
|  | ||||
|     @property | ||||
|     def user_state_path(self) -> Path: | ||||
|         """:return: state path tied to the user""" | ||||
|         return Path(self.user_state_dir) | ||||
|  | ||||
|     @property | ||||
|     def user_log_path(self) -> Path: | ||||
|         """:return: log path tied to the user""" | ||||
|         return Path(self.user_log_dir) | ||||
|  | ||||
|     @property | ||||
|     def user_documents_path(self) -> Path: | ||||
|         """:return: documents path tied to the user""" | ||||
|         return Path(self.user_documents_dir) | ||||
|  | ||||
|     @property | ||||
|     def user_runtime_path(self) -> Path: | ||||
|         """:return: runtime path tied to the user""" | ||||
|         return Path(self.user_runtime_dir) | ||||
| @ -0,0 +1,64 @@ | ||||
| from __future__ import annotations | ||||
|  | ||||
| import os | ||||
|  | ||||
| from .api import PlatformDirsABC | ||||
|  | ||||
|  | ||||
| class MacOS(PlatformDirsABC): | ||||
|     """ | ||||
|     Platform directories for the macOS operating system. Follows the guidance from `Apple documentation | ||||
|     <https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/MacOSXDirectories/MacOSXDirectories.html>`_. | ||||
|     Makes use of the `appname <platformdirs.api.PlatformDirsABC.appname>` and | ||||
|     `version <platformdirs.api.PlatformDirsABC.version>`. | ||||
|     """ | ||||
|  | ||||
|     @property | ||||
|     def user_data_dir(self) -> str: | ||||
|         """:return: data directory tied to the user, e.g. ``~/Library/Application Support/$appname/$version``""" | ||||
|         return self._append_app_name_and_version(os.path.expanduser("~/Library/Application Support/")) | ||||
|  | ||||
|     @property | ||||
|     def site_data_dir(self) -> str: | ||||
|         """:return: data directory shared by users, e.g. ``/Library/Application Support/$appname/$version``""" | ||||
|         return self._append_app_name_and_version("/Library/Application Support") | ||||
|  | ||||
|     @property | ||||
|     def user_config_dir(self) -> str: | ||||
|         """:return: config directory tied to the user, e.g. ``~/Library/Preferences/$appname/$version``""" | ||||
|         return self._append_app_name_and_version(os.path.expanduser("~/Library/Preferences/")) | ||||
|  | ||||
|     @property | ||||
|     def site_config_dir(self) -> str: | ||||
|         """:return: config directory shared by the users, e.g. ``/Library/Preferences/$appname``""" | ||||
|         return self._append_app_name_and_version("/Library/Preferences") | ||||
|  | ||||
|     @property | ||||
|     def user_cache_dir(self) -> str: | ||||
|         """:return: cache directory tied to the user, e.g. ``~/Library/Caches/$appname/$version``""" | ||||
|         return self._append_app_name_and_version(os.path.expanduser("~/Library/Caches")) | ||||
|  | ||||
|     @property | ||||
|     def user_state_dir(self) -> str: | ||||
|         """:return: state directory tied to the user, same as `user_data_dir`""" | ||||
|         return self.user_data_dir | ||||
|  | ||||
|     @property | ||||
|     def user_log_dir(self) -> str: | ||||
|         """:return: log directory tied to the user, e.g. ``~/Library/Logs/$appname/$version``""" | ||||
|         return self._append_app_name_and_version(os.path.expanduser("~/Library/Logs")) | ||||
|  | ||||
|     @property | ||||
|     def user_documents_dir(self) -> str: | ||||
|         """:return: documents directory tied to the user, e.g. ``~/Documents``""" | ||||
|         return os.path.expanduser("~/Documents") | ||||
|  | ||||
|     @property | ||||
|     def user_runtime_dir(self) -> str: | ||||
|         """:return: runtime directory tied to the user, e.g. ``~/Library/Caches/TemporaryItems/$appname/$version``""" | ||||
|         return self._append_app_name_and_version(os.path.expanduser("~/Library/Caches/TemporaryItems")) | ||||
|  | ||||
|  | ||||
| __all__ = [ | ||||
|     "MacOS", | ||||
| ] | ||||
							
								
								
									
										181
									
								
								lib/python3.11/site-packages/pip/_vendor/platformdirs/unix.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										181
									
								
								lib/python3.11/site-packages/pip/_vendor/platformdirs/unix.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,181 @@ | ||||
| from __future__ import annotations | ||||
|  | ||||
| import os | ||||
| import sys | ||||
| from configparser import ConfigParser | ||||
| from pathlib import Path | ||||
|  | ||||
| from .api import PlatformDirsABC | ||||
|  | ||||
| if sys.platform.startswith("linux"):  # pragma: no branch # no op check, only to please the type checker | ||||
|     from os import getuid | ||||
| else: | ||||
|  | ||||
|     def getuid() -> int: | ||||
|         raise RuntimeError("should only be used on Linux") | ||||
|  | ||||
|  | ||||
| class Unix(PlatformDirsABC): | ||||
|     """ | ||||
|     On Unix/Linux, we follow the | ||||
|     `XDG Basedir Spec <https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html>`_. The spec allows | ||||
|     overriding directories with environment variables. The examples show are the default values, alongside the name of | ||||
|     the environment variable that overrides them. Makes use of the | ||||
|     `appname <platformdirs.api.PlatformDirsABC.appname>`, | ||||
|     `version <platformdirs.api.PlatformDirsABC.version>`, | ||||
|     `multipath <platformdirs.api.PlatformDirsABC.multipath>`, | ||||
|     `opinion <platformdirs.api.PlatformDirsABC.opinion>`. | ||||
|     """ | ||||
|  | ||||
|     @property | ||||
|     def user_data_dir(self) -> str: | ||||
|         """ | ||||
|         :return: data directory tied to the user, e.g. ``~/.local/share/$appname/$version`` or | ||||
|          ``$XDG_DATA_HOME/$appname/$version`` | ||||
|         """ | ||||
|         path = os.environ.get("XDG_DATA_HOME", "") | ||||
|         if not path.strip(): | ||||
|             path = os.path.expanduser("~/.local/share") | ||||
|         return self._append_app_name_and_version(path) | ||||
|  | ||||
|     @property | ||||
|     def site_data_dir(self) -> str: | ||||
|         """ | ||||
|         :return: data directories shared by users (if `multipath <platformdirs.api.PlatformDirsABC.multipath>` is | ||||
|          enabled and ``XDG_DATA_DIR`` is set and a multi path the response is also a multi path separated by the OS | ||||
|          path separator), e.g. ``/usr/local/share/$appname/$version`` or ``/usr/share/$appname/$version`` | ||||
|         """ | ||||
|         # XDG default for $XDG_DATA_DIRS; only first, if multipath is False | ||||
|         path = os.environ.get("XDG_DATA_DIRS", "") | ||||
|         if not path.strip(): | ||||
|             path = f"/usr/local/share{os.pathsep}/usr/share" | ||||
|         return self._with_multi_path(path) | ||||
|  | ||||
|     def _with_multi_path(self, path: str) -> str: | ||||
|         path_list = path.split(os.pathsep) | ||||
|         if not self.multipath: | ||||
|             path_list = path_list[0:1] | ||||
|         path_list = [self._append_app_name_and_version(os.path.expanduser(p)) for p in path_list] | ||||
|         return os.pathsep.join(path_list) | ||||
|  | ||||
|     @property | ||||
|     def user_config_dir(self) -> str: | ||||
|         """ | ||||
|         :return: config directory tied to the user, e.g. ``~/.config/$appname/$version`` or | ||||
|          ``$XDG_CONFIG_HOME/$appname/$version`` | ||||
|         """ | ||||
|         path = os.environ.get("XDG_CONFIG_HOME", "") | ||||
|         if not path.strip(): | ||||
|             path = os.path.expanduser("~/.config") | ||||
|         return self._append_app_name_and_version(path) | ||||
|  | ||||
|     @property | ||||
|     def site_config_dir(self) -> str: | ||||
|         """ | ||||
|         :return: config directories shared by users (if `multipath <platformdirs.api.PlatformDirsABC.multipath>` | ||||
|          is enabled and ``XDG_DATA_DIR`` is set and a multi path the response is also a multi path separated by the OS | ||||
|          path separator), e.g. ``/etc/xdg/$appname/$version`` | ||||
|         """ | ||||
|         # XDG default for $XDG_CONFIG_DIRS only first, if multipath is False | ||||
|         path = os.environ.get("XDG_CONFIG_DIRS", "") | ||||
|         if not path.strip(): | ||||
|             path = "/etc/xdg" | ||||
|         return self._with_multi_path(path) | ||||
|  | ||||
|     @property | ||||
|     def user_cache_dir(self) -> str: | ||||
|         """ | ||||
|         :return: cache directory tied to the user, e.g. ``~/.cache/$appname/$version`` or | ||||
|          ``~/$XDG_CACHE_HOME/$appname/$version`` | ||||
|         """ | ||||
|         path = os.environ.get("XDG_CACHE_HOME", "") | ||||
|         if not path.strip(): | ||||
|             path = os.path.expanduser("~/.cache") | ||||
|         return self._append_app_name_and_version(path) | ||||
|  | ||||
|     @property | ||||
|     def user_state_dir(self) -> str: | ||||
|         """ | ||||
|         :return: state directory tied to the user, e.g. ``~/.local/state/$appname/$version`` or | ||||
|          ``$XDG_STATE_HOME/$appname/$version`` | ||||
|         """ | ||||
|         path = os.environ.get("XDG_STATE_HOME", "") | ||||
|         if not path.strip(): | ||||
|             path = os.path.expanduser("~/.local/state") | ||||
|         return self._append_app_name_and_version(path) | ||||
|  | ||||
|     @property | ||||
|     def user_log_dir(self) -> str: | ||||
|         """ | ||||
|         :return: log directory tied to the user, same as `user_data_dir` if not opinionated else ``log`` in it | ||||
|         """ | ||||
|         path = self.user_cache_dir | ||||
|         if self.opinion: | ||||
|             path = os.path.join(path, "log") | ||||
|         return path | ||||
|  | ||||
|     @property | ||||
|     def user_documents_dir(self) -> str: | ||||
|         """ | ||||
|         :return: documents directory tied to the user, e.g. ``~/Documents`` | ||||
|         """ | ||||
|         documents_dir = _get_user_dirs_folder("XDG_DOCUMENTS_DIR") | ||||
|         if documents_dir is None: | ||||
|             documents_dir = os.environ.get("XDG_DOCUMENTS_DIR", "").strip() | ||||
|             if not documents_dir: | ||||
|                 documents_dir = os.path.expanduser("~/Documents") | ||||
|  | ||||
|         return documents_dir | ||||
|  | ||||
|     @property | ||||
|     def user_runtime_dir(self) -> str: | ||||
|         """ | ||||
|         :return: runtime directory tied to the user, e.g. ``/run/user/$(id -u)/$appname/$version`` or | ||||
|          ``$XDG_RUNTIME_DIR/$appname/$version`` | ||||
|         """ | ||||
|         path = os.environ.get("XDG_RUNTIME_DIR", "") | ||||
|         if not path.strip(): | ||||
|             path = f"/run/user/{getuid()}" | ||||
|         return self._append_app_name_and_version(path) | ||||
|  | ||||
|     @property | ||||
|     def site_data_path(self) -> Path: | ||||
|         """:return: data path shared by users. Only return first item, even if ``multipath`` is set to ``True``""" | ||||
|         return self._first_item_as_path_if_multipath(self.site_data_dir) | ||||
|  | ||||
|     @property | ||||
|     def site_config_path(self) -> Path: | ||||
|         """:return: config path shared by the users. Only return first item, even if ``multipath`` is set to ``True``""" | ||||
|         return self._first_item_as_path_if_multipath(self.site_config_dir) | ||||
|  | ||||
|     def _first_item_as_path_if_multipath(self, directory: str) -> Path: | ||||
|         if self.multipath: | ||||
|             # If multipath is True, the first path is returned. | ||||
|             directory = directory.split(os.pathsep)[0] | ||||
|         return Path(directory) | ||||
|  | ||||
|  | ||||
| def _get_user_dirs_folder(key: str) -> str | None: | ||||
|     """Return directory from user-dirs.dirs config file. See https://freedesktop.org/wiki/Software/xdg-user-dirs/""" | ||||
|     user_dirs_config_path = os.path.join(Unix().user_config_dir, "user-dirs.dirs") | ||||
|     if os.path.exists(user_dirs_config_path): | ||||
|         parser = ConfigParser() | ||||
|  | ||||
|         with open(user_dirs_config_path) as stream: | ||||
|             # Add fake section header, so ConfigParser doesn't complain | ||||
|             parser.read_string(f"[top]\n{stream.read()}") | ||||
|  | ||||
|         if key not in parser["top"]: | ||||
|             return None | ||||
|  | ||||
|         path = parser["top"][key].strip('"') | ||||
|         # Handle relative home paths | ||||
|         path = path.replace("$HOME", os.path.expanduser("~")) | ||||
|         return path | ||||
|  | ||||
|     return None | ||||
|  | ||||
|  | ||||
| __all__ = [ | ||||
|     "Unix", | ||||
| ] | ||||
| @ -0,0 +1,4 @@ | ||||
| """Version information""" | ||||
|  | ||||
| __version__ = "2.5.2" | ||||
| __version_info__ = (2, 5, 2) | ||||
							
								
								
									
										182
									
								
								lib/python3.11/site-packages/pip/_vendor/platformdirs/windows.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										182
									
								
								lib/python3.11/site-packages/pip/_vendor/platformdirs/windows.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,182 @@ | ||||
| from __future__ import annotations | ||||
|  | ||||
| import ctypes | ||||
| import os | ||||
| from functools import lru_cache | ||||
| from typing import Callable | ||||
|  | ||||
| from .api import PlatformDirsABC | ||||
|  | ||||
|  | ||||
| class Windows(PlatformDirsABC): | ||||
|     """`MSDN on where to store app data files | ||||
|     <http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120>`_. | ||||
|     Makes use of the | ||||
|     `appname <platformdirs.api.PlatformDirsABC.appname>`, | ||||
|     `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`, | ||||
|     `version <platformdirs.api.PlatformDirsABC.version>`, | ||||
|     `roaming <platformdirs.api.PlatformDirsABC.roaming>`, | ||||
|     `opinion <platformdirs.api.PlatformDirsABC.opinion>`.""" | ||||
|  | ||||
|     @property | ||||
|     def user_data_dir(self) -> str: | ||||
|         """ | ||||
|         :return: data directory tied to the user, e.g. | ||||
|          ``%USERPROFILE%\\AppData\\Local\\$appauthor\\$appname`` (not roaming) or | ||||
|          ``%USERPROFILE%\\AppData\\Roaming\\$appauthor\\$appname`` (roaming) | ||||
|         """ | ||||
|         const = "CSIDL_APPDATA" if self.roaming else "CSIDL_LOCAL_APPDATA" | ||||
|         path = os.path.normpath(get_win_folder(const)) | ||||
|         return self._append_parts(path) | ||||
|  | ||||
|     def _append_parts(self, path: str, *, opinion_value: str | None = None) -> str: | ||||
|         params = [] | ||||
|         if self.appname: | ||||
|             if self.appauthor is not False: | ||||
|                 author = self.appauthor or self.appname | ||||
|                 params.append(author) | ||||
|             params.append(self.appname) | ||||
|             if opinion_value is not None and self.opinion: | ||||
|                 params.append(opinion_value) | ||||
|             if self.version: | ||||
|                 params.append(self.version) | ||||
|         return os.path.join(path, *params) | ||||
|  | ||||
|     @property | ||||
|     def site_data_dir(self) -> str: | ||||
|         """:return: data directory shared by users, e.g. ``C:\\ProgramData\\$appauthor\\$appname``""" | ||||
|         path = os.path.normpath(get_win_folder("CSIDL_COMMON_APPDATA")) | ||||
|         return self._append_parts(path) | ||||
|  | ||||
|     @property | ||||
|     def user_config_dir(self) -> str: | ||||
|         """:return: config directory tied to the user, same as `user_data_dir`""" | ||||
|         return self.user_data_dir | ||||
|  | ||||
|     @property | ||||
|     def site_config_dir(self) -> str: | ||||
|         """:return: config directory shared by the users, same as `site_data_dir`""" | ||||
|         return self.site_data_dir | ||||
|  | ||||
|     @property | ||||
|     def user_cache_dir(self) -> str: | ||||
|         """ | ||||
|         :return: cache directory tied to the user (if opinionated with ``Cache`` folder within ``$appname``) e.g. | ||||
|          ``%USERPROFILE%\\AppData\\Local\\$appauthor\\$appname\\Cache\\$version`` | ||||
|         """ | ||||
|         path = os.path.normpath(get_win_folder("CSIDL_LOCAL_APPDATA")) | ||||
|         return self._append_parts(path, opinion_value="Cache") | ||||
|  | ||||
|     @property | ||||
|     def user_state_dir(self) -> str: | ||||
|         """:return: state directory tied to the user, same as `user_data_dir`""" | ||||
|         return self.user_data_dir | ||||
|  | ||||
|     @property | ||||
|     def user_log_dir(self) -> str: | ||||
|         """ | ||||
|         :return: log directory tied to the user, same as `user_data_dir` if not opinionated else ``Logs`` in it | ||||
|         """ | ||||
|         path = self.user_data_dir | ||||
|         if self.opinion: | ||||
|             path = os.path.join(path, "Logs") | ||||
|         return path | ||||
|  | ||||
|     @property | ||||
|     def user_documents_dir(self) -> str: | ||||
|         """ | ||||
|         :return: documents directory tied to the user e.g. ``%USERPROFILE%\\Documents`` | ||||
|         """ | ||||
|         return os.path.normpath(get_win_folder("CSIDL_PERSONAL")) | ||||
|  | ||||
|     @property | ||||
|     def user_runtime_dir(self) -> str: | ||||
|         """ | ||||
|         :return: runtime directory tied to the user, e.g. | ||||
|          ``%USERPROFILE%\\AppData\\Local\\Temp\\$appauthor\\$appname`` | ||||
|         """ | ||||
|         path = os.path.normpath(os.path.join(get_win_folder("CSIDL_LOCAL_APPDATA"), "Temp")) | ||||
|         return self._append_parts(path) | ||||
|  | ||||
|  | ||||
| def get_win_folder_from_env_vars(csidl_name: str) -> str: | ||||
|     """Get folder from environment variables.""" | ||||
|     if csidl_name == "CSIDL_PERSONAL":  # does not have an environment name | ||||
|         return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Documents") | ||||
|  | ||||
|     env_var_name = { | ||||
|         "CSIDL_APPDATA": "APPDATA", | ||||
|         "CSIDL_COMMON_APPDATA": "ALLUSERSPROFILE", | ||||
|         "CSIDL_LOCAL_APPDATA": "LOCALAPPDATA", | ||||
|     }.get(csidl_name) | ||||
|     if env_var_name is None: | ||||
|         raise ValueError(f"Unknown CSIDL name: {csidl_name}") | ||||
|     result = os.environ.get(env_var_name) | ||||
|     if result is None: | ||||
|         raise ValueError(f"Unset environment variable: {env_var_name}") | ||||
|     return result | ||||
|  | ||||
|  | ||||
| def get_win_folder_from_registry(csidl_name: str) -> str: | ||||
|     """Get folder from the registry. | ||||
|  | ||||
|     This is a fallback technique at best. I'm not sure if using the | ||||
|     registry for this guarantees us the correct answer for all CSIDL_* | ||||
|     names. | ||||
|     """ | ||||
|     shell_folder_name = { | ||||
|         "CSIDL_APPDATA": "AppData", | ||||
|         "CSIDL_COMMON_APPDATA": "Common AppData", | ||||
|         "CSIDL_LOCAL_APPDATA": "Local AppData", | ||||
|         "CSIDL_PERSONAL": "Personal", | ||||
|     }.get(csidl_name) | ||||
|     if shell_folder_name is None: | ||||
|         raise ValueError(f"Unknown CSIDL name: {csidl_name}") | ||||
|  | ||||
|     import winreg | ||||
|  | ||||
|     key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders") | ||||
|     directory, _ = winreg.QueryValueEx(key, shell_folder_name) | ||||
|     return str(directory) | ||||
|  | ||||
|  | ||||
| def get_win_folder_via_ctypes(csidl_name: str) -> str: | ||||
|     """Get folder with ctypes.""" | ||||
|     csidl_const = { | ||||
|         "CSIDL_APPDATA": 26, | ||||
|         "CSIDL_COMMON_APPDATA": 35, | ||||
|         "CSIDL_LOCAL_APPDATA": 28, | ||||
|         "CSIDL_PERSONAL": 5, | ||||
|     }.get(csidl_name) | ||||
|     if csidl_const is None: | ||||
|         raise ValueError(f"Unknown CSIDL name: {csidl_name}") | ||||
|  | ||||
|     buf = ctypes.create_unicode_buffer(1024) | ||||
|     windll = getattr(ctypes, "windll")  # noqa: B009 # using getattr to avoid false positive with mypy type checker | ||||
|     windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) | ||||
|  | ||||
|     # Downgrade to short path name if it has highbit chars. | ||||
|     if any(ord(c) > 255 for c in buf): | ||||
|         buf2 = ctypes.create_unicode_buffer(1024) | ||||
|         if windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): | ||||
|             buf = buf2 | ||||
|  | ||||
|     return buf.value | ||||
|  | ||||
|  | ||||
| def _pick_get_win_folder() -> Callable[[str], str]: | ||||
|     if hasattr(ctypes, "windll"): | ||||
|         return get_win_folder_via_ctypes | ||||
|     try: | ||||
|         import winreg  # noqa: F401 | ||||
|     except ImportError: | ||||
|         return get_win_folder_from_env_vars | ||||
|     else: | ||||
|         return get_win_folder_from_registry | ||||
|  | ||||
|  | ||||
| get_win_folder = lru_cache(maxsize=None)(_pick_get_win_folder()) | ||||
|  | ||||
| __all__ = [ | ||||
|     "Windows", | ||||
| ] | ||||
		Reference in New Issue
	
	Block a user