Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-platformdirs for openSUSE:Factory checked in at 2023-06-04 16:41:34 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-platformdirs (Old) and /work/SRC/openSUSE:Factory/.python-platformdirs.new.15902 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-platformdirs" Sun Jun 4 16:41:34 2023 rev:8 rq:1090568 version:3.5.1 Changes: -------- --- /work/SRC/openSUSE:Factory/python-platformdirs/python-platformdirs.changes 2023-04-22 22:00:31.537239830 +0200 +++ /work/SRC/openSUSE:Factory/.python-platformdirs.new.15902/python-platformdirs.changes 2023-06-04 16:41:41.869806709 +0200 @@ -1,0 +2,15 @@ +Fri Jun 2 20:55:07 UTC 2023 - Dirk Müller <dmuel...@suse.com> + +- update to 3.5.1: + * Add 3.12 support + * Add tox.ini to sdist + * removing Windows versions + * Better handling for UNIX support + * platformdirs: introduce `user_music_dir()` + * platformdirs: introduce `user_videos_dir()` + * Adding platformdirs.PlatformDirs to docs + * Fix linter failures + * Exclude bots from generated release notes + * platformdirs: introduce `user_pictures_dir()` + +------------------------------------------------------------------- Old: ---- platformdirs-3.2.0.tar.gz New: ---- platformdirs-3.5.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-platformdirs.spec ++++++ --- /var/tmp/diff_new_pack.L2JKjH/_old 2023-06-04 16:41:42.485810375 +0200 +++ /var/tmp/diff_new_pack.L2JKjH/_new 2023-06-04 16:41:42.493810423 +0200 @@ -18,7 +18,7 @@ %{?sle15_python_module_pythons} Name: python-platformdirs -Version: 3.2.0 +Version: 3.5.1 Release: 0 Summary: Module for determining appropriate platform-specific dirs License: MIT ++++++ platformdirs-3.2.0.tar.gz -> platformdirs-3.5.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/platformdirs-3.2.0/PKG-INFO new/platformdirs-3.5.1/PKG-INFO --- old/platformdirs-3.2.0/PKG-INFO 2020-02-02 01:00:00.000000000 +0100 +++ new/platformdirs-3.5.1/PKG-INFO 2020-02-02 01:00:00.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: platformdirs -Version: 3.2.0 +Version: 3.5.1 Summary: A small Python package for determining appropriate platform-specific dirs, e.g. a "user data dir". Project-URL: Documentation, https://platformdirs.readthedocs.io Project-URL: Homepage, https://github.com/platformdirs/platformdirs @@ -15,29 +15,29 @@ Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Topic :: Software Development :: Libraries :: Python Modules Requires-Python: >=3.7 Requires-Dist: typing-extensions>=4.5; python_version < '3.8' Provides-Extra: docs -Requires-Dist: furo>=2022.12.7; extra == 'docs' +Requires-Dist: furo>=2023.3.27; extra == 'docs' Requires-Dist: proselint>=0.13; extra == 'docs' -Requires-Dist: sphinx-autodoc-typehints!=1.23.4,>=1.22; extra == 'docs' -Requires-Dist: sphinx>=6.1.3; extra == 'docs' +Requires-Dist: sphinx-autodoc-typehints!=1.23.4,>=1.23; extra == 'docs' +Requires-Dist: sphinx>=6.2.1; extra == 'docs' Provides-Extra: test Requires-Dist: appdirs==1.4.4; extra == 'test' Requires-Dist: covdefaults>=2.3; extra == 'test' Requires-Dist: pytest-cov>=4; extra == 'test' Requires-Dist: pytest-mock>=3.10; extra == 'test' -Requires-Dist: pytest>=7.2.2; extra == 'test' +Requires-Dist: pytest>=7.3.1; extra == 'test' Description-Content-Type: text/x-rst The problem @@ -54,7 +54,7 @@ ~/Library/Application Support/<AppName> -If on Windows (at least English Win XP) that should be:: +If on Windows (at least English Win) that should be:: C:\Documents and Settings\<User>\Application Data\Local Settings\<AppAuthor>\<AppName> @@ -113,7 +113,7 @@ >>> user_runtime_dir(appname, appauthor) '/Users/trentm/Library/Caches/TemporaryItems/SuperApp' -On Windows 7: +On Windows: .. code-block:: pycon diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/platformdirs-3.2.0/README.rst new/platformdirs-3.5.1/README.rst --- old/platformdirs-3.2.0/README.rst 2020-02-02 01:00:00.000000000 +0100 +++ new/platformdirs-3.5.1/README.rst 2020-02-02 01:00:00.000000000 +0100 @@ -12,7 +12,7 @@ ~/Library/Application Support/<AppName> -If on Windows (at least English Win XP) that should be:: +If on Windows (at least English Win) that should be:: C:\Documents and Settings\<User>\Application Data\Local Settings\<AppAuthor>\<AppName> @@ -71,7 +71,7 @@ >>> user_runtime_dir(appname, appauthor) '/Users/trentm/Library/Caches/TemporaryItems/SuperApp' -On Windows 7: +On Windows: .. code-block:: pycon diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/platformdirs-3.2.0/pyproject.toml new/platformdirs-3.5.1/pyproject.toml --- old/platformdirs-3.2.0/pyproject.toml 2020-02-02 01:00:00.000000000 +0100 +++ new/platformdirs-3.5.1/pyproject.toml 2020-02-02 01:00:00.000000000 +0100 @@ -2,7 +2,7 @@ build-backend = "hatchling.build" requires = [ "hatch-vcs>=0.3", - "hatchling>=1.13", + "hatchling>=1.14.1", ] [project] @@ -31,13 +31,13 @@ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", - "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Software Development :: Libraries :: Python Modules", @@ -49,15 +49,15 @@ 'typing-extensions>=4.5; python_version < "3.8"', ] optional-dependencies.docs = [ - "furo>=2022.12.7", + "furo>=2023.3.27", "proselint>=0.13", - "sphinx>=6.1.3", - "sphinx-autodoc-typehints!=1.23.4,>=1.22", + "sphinx>=6.2.1", + "sphinx-autodoc-typehints!=1.23.4,>=1.23", ] optional-dependencies.test = [ "appdirs==1.4.4", "covdefaults>=2.3", - "pytest>=7.2.2", + "pytest>=7.3.1", "pytest-cov>=4", "pytest-mock>=3.10", ] @@ -68,7 +68,7 @@ [tool.hatch] build.hooks.vcs.version-file = "src/platformdirs/version.py" -build.targets.sdist.include = ["/src", "/tests"] +build.targets.sdist.include = ["/src", "/tests", "/tox.ini"] version.source = "vcs" [tool.black] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/platformdirs-3.2.0/src/platformdirs/__init__.py new/platformdirs-3.5.1/src/platformdirs/__init__.py --- old/platformdirs-3.2.0/src/platformdirs/__init__.py 2020-02-02 01:00:00.000000000 +0100 +++ new/platformdirs-3.5.1/src/platformdirs/__init__.py 2020-02-02 01:00:00.000000000 +0100 @@ -243,6 +243,27 @@ return PlatformDirs().user_documents_dir +def user_pictures_dir() -> str: + """ + :returns: pictures directory tied to the user + """ + return PlatformDirs().user_pictures_dir + + +def user_videos_dir() -> str: + """ + :returns: videos directory tied to the user + """ + return PlatformDirs().user_videos_dir + + +def user_music_dir() -> str: + """ + :returns: music directory tied to the user + """ + return PlatformDirs().user_music_dir + + def user_runtime_dir( appname: str | None = None, appauthor: str | None | Literal[False] = None, @@ -466,6 +487,27 @@ return PlatformDirs().user_documents_path +def user_pictures_path() -> Path: + """ + :returns: pictures path tied to the user + """ + return PlatformDirs().user_pictures_path + + +def user_videos_path() -> Path: + """ + :returns: videos path tied to the user + """ + return PlatformDirs().user_videos_path + + +def user_music_path() -> Path: + """ + :returns: music path tied to the user + """ + return PlatformDirs().user_music_path + + def user_runtime_path( appname: str | None = None, appauthor: str | None | Literal[False] = None, @@ -502,6 +544,9 @@ "user_state_dir", "user_log_dir", "user_documents_dir", + "user_pictures_dir", + "user_videos_dir", + "user_music_dir", "user_runtime_dir", "site_data_dir", "site_config_dir", @@ -512,6 +557,9 @@ "user_state_path", "user_log_path", "user_documents_path", + "user_pictures_path", + "user_videos_path", + "user_music_path", "user_runtime_path", "site_data_path", "site_config_path", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/platformdirs-3.2.0/src/platformdirs/__main__.py new/platformdirs-3.5.1/src/platformdirs/__main__.py --- old/platformdirs-3.2.0/src/platformdirs/__main__.py 2020-02-02 01:00:00.000000000 +0100 +++ new/platformdirs-3.5.1/src/platformdirs/__main__.py 2020-02-02 01:00:00.000000000 +0100 @@ -9,6 +9,9 @@ "user_state_dir", "user_log_dir", "user_documents_dir", + "user_pictures_dir", + "user_videos_dir", + "user_music_dir", "user_runtime_dir", "site_data_dir", "site_config_dir", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/platformdirs-3.2.0/src/platformdirs/android.py new/platformdirs-3.5.1/src/platformdirs/android.py --- old/platformdirs-3.2.0/src/platformdirs/android.py 2020-02-02 01:00:00.000000000 +0100 +++ new/platformdirs-3.5.1/src/platformdirs/android.py 2020-02-02 01:00:00.000000000 +0100 @@ -73,6 +73,27 @@ return _android_documents_folder() @property + def user_pictures_dir(self) -> str: + """ + :return: pictures directory tied to the user e.g. ``/storage/emulated/0/Pictures`` + """ + return _android_pictures_folder() + + @property + def user_videos_dir(self) -> str: + """ + :return: videos directory tied to the user e.g. ``/storage/emulated/0/DCIM/Camera`` + """ + return _android_videos_folder() + + @property + def user_music_dir(self) -> str: + """ + :return: music directory tied to the user e.g. ``/storage/emulated/0/Music`` + """ + return _android_music_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, @@ -121,6 +142,54 @@ return documents_dir +@lru_cache(maxsize=1) +def _android_pictures_folder() -> str: + """:return: pictures 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 + pictures_dir: str = Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES).getAbsolutePath() + except Exception: + pictures_dir = "/storage/emulated/0/Pictures" + + return pictures_dir + + +@lru_cache(maxsize=1) +def _android_videos_folder() -> str: + """:return: videos 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 + videos_dir: str = Context.getExternalFilesDir(Environment.DIRECTORY_DCIM).getAbsolutePath() + except Exception: + videos_dir = "/storage/emulated/0/DCIM/Camera" + + return videos_dir + + +@lru_cache(maxsize=1) +def _android_music_folder() -> str: + """:return: music 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 + music_dir: str = Context.getExternalFilesDir(Environment.DIRECTORY_MUSIC).getAbsolutePath() + except Exception: + music_dir = "/storage/emulated/0/Music" + + return music_dir + + __all__ = [ "Android", ] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/platformdirs-3.2.0/src/platformdirs/api.py new/platformdirs-3.5.1/src/platformdirs/api.py --- old/platformdirs-3.2.0/src/platformdirs/api.py 2020-02-02 01:00:00.000000000 +0100 +++ new/platformdirs-3.5.1/src/platformdirs/api.py 2020-02-02 01:00:00.000000000 +0100 @@ -125,6 +125,21 @@ @property @abstractmethod + def user_pictures_dir(self) -> str: + """:return: pictures directory tied to the user""" + + @property + @abstractmethod + def user_videos_dir(self) -> str: + """:return: videos directory tied to the user""" + + @property + @abstractmethod + def user_music_dir(self) -> str: + """:return: music directory tied to the user""" + + @property + @abstractmethod def user_runtime_dir(self) -> str: """:return: runtime directory tied to the user""" @@ -174,6 +189,21 @@ return Path(self.user_documents_dir) @property + def user_pictures_path(self) -> Path: + """:return: pictures path tied to the user""" + return Path(self.user_pictures_dir) + + @property + def user_videos_path(self) -> Path: + """:return: videos path tied to the user""" + return Path(self.user_videos_dir) + + @property + def user_music_path(self) -> Path: + """:return: music path tied to the user""" + return Path(self.user_music_dir) + + @property def user_runtime_path(self) -> Path: """:return: runtime path tied to the user""" return Path(self.user_runtime_dir) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/platformdirs-3.2.0/src/platformdirs/macos.py new/platformdirs-3.5.1/src/platformdirs/macos.py --- old/platformdirs-3.2.0/src/platformdirs/macos.py 2020-02-02 01:00:00.000000000 +0100 +++ new/platformdirs-3.5.1/src/platformdirs/macos.py 2020-02-02 01:00:00.000000000 +0100 @@ -60,6 +60,21 @@ return os.path.expanduser("~/Documents") @property + def user_pictures_dir(self) -> str: + """:return: pictures directory tied to the user, e.g. ``~/Pictures``""" + return os.path.expanduser("~/Pictures") + + @property + def user_videos_dir(self) -> str: + """:return: videos directory tied to the user, e.g. ``~/Movies``""" + return os.path.expanduser("~/Movies") + + @property + def user_music_dir(self) -> str: + """:return: music directory tied to the user, e.g. ``~/Music``""" + return os.path.expanduser("~/Music") + + @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")) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/platformdirs-3.2.0/src/platformdirs/unix.py new/platformdirs-3.5.1/src/platformdirs/unix.py --- old/platformdirs-3.2.0/src/platformdirs/unix.py 2020-02-02 01:00:00.000000000 +0100 +++ new/platformdirs-3.5.1/src/platformdirs/unix.py 2020-02-02 01:00:00.000000000 +0100 @@ -7,12 +7,13 @@ 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: +if sys.platform == "win32": def getuid() -> int: - raise RuntimeError("should only be used on Linux") + raise RuntimeError("should only be used on Unix") + +else: + from os import getuid class Unix(PlatformDirsABC): @@ -127,13 +128,28 @@ """ :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 _get_user_media_dir("XDG_DOCUMENTS_DIR", "~/Documents") - return documents_dir + @property + def user_pictures_dir(self) -> str: + """ + :return: pictures directory tied to the user, e.g. ``~/Pictures`` + """ + return _get_user_media_dir("XDG_PICTURES_DIR", "~/Pictures") + + @property + def user_videos_dir(self) -> str: + """ + :return: videos directory tied to the user, e.g. ``~/Videos`` + """ + return _get_user_media_dir("XDG_VIDEOS_DIR", "~/Videos") + + @property + def user_music_dir(self) -> str: + """ + :return: music directory tied to the user, e.g. ``~/Music`` + """ + return _get_user_media_dir("XDG_MUSIC_DIR", "~/Music") @property def user_runtime_dir(self) -> str: @@ -168,6 +184,16 @@ return Path(directory) +def _get_user_media_dir(env_var: str, fallback_tilde_path: str) -> str: + media_dir = _get_user_dirs_folder(env_var) + if media_dir is None: + media_dir = os.environ.get(env_var, "").strip() + if not media_dir: + media_dir = os.path.expanduser(fallback_tilde_path) + + return media_dir + + 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") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/platformdirs-3.2.0/src/platformdirs/version.py new/platformdirs-3.5.1/src/platformdirs/version.py --- old/platformdirs-3.2.0/src/platformdirs/version.py 2020-02-02 01:00:00.000000000 +0100 +++ new/platformdirs-3.5.1/src/platformdirs/version.py 2020-02-02 01:00:00.000000000 +0100 @@ -1,4 +1,4 @@ # file generated by setuptools_scm # don't change, don't track in version control -__version__ = version = '3.2.0' -__version_tuple__ = version_tuple = (3, 2, 0) +__version__ = version = '3.5.1' +__version_tuple__ = version_tuple = (3, 5, 1) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/platformdirs-3.2.0/src/platformdirs/windows.py new/platformdirs-3.5.1/src/platformdirs/windows.py --- old/platformdirs-3.2.0/src/platformdirs/windows.py 2020-02-02 01:00:00.000000000 +0100 +++ new/platformdirs-3.5.1/src/platformdirs/windows.py 2020-02-02 01:00:00.000000000 +0100 @@ -102,6 +102,27 @@ return os.path.normpath(get_win_folder("CSIDL_PERSONAL")) @property + def user_pictures_dir(self) -> str: + """ + :return: pictures directory tied to the user e.g. ``%USERPROFILE%\\Pictures`` + """ + return os.path.normpath(get_win_folder("CSIDL_MYPICTURES")) + + @property + def user_videos_dir(self) -> str: + """ + :return: videos directory tied to the user e.g. ``%USERPROFILE%\\Videos`` + """ + return os.path.normpath(get_win_folder("CSIDL_MYVIDEO")) + + @property + def user_music_dir(self) -> str: + """ + :return: music directory tied to the user e.g. ``%USERPROFILE%\\Music`` + """ + return os.path.normpath(get_win_folder("CSIDL_MYMUSIC")) + + @property def user_runtime_dir(self) -> str: """ :return: runtime directory tied to the user, e.g. @@ -113,8 +134,9 @@ 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") + result = get_win_folder_if_csidl_name_not_env_var(csidl_name) + if result is not None: + return result env_var_name = { "CSIDL_APPDATA": "APPDATA", @@ -129,6 +151,22 @@ return result +def get_win_folder_if_csidl_name_not_env_var(csidl_name: str) -> str | None: + """Get folder for a CSIDL name that does not exist as an environment variable.""" + if csidl_name == "CSIDL_PERSONAL": + return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Documents") + + if csidl_name == "CSIDL_MYPICTURES": + return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Pictures") + + if csidl_name == "CSIDL_MYVIDEO": + return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Videos") + + if csidl_name == "CSIDL_MYMUSIC": + return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Music") + return None + + def get_win_folder_from_registry(csidl_name: str) -> str: """Get folder from the registry. @@ -141,6 +179,9 @@ "CSIDL_COMMON_APPDATA": "Common AppData", "CSIDL_LOCAL_APPDATA": "Local AppData", "CSIDL_PERSONAL": "Personal", + "CSIDL_MYPICTURES": "My Pictures", + "CSIDL_MYVIDEO": "My Video", + "CSIDL_MYMUSIC": "My Music", }.get(csidl_name) if shell_folder_name is None: raise ValueError(f"Unknown CSIDL name: {csidl_name}") @@ -160,6 +201,9 @@ "CSIDL_COMMON_APPDATA": 35, "CSIDL_LOCAL_APPDATA": 28, "CSIDL_PERSONAL": 5, + "CSIDL_MYPICTURES": 39, + "CSIDL_MYVIDEO": 14, + "CSIDL_MYMUSIC": 13, }.get(csidl_name) if csidl_const is None: raise ValueError(f"Unknown CSIDL name: {csidl_name}") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/platformdirs-3.2.0/tests/conftest.py new/platformdirs-3.5.1/tests/conftest.py --- old/platformdirs-3.2.0/tests/conftest.py 2020-02-02 01:00:00.000000000 +0100 +++ new/platformdirs-3.5.1/tests/conftest.py 2020-02-02 01:00:00.000000000 +0100 @@ -12,6 +12,9 @@ "user_state_dir", "user_log_dir", "user_documents_dir", + "user_pictures_dir", + "user_videos_dir", + "user_music_dir", "user_runtime_dir", "site_data_dir", "site_config_dir", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/platformdirs-3.2.0/tests/test_android.py new/platformdirs-3.5.1/tests/test_android.py --- old/platformdirs-3.2.0/tests/test_android.py 2020-02-02 01:00:00.000000000 +0100 +++ new/platformdirs-3.5.1/tests/test_android.py 2020-02-02 01:00:00.000000000 +0100 @@ -52,6 +52,9 @@ "user_state_dir": f"/data/data/com.example/files{suffix}", "user_log_dir": f"/data/data/com.example/cache{suffix}{'' if params.get('opinion', True) is False else '/log'}", "user_documents_dir": "/storage/emulated/0/Documents", + "user_pictures_dir": "/storage/emulated/0/Pictures", + "user_videos_dir": "/storage/emulated/0/DCIM/Camera", + "user_music_dir": "/storage/emulated/0/Music", "user_runtime_dir": f"/data/data/com.example/cache{suffix}{'' if not params.get('opinion', True) else '/tmp'}", } expected = expected_map[func] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/platformdirs-3.2.0/tests/test_comp_with_appdirs.py new/platformdirs-3.5.1/tests/test_comp_with_appdirs.py --- old/platformdirs-3.2.0/tests/test_comp_with_appdirs.py 2020-02-02 01:00:00.000000000 +0100 +++ new/platformdirs-3.5.1/tests/test_comp_with_appdirs.py 2020-02-02 01:00:00.000000000 +0100 @@ -60,12 +60,12 @@ } if func in msg: # pragma: no cover pytest.skip(f"`appdirs.{func}` {msg[func]} on macOS") # pragma: no cover - if sys.platform == "linux": + elif sys.platform != "win32": msg = { # pragma: no cover "user_log_dir": "Uses XDG_STATE_DIR instead of appdirs.user_data_dir per the XDG spec", } if func in msg: # pragma: no cover - pytest.skip(f"`appdirs.{func}` {msg[func]} on Linux") # pragma: no cover + pytest.skip(f"`appdirs.{func}` {msg[func]} on Unix") # pragma: no cover new = getattr(platformdirs, func)(*params) old = getattr(appdirs, func)(*params) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/platformdirs-3.2.0/tests/test_macos.py new/platformdirs-3.5.1/tests/test_macos.py --- old/platformdirs-3.2.0/tests/test_macos.py 2020-02-02 01:00:00.000000000 +0100 +++ new/platformdirs-3.5.1/tests/test_macos.py 2020-02-02 01:00:00.000000000 +0100 @@ -33,6 +33,9 @@ "user_state_dir": f"{home}/Library/Application Support{suffix}", "user_log_dir": f"{home}/Library/Logs{suffix}", "user_documents_dir": f"{home}/Documents", + "user_pictures_dir": f"{home}/Pictures", + "user_videos_dir": f"{home}/Movies", + "user_music_dir": f"{home}/Music", "user_runtime_dir": f"{home}/Library/Caches/TemporaryItems{suffix}", } expected = expected_map[func] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/platformdirs-3.2.0/tests/test_unix.py new/platformdirs-3.5.1/tests/test_unix.py --- old/platformdirs-3.2.0/tests/test_unix.py 2020-02-02 01:00:00.000000000 +0100 +++ new/platformdirs-3.5.1/tests/test_unix.py 2020-02-02 01:00:00.000000000 +0100 @@ -10,41 +10,61 @@ from _pytest.monkeypatch import MonkeyPatch from pytest_mock import MockerFixture +from platformdirs import unix from platformdirs.unix import Unix -def test_user_documents_dir(mocker: MockerFixture) -> None: - example_path = "/home/example/ExampleDocumentsFolder" +@pytest.mark.parametrize("prop", ["user_documents_dir", "user_pictures_dir", "user_videos_dir", "user_music_dir"]) +def test_user_media_dir(mocker: MockerFixture, prop: str) -> None: + example_path = "/home/example/ExampleMediaFolder" mock = mocker.patch("platformdirs.unix._get_user_dirs_folder") mock.return_value = example_path - assert Unix().user_documents_dir == example_path + assert getattr(Unix(), prop) == example_path -def test_user_documents_dir_env_var(mocker: MockerFixture) -> None: - # Mock documents dir not being in user-dirs.dirs file +@pytest.mark.parametrize( + ("env_var", "prop"), + [ + pytest.param("XDG_DOCUMENTS_DIR", "user_documents_dir", id="user_documents_dir"), + pytest.param("XDG_PICTURES_DIR", "user_pictures_dir", id="user_pictures_dir"), + pytest.param("XDG_VIDEOS_DIR", "user_videos_dir", id="user_videos_dir"), + pytest.param("XDG_MUSIC_DIR", "user_music_dir", id="user_music_dir"), + ], +) +def test_user_media_dir_env_var(mocker: MockerFixture, env_var: str, prop: str) -> None: + # Mock media dir not being in user-dirs.dirs file mock = mocker.patch("platformdirs.unix._get_user_dirs_folder") mock.return_value = None - example_path = "/home/example/ExampleDocumentsFolder" - mocker.patch.dict(os.environ, {"XDG_DOCUMENTS_DIR": example_path}) + example_path = "/home/example/ExampleMediaFolder" + mocker.patch.dict(os.environ, {env_var: example_path}) - assert Unix().user_documents_dir == example_path + assert getattr(Unix(), prop) == example_path -def test_user_documents_dir_default(mocker: MockerFixture) -> None: - # Mock documents dir not being in user-dirs.dirs file +@pytest.mark.parametrize( + ("env_var", "prop", "default_abs_path"), + [ + pytest.param("XDG_DOCUMENTS_DIR", "user_documents_dir", "/home/example/Documents", id="user_documents_dir"), + pytest.param("XDG_PICTURES_DIR", "user_pictures_dir", "/home/example/Pictures", id="user_pictures_dir"), + pytest.param("XDG_VIDEOS_DIR", "user_videos_dir", "/home/example/Videos", id="user_videos_dir"), + pytest.param("XDG_MUSIC_DIR", "user_music_dir", "/home/example/Music", id="user_music_dir"), + ], +) +def test_user_media_dir_default(mocker: MockerFixture, env_var: str, prop: str, default_abs_path: str) -> None: + # Mock media dir not being in user-dirs.dirs file mock = mocker.patch("platformdirs.unix._get_user_dirs_folder") mock.return_value = None - # Mock no XDG_DOCUMENTS_DIR env variable being set - mocker.patch.dict(os.environ, {"XDG_DOCUMENTS_DIR": ""}) + # Mock no XDG env variable being set + mocker.patch.dict(os.environ, {env_var: ""}) # Mock home directory mocker.patch.dict(os.environ, {"HOME": "/home/example"}) # Mock home directory for running the test on Windows mocker.patch.dict(os.environ, {"USERPROFILE": "/home/example"}) - assert Unix().user_documents_dir == "/home/example/Documents" + assert getattr(Unix(), prop) == default_abs_path class XDGVariable(typing.NamedTuple): @@ -109,18 +129,16 @@ assert result == "/tmp/custom-dir" -def test_platform_non_linux(monkeypatch: MonkeyPatch) -> None: - from platformdirs import unix - +def test_platform_on_win32(monkeypatch: MonkeyPatch, mocker: MockerFixture) -> None: + monkeypatch.delenv("XDG_RUNTIME_DIR", raising=False) + mocker.patch("sys.platform", "win32") + prev_unix = unix + importlib.reload(unix) try: - with monkeypatch.context() as context: - context.setattr(sys, "platform", "magic") - monkeypatch.delenv("XDG_RUNTIME_DIR", raising=False) - importlib.reload(unix) - with pytest.raises(RuntimeError, match="should only be used on Linux"): + with pytest.raises(RuntimeError, match="should only be used on Unix"): unix.Unix().user_runtime_dir finally: - importlib.reload(unix) + sys.modules["platformdirs.unix"] = prev_unix def test_ensure_exists_creates_folder(mocker: MockerFixture, tmp_path: Path) -> None: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/platformdirs-3.2.0/tox.ini new/platformdirs-3.5.1/tox.ini --- old/platformdirs-3.2.0/tox.ini 1970-01-01 01:00:00.000000000 +0100 +++ new/platformdirs-3.5.1/tox.ini 2020-02-02 01:00:00.000000000 +0100 @@ -0,0 +1,117 @@ +[tox] +requires = + tox>=4.2 +env_list = + fix + py312 + py311 + py310 + py39 + py38 + py37 + pypy3 + type + coverage + readme + docs +skip_missing_interpreters = true + +[testenv] +description = run the unit tests with pytest under {basepython} +package = wheel +wheel_build_env = .pkg +extras = + test +pass_env = + ANDROID_DATA + ANDROID_ROOT +set_env = + COVERAGE_FILE = {toxworkdir}/.coverage.{envname} + COVERAGE_PROCESS_START = {toxinidir}/pyproject.toml + _COVERAGE_SRC = {envsitepackagesdir}/platformdirs +commands = + pytest {tty:--color=yes} {posargs: \ + --junitxml {toxworkdir}{/}junit.{envname}.xml --cov {envsitepackagesdir}{/}platformdirs \ + --cov {toxinidir}{/}tests \ + --cov-config=pyproject.toml --no-cov-on-fail --cov-report term-missing:skip-covered --cov-context=test \ + --cov-report html:{envtmpdir}{/}htmlcov --cov-report xml:{toxworkdir}{/}coverage.{envname}.xml \ + tests} + +[testenv:fix] +description = run static analysis and style check using flake8 +skip_install = true +deps = + pre-commit>=3.3.1 +pass_env = + HOMEPATH + PROGRAMDATA +commands = + pre-commit run --all-files --show-diff-on-failure + +[testenv:type] +description = run type check on code base +deps = + mypy==1.2 +set_env = + {tty:MYPY_FORCE_COLOR = 1} +commands = + mypy --strict src + mypy --strict tests + +[testenv:coverage] +description = combine coverage files and generate diff (against DIFF_AGAINST defaulting to origin/main) +skip_install = true +deps = + covdefaults>=2.3 + coverage[toml]>=7.2.5 + diff-cover>=7.5 +extras = +parallel_show_output = true +pass_env = + DIFF_AGAINST +set_env = + COVERAGE_FILE = {toxworkdir}/.coverage +commands = + coverage combine + coverage report --skip-covered --show-missing + coverage xml -o {toxworkdir}/coverage.xml + coverage html -d {toxworkdir}/htmlcov + diff-cover --compare-branch {env:DIFF_AGAINST:origin/main} {toxworkdir}/coverage.xml +depends = + py311 + py310 + py39 + py38 + py37 + pypy3 + +[testenv:readme] +description = check that the long description is valid +skip_install = true +deps = + build[virtualenv]>=0.10 + twine>=4.0.2 +pass_env = + * +change_dir = {toxinidir} +commands = + python -m build -o {envtmpdir} . + twine check {envtmpdir}/* + +[testenv:docs] +base_python = 3.10 +extras = + docs +commands = + python -c 'import glob; import subprocess; subprocess.call(["proselint"] + glob.glob("docs/*.rst"))' + sphinx-build -d "{envtmpdir}/doctree" docs "{toxworkdir}/docs_out" --color -b html {posargs} + python -c 'import pathlib; print("documentation available under \{0\}".format((pathlib.Path(r"{toxworkdir}") / "docs_out" / "index.html").as_uri()))' + +[testenv:dev] +description = generate a DEV environment +package = editable +extras = + test +commands = + python -m pip list --format=columns + python -c 'import sys; print(sys.executable)'