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,780 @@
1
+ """
2
+ Load setuptools configuration from ``setup.cfg`` files.
3
+
4
+ **API will be made private in the future**
5
+
6
+ To read project metadata, consider using
7
+ ``build.util.project_wheel_metadata`` (https://pypi.org/project/build/).
8
+ For simple scenarios, you can also try parsing the file directly
9
+ with the help of ``configparser``.
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ import contextlib
15
+ import functools
16
+ import os
17
+ from collections import defaultdict
18
+ from collections.abc import Iterable, Iterator
19
+ from functools import partial, wraps
20
+ from typing import TYPE_CHECKING, Any, Callable, ClassVar, Generic, TypeVar, cast
21
+
22
+ from packaging.markers import default_environment as marker_env
23
+ from packaging.requirements import InvalidRequirement, Requirement
24
+ from packaging.version import InvalidVersion, Version
25
+
26
+ from .. import _static
27
+ from .._path import StrPath
28
+ from ..errors import FileError, OptionError
29
+ from ..warnings import SetuptoolsDeprecationWarning
30
+ from . import expand
31
+
32
+ if TYPE_CHECKING:
33
+ from typing_extensions import TypeAlias
34
+
35
+ from setuptools.dist import Distribution
36
+
37
+ from distutils.dist import DistributionMetadata
38
+
39
+ SingleCommandOptions: TypeAlias = dict[str, tuple[str, Any]]
40
+ """Dict that associate the name of the options of a particular command to a
41
+ tuple. The first element of the tuple indicates the origin of the option value
42
+ (e.g. the name of the configuration file where it was read from),
43
+ while the second element of the tuple is the option value itself
44
+ """
45
+ AllCommandOptions: TypeAlias = dict[str, SingleCommandOptions]
46
+ """cmd name => its options"""
47
+ Target = TypeVar("Target", "Distribution", "DistributionMetadata")
48
+
49
+
50
+ def read_configuration(
51
+ filepath: StrPath, find_others: bool = False, ignore_option_errors: bool = False
52
+ ) -> dict:
53
+ """Read given configuration file and returns options from it as a dict.
54
+
55
+ :param str|unicode filepath: Path to configuration file
56
+ to get options from.
57
+
58
+ :param bool find_others: Whether to search for other configuration files
59
+ which could be on in various places.
60
+
61
+ :param bool ignore_option_errors: Whether to silently ignore
62
+ options, values of which could not be resolved (e.g. due to exceptions
63
+ in directives such as file:, attr:, etc.).
64
+ If False exceptions are propagated as expected.
65
+
66
+ :rtype: dict
67
+ """
68
+ from setuptools.dist import Distribution
69
+
70
+ dist = Distribution()
71
+ filenames = dist.find_config_files() if find_others else []
72
+ handlers = _apply(dist, filepath, filenames, ignore_option_errors)
73
+ return configuration_to_dict(handlers)
74
+
75
+
76
+ def apply_configuration(dist: Distribution, filepath: StrPath) -> Distribution:
77
+ """Apply the configuration from a ``setup.cfg`` file into an existing
78
+ distribution object.
79
+ """
80
+ _apply(dist, filepath)
81
+ dist._finalize_requires()
82
+ return dist
83
+
84
+
85
+ def _apply(
86
+ dist: Distribution,
87
+ filepath: StrPath,
88
+ other_files: Iterable[StrPath] = (),
89
+ ignore_option_errors: bool = False,
90
+ ) -> tuple[ConfigMetadataHandler, ConfigOptionsHandler]:
91
+ """Read configuration from ``filepath`` and applies to the ``dist`` object."""
92
+ from setuptools.dist import _Distribution
93
+
94
+ filepath = os.path.abspath(filepath)
95
+
96
+ if not os.path.isfile(filepath):
97
+ raise FileError(f'Configuration file {filepath} does not exist.')
98
+
99
+ current_directory = os.getcwd()
100
+ os.chdir(os.path.dirname(filepath))
101
+ filenames = [*other_files, filepath]
102
+
103
+ try:
104
+ # TODO: Temporary cast until mypy 1.12 is released with upstream fixes from typeshed
105
+ _Distribution.parse_config_files(dist, filenames=cast(list[str], filenames))
106
+ handlers = parse_configuration(
107
+ dist, dist.command_options, ignore_option_errors=ignore_option_errors
108
+ )
109
+ dist._finalize_license_files()
110
+ finally:
111
+ os.chdir(current_directory)
112
+
113
+ return handlers
114
+
115
+
116
+ def _get_option(target_obj: Distribution | DistributionMetadata, key: str):
117
+ """
118
+ Given a target object and option key, get that option from
119
+ the target object, either through a get_{key} method or
120
+ from an attribute directly.
121
+ """
122
+ getter_name = f'get_{key}'
123
+ by_attribute = functools.partial(getattr, target_obj, key)
124
+ getter = getattr(target_obj, getter_name, by_attribute)
125
+ return getter()
126
+
127
+
128
+ def configuration_to_dict(
129
+ handlers: Iterable[
130
+ ConfigHandler[Distribution] | ConfigHandler[DistributionMetadata]
131
+ ],
132
+ ) -> dict:
133
+ """Returns configuration data gathered by given handlers as a dict.
134
+
135
+ :param Iterable[ConfigHandler] handlers: Handlers list,
136
+ usually from parse_configuration()
137
+
138
+ :rtype: dict
139
+ """
140
+ config_dict: dict = defaultdict(dict)
141
+
142
+ for handler in handlers:
143
+ for option in handler.set_options:
144
+ value = _get_option(handler.target_obj, option)
145
+ config_dict[handler.section_prefix][option] = value
146
+
147
+ return config_dict
148
+
149
+
150
+ def parse_configuration(
151
+ distribution: Distribution,
152
+ command_options: AllCommandOptions,
153
+ ignore_option_errors: bool = False,
154
+ ) -> tuple[ConfigMetadataHandler, ConfigOptionsHandler]:
155
+ """Performs additional parsing of configuration options
156
+ for a distribution.
157
+
158
+ Returns a list of used option handlers.
159
+
160
+ :param Distribution distribution:
161
+ :param dict command_options:
162
+ :param bool ignore_option_errors: Whether to silently ignore
163
+ options, values of which could not be resolved (e.g. due to exceptions
164
+ in directives such as file:, attr:, etc.).
165
+ If False exceptions are propagated as expected.
166
+ :rtype: list
167
+ """
168
+ with expand.EnsurePackagesDiscovered(distribution) as ensure_discovered:
169
+ options = ConfigOptionsHandler(
170
+ distribution,
171
+ command_options,
172
+ ignore_option_errors,
173
+ ensure_discovered,
174
+ )
175
+
176
+ options.parse()
177
+ if not distribution.package_dir:
178
+ distribution.package_dir = options.package_dir # Filled by `find_packages`
179
+
180
+ meta = ConfigMetadataHandler(
181
+ distribution.metadata,
182
+ command_options,
183
+ ignore_option_errors,
184
+ ensure_discovered,
185
+ distribution.package_dir,
186
+ distribution.src_root,
187
+ )
188
+ meta.parse()
189
+ distribution._referenced_files.update(
190
+ options._referenced_files, meta._referenced_files
191
+ )
192
+
193
+ return meta, options
194
+
195
+
196
+ def _warn_accidental_env_marker_misconfig(label: str, orig_value: str, parsed: list):
197
+ """Because users sometimes misinterpret this configuration:
198
+
199
+ [options.extras_require]
200
+ foo = bar;python_version<"4"
201
+
202
+ It looks like one requirement with an environment marker
203
+ but because there is no newline, it's parsed as two requirements
204
+ with a semicolon as separator.
205
+
206
+ Therefore, if:
207
+ * input string does not contain a newline AND
208
+ * parsed result contains two requirements AND
209
+ * parsing of the two parts from the result ("<first>;<second>")
210
+ leads in a valid Requirement with a valid marker
211
+ a UserWarning is shown to inform the user about the possible problem.
212
+ """
213
+ if "\n" in orig_value or len(parsed) != 2:
214
+ return
215
+
216
+ markers = marker_env().keys()
217
+
218
+ try:
219
+ req = Requirement(parsed[1])
220
+ if req.name in markers:
221
+ _AmbiguousMarker.emit(field=label, req=parsed[1])
222
+ except InvalidRequirement as ex:
223
+ if any(parsed[1].startswith(marker) for marker in markers):
224
+ msg = _AmbiguousMarker.message(field=label, req=parsed[1])
225
+ raise InvalidRequirement(msg) from ex
226
+
227
+
228
+ class ConfigHandler(Generic[Target]):
229
+ """Handles metadata supplied in configuration files."""
230
+
231
+ section_prefix: str
232
+ """Prefix for config sections handled by this handler.
233
+ Must be provided by class heirs.
234
+
235
+ """
236
+
237
+ aliases: ClassVar[dict[str, str]] = {}
238
+ """Options aliases.
239
+ For compatibility with various packages. E.g.: d2to1 and pbr.
240
+ Note: `-` in keys is replaced with `_` by config parser.
241
+
242
+ """
243
+
244
+ def __init__(
245
+ self,
246
+ target_obj: Target,
247
+ options: AllCommandOptions,
248
+ ignore_option_errors,
249
+ ensure_discovered: expand.EnsurePackagesDiscovered,
250
+ ) -> None:
251
+ self.ignore_option_errors = ignore_option_errors
252
+ self.target_obj: Target = target_obj
253
+ self.sections = dict(self._section_options(options))
254
+ self.set_options: list[str] = []
255
+ self.ensure_discovered = ensure_discovered
256
+ self._referenced_files = set[str]()
257
+ """After parsing configurations, this property will enumerate
258
+ all files referenced by the "file:" directive. Private API for setuptools only.
259
+ """
260
+
261
+ @classmethod
262
+ def _section_options(
263
+ cls, options: AllCommandOptions
264
+ ) -> Iterator[tuple[str, SingleCommandOptions]]:
265
+ for full_name, value in options.items():
266
+ pre, _sep, name = full_name.partition(cls.section_prefix)
267
+ if pre:
268
+ continue
269
+ yield name.lstrip('.'), value
270
+
271
+ @property
272
+ def parsers(self):
273
+ """Metadata item name to parser function mapping."""
274
+ raise NotImplementedError(
275
+ f'{self.__class__.__name__} must provide .parsers property'
276
+ )
277
+
278
+ def __setitem__(self, option_name, value) -> None:
279
+ target_obj = self.target_obj
280
+
281
+ # Translate alias into real name.
282
+ option_name = self.aliases.get(option_name, option_name)
283
+
284
+ try:
285
+ current_value = getattr(target_obj, option_name)
286
+ except AttributeError as e:
287
+ raise KeyError(option_name) from e
288
+
289
+ if current_value:
290
+ # Already inhabited. Skipping.
291
+ return
292
+
293
+ try:
294
+ parsed = self.parsers.get(option_name, lambda x: x)(value)
295
+ except (Exception,) * self.ignore_option_errors:
296
+ return
297
+
298
+ simple_setter = functools.partial(target_obj.__setattr__, option_name)
299
+ setter = getattr(target_obj, f"set_{option_name}", simple_setter)
300
+ setter(parsed)
301
+
302
+ self.set_options.append(option_name)
303
+
304
+ @classmethod
305
+ def _parse_list(cls, value, separator=','):
306
+ """Represents value as a list.
307
+
308
+ Value is split either by separator (defaults to comma) or by lines.
309
+
310
+ :param value:
311
+ :param separator: List items separator character.
312
+ :rtype: list
313
+ """
314
+ if isinstance(value, list): # _get_parser_compound case
315
+ return value
316
+
317
+ if '\n' in value:
318
+ value = value.splitlines()
319
+ else:
320
+ value = value.split(separator)
321
+
322
+ return [chunk.strip() for chunk in value if chunk.strip()]
323
+
324
+ @classmethod
325
+ def _parse_dict(cls, value):
326
+ """Represents value as a dict.
327
+
328
+ :param value:
329
+ :rtype: dict
330
+ """
331
+ separator = '='
332
+ result = {}
333
+ for line in cls._parse_list(value):
334
+ key, sep, val = line.partition(separator)
335
+ if sep != separator:
336
+ raise OptionError(f"Unable to parse option value to dict: {value}")
337
+ result[key.strip()] = val.strip()
338
+
339
+ return result
340
+
341
+ @classmethod
342
+ def _parse_bool(cls, value):
343
+ """Represents value as boolean.
344
+
345
+ :param value:
346
+ :rtype: bool
347
+ """
348
+ value = value.lower()
349
+ return value in ('1', 'true', 'yes')
350
+
351
+ @classmethod
352
+ def _exclude_files_parser(cls, key):
353
+ """Returns a parser function to make sure field inputs
354
+ are not files.
355
+
356
+ Parses a value after getting the key so error messages are
357
+ more informative.
358
+
359
+ :param key:
360
+ :rtype: callable
361
+ """
362
+
363
+ def parser(value):
364
+ exclude_directive = 'file:'
365
+ if value.startswith(exclude_directive):
366
+ raise ValueError(
367
+ f'Only strings are accepted for the {key} field, '
368
+ 'files are not accepted'
369
+ )
370
+ return _static.Str(value)
371
+
372
+ return parser
373
+
374
+ def _parse_file(self, value, root_dir: StrPath | None):
375
+ """Represents value as a string, allowing including text
376
+ from nearest files using `file:` directive.
377
+
378
+ Directive is sandboxed and won't reach anything outside
379
+ directory with setup.py.
380
+
381
+ Examples:
382
+ file: README.rst, CHANGELOG.md, src/file.txt
383
+
384
+ :param str value:
385
+ :rtype: str
386
+ """
387
+ include_directive = 'file:'
388
+
389
+ if not isinstance(value, str):
390
+ return value
391
+
392
+ if not value.startswith(include_directive):
393
+ return _static.Str(value)
394
+
395
+ spec = value[len(include_directive) :]
396
+ filepaths = [path.strip() for path in spec.split(',')]
397
+ self._referenced_files.update(filepaths)
398
+ # XXX: Is marking as static contents coming from files too optimistic?
399
+ return _static.Str(expand.read_files(filepaths, root_dir))
400
+
401
+ def _parse_attr(self, value, package_dir, root_dir: StrPath):
402
+ """Represents value as a module attribute.
403
+
404
+ Examples:
405
+ attr: package.attr
406
+ attr: package.module.attr
407
+
408
+ :param str value:
409
+ :rtype: str
410
+ """
411
+ attr_directive = 'attr:'
412
+ if not value.startswith(attr_directive):
413
+ return _static.Str(value)
414
+
415
+ attr_desc = value.replace(attr_directive, '')
416
+
417
+ # Make sure package_dir is populated correctly, so `attr:` directives can work
418
+ package_dir.update(self.ensure_discovered.package_dir)
419
+ return expand.read_attr(attr_desc, package_dir, root_dir)
420
+
421
+ @classmethod
422
+ def _get_parser_compound(cls, *parse_methods):
423
+ """Returns parser function to represents value as a list.
424
+
425
+ Parses a value applying given methods one after another.
426
+
427
+ :param parse_methods:
428
+ :rtype: callable
429
+ """
430
+
431
+ def parse(value):
432
+ parsed = value
433
+
434
+ for method in parse_methods:
435
+ parsed = method(parsed)
436
+
437
+ return parsed
438
+
439
+ return parse
440
+
441
+ @classmethod
442
+ def _parse_section_to_dict_with_key(cls, section_options, values_parser):
443
+ """Parses section options into a dictionary.
444
+
445
+ Applies a given parser to each option in a section.
446
+
447
+ :param dict section_options:
448
+ :param callable values_parser: function with 2 args corresponding to key, value
449
+ :rtype: dict
450
+ """
451
+ value = {}
452
+ for key, (_, val) in section_options.items():
453
+ value[key] = values_parser(key, val)
454
+ return value
455
+
456
+ @classmethod
457
+ def _parse_section_to_dict(cls, section_options, values_parser=None):
458
+ """Parses section options into a dictionary.
459
+
460
+ Optionally applies a given parser to each value.
461
+
462
+ :param dict section_options:
463
+ :param callable values_parser: function with 1 arg corresponding to option value
464
+ :rtype: dict
465
+ """
466
+ parser = (lambda _, v: values_parser(v)) if values_parser else (lambda _, v: v)
467
+ return cls._parse_section_to_dict_with_key(section_options, parser)
468
+
469
+ def parse_section(self, section_options) -> None:
470
+ """Parses configuration file section.
471
+
472
+ :param dict section_options:
473
+ """
474
+ for name, (_, value) in section_options.items():
475
+ with contextlib.suppress(KeyError):
476
+ # Keep silent for a new option may appear anytime.
477
+ self[name] = value
478
+
479
+ def parse(self) -> None:
480
+ """Parses configuration file items from one
481
+ or more related sections.
482
+
483
+ """
484
+ for section_name, section_options in self.sections.items():
485
+ method_postfix = ''
486
+ if section_name: # [section.option] variant
487
+ method_postfix = f"_{section_name}"
488
+
489
+ section_parser_method: Callable | None = getattr(
490
+ self,
491
+ # Dots in section names are translated into dunderscores.
492
+ f'parse_section{method_postfix}'.replace('.', '__'),
493
+ None,
494
+ )
495
+
496
+ if section_parser_method is None:
497
+ raise OptionError(
498
+ "Unsupported distribution option section: "
499
+ f"[{self.section_prefix}.{section_name}]"
500
+ )
501
+
502
+ section_parser_method(section_options)
503
+
504
+ def _deprecated_config_handler(self, func, msg, **kw):
505
+ """this function will wrap around parameters that are deprecated
506
+
507
+ :param msg: deprecation message
508
+ :param func: function to be wrapped around
509
+ """
510
+
511
+ @wraps(func)
512
+ def config_handler(*args, **kwargs):
513
+ kw.setdefault("stacklevel", 2)
514
+ _DeprecatedConfig.emit("Deprecated config in `setup.cfg`", msg, **kw)
515
+ return func(*args, **kwargs)
516
+
517
+ return config_handler
518
+
519
+
520
+ class ConfigMetadataHandler(ConfigHandler["DistributionMetadata"]):
521
+ section_prefix = 'metadata'
522
+
523
+ aliases = {
524
+ 'home_page': 'url',
525
+ 'summary': 'description',
526
+ 'classifier': 'classifiers',
527
+ 'platform': 'platforms',
528
+ }
529
+
530
+ strict_mode = False
531
+ """We need to keep it loose, to be partially compatible with
532
+ `pbr` and `d2to1` packages which also uses `metadata` section.
533
+
534
+ """
535
+
536
+ def __init__(
537
+ self,
538
+ target_obj: DistributionMetadata,
539
+ options: AllCommandOptions,
540
+ ignore_option_errors: bool,
541
+ ensure_discovered: expand.EnsurePackagesDiscovered,
542
+ package_dir: dict | None = None,
543
+ root_dir: StrPath | None = os.curdir,
544
+ ) -> None:
545
+ super().__init__(target_obj, options, ignore_option_errors, ensure_discovered)
546
+ self.package_dir = package_dir
547
+ self.root_dir = root_dir
548
+
549
+ @property
550
+ def parsers(self):
551
+ """Metadata item name to parser function mapping."""
552
+ parse_list_static = self._get_parser_compound(self._parse_list, _static.List)
553
+ parse_dict_static = self._get_parser_compound(self._parse_dict, _static.Dict)
554
+ parse_file = partial(self._parse_file, root_dir=self.root_dir)
555
+ exclude_files_parser = self._exclude_files_parser
556
+
557
+ return {
558
+ 'author': _static.Str,
559
+ 'author_email': _static.Str,
560
+ 'maintainer': _static.Str,
561
+ 'maintainer_email': _static.Str,
562
+ 'platforms': parse_list_static,
563
+ 'keywords': parse_list_static,
564
+ 'provides': parse_list_static,
565
+ 'obsoletes': parse_list_static,
566
+ 'classifiers': self._get_parser_compound(parse_file, parse_list_static),
567
+ 'license': exclude_files_parser('license'),
568
+ 'license_files': parse_list_static,
569
+ 'description': parse_file,
570
+ 'long_description': parse_file,
571
+ 'long_description_content_type': _static.Str,
572
+ 'version': self._parse_version, # Cannot be marked as dynamic
573
+ 'url': _static.Str,
574
+ 'project_urls': parse_dict_static,
575
+ }
576
+
577
+ def _parse_version(self, value):
578
+ """Parses `version` option value.
579
+
580
+ :param value:
581
+ :rtype: str
582
+
583
+ """
584
+ version = self._parse_file(value, self.root_dir)
585
+
586
+ if version != value:
587
+ version = version.strip()
588
+ # Be strict about versions loaded from file because it's easy to
589
+ # accidentally include newlines and other unintended content
590
+ try:
591
+ Version(version)
592
+ except InvalidVersion as e:
593
+ raise OptionError(
594
+ f'Version loaded from {value} does not '
595
+ f'comply with PEP 440: {version}'
596
+ ) from e
597
+
598
+ return version
599
+
600
+ return expand.version(self._parse_attr(value, self.package_dir, self.root_dir))
601
+
602
+
603
+ class ConfigOptionsHandler(ConfigHandler["Distribution"]):
604
+ section_prefix = 'options'
605
+
606
+ def __init__(
607
+ self,
608
+ target_obj: Distribution,
609
+ options: AllCommandOptions,
610
+ ignore_option_errors: bool,
611
+ ensure_discovered: expand.EnsurePackagesDiscovered,
612
+ ) -> None:
613
+ super().__init__(target_obj, options, ignore_option_errors, ensure_discovered)
614
+ self.root_dir = target_obj.src_root
615
+ self.package_dir: dict[str, str] = {} # To be filled by `find_packages`
616
+
617
+ @classmethod
618
+ def _parse_list_semicolon(cls, value):
619
+ return cls._parse_list(value, separator=';')
620
+
621
+ def _parse_file_in_root(self, value):
622
+ return self._parse_file(value, root_dir=self.root_dir)
623
+
624
+ def _parse_requirements_list(self, label: str, value: str):
625
+ # Parse a requirements list, either by reading in a `file:`, or a list.
626
+ parsed = self._parse_list_semicolon(self._parse_file_in_root(value))
627
+ _warn_accidental_env_marker_misconfig(label, value, parsed)
628
+ # Filter it to only include lines that are not comments. `parse_list`
629
+ # will have stripped each line and filtered out empties.
630
+ return _static.List(line for line in parsed if not line.startswith("#"))
631
+ # ^-- Use `_static.List` to mark a non-`Dynamic` Core Metadata
632
+
633
+ @property
634
+ def parsers(self):
635
+ """Metadata item name to parser function mapping."""
636
+ parse_list = self._parse_list
637
+ parse_bool = self._parse_bool
638
+ parse_cmdclass = self._parse_cmdclass
639
+
640
+ return {
641
+ 'zip_safe': parse_bool,
642
+ 'include_package_data': parse_bool,
643
+ 'package_dir': self._parse_dict,
644
+ 'scripts': parse_list,
645
+ 'eager_resources': parse_list,
646
+ 'dependency_links': parse_list,
647
+ 'namespace_packages': self._deprecated_config_handler(
648
+ parse_list,
649
+ "The namespace_packages parameter is deprecated, "
650
+ "consider using implicit namespaces instead (PEP 420).",
651
+ # TODO: define due date, see setuptools.dist:check_nsp.
652
+ ),
653
+ 'install_requires': partial( # Core Metadata
654
+ self._parse_requirements_list, "install_requires"
655
+ ),
656
+ 'setup_requires': self._parse_list_semicolon,
657
+ 'packages': self._parse_packages,
658
+ 'entry_points': self._parse_file_in_root,
659
+ 'py_modules': parse_list,
660
+ 'python_requires': _static.SpecifierSet, # Core Metadata
661
+ 'cmdclass': parse_cmdclass,
662
+ }
663
+
664
+ def _parse_cmdclass(self, value):
665
+ package_dir = self.ensure_discovered.package_dir
666
+ return expand.cmdclass(self._parse_dict(value), package_dir, self.root_dir)
667
+
668
+ def _parse_packages(self, value):
669
+ """Parses `packages` option value.
670
+
671
+ :param value:
672
+ :rtype: list
673
+ """
674
+ find_directives = ['find:', 'find_namespace:']
675
+ trimmed_value = value.strip()
676
+
677
+ if trimmed_value not in find_directives:
678
+ return self._parse_list(value)
679
+
680
+ # Read function arguments from a dedicated section.
681
+ find_kwargs = self.parse_section_packages__find(
682
+ self.sections.get('packages.find', {})
683
+ )
684
+
685
+ find_kwargs.update(
686
+ namespaces=(trimmed_value == find_directives[1]),
687
+ root_dir=self.root_dir,
688
+ fill_package_dir=self.package_dir,
689
+ )
690
+
691
+ return expand.find_packages(**find_kwargs)
692
+
693
+ def parse_section_packages__find(self, section_options):
694
+ """Parses `packages.find` configuration file section.
695
+
696
+ To be used in conjunction with _parse_packages().
697
+
698
+ :param dict section_options:
699
+ """
700
+ section_data = self._parse_section_to_dict(section_options, self._parse_list)
701
+
702
+ valid_keys = ['where', 'include', 'exclude']
703
+ find_kwargs = {k: v for k, v in section_data.items() if k in valid_keys and v}
704
+
705
+ where = find_kwargs.get('where')
706
+ if where is not None:
707
+ find_kwargs['where'] = where[0] # cast list to single val
708
+
709
+ return find_kwargs
710
+
711
+ def parse_section_entry_points(self, section_options) -> None:
712
+ """Parses `entry_points` configuration file section.
713
+
714
+ :param dict section_options:
715
+ """
716
+ parsed = self._parse_section_to_dict(section_options, self._parse_list)
717
+ self['entry_points'] = parsed
718
+
719
+ def _parse_package_data(self, section_options):
720
+ package_data = self._parse_section_to_dict(section_options, self._parse_list)
721
+ return expand.canonic_package_data(package_data)
722
+
723
+ def parse_section_package_data(self, section_options) -> None:
724
+ """Parses `package_data` configuration file section.
725
+
726
+ :param dict section_options:
727
+ """
728
+ self['package_data'] = self._parse_package_data(section_options)
729
+
730
+ def parse_section_exclude_package_data(self, section_options) -> None:
731
+ """Parses `exclude_package_data` configuration file section.
732
+
733
+ :param dict section_options:
734
+ """
735
+ self['exclude_package_data'] = self._parse_package_data(section_options)
736
+
737
+ def parse_section_extras_require(self, section_options) -> None: # Core Metadata
738
+ """Parses `extras_require` configuration file section.
739
+
740
+ :param dict section_options:
741
+ """
742
+ parsed = self._parse_section_to_dict_with_key(
743
+ section_options,
744
+ lambda k, v: self._parse_requirements_list(f"extras_require[{k}]", v),
745
+ )
746
+
747
+ self['extras_require'] = _static.Dict(parsed)
748
+ # ^-- Use `_static.Dict` to mark a non-`Dynamic` Core Metadata
749
+
750
+ def parse_section_data_files(self, section_options) -> None:
751
+ """Parses `data_files` configuration file section.
752
+
753
+ :param dict section_options:
754
+ """
755
+ parsed = self._parse_section_to_dict(section_options, self._parse_list)
756
+ self['data_files'] = expand.canonic_data_files(parsed, self.root_dir)
757
+
758
+
759
+ class _AmbiguousMarker(SetuptoolsDeprecationWarning):
760
+ _SUMMARY = "Ambiguous requirement marker."
761
+ _DETAILS = """
762
+ One of the parsed requirements in `{field}` looks like a valid environment marker:
763
+
764
+ {req!r}
765
+
766
+ Please make sure that the configuration file is correct.
767
+ You can use dangling lines to avoid this problem.
768
+ """
769
+ _SEE_DOCS = "userguide/declarative_config.html#opt-2"
770
+ # TODO: should we include due_date here? Initially introduced in 6 Aug 2022.
771
+ # Does this make sense with latest version of packaging?
772
+
773
+ @classmethod
774
+ def message(cls, **kw):
775
+ docs = f"https://setuptools.pypa.io/en/latest/{cls._SEE_DOCS}"
776
+ return cls._format(cls._SUMMARY, cls._DETAILS, see_url=docs, format_args=kw)
777
+
778
+
779
+ class _DeprecatedConfig(SetuptoolsDeprecationWarning):
780
+ _SEE_DOCS = "userguide/declarative_config.html"