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,622 @@
1
+ from __future__ import annotations
2
+
3
+ import functools
4
+ import importlib
5
+ import io
6
+ from email import message_from_string
7
+ from email.generator import Generator
8
+ from email.message import EmailMessage, Message
9
+ from email.parser import Parser
10
+ from email.policy import EmailPolicy
11
+ from inspect import cleandoc
12
+ from pathlib import Path
13
+ from unittest.mock import Mock
14
+
15
+ import jaraco.path
16
+ import pytest
17
+ from packaging.metadata import Metadata
18
+ from packaging.requirements import Requirement
19
+
20
+ from setuptools import _reqs, sic
21
+ from setuptools._core_metadata import rfc822_escape, rfc822_unescape
22
+ from setuptools.command.egg_info import egg_info, write_requirements
23
+ from setuptools.config import expand, setupcfg
24
+ from setuptools.dist import Distribution
25
+
26
+ from .config.downloads import retrieve_file, urls_from_file
27
+
28
+ EXAMPLE_BASE_INFO = dict(
29
+ name="package",
30
+ version="0.0.1",
31
+ author="Foo Bar",
32
+ author_email="foo@bar.net",
33
+ long_description="Long\ndescription",
34
+ description="Short description",
35
+ keywords=["one", "two"],
36
+ )
37
+
38
+
39
+ @pytest.mark.parametrize(
40
+ ("content", "result"),
41
+ (
42
+ pytest.param(
43
+ "Just a single line",
44
+ None,
45
+ id="single_line",
46
+ ),
47
+ pytest.param(
48
+ "Multiline\nText\nwithout\nextra indents\n",
49
+ None,
50
+ id="multiline",
51
+ ),
52
+ pytest.param(
53
+ "Multiline\n With\n\nadditional\n indentation",
54
+ None,
55
+ id="multiline_with_indentation",
56
+ ),
57
+ pytest.param(
58
+ " Leading whitespace",
59
+ "Leading whitespace",
60
+ id="remove_leading_whitespace",
61
+ ),
62
+ pytest.param(
63
+ " Leading whitespace\nIn\n Multiline comment",
64
+ "Leading whitespace\nIn\n Multiline comment",
65
+ id="remove_leading_whitespace_multiline",
66
+ ),
67
+ ),
68
+ )
69
+ def test_rfc822_unescape(content, result):
70
+ assert (result or content) == rfc822_unescape(rfc822_escape(content))
71
+
72
+
73
+ def __read_test_cases():
74
+ base = EXAMPLE_BASE_INFO
75
+
76
+ params = functools.partial(dict, base)
77
+
78
+ return [
79
+ ('Metadata version 1.0', params()),
80
+ (
81
+ 'Metadata Version 1.0: Short long description',
82
+ params(
83
+ long_description='Short long description',
84
+ ),
85
+ ),
86
+ (
87
+ 'Metadata version 1.1: Classifiers',
88
+ params(
89
+ classifiers=[
90
+ 'Programming Language :: Python :: 3',
91
+ 'Programming Language :: Python :: 3.7',
92
+ 'License :: OSI Approved :: MIT License',
93
+ ],
94
+ ),
95
+ ),
96
+ (
97
+ 'Metadata version 1.1: Download URL',
98
+ params(
99
+ download_url='https://example.com',
100
+ ),
101
+ ),
102
+ (
103
+ 'Metadata Version 1.2: Requires-Python',
104
+ params(
105
+ python_requires='>=3.7',
106
+ ),
107
+ ),
108
+ pytest.param(
109
+ 'Metadata Version 1.2: Project-Url',
110
+ params(project_urls=dict(Foo='https://example.bar')),
111
+ marks=pytest.mark.xfail(
112
+ reason="Issue #1578: project_urls not read",
113
+ ),
114
+ ),
115
+ (
116
+ 'Metadata Version 2.1: Long Description Content Type',
117
+ params(
118
+ long_description_content_type='text/x-rst; charset=UTF-8',
119
+ ),
120
+ ),
121
+ (
122
+ 'License',
123
+ params(
124
+ license='MIT',
125
+ ),
126
+ ),
127
+ (
128
+ 'License multiline',
129
+ params(
130
+ license='This is a long license \nover multiple lines',
131
+ ),
132
+ ),
133
+ pytest.param(
134
+ 'Metadata Version 2.1: Provides Extra',
135
+ params(provides_extras=['foo', 'bar']),
136
+ marks=pytest.mark.xfail(reason="provides_extras not read"),
137
+ ),
138
+ (
139
+ 'Missing author',
140
+ dict(
141
+ name='foo',
142
+ version='1.0.0',
143
+ author_email='snorri@sturluson.name',
144
+ ),
145
+ ),
146
+ (
147
+ 'Missing author e-mail',
148
+ dict(
149
+ name='foo',
150
+ version='1.0.0',
151
+ author='Snorri Sturluson',
152
+ ),
153
+ ),
154
+ (
155
+ 'Missing author and e-mail',
156
+ dict(
157
+ name='foo',
158
+ version='1.0.0',
159
+ ),
160
+ ),
161
+ (
162
+ 'Bypass normalized version',
163
+ dict(
164
+ name='foo',
165
+ version=sic('1.0.0a'),
166
+ ),
167
+ ),
168
+ ]
169
+
170
+
171
+ @pytest.mark.parametrize(("name", "attrs"), __read_test_cases())
172
+ def test_read_metadata(name, attrs):
173
+ dist = Distribution(attrs)
174
+ metadata_out = dist.metadata
175
+ dist_class = metadata_out.__class__
176
+
177
+ # Write to PKG_INFO and then load into a new metadata object
178
+ PKG_INFO = io.StringIO()
179
+
180
+ metadata_out.write_pkg_file(PKG_INFO)
181
+ PKG_INFO.seek(0)
182
+ pkg_info = PKG_INFO.read()
183
+ assert _valid_metadata(pkg_info)
184
+
185
+ PKG_INFO.seek(0)
186
+ metadata_in = dist_class()
187
+ metadata_in.read_pkg_file(PKG_INFO)
188
+
189
+ tested_attrs = [
190
+ ('name', dist_class.get_name),
191
+ ('version', dist_class.get_version),
192
+ ('author', dist_class.get_contact),
193
+ ('author_email', dist_class.get_contact_email),
194
+ ('metadata_version', dist_class.get_metadata_version),
195
+ ('provides', dist_class.get_provides),
196
+ ('description', dist_class.get_description),
197
+ ('long_description', dist_class.get_long_description),
198
+ ('download_url', dist_class.get_download_url),
199
+ ('keywords', dist_class.get_keywords),
200
+ ('platforms', dist_class.get_platforms),
201
+ ('obsoletes', dist_class.get_obsoletes),
202
+ ('requires', dist_class.get_requires),
203
+ ('classifiers', dist_class.get_classifiers),
204
+ ('project_urls', lambda s: getattr(s, 'project_urls', {})),
205
+ ('provides_extras', lambda s: getattr(s, 'provides_extras', {})),
206
+ ]
207
+
208
+ for attr, getter in tested_attrs:
209
+ assert getter(metadata_in) == getter(metadata_out)
210
+
211
+
212
+ def __maintainer_test_cases():
213
+ attrs = {"name": "package", "version": "1.0", "description": "xxx"}
214
+
215
+ def merge_dicts(d1, d2):
216
+ d1 = d1.copy()
217
+ d1.update(d2)
218
+
219
+ return d1
220
+
221
+ return [
222
+ ('No author, no maintainer', attrs.copy()),
223
+ (
224
+ 'Author (no e-mail), no maintainer',
225
+ merge_dicts(attrs, {'author': 'Author Name'}),
226
+ ),
227
+ (
228
+ 'Author (e-mail), no maintainer',
229
+ merge_dicts(
230
+ attrs, {'author': 'Author Name', 'author_email': 'author@name.com'}
231
+ ),
232
+ ),
233
+ (
234
+ 'No author, maintainer (no e-mail)',
235
+ merge_dicts(attrs, {'maintainer': 'Maintainer Name'}),
236
+ ),
237
+ (
238
+ 'No author, maintainer (e-mail)',
239
+ merge_dicts(
240
+ attrs,
241
+ {
242
+ 'maintainer': 'Maintainer Name',
243
+ 'maintainer_email': 'maintainer@name.com',
244
+ },
245
+ ),
246
+ ),
247
+ (
248
+ 'Author (no e-mail), Maintainer (no-email)',
249
+ merge_dicts(
250
+ attrs, {'author': 'Author Name', 'maintainer': 'Maintainer Name'}
251
+ ),
252
+ ),
253
+ (
254
+ 'Author (e-mail), Maintainer (e-mail)',
255
+ merge_dicts(
256
+ attrs,
257
+ {
258
+ 'author': 'Author Name',
259
+ 'author_email': 'author@name.com',
260
+ 'maintainer': 'Maintainer Name',
261
+ 'maintainer_email': 'maintainer@name.com',
262
+ },
263
+ ),
264
+ ),
265
+ (
266
+ 'No author (e-mail), no maintainer (e-mail)',
267
+ merge_dicts(
268
+ attrs,
269
+ {
270
+ 'author_email': 'author@name.com',
271
+ 'maintainer_email': 'maintainer@name.com',
272
+ },
273
+ ),
274
+ ),
275
+ ('Author unicode', merge_dicts(attrs, {'author': '鉄沢寛'})),
276
+ ('Maintainer unicode', merge_dicts(attrs, {'maintainer': 'Jan Łukasiewicz'})),
277
+ ]
278
+
279
+
280
+ @pytest.mark.parametrize(("name", "attrs"), __maintainer_test_cases())
281
+ def test_maintainer_author(name, attrs, tmpdir):
282
+ tested_keys = {
283
+ 'author': 'Author',
284
+ 'author_email': 'Author-email',
285
+ 'maintainer': 'Maintainer',
286
+ 'maintainer_email': 'Maintainer-email',
287
+ }
288
+
289
+ # Generate a PKG-INFO file
290
+ dist = Distribution(attrs)
291
+ fn = tmpdir.mkdir('pkg_info')
292
+ fn_s = str(fn)
293
+
294
+ dist.metadata.write_pkg_info(fn_s)
295
+
296
+ with open(str(fn.join('PKG-INFO')), 'r', encoding='utf-8') as f:
297
+ pkg_info = f.read()
298
+
299
+ assert _valid_metadata(pkg_info)
300
+
301
+ # Drop blank lines and strip lines from default description
302
+ raw_pkg_lines = pkg_info.splitlines()
303
+ pkg_lines = list(filter(None, raw_pkg_lines[:-2]))
304
+
305
+ pkg_lines_set = set(pkg_lines)
306
+
307
+ # Duplicate lines should not be generated
308
+ assert len(pkg_lines) == len(pkg_lines_set)
309
+
310
+ for fkey, dkey in tested_keys.items():
311
+ val = attrs.get(dkey, None)
312
+ if val is None:
313
+ for line in pkg_lines:
314
+ assert not line.startswith(fkey + ':')
315
+ else:
316
+ line = f'{fkey}: {val}'
317
+ assert line in pkg_lines_set
318
+
319
+
320
+ class TestParityWithMetadataFromPyPaWheel:
321
+ def base_example(self):
322
+ attrs = dict(
323
+ **EXAMPLE_BASE_INFO,
324
+ # Example with complex requirement definition
325
+ python_requires=">=3.8",
326
+ install_requires="""
327
+ packaging==23.2
328
+ more-itertools==8.8.0; extra == "other"
329
+ jaraco.text==3.7.0
330
+ importlib-resources==5.10.2; python_version<"3.8"
331
+ importlib-metadata==6.0.0 ; python_version<"3.8"
332
+ colorama>=0.4.4; sys_platform == "win32"
333
+ """,
334
+ extras_require={
335
+ "testing": """
336
+ pytest >= 6
337
+ pytest-checkdocs >= 2.4
338
+ tomli ; \\
339
+ # Using stdlib when possible
340
+ python_version < "3.11"
341
+ ini2toml[lite]>=0.9
342
+ """,
343
+ "other": [],
344
+ },
345
+ )
346
+ # Generate a PKG-INFO file using setuptools
347
+ return Distribution(attrs)
348
+
349
+ def test_requires_dist(self, tmp_path):
350
+ dist = self.base_example()
351
+ pkg_info = _get_pkginfo(dist)
352
+ assert _valid_metadata(pkg_info)
353
+
354
+ # Ensure Requires-Dist is present
355
+ expected = [
356
+ 'Metadata-Version:',
357
+ 'Requires-Python: >=3.8',
358
+ 'Provides-Extra: other',
359
+ 'Provides-Extra: testing',
360
+ 'Requires-Dist: tomli; python_version < "3.11" and extra == "testing"',
361
+ 'Requires-Dist: more-itertools==8.8.0; extra == "other"',
362
+ 'Requires-Dist: ini2toml[lite]>=0.9; extra == "testing"',
363
+ ]
364
+ for line in expected:
365
+ assert line in pkg_info
366
+
367
+ HERE = Path(__file__).parent
368
+ EXAMPLES_FILE = HERE / "config/setupcfg_examples.txt"
369
+
370
+ @pytest.fixture(params=[None, *urls_from_file(EXAMPLES_FILE)])
371
+ def dist(self, request, monkeypatch, tmp_path):
372
+ """Example of distribution with arbitrary configuration"""
373
+ monkeypatch.chdir(tmp_path)
374
+ monkeypatch.setattr(expand, "read_attr", Mock(return_value="0.42"))
375
+ monkeypatch.setattr(expand, "read_files", Mock(return_value="hello world"))
376
+ monkeypatch.setattr(
377
+ Distribution, "_finalize_license_files", Mock(return_value=None)
378
+ )
379
+ if request.param is None:
380
+ yield self.base_example()
381
+ else:
382
+ # Real-world usage
383
+ config = retrieve_file(request.param)
384
+ yield setupcfg.apply_configuration(Distribution({}), config)
385
+
386
+ @pytest.mark.uses_network
387
+ def test_equivalent_output(self, tmp_path, dist):
388
+ """Ensure output from setuptools is equivalent to the one from `pypa/wheel`"""
389
+ # Generate a METADATA file using pypa/wheel for comparison
390
+ wheel_metadata = importlib.import_module("wheel.metadata")
391
+ pkginfo_to_metadata = getattr(wheel_metadata, "pkginfo_to_metadata", None)
392
+
393
+ if pkginfo_to_metadata is None: # pragma: nocover
394
+ pytest.xfail(
395
+ "wheel.metadata.pkginfo_to_metadata is undefined, "
396
+ "(this is likely to be caused by API changes in pypa/wheel"
397
+ )
398
+
399
+ # Generate an simplified "egg-info" dir for pypa/wheel to convert
400
+ pkg_info = _get_pkginfo(dist)
401
+ egg_info_dir = tmp_path / "pkg.egg-info"
402
+ egg_info_dir.mkdir(parents=True)
403
+ (egg_info_dir / "PKG-INFO").write_text(pkg_info, encoding="utf-8")
404
+ write_requirements(egg_info(dist), egg_info_dir, egg_info_dir / "requires.txt")
405
+
406
+ # Get pypa/wheel generated METADATA but normalize requirements formatting
407
+ metadata_msg = pkginfo_to_metadata(egg_info_dir, egg_info_dir / "PKG-INFO")
408
+ metadata_str = _normalize_metadata(metadata_msg)
409
+ pkg_info_msg = message_from_string(pkg_info)
410
+ pkg_info_str = _normalize_metadata(pkg_info_msg)
411
+
412
+ # Compare setuptools PKG-INFO x pypa/wheel METADATA
413
+ assert metadata_str == pkg_info_str
414
+
415
+ # Make sure it parses/serializes well in pypa/wheel
416
+ _assert_roundtrip_message(pkg_info)
417
+
418
+
419
+ class TestPEP643:
420
+ STATIC_CONFIG = {
421
+ "setup.cfg": cleandoc(
422
+ """
423
+ [metadata]
424
+ name = package
425
+ version = 0.0.1
426
+ author = Foo Bar
427
+ author_email = foo@bar.net
428
+ long_description = Long
429
+ description
430
+ description = Short description
431
+ keywords = one, two
432
+ platforms = abcd
433
+ [options]
434
+ install_requires = requests
435
+ """
436
+ ),
437
+ "pyproject.toml": cleandoc(
438
+ """
439
+ [project]
440
+ name = "package"
441
+ version = "0.0.1"
442
+ authors = [
443
+ {name = "Foo Bar", email = "foo@bar.net"}
444
+ ]
445
+ description = "Short description"
446
+ readme = {text = "Long\\ndescription", content-type = "text/plain"}
447
+ keywords = ["one", "two"]
448
+ dependencies = ["requests"]
449
+ license = "AGPL-3.0-or-later"
450
+ [tool.setuptools]
451
+ provides = ["abcd"]
452
+ obsoletes = ["abcd"]
453
+ """
454
+ ),
455
+ }
456
+
457
+ @pytest.mark.parametrize("file", STATIC_CONFIG.keys())
458
+ def test_static_config_has_no_dynamic(self, file, tmpdir_cwd):
459
+ Path(file).write_text(self.STATIC_CONFIG[file], encoding="utf-8")
460
+ metadata = _get_metadata()
461
+ assert metadata.get_all("Dynamic") is None
462
+ assert metadata.get_all("dynamic") is None
463
+
464
+ @pytest.mark.parametrize("file", STATIC_CONFIG.keys())
465
+ @pytest.mark.parametrize(
466
+ "fields",
467
+ [
468
+ # Single dynamic field
469
+ {"requires-python": ("python_requires", ">=3.12")},
470
+ {"author-email": ("author_email", "snoopy@peanuts.com")},
471
+ {"keywords": ("keywords", ["hello", "world"])},
472
+ {"platform": ("platforms", ["abcd"])},
473
+ # Multiple dynamic fields
474
+ {
475
+ "summary": ("description", "hello world"),
476
+ "description": ("long_description", "bla bla bla bla"),
477
+ "requires-dist": ("install_requires", ["hello-world"]),
478
+ },
479
+ ],
480
+ )
481
+ def test_modified_fields_marked_as_dynamic(self, file, fields, tmpdir_cwd):
482
+ # We start with a static config
483
+ Path(file).write_text(self.STATIC_CONFIG[file], encoding="utf-8")
484
+ dist = _makedist()
485
+
486
+ # ... but then we simulate the effects of a plugin modifying the distribution
487
+ for attr, value in fields.values():
488
+ # `dist` and `dist.metadata` are complicated...
489
+ # Some attributes work when set on `dist`, others on `dist.metadata`...
490
+ # Here we set in both just in case (this also avoids calling `_finalize_*`)
491
+ setattr(dist, attr, value)
492
+ setattr(dist.metadata, attr, value)
493
+
494
+ # Then we should be able to list the modified fields as Dynamic
495
+ metadata = _get_metadata(dist)
496
+ assert set(metadata.get_all("Dynamic")) == set(fields)
497
+
498
+ @pytest.mark.parametrize(
499
+ "extra_toml",
500
+ [
501
+ "# Let setuptools autofill license-files",
502
+ "license-files = ['LICENSE*', 'AUTHORS*', 'NOTICE']",
503
+ ],
504
+ )
505
+ def test_license_files_dynamic(self, extra_toml, tmpdir_cwd):
506
+ # For simplicity (and for the time being) setuptools is not making
507
+ # any special handling to guarantee `License-File` is considered static.
508
+ # Instead we rely in the fact that, although suboptimal, it is OK to have
509
+ # it as dynamics, as per:
510
+ # https://github.com/pypa/setuptools/issues/4629#issuecomment-2331233677
511
+ files = {
512
+ "pyproject.toml": self.STATIC_CONFIG["pyproject.toml"].replace(
513
+ 'license = "AGPL-3.0-or-later"',
514
+ f"dynamic = ['license']\n{extra_toml}",
515
+ ),
516
+ "LICENSE.md": "--- mock license ---",
517
+ "NOTICE": "--- mock notice ---",
518
+ "AUTHORS.txt": "--- me ---",
519
+ }
520
+ # Sanity checks:
521
+ assert extra_toml in files["pyproject.toml"]
522
+ assert 'license = "AGPL-3.0-or-later"' not in extra_toml
523
+
524
+ jaraco.path.build(files)
525
+ dist = _makedist(license_expression="AGPL-3.0-or-later")
526
+ metadata = _get_metadata(dist)
527
+ assert set(metadata.get_all("Dynamic")) == {
528
+ 'license-file',
529
+ 'license-expression',
530
+ }
531
+ assert metadata.get("License-Expression") == "AGPL-3.0-or-later"
532
+ assert set(metadata.get_all("License-File")) == {
533
+ "NOTICE",
534
+ "AUTHORS.txt",
535
+ "LICENSE.md",
536
+ }
537
+
538
+
539
+ def _makedist(**attrs):
540
+ dist = Distribution(attrs)
541
+ dist.parse_config_files()
542
+ return dist
543
+
544
+
545
+ def _assert_roundtrip_message(metadata: str) -> None:
546
+ """Emulate the way wheel.bdist_wheel parses and regenerates the message,
547
+ then ensures the metadata generated by setuptools is compatible.
548
+ """
549
+ with io.StringIO(metadata) as buffer:
550
+ msg = Parser(EmailMessage).parse(buffer)
551
+
552
+ serialization_policy = EmailPolicy(
553
+ utf8=True,
554
+ mangle_from_=False,
555
+ max_line_length=0,
556
+ )
557
+ with io.BytesIO() as buffer:
558
+ out = io.TextIOWrapper(buffer, encoding="utf-8")
559
+ Generator(out, policy=serialization_policy).flatten(msg)
560
+ out.flush()
561
+ regenerated = buffer.getvalue()
562
+
563
+ raw_metadata = bytes(metadata, "utf-8")
564
+ # Normalise newlines to avoid test errors on Windows:
565
+ raw_metadata = b"\n".join(raw_metadata.splitlines())
566
+ regenerated = b"\n".join(regenerated.splitlines())
567
+ assert regenerated == raw_metadata
568
+
569
+
570
+ def _normalize_metadata(msg: Message) -> str:
571
+ """Allow equivalent metadata to be compared directly"""
572
+ # The main challenge regards the requirements and extras.
573
+ # Both setuptools and wheel already apply some level of normalization
574
+ # but they differ regarding which character is chosen, according to the
575
+ # following spec it should be "-":
576
+ # https://packaging.python.org/en/latest/specifications/name-normalization/
577
+
578
+ # Related issues:
579
+ # https://github.com/pypa/packaging/issues/845
580
+ # https://github.com/pypa/packaging/issues/644#issuecomment-2429813968
581
+
582
+ extras = {x.replace("_", "-"): x for x in msg.get_all("Provides-Extra", [])}
583
+ reqs = [
584
+ _normalize_req(req, extras)
585
+ for req in _reqs.parse(msg.get_all("Requires-Dist", []))
586
+ ]
587
+ del msg["Requires-Dist"]
588
+ del msg["Provides-Extra"]
589
+
590
+ # Ensure consistent ord
591
+ for req in sorted(reqs):
592
+ msg["Requires-Dist"] = req
593
+ for extra in sorted(extras):
594
+ msg["Provides-Extra"] = extra
595
+
596
+ # TODO: Handle lack of PEP 643 implementation in pypa/wheel?
597
+ del msg["Metadata-Version"]
598
+
599
+ return msg.as_string()
600
+
601
+
602
+ def _normalize_req(req: Requirement, extras: dict[str, str]) -> str:
603
+ """Allow equivalent requirement objects to be compared directly"""
604
+ as_str = str(req).replace(req.name, req.name.replace("_", "-"))
605
+ for norm, orig in extras.items():
606
+ as_str = as_str.replace(orig, norm)
607
+ return as_str
608
+
609
+
610
+ def _get_pkginfo(dist: Distribution):
611
+ with io.StringIO() as fp:
612
+ dist.metadata.write_pkg_file(fp)
613
+ return fp.getvalue()
614
+
615
+
616
+ def _get_metadata(dist: Distribution | None = None):
617
+ return message_from_string(_get_pkginfo(dist or _makedist()))
618
+
619
+
620
+ def _valid_metadata(text: str) -> bool:
621
+ metadata = Metadata.from_email(text, validate=True) # can raise exceptions
622
+ return metadata is not None
@@ -0,0 +1,15 @@
1
+ import sys
2
+
3
+ from setuptools import depends
4
+
5
+
6
+ class TestGetModuleConstant:
7
+ def test_basic(self):
8
+ """
9
+ Invoke get_module_constant on a module in
10
+ the test package.
11
+ """
12
+ mod_name = 'setuptools.tests.mod_with_constant'
13
+ val = depends.get_module_constant(mod_name, 'value')
14
+ assert val == 'three, sir!'
15
+ assert 'setuptools.tests.mod_with_constant' not in sys.modules