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,236 @@
1
+ """distutils.file_util
2
+
3
+ Utility functions for operating on single files.
4
+ """
5
+
6
+ import os
7
+
8
+ from ._log import log
9
+ from .errors import DistutilsFileError
10
+
11
+ # for generating verbose output in 'copy_file()'
12
+ _copy_action = {None: 'copying', 'hard': 'hard linking', 'sym': 'symbolically linking'}
13
+
14
+
15
+ def _copy_file_contents(src, dst, buffer_size=16 * 1024): # noqa: C901
16
+ """Copy the file 'src' to 'dst'; both must be filenames. Any error
17
+ opening either file, reading from 'src', or writing to 'dst', raises
18
+ DistutilsFileError. Data is read/written in chunks of 'buffer_size'
19
+ bytes (default 16k). No attempt is made to handle anything apart from
20
+ regular files.
21
+ """
22
+ # Stolen from shutil module in the standard library, but with
23
+ # custom error-handling added.
24
+ fsrc = None
25
+ fdst = None
26
+ try:
27
+ try:
28
+ fsrc = open(src, 'rb')
29
+ except OSError as e:
30
+ raise DistutilsFileError(f"could not open '{src}': {e.strerror}")
31
+
32
+ if os.path.exists(dst):
33
+ try:
34
+ os.unlink(dst)
35
+ except OSError as e:
36
+ raise DistutilsFileError(f"could not delete '{dst}': {e.strerror}")
37
+
38
+ try:
39
+ fdst = open(dst, 'wb')
40
+ except OSError as e:
41
+ raise DistutilsFileError(f"could not create '{dst}': {e.strerror}")
42
+
43
+ while True:
44
+ try:
45
+ buf = fsrc.read(buffer_size)
46
+ except OSError as e:
47
+ raise DistutilsFileError(f"could not read from '{src}': {e.strerror}")
48
+
49
+ if not buf:
50
+ break
51
+
52
+ try:
53
+ fdst.write(buf)
54
+ except OSError as e:
55
+ raise DistutilsFileError(f"could not write to '{dst}': {e.strerror}")
56
+ finally:
57
+ if fdst:
58
+ fdst.close()
59
+ if fsrc:
60
+ fsrc.close()
61
+
62
+
63
+ def copy_file( # noqa: C901
64
+ src,
65
+ dst,
66
+ preserve_mode=True,
67
+ preserve_times=True,
68
+ update=False,
69
+ link=None,
70
+ verbose=True,
71
+ dry_run=False,
72
+ ):
73
+ """Copy a file 'src' to 'dst'. If 'dst' is a directory, then 'src' is
74
+ copied there with the same name; otherwise, it must be a filename. (If
75
+ the file exists, it will be ruthlessly clobbered.) If 'preserve_mode'
76
+ is true (the default), the file's mode (type and permission bits, or
77
+ whatever is analogous on the current platform) is copied. If
78
+ 'preserve_times' is true (the default), the last-modified and
79
+ last-access times are copied as well. If 'update' is true, 'src' will
80
+ only be copied if 'dst' does not exist, or if 'dst' does exist but is
81
+ older than 'src'.
82
+
83
+ 'link' allows you to make hard links (os.link) or symbolic links
84
+ (os.symlink) instead of copying: set it to "hard" or "sym"; if it is
85
+ None (the default), files are copied. Don't set 'link' on systems that
86
+ don't support it: 'copy_file()' doesn't check if hard or symbolic
87
+ linking is available. If hardlink fails, falls back to
88
+ _copy_file_contents().
89
+
90
+ Under Mac OS, uses the native file copy function in macostools; on
91
+ other systems, uses '_copy_file_contents()' to copy file contents.
92
+
93
+ Return a tuple (dest_name, copied): 'dest_name' is the actual name of
94
+ the output file, and 'copied' is true if the file was copied (or would
95
+ have been copied, if 'dry_run' true).
96
+ """
97
+ # XXX if the destination file already exists, we clobber it if
98
+ # copying, but blow up if linking. Hmmm. And I don't know what
99
+ # macostools.copyfile() does. Should definitely be consistent, and
100
+ # should probably blow up if destination exists and we would be
101
+ # changing it (ie. it's not already a hard/soft link to src OR
102
+ # (not update) and (src newer than dst).
103
+
104
+ from distutils._modified import newer
105
+ from stat import S_IMODE, ST_ATIME, ST_MODE, ST_MTIME
106
+
107
+ if not os.path.isfile(src):
108
+ raise DistutilsFileError(
109
+ f"can't copy '{src}': doesn't exist or not a regular file"
110
+ )
111
+
112
+ if os.path.isdir(dst):
113
+ dir = dst
114
+ dst = os.path.join(dst, os.path.basename(src))
115
+ else:
116
+ dir = os.path.dirname(dst)
117
+
118
+ if update and not newer(src, dst):
119
+ if verbose >= 1:
120
+ log.debug("not copying %s (output up-to-date)", src)
121
+ return (dst, False)
122
+
123
+ try:
124
+ action = _copy_action[link]
125
+ except KeyError:
126
+ raise ValueError(f"invalid value '{link}' for 'link' argument")
127
+
128
+ if verbose >= 1:
129
+ if os.path.basename(dst) == os.path.basename(src):
130
+ log.info("%s %s -> %s", action, src, dir)
131
+ else:
132
+ log.info("%s %s -> %s", action, src, dst)
133
+
134
+ if dry_run:
135
+ return (dst, True)
136
+
137
+ # If linking (hard or symbolic), use the appropriate system call
138
+ # (Unix only, of course, but that's the caller's responsibility)
139
+ elif link == 'hard':
140
+ if not (os.path.exists(dst) and os.path.samefile(src, dst)):
141
+ try:
142
+ os.link(src, dst)
143
+ except OSError:
144
+ # If hard linking fails, fall back on copying file
145
+ # (some special filesystems don't support hard linking
146
+ # even under Unix, see issue #8876).
147
+ pass
148
+ else:
149
+ return (dst, True)
150
+ elif link == 'sym':
151
+ if not (os.path.exists(dst) and os.path.samefile(src, dst)):
152
+ os.symlink(src, dst)
153
+ return (dst, True)
154
+
155
+ # Otherwise (non-Mac, not linking), copy the file contents and
156
+ # (optionally) copy the times and mode.
157
+ _copy_file_contents(src, dst)
158
+ if preserve_mode or preserve_times:
159
+ st = os.stat(src)
160
+
161
+ # According to David Ascher <da@ski.org>, utime() should be done
162
+ # before chmod() (at least under NT).
163
+ if preserve_times:
164
+ os.utime(dst, (st[ST_ATIME], st[ST_MTIME]))
165
+ if preserve_mode:
166
+ os.chmod(dst, S_IMODE(st[ST_MODE]))
167
+
168
+ return (dst, True)
169
+
170
+
171
+ # XXX I suspect this is Unix-specific -- need porting help!
172
+ def move_file(src, dst, verbose=True, dry_run=False): # noqa: C901
173
+ """Move a file 'src' to 'dst'. If 'dst' is a directory, the file will
174
+ be moved into it with the same name; otherwise, 'src' is just renamed
175
+ to 'dst'. Return the new full name of the file.
176
+
177
+ Handles cross-device moves on Unix using 'copy_file()'. What about
178
+ other systems???
179
+ """
180
+ import errno
181
+ from os.path import basename, dirname, exists, isdir, isfile
182
+
183
+ if verbose >= 1:
184
+ log.info("moving %s -> %s", src, dst)
185
+
186
+ if dry_run:
187
+ return dst
188
+
189
+ if not isfile(src):
190
+ raise DistutilsFileError(f"can't move '{src}': not a regular file")
191
+
192
+ if isdir(dst):
193
+ dst = os.path.join(dst, basename(src))
194
+ elif exists(dst):
195
+ raise DistutilsFileError(
196
+ f"can't move '{src}': destination '{dst}' already exists"
197
+ )
198
+
199
+ if not isdir(dirname(dst)):
200
+ raise DistutilsFileError(
201
+ f"can't move '{src}': destination '{dst}' not a valid path"
202
+ )
203
+
204
+ copy_it = False
205
+ try:
206
+ os.rename(src, dst)
207
+ except OSError as e:
208
+ (num, msg) = e.args
209
+ if num == errno.EXDEV:
210
+ copy_it = True
211
+ else:
212
+ raise DistutilsFileError(f"couldn't move '{src}' to '{dst}': {msg}")
213
+
214
+ if copy_it:
215
+ copy_file(src, dst, verbose=verbose)
216
+ try:
217
+ os.unlink(src)
218
+ except OSError as e:
219
+ (num, msg) = e.args
220
+ try:
221
+ os.unlink(dst)
222
+ except OSError:
223
+ pass
224
+ raise DistutilsFileError(
225
+ f"couldn't move '{src}' to '{dst}' by copy/delete: "
226
+ f"delete '{src}' failed: {msg}"
227
+ )
228
+ return dst
229
+
230
+
231
+ def write_file(filename, contents):
232
+ """Create a file with the specified name and write 'contents' (a
233
+ sequence of strings without line terminators) to it.
234
+ """
235
+ with open(filename, 'w', encoding='utf-8') as f:
236
+ f.writelines(line + '\n' for line in contents)
@@ -0,0 +1,431 @@
1
+ """distutils.filelist
2
+
3
+ Provides the FileList class, used for poking about the filesystem
4
+ and building lists of files.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import fnmatch
10
+ import functools
11
+ import os
12
+ import re
13
+ from collections.abc import Iterable
14
+ from typing import Literal, overload
15
+
16
+ from ._log import log
17
+ from .errors import DistutilsInternalError, DistutilsTemplateError
18
+ from .util import convert_path
19
+
20
+
21
+ class FileList:
22
+ """A list of files built by on exploring the filesystem and filtered by
23
+ applying various patterns to what we find there.
24
+
25
+ Instance attributes:
26
+ dir
27
+ directory from which files will be taken -- only used if
28
+ 'allfiles' not supplied to constructor
29
+ files
30
+ list of filenames currently being built/filtered/manipulated
31
+ allfiles
32
+ complete list of files under consideration (ie. without any
33
+ filtering applied)
34
+ """
35
+
36
+ def __init__(self, warn: object = None, debug_print: object = None) -> None:
37
+ # ignore argument to FileList, but keep them for backwards
38
+ # compatibility
39
+ self.allfiles: Iterable[str] | None = None
40
+ self.files: list[str] = []
41
+
42
+ def set_allfiles(self, allfiles: Iterable[str]) -> None:
43
+ self.allfiles = allfiles
44
+
45
+ def findall(self, dir: str | os.PathLike[str] = os.curdir) -> None:
46
+ self.allfiles = findall(dir)
47
+
48
+ def debug_print(self, msg: object) -> None:
49
+ """Print 'msg' to stdout if the global DEBUG (taken from the
50
+ DISTUTILS_DEBUG environment variable) flag is true.
51
+ """
52
+ from distutils.debug import DEBUG
53
+
54
+ if DEBUG:
55
+ print(msg)
56
+
57
+ # Collection methods
58
+
59
+ def append(self, item: str) -> None:
60
+ self.files.append(item)
61
+
62
+ def extend(self, items: Iterable[str]) -> None:
63
+ self.files.extend(items)
64
+
65
+ def sort(self) -> None:
66
+ # Not a strict lexical sort!
67
+ sortable_files = sorted(map(os.path.split, self.files))
68
+ self.files = []
69
+ for sort_tuple in sortable_files:
70
+ self.files.append(os.path.join(*sort_tuple))
71
+
72
+ # Other miscellaneous utility methods
73
+
74
+ def remove_duplicates(self) -> None:
75
+ # Assumes list has been sorted!
76
+ for i in range(len(self.files) - 1, 0, -1):
77
+ if self.files[i] == self.files[i - 1]:
78
+ del self.files[i]
79
+
80
+ # "File template" methods
81
+
82
+ def _parse_template_line(self, line):
83
+ words = line.split()
84
+ action = words[0]
85
+
86
+ patterns = dir = dir_pattern = None
87
+
88
+ if action in ('include', 'exclude', 'global-include', 'global-exclude'):
89
+ if len(words) < 2:
90
+ raise DistutilsTemplateError(
91
+ f"'{action}' expects <pattern1> <pattern2> ..."
92
+ )
93
+ patterns = [convert_path(w) for w in words[1:]]
94
+ elif action in ('recursive-include', 'recursive-exclude'):
95
+ if len(words) < 3:
96
+ raise DistutilsTemplateError(
97
+ f"'{action}' expects <dir> <pattern1> <pattern2> ..."
98
+ )
99
+ dir = convert_path(words[1])
100
+ patterns = [convert_path(w) for w in words[2:]]
101
+ elif action in ('graft', 'prune'):
102
+ if len(words) != 2:
103
+ raise DistutilsTemplateError(
104
+ f"'{action}' expects a single <dir_pattern>"
105
+ )
106
+ dir_pattern = convert_path(words[1])
107
+ else:
108
+ raise DistutilsTemplateError(f"unknown action '{action}'")
109
+
110
+ return (action, patterns, dir, dir_pattern)
111
+
112
+ def process_template_line(self, line: str) -> None: # noqa: C901
113
+ # Parse the line: split it up, make sure the right number of words
114
+ # is there, and return the relevant words. 'action' is always
115
+ # defined: it's the first word of the line. Which of the other
116
+ # three are defined depends on the action; it'll be either
117
+ # patterns, (dir and patterns), or (dir_pattern).
118
+ (action, patterns, dir, dir_pattern) = self._parse_template_line(line)
119
+
120
+ # OK, now we know that the action is valid and we have the
121
+ # right number of words on the line for that action -- so we
122
+ # can proceed with minimal error-checking.
123
+ if action == 'include':
124
+ self.debug_print("include " + ' '.join(patterns))
125
+ for pattern in patterns:
126
+ if not self.include_pattern(pattern, anchor=True):
127
+ log.warning("warning: no files found matching '%s'", pattern)
128
+
129
+ elif action == 'exclude':
130
+ self.debug_print("exclude " + ' '.join(patterns))
131
+ for pattern in patterns:
132
+ if not self.exclude_pattern(pattern, anchor=True):
133
+ log.warning(
134
+ "warning: no previously-included files found matching '%s'",
135
+ pattern,
136
+ )
137
+
138
+ elif action == 'global-include':
139
+ self.debug_print("global-include " + ' '.join(patterns))
140
+ for pattern in patterns:
141
+ if not self.include_pattern(pattern, anchor=False):
142
+ log.warning(
143
+ (
144
+ "warning: no files found matching '%s' "
145
+ "anywhere in distribution"
146
+ ),
147
+ pattern,
148
+ )
149
+
150
+ elif action == 'global-exclude':
151
+ self.debug_print("global-exclude " + ' '.join(patterns))
152
+ for pattern in patterns:
153
+ if not self.exclude_pattern(pattern, anchor=False):
154
+ log.warning(
155
+ (
156
+ "warning: no previously-included files matching "
157
+ "'%s' found anywhere in distribution"
158
+ ),
159
+ pattern,
160
+ )
161
+
162
+ elif action == 'recursive-include':
163
+ self.debug_print("recursive-include {} {}".format(dir, ' '.join(patterns)))
164
+ for pattern in patterns:
165
+ if not self.include_pattern(pattern, prefix=dir):
166
+ msg = "warning: no files found matching '%s' under directory '%s'"
167
+ log.warning(msg, pattern, dir)
168
+
169
+ elif action == 'recursive-exclude':
170
+ self.debug_print("recursive-exclude {} {}".format(dir, ' '.join(patterns)))
171
+ for pattern in patterns:
172
+ if not self.exclude_pattern(pattern, prefix=dir):
173
+ log.warning(
174
+ (
175
+ "warning: no previously-included files matching "
176
+ "'%s' found under directory '%s'"
177
+ ),
178
+ pattern,
179
+ dir,
180
+ )
181
+
182
+ elif action == 'graft':
183
+ self.debug_print("graft " + dir_pattern)
184
+ if not self.include_pattern(None, prefix=dir_pattern):
185
+ log.warning("warning: no directories found matching '%s'", dir_pattern)
186
+
187
+ elif action == 'prune':
188
+ self.debug_print("prune " + dir_pattern)
189
+ if not self.exclude_pattern(None, prefix=dir_pattern):
190
+ log.warning(
191
+ ("no previously-included directories found matching '%s'"),
192
+ dir_pattern,
193
+ )
194
+ else:
195
+ raise DistutilsInternalError(
196
+ f"this cannot happen: invalid action '{action}'"
197
+ )
198
+
199
+ # Filtering/selection methods
200
+ @overload
201
+ def include_pattern(
202
+ self,
203
+ pattern: str,
204
+ anchor: bool = True,
205
+ prefix: str | None = None,
206
+ is_regex: Literal[False] = False,
207
+ ) -> bool: ...
208
+ @overload
209
+ def include_pattern(
210
+ self,
211
+ pattern: str | re.Pattern[str],
212
+ anchor: bool = True,
213
+ prefix: str | None = None,
214
+ *,
215
+ is_regex: Literal[True],
216
+ ) -> bool: ...
217
+ @overload
218
+ def include_pattern(
219
+ self,
220
+ pattern: str | re.Pattern[str],
221
+ anchor: bool,
222
+ prefix: str | None,
223
+ is_regex: Literal[True],
224
+ ) -> bool: ...
225
+ def include_pattern(
226
+ self,
227
+ pattern: str | re.Pattern,
228
+ anchor: bool = True,
229
+ prefix: str | None = None,
230
+ is_regex: bool = False,
231
+ ) -> bool:
232
+ """Select strings (presumably filenames) from 'self.files' that
233
+ match 'pattern', a Unix-style wildcard (glob) pattern. Patterns
234
+ are not quite the same as implemented by the 'fnmatch' module: '*'
235
+ and '?' match non-special characters, where "special" is platform-
236
+ dependent: slash on Unix; colon, slash, and backslash on
237
+ DOS/Windows; and colon on Mac OS.
238
+
239
+ If 'anchor' is true (the default), then the pattern match is more
240
+ stringent: "*.py" will match "foo.py" but not "foo/bar.py". If
241
+ 'anchor' is false, both of these will match.
242
+
243
+ If 'prefix' is supplied, then only filenames starting with 'prefix'
244
+ (itself a pattern) and ending with 'pattern', with anything in between
245
+ them, will match. 'anchor' is ignored in this case.
246
+
247
+ If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and
248
+ 'pattern' is assumed to be either a string containing a regex or a
249
+ regex object -- no translation is done, the regex is just compiled
250
+ and used as-is.
251
+
252
+ Selected strings will be added to self.files.
253
+
254
+ Return True if files are found, False otherwise.
255
+ """
256
+ # XXX docstring lying about what the special chars are?
257
+ files_found = False
258
+ pattern_re = translate_pattern(pattern, anchor, prefix, is_regex)
259
+ self.debug_print(f"include_pattern: applying regex r'{pattern_re.pattern}'")
260
+
261
+ # delayed loading of allfiles list
262
+ if self.allfiles is None:
263
+ self.findall()
264
+
265
+ for name in self.allfiles:
266
+ if pattern_re.search(name):
267
+ self.debug_print(" adding " + name)
268
+ self.files.append(name)
269
+ files_found = True
270
+ return files_found
271
+
272
+ @overload
273
+ def exclude_pattern(
274
+ self,
275
+ pattern: str,
276
+ anchor: bool = True,
277
+ prefix: str | None = None,
278
+ is_regex: Literal[False] = False,
279
+ ) -> bool: ...
280
+ @overload
281
+ def exclude_pattern(
282
+ self,
283
+ pattern: str | re.Pattern[str],
284
+ anchor: bool = True,
285
+ prefix: str | None = None,
286
+ *,
287
+ is_regex: Literal[True],
288
+ ) -> bool: ...
289
+ @overload
290
+ def exclude_pattern(
291
+ self,
292
+ pattern: str | re.Pattern[str],
293
+ anchor: bool,
294
+ prefix: str | None,
295
+ is_regex: Literal[True],
296
+ ) -> bool: ...
297
+ def exclude_pattern(
298
+ self,
299
+ pattern: str | re.Pattern,
300
+ anchor: bool = True,
301
+ prefix: str | None = None,
302
+ is_regex: bool = False,
303
+ ) -> bool:
304
+ """Remove strings (presumably filenames) from 'files' that match
305
+ 'pattern'. Other parameters are the same as for
306
+ 'include_pattern()', above.
307
+ The list 'self.files' is modified in place.
308
+ Return True if files are found, False otherwise.
309
+ """
310
+ files_found = False
311
+ pattern_re = translate_pattern(pattern, anchor, prefix, is_regex)
312
+ self.debug_print(f"exclude_pattern: applying regex r'{pattern_re.pattern}'")
313
+ for i in range(len(self.files) - 1, -1, -1):
314
+ if pattern_re.search(self.files[i]):
315
+ self.debug_print(" removing " + self.files[i])
316
+ del self.files[i]
317
+ files_found = True
318
+ return files_found
319
+
320
+
321
+ # Utility functions
322
+
323
+
324
+ def _find_all_simple(path):
325
+ """
326
+ Find all files under 'path'
327
+ """
328
+ all_unique = _UniqueDirs.filter(os.walk(path, followlinks=True))
329
+ results = (
330
+ os.path.join(base, file) for base, dirs, files in all_unique for file in files
331
+ )
332
+ return filter(os.path.isfile, results)
333
+
334
+
335
+ class _UniqueDirs(set):
336
+ """
337
+ Exclude previously-seen dirs from walk results,
338
+ avoiding infinite recursion.
339
+ Ref https://bugs.python.org/issue44497.
340
+ """
341
+
342
+ def __call__(self, walk_item):
343
+ """
344
+ Given an item from an os.walk result, determine
345
+ if the item represents a unique dir for this instance
346
+ and if not, prevent further traversal.
347
+ """
348
+ base, dirs, files = walk_item
349
+ stat = os.stat(base)
350
+ candidate = stat.st_dev, stat.st_ino
351
+ found = candidate in self
352
+ if found:
353
+ del dirs[:]
354
+ self.add(candidate)
355
+ return not found
356
+
357
+ @classmethod
358
+ def filter(cls, items):
359
+ return filter(cls(), items)
360
+
361
+
362
+ def findall(dir: str | os.PathLike[str] = os.curdir):
363
+ """
364
+ Find all files under 'dir' and return the list of full filenames.
365
+ Unless dir is '.', return full filenames with dir prepended.
366
+ """
367
+ files = _find_all_simple(dir)
368
+ if dir == os.curdir:
369
+ make_rel = functools.partial(os.path.relpath, start=dir)
370
+ files = map(make_rel, files)
371
+ return list(files)
372
+
373
+
374
+ def glob_to_re(pattern):
375
+ """Translate a shell-like glob pattern to a regular expression; return
376
+ a string containing the regex. Differs from 'fnmatch.translate()' in
377
+ that '*' does not match "special characters" (which are
378
+ platform-specific).
379
+ """
380
+ pattern_re = fnmatch.translate(pattern)
381
+
382
+ # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which
383
+ # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix,
384
+ # and by extension they shouldn't match such "special characters" under
385
+ # any OS. So change all non-escaped dots in the RE to match any
386
+ # character except the special characters (currently: just os.sep).
387
+ sep = os.sep
388
+ if os.sep == '\\':
389
+ # we're using a regex to manipulate a regex, so we need
390
+ # to escape the backslash twice
391
+ sep = r'\\\\'
392
+ escaped = rf'\1[^{sep}]'
393
+ pattern_re = re.sub(r'((?<!\\)(\\\\)*)\.', escaped, pattern_re)
394
+ return pattern_re
395
+
396
+
397
+ def translate_pattern(pattern, anchor=True, prefix=None, is_regex=False):
398
+ """Translate a shell-like wildcard pattern to a compiled regular
399
+ expression. Return the compiled regex. If 'is_regex' true,
400
+ then 'pattern' is directly compiled to a regex (if it's a string)
401
+ or just returned as-is (assumes it's a regex object).
402
+ """
403
+ if is_regex:
404
+ if isinstance(pattern, str):
405
+ return re.compile(pattern)
406
+ else:
407
+ return pattern
408
+
409
+ # ditch start and end characters
410
+ start, _, end = glob_to_re('_').partition('_')
411
+
412
+ if pattern:
413
+ pattern_re = glob_to_re(pattern)
414
+ assert pattern_re.startswith(start) and pattern_re.endswith(end)
415
+ else:
416
+ pattern_re = ''
417
+
418
+ if prefix is not None:
419
+ prefix_re = glob_to_re(prefix)
420
+ assert prefix_re.startswith(start) and prefix_re.endswith(end)
421
+ prefix_re = prefix_re[len(start) : len(prefix_re) - len(end)]
422
+ sep = os.sep
423
+ if os.sep == '\\':
424
+ sep = r'\\'
425
+ pattern_re = pattern_re[len(start) : len(pattern_re) - len(end)]
426
+ pattern_re = rf'{start}\A{prefix_re}{sep}.*{pattern_re}{end}'
427
+ else: # no prefix -- respect anchor flag
428
+ if anchor:
429
+ pattern_re = rf'{start}\A{pattern_re[len(start) :]}'
430
+
431
+ return re.compile(pattern_re)