android-notify 1.60.0__py3-none-any.whl → 1.60.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of android-notify might be problematic. Click here for more details.
- android_notify/config.py +1 -1
- {android_notify-1.60.0.dist-info → android_notify-1.60.2.dist-info}/METADATA +4 -4
- {android_notify-1.60.0.dist-info → android_notify-1.60.2.dist-info}/RECORD +375 -6
- venv/Lib/site-packages/_distutils_hack/__init__.py +239 -0
- venv/Lib/site-packages/_distutils_hack/override.py +1 -0
- venv/Lib/site-packages/pkg_resources/__init__.py +3713 -0
- venv/Lib/site-packages/pkg_resources/py.typed +0 -0
- venv/Lib/site-packages/pkg_resources/tests/__init__.py +0 -0
- venv/Lib/site-packages/pkg_resources/tests/data/my-test-package-source/setup.py +7 -0
- venv/Lib/site-packages/pkg_resources/tests/test_find_distributions.py +56 -0
- venv/Lib/site-packages/pkg_resources/tests/test_integration_zope_interface.py +54 -0
- venv/Lib/site-packages/pkg_resources/tests/test_markers.py +8 -0
- venv/Lib/site-packages/pkg_resources/tests/test_pkg_resources.py +485 -0
- venv/Lib/site-packages/pkg_resources/tests/test_resources.py +869 -0
- venv/Lib/site-packages/pkg_resources/tests/test_working_set.py +505 -0
- venv/Lib/site-packages/setuptools/__init__.py +248 -0
- venv/Lib/site-packages/setuptools/_core_metadata.py +337 -0
- venv/Lib/site-packages/setuptools/_discovery.py +33 -0
- venv/Lib/site-packages/setuptools/_distutils/__init__.py +14 -0
- venv/Lib/site-packages/setuptools/_distutils/_log.py +3 -0
- venv/Lib/site-packages/setuptools/_distutils/_macos_compat.py +12 -0
- venv/Lib/site-packages/setuptools/_distutils/_modified.py +95 -0
- venv/Lib/site-packages/setuptools/_distutils/_msvccompiler.py +16 -0
- venv/Lib/site-packages/setuptools/_distutils/archive_util.py +294 -0
- venv/Lib/site-packages/setuptools/_distutils/ccompiler.py +26 -0
- venv/Lib/site-packages/setuptools/_distutils/cmd.py +554 -0
- venv/Lib/site-packages/setuptools/_distutils/command/__init__.py +23 -0
- venv/Lib/site-packages/setuptools/_distutils/command/_framework_compat.py +54 -0
- venv/Lib/site-packages/setuptools/_distutils/command/bdist.py +167 -0
- venv/Lib/site-packages/setuptools/_distutils/command/bdist_dumb.py +141 -0
- venv/Lib/site-packages/setuptools/_distutils/command/bdist_rpm.py +598 -0
- venv/Lib/site-packages/setuptools/_distutils/command/build.py +156 -0
- venv/Lib/site-packages/setuptools/_distutils/command/build_clib.py +201 -0
- venv/Lib/site-packages/setuptools/_distutils/command/build_ext.py +812 -0
- venv/Lib/site-packages/setuptools/_distutils/command/build_py.py +407 -0
- venv/Lib/site-packages/setuptools/_distutils/command/build_scripts.py +160 -0
- venv/Lib/site-packages/setuptools/_distutils/command/check.py +152 -0
- venv/Lib/site-packages/setuptools/_distutils/command/clean.py +77 -0
- venv/Lib/site-packages/setuptools/_distutils/command/config.py +358 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install.py +805 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install_data.py +94 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install_egg_info.py +91 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install_headers.py +46 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install_lib.py +238 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install_scripts.py +62 -0
- venv/Lib/site-packages/setuptools/_distutils/command/sdist.py +521 -0
- venv/Lib/site-packages/setuptools/_distutils/compat/__init__.py +18 -0
- venv/Lib/site-packages/setuptools/_distutils/compat/numpy.py +2 -0
- venv/Lib/site-packages/setuptools/_distutils/compat/py39.py +66 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/base.py +1394 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/cygwin.py +340 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/errors.py +24 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/msvc.py +614 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_base.py +83 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_cygwin.py +76 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_mingw.py +48 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_msvc.py +136 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_unix.py +413 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/unix.py +422 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/zos.py +230 -0
- venv/Lib/site-packages/setuptools/_distutils/core.py +289 -0
- venv/Lib/site-packages/setuptools/_distutils/cygwinccompiler.py +31 -0
- venv/Lib/site-packages/setuptools/_distutils/debug.py +5 -0
- venv/Lib/site-packages/setuptools/_distutils/dep_util.py +14 -0
- venv/Lib/site-packages/setuptools/_distutils/dir_util.py +244 -0
- venv/Lib/site-packages/setuptools/_distutils/dist.py +1386 -0
- venv/Lib/site-packages/setuptools/_distutils/errors.py +108 -0
- venv/Lib/site-packages/setuptools/_distutils/extension.py +258 -0
- venv/Lib/site-packages/setuptools/_distutils/fancy_getopt.py +471 -0
- venv/Lib/site-packages/setuptools/_distutils/file_util.py +236 -0
- venv/Lib/site-packages/setuptools/_distutils/filelist.py +431 -0
- venv/Lib/site-packages/setuptools/_distutils/log.py +56 -0
- venv/Lib/site-packages/setuptools/_distutils/spawn.py +134 -0
- venv/Lib/site-packages/setuptools/_distutils/sysconfig.py +598 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/__init__.py +42 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/compat/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/compat/py39.py +40 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/support.py +134 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_archive_util.py +353 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_bdist.py +47 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_bdist_dumb.py +78 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_bdist_rpm.py +127 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_build.py +49 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_build_clib.py +134 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_build_ext.py +628 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_build_py.py +196 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_build_scripts.py +96 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_check.py +194 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_clean.py +45 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_cmd.py +107 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_config_cmd.py +87 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_core.py +130 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_dir_util.py +139 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_dist.py +552 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_extension.py +117 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_file_util.py +95 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_filelist.py +336 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_install.py +245 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_install_data.py +74 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_install_headers.py +33 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_install_lib.py +110 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_install_scripts.py +52 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_log.py +12 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_modified.py +126 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_sdist.py +470 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_spawn.py +141 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_sysconfig.py +319 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_text_file.py +127 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_util.py +243 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_version.py +80 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_versionpredicate.py +0 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/unix_compat.py +17 -0
- venv/Lib/site-packages/setuptools/_distutils/text_file.py +286 -0
- venv/Lib/site-packages/setuptools/_distutils/unixccompiler.py +9 -0
- venv/Lib/site-packages/setuptools/_distutils/util.py +518 -0
- venv/Lib/site-packages/setuptools/_distutils/version.py +348 -0
- venv/Lib/site-packages/setuptools/_distutils/versionpredicate.py +175 -0
- venv/Lib/site-packages/setuptools/_distutils/zosccompiler.py +3 -0
- venv/Lib/site-packages/setuptools/_entry_points.py +94 -0
- venv/Lib/site-packages/setuptools/_imp.py +87 -0
- venv/Lib/site-packages/setuptools/_importlib.py +9 -0
- venv/Lib/site-packages/setuptools/_itertools.py +23 -0
- venv/Lib/site-packages/setuptools/_normalization.py +177 -0
- venv/Lib/site-packages/setuptools/_path.py +93 -0
- venv/Lib/site-packages/setuptools/_reqs.py +42 -0
- venv/Lib/site-packages/setuptools/_scripts.py +361 -0
- venv/Lib/site-packages/setuptools/_shutil.py +59 -0
- venv/Lib/site-packages/setuptools/_static.py +188 -0
- venv/Lib/site-packages/setuptools/_vendor/autocommand/__init__.py +27 -0
- venv/Lib/site-packages/setuptools/_vendor/autocommand/autoasync.py +142 -0
- venv/Lib/site-packages/setuptools/_vendor/autocommand/autocommand.py +70 -0
- venv/Lib/site-packages/setuptools/_vendor/autocommand/automain.py +59 -0
- venv/Lib/site-packages/setuptools/_vendor/autocommand/autoparse.py +333 -0
- venv/Lib/site-packages/setuptools/_vendor/autocommand/errors.py +23 -0
- venv/Lib/site-packages/setuptools/_vendor/backports/__init__.py +1 -0
- venv/Lib/site-packages/setuptools/_vendor/backports/tarfile/__init__.py +2937 -0
- venv/Lib/site-packages/setuptools/_vendor/backports/tarfile/__main__.py +5 -0
- venv/Lib/site-packages/setuptools/_vendor/backports/tarfile/compat/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/_vendor/backports/tarfile/compat/py38.py +24 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__init__.py +1083 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_adapters.py +83 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_collections.py +30 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_compat.py +57 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_functools.py +104 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_itertools.py +73 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_meta.py +67 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_text.py +99 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/compat/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/compat/py311.py +22 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/compat/py39.py +36 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/diagnose.py +21 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/py.typed +0 -0
- venv/Lib/site-packages/setuptools/_vendor/inflect/__init__.py +3986 -0
- venv/Lib/site-packages/setuptools/_vendor/inflect/compat/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/_vendor/inflect/compat/py38.py +7 -0
- venv/Lib/site-packages/setuptools/_vendor/inflect/py.typed +0 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/collections/__init__.py +1091 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/collections/py.typed +0 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/context.py +361 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/functools/__init__.py +633 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/functools/__init__.pyi +125 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/functools/py.typed +0 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/text/__init__.py +624 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/text/layouts.py +25 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/text/show-newlines.py +33 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/text/strip-prefix.py +21 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/text/to-dvorak.py +6 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/text/to-qwerty.py +6 -0
- venv/Lib/site-packages/setuptools/_vendor/more_itertools/__init__.py +6 -0
- venv/Lib/site-packages/setuptools/_vendor/more_itertools/__init__.pyi +2 -0
- venv/Lib/site-packages/setuptools/_vendor/more_itertools/more.py +4806 -0
- venv/Lib/site-packages/setuptools/_vendor/more_itertools/more.pyi +709 -0
- venv/Lib/site-packages/setuptools/_vendor/more_itertools/py.typed +0 -0
- venv/Lib/site-packages/setuptools/_vendor/more_itertools/recipes.py +1046 -0
- venv/Lib/site-packages/setuptools/_vendor/more_itertools/recipes.pyi +136 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/__init__.py +15 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/_elffile.py +110 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/_manylinux.py +263 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/_musllinux.py +85 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/_parser.py +354 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/_structures.py +61 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/_tokenizer.py +194 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/licenses/__init__.py +145 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/licenses/_spdx.py +759 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/markers.py +331 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/metadata.py +863 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/py.typed +0 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/requirements.py +91 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py +1020 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/tags.py +617 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/utils.py +163 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/version.py +582 -0
- venv/Lib/site-packages/setuptools/_vendor/platformdirs/__init__.py +627 -0
- venv/Lib/site-packages/setuptools/_vendor/platformdirs/__main__.py +55 -0
- venv/Lib/site-packages/setuptools/_vendor/platformdirs/android.py +249 -0
- venv/Lib/site-packages/setuptools/_vendor/platformdirs/api.py +292 -0
- venv/Lib/site-packages/setuptools/_vendor/platformdirs/macos.py +130 -0
- venv/Lib/site-packages/setuptools/_vendor/platformdirs/py.typed +0 -0
- venv/Lib/site-packages/setuptools/_vendor/platformdirs/unix.py +275 -0
- venv/Lib/site-packages/setuptools/_vendor/platformdirs/version.py +16 -0
- venv/Lib/site-packages/setuptools/_vendor/platformdirs/windows.py +272 -0
- venv/Lib/site-packages/setuptools/_vendor/tomli/__init__.py +11 -0
- venv/Lib/site-packages/setuptools/_vendor/tomli/_parser.py +691 -0
- venv/Lib/site-packages/setuptools/_vendor/tomli/_re.py +107 -0
- venv/Lib/site-packages/setuptools/_vendor/tomli/_types.py +10 -0
- venv/Lib/site-packages/setuptools/_vendor/tomli/py.typed +1 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/__init__.py +48 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_checkers.py +993 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_config.py +108 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_decorators.py +235 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_exceptions.py +42 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_functions.py +308 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_importhook.py +213 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_memo.py +48 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_pytest_plugin.py +127 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_suppression.py +86 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_transformer.py +1229 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_union_transformer.py +55 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_utils.py +173 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/py.typed +0 -0
- venv/Lib/site-packages/setuptools/_vendor/typing_extensions.py +3641 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/__init__.py +3 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/__main__.py +23 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/_bdist_wheel.py +613 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/_setuptools_logging.py +26 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/bdist_wheel.py +26 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/cli/__init__.py +155 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/cli/convert.py +332 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/cli/pack.py +85 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/cli/tags.py +139 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/cli/unpack.py +30 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/macosx_libfile.py +482 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/metadata.py +183 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/util.py +17 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_elffile.py +108 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_manylinux.py +260 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_musllinux.py +83 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_parser.py +356 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_structures.py +61 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_tokenizer.py +192 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/markers.py +253 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/requirements.py +90 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/specifiers.py +1011 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/tags.py +571 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/utils.py +172 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/version.py +561 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/wheelfile.py +227 -0
- venv/Lib/site-packages/setuptools/_vendor/zipp/__init__.py +501 -0
- venv/Lib/site-packages/setuptools/_vendor/zipp/compat/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/_vendor/zipp/compat/py310.py +11 -0
- venv/Lib/site-packages/setuptools/_vendor/zipp/glob.py +106 -0
- venv/Lib/site-packages/setuptools/archive_util.py +219 -0
- venv/Lib/site-packages/setuptools/build_meta.py +548 -0
- venv/Lib/site-packages/setuptools/command/__init__.py +21 -0
- venv/Lib/site-packages/setuptools/command/_requirestxt.py +131 -0
- venv/Lib/site-packages/setuptools/command/alias.py +77 -0
- venv/Lib/site-packages/setuptools/command/bdist_egg.py +477 -0
- venv/Lib/site-packages/setuptools/command/bdist_rpm.py +42 -0
- venv/Lib/site-packages/setuptools/command/bdist_wheel.py +604 -0
- venv/Lib/site-packages/setuptools/command/build.py +135 -0
- venv/Lib/site-packages/setuptools/command/build_clib.py +103 -0
- venv/Lib/site-packages/setuptools/command/build_ext.py +470 -0
- venv/Lib/site-packages/setuptools/command/build_py.py +400 -0
- venv/Lib/site-packages/setuptools/command/develop.py +55 -0
- venv/Lib/site-packages/setuptools/command/dist_info.py +103 -0
- venv/Lib/site-packages/setuptools/command/easy_install.py +30 -0
- venv/Lib/site-packages/setuptools/command/editable_wheel.py +908 -0
- venv/Lib/site-packages/setuptools/command/egg_info.py +718 -0
- venv/Lib/site-packages/setuptools/command/install.py +131 -0
- venv/Lib/site-packages/setuptools/command/install_egg_info.py +58 -0
- venv/Lib/site-packages/setuptools/command/install_lib.py +137 -0
- venv/Lib/site-packages/setuptools/command/install_scripts.py +67 -0
- venv/Lib/site-packages/setuptools/command/rotate.py +65 -0
- venv/Lib/site-packages/setuptools/command/saveopts.py +21 -0
- venv/Lib/site-packages/setuptools/command/sdist.py +217 -0
- venv/Lib/site-packages/setuptools/command/setopt.py +141 -0
- venv/Lib/site-packages/setuptools/command/test.py +45 -0
- venv/Lib/site-packages/setuptools/compat/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/compat/py310.py +20 -0
- venv/Lib/site-packages/setuptools/compat/py311.py +27 -0
- venv/Lib/site-packages/setuptools/compat/py312.py +13 -0
- venv/Lib/site-packages/setuptools/compat/py39.py +9 -0
- venv/Lib/site-packages/setuptools/config/__init__.py +43 -0
- venv/Lib/site-packages/setuptools/config/_apply_pyprojecttoml.py +526 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/__init__.py +34 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/error_reporting.py +336 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/extra_validations.py +82 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py +51 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py +1412 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/formats.py +402 -0
- venv/Lib/site-packages/setuptools/config/expand.py +452 -0
- venv/Lib/site-packages/setuptools/config/pyprojecttoml.py +468 -0
- venv/Lib/site-packages/setuptools/config/setupcfg.py +780 -0
- venv/Lib/site-packages/setuptools/depends.py +185 -0
- venv/Lib/site-packages/setuptools/discovery.py +614 -0
- venv/Lib/site-packages/setuptools/dist.py +1119 -0
- venv/Lib/site-packages/setuptools/errors.py +67 -0
- venv/Lib/site-packages/setuptools/extension.py +177 -0
- venv/Lib/site-packages/setuptools/glob.py +185 -0
- venv/Lib/site-packages/setuptools/installer.py +155 -0
- venv/Lib/site-packages/setuptools/launch.py +36 -0
- venv/Lib/site-packages/setuptools/logging.py +40 -0
- venv/Lib/site-packages/setuptools/modified.py +18 -0
- venv/Lib/site-packages/setuptools/monkey.py +126 -0
- venv/Lib/site-packages/setuptools/msvc.py +1536 -0
- venv/Lib/site-packages/setuptools/namespaces.py +106 -0
- venv/Lib/site-packages/setuptools/tests/__init__.py +13 -0
- venv/Lib/site-packages/setuptools/tests/compat/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/tests/compat/py39.py +3 -0
- venv/Lib/site-packages/setuptools/tests/config/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/tests/config/downloads/__init__.py +59 -0
- venv/Lib/site-packages/setuptools/tests/config/downloads/preload.py +18 -0
- venv/Lib/site-packages/setuptools/tests/config/test_apply_pyprojecttoml.py +772 -0
- venv/Lib/site-packages/setuptools/tests/config/test_expand.py +247 -0
- venv/Lib/site-packages/setuptools/tests/config/test_pyprojecttoml.py +396 -0
- venv/Lib/site-packages/setuptools/tests/config/test_pyprojecttoml_dynamic_deps.py +109 -0
- venv/Lib/site-packages/setuptools/tests/config/test_setupcfg.py +980 -0
- venv/Lib/site-packages/setuptools/tests/contexts.py +131 -0
- venv/Lib/site-packages/setuptools/tests/environment.py +95 -0
- venv/Lib/site-packages/setuptools/tests/fixtures.py +392 -0
- venv/Lib/site-packages/setuptools/tests/integration/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/tests/integration/helpers.py +77 -0
- venv/Lib/site-packages/setuptools/tests/integration/test_pbr.py +20 -0
- venv/Lib/site-packages/setuptools/tests/integration/test_pip_install_sdist.py +223 -0
- venv/Lib/site-packages/setuptools/tests/mod_with_constant.py +1 -0
- venv/Lib/site-packages/setuptools/tests/namespaces.py +90 -0
- venv/Lib/site-packages/setuptools/tests/script-with-bom.py +1 -0
- venv/Lib/site-packages/setuptools/tests/test_archive_util.py +36 -0
- venv/Lib/site-packages/setuptools/tests/test_bdist_deprecations.py +28 -0
- venv/Lib/site-packages/setuptools/tests/test_bdist_egg.py +73 -0
- venv/Lib/site-packages/setuptools/tests/test_bdist_wheel.py +708 -0
- venv/Lib/site-packages/setuptools/tests/test_build.py +33 -0
- venv/Lib/site-packages/setuptools/tests/test_build_clib.py +84 -0
- venv/Lib/site-packages/setuptools/tests/test_build_ext.py +293 -0
- venv/Lib/site-packages/setuptools/tests/test_build_meta.py +959 -0
- venv/Lib/site-packages/setuptools/tests/test_build_py.py +480 -0
- venv/Lib/site-packages/setuptools/tests/test_config_discovery.py +647 -0
- venv/Lib/site-packages/setuptools/tests/test_core_metadata.py +622 -0
- venv/Lib/site-packages/setuptools/tests/test_depends.py +15 -0
- venv/Lib/site-packages/setuptools/tests/test_develop.py +112 -0
- venv/Lib/site-packages/setuptools/tests/test_dist.py +278 -0
- venv/Lib/site-packages/setuptools/tests/test_dist_info.py +147 -0
- venv/Lib/site-packages/setuptools/tests/test_distutils_adoption.py +198 -0
- venv/Lib/site-packages/setuptools/tests/test_editable_install.py +1263 -0
- venv/Lib/site-packages/setuptools/tests/test_egg_info.py +1306 -0
- venv/Lib/site-packages/setuptools/tests/test_extern.py +15 -0
- venv/Lib/site-packages/setuptools/tests/test_find_packages.py +218 -0
- venv/Lib/site-packages/setuptools/tests/test_find_py_modules.py +73 -0
- venv/Lib/site-packages/setuptools/tests/test_glob.py +45 -0
- venv/Lib/site-packages/setuptools/tests/test_install_scripts.py +89 -0
- venv/Lib/site-packages/setuptools/tests/test_logging.py +76 -0
- venv/Lib/site-packages/setuptools/tests/test_manifest.py +622 -0
- venv/Lib/site-packages/setuptools/tests/test_namespaces.py +138 -0
- venv/Lib/site-packages/setuptools/tests/test_scripts.py +12 -0
- venv/Lib/site-packages/setuptools/tests/test_sdist.py +984 -0
- venv/Lib/site-packages/setuptools/tests/test_setopt.py +40 -0
- venv/Lib/site-packages/setuptools/tests/test_setuptools.py +290 -0
- venv/Lib/site-packages/setuptools/tests/test_shutil_wrapper.py +23 -0
- venv/Lib/site-packages/setuptools/tests/test_unicode_utils.py +10 -0
- venv/Lib/site-packages/setuptools/tests/test_virtualenv.py +113 -0
- venv/Lib/site-packages/setuptools/tests/test_warnings.py +106 -0
- venv/Lib/site-packages/setuptools/tests/test_wheel.py +690 -0
- venv/Lib/site-packages/setuptools/tests/test_windows_wrappers.py +258 -0
- venv/Lib/site-packages/setuptools/tests/text.py +4 -0
- venv/Lib/site-packages/setuptools/tests/textwrap.py +6 -0
- venv/Lib/site-packages/setuptools/unicode_utils.py +102 -0
- venv/Lib/site-packages/setuptools/version.py +6 -0
- venv/Lib/site-packages/setuptools/warnings.py +110 -0
- venv/Lib/site-packages/setuptools/wheel.py +261 -0
- venv/Lib/site-packages/setuptools/windows_support.py +30 -0
- {android_notify-1.60.0.dist-info → android_notify-1.60.2.dist-info}/WHEEL +0 -0
- {android_notify-1.60.0.dist-info → android_notify-1.60.2.dist-info}/entry_points.txt +0 -0
- {android_notify-1.60.0.dist-info → android_notify-1.60.2.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,501 @@
|
|
|
1
|
+
import io
|
|
2
|
+
import posixpath
|
|
3
|
+
import zipfile
|
|
4
|
+
import itertools
|
|
5
|
+
import contextlib
|
|
6
|
+
import pathlib
|
|
7
|
+
import re
|
|
8
|
+
import stat
|
|
9
|
+
import sys
|
|
10
|
+
|
|
11
|
+
from .compat.py310 import text_encoding
|
|
12
|
+
from .glob import Translator
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
__all__ = ['Path']
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _parents(path):
|
|
19
|
+
"""
|
|
20
|
+
Given a path with elements separated by
|
|
21
|
+
posixpath.sep, generate all parents of that path.
|
|
22
|
+
|
|
23
|
+
>>> list(_parents('b/d'))
|
|
24
|
+
['b']
|
|
25
|
+
>>> list(_parents('/b/d/'))
|
|
26
|
+
['/b']
|
|
27
|
+
>>> list(_parents('b/d/f/'))
|
|
28
|
+
['b/d', 'b']
|
|
29
|
+
>>> list(_parents('b'))
|
|
30
|
+
[]
|
|
31
|
+
>>> list(_parents(''))
|
|
32
|
+
[]
|
|
33
|
+
"""
|
|
34
|
+
return itertools.islice(_ancestry(path), 1, None)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _ancestry(path):
|
|
38
|
+
"""
|
|
39
|
+
Given a path with elements separated by
|
|
40
|
+
posixpath.sep, generate all elements of that path
|
|
41
|
+
|
|
42
|
+
>>> list(_ancestry('b/d'))
|
|
43
|
+
['b/d', 'b']
|
|
44
|
+
>>> list(_ancestry('/b/d/'))
|
|
45
|
+
['/b/d', '/b']
|
|
46
|
+
>>> list(_ancestry('b/d/f/'))
|
|
47
|
+
['b/d/f', 'b/d', 'b']
|
|
48
|
+
>>> list(_ancestry('b'))
|
|
49
|
+
['b']
|
|
50
|
+
>>> list(_ancestry(''))
|
|
51
|
+
[]
|
|
52
|
+
"""
|
|
53
|
+
path = path.rstrip(posixpath.sep)
|
|
54
|
+
while path and path != posixpath.sep:
|
|
55
|
+
yield path
|
|
56
|
+
path, tail = posixpath.split(path)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
_dedupe = dict.fromkeys
|
|
60
|
+
"""Deduplicate an iterable in original order"""
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _difference(minuend, subtrahend):
|
|
64
|
+
"""
|
|
65
|
+
Return items in minuend not in subtrahend, retaining order
|
|
66
|
+
with O(1) lookup.
|
|
67
|
+
"""
|
|
68
|
+
return itertools.filterfalse(set(subtrahend).__contains__, minuend)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class InitializedState:
|
|
72
|
+
"""
|
|
73
|
+
Mix-in to save the initialization state for pickling.
|
|
74
|
+
"""
|
|
75
|
+
|
|
76
|
+
def __init__(self, *args, **kwargs):
|
|
77
|
+
self.__args = args
|
|
78
|
+
self.__kwargs = kwargs
|
|
79
|
+
super().__init__(*args, **kwargs)
|
|
80
|
+
|
|
81
|
+
def __getstate__(self):
|
|
82
|
+
return self.__args, self.__kwargs
|
|
83
|
+
|
|
84
|
+
def __setstate__(self, state):
|
|
85
|
+
args, kwargs = state
|
|
86
|
+
super().__init__(*args, **kwargs)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
class SanitizedNames:
|
|
90
|
+
"""
|
|
91
|
+
ZipFile mix-in to ensure names are sanitized.
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
def namelist(self):
|
|
95
|
+
return list(map(self._sanitize, super().namelist()))
|
|
96
|
+
|
|
97
|
+
@staticmethod
|
|
98
|
+
def _sanitize(name):
|
|
99
|
+
r"""
|
|
100
|
+
Ensure a relative path with posix separators and no dot names.
|
|
101
|
+
|
|
102
|
+
Modeled after
|
|
103
|
+
https://github.com/python/cpython/blob/bcc1be39cb1d04ad9fc0bd1b9193d3972835a57c/Lib/zipfile/__init__.py#L1799-L1813
|
|
104
|
+
but provides consistent cross-platform behavior.
|
|
105
|
+
|
|
106
|
+
>>> san = SanitizedNames._sanitize
|
|
107
|
+
>>> san('/foo/bar')
|
|
108
|
+
'foo/bar'
|
|
109
|
+
>>> san('//foo.txt')
|
|
110
|
+
'foo.txt'
|
|
111
|
+
>>> san('foo/.././bar.txt')
|
|
112
|
+
'foo/bar.txt'
|
|
113
|
+
>>> san('foo../.bar.txt')
|
|
114
|
+
'foo../.bar.txt'
|
|
115
|
+
>>> san('\\foo\\bar.txt')
|
|
116
|
+
'foo/bar.txt'
|
|
117
|
+
>>> san('D:\\foo.txt')
|
|
118
|
+
'D/foo.txt'
|
|
119
|
+
>>> san('\\\\server\\share\\file.txt')
|
|
120
|
+
'server/share/file.txt'
|
|
121
|
+
>>> san('\\\\?\\GLOBALROOT\\Volume3')
|
|
122
|
+
'?/GLOBALROOT/Volume3'
|
|
123
|
+
>>> san('\\\\.\\PhysicalDrive1\\root')
|
|
124
|
+
'PhysicalDrive1/root'
|
|
125
|
+
|
|
126
|
+
Retain any trailing slash.
|
|
127
|
+
>>> san('abc/')
|
|
128
|
+
'abc/'
|
|
129
|
+
|
|
130
|
+
Raises a ValueError if the result is empty.
|
|
131
|
+
>>> san('../..')
|
|
132
|
+
Traceback (most recent call last):
|
|
133
|
+
...
|
|
134
|
+
ValueError: Empty filename
|
|
135
|
+
"""
|
|
136
|
+
|
|
137
|
+
def allowed(part):
|
|
138
|
+
return part and part not in {'..', '.'}
|
|
139
|
+
|
|
140
|
+
# Remove the drive letter.
|
|
141
|
+
# Don't use ntpath.splitdrive, because that also strips UNC paths
|
|
142
|
+
bare = re.sub('^([A-Z]):', r'\1', name, flags=re.IGNORECASE)
|
|
143
|
+
clean = bare.replace('\\', '/')
|
|
144
|
+
parts = clean.split('/')
|
|
145
|
+
joined = '/'.join(filter(allowed, parts))
|
|
146
|
+
if not joined:
|
|
147
|
+
raise ValueError("Empty filename")
|
|
148
|
+
return joined + '/' * name.endswith('/')
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
class CompleteDirs(InitializedState, SanitizedNames, zipfile.ZipFile):
|
|
152
|
+
"""
|
|
153
|
+
A ZipFile subclass that ensures that implied directories
|
|
154
|
+
are always included in the namelist.
|
|
155
|
+
|
|
156
|
+
>>> list(CompleteDirs._implied_dirs(['foo/bar.txt', 'foo/bar/baz.txt']))
|
|
157
|
+
['foo/', 'foo/bar/']
|
|
158
|
+
>>> list(CompleteDirs._implied_dirs(['foo/bar.txt', 'foo/bar/baz.txt', 'foo/bar/']))
|
|
159
|
+
['foo/']
|
|
160
|
+
"""
|
|
161
|
+
|
|
162
|
+
@staticmethod
|
|
163
|
+
def _implied_dirs(names):
|
|
164
|
+
parents = itertools.chain.from_iterable(map(_parents, names))
|
|
165
|
+
as_dirs = (p + posixpath.sep for p in parents)
|
|
166
|
+
return _dedupe(_difference(as_dirs, names))
|
|
167
|
+
|
|
168
|
+
def namelist(self):
|
|
169
|
+
names = super().namelist()
|
|
170
|
+
return names + list(self._implied_dirs(names))
|
|
171
|
+
|
|
172
|
+
def _name_set(self):
|
|
173
|
+
return set(self.namelist())
|
|
174
|
+
|
|
175
|
+
def resolve_dir(self, name):
|
|
176
|
+
"""
|
|
177
|
+
If the name represents a directory, return that name
|
|
178
|
+
as a directory (with the trailing slash).
|
|
179
|
+
"""
|
|
180
|
+
names = self._name_set()
|
|
181
|
+
dirname = name + '/'
|
|
182
|
+
dir_match = name not in names and dirname in names
|
|
183
|
+
return dirname if dir_match else name
|
|
184
|
+
|
|
185
|
+
def getinfo(self, name):
|
|
186
|
+
"""
|
|
187
|
+
Supplement getinfo for implied dirs.
|
|
188
|
+
"""
|
|
189
|
+
try:
|
|
190
|
+
return super().getinfo(name)
|
|
191
|
+
except KeyError:
|
|
192
|
+
if not name.endswith('/') or name not in self._name_set():
|
|
193
|
+
raise
|
|
194
|
+
return zipfile.ZipInfo(filename=name)
|
|
195
|
+
|
|
196
|
+
@classmethod
|
|
197
|
+
def make(cls, source):
|
|
198
|
+
"""
|
|
199
|
+
Given a source (filename or zipfile), return an
|
|
200
|
+
appropriate CompleteDirs subclass.
|
|
201
|
+
"""
|
|
202
|
+
if isinstance(source, CompleteDirs):
|
|
203
|
+
return source
|
|
204
|
+
|
|
205
|
+
if not isinstance(source, zipfile.ZipFile):
|
|
206
|
+
return cls(source)
|
|
207
|
+
|
|
208
|
+
# Only allow for FastLookup when supplied zipfile is read-only
|
|
209
|
+
if 'r' not in source.mode:
|
|
210
|
+
cls = CompleteDirs
|
|
211
|
+
|
|
212
|
+
source.__class__ = cls
|
|
213
|
+
return source
|
|
214
|
+
|
|
215
|
+
@classmethod
|
|
216
|
+
def inject(cls, zf: zipfile.ZipFile) -> zipfile.ZipFile:
|
|
217
|
+
"""
|
|
218
|
+
Given a writable zip file zf, inject directory entries for
|
|
219
|
+
any directories implied by the presence of children.
|
|
220
|
+
"""
|
|
221
|
+
for name in cls._implied_dirs(zf.namelist()):
|
|
222
|
+
zf.writestr(name, b"")
|
|
223
|
+
return zf
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
class FastLookup(CompleteDirs):
|
|
227
|
+
"""
|
|
228
|
+
ZipFile subclass to ensure implicit
|
|
229
|
+
dirs exist and are resolved rapidly.
|
|
230
|
+
"""
|
|
231
|
+
|
|
232
|
+
def namelist(self):
|
|
233
|
+
with contextlib.suppress(AttributeError):
|
|
234
|
+
return self.__names
|
|
235
|
+
self.__names = super().namelist()
|
|
236
|
+
return self.__names
|
|
237
|
+
|
|
238
|
+
def _name_set(self):
|
|
239
|
+
with contextlib.suppress(AttributeError):
|
|
240
|
+
return self.__lookup
|
|
241
|
+
self.__lookup = super()._name_set()
|
|
242
|
+
return self.__lookup
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
def _extract_text_encoding(encoding=None, *args, **kwargs):
|
|
246
|
+
# compute stack level so that the caller of the caller sees any warning.
|
|
247
|
+
is_pypy = sys.implementation.name == 'pypy'
|
|
248
|
+
stack_level = 3 + is_pypy
|
|
249
|
+
return text_encoding(encoding, stack_level), args, kwargs
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
class Path:
|
|
253
|
+
"""
|
|
254
|
+
A :class:`importlib.resources.abc.Traversable` interface for zip files.
|
|
255
|
+
|
|
256
|
+
Implements many of the features users enjoy from
|
|
257
|
+
:class:`pathlib.Path`.
|
|
258
|
+
|
|
259
|
+
Consider a zip file with this structure::
|
|
260
|
+
|
|
261
|
+
.
|
|
262
|
+
├── a.txt
|
|
263
|
+
└── b
|
|
264
|
+
├── c.txt
|
|
265
|
+
└── d
|
|
266
|
+
└── e.txt
|
|
267
|
+
|
|
268
|
+
>>> data = io.BytesIO()
|
|
269
|
+
>>> zf = zipfile.ZipFile(data, 'w')
|
|
270
|
+
>>> zf.writestr('a.txt', 'content of a')
|
|
271
|
+
>>> zf.writestr('b/c.txt', 'content of c')
|
|
272
|
+
>>> zf.writestr('b/d/e.txt', 'content of e')
|
|
273
|
+
>>> zf.filename = 'mem/abcde.zip'
|
|
274
|
+
|
|
275
|
+
Path accepts the zipfile object itself or a filename
|
|
276
|
+
|
|
277
|
+
>>> path = Path(zf)
|
|
278
|
+
|
|
279
|
+
From there, several path operations are available.
|
|
280
|
+
|
|
281
|
+
Directory iteration (including the zip file itself):
|
|
282
|
+
|
|
283
|
+
>>> a, b = path.iterdir()
|
|
284
|
+
>>> a
|
|
285
|
+
Path('mem/abcde.zip', 'a.txt')
|
|
286
|
+
>>> b
|
|
287
|
+
Path('mem/abcde.zip', 'b/')
|
|
288
|
+
|
|
289
|
+
name property:
|
|
290
|
+
|
|
291
|
+
>>> b.name
|
|
292
|
+
'b'
|
|
293
|
+
|
|
294
|
+
join with divide operator:
|
|
295
|
+
|
|
296
|
+
>>> c = b / 'c.txt'
|
|
297
|
+
>>> c
|
|
298
|
+
Path('mem/abcde.zip', 'b/c.txt')
|
|
299
|
+
>>> c.name
|
|
300
|
+
'c.txt'
|
|
301
|
+
|
|
302
|
+
Read text:
|
|
303
|
+
|
|
304
|
+
>>> c.read_text(encoding='utf-8')
|
|
305
|
+
'content of c'
|
|
306
|
+
|
|
307
|
+
existence:
|
|
308
|
+
|
|
309
|
+
>>> c.exists()
|
|
310
|
+
True
|
|
311
|
+
>>> (b / 'missing.txt').exists()
|
|
312
|
+
False
|
|
313
|
+
|
|
314
|
+
Coercion to string:
|
|
315
|
+
|
|
316
|
+
>>> import os
|
|
317
|
+
>>> str(c).replace(os.sep, posixpath.sep)
|
|
318
|
+
'mem/abcde.zip/b/c.txt'
|
|
319
|
+
|
|
320
|
+
At the root, ``name``, ``filename``, and ``parent``
|
|
321
|
+
resolve to the zipfile.
|
|
322
|
+
|
|
323
|
+
>>> str(path)
|
|
324
|
+
'mem/abcde.zip/'
|
|
325
|
+
>>> path.name
|
|
326
|
+
'abcde.zip'
|
|
327
|
+
>>> path.filename == pathlib.Path('mem/abcde.zip')
|
|
328
|
+
True
|
|
329
|
+
>>> str(path.parent)
|
|
330
|
+
'mem'
|
|
331
|
+
|
|
332
|
+
If the zipfile has no filename, such attributes are not
|
|
333
|
+
valid and accessing them will raise an Exception.
|
|
334
|
+
|
|
335
|
+
>>> zf.filename = None
|
|
336
|
+
>>> path.name
|
|
337
|
+
Traceback (most recent call last):
|
|
338
|
+
...
|
|
339
|
+
TypeError: ...
|
|
340
|
+
|
|
341
|
+
>>> path.filename
|
|
342
|
+
Traceback (most recent call last):
|
|
343
|
+
...
|
|
344
|
+
TypeError: ...
|
|
345
|
+
|
|
346
|
+
>>> path.parent
|
|
347
|
+
Traceback (most recent call last):
|
|
348
|
+
...
|
|
349
|
+
TypeError: ...
|
|
350
|
+
|
|
351
|
+
# workaround python/cpython#106763
|
|
352
|
+
>>> pass
|
|
353
|
+
"""
|
|
354
|
+
|
|
355
|
+
__repr = "{self.__class__.__name__}({self.root.filename!r}, {self.at!r})"
|
|
356
|
+
|
|
357
|
+
def __init__(self, root, at=""):
|
|
358
|
+
"""
|
|
359
|
+
Construct a Path from a ZipFile or filename.
|
|
360
|
+
|
|
361
|
+
Note: When the source is an existing ZipFile object,
|
|
362
|
+
its type (__class__) will be mutated to a
|
|
363
|
+
specialized type. If the caller wishes to retain the
|
|
364
|
+
original type, the caller should either create a
|
|
365
|
+
separate ZipFile object or pass a filename.
|
|
366
|
+
"""
|
|
367
|
+
self.root = FastLookup.make(root)
|
|
368
|
+
self.at = at
|
|
369
|
+
|
|
370
|
+
def __eq__(self, other):
|
|
371
|
+
"""
|
|
372
|
+
>>> Path(zipfile.ZipFile(io.BytesIO(), 'w')) == 'foo'
|
|
373
|
+
False
|
|
374
|
+
"""
|
|
375
|
+
if self.__class__ is not other.__class__:
|
|
376
|
+
return NotImplemented
|
|
377
|
+
return (self.root, self.at) == (other.root, other.at)
|
|
378
|
+
|
|
379
|
+
def __hash__(self):
|
|
380
|
+
return hash((self.root, self.at))
|
|
381
|
+
|
|
382
|
+
def open(self, mode='r', *args, pwd=None, **kwargs):
|
|
383
|
+
"""
|
|
384
|
+
Open this entry as text or binary following the semantics
|
|
385
|
+
of ``pathlib.Path.open()`` by passing arguments through
|
|
386
|
+
to io.TextIOWrapper().
|
|
387
|
+
"""
|
|
388
|
+
if self.is_dir():
|
|
389
|
+
raise IsADirectoryError(self)
|
|
390
|
+
zip_mode = mode[0]
|
|
391
|
+
if not self.exists() and zip_mode == 'r':
|
|
392
|
+
raise FileNotFoundError(self)
|
|
393
|
+
stream = self.root.open(self.at, zip_mode, pwd=pwd)
|
|
394
|
+
if 'b' in mode:
|
|
395
|
+
if args or kwargs:
|
|
396
|
+
raise ValueError("encoding args invalid for binary operation")
|
|
397
|
+
return stream
|
|
398
|
+
# Text mode:
|
|
399
|
+
encoding, args, kwargs = _extract_text_encoding(*args, **kwargs)
|
|
400
|
+
return io.TextIOWrapper(stream, encoding, *args, **kwargs)
|
|
401
|
+
|
|
402
|
+
def _base(self):
|
|
403
|
+
return pathlib.PurePosixPath(self.at or self.root.filename)
|
|
404
|
+
|
|
405
|
+
@property
|
|
406
|
+
def name(self):
|
|
407
|
+
return self._base().name
|
|
408
|
+
|
|
409
|
+
@property
|
|
410
|
+
def suffix(self):
|
|
411
|
+
return self._base().suffix
|
|
412
|
+
|
|
413
|
+
@property
|
|
414
|
+
def suffixes(self):
|
|
415
|
+
return self._base().suffixes
|
|
416
|
+
|
|
417
|
+
@property
|
|
418
|
+
def stem(self):
|
|
419
|
+
return self._base().stem
|
|
420
|
+
|
|
421
|
+
@property
|
|
422
|
+
def filename(self):
|
|
423
|
+
return pathlib.Path(self.root.filename).joinpath(self.at)
|
|
424
|
+
|
|
425
|
+
def read_text(self, *args, **kwargs):
|
|
426
|
+
encoding, args, kwargs = _extract_text_encoding(*args, **kwargs)
|
|
427
|
+
with self.open('r', encoding, *args, **kwargs) as strm:
|
|
428
|
+
return strm.read()
|
|
429
|
+
|
|
430
|
+
def read_bytes(self):
|
|
431
|
+
with self.open('rb') as strm:
|
|
432
|
+
return strm.read()
|
|
433
|
+
|
|
434
|
+
def _is_child(self, path):
|
|
435
|
+
return posixpath.dirname(path.at.rstrip("/")) == self.at.rstrip("/")
|
|
436
|
+
|
|
437
|
+
def _next(self, at):
|
|
438
|
+
return self.__class__(self.root, at)
|
|
439
|
+
|
|
440
|
+
def is_dir(self):
|
|
441
|
+
return not self.at or self.at.endswith("/")
|
|
442
|
+
|
|
443
|
+
def is_file(self):
|
|
444
|
+
return self.exists() and not self.is_dir()
|
|
445
|
+
|
|
446
|
+
def exists(self):
|
|
447
|
+
return self.at in self.root._name_set()
|
|
448
|
+
|
|
449
|
+
def iterdir(self):
|
|
450
|
+
if not self.is_dir():
|
|
451
|
+
raise ValueError("Can't listdir a file")
|
|
452
|
+
subs = map(self._next, self.root.namelist())
|
|
453
|
+
return filter(self._is_child, subs)
|
|
454
|
+
|
|
455
|
+
def match(self, path_pattern):
|
|
456
|
+
return pathlib.PurePosixPath(self.at).match(path_pattern)
|
|
457
|
+
|
|
458
|
+
def is_symlink(self):
|
|
459
|
+
"""
|
|
460
|
+
Return whether this path is a symlink.
|
|
461
|
+
"""
|
|
462
|
+
info = self.root.getinfo(self.at)
|
|
463
|
+
mode = info.external_attr >> 16
|
|
464
|
+
return stat.S_ISLNK(mode)
|
|
465
|
+
|
|
466
|
+
def glob(self, pattern):
|
|
467
|
+
if not pattern:
|
|
468
|
+
raise ValueError(f"Unacceptable pattern: {pattern!r}")
|
|
469
|
+
|
|
470
|
+
prefix = re.escape(self.at)
|
|
471
|
+
tr = Translator(seps='/')
|
|
472
|
+
matches = re.compile(prefix + tr.translate(pattern)).fullmatch
|
|
473
|
+
names = (data.filename for data in self.root.filelist)
|
|
474
|
+
return map(self._next, filter(matches, names))
|
|
475
|
+
|
|
476
|
+
def rglob(self, pattern):
|
|
477
|
+
return self.glob(f'**/{pattern}')
|
|
478
|
+
|
|
479
|
+
def relative_to(self, other, *extra):
|
|
480
|
+
return posixpath.relpath(str(self), str(other.joinpath(*extra)))
|
|
481
|
+
|
|
482
|
+
def __str__(self):
|
|
483
|
+
return posixpath.join(self.root.filename, self.at)
|
|
484
|
+
|
|
485
|
+
def __repr__(self):
|
|
486
|
+
return self.__repr.format(self=self)
|
|
487
|
+
|
|
488
|
+
def joinpath(self, *other):
|
|
489
|
+
next = posixpath.join(self.at, *other)
|
|
490
|
+
return self._next(self.root.resolve_dir(next))
|
|
491
|
+
|
|
492
|
+
__truediv__ = joinpath
|
|
493
|
+
|
|
494
|
+
@property
|
|
495
|
+
def parent(self):
|
|
496
|
+
if not self.at:
|
|
497
|
+
return self.filename.parent
|
|
498
|
+
parent_at = posixpath.dirname(self.at.rstrip('/'))
|
|
499
|
+
if parent_at:
|
|
500
|
+
parent_at += '/'
|
|
501
|
+
return self._next(parent_at)
|
|
File without changes
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import re
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
_default_seps = os.sep + str(os.altsep) * bool(os.altsep)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Translator:
|
|
9
|
+
"""
|
|
10
|
+
>>> Translator('xyz')
|
|
11
|
+
Traceback (most recent call last):
|
|
12
|
+
...
|
|
13
|
+
AssertionError: Invalid separators
|
|
14
|
+
|
|
15
|
+
>>> Translator('')
|
|
16
|
+
Traceback (most recent call last):
|
|
17
|
+
...
|
|
18
|
+
AssertionError: Invalid separators
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
seps: str
|
|
22
|
+
|
|
23
|
+
def __init__(self, seps: str = _default_seps):
|
|
24
|
+
assert seps and set(seps) <= set(_default_seps), "Invalid separators"
|
|
25
|
+
self.seps = seps
|
|
26
|
+
|
|
27
|
+
def translate(self, pattern):
|
|
28
|
+
"""
|
|
29
|
+
Given a glob pattern, produce a regex that matches it.
|
|
30
|
+
"""
|
|
31
|
+
return self.extend(self.translate_core(pattern))
|
|
32
|
+
|
|
33
|
+
def extend(self, pattern):
|
|
34
|
+
r"""
|
|
35
|
+
Extend regex for pattern-wide concerns.
|
|
36
|
+
|
|
37
|
+
Apply '(?s:)' to create a non-matching group that
|
|
38
|
+
matches newlines (valid on Unix).
|
|
39
|
+
|
|
40
|
+
Append '\Z' to imply fullmatch even when match is used.
|
|
41
|
+
"""
|
|
42
|
+
return rf'(?s:{pattern})\Z'
|
|
43
|
+
|
|
44
|
+
def translate_core(self, pattern):
|
|
45
|
+
r"""
|
|
46
|
+
Given a glob pattern, produce a regex that matches it.
|
|
47
|
+
|
|
48
|
+
>>> t = Translator()
|
|
49
|
+
>>> t.translate_core('*.txt').replace('\\\\', '')
|
|
50
|
+
'[^/]*\\.txt'
|
|
51
|
+
>>> t.translate_core('a?txt')
|
|
52
|
+
'a[^/]txt'
|
|
53
|
+
>>> t.translate_core('**/*').replace('\\\\', '')
|
|
54
|
+
'.*/[^/][^/]*'
|
|
55
|
+
"""
|
|
56
|
+
self.restrict_rglob(pattern)
|
|
57
|
+
return ''.join(map(self.replace, separate(self.star_not_empty(pattern))))
|
|
58
|
+
|
|
59
|
+
def replace(self, match):
|
|
60
|
+
"""
|
|
61
|
+
Perform the replacements for a match from :func:`separate`.
|
|
62
|
+
"""
|
|
63
|
+
return match.group('set') or (
|
|
64
|
+
re.escape(match.group(0))
|
|
65
|
+
.replace('\\*\\*', r'.*')
|
|
66
|
+
.replace('\\*', rf'[^{re.escape(self.seps)}]*')
|
|
67
|
+
.replace('\\?', r'[^/]')
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
def restrict_rglob(self, pattern):
|
|
71
|
+
"""
|
|
72
|
+
Raise ValueError if ** appears in anything but a full path segment.
|
|
73
|
+
|
|
74
|
+
>>> Translator().translate('**foo')
|
|
75
|
+
Traceback (most recent call last):
|
|
76
|
+
...
|
|
77
|
+
ValueError: ** must appear alone in a path segment
|
|
78
|
+
"""
|
|
79
|
+
seps_pattern = rf'[{re.escape(self.seps)}]+'
|
|
80
|
+
segments = re.split(seps_pattern, pattern)
|
|
81
|
+
if any('**' in segment and segment != '**' for segment in segments):
|
|
82
|
+
raise ValueError("** must appear alone in a path segment")
|
|
83
|
+
|
|
84
|
+
def star_not_empty(self, pattern):
|
|
85
|
+
"""
|
|
86
|
+
Ensure that * will not match an empty segment.
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
def handle_segment(match):
|
|
90
|
+
segment = match.group(0)
|
|
91
|
+
return '?*' if segment == '*' else segment
|
|
92
|
+
|
|
93
|
+
not_seps_pattern = rf'[^{re.escape(self.seps)}]+'
|
|
94
|
+
return re.sub(not_seps_pattern, handle_segment, pattern)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def separate(pattern):
|
|
98
|
+
"""
|
|
99
|
+
Separate out character sets to avoid translating their contents.
|
|
100
|
+
|
|
101
|
+
>>> [m.group(0) for m in separate('*.txt')]
|
|
102
|
+
['*.txt']
|
|
103
|
+
>>> [m.group(0) for m in separate('a[?]txt')]
|
|
104
|
+
['a', '[?]', 'txt']
|
|
105
|
+
"""
|
|
106
|
+
return re.finditer(r'([^\[]+)|(?P<set>[\[].*?[\]])|([\[][^\]]*$)', pattern)
|