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,980 @@
1
+ import configparser
2
+ import contextlib
3
+ import inspect
4
+ import re
5
+ from pathlib import Path
6
+ from unittest.mock import Mock, patch
7
+
8
+ import pytest
9
+ from packaging.requirements import InvalidRequirement
10
+
11
+ from setuptools.config.setupcfg import ConfigHandler, Target, read_configuration
12
+ from setuptools.dist import Distribution, _Distribution
13
+ from setuptools.warnings import SetuptoolsDeprecationWarning
14
+
15
+ from ..textwrap import DALS
16
+
17
+ from distutils.errors import DistutilsFileError, DistutilsOptionError
18
+
19
+
20
+ class ErrConfigHandler(ConfigHandler[Target]):
21
+ """Erroneous handler. Fails to implement required methods."""
22
+
23
+ section_prefix = "**err**"
24
+
25
+
26
+ def make_package_dir(name, base_dir, ns=False):
27
+ dir_package = base_dir
28
+ for dir_name in name.split('/'):
29
+ dir_package = dir_package.mkdir(dir_name)
30
+ init_file = None
31
+ if not ns:
32
+ init_file = dir_package.join('__init__.py')
33
+ init_file.write('')
34
+ return dir_package, init_file
35
+
36
+
37
+ def fake_env(
38
+ tmpdir, setup_cfg, setup_py=None, encoding='ascii', package_path='fake_package'
39
+ ):
40
+ if setup_py is None:
41
+ setup_py = 'from setuptools import setup\nsetup()\n'
42
+
43
+ tmpdir.join('setup.py').write(setup_py)
44
+ config = tmpdir.join('setup.cfg')
45
+ config.write(setup_cfg.encode(encoding), mode='wb')
46
+
47
+ package_dir, init_file = make_package_dir(package_path, tmpdir)
48
+
49
+ init_file.write(
50
+ 'VERSION = (1, 2, 3)\n'
51
+ '\n'
52
+ 'VERSION_MAJOR = 1'
53
+ '\n'
54
+ 'def get_version():\n'
55
+ ' return [3, 4, 5, "dev"]\n'
56
+ '\n'
57
+ )
58
+
59
+ return package_dir, config
60
+
61
+
62
+ @contextlib.contextmanager
63
+ def get_dist(tmpdir, kwargs_initial=None, parse=True):
64
+ kwargs_initial = kwargs_initial or {}
65
+
66
+ with tmpdir.as_cwd():
67
+ dist = Distribution(kwargs_initial)
68
+ dist.script_name = 'setup.py'
69
+ parse and dist.parse_config_files()
70
+
71
+ yield dist
72
+
73
+
74
+ def test_parsers_implemented():
75
+ with pytest.raises(NotImplementedError):
76
+ handler = ErrConfigHandler(None, {}, False, Mock())
77
+ handler.parsers
78
+
79
+
80
+ class TestConfigurationReader:
81
+ def test_basic(self, tmpdir):
82
+ _, config = fake_env(
83
+ tmpdir,
84
+ '[metadata]\n'
85
+ 'version = 10.1.1\n'
86
+ 'keywords = one, two\n'
87
+ '\n'
88
+ '[options]\n'
89
+ 'scripts = bin/a.py, bin/b.py\n',
90
+ )
91
+ config_dict = read_configuration(str(config))
92
+ assert config_dict['metadata']['version'] == '10.1.1'
93
+ assert config_dict['metadata']['keywords'] == ['one', 'two']
94
+ assert config_dict['options']['scripts'] == ['bin/a.py', 'bin/b.py']
95
+
96
+ def test_no_config(self, tmpdir):
97
+ with pytest.raises(DistutilsFileError):
98
+ read_configuration(str(tmpdir.join('setup.cfg')))
99
+
100
+ def test_ignore_errors(self, tmpdir):
101
+ _, config = fake_env(
102
+ tmpdir,
103
+ '[metadata]\nversion = attr: none.VERSION\nkeywords = one, two\n',
104
+ )
105
+ with pytest.raises(ImportError):
106
+ read_configuration(str(config))
107
+
108
+ config_dict = read_configuration(str(config), ignore_option_errors=True)
109
+
110
+ assert config_dict['metadata']['keywords'] == ['one', 'two']
111
+ assert 'version' not in config_dict['metadata']
112
+
113
+ config.remove()
114
+
115
+
116
+ class TestMetadata:
117
+ def test_basic(self, tmpdir):
118
+ fake_env(
119
+ tmpdir,
120
+ '[metadata]\n'
121
+ 'version = 10.1.1\n'
122
+ 'description = Some description\n'
123
+ 'long_description_content_type = text/something\n'
124
+ 'long_description = file: README\n'
125
+ 'name = fake_name\n'
126
+ 'keywords = one, two\n'
127
+ 'provides = package, package.sub\n'
128
+ 'license = otherlic\n'
129
+ 'download_url = http://test.test.com/test/\n'
130
+ 'maintainer_email = test@test.com\n',
131
+ )
132
+
133
+ tmpdir.join('README').write('readme contents\nline2')
134
+
135
+ meta_initial = {
136
+ # This will be used so `otherlic` won't replace it.
137
+ 'license': 'BSD 3-Clause License',
138
+ }
139
+
140
+ with get_dist(tmpdir, meta_initial) as dist:
141
+ metadata = dist.metadata
142
+
143
+ assert metadata.version == '10.1.1'
144
+ assert metadata.description == 'Some description'
145
+ assert metadata.long_description_content_type == 'text/something'
146
+ assert metadata.long_description == 'readme contents\nline2'
147
+ assert metadata.provides == ['package', 'package.sub']
148
+ assert metadata.license == 'BSD 3-Clause License'
149
+ assert metadata.name == 'fake_name'
150
+ assert metadata.keywords == ['one', 'two']
151
+ assert metadata.download_url == 'http://test.test.com/test/'
152
+ assert metadata.maintainer_email == 'test@test.com'
153
+
154
+ def test_license_cfg(self, tmpdir):
155
+ fake_env(
156
+ tmpdir,
157
+ DALS(
158
+ """
159
+ [metadata]
160
+ name=foo
161
+ version=0.0.1
162
+ license=Apache 2.0
163
+ """
164
+ ),
165
+ )
166
+
167
+ with get_dist(tmpdir) as dist:
168
+ metadata = dist.metadata
169
+
170
+ assert metadata.name == "foo"
171
+ assert metadata.version == "0.0.1"
172
+ assert metadata.license == "Apache 2.0"
173
+
174
+ def test_file_mixed(self, tmpdir):
175
+ fake_env(
176
+ tmpdir,
177
+ '[metadata]\nlong_description = file: README.rst, CHANGES.rst\n\n',
178
+ )
179
+
180
+ tmpdir.join('README.rst').write('readme contents\nline2')
181
+ tmpdir.join('CHANGES.rst').write('changelog contents\nand stuff')
182
+
183
+ with get_dist(tmpdir) as dist:
184
+ assert dist.metadata.long_description == (
185
+ 'readme contents\nline2\nchangelog contents\nand stuff'
186
+ )
187
+
188
+ def test_file_sandboxed(self, tmpdir):
189
+ tmpdir.ensure("README")
190
+ project = tmpdir.join('depth1', 'depth2')
191
+ project.ensure(dir=True)
192
+ fake_env(project, '[metadata]\nlong_description = file: ../../README\n')
193
+
194
+ with get_dist(project, parse=False) as dist:
195
+ with pytest.raises(DistutilsOptionError):
196
+ dist.parse_config_files() # file: out of sandbox
197
+
198
+ def test_aliases(self, tmpdir):
199
+ fake_env(
200
+ tmpdir,
201
+ '[metadata]\n'
202
+ 'author_email = test@test.com\n'
203
+ 'home_page = http://test.test.com/test/\n'
204
+ 'summary = Short summary\n'
205
+ 'platform = a, b\n'
206
+ 'classifier =\n'
207
+ ' Framework :: Django\n'
208
+ ' Programming Language :: Python :: 3.5\n',
209
+ )
210
+
211
+ with get_dist(tmpdir) as dist:
212
+ metadata = dist.metadata
213
+ assert metadata.author_email == 'test@test.com'
214
+ assert metadata.url == 'http://test.test.com/test/'
215
+ assert metadata.description == 'Short summary'
216
+ assert metadata.platforms == ['a', 'b']
217
+ assert metadata.classifiers == [
218
+ 'Framework :: Django',
219
+ 'Programming Language :: Python :: 3.5',
220
+ ]
221
+
222
+ def test_multiline(self, tmpdir):
223
+ fake_env(
224
+ tmpdir,
225
+ '[metadata]\n'
226
+ 'name = fake_name\n'
227
+ 'keywords =\n'
228
+ ' one\n'
229
+ ' two\n'
230
+ 'classifiers =\n'
231
+ ' Framework :: Django\n'
232
+ ' Programming Language :: Python :: 3.5\n',
233
+ )
234
+ with get_dist(tmpdir) as dist:
235
+ metadata = dist.metadata
236
+ assert metadata.keywords == ['one', 'two']
237
+ assert metadata.classifiers == [
238
+ 'Framework :: Django',
239
+ 'Programming Language :: Python :: 3.5',
240
+ ]
241
+
242
+ def test_dict(self, tmpdir):
243
+ fake_env(
244
+ tmpdir,
245
+ '[metadata]\n'
246
+ 'project_urls =\n'
247
+ ' Link One = https://example.com/one/\n'
248
+ ' Link Two = https://example.com/two/\n',
249
+ )
250
+ with get_dist(tmpdir) as dist:
251
+ metadata = dist.metadata
252
+ assert metadata.project_urls == {
253
+ 'Link One': 'https://example.com/one/',
254
+ 'Link Two': 'https://example.com/two/',
255
+ }
256
+
257
+ def test_version(self, tmpdir):
258
+ package_dir, config = fake_env(
259
+ tmpdir, '[metadata]\nversion = attr: fake_package.VERSION\n'
260
+ )
261
+
262
+ sub_a = package_dir.mkdir('subpkg_a')
263
+ sub_a.join('__init__.py').write('')
264
+ sub_a.join('mod.py').write('VERSION = (2016, 11, 26)')
265
+
266
+ sub_b = package_dir.mkdir('subpkg_b')
267
+ sub_b.join('__init__.py').write('')
268
+ sub_b.join('mod.py').write(
269
+ 'import third_party_module\nVERSION = (2016, 11, 26)'
270
+ )
271
+
272
+ with get_dist(tmpdir) as dist:
273
+ assert dist.metadata.version == '1.2.3'
274
+
275
+ config.write('[metadata]\nversion = attr: fake_package.get_version\n')
276
+ with get_dist(tmpdir) as dist:
277
+ assert dist.metadata.version == '3.4.5.dev'
278
+
279
+ config.write('[metadata]\nversion = attr: fake_package.VERSION_MAJOR\n')
280
+ with get_dist(tmpdir) as dist:
281
+ assert dist.metadata.version == '1'
282
+
283
+ config.write('[metadata]\nversion = attr: fake_package.subpkg_a.mod.VERSION\n')
284
+ with get_dist(tmpdir) as dist:
285
+ assert dist.metadata.version == '2016.11.26'
286
+
287
+ config.write('[metadata]\nversion = attr: fake_package.subpkg_b.mod.VERSION\n')
288
+ with get_dist(tmpdir) as dist:
289
+ assert dist.metadata.version == '2016.11.26'
290
+
291
+ def test_version_file(self, tmpdir):
292
+ fake_env(tmpdir, '[metadata]\nversion = file: fake_package/version.txt\n')
293
+ tmpdir.join('fake_package', 'version.txt').write('1.2.3\n')
294
+
295
+ with get_dist(tmpdir) as dist:
296
+ assert dist.metadata.version == '1.2.3'
297
+
298
+ tmpdir.join('fake_package', 'version.txt').write('1.2.3\n4.5.6\n')
299
+ with pytest.raises(DistutilsOptionError):
300
+ with get_dist(tmpdir) as dist:
301
+ dist.metadata.version
302
+
303
+ def test_version_with_package_dir_simple(self, tmpdir):
304
+ fake_env(
305
+ tmpdir,
306
+ '[metadata]\n'
307
+ 'version = attr: fake_package_simple.VERSION\n'
308
+ '[options]\n'
309
+ 'package_dir =\n'
310
+ ' = src\n',
311
+ package_path='src/fake_package_simple',
312
+ )
313
+
314
+ with get_dist(tmpdir) as dist:
315
+ assert dist.metadata.version == '1.2.3'
316
+
317
+ def test_version_with_package_dir_rename(self, tmpdir):
318
+ fake_env(
319
+ tmpdir,
320
+ '[metadata]\n'
321
+ 'version = attr: fake_package_rename.VERSION\n'
322
+ '[options]\n'
323
+ 'package_dir =\n'
324
+ ' fake_package_rename = fake_dir\n',
325
+ package_path='fake_dir',
326
+ )
327
+
328
+ with get_dist(tmpdir) as dist:
329
+ assert dist.metadata.version == '1.2.3'
330
+
331
+ def test_version_with_package_dir_complex(self, tmpdir):
332
+ fake_env(
333
+ tmpdir,
334
+ '[metadata]\n'
335
+ 'version = attr: fake_package_complex.VERSION\n'
336
+ '[options]\n'
337
+ 'package_dir =\n'
338
+ ' fake_package_complex = src/fake_dir\n',
339
+ package_path='src/fake_dir',
340
+ )
341
+
342
+ with get_dist(tmpdir) as dist:
343
+ assert dist.metadata.version == '1.2.3'
344
+
345
+ def test_unknown_meta_item(self, tmpdir):
346
+ fake_env(tmpdir, '[metadata]\nname = fake_name\nunknown = some\n')
347
+ with get_dist(tmpdir, parse=False) as dist:
348
+ dist.parse_config_files() # Skip unknown.
349
+
350
+ def test_usupported_section(self, tmpdir):
351
+ fake_env(tmpdir, '[metadata.some]\nkey = val\n')
352
+ with get_dist(tmpdir, parse=False) as dist:
353
+ with pytest.raises(DistutilsOptionError):
354
+ dist.parse_config_files()
355
+
356
+ def test_classifiers(self, tmpdir):
357
+ expected = set([
358
+ 'Framework :: Django',
359
+ 'Programming Language :: Python :: 3',
360
+ 'Programming Language :: Python :: 3.5',
361
+ ])
362
+
363
+ # From file.
364
+ _, config = fake_env(tmpdir, '[metadata]\nclassifiers = file: classifiers\n')
365
+
366
+ tmpdir.join('classifiers').write(
367
+ 'Framework :: Django\n'
368
+ 'Programming Language :: Python :: 3\n'
369
+ 'Programming Language :: Python :: 3.5\n'
370
+ )
371
+
372
+ with get_dist(tmpdir) as dist:
373
+ assert set(dist.metadata.classifiers) == expected
374
+
375
+ # From list notation
376
+ config.write(
377
+ '[metadata]\n'
378
+ 'classifiers =\n'
379
+ ' Framework :: Django\n'
380
+ ' Programming Language :: Python :: 3\n'
381
+ ' Programming Language :: Python :: 3.5\n'
382
+ )
383
+ with get_dist(tmpdir) as dist:
384
+ assert set(dist.metadata.classifiers) == expected
385
+
386
+ def test_interpolation(self, tmpdir):
387
+ fake_env(tmpdir, '[metadata]\ndescription = %(message)s\n')
388
+ with pytest.raises(configparser.InterpolationMissingOptionError):
389
+ with get_dist(tmpdir):
390
+ pass
391
+
392
+ def test_non_ascii_1(self, tmpdir):
393
+ fake_env(tmpdir, '[metadata]\ndescription = éàïôñ\n', encoding='utf-8')
394
+ with get_dist(tmpdir):
395
+ pass
396
+
397
+ def test_non_ascii_3(self, tmpdir):
398
+ fake_env(tmpdir, '\n# -*- coding: invalid\n')
399
+ with get_dist(tmpdir):
400
+ pass
401
+
402
+ def test_non_ascii_4(self, tmpdir):
403
+ fake_env(
404
+ tmpdir,
405
+ '# -*- coding: utf-8\n[metadata]\ndescription = éàïôñ\n',
406
+ encoding='utf-8',
407
+ )
408
+ with get_dist(tmpdir) as dist:
409
+ assert dist.metadata.description == 'éàïôñ'
410
+
411
+ def test_not_utf8(self, tmpdir):
412
+ """
413
+ Config files encoded not in UTF-8 will fail
414
+ """
415
+ fake_env(
416
+ tmpdir,
417
+ '# vim: set fileencoding=iso-8859-15 :\n[metadata]\ndescription = éàïôñ\n',
418
+ encoding='iso-8859-15',
419
+ )
420
+ with pytest.raises(UnicodeDecodeError):
421
+ with get_dist(tmpdir):
422
+ pass
423
+
424
+ @pytest.mark.parametrize(
425
+ ("error_msg", "config", "invalid"),
426
+ [
427
+ (
428
+ "Invalid dash-separated key 'author-email' in 'metadata' (setup.cfg)",
429
+ DALS(
430
+ """
431
+ [metadata]
432
+ author-email = test@test.com
433
+ maintainer_email = foo@foo.com
434
+ """
435
+ ),
436
+ {"author-email": "test@test.com"},
437
+ ),
438
+ (
439
+ "Invalid uppercase key 'Name' in 'metadata' (setup.cfg)",
440
+ DALS(
441
+ """
442
+ [metadata]
443
+ Name = foo
444
+ description = Some description
445
+ """
446
+ ),
447
+ {"Name": "foo"},
448
+ ),
449
+ ],
450
+ )
451
+ def test_invalid_options_previously_deprecated(
452
+ self, tmpdir, error_msg, config, invalid
453
+ ):
454
+ # This test and related methods can be removed when no longer needed.
455
+ # Deprecation postponed due to push-back from the community in
456
+ # https://github.com/pypa/setuptools/issues/4910
457
+ fake_env(tmpdir, config)
458
+ with pytest.warns(SetuptoolsDeprecationWarning, match=re.escape(error_msg)):
459
+ dist = get_dist(tmpdir).__enter__()
460
+
461
+ tmpdir.join('setup.cfg').remove()
462
+
463
+ for field, value in invalid.items():
464
+ attr = field.replace("-", "_").lower()
465
+ assert getattr(dist.metadata, attr) == value
466
+
467
+
468
+ class TestOptions:
469
+ def test_basic(self, tmpdir):
470
+ fake_env(
471
+ tmpdir,
472
+ '[options]\n'
473
+ 'zip_safe = True\n'
474
+ 'include_package_data = yes\n'
475
+ 'package_dir = b=c, =src\n'
476
+ 'packages = pack_a, pack_b.subpack\n'
477
+ 'namespace_packages = pack1, pack2\n'
478
+ 'scripts = bin/one.py, bin/two.py\n'
479
+ 'eager_resources = bin/one.py, bin/two.py\n'
480
+ 'install_requires = docutils>=0.3; pack ==1.1, ==1.3; hey\n'
481
+ 'setup_requires = docutils>=0.3; spack ==1.1, ==1.3; there\n'
482
+ 'dependency_links = http://some.com/here/1, '
483
+ 'http://some.com/there/2\n'
484
+ 'python_requires = >=1.0, !=2.8\n'
485
+ 'py_modules = module1, module2\n',
486
+ )
487
+ deprec = pytest.warns(SetuptoolsDeprecationWarning, match="namespace_packages")
488
+ with deprec, get_dist(tmpdir) as dist:
489
+ assert dist.zip_safe
490
+ assert dist.include_package_data
491
+ assert dist.package_dir == {'': 'src', 'b': 'c'}
492
+ assert dist.packages == ['pack_a', 'pack_b.subpack']
493
+ assert dist.namespace_packages == ['pack1', 'pack2']
494
+ assert dist.scripts == ['bin/one.py', 'bin/two.py']
495
+ assert dist.dependency_links == ([
496
+ 'http://some.com/here/1',
497
+ 'http://some.com/there/2',
498
+ ])
499
+ assert dist.install_requires == ([
500
+ 'docutils>=0.3',
501
+ 'pack==1.1,==1.3',
502
+ 'hey',
503
+ ])
504
+ assert dist.setup_requires == ([
505
+ 'docutils>=0.3',
506
+ 'spack ==1.1, ==1.3',
507
+ 'there',
508
+ ])
509
+ assert dist.python_requires == '>=1.0, !=2.8'
510
+ assert dist.py_modules == ['module1', 'module2']
511
+
512
+ def test_multiline(self, tmpdir):
513
+ fake_env(
514
+ tmpdir,
515
+ '[options]\n'
516
+ 'package_dir = \n'
517
+ ' b=c\n'
518
+ ' =src\n'
519
+ 'packages = \n'
520
+ ' pack_a\n'
521
+ ' pack_b.subpack\n'
522
+ 'namespace_packages = \n'
523
+ ' pack1\n'
524
+ ' pack2\n'
525
+ 'scripts = \n'
526
+ ' bin/one.py\n'
527
+ ' bin/two.py\n'
528
+ 'eager_resources = \n'
529
+ ' bin/one.py\n'
530
+ ' bin/two.py\n'
531
+ 'install_requires = \n'
532
+ ' docutils>=0.3\n'
533
+ ' pack ==1.1, ==1.3\n'
534
+ ' hey\n'
535
+ 'setup_requires = \n'
536
+ ' docutils>=0.3\n'
537
+ ' spack ==1.1, ==1.3\n'
538
+ ' there\n'
539
+ 'dependency_links = \n'
540
+ ' http://some.com/here/1\n'
541
+ ' http://some.com/there/2\n',
542
+ )
543
+ deprec = pytest.warns(SetuptoolsDeprecationWarning, match="namespace_packages")
544
+ with deprec, get_dist(tmpdir) as dist:
545
+ assert dist.package_dir == {'': 'src', 'b': 'c'}
546
+ assert dist.packages == ['pack_a', 'pack_b.subpack']
547
+ assert dist.namespace_packages == ['pack1', 'pack2']
548
+ assert dist.scripts == ['bin/one.py', 'bin/two.py']
549
+ assert dist.dependency_links == ([
550
+ 'http://some.com/here/1',
551
+ 'http://some.com/there/2',
552
+ ])
553
+ assert dist.install_requires == ([
554
+ 'docutils>=0.3',
555
+ 'pack==1.1,==1.3',
556
+ 'hey',
557
+ ])
558
+ assert dist.setup_requires == ([
559
+ 'docutils>=0.3',
560
+ 'spack ==1.1, ==1.3',
561
+ 'there',
562
+ ])
563
+
564
+ def test_package_dir_fail(self, tmpdir):
565
+ fake_env(tmpdir, '[options]\npackage_dir = a b\n')
566
+ with get_dist(tmpdir, parse=False) as dist:
567
+ with pytest.raises(DistutilsOptionError):
568
+ dist.parse_config_files()
569
+
570
+ def test_package_data(self, tmpdir):
571
+ fake_env(
572
+ tmpdir,
573
+ '[options.package_data]\n'
574
+ '* = *.txt, *.rst\n'
575
+ 'hello = *.msg\n'
576
+ '\n'
577
+ '[options.exclude_package_data]\n'
578
+ '* = fake1.txt, fake2.txt\n'
579
+ 'hello = *.dat\n',
580
+ )
581
+
582
+ with get_dist(tmpdir) as dist:
583
+ assert dist.package_data == {
584
+ '': ['*.txt', '*.rst'],
585
+ 'hello': ['*.msg'],
586
+ }
587
+ assert dist.exclude_package_data == {
588
+ '': ['fake1.txt', 'fake2.txt'],
589
+ 'hello': ['*.dat'],
590
+ }
591
+
592
+ def test_packages(self, tmpdir):
593
+ fake_env(tmpdir, '[options]\npackages = find:\n')
594
+
595
+ with get_dist(tmpdir) as dist:
596
+ assert dist.packages == ['fake_package']
597
+
598
+ def test_find_directive(self, tmpdir):
599
+ dir_package, config = fake_env(tmpdir, '[options]\npackages = find:\n')
600
+
601
+ make_package_dir('sub_one', dir_package)
602
+ make_package_dir('sub_two', dir_package)
603
+
604
+ with get_dist(tmpdir) as dist:
605
+ assert set(dist.packages) == set([
606
+ 'fake_package',
607
+ 'fake_package.sub_two',
608
+ 'fake_package.sub_one',
609
+ ])
610
+
611
+ config.write(
612
+ '[options]\n'
613
+ 'packages = find:\n'
614
+ '\n'
615
+ '[options.packages.find]\n'
616
+ 'where = .\n'
617
+ 'include =\n'
618
+ ' fake_package.sub_one\n'
619
+ ' two\n'
620
+ )
621
+ with get_dist(tmpdir) as dist:
622
+ assert dist.packages == ['fake_package.sub_one']
623
+
624
+ config.write(
625
+ '[options]\n'
626
+ 'packages = find:\n'
627
+ '\n'
628
+ '[options.packages.find]\n'
629
+ 'exclude =\n'
630
+ ' fake_package.sub_one\n'
631
+ )
632
+ with get_dist(tmpdir) as dist:
633
+ assert set(dist.packages) == set(['fake_package', 'fake_package.sub_two'])
634
+
635
+ def test_find_namespace_directive(self, tmpdir):
636
+ dir_package, config = fake_env(
637
+ tmpdir, '[options]\npackages = find_namespace:\n'
638
+ )
639
+
640
+ make_package_dir('sub_one', dir_package)
641
+ make_package_dir('sub_two', dir_package, ns=True)
642
+
643
+ with get_dist(tmpdir) as dist:
644
+ assert set(dist.packages) == {
645
+ 'fake_package',
646
+ 'fake_package.sub_two',
647
+ 'fake_package.sub_one',
648
+ }
649
+
650
+ config.write(
651
+ '[options]\n'
652
+ 'packages = find_namespace:\n'
653
+ '\n'
654
+ '[options.packages.find]\n'
655
+ 'where = .\n'
656
+ 'include =\n'
657
+ ' fake_package.sub_one\n'
658
+ ' two\n'
659
+ )
660
+ with get_dist(tmpdir) as dist:
661
+ assert dist.packages == ['fake_package.sub_one']
662
+
663
+ config.write(
664
+ '[options]\n'
665
+ 'packages = find_namespace:\n'
666
+ '\n'
667
+ '[options.packages.find]\n'
668
+ 'exclude =\n'
669
+ ' fake_package.sub_one\n'
670
+ )
671
+ with get_dist(tmpdir) as dist:
672
+ assert set(dist.packages) == {'fake_package', 'fake_package.sub_two'}
673
+
674
+ def test_extras_require(self, tmpdir):
675
+ fake_env(
676
+ tmpdir,
677
+ '[options.extras_require]\n'
678
+ 'pdf = ReportLab>=1.2; RXP\n'
679
+ 'rest = \n'
680
+ ' docutils>=0.3\n'
681
+ ' pack ==1.1, ==1.3\n',
682
+ )
683
+
684
+ with get_dist(tmpdir) as dist:
685
+ assert dist.extras_require == {
686
+ 'pdf': ['ReportLab>=1.2', 'RXP'],
687
+ 'rest': ['docutils>=0.3', 'pack==1.1,==1.3'],
688
+ }
689
+ assert set(dist.metadata.provides_extras) == {'pdf', 'rest'}
690
+
691
+ @pytest.mark.parametrize(
692
+ "config",
693
+ [
694
+ "[options.extras_require]\nfoo = bar;python_version<'3'",
695
+ "[options.extras_require]\nfoo = bar;os_name=='linux'",
696
+ "[options.extras_require]\nfoo = bar;python_version<'3'\n",
697
+ "[options.extras_require]\nfoo = bar;os_name=='linux'\n",
698
+ "[options]\ninstall_requires = bar;python_version<'3'",
699
+ "[options]\ninstall_requires = bar;os_name=='linux'",
700
+ "[options]\ninstall_requires = bar;python_version<'3'\n",
701
+ "[options]\ninstall_requires = bar;os_name=='linux'\n",
702
+ ],
703
+ )
704
+ def test_raises_accidental_env_marker_misconfig(self, config, tmpdir):
705
+ fake_env(tmpdir, config)
706
+ match = (
707
+ r"One of the parsed requirements in `(install_requires|extras_require.+)` "
708
+ "looks like a valid environment marker.*"
709
+ )
710
+ with pytest.raises(InvalidRequirement, match=match):
711
+ with get_dist(tmpdir) as _:
712
+ pass
713
+
714
+ @pytest.mark.parametrize(
715
+ "config",
716
+ [
717
+ "[options.extras_require]\nfoo = bar;python_version<3",
718
+ "[options.extras_require]\nfoo = bar;python_version<3\n",
719
+ "[options]\ninstall_requires = bar;python_version<3",
720
+ "[options]\ninstall_requires = bar;python_version<3\n",
721
+ ],
722
+ )
723
+ def test_warn_accidental_env_marker_misconfig(self, config, tmpdir):
724
+ fake_env(tmpdir, config)
725
+ match = (
726
+ r"One of the parsed requirements in `(install_requires|extras_require.+)` "
727
+ "looks like a valid environment marker.*"
728
+ )
729
+ with pytest.warns(SetuptoolsDeprecationWarning, match=match):
730
+ with get_dist(tmpdir) as _:
731
+ pass
732
+
733
+ @pytest.mark.parametrize(
734
+ "config",
735
+ [
736
+ "[options.extras_require]\nfoo =\n bar;python_version<'3'",
737
+ "[options.extras_require]\nfoo = bar;baz\nboo = xxx;yyy",
738
+ "[options.extras_require]\nfoo =\n bar;python_version<'3'\n",
739
+ "[options.extras_require]\nfoo = bar;baz\nboo = xxx;yyy\n",
740
+ "[options.extras_require]\nfoo =\n bar\n python_version<3\n",
741
+ "[options]\ninstall_requires =\n bar;python_version<'3'",
742
+ "[options]\ninstall_requires = bar;baz\nboo = xxx;yyy",
743
+ "[options]\ninstall_requires =\n bar;python_version<'3'\n",
744
+ "[options]\ninstall_requires = bar;baz\nboo = xxx;yyy\n",
745
+ "[options]\ninstall_requires =\n bar\n python_version<3\n",
746
+ ],
747
+ )
748
+ @pytest.mark.filterwarnings("error::setuptools.SetuptoolsDeprecationWarning")
749
+ def test_nowarn_accidental_env_marker_misconfig(self, config, tmpdir, recwarn):
750
+ fake_env(tmpdir, config)
751
+ num_warnings = len(recwarn)
752
+ with get_dist(tmpdir) as _:
753
+ pass
754
+ # The examples are valid, no warnings shown
755
+ assert len(recwarn) == num_warnings
756
+
757
+ def test_dash_preserved_extras_require(self, tmpdir):
758
+ fake_env(tmpdir, '[options.extras_require]\nfoo-a = foo\nfoo_b = test\n')
759
+
760
+ with get_dist(tmpdir) as dist:
761
+ assert dist.extras_require == {'foo-a': ['foo'], 'foo_b': ['test']}
762
+
763
+ def test_entry_points(self, tmpdir):
764
+ _, config = fake_env(
765
+ tmpdir,
766
+ '[options.entry_points]\n'
767
+ 'group1 = point1 = pack.module:func, '
768
+ '.point2 = pack.module2:func_rest [rest]\n'
769
+ 'group2 = point3 = pack.module:func2\n',
770
+ )
771
+
772
+ with get_dist(tmpdir) as dist:
773
+ assert dist.entry_points == {
774
+ 'group1': [
775
+ 'point1 = pack.module:func',
776
+ '.point2 = pack.module2:func_rest [rest]',
777
+ ],
778
+ 'group2': ['point3 = pack.module:func2'],
779
+ }
780
+
781
+ expected = (
782
+ '[blogtool.parsers]\n'
783
+ '.rst = some.nested.module:SomeClass.some_classmethod[reST]\n'
784
+ )
785
+
786
+ tmpdir.join('entry_points').write(expected)
787
+
788
+ # From file.
789
+ config.write('[options]\nentry_points = file: entry_points\n')
790
+
791
+ with get_dist(tmpdir) as dist:
792
+ assert dist.entry_points == expected
793
+
794
+ def test_case_sensitive_entry_points(self, tmpdir):
795
+ fake_env(
796
+ tmpdir,
797
+ '[options.entry_points]\n'
798
+ 'GROUP1 = point1 = pack.module:func, '
799
+ '.point2 = pack.module2:func_rest [rest]\n'
800
+ 'group2 = point3 = pack.module:func2\n',
801
+ )
802
+
803
+ with get_dist(tmpdir) as dist:
804
+ assert dist.entry_points == {
805
+ 'GROUP1': [
806
+ 'point1 = pack.module:func',
807
+ '.point2 = pack.module2:func_rest [rest]',
808
+ ],
809
+ 'group2': ['point3 = pack.module:func2'],
810
+ }
811
+
812
+ def test_data_files(self, tmpdir):
813
+ fake_env(
814
+ tmpdir,
815
+ '[options.data_files]\n'
816
+ 'cfg =\n'
817
+ ' a/b.conf\n'
818
+ ' c/d.conf\n'
819
+ 'data = e/f.dat, g/h.dat\n',
820
+ )
821
+
822
+ with get_dist(tmpdir) as dist:
823
+ expected = [
824
+ ('cfg', ['a/b.conf', 'c/d.conf']),
825
+ ('data', ['e/f.dat', 'g/h.dat']),
826
+ ]
827
+ assert sorted(dist.data_files) == sorted(expected)
828
+
829
+ def test_data_files_globby(self, tmpdir):
830
+ fake_env(
831
+ tmpdir,
832
+ '[options.data_files]\n'
833
+ 'cfg =\n'
834
+ ' a/b.conf\n'
835
+ ' c/d.conf\n'
836
+ 'data = *.dat\n'
837
+ 'icons = \n'
838
+ ' *.ico\n'
839
+ 'audio = \n'
840
+ ' *.wav\n'
841
+ ' sounds.db\n',
842
+ )
843
+
844
+ # Create dummy files for glob()'s sake:
845
+ tmpdir.join('a.dat').write('')
846
+ tmpdir.join('b.dat').write('')
847
+ tmpdir.join('c.dat').write('')
848
+ tmpdir.join('a.ico').write('')
849
+ tmpdir.join('b.ico').write('')
850
+ tmpdir.join('c.ico').write('')
851
+ tmpdir.join('beep.wav').write('')
852
+ tmpdir.join('boop.wav').write('')
853
+ tmpdir.join('sounds.db').write('')
854
+
855
+ with get_dist(tmpdir) as dist:
856
+ expected = [
857
+ ('cfg', ['a/b.conf', 'c/d.conf']),
858
+ ('data', ['a.dat', 'b.dat', 'c.dat']),
859
+ ('icons', ['a.ico', 'b.ico', 'c.ico']),
860
+ ('audio', ['beep.wav', 'boop.wav', 'sounds.db']),
861
+ ]
862
+ assert sorted(dist.data_files) == sorted(expected)
863
+
864
+ def test_python_requires_simple(self, tmpdir):
865
+ fake_env(
866
+ tmpdir,
867
+ DALS(
868
+ """
869
+ [options]
870
+ python_requires=>=2.7
871
+ """
872
+ ),
873
+ )
874
+ with get_dist(tmpdir) as dist:
875
+ dist.parse_config_files()
876
+
877
+ def test_python_requires_compound(self, tmpdir):
878
+ fake_env(
879
+ tmpdir,
880
+ DALS(
881
+ """
882
+ [options]
883
+ python_requires=>=2.7,!=3.0.*
884
+ """
885
+ ),
886
+ )
887
+ with get_dist(tmpdir) as dist:
888
+ dist.parse_config_files()
889
+
890
+ def test_python_requires_invalid(self, tmpdir):
891
+ fake_env(
892
+ tmpdir,
893
+ DALS(
894
+ """
895
+ [options]
896
+ python_requires=invalid
897
+ """
898
+ ),
899
+ )
900
+ with pytest.raises(Exception):
901
+ with get_dist(tmpdir) as dist:
902
+ dist.parse_config_files()
903
+
904
+ def test_cmdclass(self, tmpdir):
905
+ module_path = Path(tmpdir, "src/custom_build.py") # auto discovery for src
906
+ module_path.parent.mkdir(parents=True, exist_ok=True)
907
+ module_path.write_text(
908
+ "from distutils.core import Command\nclass CustomCmd(Command): pass\n",
909
+ encoding="utf-8",
910
+ )
911
+
912
+ setup_cfg = """
913
+ [options]
914
+ cmdclass =
915
+ customcmd = custom_build.CustomCmd
916
+ """
917
+ fake_env(tmpdir, inspect.cleandoc(setup_cfg))
918
+
919
+ with get_dist(tmpdir) as dist:
920
+ cmdclass = dist.cmdclass['customcmd']
921
+ assert cmdclass.__name__ == "CustomCmd"
922
+ assert cmdclass.__module__ == "custom_build"
923
+ assert module_path.samefile(inspect.getfile(cmdclass))
924
+
925
+ def test_requirements_file(self, tmpdir):
926
+ fake_env(
927
+ tmpdir,
928
+ DALS(
929
+ """
930
+ [options]
931
+ install_requires = file:requirements.txt
932
+ [options.extras_require]
933
+ colors = file:requirements-extra.txt
934
+ """
935
+ ),
936
+ )
937
+
938
+ tmpdir.join('requirements.txt').write('\ndocutils>=0.3\n\n')
939
+ tmpdir.join('requirements-extra.txt').write('colorama')
940
+
941
+ with get_dist(tmpdir) as dist:
942
+ assert dist.install_requires == ['docutils>=0.3']
943
+ assert dist.extras_require == {'colors': ['colorama']}
944
+
945
+
946
+ saved_dist_init = _Distribution.__init__
947
+
948
+
949
+ class TestExternalSetters:
950
+ # During creation of the setuptools Distribution() object, we call
951
+ # the init of the parent distutils Distribution object via
952
+ # _Distribution.__init__ ().
953
+ #
954
+ # It's possible distutils calls out to various keyword
955
+ # implementations (i.e. distutils.setup_keywords entry points)
956
+ # that may set a range of variables.
957
+ #
958
+ # This wraps distutil's Distribution.__init__ and simulates
959
+ # pbr or something else setting these values.
960
+ def _fake_distribution_init(self, dist, attrs):
961
+ saved_dist_init(dist, attrs)
962
+ # see self._DISTUTILS_UNSUPPORTED_METADATA
963
+ dist.metadata.long_description_content_type = 'text/something'
964
+ # Test overwrite setup() args
965
+ dist.metadata.project_urls = {
966
+ 'Link One': 'https://example.com/one/',
967
+ 'Link Two': 'https://example.com/two/',
968
+ }
969
+
970
+ @patch.object(_Distribution, '__init__', autospec=True)
971
+ def test_external_setters(self, mock_parent_init, tmpdir):
972
+ mock_parent_init.side_effect = self._fake_distribution_init
973
+
974
+ dist = Distribution(attrs={'project_urls': {'will_be': 'ignored'}})
975
+
976
+ assert dist.metadata.long_description_content_type == 'text/something'
977
+ assert dist.metadata.project_urls == {
978
+ 'Link One': 'https://example.com/one/',
979
+ 'Link Two': 'https://example.com/two/',
980
+ }