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,1306 @@
1
+ from __future__ import annotations
2
+
3
+ import ast
4
+ import glob
5
+ import os
6
+ import re
7
+ import stat
8
+ import sys
9
+ import time
10
+ from pathlib import Path
11
+ from unittest import mock
12
+
13
+ import pytest
14
+ from jaraco import path
15
+
16
+ from setuptools import errors
17
+ from setuptools.command.egg_info import egg_info, manifest_maker, write_entries
18
+ from setuptools.dist import Distribution
19
+
20
+ from . import contexts, environment
21
+ from .textwrap import DALS
22
+
23
+
24
+ class Environment(str):
25
+ pass
26
+
27
+
28
+ @pytest.fixture
29
+ def env():
30
+ with contexts.tempdir(prefix='setuptools-test.') as env_dir:
31
+ env = Environment(env_dir)
32
+ os.chmod(env_dir, stat.S_IRWXU)
33
+ subs = 'home', 'lib', 'scripts', 'data', 'egg-base'
34
+ env.paths = dict((dirname, os.path.join(env_dir, dirname)) for dirname in subs)
35
+ list(map(os.mkdir, env.paths.values()))
36
+ path.build({
37
+ env.paths['home']: {
38
+ '.pydistutils.cfg': DALS(
39
+ """
40
+ [egg_info]
41
+ egg-base = {egg-base}
42
+ """.format(**env.paths)
43
+ )
44
+ }
45
+ })
46
+ yield env
47
+
48
+
49
+ class TestEggInfo:
50
+ setup_script = DALS(
51
+ """
52
+ from setuptools import setup
53
+
54
+ setup(
55
+ name='foo',
56
+ py_modules=['hello'],
57
+ entry_points={'console_scripts': ['hi = hello.run']},
58
+ zip_safe=False,
59
+ )
60
+ """
61
+ )
62
+
63
+ def _create_project(self):
64
+ path.build({
65
+ 'setup.py': self.setup_script,
66
+ 'hello.py': DALS(
67
+ """
68
+ def run():
69
+ print('hello')
70
+ """
71
+ ),
72
+ })
73
+
74
+ @staticmethod
75
+ def _extract_mv_version(pkg_info_lines: list[str]) -> tuple[int, int]:
76
+ version_str = pkg_info_lines[0].split(' ')[1]
77
+ major, minor = map(int, version_str.split('.')[:2])
78
+ return major, minor
79
+
80
+ def test_egg_info_save_version_info_setup_empty(self, tmpdir_cwd, env):
81
+ """
82
+ When the egg_info section is empty or not present, running
83
+ save_version_info should add the settings to the setup.cfg
84
+ in a deterministic order.
85
+ """
86
+ setup_cfg = os.path.join(env.paths['home'], 'setup.cfg')
87
+ dist = Distribution()
88
+ ei = egg_info(dist)
89
+ ei.initialize_options()
90
+ ei.save_version_info(setup_cfg)
91
+
92
+ with open(setup_cfg, 'r', encoding="utf-8") as f:
93
+ content = f.read()
94
+
95
+ assert '[egg_info]' in content
96
+ assert 'tag_build =' in content
97
+ assert 'tag_date = 0' in content
98
+
99
+ expected_order = (
100
+ 'tag_build',
101
+ 'tag_date',
102
+ )
103
+
104
+ self._validate_content_order(content, expected_order)
105
+
106
+ @staticmethod
107
+ def _validate_content_order(content, expected):
108
+ """
109
+ Assert that the strings in expected appear in content
110
+ in order.
111
+ """
112
+ pattern = '.*'.join(expected)
113
+ flags = re.MULTILINE | re.DOTALL
114
+ assert re.search(pattern, content, flags)
115
+
116
+ def test_egg_info_save_version_info_setup_defaults(self, tmpdir_cwd, env):
117
+ """
118
+ When running save_version_info on an existing setup.cfg
119
+ with the 'default' values present from a previous run,
120
+ the file should remain unchanged.
121
+ """
122
+ setup_cfg = os.path.join(env.paths['home'], 'setup.cfg')
123
+ path.build({
124
+ setup_cfg: DALS(
125
+ """
126
+ [egg_info]
127
+ tag_build =
128
+ tag_date = 0
129
+ """
130
+ ),
131
+ })
132
+ dist = Distribution()
133
+ ei = egg_info(dist)
134
+ ei.initialize_options()
135
+ ei.save_version_info(setup_cfg)
136
+
137
+ with open(setup_cfg, 'r', encoding="utf-8") as f:
138
+ content = f.read()
139
+
140
+ assert '[egg_info]' in content
141
+ assert 'tag_build =' in content
142
+ assert 'tag_date = 0' in content
143
+
144
+ expected_order = (
145
+ 'tag_build',
146
+ 'tag_date',
147
+ )
148
+
149
+ self._validate_content_order(content, expected_order)
150
+
151
+ def test_expected_files_produced(self, tmpdir_cwd, env):
152
+ self._create_project()
153
+
154
+ self._run_egg_info_command(tmpdir_cwd, env)
155
+ actual = os.listdir('foo.egg-info')
156
+
157
+ expected = [
158
+ 'PKG-INFO',
159
+ 'SOURCES.txt',
160
+ 'dependency_links.txt',
161
+ 'entry_points.txt',
162
+ 'not-zip-safe',
163
+ 'top_level.txt',
164
+ ]
165
+ assert sorted(actual) == expected
166
+
167
+ def test_handling_utime_error(self, tmpdir_cwd, env):
168
+ dist = Distribution()
169
+ ei = egg_info(dist)
170
+ utime_patch = mock.patch('os.utime', side_effect=OSError("TEST"))
171
+ mkpath_patch = mock.patch(
172
+ 'setuptools.command.egg_info.egg_info.mkpath', return_val=None
173
+ )
174
+
175
+ with utime_patch, mkpath_patch:
176
+ import distutils.errors
177
+
178
+ msg = r"Cannot update time stamp of directory 'None'"
179
+ with pytest.raises(distutils.errors.DistutilsFileError, match=msg):
180
+ ei.run()
181
+
182
+ def test_license_is_a_string(self, tmpdir_cwd, env):
183
+ setup_config = DALS(
184
+ """
185
+ [metadata]
186
+ name=foo
187
+ version=0.0.1
188
+ license=file:MIT
189
+ """
190
+ )
191
+
192
+ setup_script = DALS(
193
+ """
194
+ from setuptools import setup
195
+
196
+ setup()
197
+ """
198
+ )
199
+
200
+ path.build({
201
+ 'setup.py': setup_script,
202
+ 'setup.cfg': setup_config,
203
+ })
204
+
205
+ # This command should fail with a ValueError, but because it's
206
+ # currently configured to use a subprocess, the actual traceback
207
+ # object is lost and we need to parse it from stderr
208
+ with pytest.raises(AssertionError) as exc:
209
+ self._run_egg_info_command(tmpdir_cwd, env)
210
+
211
+ # The only argument to the assertion error should be a traceback
212
+ # containing a ValueError
213
+ assert 'ValueError' in exc.value.args[0]
214
+
215
+ def test_rebuilt(self, tmpdir_cwd, env):
216
+ """Ensure timestamps are updated when the command is re-run."""
217
+ self._create_project()
218
+
219
+ self._run_egg_info_command(tmpdir_cwd, env)
220
+ timestamp_a = os.path.getmtime('foo.egg-info')
221
+
222
+ # arbitrary sleep just to handle *really* fast systems
223
+ time.sleep(0.001)
224
+
225
+ self._run_egg_info_command(tmpdir_cwd, env)
226
+ timestamp_b = os.path.getmtime('foo.egg-info')
227
+
228
+ assert timestamp_a != timestamp_b
229
+
230
+ def test_manifest_template_is_read(self, tmpdir_cwd, env):
231
+ self._create_project()
232
+ path.build({
233
+ 'MANIFEST.in': DALS(
234
+ """
235
+ recursive-include docs *.rst
236
+ """
237
+ ),
238
+ 'docs': {
239
+ 'usage.rst': "Run 'hi'",
240
+ },
241
+ })
242
+ self._run_egg_info_command(tmpdir_cwd, env)
243
+ egg_info_dir = os.path.join('.', 'foo.egg-info')
244
+ sources_txt = os.path.join(egg_info_dir, 'SOURCES.txt')
245
+ with open(sources_txt, encoding="utf-8") as f:
246
+ assert 'docs/usage.rst' in f.read().split('\n')
247
+
248
+ def _setup_script_with_requires(self, requires, use_setup_cfg=False):
249
+ setup_script = DALS(
250
+ """
251
+ from setuptools import setup
252
+
253
+ setup(name='foo', zip_safe=False, %s)
254
+ """
255
+ ) % ('' if use_setup_cfg else requires)
256
+ setup_config = requires if use_setup_cfg else ''
257
+ path.build({
258
+ 'setup.py': setup_script,
259
+ 'setup.cfg': setup_config,
260
+ })
261
+
262
+ mismatch_marker = f"python_version<'{sys.version_info[0]}'"
263
+ # Alternate equivalent syntax.
264
+ mismatch_marker_alternate = f'python_version < "{sys.version_info[0]}"'
265
+ invalid_marker = "<=>++"
266
+
267
+ class RequiresTestHelper:
268
+ @staticmethod
269
+ def parametrize(*test_list, **format_dict):
270
+ idlist = []
271
+ argvalues = []
272
+ for test in test_list:
273
+ test_params = test.lstrip().split('\n\n', 3)
274
+ name_kwargs = test_params.pop(0).split('\n')
275
+ if len(name_kwargs) > 1:
276
+ val = name_kwargs[1].strip()
277
+ install_cmd_kwargs = ast.literal_eval(val)
278
+ else:
279
+ install_cmd_kwargs = {}
280
+ name = name_kwargs[0].strip()
281
+ setup_py_requires, setup_cfg_requires, expected_requires = [
282
+ DALS(a).format(**format_dict) for a in test_params
283
+ ]
284
+ for id_, requires, use_cfg in (
285
+ (name, setup_py_requires, False),
286
+ (name + '_in_setup_cfg', setup_cfg_requires, True),
287
+ ):
288
+ idlist.append(id_)
289
+ marks = ()
290
+ if requires.startswith('@xfail\n'):
291
+ requires = requires[7:]
292
+ marks = pytest.mark.xfail
293
+ argvalues.append(
294
+ pytest.param(
295
+ requires,
296
+ use_cfg,
297
+ expected_requires,
298
+ install_cmd_kwargs,
299
+ marks=marks,
300
+ )
301
+ )
302
+ return pytest.mark.parametrize(
303
+ (
304
+ "requires",
305
+ "use_setup_cfg",
306
+ "expected_requires",
307
+ "install_cmd_kwargs",
308
+ ),
309
+ argvalues,
310
+ ids=idlist,
311
+ )
312
+
313
+ @RequiresTestHelper.parametrize(
314
+ # Format of a test:
315
+ #
316
+ # id
317
+ # install_cmd_kwargs [optional]
318
+ #
319
+ # requires block (when used in setup.py)
320
+ #
321
+ # requires block (when used in setup.cfg)
322
+ #
323
+ # expected contents of requires.txt
324
+ """
325
+ install_requires_deterministic
326
+
327
+ install_requires=["wheel>=0.5", "pytest"]
328
+
329
+ [options]
330
+ install_requires =
331
+ wheel>=0.5
332
+ pytest
333
+
334
+ wheel>=0.5
335
+ pytest
336
+ """,
337
+ """
338
+ install_requires_ordered
339
+
340
+ install_requires=["pytest>=3.0.2,!=10.9999"]
341
+
342
+ [options]
343
+ install_requires =
344
+ pytest>=3.0.2,!=10.9999
345
+
346
+ pytest!=10.9999,>=3.0.2
347
+ """,
348
+ """
349
+ install_requires_with_marker
350
+
351
+ install_requires=["barbazquux;{mismatch_marker}"],
352
+
353
+ [options]
354
+ install_requires =
355
+ barbazquux; {mismatch_marker}
356
+
357
+ [:{mismatch_marker_alternate}]
358
+ barbazquux
359
+ """,
360
+ """
361
+ install_requires_with_extra
362
+ {'cmd': ['egg_info']}
363
+
364
+ install_requires=["barbazquux [test]"],
365
+
366
+ [options]
367
+ install_requires =
368
+ barbazquux [test]
369
+
370
+ barbazquux[test]
371
+ """,
372
+ """
373
+ install_requires_with_extra_and_marker
374
+
375
+ install_requires=["barbazquux [test]; {mismatch_marker}"],
376
+
377
+ [options]
378
+ install_requires =
379
+ barbazquux [test]; {mismatch_marker}
380
+
381
+ [:{mismatch_marker_alternate}]
382
+ barbazquux[test]
383
+ """,
384
+ """
385
+ setup_requires_with_markers
386
+
387
+ setup_requires=["barbazquux;{mismatch_marker}"],
388
+
389
+ [options]
390
+ setup_requires =
391
+ barbazquux; {mismatch_marker}
392
+
393
+ """,
394
+ """
395
+ extras_require_with_extra
396
+ {'cmd': ['egg_info']}
397
+
398
+ extras_require={{"extra": ["barbazquux [test]"]}},
399
+
400
+ [options.extras_require]
401
+ extra = barbazquux [test]
402
+
403
+ [extra]
404
+ barbazquux[test]
405
+ """,
406
+ """
407
+ extras_require_with_extra_and_marker_in_req
408
+
409
+ extras_require={{"extra": ["barbazquux [test]; {mismatch_marker}"]}},
410
+
411
+ [options.extras_require]
412
+ extra =
413
+ barbazquux [test]; {mismatch_marker}
414
+
415
+ [extra]
416
+
417
+ [extra:{mismatch_marker_alternate}]
418
+ barbazquux[test]
419
+ """,
420
+ # FIXME: ConfigParser does not allow : in key names!
421
+ """
422
+ extras_require_with_marker
423
+
424
+ extras_require={{":{mismatch_marker}": ["barbazquux"]}},
425
+
426
+ @xfail
427
+ [options.extras_require]
428
+ :{mismatch_marker} = barbazquux
429
+
430
+ [:{mismatch_marker}]
431
+ barbazquux
432
+ """,
433
+ """
434
+ extras_require_with_marker_in_req
435
+
436
+ extras_require={{"extra": ["barbazquux; {mismatch_marker}"]}},
437
+
438
+ [options.extras_require]
439
+ extra =
440
+ barbazquux; {mismatch_marker}
441
+
442
+ [extra]
443
+
444
+ [extra:{mismatch_marker_alternate}]
445
+ barbazquux
446
+ """,
447
+ """
448
+ extras_require_with_empty_section
449
+
450
+ extras_require={{"empty": []}},
451
+
452
+ [options.extras_require]
453
+ empty =
454
+
455
+ [empty]
456
+ """,
457
+ # Format arguments.
458
+ invalid_marker=invalid_marker,
459
+ mismatch_marker=mismatch_marker,
460
+ mismatch_marker_alternate=mismatch_marker_alternate,
461
+ )
462
+ def test_requires(
463
+ self,
464
+ tmpdir_cwd,
465
+ env,
466
+ requires,
467
+ use_setup_cfg,
468
+ expected_requires,
469
+ install_cmd_kwargs,
470
+ ):
471
+ self._setup_script_with_requires(requires, use_setup_cfg)
472
+ self._run_egg_info_command(tmpdir_cwd, env, **install_cmd_kwargs)
473
+ egg_info_dir = os.path.join('.', 'foo.egg-info')
474
+ requires_txt = os.path.join(egg_info_dir, 'requires.txt')
475
+ if os.path.exists(requires_txt):
476
+ with open(requires_txt, encoding="utf-8") as fp:
477
+ install_requires = fp.read()
478
+ else:
479
+ install_requires = ''
480
+ assert install_requires.lstrip() == expected_requires
481
+ assert glob.glob(os.path.join(env.paths['lib'], 'barbazquux*')) == []
482
+
483
+ def test_install_requires_unordered_disallowed(self, tmpdir_cwd, env):
484
+ """
485
+ Packages that pass unordered install_requires sequences
486
+ should be rejected as they produce non-deterministic
487
+ builds. See #458.
488
+ """
489
+ req = 'install_requires={"fake-factory==0.5.2", "pytz"}'
490
+ self._setup_script_with_requires(req)
491
+ with pytest.raises(AssertionError):
492
+ self._run_egg_info_command(tmpdir_cwd, env)
493
+
494
+ def test_extras_require_with_invalid_marker(self, tmpdir_cwd, env):
495
+ tmpl = 'extras_require={{":{marker}": ["barbazquux"]}},'
496
+ req = tmpl.format(marker=self.invalid_marker)
497
+ self._setup_script_with_requires(req)
498
+ with pytest.raises(AssertionError):
499
+ self._run_egg_info_command(tmpdir_cwd, env)
500
+ assert glob.glob(os.path.join(env.paths['lib'], 'barbazquux*')) == []
501
+
502
+ def test_extras_require_with_invalid_marker_in_req(self, tmpdir_cwd, env):
503
+ tmpl = 'extras_require={{"extra": ["barbazquux; {marker}"]}},'
504
+ req = tmpl.format(marker=self.invalid_marker)
505
+ self._setup_script_with_requires(req)
506
+ with pytest.raises(AssertionError):
507
+ self._run_egg_info_command(tmpdir_cwd, env)
508
+ assert glob.glob(os.path.join(env.paths['lib'], 'barbazquux*')) == []
509
+
510
+ def test_provides_extra(self, tmpdir_cwd, env):
511
+ self._setup_script_with_requires('extras_require={"foobar": ["barbazquux"]},')
512
+ environ = os.environ.copy().update(
513
+ HOME=env.paths['home'],
514
+ )
515
+ environment.run_setup_py(
516
+ cmd=['egg_info'],
517
+ pypath=os.pathsep.join([env.paths['lib'], str(tmpdir_cwd)]),
518
+ data_stream=1,
519
+ env=environ,
520
+ )
521
+ egg_info_dir = os.path.join('.', 'foo.egg-info')
522
+ with open(os.path.join(egg_info_dir, 'PKG-INFO'), encoding="utf-8") as fp:
523
+ pkg_info_lines = fp.read().split('\n')
524
+ assert 'Provides-Extra: foobar' in pkg_info_lines
525
+ assert 'Metadata-Version: 2.4' in pkg_info_lines
526
+
527
+ def test_doesnt_provides_extra(self, tmpdir_cwd, env):
528
+ self._setup_script_with_requires(
529
+ """install_requires=["spam ; python_version<'3.6'"]"""
530
+ )
531
+ environ = os.environ.copy().update(
532
+ HOME=env.paths['home'],
533
+ )
534
+ environment.run_setup_py(
535
+ cmd=['egg_info'],
536
+ pypath=os.pathsep.join([env.paths['lib'], str(tmpdir_cwd)]),
537
+ data_stream=1,
538
+ env=environ,
539
+ )
540
+ egg_info_dir = os.path.join('.', 'foo.egg-info')
541
+ with open(os.path.join(egg_info_dir, 'PKG-INFO'), encoding="utf-8") as fp:
542
+ pkg_info_text = fp.read()
543
+ assert 'Provides-Extra:' not in pkg_info_text
544
+
545
+ @pytest.mark.parametrize(
546
+ ('files', 'license_in_sources'),
547
+ [
548
+ (
549
+ {
550
+ 'setup.cfg': DALS(
551
+ """
552
+ [metadata]
553
+ license_file = LICENSE
554
+ """
555
+ ),
556
+ 'LICENSE': "Test license",
557
+ },
558
+ True,
559
+ ), # with license
560
+ (
561
+ {
562
+ 'setup.cfg': DALS(
563
+ """
564
+ [metadata]
565
+ license_file = INVALID_LICENSE
566
+ """
567
+ ),
568
+ 'LICENSE': "Test license",
569
+ },
570
+ False,
571
+ ), # with an invalid license
572
+ (
573
+ {
574
+ 'setup.cfg': DALS(
575
+ """
576
+ """
577
+ ),
578
+ 'LICENSE': "Test license",
579
+ },
580
+ True,
581
+ ), # no license_file attribute, LICENSE auto-included
582
+ (
583
+ {
584
+ 'setup.cfg': DALS(
585
+ """
586
+ [metadata]
587
+ license_file = LICENSE
588
+ """
589
+ ),
590
+ 'MANIFEST.in': "exclude LICENSE",
591
+ 'LICENSE': "Test license",
592
+ },
593
+ True,
594
+ ), # manifest is overwritten by license_file
595
+ pytest.param(
596
+ {
597
+ 'setup.cfg': DALS(
598
+ """
599
+ [metadata]
600
+ license_file = LICEN[CS]E*
601
+ """
602
+ ),
603
+ 'LICENSE': "Test license",
604
+ },
605
+ True,
606
+ id="glob_pattern",
607
+ ),
608
+ ],
609
+ )
610
+ def test_setup_cfg_license_file(self, tmpdir_cwd, env, files, license_in_sources):
611
+ self._create_project()
612
+ path.build(files)
613
+
614
+ environment.run_setup_py(
615
+ cmd=['egg_info'],
616
+ pypath=os.pathsep.join([env.paths['lib'], str(tmpdir_cwd)]),
617
+ )
618
+ egg_info_dir = os.path.join('.', 'foo.egg-info')
619
+
620
+ sources_text = Path(egg_info_dir, "SOURCES.txt").read_text(encoding="utf-8")
621
+
622
+ if license_in_sources:
623
+ assert 'LICENSE' in sources_text
624
+ else:
625
+ assert 'LICENSE' not in sources_text
626
+ # for invalid license test
627
+ assert 'INVALID_LICENSE' not in sources_text
628
+
629
+ @pytest.mark.parametrize(
630
+ ('files', 'incl_licenses', 'excl_licenses'),
631
+ [
632
+ (
633
+ {
634
+ 'setup.cfg': DALS(
635
+ """
636
+ [metadata]
637
+ license_files =
638
+ LICENSE-ABC
639
+ LICENSE-XYZ
640
+ """
641
+ ),
642
+ 'LICENSE-ABC': "ABC license",
643
+ 'LICENSE-XYZ': "XYZ license",
644
+ },
645
+ ['LICENSE-ABC', 'LICENSE-XYZ'],
646
+ [],
647
+ ), # with licenses
648
+ (
649
+ {
650
+ 'setup.cfg': DALS(
651
+ """
652
+ [metadata]
653
+ license_files = LICENSE-ABC, LICENSE-XYZ
654
+ """
655
+ ),
656
+ 'LICENSE-ABC': "ABC license",
657
+ 'LICENSE-XYZ': "XYZ license",
658
+ },
659
+ ['LICENSE-ABC', 'LICENSE-XYZ'],
660
+ [],
661
+ ), # with commas
662
+ (
663
+ {
664
+ 'setup.cfg': DALS(
665
+ """
666
+ [metadata]
667
+ license_files =
668
+ LICENSE-ABC
669
+ """
670
+ ),
671
+ 'LICENSE-ABC': "ABC license",
672
+ 'LICENSE-XYZ': "XYZ license",
673
+ },
674
+ ['LICENSE-ABC'],
675
+ ['LICENSE-XYZ'],
676
+ ), # with one license
677
+ (
678
+ {
679
+ 'setup.cfg': DALS(
680
+ """
681
+ [metadata]
682
+ license_files =
683
+ """
684
+ ),
685
+ 'LICENSE-ABC': "ABC license",
686
+ 'LICENSE-XYZ': "XYZ license",
687
+ },
688
+ [],
689
+ ['LICENSE-ABC', 'LICENSE-XYZ'],
690
+ ), # empty
691
+ (
692
+ {
693
+ 'setup.cfg': DALS(
694
+ """
695
+ [metadata]
696
+ license_files = LICENSE-XYZ
697
+ """
698
+ ),
699
+ 'LICENSE-ABC': "ABC license",
700
+ 'LICENSE-XYZ': "XYZ license",
701
+ },
702
+ ['LICENSE-XYZ'],
703
+ ['LICENSE-ABC'],
704
+ ), # on same line
705
+ (
706
+ {
707
+ 'setup.cfg': DALS(
708
+ """
709
+ [metadata]
710
+ license_files =
711
+ LICENSE-ABC
712
+ INVALID_LICENSE
713
+ """
714
+ ),
715
+ 'LICENSE-ABC': "Test license",
716
+ },
717
+ ['LICENSE-ABC'],
718
+ ['INVALID_LICENSE'],
719
+ ), # with an invalid license
720
+ (
721
+ {
722
+ 'setup.cfg': DALS(
723
+ """
724
+ """
725
+ ),
726
+ 'LICENSE': "Test license",
727
+ },
728
+ ['LICENSE'],
729
+ [],
730
+ ), # no license_files attribute, LICENSE auto-included
731
+ (
732
+ {
733
+ 'setup.cfg': DALS(
734
+ """
735
+ [metadata]
736
+ license_files = LICENSE
737
+ """
738
+ ),
739
+ 'MANIFEST.in': "exclude LICENSE",
740
+ 'LICENSE': "Test license",
741
+ },
742
+ ['LICENSE'],
743
+ [],
744
+ ), # manifest is overwritten by license_files
745
+ (
746
+ {
747
+ 'setup.cfg': DALS(
748
+ """
749
+ [metadata]
750
+ license_files =
751
+ LICENSE-ABC
752
+ LICENSE-XYZ
753
+ """
754
+ ),
755
+ 'MANIFEST.in': "exclude LICENSE-XYZ",
756
+ 'LICENSE-ABC': "ABC license",
757
+ 'LICENSE-XYZ': "XYZ license",
758
+ # manifest is overwritten by license_files
759
+ },
760
+ ['LICENSE-ABC', 'LICENSE-XYZ'],
761
+ [],
762
+ ),
763
+ pytest.param(
764
+ {
765
+ 'setup.cfg': "",
766
+ 'LICENSE-ABC': "ABC license",
767
+ 'COPYING-ABC': "ABC copying",
768
+ 'NOTICE-ABC': "ABC notice",
769
+ 'AUTHORS-ABC': "ABC authors",
770
+ 'LICENCE-XYZ': "XYZ license",
771
+ 'LICENSE': "License",
772
+ 'INVALID-LICENSE': "Invalid license",
773
+ },
774
+ [
775
+ 'LICENSE-ABC',
776
+ 'COPYING-ABC',
777
+ 'NOTICE-ABC',
778
+ 'AUTHORS-ABC',
779
+ 'LICENCE-XYZ',
780
+ 'LICENSE',
781
+ ],
782
+ ['INVALID-LICENSE'],
783
+ # ('LICEN[CS]E*', 'COPYING*', 'NOTICE*', 'AUTHORS*')
784
+ id="default_glob_patterns",
785
+ ),
786
+ pytest.param(
787
+ {
788
+ 'setup.cfg': DALS(
789
+ """
790
+ [metadata]
791
+ license_files =
792
+ LICENSE*
793
+ """
794
+ ),
795
+ 'LICENSE-ABC': "ABC license",
796
+ 'NOTICE-XYZ': "XYZ notice",
797
+ },
798
+ ['LICENSE-ABC'],
799
+ ['NOTICE-XYZ'],
800
+ id="no_default_glob_patterns",
801
+ ),
802
+ pytest.param(
803
+ {
804
+ 'setup.cfg': DALS(
805
+ """
806
+ [metadata]
807
+ license_files =
808
+ LICENSE-ABC
809
+ LICENSE*
810
+ """
811
+ ),
812
+ 'LICENSE-ABC': "ABC license",
813
+ },
814
+ ['LICENSE-ABC'],
815
+ [],
816
+ id="files_only_added_once",
817
+ ),
818
+ pytest.param(
819
+ {
820
+ 'setup.cfg': DALS(
821
+ """
822
+ [metadata]
823
+ license_files = **/LICENSE
824
+ """
825
+ ),
826
+ 'LICENSE': "ABC license",
827
+ 'LICENSE-OTHER': "Don't include",
828
+ 'vendor': {'LICENSE': "Vendor license"},
829
+ },
830
+ ['LICENSE', 'vendor/LICENSE'],
831
+ ['LICENSE-OTHER'],
832
+ id="recursive_glob",
833
+ ),
834
+ ],
835
+ )
836
+ def test_setup_cfg_license_files(
837
+ self, tmpdir_cwd, env, files, incl_licenses, excl_licenses
838
+ ):
839
+ self._create_project()
840
+ path.build(files)
841
+
842
+ environment.run_setup_py(
843
+ cmd=['egg_info'],
844
+ pypath=os.pathsep.join([env.paths['lib'], str(tmpdir_cwd)]),
845
+ )
846
+ egg_info_dir = os.path.join('.', 'foo.egg-info')
847
+
848
+ sources_text = Path(egg_info_dir, "SOURCES.txt").read_text(encoding="utf-8")
849
+ sources_lines = [line.strip() for line in sources_text.splitlines()]
850
+
851
+ for lf in incl_licenses:
852
+ assert sources_lines.count(lf) == 1
853
+
854
+ for lf in excl_licenses:
855
+ assert sources_lines.count(lf) == 0
856
+
857
+ @pytest.mark.parametrize(
858
+ ('files', 'incl_licenses', 'excl_licenses'),
859
+ [
860
+ (
861
+ {
862
+ 'setup.cfg': DALS(
863
+ """
864
+ [metadata]
865
+ license_file =
866
+ license_files =
867
+ """
868
+ ),
869
+ 'LICENSE-ABC': "ABC license",
870
+ 'LICENSE-XYZ': "XYZ license",
871
+ },
872
+ [],
873
+ ['LICENSE-ABC', 'LICENSE-XYZ'],
874
+ ), # both empty
875
+ (
876
+ {
877
+ 'setup.cfg': DALS(
878
+ """
879
+ [metadata]
880
+ license_file =
881
+ LICENSE-ABC
882
+ LICENSE-XYZ
883
+ """
884
+ ),
885
+ 'LICENSE-ABC': "ABC license",
886
+ 'LICENSE-XYZ': "XYZ license",
887
+ # license_file is still singular
888
+ },
889
+ [],
890
+ ['LICENSE-ABC', 'LICENSE-XYZ'],
891
+ ),
892
+ (
893
+ {
894
+ 'setup.cfg': DALS(
895
+ """
896
+ [metadata]
897
+ license_file = LICENSE-ABC
898
+ license_files =
899
+ LICENSE-XYZ
900
+ LICENSE-PQR
901
+ """
902
+ ),
903
+ 'LICENSE-ABC': "ABC license",
904
+ 'LICENSE-PQR': "PQR license",
905
+ 'LICENSE-XYZ': "XYZ license",
906
+ },
907
+ ['LICENSE-ABC', 'LICENSE-PQR', 'LICENSE-XYZ'],
908
+ [],
909
+ ), # combined
910
+ (
911
+ {
912
+ 'setup.cfg': DALS(
913
+ """
914
+ [metadata]
915
+ license_file = LICENSE-ABC
916
+ license_files =
917
+ LICENSE-ABC
918
+ LICENSE-XYZ
919
+ LICENSE-PQR
920
+ """
921
+ ),
922
+ 'LICENSE-ABC': "ABC license",
923
+ 'LICENSE-PQR': "PQR license",
924
+ 'LICENSE-XYZ': "XYZ license",
925
+ # duplicate license
926
+ },
927
+ ['LICENSE-ABC', 'LICENSE-PQR', 'LICENSE-XYZ'],
928
+ [],
929
+ ),
930
+ (
931
+ {
932
+ 'setup.cfg': DALS(
933
+ """
934
+ [metadata]
935
+ license_file = LICENSE-ABC
936
+ license_files =
937
+ LICENSE-XYZ
938
+ """
939
+ ),
940
+ 'LICENSE-ABC': "ABC license",
941
+ 'LICENSE-PQR': "PQR license",
942
+ 'LICENSE-XYZ': "XYZ license",
943
+ # combined subset
944
+ },
945
+ ['LICENSE-ABC', 'LICENSE-XYZ'],
946
+ ['LICENSE-PQR'],
947
+ ),
948
+ (
949
+ {
950
+ 'setup.cfg': DALS(
951
+ """
952
+ [metadata]
953
+ license_file = LICENSE-ABC
954
+ license_files =
955
+ LICENSE-XYZ
956
+ LICENSE-PQR
957
+ """
958
+ ),
959
+ 'LICENSE-PQR': "Test license",
960
+ # with invalid licenses
961
+ },
962
+ ['LICENSE-PQR'],
963
+ ['LICENSE-ABC', 'LICENSE-XYZ'],
964
+ ),
965
+ (
966
+ {
967
+ 'setup.cfg': DALS(
968
+ """
969
+ [metadata]
970
+ license_file = LICENSE-ABC
971
+ license_files =
972
+ LICENSE-PQR
973
+ LICENSE-XYZ
974
+ """
975
+ ),
976
+ 'MANIFEST.in': "exclude LICENSE-ABC\nexclude LICENSE-PQR",
977
+ 'LICENSE-ABC': "ABC license",
978
+ 'LICENSE-PQR': "PQR license",
979
+ 'LICENSE-XYZ': "XYZ license",
980
+ # manifest is overwritten
981
+ },
982
+ ['LICENSE-ABC', 'LICENSE-PQR', 'LICENSE-XYZ'],
983
+ [],
984
+ ),
985
+ pytest.param(
986
+ {
987
+ 'setup.cfg': DALS(
988
+ """
989
+ [metadata]
990
+ license_file = LICENSE*
991
+ """
992
+ ),
993
+ 'LICENSE-ABC': "ABC license",
994
+ 'NOTICE-XYZ': "XYZ notice",
995
+ },
996
+ ['LICENSE-ABC'],
997
+ ['NOTICE-XYZ'],
998
+ id="no_default_glob_patterns",
999
+ ),
1000
+ pytest.param(
1001
+ {
1002
+ 'setup.cfg': DALS(
1003
+ """
1004
+ [metadata]
1005
+ license_file = LICENSE*
1006
+ license_files =
1007
+ NOTICE*
1008
+ """
1009
+ ),
1010
+ 'LICENSE-ABC': "ABC license",
1011
+ 'NOTICE-ABC': "ABC notice",
1012
+ 'AUTHORS-ABC': "ABC authors",
1013
+ },
1014
+ ['LICENSE-ABC', 'NOTICE-ABC'],
1015
+ ['AUTHORS-ABC'],
1016
+ id="combined_glob_patterrns",
1017
+ ),
1018
+ ],
1019
+ )
1020
+ def test_setup_cfg_license_file_license_files(
1021
+ self, tmpdir_cwd, env, files, incl_licenses, excl_licenses
1022
+ ):
1023
+ self._create_project()
1024
+ path.build(files)
1025
+
1026
+ environment.run_setup_py(
1027
+ cmd=['egg_info'],
1028
+ pypath=os.pathsep.join([env.paths['lib'], str(tmpdir_cwd)]),
1029
+ )
1030
+ egg_info_dir = os.path.join('.', 'foo.egg-info')
1031
+
1032
+ sources_text = Path(egg_info_dir, "SOURCES.txt").read_text(encoding="utf-8")
1033
+ sources_lines = [line.strip() for line in sources_text.splitlines()]
1034
+
1035
+ for lf in incl_licenses:
1036
+ assert sources_lines.count(lf) == 1
1037
+
1038
+ for lf in excl_licenses:
1039
+ assert sources_lines.count(lf) == 0
1040
+
1041
+ def test_license_file_attr_pkg_info(self, tmpdir_cwd, env):
1042
+ """All matched license files should have a corresponding License-File."""
1043
+ self._create_project()
1044
+ path.build({
1045
+ "setup.cfg": DALS(
1046
+ """
1047
+ [metadata]
1048
+ license_files =
1049
+ NOTICE*
1050
+ LICENSE*
1051
+ **/LICENSE
1052
+ """
1053
+ ),
1054
+ "LICENSE-ABC": "ABC license",
1055
+ "LICENSE-XYZ": "XYZ license",
1056
+ "NOTICE": "included",
1057
+ "IGNORE": "not include",
1058
+ "vendor": {'LICENSE': "Vendor license"},
1059
+ })
1060
+
1061
+ environment.run_setup_py(
1062
+ cmd=['egg_info'],
1063
+ pypath=os.pathsep.join([env.paths['lib'], str(tmpdir_cwd)]),
1064
+ )
1065
+ egg_info_dir = os.path.join('.', 'foo.egg-info')
1066
+ with open(os.path.join(egg_info_dir, 'PKG-INFO'), encoding="utf-8") as fp:
1067
+ pkg_info_lines = fp.read().split('\n')
1068
+ license_file_lines = [
1069
+ line for line in pkg_info_lines if line.startswith('License-File:')
1070
+ ]
1071
+
1072
+ # Only 'NOTICE', LICENSE-ABC', and 'LICENSE-XYZ' should have been matched
1073
+ # Also assert that order from license_files is keeped
1074
+ assert len(license_file_lines) == 4
1075
+ assert "License-File: NOTICE" == license_file_lines[0]
1076
+ assert "License-File: LICENSE-ABC" in license_file_lines[1:]
1077
+ assert "License-File: LICENSE-XYZ" in license_file_lines[1:]
1078
+ assert "License-File: vendor/LICENSE" in license_file_lines[3]
1079
+
1080
+ def test_metadata_version(self, tmpdir_cwd, env):
1081
+ """Make sure latest metadata version is used by default."""
1082
+ self._setup_script_with_requires("")
1083
+ environment.run_setup_py(
1084
+ cmd=['egg_info'],
1085
+ pypath=os.pathsep.join([env.paths['lib'], str(tmpdir_cwd)]),
1086
+ data_stream=1,
1087
+ )
1088
+ egg_info_dir = os.path.join('.', 'foo.egg-info')
1089
+ with open(os.path.join(egg_info_dir, 'PKG-INFO'), encoding="utf-8") as fp:
1090
+ pkg_info_lines = fp.read().split('\n')
1091
+ # Update metadata version if changed
1092
+ assert self._extract_mv_version(pkg_info_lines) == (2, 4)
1093
+
1094
+ def test_long_description_content_type(self, tmpdir_cwd, env):
1095
+ # Test that specifying a `long_description_content_type` keyword arg to
1096
+ # the `setup` function results in writing a `Description-Content-Type`
1097
+ # line to the `PKG-INFO` file in the `<distribution>.egg-info`
1098
+ # directory.
1099
+ # `Description-Content-Type` is described at
1100
+ # https://github.com/pypa/python-packaging-user-guide/pull/258
1101
+
1102
+ self._setup_script_with_requires(
1103
+ """long_description_content_type='text/markdown',"""
1104
+ )
1105
+ environ = os.environ.copy().update(
1106
+ HOME=env.paths['home'],
1107
+ )
1108
+ environment.run_setup_py(
1109
+ cmd=['egg_info'],
1110
+ pypath=os.pathsep.join([env.paths['lib'], str(tmpdir_cwd)]),
1111
+ data_stream=1,
1112
+ env=environ,
1113
+ )
1114
+ egg_info_dir = os.path.join('.', 'foo.egg-info')
1115
+ with open(os.path.join(egg_info_dir, 'PKG-INFO'), encoding="utf-8") as fp:
1116
+ pkg_info_lines = fp.read().split('\n')
1117
+ expected_line = 'Description-Content-Type: text/markdown'
1118
+ assert expected_line in pkg_info_lines
1119
+ assert 'Metadata-Version: 2.4' in pkg_info_lines
1120
+
1121
+ def test_long_description(self, tmpdir_cwd, env):
1122
+ # Test that specifying `long_description` and `long_description_content_type`
1123
+ # keyword args to the `setup` function results in writing
1124
+ # the description in the message payload of the `PKG-INFO` file
1125
+ # in the `<distribution>.egg-info` directory.
1126
+ self._setup_script_with_requires(
1127
+ "long_description='This is a long description\\nover multiple lines',"
1128
+ "long_description_content_type='text/markdown',"
1129
+ )
1130
+ environment.run_setup_py(
1131
+ cmd=['egg_info'],
1132
+ pypath=os.pathsep.join([env.paths['lib'], str(tmpdir_cwd)]),
1133
+ data_stream=1,
1134
+ )
1135
+ egg_info_dir = os.path.join('.', 'foo.egg-info')
1136
+ with open(os.path.join(egg_info_dir, 'PKG-INFO'), encoding="utf-8") as fp:
1137
+ pkg_info_lines = fp.read().split('\n')
1138
+ assert 'Metadata-Version: 2.4' in pkg_info_lines
1139
+ assert '' == pkg_info_lines[-1] # last line should be empty
1140
+ long_desc_lines = pkg_info_lines[pkg_info_lines.index('') :]
1141
+ assert 'This is a long description' in long_desc_lines
1142
+ assert 'over multiple lines' in long_desc_lines
1143
+
1144
+ def test_project_urls(self, tmpdir_cwd, env):
1145
+ # Test that specifying a `project_urls` dict to the `setup`
1146
+ # function results in writing multiple `Project-URL` lines to
1147
+ # the `PKG-INFO` file in the `<distribution>.egg-info`
1148
+ # directory.
1149
+ # `Project-URL` is described at https://packaging.python.org
1150
+ # /specifications/core-metadata/#project-url-multiple-use
1151
+
1152
+ self._setup_script_with_requires(
1153
+ """project_urls={
1154
+ 'Link One': 'https://example.com/one/',
1155
+ 'Link Two': 'https://example.com/two/',
1156
+ },"""
1157
+ )
1158
+ environ = os.environ.copy().update(
1159
+ HOME=env.paths['home'],
1160
+ )
1161
+ environment.run_setup_py(
1162
+ cmd=['egg_info'],
1163
+ pypath=os.pathsep.join([env.paths['lib'], str(tmpdir_cwd)]),
1164
+ data_stream=1,
1165
+ env=environ,
1166
+ )
1167
+ egg_info_dir = os.path.join('.', 'foo.egg-info')
1168
+ with open(os.path.join(egg_info_dir, 'PKG-INFO'), encoding="utf-8") as fp:
1169
+ pkg_info_lines = fp.read().split('\n')
1170
+ expected_line = 'Project-URL: Link One, https://example.com/one/'
1171
+ assert expected_line in pkg_info_lines
1172
+ expected_line = 'Project-URL: Link Two, https://example.com/two/'
1173
+ assert expected_line in pkg_info_lines
1174
+ assert self._extract_mv_version(pkg_info_lines) >= (1, 2)
1175
+
1176
+ def test_license(self, tmpdir_cwd, env):
1177
+ """Test single line license."""
1178
+ self._setup_script_with_requires("license='MIT',")
1179
+ environment.run_setup_py(
1180
+ cmd=['egg_info'],
1181
+ pypath=os.pathsep.join([env.paths['lib'], str(tmpdir_cwd)]),
1182
+ data_stream=1,
1183
+ )
1184
+ egg_info_dir = os.path.join('.', 'foo.egg-info')
1185
+ with open(os.path.join(egg_info_dir, 'PKG-INFO'), encoding="utf-8") as fp:
1186
+ pkg_info_lines = fp.read().split('\n')
1187
+ assert 'License: MIT' in pkg_info_lines
1188
+
1189
+ def test_license_escape(self, tmpdir_cwd, env):
1190
+ """Test license is escaped correctly if longer than one line."""
1191
+ self._setup_script_with_requires(
1192
+ "license='This is a long license text \\nover multiple lines',"
1193
+ )
1194
+ environment.run_setup_py(
1195
+ cmd=['egg_info'],
1196
+ pypath=os.pathsep.join([env.paths['lib'], str(tmpdir_cwd)]),
1197
+ data_stream=1,
1198
+ )
1199
+ egg_info_dir = os.path.join('.', 'foo.egg-info')
1200
+ with open(os.path.join(egg_info_dir, 'PKG-INFO'), encoding="utf-8") as fp:
1201
+ pkg_info_lines = fp.read().split('\n')
1202
+
1203
+ assert 'License: This is a long license text ' in pkg_info_lines
1204
+ assert ' over multiple lines' in pkg_info_lines
1205
+ assert 'text \n over multiple' in '\n'.join(pkg_info_lines)
1206
+
1207
+ def test_python_requires_egg_info(self, tmpdir_cwd, env):
1208
+ self._setup_script_with_requires("""python_requires='>=2.7.12',""")
1209
+ environ = os.environ.copy().update(
1210
+ HOME=env.paths['home'],
1211
+ )
1212
+ environment.run_setup_py(
1213
+ cmd=['egg_info'],
1214
+ pypath=os.pathsep.join([env.paths['lib'], str(tmpdir_cwd)]),
1215
+ data_stream=1,
1216
+ env=environ,
1217
+ )
1218
+ egg_info_dir = os.path.join('.', 'foo.egg-info')
1219
+ with open(os.path.join(egg_info_dir, 'PKG-INFO'), encoding="utf-8") as fp:
1220
+ pkg_info_lines = fp.read().split('\n')
1221
+ assert 'Requires-Python: >=2.7.12' in pkg_info_lines
1222
+ assert self._extract_mv_version(pkg_info_lines) >= (1, 2)
1223
+
1224
+ def test_manifest_maker_warning_suppression(self):
1225
+ fixtures = [
1226
+ "standard file not found: should have one of foo.py, bar.py",
1227
+ "standard file 'setup.py' not found",
1228
+ ]
1229
+
1230
+ for msg in fixtures:
1231
+ assert manifest_maker._should_suppress_warning(msg)
1232
+
1233
+ def test_egg_info_includes_setup_py(self, tmpdir_cwd):
1234
+ self._create_project()
1235
+ dist = Distribution({"name": "foo", "version": "0.0.1"})
1236
+ dist.script_name = "non_setup.py"
1237
+ egg_info_instance = egg_info(dist)
1238
+ egg_info_instance.finalize_options()
1239
+ egg_info_instance.run()
1240
+
1241
+ assert 'setup.py' in egg_info_instance.filelist.files
1242
+
1243
+ with open(egg_info_instance.egg_info + "/SOURCES.txt", encoding="utf-8") as f:
1244
+ sources = f.read().split('\n')
1245
+ assert 'setup.py' in sources
1246
+
1247
+ def _run_egg_info_command(self, tmpdir_cwd, env, cmd=None, output=None):
1248
+ environ = os.environ.copy().update(
1249
+ HOME=env.paths['home'],
1250
+ )
1251
+ if cmd is None:
1252
+ cmd = [
1253
+ 'egg_info',
1254
+ ]
1255
+ code, data = environment.run_setup_py(
1256
+ cmd=cmd,
1257
+ pypath=os.pathsep.join([env.paths['lib'], str(tmpdir_cwd)]),
1258
+ data_stream=1,
1259
+ env=environ,
1260
+ )
1261
+ assert not code, data
1262
+
1263
+ if output:
1264
+ assert output in data
1265
+
1266
+ def test_egg_info_tag_only_once(self, tmpdir_cwd, env):
1267
+ self._create_project()
1268
+ path.build({
1269
+ 'setup.cfg': DALS(
1270
+ """
1271
+ [egg_info]
1272
+ tag_build = dev
1273
+ tag_date = 0
1274
+ tag_svn_revision = 0
1275
+ """
1276
+ ),
1277
+ })
1278
+ self._run_egg_info_command(tmpdir_cwd, env)
1279
+ egg_info_dir = os.path.join('.', 'foo.egg-info')
1280
+ with open(os.path.join(egg_info_dir, 'PKG-INFO'), encoding="utf-8") as fp:
1281
+ pkg_info_lines = fp.read().split('\n')
1282
+ assert 'Version: 0.0.0.dev0' in pkg_info_lines
1283
+
1284
+
1285
+ class TestWriteEntries:
1286
+ def test_invalid_entry_point(self, tmpdir_cwd, env):
1287
+ dist = Distribution({"name": "foo", "version": "0.0.1"})
1288
+ dist.entry_points = {"foo": "foo = invalid-identifier:foo"}
1289
+ cmd = dist.get_command_obj("egg_info")
1290
+ expected_msg = r"(Invalid object reference|Problems to parse)"
1291
+ with pytest.raises((errors.OptionError, ValueError), match=expected_msg) as ex:
1292
+ write_entries(cmd, "entry_points", "entry_points.txt")
1293
+ assert "ensure entry-point follows the spec" in ex.value.args[0]
1294
+ assert "invalid-identifier" in str(ex.value)
1295
+
1296
+ def test_valid_entry_point(self, tmpdir_cwd, env):
1297
+ dist = Distribution({"name": "foo", "version": "0.0.1"})
1298
+ dist.entry_points = {
1299
+ "abc": "foo = bar:baz",
1300
+ "def": ["faa = bor:boz"],
1301
+ }
1302
+ cmd = dist.get_command_obj("egg_info")
1303
+ write_entries(cmd, "entry_points", "entry_points.txt")
1304
+ content = Path("entry_points.txt").read_text(encoding="utf-8")
1305
+ assert "[abc]\nfoo = bar:baz\n" in content
1306
+ assert "[def]\nfaa = bor:boz\n" in content