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.

Files changed (375) hide show
  1. android_notify/config.py +1 -1
  2. {android_notify-1.60.0.dist-info → android_notify-1.60.2.dist-info}/METADATA +4 -4
  3. {android_notify-1.60.0.dist-info → android_notify-1.60.2.dist-info}/RECORD +375 -6
  4. venv/Lib/site-packages/_distutils_hack/__init__.py +239 -0
  5. venv/Lib/site-packages/_distutils_hack/override.py +1 -0
  6. venv/Lib/site-packages/pkg_resources/__init__.py +3713 -0
  7. venv/Lib/site-packages/pkg_resources/py.typed +0 -0
  8. venv/Lib/site-packages/pkg_resources/tests/__init__.py +0 -0
  9. venv/Lib/site-packages/pkg_resources/tests/data/my-test-package-source/setup.py +7 -0
  10. venv/Lib/site-packages/pkg_resources/tests/test_find_distributions.py +56 -0
  11. venv/Lib/site-packages/pkg_resources/tests/test_integration_zope_interface.py +54 -0
  12. venv/Lib/site-packages/pkg_resources/tests/test_markers.py +8 -0
  13. venv/Lib/site-packages/pkg_resources/tests/test_pkg_resources.py +485 -0
  14. venv/Lib/site-packages/pkg_resources/tests/test_resources.py +869 -0
  15. venv/Lib/site-packages/pkg_resources/tests/test_working_set.py +505 -0
  16. venv/Lib/site-packages/setuptools/__init__.py +248 -0
  17. venv/Lib/site-packages/setuptools/_core_metadata.py +337 -0
  18. venv/Lib/site-packages/setuptools/_discovery.py +33 -0
  19. venv/Lib/site-packages/setuptools/_distutils/__init__.py +14 -0
  20. venv/Lib/site-packages/setuptools/_distutils/_log.py +3 -0
  21. venv/Lib/site-packages/setuptools/_distutils/_macos_compat.py +12 -0
  22. venv/Lib/site-packages/setuptools/_distutils/_modified.py +95 -0
  23. venv/Lib/site-packages/setuptools/_distutils/_msvccompiler.py +16 -0
  24. venv/Lib/site-packages/setuptools/_distutils/archive_util.py +294 -0
  25. venv/Lib/site-packages/setuptools/_distutils/ccompiler.py +26 -0
  26. venv/Lib/site-packages/setuptools/_distutils/cmd.py +554 -0
  27. venv/Lib/site-packages/setuptools/_distutils/command/__init__.py +23 -0
  28. venv/Lib/site-packages/setuptools/_distutils/command/_framework_compat.py +54 -0
  29. venv/Lib/site-packages/setuptools/_distutils/command/bdist.py +167 -0
  30. venv/Lib/site-packages/setuptools/_distutils/command/bdist_dumb.py +141 -0
  31. venv/Lib/site-packages/setuptools/_distutils/command/bdist_rpm.py +598 -0
  32. venv/Lib/site-packages/setuptools/_distutils/command/build.py +156 -0
  33. venv/Lib/site-packages/setuptools/_distutils/command/build_clib.py +201 -0
  34. venv/Lib/site-packages/setuptools/_distutils/command/build_ext.py +812 -0
  35. venv/Lib/site-packages/setuptools/_distutils/command/build_py.py +407 -0
  36. venv/Lib/site-packages/setuptools/_distutils/command/build_scripts.py +160 -0
  37. venv/Lib/site-packages/setuptools/_distutils/command/check.py +152 -0
  38. venv/Lib/site-packages/setuptools/_distutils/command/clean.py +77 -0
  39. venv/Lib/site-packages/setuptools/_distutils/command/config.py +358 -0
  40. venv/Lib/site-packages/setuptools/_distutils/command/install.py +805 -0
  41. venv/Lib/site-packages/setuptools/_distutils/command/install_data.py +94 -0
  42. venv/Lib/site-packages/setuptools/_distutils/command/install_egg_info.py +91 -0
  43. venv/Lib/site-packages/setuptools/_distutils/command/install_headers.py +46 -0
  44. venv/Lib/site-packages/setuptools/_distutils/command/install_lib.py +238 -0
  45. venv/Lib/site-packages/setuptools/_distutils/command/install_scripts.py +62 -0
  46. venv/Lib/site-packages/setuptools/_distutils/command/sdist.py +521 -0
  47. venv/Lib/site-packages/setuptools/_distutils/compat/__init__.py +18 -0
  48. venv/Lib/site-packages/setuptools/_distutils/compat/numpy.py +2 -0
  49. venv/Lib/site-packages/setuptools/_distutils/compat/py39.py +66 -0
  50. venv/Lib/site-packages/setuptools/_distutils/compilers/C/base.py +1394 -0
  51. venv/Lib/site-packages/setuptools/_distutils/compilers/C/cygwin.py +340 -0
  52. venv/Lib/site-packages/setuptools/_distutils/compilers/C/errors.py +24 -0
  53. venv/Lib/site-packages/setuptools/_distutils/compilers/C/msvc.py +614 -0
  54. venv/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_base.py +83 -0
  55. venv/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_cygwin.py +76 -0
  56. venv/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_mingw.py +48 -0
  57. venv/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_msvc.py +136 -0
  58. venv/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_unix.py +413 -0
  59. venv/Lib/site-packages/setuptools/_distutils/compilers/C/unix.py +422 -0
  60. venv/Lib/site-packages/setuptools/_distutils/compilers/C/zos.py +230 -0
  61. venv/Lib/site-packages/setuptools/_distutils/core.py +289 -0
  62. venv/Lib/site-packages/setuptools/_distutils/cygwinccompiler.py +31 -0
  63. venv/Lib/site-packages/setuptools/_distutils/debug.py +5 -0
  64. venv/Lib/site-packages/setuptools/_distutils/dep_util.py +14 -0
  65. venv/Lib/site-packages/setuptools/_distutils/dir_util.py +244 -0
  66. venv/Lib/site-packages/setuptools/_distutils/dist.py +1386 -0
  67. venv/Lib/site-packages/setuptools/_distutils/errors.py +108 -0
  68. venv/Lib/site-packages/setuptools/_distutils/extension.py +258 -0
  69. venv/Lib/site-packages/setuptools/_distutils/fancy_getopt.py +471 -0
  70. venv/Lib/site-packages/setuptools/_distutils/file_util.py +236 -0
  71. venv/Lib/site-packages/setuptools/_distutils/filelist.py +431 -0
  72. venv/Lib/site-packages/setuptools/_distutils/log.py +56 -0
  73. venv/Lib/site-packages/setuptools/_distutils/spawn.py +134 -0
  74. venv/Lib/site-packages/setuptools/_distutils/sysconfig.py +598 -0
  75. venv/Lib/site-packages/setuptools/_distutils/tests/__init__.py +42 -0
  76. venv/Lib/site-packages/setuptools/_distutils/tests/compat/__init__.py +0 -0
  77. venv/Lib/site-packages/setuptools/_distutils/tests/compat/py39.py +40 -0
  78. venv/Lib/site-packages/setuptools/_distutils/tests/support.py +134 -0
  79. venv/Lib/site-packages/setuptools/_distutils/tests/test_archive_util.py +353 -0
  80. venv/Lib/site-packages/setuptools/_distutils/tests/test_bdist.py +47 -0
  81. venv/Lib/site-packages/setuptools/_distutils/tests/test_bdist_dumb.py +78 -0
  82. venv/Lib/site-packages/setuptools/_distutils/tests/test_bdist_rpm.py +127 -0
  83. venv/Lib/site-packages/setuptools/_distutils/tests/test_build.py +49 -0
  84. venv/Lib/site-packages/setuptools/_distutils/tests/test_build_clib.py +134 -0
  85. venv/Lib/site-packages/setuptools/_distutils/tests/test_build_ext.py +628 -0
  86. venv/Lib/site-packages/setuptools/_distutils/tests/test_build_py.py +196 -0
  87. venv/Lib/site-packages/setuptools/_distutils/tests/test_build_scripts.py +96 -0
  88. venv/Lib/site-packages/setuptools/_distutils/tests/test_check.py +194 -0
  89. venv/Lib/site-packages/setuptools/_distutils/tests/test_clean.py +45 -0
  90. venv/Lib/site-packages/setuptools/_distutils/tests/test_cmd.py +107 -0
  91. venv/Lib/site-packages/setuptools/_distutils/tests/test_config_cmd.py +87 -0
  92. venv/Lib/site-packages/setuptools/_distutils/tests/test_core.py +130 -0
  93. venv/Lib/site-packages/setuptools/_distutils/tests/test_dir_util.py +139 -0
  94. venv/Lib/site-packages/setuptools/_distutils/tests/test_dist.py +552 -0
  95. venv/Lib/site-packages/setuptools/_distutils/tests/test_extension.py +117 -0
  96. venv/Lib/site-packages/setuptools/_distutils/tests/test_file_util.py +95 -0
  97. venv/Lib/site-packages/setuptools/_distutils/tests/test_filelist.py +336 -0
  98. venv/Lib/site-packages/setuptools/_distutils/tests/test_install.py +245 -0
  99. venv/Lib/site-packages/setuptools/_distutils/tests/test_install_data.py +74 -0
  100. venv/Lib/site-packages/setuptools/_distutils/tests/test_install_headers.py +33 -0
  101. venv/Lib/site-packages/setuptools/_distutils/tests/test_install_lib.py +110 -0
  102. venv/Lib/site-packages/setuptools/_distutils/tests/test_install_scripts.py +52 -0
  103. venv/Lib/site-packages/setuptools/_distutils/tests/test_log.py +12 -0
  104. venv/Lib/site-packages/setuptools/_distutils/tests/test_modified.py +126 -0
  105. venv/Lib/site-packages/setuptools/_distutils/tests/test_sdist.py +470 -0
  106. venv/Lib/site-packages/setuptools/_distutils/tests/test_spawn.py +141 -0
  107. venv/Lib/site-packages/setuptools/_distutils/tests/test_sysconfig.py +319 -0
  108. venv/Lib/site-packages/setuptools/_distutils/tests/test_text_file.py +127 -0
  109. venv/Lib/site-packages/setuptools/_distutils/tests/test_util.py +243 -0
  110. venv/Lib/site-packages/setuptools/_distutils/tests/test_version.py +80 -0
  111. venv/Lib/site-packages/setuptools/_distutils/tests/test_versionpredicate.py +0 -0
  112. venv/Lib/site-packages/setuptools/_distutils/tests/unix_compat.py +17 -0
  113. venv/Lib/site-packages/setuptools/_distutils/text_file.py +286 -0
  114. venv/Lib/site-packages/setuptools/_distutils/unixccompiler.py +9 -0
  115. venv/Lib/site-packages/setuptools/_distutils/util.py +518 -0
  116. venv/Lib/site-packages/setuptools/_distutils/version.py +348 -0
  117. venv/Lib/site-packages/setuptools/_distutils/versionpredicate.py +175 -0
  118. venv/Lib/site-packages/setuptools/_distutils/zosccompiler.py +3 -0
  119. venv/Lib/site-packages/setuptools/_entry_points.py +94 -0
  120. venv/Lib/site-packages/setuptools/_imp.py +87 -0
  121. venv/Lib/site-packages/setuptools/_importlib.py +9 -0
  122. venv/Lib/site-packages/setuptools/_itertools.py +23 -0
  123. venv/Lib/site-packages/setuptools/_normalization.py +177 -0
  124. venv/Lib/site-packages/setuptools/_path.py +93 -0
  125. venv/Lib/site-packages/setuptools/_reqs.py +42 -0
  126. venv/Lib/site-packages/setuptools/_scripts.py +361 -0
  127. venv/Lib/site-packages/setuptools/_shutil.py +59 -0
  128. venv/Lib/site-packages/setuptools/_static.py +188 -0
  129. venv/Lib/site-packages/setuptools/_vendor/autocommand/__init__.py +27 -0
  130. venv/Lib/site-packages/setuptools/_vendor/autocommand/autoasync.py +142 -0
  131. venv/Lib/site-packages/setuptools/_vendor/autocommand/autocommand.py +70 -0
  132. venv/Lib/site-packages/setuptools/_vendor/autocommand/automain.py +59 -0
  133. venv/Lib/site-packages/setuptools/_vendor/autocommand/autoparse.py +333 -0
  134. venv/Lib/site-packages/setuptools/_vendor/autocommand/errors.py +23 -0
  135. venv/Lib/site-packages/setuptools/_vendor/backports/__init__.py +1 -0
  136. venv/Lib/site-packages/setuptools/_vendor/backports/tarfile/__init__.py +2937 -0
  137. venv/Lib/site-packages/setuptools/_vendor/backports/tarfile/__main__.py +5 -0
  138. venv/Lib/site-packages/setuptools/_vendor/backports/tarfile/compat/__init__.py +0 -0
  139. venv/Lib/site-packages/setuptools/_vendor/backports/tarfile/compat/py38.py +24 -0
  140. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__init__.py +1083 -0
  141. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_adapters.py +83 -0
  142. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_collections.py +30 -0
  143. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_compat.py +57 -0
  144. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_functools.py +104 -0
  145. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_itertools.py +73 -0
  146. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_meta.py +67 -0
  147. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_text.py +99 -0
  148. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/compat/__init__.py +0 -0
  149. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/compat/py311.py +22 -0
  150. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/compat/py39.py +36 -0
  151. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/diagnose.py +21 -0
  152. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/py.typed +0 -0
  153. venv/Lib/site-packages/setuptools/_vendor/inflect/__init__.py +3986 -0
  154. venv/Lib/site-packages/setuptools/_vendor/inflect/compat/__init__.py +0 -0
  155. venv/Lib/site-packages/setuptools/_vendor/inflect/compat/py38.py +7 -0
  156. venv/Lib/site-packages/setuptools/_vendor/inflect/py.typed +0 -0
  157. venv/Lib/site-packages/setuptools/_vendor/jaraco/collections/__init__.py +1091 -0
  158. venv/Lib/site-packages/setuptools/_vendor/jaraco/collections/py.typed +0 -0
  159. venv/Lib/site-packages/setuptools/_vendor/jaraco/context.py +361 -0
  160. venv/Lib/site-packages/setuptools/_vendor/jaraco/functools/__init__.py +633 -0
  161. venv/Lib/site-packages/setuptools/_vendor/jaraco/functools/__init__.pyi +125 -0
  162. venv/Lib/site-packages/setuptools/_vendor/jaraco/functools/py.typed +0 -0
  163. venv/Lib/site-packages/setuptools/_vendor/jaraco/text/__init__.py +624 -0
  164. venv/Lib/site-packages/setuptools/_vendor/jaraco/text/layouts.py +25 -0
  165. venv/Lib/site-packages/setuptools/_vendor/jaraco/text/show-newlines.py +33 -0
  166. venv/Lib/site-packages/setuptools/_vendor/jaraco/text/strip-prefix.py +21 -0
  167. venv/Lib/site-packages/setuptools/_vendor/jaraco/text/to-dvorak.py +6 -0
  168. venv/Lib/site-packages/setuptools/_vendor/jaraco/text/to-qwerty.py +6 -0
  169. venv/Lib/site-packages/setuptools/_vendor/more_itertools/__init__.py +6 -0
  170. venv/Lib/site-packages/setuptools/_vendor/more_itertools/__init__.pyi +2 -0
  171. venv/Lib/site-packages/setuptools/_vendor/more_itertools/more.py +4806 -0
  172. venv/Lib/site-packages/setuptools/_vendor/more_itertools/more.pyi +709 -0
  173. venv/Lib/site-packages/setuptools/_vendor/more_itertools/py.typed +0 -0
  174. venv/Lib/site-packages/setuptools/_vendor/more_itertools/recipes.py +1046 -0
  175. venv/Lib/site-packages/setuptools/_vendor/more_itertools/recipes.pyi +136 -0
  176. venv/Lib/site-packages/setuptools/_vendor/packaging/__init__.py +15 -0
  177. venv/Lib/site-packages/setuptools/_vendor/packaging/_elffile.py +110 -0
  178. venv/Lib/site-packages/setuptools/_vendor/packaging/_manylinux.py +263 -0
  179. venv/Lib/site-packages/setuptools/_vendor/packaging/_musllinux.py +85 -0
  180. venv/Lib/site-packages/setuptools/_vendor/packaging/_parser.py +354 -0
  181. venv/Lib/site-packages/setuptools/_vendor/packaging/_structures.py +61 -0
  182. venv/Lib/site-packages/setuptools/_vendor/packaging/_tokenizer.py +194 -0
  183. venv/Lib/site-packages/setuptools/_vendor/packaging/licenses/__init__.py +145 -0
  184. venv/Lib/site-packages/setuptools/_vendor/packaging/licenses/_spdx.py +759 -0
  185. venv/Lib/site-packages/setuptools/_vendor/packaging/markers.py +331 -0
  186. venv/Lib/site-packages/setuptools/_vendor/packaging/metadata.py +863 -0
  187. venv/Lib/site-packages/setuptools/_vendor/packaging/py.typed +0 -0
  188. venv/Lib/site-packages/setuptools/_vendor/packaging/requirements.py +91 -0
  189. venv/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py +1020 -0
  190. venv/Lib/site-packages/setuptools/_vendor/packaging/tags.py +617 -0
  191. venv/Lib/site-packages/setuptools/_vendor/packaging/utils.py +163 -0
  192. venv/Lib/site-packages/setuptools/_vendor/packaging/version.py +582 -0
  193. venv/Lib/site-packages/setuptools/_vendor/platformdirs/__init__.py +627 -0
  194. venv/Lib/site-packages/setuptools/_vendor/platformdirs/__main__.py +55 -0
  195. venv/Lib/site-packages/setuptools/_vendor/platformdirs/android.py +249 -0
  196. venv/Lib/site-packages/setuptools/_vendor/platformdirs/api.py +292 -0
  197. venv/Lib/site-packages/setuptools/_vendor/platformdirs/macos.py +130 -0
  198. venv/Lib/site-packages/setuptools/_vendor/platformdirs/py.typed +0 -0
  199. venv/Lib/site-packages/setuptools/_vendor/platformdirs/unix.py +275 -0
  200. venv/Lib/site-packages/setuptools/_vendor/platformdirs/version.py +16 -0
  201. venv/Lib/site-packages/setuptools/_vendor/platformdirs/windows.py +272 -0
  202. venv/Lib/site-packages/setuptools/_vendor/tomli/__init__.py +11 -0
  203. venv/Lib/site-packages/setuptools/_vendor/tomli/_parser.py +691 -0
  204. venv/Lib/site-packages/setuptools/_vendor/tomli/_re.py +107 -0
  205. venv/Lib/site-packages/setuptools/_vendor/tomli/_types.py +10 -0
  206. venv/Lib/site-packages/setuptools/_vendor/tomli/py.typed +1 -0
  207. venv/Lib/site-packages/setuptools/_vendor/typeguard/__init__.py +48 -0
  208. venv/Lib/site-packages/setuptools/_vendor/typeguard/_checkers.py +993 -0
  209. venv/Lib/site-packages/setuptools/_vendor/typeguard/_config.py +108 -0
  210. venv/Lib/site-packages/setuptools/_vendor/typeguard/_decorators.py +235 -0
  211. venv/Lib/site-packages/setuptools/_vendor/typeguard/_exceptions.py +42 -0
  212. venv/Lib/site-packages/setuptools/_vendor/typeguard/_functions.py +308 -0
  213. venv/Lib/site-packages/setuptools/_vendor/typeguard/_importhook.py +213 -0
  214. venv/Lib/site-packages/setuptools/_vendor/typeguard/_memo.py +48 -0
  215. venv/Lib/site-packages/setuptools/_vendor/typeguard/_pytest_plugin.py +127 -0
  216. venv/Lib/site-packages/setuptools/_vendor/typeguard/_suppression.py +86 -0
  217. venv/Lib/site-packages/setuptools/_vendor/typeguard/_transformer.py +1229 -0
  218. venv/Lib/site-packages/setuptools/_vendor/typeguard/_union_transformer.py +55 -0
  219. venv/Lib/site-packages/setuptools/_vendor/typeguard/_utils.py +173 -0
  220. venv/Lib/site-packages/setuptools/_vendor/typeguard/py.typed +0 -0
  221. venv/Lib/site-packages/setuptools/_vendor/typing_extensions.py +3641 -0
  222. venv/Lib/site-packages/setuptools/_vendor/wheel/__init__.py +3 -0
  223. venv/Lib/site-packages/setuptools/_vendor/wheel/__main__.py +23 -0
  224. venv/Lib/site-packages/setuptools/_vendor/wheel/_bdist_wheel.py +613 -0
  225. venv/Lib/site-packages/setuptools/_vendor/wheel/_setuptools_logging.py +26 -0
  226. venv/Lib/site-packages/setuptools/_vendor/wheel/bdist_wheel.py +26 -0
  227. venv/Lib/site-packages/setuptools/_vendor/wheel/cli/__init__.py +155 -0
  228. venv/Lib/site-packages/setuptools/_vendor/wheel/cli/convert.py +332 -0
  229. venv/Lib/site-packages/setuptools/_vendor/wheel/cli/pack.py +85 -0
  230. venv/Lib/site-packages/setuptools/_vendor/wheel/cli/tags.py +139 -0
  231. venv/Lib/site-packages/setuptools/_vendor/wheel/cli/unpack.py +30 -0
  232. venv/Lib/site-packages/setuptools/_vendor/wheel/macosx_libfile.py +482 -0
  233. venv/Lib/site-packages/setuptools/_vendor/wheel/metadata.py +183 -0
  234. venv/Lib/site-packages/setuptools/_vendor/wheel/util.py +17 -0
  235. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/__init__.py +0 -0
  236. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/__init__.py +0 -0
  237. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_elffile.py +108 -0
  238. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_manylinux.py +260 -0
  239. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_musllinux.py +83 -0
  240. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_parser.py +356 -0
  241. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_structures.py +61 -0
  242. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_tokenizer.py +192 -0
  243. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/markers.py +253 -0
  244. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/requirements.py +90 -0
  245. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/specifiers.py +1011 -0
  246. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/tags.py +571 -0
  247. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/utils.py +172 -0
  248. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/version.py +561 -0
  249. venv/Lib/site-packages/setuptools/_vendor/wheel/wheelfile.py +227 -0
  250. venv/Lib/site-packages/setuptools/_vendor/zipp/__init__.py +501 -0
  251. venv/Lib/site-packages/setuptools/_vendor/zipp/compat/__init__.py +0 -0
  252. venv/Lib/site-packages/setuptools/_vendor/zipp/compat/py310.py +11 -0
  253. venv/Lib/site-packages/setuptools/_vendor/zipp/glob.py +106 -0
  254. venv/Lib/site-packages/setuptools/archive_util.py +219 -0
  255. venv/Lib/site-packages/setuptools/build_meta.py +548 -0
  256. venv/Lib/site-packages/setuptools/command/__init__.py +21 -0
  257. venv/Lib/site-packages/setuptools/command/_requirestxt.py +131 -0
  258. venv/Lib/site-packages/setuptools/command/alias.py +77 -0
  259. venv/Lib/site-packages/setuptools/command/bdist_egg.py +477 -0
  260. venv/Lib/site-packages/setuptools/command/bdist_rpm.py +42 -0
  261. venv/Lib/site-packages/setuptools/command/bdist_wheel.py +604 -0
  262. venv/Lib/site-packages/setuptools/command/build.py +135 -0
  263. venv/Lib/site-packages/setuptools/command/build_clib.py +103 -0
  264. venv/Lib/site-packages/setuptools/command/build_ext.py +470 -0
  265. venv/Lib/site-packages/setuptools/command/build_py.py +400 -0
  266. venv/Lib/site-packages/setuptools/command/develop.py +55 -0
  267. venv/Lib/site-packages/setuptools/command/dist_info.py +103 -0
  268. venv/Lib/site-packages/setuptools/command/easy_install.py +30 -0
  269. venv/Lib/site-packages/setuptools/command/editable_wheel.py +908 -0
  270. venv/Lib/site-packages/setuptools/command/egg_info.py +718 -0
  271. venv/Lib/site-packages/setuptools/command/install.py +131 -0
  272. venv/Lib/site-packages/setuptools/command/install_egg_info.py +58 -0
  273. venv/Lib/site-packages/setuptools/command/install_lib.py +137 -0
  274. venv/Lib/site-packages/setuptools/command/install_scripts.py +67 -0
  275. venv/Lib/site-packages/setuptools/command/rotate.py +65 -0
  276. venv/Lib/site-packages/setuptools/command/saveopts.py +21 -0
  277. venv/Lib/site-packages/setuptools/command/sdist.py +217 -0
  278. venv/Lib/site-packages/setuptools/command/setopt.py +141 -0
  279. venv/Lib/site-packages/setuptools/command/test.py +45 -0
  280. venv/Lib/site-packages/setuptools/compat/__init__.py +0 -0
  281. venv/Lib/site-packages/setuptools/compat/py310.py +20 -0
  282. venv/Lib/site-packages/setuptools/compat/py311.py +27 -0
  283. venv/Lib/site-packages/setuptools/compat/py312.py +13 -0
  284. venv/Lib/site-packages/setuptools/compat/py39.py +9 -0
  285. venv/Lib/site-packages/setuptools/config/__init__.py +43 -0
  286. venv/Lib/site-packages/setuptools/config/_apply_pyprojecttoml.py +526 -0
  287. venv/Lib/site-packages/setuptools/config/_validate_pyproject/__init__.py +34 -0
  288. venv/Lib/site-packages/setuptools/config/_validate_pyproject/error_reporting.py +336 -0
  289. venv/Lib/site-packages/setuptools/config/_validate_pyproject/extra_validations.py +82 -0
  290. venv/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py +51 -0
  291. venv/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py +1412 -0
  292. venv/Lib/site-packages/setuptools/config/_validate_pyproject/formats.py +402 -0
  293. venv/Lib/site-packages/setuptools/config/expand.py +452 -0
  294. venv/Lib/site-packages/setuptools/config/pyprojecttoml.py +468 -0
  295. venv/Lib/site-packages/setuptools/config/setupcfg.py +780 -0
  296. venv/Lib/site-packages/setuptools/depends.py +185 -0
  297. venv/Lib/site-packages/setuptools/discovery.py +614 -0
  298. venv/Lib/site-packages/setuptools/dist.py +1119 -0
  299. venv/Lib/site-packages/setuptools/errors.py +67 -0
  300. venv/Lib/site-packages/setuptools/extension.py +177 -0
  301. venv/Lib/site-packages/setuptools/glob.py +185 -0
  302. venv/Lib/site-packages/setuptools/installer.py +155 -0
  303. venv/Lib/site-packages/setuptools/launch.py +36 -0
  304. venv/Lib/site-packages/setuptools/logging.py +40 -0
  305. venv/Lib/site-packages/setuptools/modified.py +18 -0
  306. venv/Lib/site-packages/setuptools/monkey.py +126 -0
  307. venv/Lib/site-packages/setuptools/msvc.py +1536 -0
  308. venv/Lib/site-packages/setuptools/namespaces.py +106 -0
  309. venv/Lib/site-packages/setuptools/tests/__init__.py +13 -0
  310. venv/Lib/site-packages/setuptools/tests/compat/__init__.py +0 -0
  311. venv/Lib/site-packages/setuptools/tests/compat/py39.py +3 -0
  312. venv/Lib/site-packages/setuptools/tests/config/__init__.py +0 -0
  313. venv/Lib/site-packages/setuptools/tests/config/downloads/__init__.py +59 -0
  314. venv/Lib/site-packages/setuptools/tests/config/downloads/preload.py +18 -0
  315. venv/Lib/site-packages/setuptools/tests/config/test_apply_pyprojecttoml.py +772 -0
  316. venv/Lib/site-packages/setuptools/tests/config/test_expand.py +247 -0
  317. venv/Lib/site-packages/setuptools/tests/config/test_pyprojecttoml.py +396 -0
  318. venv/Lib/site-packages/setuptools/tests/config/test_pyprojecttoml_dynamic_deps.py +109 -0
  319. venv/Lib/site-packages/setuptools/tests/config/test_setupcfg.py +980 -0
  320. venv/Lib/site-packages/setuptools/tests/contexts.py +131 -0
  321. venv/Lib/site-packages/setuptools/tests/environment.py +95 -0
  322. venv/Lib/site-packages/setuptools/tests/fixtures.py +392 -0
  323. venv/Lib/site-packages/setuptools/tests/integration/__init__.py +0 -0
  324. venv/Lib/site-packages/setuptools/tests/integration/helpers.py +77 -0
  325. venv/Lib/site-packages/setuptools/tests/integration/test_pbr.py +20 -0
  326. venv/Lib/site-packages/setuptools/tests/integration/test_pip_install_sdist.py +223 -0
  327. venv/Lib/site-packages/setuptools/tests/mod_with_constant.py +1 -0
  328. venv/Lib/site-packages/setuptools/tests/namespaces.py +90 -0
  329. venv/Lib/site-packages/setuptools/tests/script-with-bom.py +1 -0
  330. venv/Lib/site-packages/setuptools/tests/test_archive_util.py +36 -0
  331. venv/Lib/site-packages/setuptools/tests/test_bdist_deprecations.py +28 -0
  332. venv/Lib/site-packages/setuptools/tests/test_bdist_egg.py +73 -0
  333. venv/Lib/site-packages/setuptools/tests/test_bdist_wheel.py +708 -0
  334. venv/Lib/site-packages/setuptools/tests/test_build.py +33 -0
  335. venv/Lib/site-packages/setuptools/tests/test_build_clib.py +84 -0
  336. venv/Lib/site-packages/setuptools/tests/test_build_ext.py +293 -0
  337. venv/Lib/site-packages/setuptools/tests/test_build_meta.py +959 -0
  338. venv/Lib/site-packages/setuptools/tests/test_build_py.py +480 -0
  339. venv/Lib/site-packages/setuptools/tests/test_config_discovery.py +647 -0
  340. venv/Lib/site-packages/setuptools/tests/test_core_metadata.py +622 -0
  341. venv/Lib/site-packages/setuptools/tests/test_depends.py +15 -0
  342. venv/Lib/site-packages/setuptools/tests/test_develop.py +112 -0
  343. venv/Lib/site-packages/setuptools/tests/test_dist.py +278 -0
  344. venv/Lib/site-packages/setuptools/tests/test_dist_info.py +147 -0
  345. venv/Lib/site-packages/setuptools/tests/test_distutils_adoption.py +198 -0
  346. venv/Lib/site-packages/setuptools/tests/test_editable_install.py +1263 -0
  347. venv/Lib/site-packages/setuptools/tests/test_egg_info.py +1306 -0
  348. venv/Lib/site-packages/setuptools/tests/test_extern.py +15 -0
  349. venv/Lib/site-packages/setuptools/tests/test_find_packages.py +218 -0
  350. venv/Lib/site-packages/setuptools/tests/test_find_py_modules.py +73 -0
  351. venv/Lib/site-packages/setuptools/tests/test_glob.py +45 -0
  352. venv/Lib/site-packages/setuptools/tests/test_install_scripts.py +89 -0
  353. venv/Lib/site-packages/setuptools/tests/test_logging.py +76 -0
  354. venv/Lib/site-packages/setuptools/tests/test_manifest.py +622 -0
  355. venv/Lib/site-packages/setuptools/tests/test_namespaces.py +138 -0
  356. venv/Lib/site-packages/setuptools/tests/test_scripts.py +12 -0
  357. venv/Lib/site-packages/setuptools/tests/test_sdist.py +984 -0
  358. venv/Lib/site-packages/setuptools/tests/test_setopt.py +40 -0
  359. venv/Lib/site-packages/setuptools/tests/test_setuptools.py +290 -0
  360. venv/Lib/site-packages/setuptools/tests/test_shutil_wrapper.py +23 -0
  361. venv/Lib/site-packages/setuptools/tests/test_unicode_utils.py +10 -0
  362. venv/Lib/site-packages/setuptools/tests/test_virtualenv.py +113 -0
  363. venv/Lib/site-packages/setuptools/tests/test_warnings.py +106 -0
  364. venv/Lib/site-packages/setuptools/tests/test_wheel.py +690 -0
  365. venv/Lib/site-packages/setuptools/tests/test_windows_wrappers.py +258 -0
  366. venv/Lib/site-packages/setuptools/tests/text.py +4 -0
  367. venv/Lib/site-packages/setuptools/tests/textwrap.py +6 -0
  368. venv/Lib/site-packages/setuptools/unicode_utils.py +102 -0
  369. venv/Lib/site-packages/setuptools/version.py +6 -0
  370. venv/Lib/site-packages/setuptools/warnings.py +110 -0
  371. venv/Lib/site-packages/setuptools/wheel.py +261 -0
  372. venv/Lib/site-packages/setuptools/windows_support.py +30 -0
  373. {android_notify-1.60.0.dist-info → android_notify-1.60.2.dist-info}/WHEEL +0 -0
  374. {android_notify-1.60.0.dist-info → android_notify-1.60.2.dist-info}/entry_points.txt +0 -0
  375. {android_notify-1.60.0.dist-info → android_notify-1.60.2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,1091 @@
1
+ from __future__ import annotations
2
+
3
+ import collections.abc
4
+ import copy
5
+ import functools
6
+ import itertools
7
+ import operator
8
+ import random
9
+ import re
10
+ from collections.abc import Container, Iterable, Mapping
11
+ from typing import TYPE_CHECKING, Any, Callable, Dict, TypeVar, Union, overload
12
+
13
+ import jaraco.text
14
+
15
+ if TYPE_CHECKING:
16
+ from _operator import _SupportsComparison
17
+
18
+ from _typeshed import SupportsKeysAndGetItem
19
+ from typing_extensions import Self
20
+
21
+ _RangeMapKT = TypeVar('_RangeMapKT', bound=_SupportsComparison)
22
+ else:
23
+ # _SupportsComparison doesn't exist at runtime,
24
+ # but _RangeMapKT is used in RangeMap's superclass' type parameters
25
+ _RangeMapKT = TypeVar('_RangeMapKT')
26
+
27
+ _T = TypeVar('_T')
28
+ _VT = TypeVar('_VT')
29
+
30
+ _Matchable = Union[Callable, Container, Iterable, re.Pattern]
31
+
32
+
33
+ def _dispatch(obj: _Matchable) -> Callable:
34
+ # can't rely on singledispatch for Union[Container, Iterable]
35
+ # due to ambiguity
36
+ # (https://peps.python.org/pep-0443/#abstract-base-classes).
37
+ if isinstance(obj, re.Pattern):
38
+ return obj.fullmatch
39
+ # mypy issue: https://github.com/python/mypy/issues/11071
40
+ if not isinstance(obj, Callable): # type: ignore[arg-type]
41
+ if not isinstance(obj, Container):
42
+ obj = set(obj) # type: ignore[arg-type]
43
+ obj = obj.__contains__
44
+ return obj # type: ignore[return-value]
45
+
46
+
47
+ class Projection(collections.abc.Mapping):
48
+ """
49
+ Project a set of keys over a mapping
50
+
51
+ >>> sample = {'a': 1, 'b': 2, 'c': 3}
52
+ >>> prj = Projection(['a', 'c', 'd'], sample)
53
+ >>> dict(prj)
54
+ {'a': 1, 'c': 3}
55
+
56
+ Projection also accepts an iterable or callable or pattern.
57
+
58
+ >>> iter_prj = Projection(iter('acd'), sample)
59
+ >>> call_prj = Projection(lambda k: ord(k) in (97, 99, 100), sample)
60
+ >>> pat_prj = Projection(re.compile(r'[acd]'), sample)
61
+ >>> prj == iter_prj == call_prj == pat_prj
62
+ True
63
+
64
+ Keys should only appear if they were specified and exist in the space.
65
+ Order is retained.
66
+
67
+ >>> list(prj)
68
+ ['a', 'c']
69
+
70
+ Attempting to access a key not in the projection
71
+ results in a KeyError.
72
+
73
+ >>> prj['b']
74
+ Traceback (most recent call last):
75
+ ...
76
+ KeyError: 'b'
77
+
78
+ Use the projection to update another dict.
79
+
80
+ >>> target = {'a': 2, 'b': 2}
81
+ >>> target.update(prj)
82
+ >>> target
83
+ {'a': 1, 'b': 2, 'c': 3}
84
+
85
+ Projection keeps a reference to the original dict, so
86
+ modifying the original dict may modify the Projection.
87
+
88
+ >>> del sample['a']
89
+ >>> dict(prj)
90
+ {'c': 3}
91
+ """
92
+
93
+ def __init__(self, keys: _Matchable, space: Mapping):
94
+ self._match = _dispatch(keys)
95
+ self._space = space
96
+
97
+ def __getitem__(self, key):
98
+ if not self._match(key):
99
+ raise KeyError(key)
100
+ return self._space[key]
101
+
102
+ def _keys_resolved(self):
103
+ return filter(self._match, self._space)
104
+
105
+ def __iter__(self):
106
+ return self._keys_resolved()
107
+
108
+ def __len__(self):
109
+ return len(tuple(self._keys_resolved()))
110
+
111
+
112
+ class Mask(Projection):
113
+ """
114
+ The inverse of a :class:`Projection`, masking out keys.
115
+
116
+ >>> sample = {'a': 1, 'b': 2, 'c': 3}
117
+ >>> msk = Mask(['a', 'c', 'd'], sample)
118
+ >>> dict(msk)
119
+ {'b': 2}
120
+ """
121
+
122
+ def __init__(self, *args, **kwargs):
123
+ super().__init__(*args, **kwargs)
124
+ # self._match = compose(operator.not_, self._match)
125
+ self._match = lambda key, orig=self._match: not orig(key)
126
+
127
+
128
+ def dict_map(function, dictionary):
129
+ """
130
+ Return a new dict with function applied to values of dictionary.
131
+
132
+ >>> dict_map(lambda x: x+1, dict(a=1, b=2))
133
+ {'a': 2, 'b': 3}
134
+ """
135
+ return dict((key, function(value)) for key, value in dictionary.items())
136
+
137
+
138
+ class RangeMap(Dict[_RangeMapKT, _VT]):
139
+ """
140
+ A dictionary-like object that uses the keys as bounds for a range.
141
+ Inclusion of the value for that range is determined by the
142
+ key_match_comparator, which defaults to less-than-or-equal.
143
+ A value is returned for a key if it is the first key that matches in
144
+ the sorted list of keys.
145
+
146
+ One may supply keyword parameters to be passed to the sort function used
147
+ to sort keys (i.e. key, reverse) as sort_params.
148
+
149
+ Create a map that maps 1-3 -> 'a', 4-6 -> 'b'
150
+
151
+ >>> r = RangeMap({3: 'a', 6: 'b'}) # boy, that was easy
152
+ >>> r[1], r[2], r[3], r[4], r[5], r[6]
153
+ ('a', 'a', 'a', 'b', 'b', 'b')
154
+
155
+ Even float values should work so long as the comparison operator
156
+ supports it.
157
+
158
+ >>> r[4.5]
159
+ 'b'
160
+
161
+ Notice that the way rangemap is defined, it must be open-ended
162
+ on one side.
163
+
164
+ >>> r[0]
165
+ 'a'
166
+ >>> r[-1]
167
+ 'a'
168
+
169
+ One can close the open-end of the RangeMap by using undefined_value
170
+
171
+ >>> r = RangeMap({0: RangeMap.undefined_value, 3: 'a', 6: 'b'})
172
+ >>> r[0]
173
+ Traceback (most recent call last):
174
+ ...
175
+ KeyError: 0
176
+
177
+ One can get the first or last elements in the range by using RangeMap.Item
178
+
179
+ >>> last_item = RangeMap.Item(-1)
180
+ >>> r[last_item]
181
+ 'b'
182
+
183
+ .last_item is a shortcut for Item(-1)
184
+
185
+ >>> r[RangeMap.last_item]
186
+ 'b'
187
+
188
+ Sometimes it's useful to find the bounds for a RangeMap
189
+
190
+ >>> r.bounds()
191
+ (0, 6)
192
+
193
+ RangeMap supports .get(key, default)
194
+
195
+ >>> r.get(0, 'not found')
196
+ 'not found'
197
+
198
+ >>> r.get(7, 'not found')
199
+ 'not found'
200
+
201
+ One often wishes to define the ranges by their left-most values,
202
+ which requires use of sort params and a key_match_comparator.
203
+
204
+ >>> r = RangeMap({1: 'a', 4: 'b'},
205
+ ... sort_params=dict(reverse=True),
206
+ ... key_match_comparator=operator.ge)
207
+ >>> r[1], r[2], r[3], r[4], r[5], r[6]
208
+ ('a', 'a', 'a', 'b', 'b', 'b')
209
+
210
+ That wasn't nearly as easy as before, so an alternate constructor
211
+ is provided:
212
+
213
+ >>> r = RangeMap.left({1: 'a', 4: 'b', 7: RangeMap.undefined_value})
214
+ >>> r[1], r[2], r[3], r[4], r[5], r[6]
215
+ ('a', 'a', 'a', 'b', 'b', 'b')
216
+
217
+ """
218
+
219
+ def __init__(
220
+ self,
221
+ source: (
222
+ SupportsKeysAndGetItem[_RangeMapKT, _VT] | Iterable[tuple[_RangeMapKT, _VT]]
223
+ ),
224
+ sort_params: Mapping[str, Any] = {},
225
+ key_match_comparator: Callable[[_RangeMapKT, _RangeMapKT], bool] = operator.le,
226
+ ):
227
+ dict.__init__(self, source)
228
+ self.sort_params = sort_params
229
+ self.match = key_match_comparator
230
+
231
+ @classmethod
232
+ def left(
233
+ cls,
234
+ source: (
235
+ SupportsKeysAndGetItem[_RangeMapKT, _VT] | Iterable[tuple[_RangeMapKT, _VT]]
236
+ ),
237
+ ) -> Self:
238
+ return cls(
239
+ source, sort_params=dict(reverse=True), key_match_comparator=operator.ge
240
+ )
241
+
242
+ def __getitem__(self, item: _RangeMapKT) -> _VT:
243
+ sorted_keys = sorted(self.keys(), **self.sort_params)
244
+ if isinstance(item, RangeMap.Item):
245
+ result = self.__getitem__(sorted_keys[item])
246
+ else:
247
+ key = self._find_first_match_(sorted_keys, item)
248
+ result = dict.__getitem__(self, key)
249
+ if result is RangeMap.undefined_value:
250
+ raise KeyError(key)
251
+ return result
252
+
253
+ @overload # type: ignore[override] # Signature simplified over dict and Mapping
254
+ def get(self, key: _RangeMapKT, default: _T) -> _VT | _T: ...
255
+ @overload
256
+ def get(self, key: _RangeMapKT, default: None = None) -> _VT | None: ...
257
+ def get(self, key: _RangeMapKT, default: _T | None = None) -> _VT | _T | None:
258
+ """
259
+ Return the value for key if key is in the dictionary, else default.
260
+ If default is not given, it defaults to None, so that this method
261
+ never raises a KeyError.
262
+ """
263
+ try:
264
+ return self[key]
265
+ except KeyError:
266
+ return default
267
+
268
+ def _find_first_match_(
269
+ self, keys: Iterable[_RangeMapKT], item: _RangeMapKT
270
+ ) -> _RangeMapKT:
271
+ is_match = functools.partial(self.match, item)
272
+ matches = filter(is_match, keys)
273
+ try:
274
+ return next(matches)
275
+ except StopIteration:
276
+ raise KeyError(item) from None
277
+
278
+ def bounds(self) -> tuple[_RangeMapKT, _RangeMapKT]:
279
+ sorted_keys = sorted(self.keys(), **self.sort_params)
280
+ return (sorted_keys[RangeMap.first_item], sorted_keys[RangeMap.last_item])
281
+
282
+ # some special values for the RangeMap
283
+ undefined_value = type('RangeValueUndefined', (), {})()
284
+
285
+ class Item(int):
286
+ """RangeMap Item"""
287
+
288
+ first_item = Item(0)
289
+ last_item = Item(-1)
290
+
291
+
292
+ def __identity(x):
293
+ return x
294
+
295
+
296
+ def sorted_items(d, key=__identity, reverse=False):
297
+ """
298
+ Return the items of the dictionary sorted by the keys.
299
+
300
+ >>> sample = dict(foo=20, bar=42, baz=10)
301
+ >>> tuple(sorted_items(sample))
302
+ (('bar', 42), ('baz', 10), ('foo', 20))
303
+
304
+ >>> reverse_string = lambda s: ''.join(reversed(s))
305
+ >>> tuple(sorted_items(sample, key=reverse_string))
306
+ (('foo', 20), ('bar', 42), ('baz', 10))
307
+
308
+ >>> tuple(sorted_items(sample, reverse=True))
309
+ (('foo', 20), ('baz', 10), ('bar', 42))
310
+ """
311
+
312
+ # wrap the key func so it operates on the first element of each item
313
+ def pairkey_key(item):
314
+ return key(item[0])
315
+
316
+ return sorted(d.items(), key=pairkey_key, reverse=reverse)
317
+
318
+
319
+ class KeyTransformingDict(dict):
320
+ """
321
+ A dict subclass that transforms the keys before they're used.
322
+ Subclasses may override the default transform_key to customize behavior.
323
+ """
324
+
325
+ @staticmethod
326
+ def transform_key(key): # pragma: nocover
327
+ return key
328
+
329
+ def __init__(self, *args, **kargs):
330
+ super().__init__()
331
+ # build a dictionary using the default constructs
332
+ d = dict(*args, **kargs)
333
+ # build this dictionary using transformed keys.
334
+ for item in d.items():
335
+ self.__setitem__(*item)
336
+
337
+ def __setitem__(self, key, val):
338
+ key = self.transform_key(key)
339
+ super().__setitem__(key, val)
340
+
341
+ def __getitem__(self, key):
342
+ key = self.transform_key(key)
343
+ return super().__getitem__(key)
344
+
345
+ def __contains__(self, key):
346
+ key = self.transform_key(key)
347
+ return super().__contains__(key)
348
+
349
+ def __delitem__(self, key):
350
+ key = self.transform_key(key)
351
+ return super().__delitem__(key)
352
+
353
+ def get(self, key, *args, **kwargs):
354
+ key = self.transform_key(key)
355
+ return super().get(key, *args, **kwargs)
356
+
357
+ def setdefault(self, key, *args, **kwargs):
358
+ key = self.transform_key(key)
359
+ return super().setdefault(key, *args, **kwargs)
360
+
361
+ def pop(self, key, *args, **kwargs):
362
+ key = self.transform_key(key)
363
+ return super().pop(key, *args, **kwargs)
364
+
365
+ def matching_key_for(self, key):
366
+ """
367
+ Given a key, return the actual key stored in self that matches.
368
+ Raise KeyError if the key isn't found.
369
+ """
370
+ try:
371
+ return next(e_key for e_key in self.keys() if e_key == key)
372
+ except StopIteration as err:
373
+ raise KeyError(key) from err
374
+
375
+
376
+ class FoldedCaseKeyedDict(KeyTransformingDict):
377
+ """
378
+ A case-insensitive dictionary (keys are compared as insensitive
379
+ if they are strings).
380
+
381
+ >>> d = FoldedCaseKeyedDict()
382
+ >>> d['heLlo'] = 'world'
383
+ >>> list(d.keys()) == ['heLlo']
384
+ True
385
+ >>> list(d.values()) == ['world']
386
+ True
387
+ >>> d['hello'] == 'world'
388
+ True
389
+ >>> 'hello' in d
390
+ True
391
+ >>> 'HELLO' in d
392
+ True
393
+ >>> print(repr(FoldedCaseKeyedDict({'heLlo': 'world'})))
394
+ {'heLlo': 'world'}
395
+ >>> d = FoldedCaseKeyedDict({'heLlo': 'world'})
396
+ >>> print(d['hello'])
397
+ world
398
+ >>> print(d['Hello'])
399
+ world
400
+ >>> list(d.keys())
401
+ ['heLlo']
402
+ >>> d = FoldedCaseKeyedDict({'heLlo': 'world', 'Hello': 'world'})
403
+ >>> list(d.values())
404
+ ['world']
405
+ >>> key, = d.keys()
406
+ >>> key in ['heLlo', 'Hello']
407
+ True
408
+ >>> del d['HELLO']
409
+ >>> d
410
+ {}
411
+
412
+ get should work
413
+
414
+ >>> d['Sumthin'] = 'else'
415
+ >>> d.get('SUMTHIN')
416
+ 'else'
417
+ >>> d.get('OTHER', 'thing')
418
+ 'thing'
419
+ >>> del d['sumthin']
420
+
421
+ setdefault should also work
422
+
423
+ >>> d['This'] = 'that'
424
+ >>> print(d.setdefault('this', 'other'))
425
+ that
426
+ >>> len(d)
427
+ 1
428
+ >>> print(d['this'])
429
+ that
430
+ >>> print(d.setdefault('That', 'other'))
431
+ other
432
+ >>> print(d['THAT'])
433
+ other
434
+
435
+ Make it pop!
436
+
437
+ >>> print(d.pop('THAT'))
438
+ other
439
+
440
+ To retrieve the key in its originally-supplied form, use matching_key_for
441
+
442
+ >>> print(d.matching_key_for('this'))
443
+ This
444
+
445
+ >>> d.matching_key_for('missing')
446
+ Traceback (most recent call last):
447
+ ...
448
+ KeyError: 'missing'
449
+ """
450
+
451
+ @staticmethod
452
+ def transform_key(key):
453
+ return jaraco.text.FoldedCase(key)
454
+
455
+
456
+ class DictAdapter:
457
+ """
458
+ Provide a getitem interface for attributes of an object.
459
+
460
+ Let's say you want to get at the string.lowercase property in a formatted
461
+ string. It's easy with DictAdapter.
462
+
463
+ >>> import string
464
+ >>> print("lowercase is %(ascii_lowercase)s" % DictAdapter(string))
465
+ lowercase is abcdefghijklmnopqrstuvwxyz
466
+ """
467
+
468
+ def __init__(self, wrapped_ob):
469
+ self.object = wrapped_ob
470
+
471
+ def __getitem__(self, name):
472
+ return getattr(self.object, name)
473
+
474
+
475
+ class ItemsAsAttributes:
476
+ """
477
+ Mix-in class to enable a mapping object to provide items as
478
+ attributes.
479
+
480
+ >>> C = type('C', (dict, ItemsAsAttributes), dict())
481
+ >>> i = C()
482
+ >>> i['foo'] = 'bar'
483
+ >>> i.foo
484
+ 'bar'
485
+
486
+ Natural attribute access takes precedence
487
+
488
+ >>> i.foo = 'henry'
489
+ >>> i.foo
490
+ 'henry'
491
+
492
+ But as you might expect, the mapping functionality is preserved.
493
+
494
+ >>> i['foo']
495
+ 'bar'
496
+
497
+ A normal attribute error should be raised if an attribute is
498
+ requested that doesn't exist.
499
+
500
+ >>> i.missing
501
+ Traceback (most recent call last):
502
+ ...
503
+ AttributeError: 'C' object has no attribute 'missing'
504
+
505
+ It also works on dicts that customize __getitem__
506
+
507
+ >>> missing_func = lambda self, key: 'missing item'
508
+ >>> C = type(
509
+ ... 'C',
510
+ ... (dict, ItemsAsAttributes),
511
+ ... dict(__missing__ = missing_func),
512
+ ... )
513
+ >>> i = C()
514
+ >>> i.missing
515
+ 'missing item'
516
+ >>> i.foo
517
+ 'missing item'
518
+ """
519
+
520
+ def __getattr__(self, key):
521
+ try:
522
+ return getattr(super(), key)
523
+ except AttributeError as e:
524
+ # attempt to get the value from the mapping (return self[key])
525
+ # but be careful not to lose the original exception context.
526
+ noval = object()
527
+
528
+ def _safe_getitem(cont, key, missing_result):
529
+ try:
530
+ return cont[key]
531
+ except KeyError:
532
+ return missing_result
533
+
534
+ result = _safe_getitem(self, key, noval)
535
+ if result is not noval:
536
+ return result
537
+ # raise the original exception, but use the original class
538
+ # name, not 'super'.
539
+ (message,) = e.args
540
+ message = message.replace('super', self.__class__.__name__, 1)
541
+ e.args = (message,)
542
+ raise
543
+
544
+
545
+ def invert_map(map):
546
+ """
547
+ Given a dictionary, return another dictionary with keys and values
548
+ switched. If any of the values resolve to the same key, raises
549
+ a ValueError.
550
+
551
+ >>> numbers = dict(a=1, b=2, c=3)
552
+ >>> letters = invert_map(numbers)
553
+ >>> letters[1]
554
+ 'a'
555
+ >>> numbers['d'] = 3
556
+ >>> invert_map(numbers)
557
+ Traceback (most recent call last):
558
+ ...
559
+ ValueError: Key conflict in inverted mapping
560
+ """
561
+ res = dict((v, k) for k, v in map.items())
562
+ if not len(res) == len(map):
563
+ raise ValueError('Key conflict in inverted mapping')
564
+ return res
565
+
566
+
567
+ class IdentityOverrideMap(dict):
568
+ """
569
+ A dictionary that by default maps each key to itself, but otherwise
570
+ acts like a normal dictionary.
571
+
572
+ >>> d = IdentityOverrideMap()
573
+ >>> d[42]
574
+ 42
575
+ >>> d['speed'] = 'speedo'
576
+ >>> print(d['speed'])
577
+ speedo
578
+ """
579
+
580
+ def __missing__(self, key):
581
+ return key
582
+
583
+
584
+ class DictStack(list, collections.abc.MutableMapping):
585
+ """
586
+ A stack of dictionaries that behaves as a view on those dictionaries,
587
+ giving preference to the last.
588
+
589
+ >>> stack = DictStack([dict(a=1, c=2), dict(b=2, a=2)])
590
+ >>> stack['a']
591
+ 2
592
+ >>> stack['b']
593
+ 2
594
+ >>> stack['c']
595
+ 2
596
+ >>> len(stack)
597
+ 3
598
+ >>> stack.push(dict(a=3))
599
+ >>> stack['a']
600
+ 3
601
+ >>> stack['a'] = 4
602
+ >>> set(stack.keys()) == set(['a', 'b', 'c'])
603
+ True
604
+ >>> set(stack.items()) == set([('a', 4), ('b', 2), ('c', 2)])
605
+ True
606
+ >>> dict(**stack) == dict(stack) == dict(a=4, c=2, b=2)
607
+ True
608
+ >>> d = stack.pop()
609
+ >>> stack['a']
610
+ 2
611
+ >>> d = stack.pop()
612
+ >>> stack['a']
613
+ 1
614
+ >>> stack.get('b', None)
615
+ >>> 'c' in stack
616
+ True
617
+ >>> del stack['c']
618
+ >>> dict(stack)
619
+ {'a': 1}
620
+ """
621
+
622
+ def __iter__(self):
623
+ dicts = list.__iter__(self)
624
+ return iter(set(itertools.chain.from_iterable(c.keys() for c in dicts)))
625
+
626
+ def __getitem__(self, key):
627
+ for scope in reversed(tuple(list.__iter__(self))):
628
+ if key in scope:
629
+ return scope[key]
630
+ raise KeyError(key)
631
+
632
+ push = list.append
633
+
634
+ def __contains__(self, other):
635
+ return collections.abc.Mapping.__contains__(self, other)
636
+
637
+ def __len__(self):
638
+ return len(list(iter(self)))
639
+
640
+ def __setitem__(self, key, item):
641
+ last = list.__getitem__(self, -1)
642
+ return last.__setitem__(key, item)
643
+
644
+ def __delitem__(self, key):
645
+ last = list.__getitem__(self, -1)
646
+ return last.__delitem__(key)
647
+
648
+ # workaround for mypy confusion
649
+ def pop(self, *args, **kwargs):
650
+ return list.pop(self, *args, **kwargs)
651
+
652
+
653
+ class BijectiveMap(dict):
654
+ """
655
+ A Bijective Map (two-way mapping).
656
+
657
+ Implemented as a simple dictionary of 2x the size, mapping values back
658
+ to keys.
659
+
660
+ Note, this implementation may be incomplete. If there's not a test for
661
+ your use case below, it's likely to fail, so please test and send pull
662
+ requests or patches for additional functionality needed.
663
+
664
+
665
+ >>> m = BijectiveMap()
666
+ >>> m['a'] = 'b'
667
+ >>> m == {'a': 'b', 'b': 'a'}
668
+ True
669
+ >>> print(m['b'])
670
+ a
671
+
672
+ >>> m['c'] = 'd'
673
+ >>> len(m)
674
+ 2
675
+
676
+ Some weird things happen if you map an item to itself or overwrite a
677
+ single key of a pair, so it's disallowed.
678
+
679
+ >>> m['e'] = 'e'
680
+ Traceback (most recent call last):
681
+ ValueError: Key cannot map to itself
682
+
683
+ >>> m['d'] = 'e'
684
+ Traceback (most recent call last):
685
+ ValueError: Key/Value pairs may not overlap
686
+
687
+ >>> m['e'] = 'd'
688
+ Traceback (most recent call last):
689
+ ValueError: Key/Value pairs may not overlap
690
+
691
+ >>> print(m.pop('d'))
692
+ c
693
+
694
+ >>> 'c' in m
695
+ False
696
+
697
+ >>> m = BijectiveMap(dict(a='b'))
698
+ >>> len(m)
699
+ 1
700
+ >>> print(m['b'])
701
+ a
702
+
703
+ >>> m = BijectiveMap()
704
+ >>> m.update(a='b')
705
+ >>> m['b']
706
+ 'a'
707
+
708
+ >>> del m['b']
709
+ >>> len(m)
710
+ 0
711
+ >>> 'a' in m
712
+ False
713
+ """
714
+
715
+ def __init__(self, *args, **kwargs):
716
+ super().__init__()
717
+ self.update(*args, **kwargs)
718
+
719
+ def __setitem__(self, item, value):
720
+ if item == value:
721
+ raise ValueError("Key cannot map to itself")
722
+ overlap = (
723
+ item in self
724
+ and self[item] != value
725
+ or value in self
726
+ and self[value] != item
727
+ )
728
+ if overlap:
729
+ raise ValueError("Key/Value pairs may not overlap")
730
+ super().__setitem__(item, value)
731
+ super().__setitem__(value, item)
732
+
733
+ def __delitem__(self, item):
734
+ self.pop(item)
735
+
736
+ def __len__(self):
737
+ return super().__len__() // 2
738
+
739
+ def pop(self, key, *args, **kwargs):
740
+ mirror = self[key]
741
+ super().__delitem__(mirror)
742
+ return super().pop(key, *args, **kwargs)
743
+
744
+ def update(self, *args, **kwargs):
745
+ # build a dictionary using the default constructs
746
+ d = dict(*args, **kwargs)
747
+ # build this dictionary using transformed keys.
748
+ for item in d.items():
749
+ self.__setitem__(*item)
750
+
751
+
752
+ class FrozenDict(collections.abc.Mapping, collections.abc.Hashable):
753
+ """
754
+ An immutable mapping.
755
+
756
+ >>> a = FrozenDict(a=1, b=2)
757
+ >>> b = FrozenDict(a=1, b=2)
758
+ >>> a == b
759
+ True
760
+
761
+ >>> a == dict(a=1, b=2)
762
+ True
763
+ >>> dict(a=1, b=2) == a
764
+ True
765
+ >>> 'a' in a
766
+ True
767
+ >>> type(hash(a)) is type(0)
768
+ True
769
+ >>> set(iter(a)) == {'a', 'b'}
770
+ True
771
+ >>> len(a)
772
+ 2
773
+ >>> a['a'] == a.get('a') == 1
774
+ True
775
+
776
+ >>> a['c'] = 3
777
+ Traceback (most recent call last):
778
+ ...
779
+ TypeError: 'FrozenDict' object does not support item assignment
780
+
781
+ >>> a.update(y=3)
782
+ Traceback (most recent call last):
783
+ ...
784
+ AttributeError: 'FrozenDict' object has no attribute 'update'
785
+
786
+ Copies should compare equal
787
+
788
+ >>> copy.copy(a) == a
789
+ True
790
+
791
+ Copies should be the same type
792
+
793
+ >>> isinstance(copy.copy(a), FrozenDict)
794
+ True
795
+
796
+ FrozenDict supplies .copy(), even though
797
+ collections.abc.Mapping doesn't demand it.
798
+
799
+ >>> a.copy() == a
800
+ True
801
+ >>> a.copy() is not a
802
+ True
803
+ """
804
+
805
+ __slots__ = ['__data']
806
+
807
+ def __new__(cls, *args, **kwargs):
808
+ self = super().__new__(cls)
809
+ self.__data = dict(*args, **kwargs)
810
+ return self
811
+
812
+ # Container
813
+ def __contains__(self, key):
814
+ return key in self.__data
815
+
816
+ # Hashable
817
+ def __hash__(self):
818
+ return hash(tuple(sorted(self.__data.items())))
819
+
820
+ # Mapping
821
+ def __iter__(self):
822
+ return iter(self.__data)
823
+
824
+ def __len__(self):
825
+ return len(self.__data)
826
+
827
+ def __getitem__(self, key):
828
+ return self.__data[key]
829
+
830
+ # override get for efficiency provided by dict
831
+ def get(self, *args, **kwargs):
832
+ return self.__data.get(*args, **kwargs)
833
+
834
+ # override eq to recognize underlying implementation
835
+ def __eq__(self, other):
836
+ if isinstance(other, FrozenDict):
837
+ other = other.__data
838
+ return self.__data.__eq__(other)
839
+
840
+ def copy(self):
841
+ "Return a shallow copy of self"
842
+ return copy.copy(self)
843
+
844
+
845
+ class Enumeration(ItemsAsAttributes, BijectiveMap):
846
+ """
847
+ A convenient way to provide enumerated values
848
+
849
+ >>> e = Enumeration('a b c')
850
+ >>> e['a']
851
+ 0
852
+
853
+ >>> e.a
854
+ 0
855
+
856
+ >>> e[1]
857
+ 'b'
858
+
859
+ >>> set(e.names) == set('abc')
860
+ True
861
+
862
+ >>> set(e.codes) == set(range(3))
863
+ True
864
+
865
+ >>> e.get('d') is None
866
+ True
867
+
868
+ Codes need not start with 0
869
+
870
+ >>> e = Enumeration('a b c', range(1, 4))
871
+ >>> e['a']
872
+ 1
873
+
874
+ >>> e[3]
875
+ 'c'
876
+ """
877
+
878
+ def __init__(self, names, codes=None):
879
+ if isinstance(names, str):
880
+ names = names.split()
881
+ if codes is None:
882
+ codes = itertools.count()
883
+ super().__init__(zip(names, codes))
884
+
885
+ @property
886
+ def names(self):
887
+ return (key for key in self if isinstance(key, str))
888
+
889
+ @property
890
+ def codes(self):
891
+ return (self[name] for name in self.names)
892
+
893
+
894
+ class Everything:
895
+ """
896
+ A collection "containing" every possible thing.
897
+
898
+ >>> 'foo' in Everything()
899
+ True
900
+
901
+ >>> import random
902
+ >>> random.randint(1, 999) in Everything()
903
+ True
904
+
905
+ >>> random.choice([None, 'foo', 42, ('a', 'b', 'c')]) in Everything()
906
+ True
907
+ """
908
+
909
+ def __contains__(self, other):
910
+ return True
911
+
912
+
913
+ class InstrumentedDict(collections.UserDict):
914
+ """
915
+ Instrument an existing dictionary with additional
916
+ functionality, but always reference and mutate
917
+ the original dictionary.
918
+
919
+ >>> orig = {'a': 1, 'b': 2}
920
+ >>> inst = InstrumentedDict(orig)
921
+ >>> inst['a']
922
+ 1
923
+ >>> inst['c'] = 3
924
+ >>> orig['c']
925
+ 3
926
+ >>> inst.keys() == orig.keys()
927
+ True
928
+ """
929
+
930
+ def __init__(self, data):
931
+ super().__init__()
932
+ self.data = data
933
+
934
+
935
+ class Least:
936
+ """
937
+ A value that is always lesser than any other
938
+
939
+ >>> least = Least()
940
+ >>> 3 < least
941
+ False
942
+ >>> 3 > least
943
+ True
944
+ >>> least < 3
945
+ True
946
+ >>> least <= 3
947
+ True
948
+ >>> least > 3
949
+ False
950
+ >>> 'x' > least
951
+ True
952
+ >>> None > least
953
+ True
954
+ """
955
+
956
+ def __le__(self, other):
957
+ return True
958
+
959
+ __lt__ = __le__
960
+
961
+ def __ge__(self, other):
962
+ return False
963
+
964
+ __gt__ = __ge__
965
+
966
+
967
+ class Greatest:
968
+ """
969
+ A value that is always greater than any other
970
+
971
+ >>> greatest = Greatest()
972
+ >>> 3 < greatest
973
+ True
974
+ >>> 3 > greatest
975
+ False
976
+ >>> greatest < 3
977
+ False
978
+ >>> greatest > 3
979
+ True
980
+ >>> greatest >= 3
981
+ True
982
+ >>> 'x' > greatest
983
+ False
984
+ >>> None > greatest
985
+ False
986
+ """
987
+
988
+ def __ge__(self, other):
989
+ return True
990
+
991
+ __gt__ = __ge__
992
+
993
+ def __le__(self, other):
994
+ return False
995
+
996
+ __lt__ = __le__
997
+
998
+
999
+ def pop_all(items):
1000
+ """
1001
+ Clear items in place and return a copy of items.
1002
+
1003
+ >>> items = [1, 2, 3]
1004
+ >>> popped = pop_all(items)
1005
+ >>> popped is items
1006
+ False
1007
+ >>> popped
1008
+ [1, 2, 3]
1009
+ >>> items
1010
+ []
1011
+ """
1012
+ result, items[:] = items[:], []
1013
+ return result
1014
+
1015
+
1016
+ class FreezableDefaultDict(collections.defaultdict):
1017
+ """
1018
+ Often it is desirable to prevent the mutation of
1019
+ a default dict after its initial construction, such
1020
+ as to prevent mutation during iteration.
1021
+
1022
+ >>> dd = FreezableDefaultDict(list)
1023
+ >>> dd[0].append('1')
1024
+ >>> dd.freeze()
1025
+ >>> dd[1]
1026
+ []
1027
+ >>> len(dd)
1028
+ 1
1029
+ """
1030
+
1031
+ def __missing__(self, key):
1032
+ return getattr(self, '_frozen', super().__missing__)(key)
1033
+
1034
+ def freeze(self):
1035
+ self._frozen = lambda key: self.default_factory()
1036
+
1037
+
1038
+ class Accumulator:
1039
+ def __init__(self, initial=0):
1040
+ self.val = initial
1041
+
1042
+ def __call__(self, val):
1043
+ self.val += val
1044
+ return self.val
1045
+
1046
+
1047
+ class WeightedLookup(RangeMap):
1048
+ """
1049
+ Given parameters suitable for a dict representing keys
1050
+ and a weighted proportion, return a RangeMap representing
1051
+ spans of values proportial to the weights:
1052
+
1053
+ >>> even = WeightedLookup(a=1, b=1)
1054
+
1055
+ [0, 1) -> a
1056
+ [1, 2) -> b
1057
+
1058
+ >>> lk = WeightedLookup(a=1, b=2)
1059
+
1060
+ [0, 1) -> a
1061
+ [1, 3) -> b
1062
+
1063
+ >>> lk[.5]
1064
+ 'a'
1065
+ >>> lk[1.5]
1066
+ 'b'
1067
+
1068
+ Adds ``.random()`` to select a random weighted value:
1069
+
1070
+ >>> lk.random() in ['a', 'b']
1071
+ True
1072
+
1073
+ >>> choices = [lk.random() for x in range(1000)]
1074
+
1075
+ Statistically speaking, choices should be .5 a:b
1076
+ >>> ratio = choices.count('a') / choices.count('b')
1077
+ >>> .4 < ratio < .6
1078
+ True
1079
+ """
1080
+
1081
+ def __init__(self, *args, **kwargs):
1082
+ raw = dict(*args, **kwargs)
1083
+
1084
+ # allocate keys by weight
1085
+ indexes = map(Accumulator(), raw.values())
1086
+ super().__init__(zip(indexes, raw.keys()), key_match_comparator=operator.lt)
1087
+
1088
+ def random(self):
1089
+ lower, upper = self.bounds()
1090
+ selector = random.random() * upper
1091
+ return self[selector]