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,633 @@
1
+ import collections.abc
2
+ import functools
3
+ import inspect
4
+ import itertools
5
+ import operator
6
+ import time
7
+ import types
8
+ import warnings
9
+
10
+ import more_itertools
11
+
12
+
13
+ def compose(*funcs):
14
+ """
15
+ Compose any number of unary functions into a single unary function.
16
+
17
+ >>> import textwrap
18
+ >>> expected = str.strip(textwrap.dedent(compose.__doc__))
19
+ >>> strip_and_dedent = compose(str.strip, textwrap.dedent)
20
+ >>> strip_and_dedent(compose.__doc__) == expected
21
+ True
22
+
23
+ Compose also allows the innermost function to take arbitrary arguments.
24
+
25
+ >>> round_three = lambda x: round(x, ndigits=3)
26
+ >>> f = compose(round_three, int.__truediv__)
27
+ >>> [f(3*x, x+1) for x in range(1,10)]
28
+ [1.5, 2.0, 2.25, 2.4, 2.5, 2.571, 2.625, 2.667, 2.7]
29
+ """
30
+
31
+ def compose_two(f1, f2):
32
+ return lambda *args, **kwargs: f1(f2(*args, **kwargs))
33
+
34
+ return functools.reduce(compose_two, funcs)
35
+
36
+
37
+ def once(func):
38
+ """
39
+ Decorate func so it's only ever called the first time.
40
+
41
+ This decorator can ensure that an expensive or non-idempotent function
42
+ will not be expensive on subsequent calls and is idempotent.
43
+
44
+ >>> add_three = once(lambda a: a+3)
45
+ >>> add_three(3)
46
+ 6
47
+ >>> add_three(9)
48
+ 6
49
+ >>> add_three('12')
50
+ 6
51
+
52
+ To reset the stored value, simply clear the property ``saved_result``.
53
+
54
+ >>> del add_three.saved_result
55
+ >>> add_three(9)
56
+ 12
57
+ >>> add_three(8)
58
+ 12
59
+
60
+ Or invoke 'reset()' on it.
61
+
62
+ >>> add_three.reset()
63
+ >>> add_three(-3)
64
+ 0
65
+ >>> add_three(0)
66
+ 0
67
+ """
68
+
69
+ @functools.wraps(func)
70
+ def wrapper(*args, **kwargs):
71
+ if not hasattr(wrapper, 'saved_result'):
72
+ wrapper.saved_result = func(*args, **kwargs)
73
+ return wrapper.saved_result
74
+
75
+ wrapper.reset = lambda: vars(wrapper).__delitem__('saved_result')
76
+ return wrapper
77
+
78
+
79
+ def method_cache(method, cache_wrapper=functools.lru_cache()):
80
+ """
81
+ Wrap lru_cache to support storing the cache data in the object instances.
82
+
83
+ Abstracts the common paradigm where the method explicitly saves an
84
+ underscore-prefixed protected property on first call and returns that
85
+ subsequently.
86
+
87
+ >>> class MyClass:
88
+ ... calls = 0
89
+ ...
90
+ ... @method_cache
91
+ ... def method(self, value):
92
+ ... self.calls += 1
93
+ ... return value
94
+
95
+ >>> a = MyClass()
96
+ >>> a.method(3)
97
+ 3
98
+ >>> for x in range(75):
99
+ ... res = a.method(x)
100
+ >>> a.calls
101
+ 75
102
+
103
+ Note that the apparent behavior will be exactly like that of lru_cache
104
+ except that the cache is stored on each instance, so values in one
105
+ instance will not flush values from another, and when an instance is
106
+ deleted, so are the cached values for that instance.
107
+
108
+ >>> b = MyClass()
109
+ >>> for x in range(35):
110
+ ... res = b.method(x)
111
+ >>> b.calls
112
+ 35
113
+ >>> a.method(0)
114
+ 0
115
+ >>> a.calls
116
+ 75
117
+
118
+ Note that if method had been decorated with ``functools.lru_cache()``,
119
+ a.calls would have been 76 (due to the cached value of 0 having been
120
+ flushed by the 'b' instance).
121
+
122
+ Clear the cache with ``.cache_clear()``
123
+
124
+ >>> a.method.cache_clear()
125
+
126
+ Same for a method that hasn't yet been called.
127
+
128
+ >>> c = MyClass()
129
+ >>> c.method.cache_clear()
130
+
131
+ Another cache wrapper may be supplied:
132
+
133
+ >>> cache = functools.lru_cache(maxsize=2)
134
+ >>> MyClass.method2 = method_cache(lambda self: 3, cache_wrapper=cache)
135
+ >>> a = MyClass()
136
+ >>> a.method2()
137
+ 3
138
+
139
+ Caution - do not subsequently wrap the method with another decorator, such
140
+ as ``@property``, which changes the semantics of the function.
141
+
142
+ See also
143
+ http://code.activestate.com/recipes/577452-a-memoize-decorator-for-instance-methods/
144
+ for another implementation and additional justification.
145
+ """
146
+
147
+ def wrapper(self, *args, **kwargs):
148
+ # it's the first call, replace the method with a cached, bound method
149
+ bound_method = types.MethodType(method, self)
150
+ cached_method = cache_wrapper(bound_method)
151
+ setattr(self, method.__name__, cached_method)
152
+ return cached_method(*args, **kwargs)
153
+
154
+ # Support cache clear even before cache has been created.
155
+ wrapper.cache_clear = lambda: None
156
+
157
+ return _special_method_cache(method, cache_wrapper) or wrapper
158
+
159
+
160
+ def _special_method_cache(method, cache_wrapper):
161
+ """
162
+ Because Python treats special methods differently, it's not
163
+ possible to use instance attributes to implement the cached
164
+ methods.
165
+
166
+ Instead, install the wrapper method under a different name
167
+ and return a simple proxy to that wrapper.
168
+
169
+ https://github.com/jaraco/jaraco.functools/issues/5
170
+ """
171
+ name = method.__name__
172
+ special_names = '__getattr__', '__getitem__'
173
+
174
+ if name not in special_names:
175
+ return None
176
+
177
+ wrapper_name = '__cached' + name
178
+
179
+ def proxy(self, /, *args, **kwargs):
180
+ if wrapper_name not in vars(self):
181
+ bound = types.MethodType(method, self)
182
+ cache = cache_wrapper(bound)
183
+ setattr(self, wrapper_name, cache)
184
+ else:
185
+ cache = getattr(self, wrapper_name)
186
+ return cache(*args, **kwargs)
187
+
188
+ return proxy
189
+
190
+
191
+ def apply(transform):
192
+ """
193
+ Decorate a function with a transform function that is
194
+ invoked on results returned from the decorated function.
195
+
196
+ >>> @apply(reversed)
197
+ ... def get_numbers(start):
198
+ ... "doc for get_numbers"
199
+ ... return range(start, start+3)
200
+ >>> list(get_numbers(4))
201
+ [6, 5, 4]
202
+ >>> get_numbers.__doc__
203
+ 'doc for get_numbers'
204
+ """
205
+
206
+ def wrap(func):
207
+ return functools.wraps(func)(compose(transform, func))
208
+
209
+ return wrap
210
+
211
+
212
+ def result_invoke(action):
213
+ r"""
214
+ Decorate a function with an action function that is
215
+ invoked on the results returned from the decorated
216
+ function (for its side effect), then return the original
217
+ result.
218
+
219
+ >>> @result_invoke(print)
220
+ ... def add_two(a, b):
221
+ ... return a + b
222
+ >>> x = add_two(2, 3)
223
+ 5
224
+ >>> x
225
+ 5
226
+ """
227
+
228
+ def wrap(func):
229
+ @functools.wraps(func)
230
+ def wrapper(*args, **kwargs):
231
+ result = func(*args, **kwargs)
232
+ action(result)
233
+ return result
234
+
235
+ return wrapper
236
+
237
+ return wrap
238
+
239
+
240
+ def invoke(f, /, *args, **kwargs):
241
+ """
242
+ Call a function for its side effect after initialization.
243
+
244
+ The benefit of using the decorator instead of simply invoking a function
245
+ after defining it is that it makes explicit the author's intent for the
246
+ function to be called immediately. Whereas if one simply calls the
247
+ function immediately, it's less obvious if that was intentional or
248
+ incidental. It also avoids repeating the name - the two actions, defining
249
+ the function and calling it immediately are modeled separately, but linked
250
+ by the decorator construct.
251
+
252
+ The benefit of having a function construct (opposed to just invoking some
253
+ behavior inline) is to serve as a scope in which the behavior occurs. It
254
+ avoids polluting the global namespace with local variables, provides an
255
+ anchor on which to attach documentation (docstring), keeps the behavior
256
+ logically separated (instead of conceptually separated or not separated at
257
+ all), and provides potential to re-use the behavior for testing or other
258
+ purposes.
259
+
260
+ This function is named as a pithy way to communicate, "call this function
261
+ primarily for its side effect", or "while defining this function, also
262
+ take it aside and call it". It exists because there's no Python construct
263
+ for "define and call" (nor should there be, as decorators serve this need
264
+ just fine). The behavior happens immediately and synchronously.
265
+
266
+ >>> @invoke
267
+ ... def func(): print("called")
268
+ called
269
+ >>> func()
270
+ called
271
+
272
+ Use functools.partial to pass parameters to the initial call
273
+
274
+ >>> @functools.partial(invoke, name='bingo')
275
+ ... def func(name): print('called with', name)
276
+ called with bingo
277
+ """
278
+ f(*args, **kwargs)
279
+ return f
280
+
281
+
282
+ class Throttler:
283
+ """Rate-limit a function (or other callable)."""
284
+
285
+ def __init__(self, func, max_rate=float('Inf')):
286
+ if isinstance(func, Throttler):
287
+ func = func.func
288
+ self.func = func
289
+ self.max_rate = max_rate
290
+ self.reset()
291
+
292
+ def reset(self):
293
+ self.last_called = 0
294
+
295
+ def __call__(self, *args, **kwargs):
296
+ self._wait()
297
+ return self.func(*args, **kwargs)
298
+
299
+ def _wait(self):
300
+ """Ensure at least 1/max_rate seconds from last call."""
301
+ elapsed = time.time() - self.last_called
302
+ must_wait = 1 / self.max_rate - elapsed
303
+ time.sleep(max(0, must_wait))
304
+ self.last_called = time.time()
305
+
306
+ def __get__(self, obj, owner=None):
307
+ return first_invoke(self._wait, functools.partial(self.func, obj))
308
+
309
+
310
+ def first_invoke(func1, func2):
311
+ """
312
+ Return a function that when invoked will invoke func1 without
313
+ any parameters (for its side effect) and then invoke func2
314
+ with whatever parameters were passed, returning its result.
315
+ """
316
+
317
+ def wrapper(*args, **kwargs):
318
+ func1()
319
+ return func2(*args, **kwargs)
320
+
321
+ return wrapper
322
+
323
+
324
+ method_caller = first_invoke(
325
+ lambda: warnings.warn(
326
+ '`jaraco.functools.method_caller` is deprecated, '
327
+ 'use `operator.methodcaller` instead',
328
+ DeprecationWarning,
329
+ stacklevel=3,
330
+ ),
331
+ operator.methodcaller,
332
+ )
333
+
334
+
335
+ def retry_call(func, cleanup=lambda: None, retries=0, trap=()):
336
+ """
337
+ Given a callable func, trap the indicated exceptions
338
+ for up to 'retries' times, invoking cleanup on the
339
+ exception. On the final attempt, allow any exceptions
340
+ to propagate.
341
+ """
342
+ attempts = itertools.count() if retries == float('inf') else range(retries)
343
+ for _ in attempts:
344
+ try:
345
+ return func()
346
+ except trap:
347
+ cleanup()
348
+
349
+ return func()
350
+
351
+
352
+ def retry(*r_args, **r_kwargs):
353
+ """
354
+ Decorator wrapper for retry_call. Accepts arguments to retry_call
355
+ except func and then returns a decorator for the decorated function.
356
+
357
+ Ex:
358
+
359
+ >>> @retry(retries=3)
360
+ ... def my_func(a, b):
361
+ ... "this is my funk"
362
+ ... print(a, b)
363
+ >>> my_func.__doc__
364
+ 'this is my funk'
365
+ """
366
+
367
+ def decorate(func):
368
+ @functools.wraps(func)
369
+ def wrapper(*f_args, **f_kwargs):
370
+ bound = functools.partial(func, *f_args, **f_kwargs)
371
+ return retry_call(bound, *r_args, **r_kwargs)
372
+
373
+ return wrapper
374
+
375
+ return decorate
376
+
377
+
378
+ def print_yielded(func):
379
+ """
380
+ Convert a generator into a function that prints all yielded elements.
381
+
382
+ >>> @print_yielded
383
+ ... def x():
384
+ ... yield 3; yield None
385
+ >>> x()
386
+ 3
387
+ None
388
+ """
389
+ print_all = functools.partial(map, print)
390
+ print_results = compose(more_itertools.consume, print_all, func)
391
+ return functools.wraps(func)(print_results)
392
+
393
+
394
+ def pass_none(func):
395
+ """
396
+ Wrap func so it's not called if its first param is None.
397
+
398
+ >>> print_text = pass_none(print)
399
+ >>> print_text('text')
400
+ text
401
+ >>> print_text(None)
402
+ """
403
+
404
+ @functools.wraps(func)
405
+ def wrapper(param, /, *args, **kwargs):
406
+ if param is not None:
407
+ return func(param, *args, **kwargs)
408
+ return None
409
+
410
+ return wrapper
411
+
412
+
413
+ def assign_params(func, namespace):
414
+ """
415
+ Assign parameters from namespace where func solicits.
416
+
417
+ >>> def func(x, y=3):
418
+ ... print(x, y)
419
+ >>> assigned = assign_params(func, dict(x=2, z=4))
420
+ >>> assigned()
421
+ 2 3
422
+
423
+ The usual errors are raised if a function doesn't receive
424
+ its required parameters:
425
+
426
+ >>> assigned = assign_params(func, dict(y=3, z=4))
427
+ >>> assigned()
428
+ Traceback (most recent call last):
429
+ TypeError: func() ...argument...
430
+
431
+ It even works on methods:
432
+
433
+ >>> class Handler:
434
+ ... def meth(self, arg):
435
+ ... print(arg)
436
+ >>> assign_params(Handler().meth, dict(arg='crystal', foo='clear'))()
437
+ crystal
438
+ """
439
+ sig = inspect.signature(func)
440
+ params = sig.parameters.keys()
441
+ call_ns = {k: namespace[k] for k in params if k in namespace}
442
+ return functools.partial(func, **call_ns)
443
+
444
+
445
+ def save_method_args(method):
446
+ """
447
+ Wrap a method such that when it is called, the args and kwargs are
448
+ saved on the method.
449
+
450
+ >>> class MyClass:
451
+ ... @save_method_args
452
+ ... def method(self, a, b):
453
+ ... print(a, b)
454
+ >>> my_ob = MyClass()
455
+ >>> my_ob.method(1, 2)
456
+ 1 2
457
+ >>> my_ob._saved_method.args
458
+ (1, 2)
459
+ >>> my_ob._saved_method.kwargs
460
+ {}
461
+ >>> my_ob.method(a=3, b='foo')
462
+ 3 foo
463
+ >>> my_ob._saved_method.args
464
+ ()
465
+ >>> my_ob._saved_method.kwargs == dict(a=3, b='foo')
466
+ True
467
+
468
+ The arguments are stored on the instance, allowing for
469
+ different instance to save different args.
470
+
471
+ >>> your_ob = MyClass()
472
+ >>> your_ob.method({str('x'): 3}, b=[4])
473
+ {'x': 3} [4]
474
+ >>> your_ob._saved_method.args
475
+ ({'x': 3},)
476
+ >>> my_ob._saved_method.args
477
+ ()
478
+ """
479
+ args_and_kwargs = collections.namedtuple('args_and_kwargs', 'args kwargs')
480
+
481
+ @functools.wraps(method)
482
+ def wrapper(self, /, *args, **kwargs):
483
+ attr_name = '_saved_' + method.__name__
484
+ attr = args_and_kwargs(args, kwargs)
485
+ setattr(self, attr_name, attr)
486
+ return method(self, *args, **kwargs)
487
+
488
+ return wrapper
489
+
490
+
491
+ def except_(*exceptions, replace=None, use=None):
492
+ """
493
+ Replace the indicated exceptions, if raised, with the indicated
494
+ literal replacement or evaluated expression (if present).
495
+
496
+ >>> safe_int = except_(ValueError)(int)
497
+ >>> safe_int('five')
498
+ >>> safe_int('5')
499
+ 5
500
+
501
+ Specify a literal replacement with ``replace``.
502
+
503
+ >>> safe_int_r = except_(ValueError, replace=0)(int)
504
+ >>> safe_int_r('five')
505
+ 0
506
+
507
+ Provide an expression to ``use`` to pass through particular parameters.
508
+
509
+ >>> safe_int_pt = except_(ValueError, use='args[0]')(int)
510
+ >>> safe_int_pt('five')
511
+ 'five'
512
+
513
+ """
514
+
515
+ def decorate(func):
516
+ @functools.wraps(func)
517
+ def wrapper(*args, **kwargs):
518
+ try:
519
+ return func(*args, **kwargs)
520
+ except exceptions:
521
+ try:
522
+ return eval(use)
523
+ except TypeError:
524
+ return replace
525
+
526
+ return wrapper
527
+
528
+ return decorate
529
+
530
+
531
+ def identity(x):
532
+ """
533
+ Return the argument.
534
+
535
+ >>> o = object()
536
+ >>> identity(o) is o
537
+ True
538
+ """
539
+ return x
540
+
541
+
542
+ def bypass_when(check, *, _op=identity):
543
+ """
544
+ Decorate a function to return its parameter when ``check``.
545
+
546
+ >>> bypassed = [] # False
547
+
548
+ >>> @bypass_when(bypassed)
549
+ ... def double(x):
550
+ ... return x * 2
551
+ >>> double(2)
552
+ 4
553
+ >>> bypassed[:] = [object()] # True
554
+ >>> double(2)
555
+ 2
556
+ """
557
+
558
+ def decorate(func):
559
+ @functools.wraps(func)
560
+ def wrapper(param, /):
561
+ return param if _op(check) else func(param)
562
+
563
+ return wrapper
564
+
565
+ return decorate
566
+
567
+
568
+ def bypass_unless(check):
569
+ """
570
+ Decorate a function to return its parameter unless ``check``.
571
+
572
+ >>> enabled = [object()] # True
573
+
574
+ >>> @bypass_unless(enabled)
575
+ ... def double(x):
576
+ ... return x * 2
577
+ >>> double(2)
578
+ 4
579
+ >>> del enabled[:] # False
580
+ >>> double(2)
581
+ 2
582
+ """
583
+ return bypass_when(check, _op=operator.not_)
584
+
585
+
586
+ @functools.singledispatch
587
+ def _splat_inner(args, func):
588
+ """Splat args to func."""
589
+ return func(*args)
590
+
591
+
592
+ @_splat_inner.register
593
+ def _(args: collections.abc.Mapping, func):
594
+ """Splat kargs to func as kwargs."""
595
+ return func(**args)
596
+
597
+
598
+ def splat(func):
599
+ """
600
+ Wrap func to expect its parameters to be passed positionally in a tuple.
601
+
602
+ Has a similar effect to that of ``itertools.starmap`` over
603
+ simple ``map``.
604
+
605
+ >>> pairs = [(-1, 1), (0, 2)]
606
+ >>> more_itertools.consume(itertools.starmap(print, pairs))
607
+ -1 1
608
+ 0 2
609
+ >>> more_itertools.consume(map(splat(print), pairs))
610
+ -1 1
611
+ 0 2
612
+
613
+ The approach generalizes to other iterators that don't have a "star"
614
+ equivalent, such as a "starfilter".
615
+
616
+ >>> list(filter(splat(operator.add), pairs))
617
+ [(0, 2)]
618
+
619
+ Splat also accepts a mapping argument.
620
+
621
+ >>> def is_nice(msg, code):
622
+ ... return "smile" in msg or code == 0
623
+ >>> msgs = [
624
+ ... dict(msg='smile!', code=20),
625
+ ... dict(msg='error :(', code=1),
626
+ ... dict(msg='unknown', code=0),
627
+ ... ]
628
+ >>> for msg in filter(splat(is_nice), msgs):
629
+ ... print(msg)
630
+ {'msg': 'smile!', 'code': 20}
631
+ {'msg': 'unknown', 'code': 0}
632
+ """
633
+ return functools.wraps(func)(functools.partial(_splat_inner, func=func))