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,336 @@
|
|
|
1
|
+
import io
|
|
2
|
+
import json
|
|
3
|
+
import logging
|
|
4
|
+
import os
|
|
5
|
+
import re
|
|
6
|
+
import typing
|
|
7
|
+
from contextlib import contextmanager
|
|
8
|
+
from textwrap import indent, wrap
|
|
9
|
+
from typing import Any, Dict, Generator, Iterator, List, Optional, Sequence, Union
|
|
10
|
+
|
|
11
|
+
from .fastjsonschema_exceptions import JsonSchemaValueException
|
|
12
|
+
|
|
13
|
+
if typing.TYPE_CHECKING:
|
|
14
|
+
import sys
|
|
15
|
+
|
|
16
|
+
if sys.version_info < (3, 11):
|
|
17
|
+
from typing_extensions import Self
|
|
18
|
+
else:
|
|
19
|
+
from typing import Self
|
|
20
|
+
|
|
21
|
+
_logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
_MESSAGE_REPLACEMENTS = {
|
|
24
|
+
"must be named by propertyName definition": "keys must be named by",
|
|
25
|
+
"one of contains definition": "at least one item that matches",
|
|
26
|
+
" same as const definition:": "",
|
|
27
|
+
"only specified items": "only items matching the definition",
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
_SKIP_DETAILS = (
|
|
31
|
+
"must not be empty",
|
|
32
|
+
"is always invalid",
|
|
33
|
+
"must not be there",
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
_NEED_DETAILS = {"anyOf", "oneOf", "allOf", "contains", "propertyNames", "not", "items"}
|
|
37
|
+
|
|
38
|
+
_CAMEL_CASE_SPLITTER = re.compile(r"\W+|([A-Z][^A-Z\W]*)")
|
|
39
|
+
_IDENTIFIER = re.compile(r"^[\w_]+$", re.I)
|
|
40
|
+
|
|
41
|
+
_TOML_JARGON = {
|
|
42
|
+
"object": "table",
|
|
43
|
+
"property": "key",
|
|
44
|
+
"properties": "keys",
|
|
45
|
+
"property names": "keys",
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
_FORMATS_HELP = """
|
|
49
|
+
For more details about `format` see
|
|
50
|
+
https://validate-pyproject.readthedocs.io/en/latest/api/validate_pyproject.formats.html
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class ValidationError(JsonSchemaValueException):
|
|
55
|
+
"""Report violations of a given JSON schema.
|
|
56
|
+
|
|
57
|
+
This class extends :exc:`~fastjsonschema.JsonSchemaValueException`
|
|
58
|
+
by adding the following properties:
|
|
59
|
+
|
|
60
|
+
- ``summary``: an improved version of the ``JsonSchemaValueException`` error message
|
|
61
|
+
with only the necessary information)
|
|
62
|
+
|
|
63
|
+
- ``details``: more contextual information about the error like the failing schema
|
|
64
|
+
itself and the value that violates the schema.
|
|
65
|
+
|
|
66
|
+
Depending on the level of the verbosity of the ``logging`` configuration
|
|
67
|
+
the exception message will be only ``summary`` (default) or a combination of
|
|
68
|
+
``summary`` and ``details`` (when the logging level is set to :obj:`logging.DEBUG`).
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
summary = ""
|
|
72
|
+
details = ""
|
|
73
|
+
_original_message = ""
|
|
74
|
+
|
|
75
|
+
@classmethod
|
|
76
|
+
def _from_jsonschema(cls, ex: JsonSchemaValueException) -> "Self":
|
|
77
|
+
formatter = _ErrorFormatting(ex)
|
|
78
|
+
obj = cls(str(formatter), ex.value, formatter.name, ex.definition, ex.rule)
|
|
79
|
+
debug_code = os.getenv("JSONSCHEMA_DEBUG_CODE_GENERATION", "false").lower()
|
|
80
|
+
if debug_code != "false": # pragma: no cover
|
|
81
|
+
obj.__cause__, obj.__traceback__ = ex.__cause__, ex.__traceback__
|
|
82
|
+
obj._original_message = ex.message
|
|
83
|
+
obj.summary = formatter.summary
|
|
84
|
+
obj.details = formatter.details
|
|
85
|
+
return obj
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
@contextmanager
|
|
89
|
+
def detailed_errors() -> Generator[None, None, None]:
|
|
90
|
+
try:
|
|
91
|
+
yield
|
|
92
|
+
except JsonSchemaValueException as ex:
|
|
93
|
+
raise ValidationError._from_jsonschema(ex) from None
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class _ErrorFormatting:
|
|
97
|
+
def __init__(self, ex: JsonSchemaValueException):
|
|
98
|
+
self.ex = ex
|
|
99
|
+
self.name = f"`{self._simplify_name(ex.name)}`"
|
|
100
|
+
self._original_message: str = self.ex.message.replace(ex.name, self.name)
|
|
101
|
+
self._summary = ""
|
|
102
|
+
self._details = ""
|
|
103
|
+
|
|
104
|
+
def __str__(self) -> str:
|
|
105
|
+
if _logger.getEffectiveLevel() <= logging.DEBUG and self.details:
|
|
106
|
+
return f"{self.summary}\n\n{self.details}"
|
|
107
|
+
|
|
108
|
+
return self.summary
|
|
109
|
+
|
|
110
|
+
@property
|
|
111
|
+
def summary(self) -> str:
|
|
112
|
+
if not self._summary:
|
|
113
|
+
self._summary = self._expand_summary()
|
|
114
|
+
|
|
115
|
+
return self._summary
|
|
116
|
+
|
|
117
|
+
@property
|
|
118
|
+
def details(self) -> str:
|
|
119
|
+
if not self._details:
|
|
120
|
+
self._details = self._expand_details()
|
|
121
|
+
|
|
122
|
+
return self._details
|
|
123
|
+
|
|
124
|
+
@staticmethod
|
|
125
|
+
def _simplify_name(name: str) -> str:
|
|
126
|
+
x = len("data.")
|
|
127
|
+
return name[x:] if name.startswith("data.") else name
|
|
128
|
+
|
|
129
|
+
def _expand_summary(self) -> str:
|
|
130
|
+
msg = self._original_message
|
|
131
|
+
|
|
132
|
+
for bad, repl in _MESSAGE_REPLACEMENTS.items():
|
|
133
|
+
msg = msg.replace(bad, repl)
|
|
134
|
+
|
|
135
|
+
if any(substring in msg for substring in _SKIP_DETAILS):
|
|
136
|
+
return msg
|
|
137
|
+
|
|
138
|
+
schema = self.ex.rule_definition
|
|
139
|
+
if self.ex.rule in _NEED_DETAILS and schema:
|
|
140
|
+
summary = _SummaryWriter(_TOML_JARGON)
|
|
141
|
+
return f"{msg}:\n\n{indent(summary(schema), ' ')}"
|
|
142
|
+
|
|
143
|
+
return msg
|
|
144
|
+
|
|
145
|
+
def _expand_details(self) -> str:
|
|
146
|
+
optional = []
|
|
147
|
+
definition = self.ex.definition or {}
|
|
148
|
+
desc_lines = definition.pop("$$description", [])
|
|
149
|
+
desc = definition.pop("description", None) or " ".join(desc_lines)
|
|
150
|
+
if desc:
|
|
151
|
+
description = "\n".join(
|
|
152
|
+
wrap(
|
|
153
|
+
desc,
|
|
154
|
+
width=80,
|
|
155
|
+
initial_indent=" ",
|
|
156
|
+
subsequent_indent=" ",
|
|
157
|
+
break_long_words=False,
|
|
158
|
+
)
|
|
159
|
+
)
|
|
160
|
+
optional.append(f"DESCRIPTION:\n{description}")
|
|
161
|
+
schema = json.dumps(definition, indent=4)
|
|
162
|
+
value = json.dumps(self.ex.value, indent=4)
|
|
163
|
+
defaults = [
|
|
164
|
+
f"GIVEN VALUE:\n{indent(value, ' ')}",
|
|
165
|
+
f"OFFENDING RULE: {self.ex.rule!r}",
|
|
166
|
+
f"DEFINITION:\n{indent(schema, ' ')}",
|
|
167
|
+
]
|
|
168
|
+
msg = "\n\n".join(optional + defaults)
|
|
169
|
+
epilog = f"\n{_FORMATS_HELP}" if "format" in msg.lower() else ""
|
|
170
|
+
return msg + epilog
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
class _SummaryWriter:
|
|
174
|
+
_IGNORE = frozenset(("description", "default", "title", "examples"))
|
|
175
|
+
|
|
176
|
+
def __init__(self, jargon: Optional[Dict[str, str]] = None):
|
|
177
|
+
self.jargon: Dict[str, str] = jargon or {}
|
|
178
|
+
# Clarify confusing terms
|
|
179
|
+
self._terms = {
|
|
180
|
+
"anyOf": "at least one of the following",
|
|
181
|
+
"oneOf": "exactly one of the following",
|
|
182
|
+
"allOf": "all of the following",
|
|
183
|
+
"not": "(*NOT* the following)",
|
|
184
|
+
"prefixItems": f"{self._jargon('items')} (in order)",
|
|
185
|
+
"items": "items",
|
|
186
|
+
"contains": "contains at least one of",
|
|
187
|
+
"propertyNames": (
|
|
188
|
+
f"non-predefined acceptable {self._jargon('property names')}"
|
|
189
|
+
),
|
|
190
|
+
"patternProperties": f"{self._jargon('properties')} named via pattern",
|
|
191
|
+
"const": "predefined value",
|
|
192
|
+
"enum": "one of",
|
|
193
|
+
}
|
|
194
|
+
# Attributes that indicate that the definition is easy and can be done
|
|
195
|
+
# inline (e.g. string and number)
|
|
196
|
+
self._guess_inline_defs = [
|
|
197
|
+
"enum",
|
|
198
|
+
"const",
|
|
199
|
+
"maxLength",
|
|
200
|
+
"minLength",
|
|
201
|
+
"pattern",
|
|
202
|
+
"format",
|
|
203
|
+
"minimum",
|
|
204
|
+
"maximum",
|
|
205
|
+
"exclusiveMinimum",
|
|
206
|
+
"exclusiveMaximum",
|
|
207
|
+
"multipleOf",
|
|
208
|
+
]
|
|
209
|
+
|
|
210
|
+
def _jargon(self, term: Union[str, List[str]]) -> Union[str, List[str]]:
|
|
211
|
+
if isinstance(term, list):
|
|
212
|
+
return [self.jargon.get(t, t) for t in term]
|
|
213
|
+
return self.jargon.get(term, term)
|
|
214
|
+
|
|
215
|
+
def __call__(
|
|
216
|
+
self,
|
|
217
|
+
schema: Union[dict, List[dict]],
|
|
218
|
+
prefix: str = "",
|
|
219
|
+
*,
|
|
220
|
+
_path: Sequence[str] = (),
|
|
221
|
+
) -> str:
|
|
222
|
+
if isinstance(schema, list):
|
|
223
|
+
return self._handle_list(schema, prefix, _path)
|
|
224
|
+
|
|
225
|
+
filtered = self._filter_unecessary(schema, _path)
|
|
226
|
+
simple = self._handle_simple_dict(filtered, _path)
|
|
227
|
+
if simple:
|
|
228
|
+
return f"{prefix}{simple}"
|
|
229
|
+
|
|
230
|
+
child_prefix = self._child_prefix(prefix, " ")
|
|
231
|
+
item_prefix = self._child_prefix(prefix, "- ")
|
|
232
|
+
indent = len(prefix) * " "
|
|
233
|
+
with io.StringIO() as buffer:
|
|
234
|
+
for i, (key, value) in enumerate(filtered.items()):
|
|
235
|
+
child_path = [*_path, key]
|
|
236
|
+
line_prefix = prefix if i == 0 else indent
|
|
237
|
+
buffer.write(f"{line_prefix}{self._label(child_path)}:")
|
|
238
|
+
# ^ just the first item should receive the complete prefix
|
|
239
|
+
if isinstance(value, dict):
|
|
240
|
+
filtered = self._filter_unecessary(value, child_path)
|
|
241
|
+
simple = self._handle_simple_dict(filtered, child_path)
|
|
242
|
+
buffer.write(
|
|
243
|
+
f" {simple}"
|
|
244
|
+
if simple
|
|
245
|
+
else f"\n{self(value, child_prefix, _path=child_path)}"
|
|
246
|
+
)
|
|
247
|
+
elif isinstance(value, list) and (
|
|
248
|
+
key != "type" or self._is_property(child_path)
|
|
249
|
+
):
|
|
250
|
+
children = self._handle_list(value, item_prefix, child_path)
|
|
251
|
+
sep = " " if children.startswith("[") else "\n"
|
|
252
|
+
buffer.write(f"{sep}{children}")
|
|
253
|
+
else:
|
|
254
|
+
buffer.write(f" {self._value(value, child_path)}\n")
|
|
255
|
+
return buffer.getvalue()
|
|
256
|
+
|
|
257
|
+
def _is_unecessary(self, path: Sequence[str]) -> bool:
|
|
258
|
+
if self._is_property(path) or not path: # empty path => instruction @ root
|
|
259
|
+
return False
|
|
260
|
+
key = path[-1]
|
|
261
|
+
return any(key.startswith(k) for k in "$_") or key in self._IGNORE
|
|
262
|
+
|
|
263
|
+
def _filter_unecessary(
|
|
264
|
+
self, schema: Dict[str, Any], path: Sequence[str]
|
|
265
|
+
) -> Dict[str, Any]:
|
|
266
|
+
return {
|
|
267
|
+
key: value
|
|
268
|
+
for key, value in schema.items()
|
|
269
|
+
if not self._is_unecessary([*path, key])
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
def _handle_simple_dict(self, value: dict, path: Sequence[str]) -> Optional[str]:
|
|
273
|
+
inline = any(p in value for p in self._guess_inline_defs)
|
|
274
|
+
simple = not any(isinstance(v, (list, dict)) for v in value.values())
|
|
275
|
+
if inline or simple:
|
|
276
|
+
return f"{{{', '.join(self._inline_attrs(value, path))}}}\n"
|
|
277
|
+
return None
|
|
278
|
+
|
|
279
|
+
def _handle_list(
|
|
280
|
+
self, schemas: list, prefix: str = "", path: Sequence[str] = ()
|
|
281
|
+
) -> str:
|
|
282
|
+
if self._is_unecessary(path):
|
|
283
|
+
return ""
|
|
284
|
+
|
|
285
|
+
repr_ = repr(schemas)
|
|
286
|
+
if all(not isinstance(e, (dict, list)) for e in schemas) and len(repr_) < 60:
|
|
287
|
+
return f"{repr_}\n"
|
|
288
|
+
|
|
289
|
+
item_prefix = self._child_prefix(prefix, "- ")
|
|
290
|
+
return "".join(
|
|
291
|
+
self(v, item_prefix, _path=[*path, f"[{i}]"]) for i, v in enumerate(schemas)
|
|
292
|
+
)
|
|
293
|
+
|
|
294
|
+
def _is_property(self, path: Sequence[str]) -> bool:
|
|
295
|
+
"""Check if the given path can correspond to an arbitrarily named property"""
|
|
296
|
+
counter = 0
|
|
297
|
+
for key in path[-2::-1]:
|
|
298
|
+
if key not in {"properties", "patternProperties"}:
|
|
299
|
+
break
|
|
300
|
+
counter += 1
|
|
301
|
+
|
|
302
|
+
# If the counter if even, the path correspond to a JSON Schema keyword
|
|
303
|
+
# otherwise it can be any arbitrary string naming a property
|
|
304
|
+
return counter % 2 == 1
|
|
305
|
+
|
|
306
|
+
def _label(self, path: Sequence[str]) -> str:
|
|
307
|
+
*parents, key = path
|
|
308
|
+
if not self._is_property(path):
|
|
309
|
+
norm_key = _separate_terms(key)
|
|
310
|
+
return self._terms.get(key) or " ".join(self._jargon(norm_key))
|
|
311
|
+
|
|
312
|
+
if parents[-1] == "patternProperties":
|
|
313
|
+
return f"(regex {key!r})"
|
|
314
|
+
return repr(key) # property name
|
|
315
|
+
|
|
316
|
+
def _value(self, value: Any, path: Sequence[str]) -> str:
|
|
317
|
+
if path[-1] == "type" and not self._is_property(path):
|
|
318
|
+
type_ = self._jargon(value)
|
|
319
|
+
return f"[{', '.join(type_)}]" if isinstance(type_, list) else type_
|
|
320
|
+
return repr(value)
|
|
321
|
+
|
|
322
|
+
def _inline_attrs(self, schema: dict, path: Sequence[str]) -> Iterator[str]:
|
|
323
|
+
for key, value in schema.items():
|
|
324
|
+
child_path = [*path, key]
|
|
325
|
+
yield f"{self._label(child_path)}: {self._value(value, child_path)}"
|
|
326
|
+
|
|
327
|
+
def _child_prefix(self, parent_prefix: str, child_prefix: str) -> str:
|
|
328
|
+
return len(parent_prefix) * " " + child_prefix
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
def _separate_terms(word: str) -> List[str]:
|
|
332
|
+
"""
|
|
333
|
+
>>> _separate_terms("FooBar-foo")
|
|
334
|
+
['foo', 'bar', 'foo']
|
|
335
|
+
"""
|
|
336
|
+
return [w.lower() for w in _CAMEL_CASE_SPLITTER.split(word) if w]
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"""The purpose of this module is implement PEP 621 validations that are
|
|
2
|
+
difficult to express as a JSON Schema (or that are not supported by the current
|
|
3
|
+
JSON Schema library).
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from inspect import cleandoc
|
|
7
|
+
from typing import Mapping, TypeVar
|
|
8
|
+
|
|
9
|
+
from .error_reporting import ValidationError
|
|
10
|
+
|
|
11
|
+
T = TypeVar("T", bound=Mapping)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class RedefiningStaticFieldAsDynamic(ValidationError):
|
|
15
|
+
_DESC = """According to PEP 621:
|
|
16
|
+
|
|
17
|
+
Build back-ends MUST raise an error if the metadata specifies a field
|
|
18
|
+
statically as well as being listed in dynamic.
|
|
19
|
+
"""
|
|
20
|
+
__doc__ = _DESC
|
|
21
|
+
_URL = (
|
|
22
|
+
"https://packaging.python.org/en/latest/specifications/"
|
|
23
|
+
"pyproject-toml/#dynamic"
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class IncludedDependencyGroupMustExist(ValidationError):
|
|
28
|
+
_DESC = """An included dependency group must exist and must not be cyclic.
|
|
29
|
+
"""
|
|
30
|
+
__doc__ = _DESC
|
|
31
|
+
_URL = "https://peps.python.org/pep-0735/"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def validate_project_dynamic(pyproject: T) -> T:
|
|
35
|
+
project_table = pyproject.get("project", {})
|
|
36
|
+
dynamic = project_table.get("dynamic", [])
|
|
37
|
+
|
|
38
|
+
for field in dynamic:
|
|
39
|
+
if field in project_table:
|
|
40
|
+
raise RedefiningStaticFieldAsDynamic(
|
|
41
|
+
message=f"You cannot provide a value for `project.{field}` and "
|
|
42
|
+
"list it under `project.dynamic` at the same time",
|
|
43
|
+
value={
|
|
44
|
+
field: project_table[field],
|
|
45
|
+
"...": " # ...",
|
|
46
|
+
"dynamic": dynamic,
|
|
47
|
+
},
|
|
48
|
+
name=f"data.project.{field}",
|
|
49
|
+
definition={
|
|
50
|
+
"description": cleandoc(RedefiningStaticFieldAsDynamic._DESC),
|
|
51
|
+
"see": RedefiningStaticFieldAsDynamic._URL,
|
|
52
|
+
},
|
|
53
|
+
rule="PEP 621",
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
return pyproject
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def validate_include_depenency(pyproject: T) -> T:
|
|
60
|
+
dependency_groups = pyproject.get("dependency-groups", {})
|
|
61
|
+
for key, value in dependency_groups.items():
|
|
62
|
+
for each in value:
|
|
63
|
+
if (
|
|
64
|
+
isinstance(each, dict)
|
|
65
|
+
and (include_group := each.get("include-group"))
|
|
66
|
+
and include_group not in dependency_groups
|
|
67
|
+
):
|
|
68
|
+
raise IncludedDependencyGroupMustExist(
|
|
69
|
+
message=f"The included dependency group {include_group} doesn't exist",
|
|
70
|
+
value=each,
|
|
71
|
+
name=f"data.dependency_groups.{key}",
|
|
72
|
+
definition={
|
|
73
|
+
"description": cleandoc(IncludedDependencyGroupMustExist._DESC),
|
|
74
|
+
"see": IncludedDependencyGroupMustExist._URL,
|
|
75
|
+
},
|
|
76
|
+
rule="PEP 735",
|
|
77
|
+
)
|
|
78
|
+
# TODO: check for `include-group` cycles (can be conditional to graphlib)
|
|
79
|
+
return pyproject
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
EXTRA_VALIDATIONS = (validate_project_dynamic, validate_include_depenency)
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import re
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
SPLIT_RE = re.compile(r'[\.\[\]]+')
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class JsonSchemaException(ValueError):
|
|
8
|
+
"""
|
|
9
|
+
Base exception of ``fastjsonschema`` library.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class JsonSchemaValueException(JsonSchemaException):
|
|
14
|
+
"""
|
|
15
|
+
Exception raised by validation function. Available properties:
|
|
16
|
+
|
|
17
|
+
* ``message`` containing human-readable information what is wrong (e.g. ``data.property[index] must be smaller than or equal to 42``),
|
|
18
|
+
* invalid ``value`` (e.g. ``60``),
|
|
19
|
+
* ``name`` of a path in the data structure (e.g. ``data.property[index]``),
|
|
20
|
+
* ``path`` as an array in the data structure (e.g. ``['data', 'property', 'index']``),
|
|
21
|
+
* the whole ``definition`` which the ``value`` has to fulfil (e.g. ``{'type': 'number', 'maximum': 42}``),
|
|
22
|
+
* ``rule`` which the ``value`` is breaking (e.g. ``maximum``)
|
|
23
|
+
* and ``rule_definition`` (e.g. ``42``).
|
|
24
|
+
|
|
25
|
+
.. versionchanged:: 2.14.0
|
|
26
|
+
Added all extra properties.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
def __init__(self, message, value=None, name=None, definition=None, rule=None):
|
|
30
|
+
super().__init__(message)
|
|
31
|
+
self.message = message
|
|
32
|
+
self.value = value
|
|
33
|
+
self.name = name
|
|
34
|
+
self.definition = definition
|
|
35
|
+
self.rule = rule
|
|
36
|
+
|
|
37
|
+
@property
|
|
38
|
+
def path(self):
|
|
39
|
+
return [item for item in SPLIT_RE.split(self.name) if item != '']
|
|
40
|
+
|
|
41
|
+
@property
|
|
42
|
+
def rule_definition(self):
|
|
43
|
+
if not self.rule or not self.definition:
|
|
44
|
+
return None
|
|
45
|
+
return self.definition.get(self.rule)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class JsonSchemaDefinitionException(JsonSchemaException):
|
|
49
|
+
"""
|
|
50
|
+
Exception raised by generator of validation function.
|
|
51
|
+
"""
|