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,1046 @@
1
+ """Imported from the recipes section of the itertools documentation.
2
+
3
+ All functions taken from the recipes section of the itertools library docs
4
+ [1]_.
5
+ Some backward-compatible usability improvements have been made.
6
+
7
+ .. [1] http://docs.python.org/library/itertools.html#recipes
8
+
9
+ """
10
+
11
+ import math
12
+ import operator
13
+
14
+ from collections import deque
15
+ from collections.abc import Sized
16
+ from functools import partial, reduce
17
+ from itertools import (
18
+ chain,
19
+ combinations,
20
+ compress,
21
+ count,
22
+ cycle,
23
+ groupby,
24
+ islice,
25
+ product,
26
+ repeat,
27
+ starmap,
28
+ tee,
29
+ zip_longest,
30
+ )
31
+ from random import randrange, sample, choice
32
+ from sys import hexversion
33
+
34
+ __all__ = [
35
+ 'all_equal',
36
+ 'batched',
37
+ 'before_and_after',
38
+ 'consume',
39
+ 'convolve',
40
+ 'dotproduct',
41
+ 'first_true',
42
+ 'factor',
43
+ 'flatten',
44
+ 'grouper',
45
+ 'iter_except',
46
+ 'iter_index',
47
+ 'matmul',
48
+ 'ncycles',
49
+ 'nth',
50
+ 'nth_combination',
51
+ 'padnone',
52
+ 'pad_none',
53
+ 'pairwise',
54
+ 'partition',
55
+ 'polynomial_eval',
56
+ 'polynomial_from_roots',
57
+ 'polynomial_derivative',
58
+ 'powerset',
59
+ 'prepend',
60
+ 'quantify',
61
+ 'reshape',
62
+ 'random_combination_with_replacement',
63
+ 'random_combination',
64
+ 'random_permutation',
65
+ 'random_product',
66
+ 'repeatfunc',
67
+ 'roundrobin',
68
+ 'sieve',
69
+ 'sliding_window',
70
+ 'subslices',
71
+ 'sum_of_squares',
72
+ 'tabulate',
73
+ 'tail',
74
+ 'take',
75
+ 'totient',
76
+ 'transpose',
77
+ 'triplewise',
78
+ 'unique',
79
+ 'unique_everseen',
80
+ 'unique_justseen',
81
+ ]
82
+
83
+ _marker = object()
84
+
85
+
86
+ # zip with strict is available for Python 3.10+
87
+ try:
88
+ zip(strict=True)
89
+ except TypeError:
90
+ _zip_strict = zip
91
+ else:
92
+ _zip_strict = partial(zip, strict=True)
93
+
94
+ # math.sumprod is available for Python 3.12+
95
+ _sumprod = getattr(math, 'sumprod', lambda x, y: dotproduct(x, y))
96
+
97
+
98
+ def take(n, iterable):
99
+ """Return first *n* items of the iterable as a list.
100
+
101
+ >>> take(3, range(10))
102
+ [0, 1, 2]
103
+
104
+ If there are fewer than *n* items in the iterable, all of them are
105
+ returned.
106
+
107
+ >>> take(10, range(3))
108
+ [0, 1, 2]
109
+
110
+ """
111
+ return list(islice(iterable, n))
112
+
113
+
114
+ def tabulate(function, start=0):
115
+ """Return an iterator over the results of ``func(start)``,
116
+ ``func(start + 1)``, ``func(start + 2)``...
117
+
118
+ *func* should be a function that accepts one integer argument.
119
+
120
+ If *start* is not specified it defaults to 0. It will be incremented each
121
+ time the iterator is advanced.
122
+
123
+ >>> square = lambda x: x ** 2
124
+ >>> iterator = tabulate(square, -3)
125
+ >>> take(4, iterator)
126
+ [9, 4, 1, 0]
127
+
128
+ """
129
+ return map(function, count(start))
130
+
131
+
132
+ def tail(n, iterable):
133
+ """Return an iterator over the last *n* items of *iterable*.
134
+
135
+ >>> t = tail(3, 'ABCDEFG')
136
+ >>> list(t)
137
+ ['E', 'F', 'G']
138
+
139
+ """
140
+ # If the given iterable has a length, then we can use islice to get its
141
+ # final elements. Note that if the iterable is not actually Iterable,
142
+ # either islice or deque will throw a TypeError. This is why we don't
143
+ # check if it is Iterable.
144
+ if isinstance(iterable, Sized):
145
+ yield from islice(iterable, max(0, len(iterable) - n), None)
146
+ else:
147
+ yield from iter(deque(iterable, maxlen=n))
148
+
149
+
150
+ def consume(iterator, n=None):
151
+ """Advance *iterable* by *n* steps. If *n* is ``None``, consume it
152
+ entirely.
153
+
154
+ Efficiently exhausts an iterator without returning values. Defaults to
155
+ consuming the whole iterator, but an optional second argument may be
156
+ provided to limit consumption.
157
+
158
+ >>> i = (x for x in range(10))
159
+ >>> next(i)
160
+ 0
161
+ >>> consume(i, 3)
162
+ >>> next(i)
163
+ 4
164
+ >>> consume(i)
165
+ >>> next(i)
166
+ Traceback (most recent call last):
167
+ File "<stdin>", line 1, in <module>
168
+ StopIteration
169
+
170
+ If the iterator has fewer items remaining than the provided limit, the
171
+ whole iterator will be consumed.
172
+
173
+ >>> i = (x for x in range(3))
174
+ >>> consume(i, 5)
175
+ >>> next(i)
176
+ Traceback (most recent call last):
177
+ File "<stdin>", line 1, in <module>
178
+ StopIteration
179
+
180
+ """
181
+ # Use functions that consume iterators at C speed.
182
+ if n is None:
183
+ # feed the entire iterator into a zero-length deque
184
+ deque(iterator, maxlen=0)
185
+ else:
186
+ # advance to the empty slice starting at position n
187
+ next(islice(iterator, n, n), None)
188
+
189
+
190
+ def nth(iterable, n, default=None):
191
+ """Returns the nth item or a default value.
192
+
193
+ >>> l = range(10)
194
+ >>> nth(l, 3)
195
+ 3
196
+ >>> nth(l, 20, "zebra")
197
+ 'zebra'
198
+
199
+ """
200
+ return next(islice(iterable, n, None), default)
201
+
202
+
203
+ def all_equal(iterable, key=None):
204
+ """
205
+ Returns ``True`` if all the elements are equal to each other.
206
+
207
+ >>> all_equal('aaaa')
208
+ True
209
+ >>> all_equal('aaab')
210
+ False
211
+
212
+ A function that accepts a single argument and returns a transformed version
213
+ of each input item can be specified with *key*:
214
+
215
+ >>> all_equal('AaaA', key=str.casefold)
216
+ True
217
+ >>> all_equal([1, 2, 3], key=lambda x: x < 10)
218
+ True
219
+
220
+ """
221
+ return len(list(islice(groupby(iterable, key), 2))) <= 1
222
+
223
+
224
+ def quantify(iterable, pred=bool):
225
+ """Return the how many times the predicate is true.
226
+
227
+ >>> quantify([True, False, True])
228
+ 2
229
+
230
+ """
231
+ return sum(map(pred, iterable))
232
+
233
+
234
+ def pad_none(iterable):
235
+ """Returns the sequence of elements and then returns ``None`` indefinitely.
236
+
237
+ >>> take(5, pad_none(range(3)))
238
+ [0, 1, 2, None, None]
239
+
240
+ Useful for emulating the behavior of the built-in :func:`map` function.
241
+
242
+ See also :func:`padded`.
243
+
244
+ """
245
+ return chain(iterable, repeat(None))
246
+
247
+
248
+ padnone = pad_none
249
+
250
+
251
+ def ncycles(iterable, n):
252
+ """Returns the sequence elements *n* times
253
+
254
+ >>> list(ncycles(["a", "b"], 3))
255
+ ['a', 'b', 'a', 'b', 'a', 'b']
256
+
257
+ """
258
+ return chain.from_iterable(repeat(tuple(iterable), n))
259
+
260
+
261
+ def dotproduct(vec1, vec2):
262
+ """Returns the dot product of the two iterables.
263
+
264
+ >>> dotproduct([10, 10], [20, 20])
265
+ 400
266
+
267
+ """
268
+ return sum(map(operator.mul, vec1, vec2))
269
+
270
+
271
+ def flatten(listOfLists):
272
+ """Return an iterator flattening one level of nesting in a list of lists.
273
+
274
+ >>> list(flatten([[0, 1], [2, 3]]))
275
+ [0, 1, 2, 3]
276
+
277
+ See also :func:`collapse`, which can flatten multiple levels of nesting.
278
+
279
+ """
280
+ return chain.from_iterable(listOfLists)
281
+
282
+
283
+ def repeatfunc(func, times=None, *args):
284
+ """Call *func* with *args* repeatedly, returning an iterable over the
285
+ results.
286
+
287
+ If *times* is specified, the iterable will terminate after that many
288
+ repetitions:
289
+
290
+ >>> from operator import add
291
+ >>> times = 4
292
+ >>> args = 3, 5
293
+ >>> list(repeatfunc(add, times, *args))
294
+ [8, 8, 8, 8]
295
+
296
+ If *times* is ``None`` the iterable will not terminate:
297
+
298
+ >>> from random import randrange
299
+ >>> times = None
300
+ >>> args = 1, 11
301
+ >>> take(6, repeatfunc(randrange, times, *args)) # doctest:+SKIP
302
+ [2, 4, 8, 1, 8, 4]
303
+
304
+ """
305
+ if times is None:
306
+ return starmap(func, repeat(args))
307
+ return starmap(func, repeat(args, times))
308
+
309
+
310
+ def _pairwise(iterable):
311
+ """Returns an iterator of paired items, overlapping, from the original
312
+
313
+ >>> take(4, pairwise(count()))
314
+ [(0, 1), (1, 2), (2, 3), (3, 4)]
315
+
316
+ On Python 3.10 and above, this is an alias for :func:`itertools.pairwise`.
317
+
318
+ """
319
+ a, b = tee(iterable)
320
+ next(b, None)
321
+ return zip(a, b)
322
+
323
+
324
+ try:
325
+ from itertools import pairwise as itertools_pairwise
326
+ except ImportError:
327
+ pairwise = _pairwise
328
+ else:
329
+
330
+ def pairwise(iterable):
331
+ return itertools_pairwise(iterable)
332
+
333
+ pairwise.__doc__ = _pairwise.__doc__
334
+
335
+
336
+ class UnequalIterablesError(ValueError):
337
+ def __init__(self, details=None):
338
+ msg = 'Iterables have different lengths'
339
+ if details is not None:
340
+ msg += (': index 0 has length {}; index {} has length {}').format(
341
+ *details
342
+ )
343
+
344
+ super().__init__(msg)
345
+
346
+
347
+ def _zip_equal_generator(iterables):
348
+ for combo in zip_longest(*iterables, fillvalue=_marker):
349
+ for val in combo:
350
+ if val is _marker:
351
+ raise UnequalIterablesError()
352
+ yield combo
353
+
354
+
355
+ def _zip_equal(*iterables):
356
+ # Check whether the iterables are all the same size.
357
+ try:
358
+ first_size = len(iterables[0])
359
+ for i, it in enumerate(iterables[1:], 1):
360
+ size = len(it)
361
+ if size != first_size:
362
+ raise UnequalIterablesError(details=(first_size, i, size))
363
+ # All sizes are equal, we can use the built-in zip.
364
+ return zip(*iterables)
365
+ # If any one of the iterables didn't have a length, start reading
366
+ # them until one runs out.
367
+ except TypeError:
368
+ return _zip_equal_generator(iterables)
369
+
370
+
371
+ def grouper(iterable, n, incomplete='fill', fillvalue=None):
372
+ """Group elements from *iterable* into fixed-length groups of length *n*.
373
+
374
+ >>> list(grouper('ABCDEF', 3))
375
+ [('A', 'B', 'C'), ('D', 'E', 'F')]
376
+
377
+ The keyword arguments *incomplete* and *fillvalue* control what happens for
378
+ iterables whose length is not a multiple of *n*.
379
+
380
+ When *incomplete* is `'fill'`, the last group will contain instances of
381
+ *fillvalue*.
382
+
383
+ >>> list(grouper('ABCDEFG', 3, incomplete='fill', fillvalue='x'))
384
+ [('A', 'B', 'C'), ('D', 'E', 'F'), ('G', 'x', 'x')]
385
+
386
+ When *incomplete* is `'ignore'`, the last group will not be emitted.
387
+
388
+ >>> list(grouper('ABCDEFG', 3, incomplete='ignore', fillvalue='x'))
389
+ [('A', 'B', 'C'), ('D', 'E', 'F')]
390
+
391
+ When *incomplete* is `'strict'`, a subclass of `ValueError` will be raised.
392
+
393
+ >>> it = grouper('ABCDEFG', 3, incomplete='strict')
394
+ >>> list(it) # doctest: +IGNORE_EXCEPTION_DETAIL
395
+ Traceback (most recent call last):
396
+ ...
397
+ UnequalIterablesError
398
+
399
+ """
400
+ args = [iter(iterable)] * n
401
+ if incomplete == 'fill':
402
+ return zip_longest(*args, fillvalue=fillvalue)
403
+ if incomplete == 'strict':
404
+ return _zip_equal(*args)
405
+ if incomplete == 'ignore':
406
+ return zip(*args)
407
+ else:
408
+ raise ValueError('Expected fill, strict, or ignore')
409
+
410
+
411
+ def roundrobin(*iterables):
412
+ """Yields an item from each iterable, alternating between them.
413
+
414
+ >>> list(roundrobin('ABC', 'D', 'EF'))
415
+ ['A', 'D', 'E', 'B', 'F', 'C']
416
+
417
+ This function produces the same output as :func:`interleave_longest`, but
418
+ may perform better for some inputs (in particular when the number of
419
+ iterables is small).
420
+
421
+ """
422
+ # Algorithm credited to George Sakkis
423
+ iterators = map(iter, iterables)
424
+ for num_active in range(len(iterables), 0, -1):
425
+ iterators = cycle(islice(iterators, num_active))
426
+ yield from map(next, iterators)
427
+
428
+
429
+ def partition(pred, iterable):
430
+ """
431
+ Returns a 2-tuple of iterables derived from the input iterable.
432
+ The first yields the items that have ``pred(item) == False``.
433
+ The second yields the items that have ``pred(item) == True``.
434
+
435
+ >>> is_odd = lambda x: x % 2 != 0
436
+ >>> iterable = range(10)
437
+ >>> even_items, odd_items = partition(is_odd, iterable)
438
+ >>> list(even_items), list(odd_items)
439
+ ([0, 2, 4, 6, 8], [1, 3, 5, 7, 9])
440
+
441
+ If *pred* is None, :func:`bool` is used.
442
+
443
+ >>> iterable = [0, 1, False, True, '', ' ']
444
+ >>> false_items, true_items = partition(None, iterable)
445
+ >>> list(false_items), list(true_items)
446
+ ([0, False, ''], [1, True, ' '])
447
+
448
+ """
449
+ if pred is None:
450
+ pred = bool
451
+
452
+ t1, t2, p = tee(iterable, 3)
453
+ p1, p2 = tee(map(pred, p))
454
+ return (compress(t1, map(operator.not_, p1)), compress(t2, p2))
455
+
456
+
457
+ def powerset(iterable):
458
+ """Yields all possible subsets of the iterable.
459
+
460
+ >>> list(powerset([1, 2, 3]))
461
+ [(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
462
+
463
+ :func:`powerset` will operate on iterables that aren't :class:`set`
464
+ instances, so repeated elements in the input will produce repeated elements
465
+ in the output.
466
+
467
+ >>> seq = [1, 1, 0]
468
+ >>> list(powerset(seq))
469
+ [(), (1,), (1,), (0,), (1, 1), (1, 0), (1, 0), (1, 1, 0)]
470
+
471
+ For a variant that efficiently yields actual :class:`set` instances, see
472
+ :func:`powerset_of_sets`.
473
+ """
474
+ s = list(iterable)
475
+ return chain.from_iterable(combinations(s, r) for r in range(len(s) + 1))
476
+
477
+
478
+ def unique_everseen(iterable, key=None):
479
+ """
480
+ Yield unique elements, preserving order.
481
+
482
+ >>> list(unique_everseen('AAAABBBCCDAABBB'))
483
+ ['A', 'B', 'C', 'D']
484
+ >>> list(unique_everseen('ABBCcAD', str.lower))
485
+ ['A', 'B', 'C', 'D']
486
+
487
+ Sequences with a mix of hashable and unhashable items can be used.
488
+ The function will be slower (i.e., `O(n^2)`) for unhashable items.
489
+
490
+ Remember that ``list`` objects are unhashable - you can use the *key*
491
+ parameter to transform the list to a tuple (which is hashable) to
492
+ avoid a slowdown.
493
+
494
+ >>> iterable = ([1, 2], [2, 3], [1, 2])
495
+ >>> list(unique_everseen(iterable)) # Slow
496
+ [[1, 2], [2, 3]]
497
+ >>> list(unique_everseen(iterable, key=tuple)) # Faster
498
+ [[1, 2], [2, 3]]
499
+
500
+ Similarly, you may want to convert unhashable ``set`` objects with
501
+ ``key=frozenset``. For ``dict`` objects,
502
+ ``key=lambda x: frozenset(x.items())`` can be used.
503
+
504
+ """
505
+ seenset = set()
506
+ seenset_add = seenset.add
507
+ seenlist = []
508
+ seenlist_add = seenlist.append
509
+ use_key = key is not None
510
+
511
+ for element in iterable:
512
+ k = key(element) if use_key else element
513
+ try:
514
+ if k not in seenset:
515
+ seenset_add(k)
516
+ yield element
517
+ except TypeError:
518
+ if k not in seenlist:
519
+ seenlist_add(k)
520
+ yield element
521
+
522
+
523
+ def unique_justseen(iterable, key=None):
524
+ """Yields elements in order, ignoring serial duplicates
525
+
526
+ >>> list(unique_justseen('AAAABBBCCDAABBB'))
527
+ ['A', 'B', 'C', 'D', 'A', 'B']
528
+ >>> list(unique_justseen('ABBCcAD', str.lower))
529
+ ['A', 'B', 'C', 'A', 'D']
530
+
531
+ """
532
+ if key is None:
533
+ return map(operator.itemgetter(0), groupby(iterable))
534
+
535
+ return map(next, map(operator.itemgetter(1), groupby(iterable, key)))
536
+
537
+
538
+ def unique(iterable, key=None, reverse=False):
539
+ """Yields unique elements in sorted order.
540
+
541
+ >>> list(unique([[1, 2], [3, 4], [1, 2]]))
542
+ [[1, 2], [3, 4]]
543
+
544
+ *key* and *reverse* are passed to :func:`sorted`.
545
+
546
+ >>> list(unique('ABBcCAD', str.casefold))
547
+ ['A', 'B', 'c', 'D']
548
+ >>> list(unique('ABBcCAD', str.casefold, reverse=True))
549
+ ['D', 'c', 'B', 'A']
550
+
551
+ The elements in *iterable* need not be hashable, but they must be
552
+ comparable for sorting to work.
553
+ """
554
+ return unique_justseen(sorted(iterable, key=key, reverse=reverse), key=key)
555
+
556
+
557
+ def iter_except(func, exception, first=None):
558
+ """Yields results from a function repeatedly until an exception is raised.
559
+
560
+ Converts a call-until-exception interface to an iterator interface.
561
+ Like ``iter(func, sentinel)``, but uses an exception instead of a sentinel
562
+ to end the loop.
563
+
564
+ >>> l = [0, 1, 2]
565
+ >>> list(iter_except(l.pop, IndexError))
566
+ [2, 1, 0]
567
+
568
+ Multiple exceptions can be specified as a stopping condition:
569
+
570
+ >>> l = [1, 2, 3, '...', 4, 5, 6]
571
+ >>> list(iter_except(lambda: 1 + l.pop(), (IndexError, TypeError)))
572
+ [7, 6, 5]
573
+ >>> list(iter_except(lambda: 1 + l.pop(), (IndexError, TypeError)))
574
+ [4, 3, 2]
575
+ >>> list(iter_except(lambda: 1 + l.pop(), (IndexError, TypeError)))
576
+ []
577
+
578
+ """
579
+ try:
580
+ if first is not None:
581
+ yield first()
582
+ while 1:
583
+ yield func()
584
+ except exception:
585
+ pass
586
+
587
+
588
+ def first_true(iterable, default=None, pred=None):
589
+ """
590
+ Returns the first true value in the iterable.
591
+
592
+ If no true value is found, returns *default*
593
+
594
+ If *pred* is not None, returns the first item for which
595
+ ``pred(item) == True`` .
596
+
597
+ >>> first_true(range(10))
598
+ 1
599
+ >>> first_true(range(10), pred=lambda x: x > 5)
600
+ 6
601
+ >>> first_true(range(10), default='missing', pred=lambda x: x > 9)
602
+ 'missing'
603
+
604
+ """
605
+ return next(filter(pred, iterable), default)
606
+
607
+
608
+ def random_product(*args, repeat=1):
609
+ """Draw an item at random from each of the input iterables.
610
+
611
+ >>> random_product('abc', range(4), 'XYZ') # doctest:+SKIP
612
+ ('c', 3, 'Z')
613
+
614
+ If *repeat* is provided as a keyword argument, that many items will be
615
+ drawn from each iterable.
616
+
617
+ >>> random_product('abcd', range(4), repeat=2) # doctest:+SKIP
618
+ ('a', 2, 'd', 3)
619
+
620
+ This equivalent to taking a random selection from
621
+ ``itertools.product(*args, **kwarg)``.
622
+
623
+ """
624
+ pools = [tuple(pool) for pool in args] * repeat
625
+ return tuple(choice(pool) for pool in pools)
626
+
627
+
628
+ def random_permutation(iterable, r=None):
629
+ """Return a random *r* length permutation of the elements in *iterable*.
630
+
631
+ If *r* is not specified or is ``None``, then *r* defaults to the length of
632
+ *iterable*.
633
+
634
+ >>> random_permutation(range(5)) # doctest:+SKIP
635
+ (3, 4, 0, 1, 2)
636
+
637
+ This equivalent to taking a random selection from
638
+ ``itertools.permutations(iterable, r)``.
639
+
640
+ """
641
+ pool = tuple(iterable)
642
+ r = len(pool) if r is None else r
643
+ return tuple(sample(pool, r))
644
+
645
+
646
+ def random_combination(iterable, r):
647
+ """Return a random *r* length subsequence of the elements in *iterable*.
648
+
649
+ >>> random_combination(range(5), 3) # doctest:+SKIP
650
+ (2, 3, 4)
651
+
652
+ This equivalent to taking a random selection from
653
+ ``itertools.combinations(iterable, r)``.
654
+
655
+ """
656
+ pool = tuple(iterable)
657
+ n = len(pool)
658
+ indices = sorted(sample(range(n), r))
659
+ return tuple(pool[i] for i in indices)
660
+
661
+
662
+ def random_combination_with_replacement(iterable, r):
663
+ """Return a random *r* length subsequence of elements in *iterable*,
664
+ allowing individual elements to be repeated.
665
+
666
+ >>> random_combination_with_replacement(range(3), 5) # doctest:+SKIP
667
+ (0, 0, 1, 2, 2)
668
+
669
+ This equivalent to taking a random selection from
670
+ ``itertools.combinations_with_replacement(iterable, r)``.
671
+
672
+ """
673
+ pool = tuple(iterable)
674
+ n = len(pool)
675
+ indices = sorted(randrange(n) for i in range(r))
676
+ return tuple(pool[i] for i in indices)
677
+
678
+
679
+ def nth_combination(iterable, r, index):
680
+ """Equivalent to ``list(combinations(iterable, r))[index]``.
681
+
682
+ The subsequences of *iterable* that are of length *r* can be ordered
683
+ lexicographically. :func:`nth_combination` computes the subsequence at
684
+ sort position *index* directly, without computing the previous
685
+ subsequences.
686
+
687
+ >>> nth_combination(range(5), 3, 5)
688
+ (0, 3, 4)
689
+
690
+ ``ValueError`` will be raised If *r* is negative or greater than the length
691
+ of *iterable*.
692
+ ``IndexError`` will be raised if the given *index* is invalid.
693
+ """
694
+ pool = tuple(iterable)
695
+ n = len(pool)
696
+ if (r < 0) or (r > n):
697
+ raise ValueError
698
+
699
+ c = 1
700
+ k = min(r, n - r)
701
+ for i in range(1, k + 1):
702
+ c = c * (n - k + i) // i
703
+
704
+ if index < 0:
705
+ index += c
706
+
707
+ if (index < 0) or (index >= c):
708
+ raise IndexError
709
+
710
+ result = []
711
+ while r:
712
+ c, n, r = c * r // n, n - 1, r - 1
713
+ while index >= c:
714
+ index -= c
715
+ c, n = c * (n - r) // n, n - 1
716
+ result.append(pool[-1 - n])
717
+
718
+ return tuple(result)
719
+
720
+
721
+ def prepend(value, iterator):
722
+ """Yield *value*, followed by the elements in *iterator*.
723
+
724
+ >>> value = '0'
725
+ >>> iterator = ['1', '2', '3']
726
+ >>> list(prepend(value, iterator))
727
+ ['0', '1', '2', '3']
728
+
729
+ To prepend multiple values, see :func:`itertools.chain`
730
+ or :func:`value_chain`.
731
+
732
+ """
733
+ return chain([value], iterator)
734
+
735
+
736
+ def convolve(signal, kernel):
737
+ """Convolve the iterable *signal* with the iterable *kernel*.
738
+
739
+ >>> signal = (1, 2, 3, 4, 5)
740
+ >>> kernel = [3, 2, 1]
741
+ >>> list(convolve(signal, kernel))
742
+ [3, 8, 14, 20, 26, 14, 5]
743
+
744
+ Note: the input arguments are not interchangeable, as the *kernel*
745
+ is immediately consumed and stored.
746
+
747
+ """
748
+ # This implementation intentionally doesn't match the one in the itertools
749
+ # documentation.
750
+ kernel = tuple(kernel)[::-1]
751
+ n = len(kernel)
752
+ window = deque([0], maxlen=n) * n
753
+ for x in chain(signal, repeat(0, n - 1)):
754
+ window.append(x)
755
+ yield _sumprod(kernel, window)
756
+
757
+
758
+ def before_and_after(predicate, it):
759
+ """A variant of :func:`takewhile` that allows complete access to the
760
+ remainder of the iterator.
761
+
762
+ >>> it = iter('ABCdEfGhI')
763
+ >>> all_upper, remainder = before_and_after(str.isupper, it)
764
+ >>> ''.join(all_upper)
765
+ 'ABC'
766
+ >>> ''.join(remainder) # takewhile() would lose the 'd'
767
+ 'dEfGhI'
768
+
769
+ Note that the first iterator must be fully consumed before the second
770
+ iterator can generate valid results.
771
+ """
772
+ it = iter(it)
773
+ transition = []
774
+
775
+ def true_iterator():
776
+ for elem in it:
777
+ if predicate(elem):
778
+ yield elem
779
+ else:
780
+ transition.append(elem)
781
+ return
782
+
783
+ # Note: this is different from itertools recipes to allow nesting
784
+ # before_and_after remainders into before_and_after again. See tests
785
+ # for an example.
786
+ remainder_iterator = chain(transition, it)
787
+
788
+ return true_iterator(), remainder_iterator
789
+
790
+
791
+ def triplewise(iterable):
792
+ """Return overlapping triplets from *iterable*.
793
+
794
+ >>> list(triplewise('ABCDE'))
795
+ [('A', 'B', 'C'), ('B', 'C', 'D'), ('C', 'D', 'E')]
796
+
797
+ """
798
+ for (a, _), (b, c) in pairwise(pairwise(iterable)):
799
+ yield a, b, c
800
+
801
+
802
+ def sliding_window(iterable, n):
803
+ """Return a sliding window of width *n* over *iterable*.
804
+
805
+ >>> list(sliding_window(range(6), 4))
806
+ [(0, 1, 2, 3), (1, 2, 3, 4), (2, 3, 4, 5)]
807
+
808
+ If *iterable* has fewer than *n* items, then nothing is yielded:
809
+
810
+ >>> list(sliding_window(range(3), 4))
811
+ []
812
+
813
+ For a variant with more features, see :func:`windowed`.
814
+ """
815
+ it = iter(iterable)
816
+ window = deque(islice(it, n - 1), maxlen=n)
817
+ for x in it:
818
+ window.append(x)
819
+ yield tuple(window)
820
+
821
+
822
+ def subslices(iterable):
823
+ """Return all contiguous non-empty subslices of *iterable*.
824
+
825
+ >>> list(subslices('ABC'))
826
+ [['A'], ['A', 'B'], ['A', 'B', 'C'], ['B'], ['B', 'C'], ['C']]
827
+
828
+ This is similar to :func:`substrings`, but emits items in a different
829
+ order.
830
+ """
831
+ seq = list(iterable)
832
+ slices = starmap(slice, combinations(range(len(seq) + 1), 2))
833
+ return map(operator.getitem, repeat(seq), slices)
834
+
835
+
836
+ def polynomial_from_roots(roots):
837
+ """Compute a polynomial's coefficients from its roots.
838
+
839
+ >>> roots = [5, -4, 3] # (x - 5) * (x + 4) * (x - 3)
840
+ >>> polynomial_from_roots(roots) # x^3 - 4 * x^2 - 17 * x + 60
841
+ [1, -4, -17, 60]
842
+ """
843
+ factors = zip(repeat(1), map(operator.neg, roots))
844
+ return list(reduce(convolve, factors, [1]))
845
+
846
+
847
+ def iter_index(iterable, value, start=0, stop=None):
848
+ """Yield the index of each place in *iterable* that *value* occurs,
849
+ beginning with index *start* and ending before index *stop*.
850
+
851
+
852
+ >>> list(iter_index('AABCADEAF', 'A'))
853
+ [0, 1, 4, 7]
854
+ >>> list(iter_index('AABCADEAF', 'A', 1)) # start index is inclusive
855
+ [1, 4, 7]
856
+ >>> list(iter_index('AABCADEAF', 'A', 1, 7)) # stop index is not inclusive
857
+ [1, 4]
858
+
859
+ The behavior for non-scalar *values* matches the built-in Python types.
860
+
861
+ >>> list(iter_index('ABCDABCD', 'AB'))
862
+ [0, 4]
863
+ >>> list(iter_index([0, 1, 2, 3, 0, 1, 2, 3], [0, 1]))
864
+ []
865
+ >>> list(iter_index([[0, 1], [2, 3], [0, 1], [2, 3]], [0, 1]))
866
+ [0, 2]
867
+
868
+ See :func:`locate` for a more general means of finding the indexes
869
+ associated with particular values.
870
+
871
+ """
872
+ seq_index = getattr(iterable, 'index', None)
873
+ if seq_index is None:
874
+ # Slow path for general iterables
875
+ it = islice(iterable, start, stop)
876
+ for i, element in enumerate(it, start):
877
+ if element is value or element == value:
878
+ yield i
879
+ else:
880
+ # Fast path for sequences
881
+ stop = len(iterable) if stop is None else stop
882
+ i = start - 1
883
+ try:
884
+ while True:
885
+ yield (i := seq_index(value, i + 1, stop))
886
+ except ValueError:
887
+ pass
888
+
889
+
890
+ def sieve(n):
891
+ """Yield the primes less than n.
892
+
893
+ >>> list(sieve(30))
894
+ [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
895
+ """
896
+ if n > 2:
897
+ yield 2
898
+ start = 3
899
+ data = bytearray((0, 1)) * (n // 2)
900
+ limit = math.isqrt(n) + 1
901
+ for p in iter_index(data, 1, start, limit):
902
+ yield from iter_index(data, 1, start, p * p)
903
+ data[p * p : n : p + p] = bytes(len(range(p * p, n, p + p)))
904
+ start = p * p
905
+ yield from iter_index(data, 1, start)
906
+
907
+
908
+ def _batched(iterable, n, *, strict=False):
909
+ """Batch data into tuples of length *n*. If the number of items in
910
+ *iterable* is not divisible by *n*:
911
+ * The last batch will be shorter if *strict* is ``False``.
912
+ * :exc:`ValueError` will be raised if *strict* is ``True``.
913
+
914
+ >>> list(batched('ABCDEFG', 3))
915
+ [('A', 'B', 'C'), ('D', 'E', 'F'), ('G',)]
916
+
917
+ On Python 3.13 and above, this is an alias for :func:`itertools.batched`.
918
+ """
919
+ if n < 1:
920
+ raise ValueError('n must be at least one')
921
+ it = iter(iterable)
922
+ while batch := tuple(islice(it, n)):
923
+ if strict and len(batch) != n:
924
+ raise ValueError('batched(): incomplete batch')
925
+ yield batch
926
+
927
+
928
+ if hexversion >= 0x30D00A2:
929
+ from itertools import batched as itertools_batched
930
+
931
+ def batched(iterable, n, *, strict=False):
932
+ return itertools_batched(iterable, n, strict=strict)
933
+
934
+ else:
935
+ batched = _batched
936
+
937
+ batched.__doc__ = _batched.__doc__
938
+
939
+
940
+ def transpose(it):
941
+ """Swap the rows and columns of the input matrix.
942
+
943
+ >>> list(transpose([(1, 2, 3), (11, 22, 33)]))
944
+ [(1, 11), (2, 22), (3, 33)]
945
+
946
+ The caller should ensure that the dimensions of the input are compatible.
947
+ If the input is empty, no output will be produced.
948
+ """
949
+ return _zip_strict(*it)
950
+
951
+
952
+ def reshape(matrix, cols):
953
+ """Reshape the 2-D input *matrix* to have a column count given by *cols*.
954
+
955
+ >>> matrix = [(0, 1), (2, 3), (4, 5)]
956
+ >>> cols = 3
957
+ >>> list(reshape(matrix, cols))
958
+ [(0, 1, 2), (3, 4, 5)]
959
+ """
960
+ return batched(chain.from_iterable(matrix), cols)
961
+
962
+
963
+ def matmul(m1, m2):
964
+ """Multiply two matrices.
965
+
966
+ >>> list(matmul([(7, 5), (3, 5)], [(2, 5), (7, 9)]))
967
+ [(49, 80), (41, 60)]
968
+
969
+ The caller should ensure that the dimensions of the input matrices are
970
+ compatible with each other.
971
+ """
972
+ n = len(m2[0])
973
+ return batched(starmap(_sumprod, product(m1, transpose(m2))), n)
974
+
975
+
976
+ def factor(n):
977
+ """Yield the prime factors of n.
978
+
979
+ >>> list(factor(360))
980
+ [2, 2, 2, 3, 3, 5]
981
+ """
982
+ for prime in sieve(math.isqrt(n) + 1):
983
+ while not n % prime:
984
+ yield prime
985
+ n //= prime
986
+ if n == 1:
987
+ return
988
+ if n > 1:
989
+ yield n
990
+
991
+
992
+ def polynomial_eval(coefficients, x):
993
+ """Evaluate a polynomial at a specific value.
994
+
995
+ Example: evaluating x^3 - 4 * x^2 - 17 * x + 60 at x = 2.5:
996
+
997
+ >>> coefficients = [1, -4, -17, 60]
998
+ >>> x = 2.5
999
+ >>> polynomial_eval(coefficients, x)
1000
+ 8.125
1001
+ """
1002
+ n = len(coefficients)
1003
+ if n == 0:
1004
+ return x * 0 # coerce zero to the type of x
1005
+ powers = map(pow, repeat(x), reversed(range(n)))
1006
+ return _sumprod(coefficients, powers)
1007
+
1008
+
1009
+ def sum_of_squares(it):
1010
+ """Return the sum of the squares of the input values.
1011
+
1012
+ >>> sum_of_squares([10, 20, 30])
1013
+ 1400
1014
+ """
1015
+ return _sumprod(*tee(it))
1016
+
1017
+
1018
+ def polynomial_derivative(coefficients):
1019
+ """Compute the first derivative of a polynomial.
1020
+
1021
+ Example: evaluating the derivative of x^3 - 4 * x^2 - 17 * x + 60
1022
+
1023
+ >>> coefficients = [1, -4, -17, 60]
1024
+ >>> derivative_coefficients = polynomial_derivative(coefficients)
1025
+ >>> derivative_coefficients
1026
+ [3, -8, -17]
1027
+ """
1028
+ n = len(coefficients)
1029
+ powers = reversed(range(1, n))
1030
+ return list(map(operator.mul, coefficients, powers))
1031
+
1032
+
1033
+ def totient(n):
1034
+ """Return the count of natural numbers up to *n* that are coprime with *n*.
1035
+
1036
+ >>> totient(9)
1037
+ 6
1038
+ >>> totient(12)
1039
+ 4
1040
+ """
1041
+ # The itertools docs use unique_justseen instead of set; see
1042
+ # https://github.com/more-itertools/more-itertools/issues/823
1043
+ for p in set(factor(n)):
1044
+ n = n // p * (p - 1)
1045
+
1046
+ return n