py2docfx 0.1.9.dev1897607__py3-none-any.whl → 0.1.9.dev1926139__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.
Files changed (397) hide show
  1. py2docfx/__main__.py +77 -22
  2. py2docfx/convert_prepare/environment.py +59 -19
  3. py2docfx/convert_prepare/generate_document.py +12 -5
  4. py2docfx/convert_prepare/get_source.py +5 -1
  5. py2docfx/convert_prepare/git.py +24 -20
  6. py2docfx/convert_prepare/package_info.py +15 -9
  7. py2docfx/convert_prepare/pip_utils.py +29 -8
  8. py2docfx/convert_prepare/post_process/merge_toc.py +5 -1
  9. py2docfx/convert_prepare/sphinx_caller.py +31 -14
  10. py2docfx/convert_prepare/tests/test_generate_document.py +6 -4
  11. py2docfx/convert_prepare/tests/test_get_source.py +6 -6
  12. py2docfx/convert_prepare/tests/test_params.py +1 -1
  13. py2docfx/convert_prepare/tests/test_sphinx_caller.py +5 -3
  14. py2docfx/convert_prepare/tests/utils.py +11 -0
  15. py2docfx/docfx_yaml/build_finished.py +11 -3
  16. py2docfx/docfx_yaml/convert_class.py +4 -2
  17. py2docfx/docfx_yaml/convert_enum.py +4 -2
  18. py2docfx/docfx_yaml/convert_module.py +4 -2
  19. py2docfx/docfx_yaml/convert_package.py +4 -2
  20. py2docfx/docfx_yaml/logger.py +68 -0
  21. py2docfx/docfx_yaml/process_doctree.py +6 -4
  22. py2docfx/docfx_yaml/translator.py +5 -7
  23. py2docfx/docfx_yaml/writer.py +10 -4
  24. py2docfx/docfx_yaml/yaml_builder.py +0 -1
  25. py2docfx/venv/basevenv/Lib/site-packages/_distutils_hack/__init__.py +2 -3
  26. py2docfx/venv/basevenv/Lib/site-packages/packaging/__init__.py +2 -2
  27. py2docfx/venv/basevenv/Lib/site-packages/packaging/_elffile.py +4 -4
  28. py2docfx/venv/basevenv/Lib/site-packages/packaging/_manylinux.py +1 -0
  29. py2docfx/venv/basevenv/Lib/site-packages/packaging/licenses/__init__.py +145 -0
  30. py2docfx/venv/basevenv/Lib/site-packages/packaging/licenses/_spdx.py +759 -0
  31. py2docfx/venv/basevenv/Lib/site-packages/packaging/markers.py +15 -9
  32. py2docfx/venv/basevenv/Lib/site-packages/packaging/metadata.py +83 -24
  33. py2docfx/venv/basevenv/Lib/site-packages/packaging/specifiers.py +19 -8
  34. py2docfx/venv/basevenv/Lib/site-packages/packaging/tags.py +78 -29
  35. py2docfx/venv/basevenv/Lib/site-packages/packaging/utils.py +33 -44
  36. py2docfx/venv/basevenv/Lib/site-packages/packaging/version.py +26 -7
  37. py2docfx/venv/basevenv/Lib/site-packages/pkg_resources/__init__.py +27 -32
  38. py2docfx/venv/basevenv/Lib/site-packages/pkg_resources/tests/test_pkg_resources.py +4 -4
  39. py2docfx/venv/basevenv/Lib/site-packages/pkg_resources/tests/test_resources.py +7 -7
  40. py2docfx/venv/basevenv/Lib/site-packages/pkg_resources/tests/test_working_set.py +1 -1
  41. py2docfx/venv/basevenv/Lib/site-packages/setuptools/__init__.py +7 -9
  42. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/compat/py38.py +1 -1
  43. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/dir_util.py +3 -8
  44. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/tests/test_dir_util.py +22 -0
  45. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_importlib.py +1 -4
  46. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_path.py +5 -8
  47. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_reqs.py +2 -1
  48. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_shutil.py +53 -0
  49. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/packaging/__init__.py +2 -2
  50. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/packaging/_elffile.py +4 -4
  51. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/packaging/_manylinux.py +1 -0
  52. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/packaging/licenses/__init__.py +145 -0
  53. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/packaging/licenses/_spdx.py +759 -0
  54. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/packaging/markers.py +15 -9
  55. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/packaging/metadata.py +83 -24
  56. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py +19 -8
  57. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/packaging/tags.py +78 -29
  58. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/packaging/utils.py +33 -44
  59. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/packaging/version.py +26 -7
  60. py2docfx/venv/basevenv/Lib/site-packages/setuptools/archive_util.py +6 -4
  61. py2docfx/venv/basevenv/Lib/site-packages/setuptools/build_meta.py +25 -19
  62. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/__init__.py +9 -1
  63. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/_requirestxt.py +4 -4
  64. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/alias.py +3 -4
  65. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/bdist_egg.py +27 -13
  66. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/bdist_rpm.py +1 -1
  67. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/bdist_wheel.py +43 -84
  68. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/build.py +3 -3
  69. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/build_clib.py +2 -9
  70. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/build_ext.py +15 -14
  71. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/build_py.py +26 -30
  72. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/develop.py +4 -4
  73. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/dist_info.py +3 -7
  74. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/easy_install.py +57 -80
  75. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/editable_wheel.py +21 -23
  76. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/egg_info.py +32 -32
  77. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/install.py +31 -13
  78. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/install_egg_info.py +4 -4
  79. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/install_lib.py +10 -7
  80. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/install_scripts.py +2 -2
  81. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/rotate.py +6 -6
  82. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/saveopts.py +2 -2
  83. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/sdist.py +11 -10
  84. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/setopt.py +3 -3
  85. py2docfx/venv/basevenv/Lib/site-packages/setuptools/config/_apply_pyprojecttoml.py +19 -14
  86. py2docfx/venv/basevenv/Lib/site-packages/setuptools/config/expand.py +22 -16
  87. py2docfx/venv/basevenv/Lib/site-packages/setuptools/config/pyprojecttoml.py +12 -10
  88. py2docfx/venv/basevenv/Lib/site-packages/setuptools/config/setupcfg.py +39 -47
  89. py2docfx/venv/basevenv/Lib/site-packages/setuptools/depends.py +26 -7
  90. py2docfx/venv/basevenv/Lib/site-packages/setuptools/discovery.py +21 -14
  91. py2docfx/venv/basevenv/Lib/site-packages/setuptools/dist.py +51 -47
  92. py2docfx/venv/basevenv/Lib/site-packages/setuptools/errors.py +21 -26
  93. py2docfx/venv/basevenv/Lib/site-packages/setuptools/extension.py +18 -6
  94. py2docfx/venv/basevenv/Lib/site-packages/setuptools/glob.py +35 -15
  95. py2docfx/venv/basevenv/Lib/site-packages/setuptools/installer.py +6 -1
  96. py2docfx/venv/basevenv/Lib/site-packages/setuptools/launch.py +1 -1
  97. py2docfx/venv/basevenv/Lib/site-packages/setuptools/logging.py +2 -2
  98. py2docfx/venv/basevenv/Lib/site-packages/setuptools/modified.py +16 -6
  99. py2docfx/venv/basevenv/Lib/site-packages/setuptools/monkey.py +5 -5
  100. py2docfx/venv/basevenv/Lib/site-packages/setuptools/msvc.py +35 -24
  101. py2docfx/venv/basevenv/Lib/site-packages/setuptools/namespaces.py +2 -2
  102. py2docfx/venv/basevenv/Lib/site-packages/setuptools/package_index.py +42 -43
  103. py2docfx/venv/basevenv/Lib/site-packages/setuptools/sandbox.py +19 -12
  104. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/config/downloads/__init__.py +5 -3
  105. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/config/test_apply_pyprojecttoml.py +7 -6
  106. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/config/test_expand.py +3 -3
  107. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/config/test_pyprojecttoml.py +2 -2
  108. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/config/test_pyprojecttoml_dynamic_deps.py +21 -11
  109. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/config/test_setupcfg.py +12 -16
  110. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/integration/test_pip_install_sdist.py +10 -11
  111. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_bdist_egg.py +7 -3
  112. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_bdist_wheel.py +10 -33
  113. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_build_ext.py +2 -2
  114. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_build_meta.py +1 -1
  115. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_build_py.py +6 -6
  116. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_config_discovery.py +4 -4
  117. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_core_metadata.py +171 -76
  118. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_dist.py +11 -13
  119. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_dist_info.py +1 -1
  120. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_distutils_adoption.py +44 -5
  121. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_easy_install.py +32 -26
  122. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_editable_install.py +10 -6
  123. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_egg_info.py +15 -15
  124. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_glob.py +1 -1
  125. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_logging.py +1 -1
  126. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_manifest.py +2 -8
  127. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_packageindex.py +6 -17
  128. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_setuptools.py +4 -3
  129. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_shutil_wrapper.py +23 -0
  130. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_wheel.py +29 -20
  131. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_windows_wrappers.py +3 -3
  132. py2docfx/venv/basevenv/Lib/site-packages/setuptools/unicode_utils.py +3 -3
  133. py2docfx/venv/basevenv/Lib/site-packages/setuptools/warnings.py +5 -2
  134. py2docfx/venv/basevenv/Lib/site-packages/setuptools/wheel.py +4 -4
  135. py2docfx/venv/basevenv/Lib/site-packages/wheel/__init__.py +1 -1
  136. py2docfx/venv/basevenv/Lib/site-packages/wheel/_bdist_wheel.py +9 -0
  137. py2docfx/venv/basevenv/Lib/site-packages/wheel/bdist_wheel.py +17 -2
  138. py2docfx/venv/basevenv/Lib/site-packages/wheel/cli/convert.py +279 -220
  139. py2docfx/venv/basevenv/Lib/site-packages/wheel/util.py +0 -9
  140. py2docfx/venv/venv1/Lib/site-packages/_distutils_hack/__init__.py +2 -3
  141. py2docfx/venv/venv1/Lib/site-packages/azure/core/_enum_meta.py +1 -1
  142. py2docfx/venv/venv1/Lib/site-packages/azure/core/_pipeline_client.py +2 -2
  143. py2docfx/venv/venv1/Lib/site-packages/azure/core/_pipeline_client_async.py +5 -3
  144. py2docfx/venv/venv1/Lib/site-packages/azure/core/_version.py +1 -1
  145. py2docfx/venv/venv1/Lib/site-packages/azure/core/credentials.py +6 -1
  146. py2docfx/venv/venv1/Lib/site-packages/azure/core/exceptions.py +13 -5
  147. py2docfx/venv/venv1/Lib/site-packages/azure/core/messaging.py +3 -3
  148. py2docfx/venv/venv1/Lib/site-packages/azure/core/paging.py +1 -1
  149. py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/__init__.py +16 -5
  150. py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/_base.py +15 -4
  151. py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/_base_async.py +20 -10
  152. py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/_tools.py +3 -1
  153. py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/policies/_authentication.py +55 -19
  154. py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/policies/_authentication_async.py +46 -15
  155. py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/policies/_custom_hook.py +8 -3
  156. py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/policies/_distributed_tracing.py +9 -3
  157. py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/policies/_redirect.py +9 -2
  158. py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/policies/_redirect_async.py +4 -1
  159. py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/policies/_retry.py +27 -8
  160. py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/policies/_retry_async.py +6 -3
  161. py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/policies/_sensitive_header_cleanup_policy.py +4 -1
  162. py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/policies/_universal.py +6 -10
  163. py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/policies/_utils.py +101 -1
  164. py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/transport/__init__.py +1 -1
  165. py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/transport/_aiohttp.py +9 -2
  166. py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/transport/_base.py +1 -1
  167. py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/transport/_base_async.py +7 -5
  168. py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/transport/_requests_asyncio.py +0 -1
  169. py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/transport/_requests_basic.py +11 -3
  170. py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/transport/_requests_trio.py +11 -3
  171. py2docfx/venv/venv1/Lib/site-packages/azure/core/polling/_async_poller.py +5 -2
  172. py2docfx/venv/venv1/Lib/site-packages/azure/core/polling/_poller.py +4 -1
  173. py2docfx/venv/venv1/Lib/site-packages/azure/core/polling/async_base_polling.py +3 -1
  174. py2docfx/venv/venv1/Lib/site-packages/azure/core/polling/base_polling.py +47 -16
  175. py2docfx/venv/venv1/Lib/site-packages/azure/core/rest/_helpers.py +3 -1
  176. py2docfx/venv/venv1/Lib/site-packages/azure/core/rest/_http_response_impl.py +1 -1
  177. py2docfx/venv/venv1/Lib/site-packages/azure/core/rest/_requests_basic.py +3 -1
  178. py2docfx/venv/venv1/Lib/site-packages/azure/core/serialization.py +1 -1
  179. py2docfx/venv/venv1/Lib/site-packages/azure/core/settings.py +15 -3
  180. py2docfx/venv/venv1/Lib/site-packages/azure/core/tracing/_abstract_span.py +15 -5
  181. py2docfx/venv/venv1/Lib/site-packages/azure/core/tracing/common.py +1 -1
  182. py2docfx/venv/venv1/Lib/site-packages/azure/core/tracing/decorator.py +12 -1
  183. py2docfx/venv/venv1/Lib/site-packages/azure/core/tracing/decorator_async.py +24 -4
  184. py2docfx/venv/venv1/Lib/site-packages/azure/core/tracing/ext/opencensus_span/__init__.py +119 -110
  185. py2docfx/venv/venv1/Lib/site-packages/azure/core/tracing/ext/opencensus_span/_version.py +1 -1
  186. py2docfx/venv/venv1/Lib/site-packages/azure/core/utils/_pipeline_transport_rest_shared.py +3 -1
  187. py2docfx/venv/venv1/Lib/site-packages/azure/core/utils/_pipeline_transport_rest_shared_async.py +10 -1
  188. py2docfx/venv/venv1/Lib/site-packages/google/api/client_pb2.py +41 -39
  189. py2docfx/venv/venv1/Lib/site-packages/google/api/error_reason_pb2.py +2 -2
  190. py2docfx/venv/venv1/Lib/site-packages/google/api/httpbody_pb2.py +2 -2
  191. py2docfx/venv/venv1/Lib/site-packages/google/api/metric_pb2.py +17 -11
  192. py2docfx/venv/venv1/Lib/site-packages/google/api_core/client_options.py +17 -13
  193. py2docfx/venv/venv1/Lib/site-packages/google/api_core/protobuf_helpers.py +1 -3
  194. py2docfx/venv/venv1/Lib/site-packages/google/api_core/version.py +1 -1
  195. py2docfx/venv/venv1/Lib/site-packages/google/auth/_default.py +4 -0
  196. py2docfx/venv/venv1/Lib/site-packages/google/auth/compute_engine/_metadata.py +1 -1
  197. py2docfx/venv/venv1/Lib/site-packages/google/auth/iam.py +25 -8
  198. py2docfx/venv/venv1/Lib/site-packages/google/auth/impersonated_credentials.py +34 -16
  199. py2docfx/venv/venv1/Lib/site-packages/google/auth/transport/_requests_base.py +2 -1
  200. py2docfx/venv/venv1/Lib/site-packages/google/auth/transport/requests.py +2 -3
  201. py2docfx/venv/venv1/Lib/site-packages/google/auth/version.py +1 -1
  202. py2docfx/venv/venv1/Lib/site-packages/google/oauth2/_client.py +10 -2
  203. py2docfx/venv/venv1/Lib/site-packages/google/oauth2/service_account.py +1 -0
  204. py2docfx/venv/venv1/Lib/site-packages/jwt/__init__.py +3 -2
  205. py2docfx/venv/venv1/Lib/site-packages/jwt/algorithms.py +31 -16
  206. py2docfx/venv/venv1/Lib/site-packages/jwt/api_jws.py +19 -8
  207. py2docfx/venv/venv1/Lib/site-packages/jwt/api_jwt.py +75 -19
  208. py2docfx/venv/venv1/Lib/site-packages/jwt/exceptions.py +8 -0
  209. py2docfx/venv/venv1/Lib/site-packages/jwt/help.py +4 -1
  210. py2docfx/venv/venv1/Lib/site-packages/jwt/jwks_client.py +4 -2
  211. py2docfx/venv/venv1/Lib/site-packages/jwt/utils.py +7 -10
  212. py2docfx/venv/venv1/Lib/site-packages/msal/application.py +1 -1
  213. py2docfx/venv/venv1/Lib/site-packages/msal/managed_identity.py +5 -3
  214. py2docfx/venv/venv1/Lib/site-packages/pkg_resources/__init__.py +27 -32
  215. py2docfx/venv/venv1/Lib/site-packages/pkg_resources/tests/test_pkg_resources.py +4 -4
  216. py2docfx/venv/venv1/Lib/site-packages/pkg_resources/tests/test_resources.py +7 -7
  217. py2docfx/venv/venv1/Lib/site-packages/pkg_resources/tests/test_working_set.py +1 -1
  218. py2docfx/venv/venv1/Lib/site-packages/proto/enums.py +3 -1
  219. py2docfx/venv/venv1/Lib/site-packages/proto/marshal/collections/repeated.py +7 -2
  220. py2docfx/venv/venv1/Lib/site-packages/proto/marshal/compat.py +18 -21
  221. py2docfx/venv/venv1/Lib/site-packages/proto/marshal/rules/message.py +7 -3
  222. py2docfx/venv/venv1/Lib/site-packages/proto/message.py +6 -35
  223. py2docfx/venv/venv1/Lib/site-packages/proto/version.py +1 -1
  224. py2docfx/venv/venv1/Lib/site-packages/setuptools/__init__.py +7 -9
  225. py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/compat/py38.py +1 -1
  226. py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/dir_util.py +3 -8
  227. py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/tests/test_dir_util.py +22 -0
  228. py2docfx/venv/venv1/Lib/site-packages/setuptools/_importlib.py +1 -4
  229. py2docfx/venv/venv1/Lib/site-packages/setuptools/_path.py +5 -8
  230. py2docfx/venv/venv1/Lib/site-packages/setuptools/_reqs.py +2 -1
  231. py2docfx/venv/venv1/Lib/site-packages/setuptools/_shutil.py +53 -0
  232. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/packaging/__init__.py +2 -2
  233. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/packaging/_elffile.py +4 -4
  234. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/packaging/_manylinux.py +1 -0
  235. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/packaging/licenses/__init__.py +145 -0
  236. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/packaging/licenses/_spdx.py +759 -0
  237. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/packaging/markers.py +15 -9
  238. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/packaging/metadata.py +83 -24
  239. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py +19 -8
  240. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/packaging/tags.py +78 -29
  241. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/packaging/utils.py +33 -44
  242. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/packaging/version.py +26 -7
  243. py2docfx/venv/venv1/Lib/site-packages/setuptools/archive_util.py +6 -4
  244. py2docfx/venv/venv1/Lib/site-packages/setuptools/build_meta.py +25 -19
  245. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/__init__.py +9 -1
  246. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/_requirestxt.py +4 -4
  247. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/alias.py +3 -4
  248. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/bdist_egg.py +27 -13
  249. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/bdist_rpm.py +1 -1
  250. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/bdist_wheel.py +43 -84
  251. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/build.py +3 -3
  252. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/build_clib.py +2 -9
  253. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/build_ext.py +15 -14
  254. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/build_py.py +26 -30
  255. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/develop.py +4 -4
  256. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/dist_info.py +3 -7
  257. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/easy_install.py +57 -80
  258. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/editable_wheel.py +21 -23
  259. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/egg_info.py +32 -32
  260. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/install.py +31 -13
  261. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/install_egg_info.py +4 -4
  262. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/install_lib.py +10 -7
  263. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/install_scripts.py +2 -2
  264. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/rotate.py +6 -6
  265. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/saveopts.py +2 -2
  266. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/sdist.py +11 -10
  267. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/setopt.py +3 -3
  268. py2docfx/venv/venv1/Lib/site-packages/setuptools/config/_apply_pyprojecttoml.py +19 -14
  269. py2docfx/venv/venv1/Lib/site-packages/setuptools/config/expand.py +22 -16
  270. py2docfx/venv/venv1/Lib/site-packages/setuptools/config/pyprojecttoml.py +12 -10
  271. py2docfx/venv/venv1/Lib/site-packages/setuptools/config/setupcfg.py +39 -47
  272. py2docfx/venv/venv1/Lib/site-packages/setuptools/depends.py +26 -7
  273. py2docfx/venv/venv1/Lib/site-packages/setuptools/discovery.py +21 -14
  274. py2docfx/venv/venv1/Lib/site-packages/setuptools/dist.py +51 -47
  275. py2docfx/venv/venv1/Lib/site-packages/setuptools/errors.py +21 -26
  276. py2docfx/venv/venv1/Lib/site-packages/setuptools/extension.py +18 -6
  277. py2docfx/venv/venv1/Lib/site-packages/setuptools/glob.py +35 -15
  278. py2docfx/venv/venv1/Lib/site-packages/setuptools/installer.py +6 -1
  279. py2docfx/venv/venv1/Lib/site-packages/setuptools/launch.py +1 -1
  280. py2docfx/venv/venv1/Lib/site-packages/setuptools/logging.py +2 -2
  281. py2docfx/venv/venv1/Lib/site-packages/setuptools/modified.py +16 -6
  282. py2docfx/venv/venv1/Lib/site-packages/setuptools/monkey.py +5 -5
  283. py2docfx/venv/venv1/Lib/site-packages/setuptools/msvc.py +35 -24
  284. py2docfx/venv/venv1/Lib/site-packages/setuptools/namespaces.py +2 -2
  285. py2docfx/venv/venv1/Lib/site-packages/setuptools/package_index.py +42 -43
  286. py2docfx/venv/venv1/Lib/site-packages/setuptools/sandbox.py +19 -12
  287. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/config/downloads/__init__.py +5 -3
  288. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/config/test_apply_pyprojecttoml.py +7 -6
  289. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/config/test_expand.py +3 -3
  290. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/config/test_pyprojecttoml.py +2 -2
  291. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/config/test_pyprojecttoml_dynamic_deps.py +21 -11
  292. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/config/test_setupcfg.py +12 -16
  293. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/integration/test_pip_install_sdist.py +10 -11
  294. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_bdist_egg.py +7 -3
  295. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_bdist_wheel.py +10 -33
  296. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_build_ext.py +2 -2
  297. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_build_meta.py +1 -1
  298. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_build_py.py +6 -6
  299. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_config_discovery.py +4 -4
  300. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_core_metadata.py +171 -76
  301. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_dist.py +11 -13
  302. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_dist_info.py +1 -1
  303. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_distutils_adoption.py +44 -5
  304. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_easy_install.py +32 -26
  305. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_editable_install.py +10 -6
  306. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_egg_info.py +15 -15
  307. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_glob.py +1 -1
  308. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_logging.py +1 -1
  309. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_manifest.py +2 -8
  310. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_packageindex.py +6 -17
  311. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_setuptools.py +4 -3
  312. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_shutil_wrapper.py +23 -0
  313. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_wheel.py +29 -20
  314. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_windows_wrappers.py +3 -3
  315. py2docfx/venv/venv1/Lib/site-packages/setuptools/unicode_utils.py +3 -3
  316. py2docfx/venv/venv1/Lib/site-packages/setuptools/warnings.py +5 -2
  317. py2docfx/venv/venv1/Lib/site-packages/setuptools/wheel.py +4 -4
  318. py2docfx/venv/venv1/Lib/site-packages/wheel/__init__.py +1 -1
  319. py2docfx/venv/venv1/Lib/site-packages/wheel/_bdist_wheel.py +9 -0
  320. py2docfx/venv/venv1/Lib/site-packages/wheel/bdist_wheel.py +17 -2
  321. py2docfx/venv/venv1/Lib/site-packages/wheel/cli/convert.py +279 -220
  322. py2docfx/venv/venv1/Lib/site-packages/wheel/util.py +0 -9
  323. {py2docfx-0.1.9.dev1897607.dist-info → py2docfx-0.1.9.dev1926139.dist-info}/METADATA +1 -1
  324. {py2docfx-0.1.9.dev1897607.dist-info → py2docfx-0.1.9.dev1926139.dist-info}/RECORD +327 -385
  325. {py2docfx-0.1.9.dev1897607.dist-info → py2docfx-0.1.9.dev1926139.dist-info}/WHEEL +1 -1
  326. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/__init__.py +0 -36
  327. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/_adapters.py +0 -168
  328. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/_common.py +0 -210
  329. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/_itertools.py +0 -38
  330. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/abc.py +0 -171
  331. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/compat/__init__.py +0 -0
  332. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/compat/py38.py +0 -11
  333. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/compat/py39.py +0 -10
  334. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/functional.py +0 -81
  335. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/future/__init__.py +0 -0
  336. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/future/adapters.py +0 -95
  337. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/readers.py +0 -194
  338. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/simple.py +0 -106
  339. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/__init__.py +0 -0
  340. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/_path.py +0 -56
  341. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/compat/__init__.py +0 -0
  342. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/compat/py312.py +0 -18
  343. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/compat/py39.py +0 -10
  344. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/data01/__init__.py +0 -0
  345. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/data01/subdirectory/__init__.py +0 -0
  346. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/data02/__init__.py +0 -0
  347. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/data02/one/__init__.py +0 -0
  348. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/data02/two/__init__.py +0 -0
  349. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/test_compatibilty_files.py +0 -104
  350. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/test_contents.py +0 -43
  351. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/test_custom.py +0 -47
  352. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/test_files.py +0 -117
  353. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/test_functional.py +0 -242
  354. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/test_open.py +0 -89
  355. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/test_path.py +0 -65
  356. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/test_read.py +0 -97
  357. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/test_reader.py +0 -145
  358. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/test_resource.py +0 -241
  359. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/util.py +0 -164
  360. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/zip.py +0 -32
  361. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/__init__.py +0 -36
  362. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/_adapters.py +0 -168
  363. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/_common.py +0 -210
  364. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/_itertools.py +0 -38
  365. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/abc.py +0 -171
  366. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/compat/__init__.py +0 -0
  367. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/compat/py38.py +0 -11
  368. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/compat/py39.py +0 -10
  369. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/functional.py +0 -81
  370. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/future/__init__.py +0 -0
  371. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/future/adapters.py +0 -95
  372. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/readers.py +0 -194
  373. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/simple.py +0 -106
  374. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/__init__.py +0 -0
  375. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/_path.py +0 -56
  376. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/compat/__init__.py +0 -0
  377. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/compat/py312.py +0 -18
  378. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/compat/py39.py +0 -10
  379. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/data01/__init__.py +0 -0
  380. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/data01/subdirectory/__init__.py +0 -0
  381. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/data02/__init__.py +0 -0
  382. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/data02/one/__init__.py +0 -0
  383. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/data02/two/__init__.py +0 -0
  384. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/test_compatibilty_files.py +0 -104
  385. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/test_contents.py +0 -43
  386. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/test_custom.py +0 -47
  387. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/test_files.py +0 -117
  388. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/test_functional.py +0 -242
  389. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/test_open.py +0 -89
  390. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/test_path.py +0 -65
  391. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/test_read.py +0 -97
  392. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/test_reader.py +0 -145
  393. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/test_resource.py +0 -241
  394. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/util.py +0 -164
  395. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/importlib_resources/tests/zip.py +0 -32
  396. /py2docfx/convert_prepare/conf_templates/{master_doc.rst_t → root_doc.rst_t} +0 -0
  397. {py2docfx-0.1.9.dev1897607.dist-info → py2docfx-0.1.9.dev1926139.dist-info}/top_level.txt +0 -0
@@ -1,16 +1,28 @@
1
+ from __future__ import annotations
2
+
1
3
  import functools
2
4
  import importlib
3
5
  import io
4
6
  from email import message_from_string
7
+ from email.generator import Generator
8
+ from email.message import Message
9
+ from email.parser import Parser
10
+ from email.policy import EmailPolicy
11
+ from pathlib import Path
12
+ from unittest.mock import Mock
5
13
 
6
14
  import pytest
7
15
  from packaging.metadata import Metadata
16
+ from packaging.requirements import Requirement
8
17
 
9
18
  from setuptools import _reqs, sic
10
19
  from setuptools._core_metadata import rfc822_escape, rfc822_unescape
11
20
  from setuptools.command.egg_info import egg_info, write_requirements
21
+ from setuptools.config import expand, setupcfg
12
22
  from setuptools.dist import Distribution
13
23
 
24
+ from .config.downloads import retrieve_file, urls_from_file
25
+
14
26
  EXAMPLE_BASE_INFO = dict(
15
27
  name="package",
16
28
  version="0.0.1",
@@ -23,7 +35,7 @@ EXAMPLE_BASE_INFO = dict(
23
35
 
24
36
 
25
37
  @pytest.mark.parametrize(
26
- 'content, result',
38
+ ("content", "result"),
27
39
  (
28
40
  pytest.param(
29
41
  "Just a single line",
@@ -154,7 +166,7 @@ def __read_test_cases():
154
166
  ]
155
167
 
156
168
 
157
- @pytest.mark.parametrize('name,attrs', __read_test_cases())
169
+ @pytest.mark.parametrize(("name", "attrs"), __read_test_cases())
158
170
  def test_read_metadata(name, attrs):
159
171
  dist = Distribution(attrs)
160
172
  metadata_out = dist.metadata
@@ -263,7 +275,7 @@ def __maintainer_test_cases():
263
275
  ]
264
276
 
265
277
 
266
- @pytest.mark.parametrize('name,attrs', __maintainer_test_cases())
278
+ @pytest.mark.parametrize(("name", "attrs"), __maintainer_test_cases())
267
279
  def test_maintainer_author(name, attrs, tmpdir):
268
280
  tested_keys = {
269
281
  'author': 'Author',
@@ -303,85 +315,168 @@ def test_maintainer_author(name, attrs, tmpdir):
303
315
  assert line in pkg_lines_set
304
316
 
305
317
 
306
- def test_parity_with_metadata_from_pypa_wheel(tmp_path):
307
- attrs = dict(
308
- **EXAMPLE_BASE_INFO,
309
- # Example with complex requirement definition
310
- python_requires=">=3.8",
311
- install_requires="""
312
- packaging==23.2
313
- ordered-set==3.1.1
314
- more-itertools==8.8.0; extra == "other"
315
- jaraco.text==3.7.0
316
- importlib-resources==5.10.2; python_version<"3.8"
317
- importlib-metadata==6.0.0 ; python_version<"3.8"
318
- colorama>=0.4.4; sys_platform == "win32"
319
- """,
320
- extras_require={
321
- "testing": """
322
- pytest >= 6
323
- pytest-checkdocs >= 2.4
324
- tomli ; \\
325
- # Using stdlib when possible
326
- python_version < "3.11"
327
- ini2toml[lite]>=0.9
328
- """,
329
- "other": [],
330
- },
318
+ class TestParityWithMetadataFromPyPaWheel:
319
+ def base_example(self):
320
+ attrs = dict(
321
+ **EXAMPLE_BASE_INFO,
322
+ # Example with complex requirement definition
323
+ python_requires=">=3.8",
324
+ install_requires="""
325
+ packaging==23.2
326
+ more-itertools==8.8.0; extra == "other"
327
+ jaraco.text==3.7.0
328
+ importlib-resources==5.10.2; python_version<"3.8"
329
+ importlib-metadata==6.0.0 ; python_version<"3.8"
330
+ colorama>=0.4.4; sys_platform == "win32"
331
+ """,
332
+ extras_require={
333
+ "testing": """
334
+ pytest >= 6
335
+ pytest-checkdocs >= 2.4
336
+ tomli ; \\
337
+ # Using stdlib when possible
338
+ python_version < "3.11"
339
+ ini2toml[lite]>=0.9
340
+ """,
341
+ "other": [],
342
+ },
343
+ )
344
+ # Generate a PKG-INFO file using setuptools
345
+ return Distribution(attrs)
346
+
347
+ def test_requires_dist(self, tmp_path):
348
+ dist = self.base_example()
349
+ pkg_info = _get_pkginfo(dist)
350
+ assert _valid_metadata(pkg_info)
351
+
352
+ # Ensure Requires-Dist is present
353
+ expected = [
354
+ 'Metadata-Version:',
355
+ 'Requires-Python: >=3.8',
356
+ 'Provides-Extra: other',
357
+ 'Provides-Extra: testing',
358
+ 'Requires-Dist: tomli; python_version < "3.11" and extra == "testing"',
359
+ 'Requires-Dist: more-itertools==8.8.0; extra == "other"',
360
+ 'Requires-Dist: ini2toml[lite]>=0.9; extra == "testing"',
361
+ ]
362
+ for line in expected:
363
+ assert line in pkg_info
364
+
365
+ HERE = Path(__file__).parent
366
+ EXAMPLES_FILE = HERE / "config/setupcfg_examples.txt"
367
+
368
+ @pytest.fixture(params=[None, *urls_from_file(EXAMPLES_FILE)])
369
+ def dist(self, request, monkeypatch, tmp_path):
370
+ """Example of distribution with arbitrary configuration"""
371
+ monkeypatch.chdir(tmp_path)
372
+ monkeypatch.setattr(expand, "read_attr", Mock(return_value="0.42"))
373
+ monkeypatch.setattr(expand, "read_files", Mock(return_value="hello world"))
374
+ if request.param is None:
375
+ yield self.base_example()
376
+ else:
377
+ # Real-world usage
378
+ config = retrieve_file(request.param)
379
+ yield setupcfg.apply_configuration(Distribution({}), config)
380
+
381
+ @pytest.mark.uses_network
382
+ def test_equivalent_output(self, tmp_path, dist):
383
+ """Ensure output from setuptools is equivalent to the one from `pypa/wheel`"""
384
+ # Generate a METADATA file using pypa/wheel for comparison
385
+ wheel_metadata = importlib.import_module("wheel.metadata")
386
+ pkginfo_to_metadata = getattr(wheel_metadata, "pkginfo_to_metadata", None)
387
+
388
+ if pkginfo_to_metadata is None: # pragma: nocover
389
+ pytest.xfail(
390
+ "wheel.metadata.pkginfo_to_metadata is undefined, "
391
+ "(this is likely to be caused by API changes in pypa/wheel"
392
+ )
393
+
394
+ # Generate an simplified "egg-info" dir for pypa/wheel to convert
395
+ pkg_info = _get_pkginfo(dist)
396
+ egg_info_dir = tmp_path / "pkg.egg-info"
397
+ egg_info_dir.mkdir(parents=True)
398
+ (egg_info_dir / "PKG-INFO").write_text(pkg_info, encoding="utf-8")
399
+ write_requirements(egg_info(dist), egg_info_dir, egg_info_dir / "requires.txt")
400
+
401
+ # Get pypa/wheel generated METADATA but normalize requirements formatting
402
+ metadata_msg = pkginfo_to_metadata(egg_info_dir, egg_info_dir / "PKG-INFO")
403
+ metadata_str = _normalize_metadata(metadata_msg)
404
+ pkg_info_msg = message_from_string(pkg_info)
405
+ pkg_info_str = _normalize_metadata(pkg_info_msg)
406
+
407
+ # Compare setuptools PKG-INFO x pypa/wheel METADATA
408
+ assert metadata_str == pkg_info_str
409
+
410
+ # Make sure it parses/serializes well in pypa/wheel
411
+ _assert_roundtrip_message(pkg_info)
412
+
413
+
414
+ def _assert_roundtrip_message(metadata: str) -> None:
415
+ """Emulate the way wheel.bdist_wheel parses and regenerates the message,
416
+ then ensures the metadata generated by setuptools is compatible.
417
+ """
418
+ with io.StringIO(metadata) as buffer:
419
+ msg = Parser().parse(buffer)
420
+
421
+ serialization_policy = EmailPolicy(
422
+ utf8=True,
423
+ mangle_from_=False,
424
+ max_line_length=0,
331
425
  )
332
- # Generate a PKG-INFO file using setuptools
333
- dist = Distribution(attrs)
334
- with io.StringIO() as fp:
335
- dist.metadata.write_pkg_file(fp)
336
- pkg_info = fp.getvalue()
426
+ with io.BytesIO() as buffer:
427
+ out = io.TextIOWrapper(buffer, encoding="utf-8")
428
+ Generator(out, policy=serialization_policy).flatten(msg)
429
+ out.flush()
430
+ regenerated = buffer.getvalue()
431
+
432
+ raw_metadata = bytes(metadata, "utf-8")
433
+ # Normalise newlines to avoid test errors on Windows:
434
+ raw_metadata = b"\n".join(raw_metadata.splitlines())
435
+ regenerated = b"\n".join(regenerated.splitlines())
436
+ assert regenerated == raw_metadata
437
+
438
+
439
+ def _normalize_metadata(msg: Message) -> str:
440
+ """Allow equivalent metadata to be compared directly"""
441
+ # The main challenge regards the requirements and extras.
442
+ # Both setuptools and wheel already apply some level of normalization
443
+ # but they differ regarding which character is chosen, according to the
444
+ # following spec it should be "-":
445
+ # https://packaging.python.org/en/latest/specifications/name-normalization/
446
+
447
+ # Related issues:
448
+ # https://github.com/pypa/packaging/issues/845
449
+ # https://github.com/pypa/packaging/issues/644#issuecomment-2429813968
450
+
451
+ extras = {x.replace("_", "-"): x for x in msg.get_all("Provides-Extra", [])}
452
+ reqs = [
453
+ _normalize_req(req, extras)
454
+ for req in _reqs.parse(msg.get_all("Requires-Dist", []))
455
+ ]
456
+ del msg["Requires-Dist"]
457
+ del msg["Provides-Extra"]
337
458
 
338
- assert _valid_metadata(pkg_info)
459
+ # Ensure consistent ord
460
+ for req in sorted(reqs):
461
+ msg["Requires-Dist"] = req
462
+ for extra in sorted(extras):
463
+ msg["Provides-Extra"] = extra
339
464
 
340
- # Ensure Requires-Dist is present
341
- expected = [
342
- 'Metadata-Version:',
343
- 'Requires-Python: >=3.8',
344
- 'Provides-Extra: other',
345
- 'Provides-Extra: testing',
346
- 'Requires-Dist: tomli; python_version < "3.11" and extra == "testing"',
347
- 'Requires-Dist: more-itertools==8.8.0; extra == "other"',
348
- 'Requires-Dist: ini2toml[lite]>=0.9; extra == "testing"',
349
- ]
350
- for line in expected:
351
- assert line in pkg_info
465
+ return msg.as_string()
352
466
 
353
- # Generate a METADATA file using pypa/wheel for comparison
354
- wheel_metadata = importlib.import_module("wheel.metadata")
355
- pkginfo_to_metadata = getattr(wheel_metadata, "pkginfo_to_metadata", None)
356
467
 
357
- if pkginfo_to_metadata is None:
358
- pytest.xfail(
359
- "wheel.metadata.pkginfo_to_metadata is undefined, "
360
- "(this is likely to be caused by API changes in pypa/wheel"
361
- )
468
+ def _normalize_req(req: Requirement, extras: dict[str, str]) -> str:
469
+ """Allow equivalent requirement objects to be compared directly"""
470
+ as_str = str(req).replace(req.name, req.name.replace("_", "-"))
471
+ for norm, orig in extras.items():
472
+ as_str = as_str.replace(orig, norm)
473
+ return as_str
362
474
 
363
- # Generate an simplified "egg-info" dir for pypa/wheel to convert
364
- egg_info_dir = tmp_path / "pkg.egg-info"
365
- egg_info_dir.mkdir(parents=True)
366
- (egg_info_dir / "PKG-INFO").write_text(pkg_info, encoding="utf-8")
367
- write_requirements(egg_info(dist), egg_info_dir, egg_info_dir / "requires.txt")
368
-
369
- # Get pypa/wheel generated METADATA but normalize requirements formatting
370
- metadata_msg = pkginfo_to_metadata(egg_info_dir, egg_info_dir / "PKG-INFO")
371
- metadata_deps = set(_reqs.parse(metadata_msg.get_all("Requires-Dist")))
372
- metadata_extras = set(metadata_msg.get_all("Provides-Extra"))
373
- del metadata_msg["Requires-Dist"]
374
- del metadata_msg["Provides-Extra"]
375
- pkg_info_msg = message_from_string(pkg_info)
376
- pkg_info_deps = set(_reqs.parse(pkg_info_msg.get_all("Requires-Dist")))
377
- pkg_info_extras = set(pkg_info_msg.get_all("Provides-Extra"))
378
- del pkg_info_msg["Requires-Dist"]
379
- del pkg_info_msg["Provides-Extra"]
380
-
381
- # Compare setuptools PKG-INFO x pypa/wheel METADATA
382
- assert metadata_msg.as_string() == pkg_info_msg.as_string()
383
- assert metadata_deps == pkg_info_deps
384
- assert metadata_extras == pkg_info_extras
475
+
476
+ def _get_pkginfo(dist: Distribution):
477
+ with io.StringIO() as fp:
478
+ dist.metadata.write_pkg_file(fp)
479
+ return fp.getvalue()
385
480
 
386
481
 
387
482
  def _valid_metadata(text: str) -> bool:
@@ -1,4 +1,3 @@
1
- import collections
2
1
  import os
3
2
  import re
4
3
  import urllib.parse
@@ -72,15 +71,10 @@ EXAMPLE_BASE_INFO = dict(
72
71
 
73
72
 
74
73
  def test_provides_extras_deterministic_order():
75
- extras = collections.OrderedDict()
76
- extras['a'] = ['foo']
77
- extras['b'] = ['bar']
78
- attrs = dict(extras_require=extras)
74
+ attrs = dict(extras_require=dict(a=['foo'], b=['bar']))
79
75
  dist = Distribution(attrs)
80
76
  assert list(dist.metadata.provides_extras) == ['a', 'b']
81
- attrs['extras_require'] = collections.OrderedDict(
82
- reversed(list(attrs['extras_require'].items()))
83
- )
77
+ attrs['extras_require'] = dict(reversed(attrs['extras_require'].items()))
84
78
  dist = Distribution(attrs)
85
79
  assert list(dist.metadata.provides_extras) == ['b', 'a']
86
80
 
@@ -135,7 +129,7 @@ CHECK_PACKAGE_DATA_TESTS = (
135
129
  )
136
130
 
137
131
 
138
- @pytest.mark.parametrize('package_data, expected_message', CHECK_PACKAGE_DATA_TESTS)
132
+ @pytest.mark.parametrize(('package_data', 'expected_message'), CHECK_PACKAGE_DATA_TESTS)
139
133
  def test_check_package_data(package_data, expected_message):
140
134
  if expected_message is None:
141
135
  assert check_package_data(None, 'package_data', package_data) is None
@@ -150,8 +144,12 @@ def test_check_specifier():
150
144
  dist = Distribution(attrs)
151
145
  check_specifier(dist, attrs, attrs['python_requires'])
152
146
 
153
- # invalid specifier value
154
147
  attrs = {'name': 'foo', 'python_requires': ['>=3.0', '!=3.1']}
148
+ dist = Distribution(attrs)
149
+ check_specifier(dist, attrs, attrs['python_requires'])
150
+
151
+ # invalid specifier value
152
+ attrs = {'name': 'foo', 'python_requires': '>=invalid-version'}
155
153
  with pytest.raises(DistutilsSetupError):
156
154
  dist = Distribution(attrs)
157
155
 
@@ -162,7 +160,7 @@ def test_metadata_name():
162
160
 
163
161
 
164
162
  @pytest.mark.parametrize(
165
- "dist_name, py_module",
163
+ ('dist_name', 'py_module'),
166
164
  [
167
165
  ("my.pkg", "my_pkg"),
168
166
  ("my-pkg", "my_pkg"),
@@ -193,7 +191,7 @@ def test_dist_default_py_modules(tmp_path, dist_name, py_module):
193
191
 
194
192
 
195
193
  @pytest.mark.parametrize(
196
- "dist_name, package_dir, package_files, packages",
194
+ ('dist_name', 'package_dir', 'package_files', 'packages'),
197
195
  [
198
196
  ("my.pkg", None, ["my_pkg/__init__.py", "my_pkg/mod.py"], ["my_pkg"]),
199
197
  ("my-pkg", None, ["my_pkg/__init__.py", "my_pkg/mod.py"], ["my_pkg"]),
@@ -247,7 +245,7 @@ def test_dist_default_packages(
247
245
 
248
246
 
249
247
  @pytest.mark.parametrize(
250
- "dist_name, package_dir, package_files",
248
+ ('dist_name', 'package_dir', 'package_files'),
251
249
  [
252
250
  ("my.pkg.nested", None, ["my/pkg/nested/__init__.py"]),
253
251
  ("my.pkg", None, ["my/pkg/__init__.py", "my/pkg/file.py"]),
@@ -169,7 +169,7 @@ class TestWheelCompatibility:
169
169
 
170
170
  @pytest.mark.parametrize("name", "my-proj my_proj my.proj My.Proj".split())
171
171
  @pytest.mark.parametrize("version", ["0.42.13"])
172
- @pytest.mark.parametrize("suffix, cfg", EGG_INFO_OPTS)
172
+ @pytest.mark.parametrize(("suffix", "cfg"), EGG_INFO_OPTS)
173
173
  def test_dist_info_is_the_same_as_in_wheel(
174
174
  self, name, version, tmp_path, suffix, cfg
175
175
  ):
@@ -114,8 +114,9 @@ print("success")
114
114
  """
115
115
 
116
116
 
117
+ @pytest.mark.usefixtures("tmpdir_cwd")
117
118
  @pytest.mark.parametrize(
118
- "distutils_version, imported_module",
119
+ ('distutils_version', 'imported_module'),
119
120
  [
120
121
  pytest.param("stdlib", "dir_util", marks=skip_without_stdlib_distutils),
121
122
  pytest.param("stdlib", "file_util", marks=skip_without_stdlib_distutils),
@@ -125,9 +126,7 @@ print("success")
125
126
  ("local", "archive_util"),
126
127
  ],
127
128
  )
128
- def test_modules_are_not_duplicated_on_import(
129
- distutils_version, imported_module, tmpdir_cwd, venv
130
- ):
129
+ def test_modules_are_not_duplicated_on_import(distutils_version, imported_module, venv):
131
130
  env = dict(SETUPTOOLS_USE_DISTUTILS=distutils_version)
132
131
  script = ENSURE_IMPORTS_ARE_NOT_DUPLICATED.format(imported_module=imported_module)
133
132
  cmd = ['python', '-c', script]
@@ -145,6 +144,7 @@ print("success")
145
144
  """
146
145
 
147
146
 
147
+ @pytest.mark.usefixtures("tmpdir_cwd")
148
148
  @pytest.mark.parametrize(
149
149
  "distutils_version",
150
150
  [
@@ -152,8 +152,47 @@ print("success")
152
152
  pytest.param("stdlib", marks=skip_without_stdlib_distutils),
153
153
  ],
154
154
  )
155
- def test_log_module_is_not_duplicated_on_import(distutils_version, tmpdir_cwd, venv):
155
+ def test_log_module_is_not_duplicated_on_import(distutils_version, venv):
156
156
  env = dict(SETUPTOOLS_USE_DISTUTILS=distutils_version)
157
157
  cmd = ['python', '-c', ENSURE_LOG_IMPORT_IS_NOT_DUPLICATED]
158
158
  output = venv.run(cmd, env=win_sr(env), **_TEXT_KWARGS).strip()
159
159
  assert output == "success"
160
+
161
+
162
+ ENSURE_CONSISTENT_ERROR_FROM_MODIFIED_PY = r"""
163
+ from setuptools.modified import newer
164
+ from {imported_module}.errors import DistutilsError
165
+
166
+ # Can't use pytest.raises in this context
167
+ try:
168
+ newer("", "")
169
+ except DistutilsError:
170
+ print("success")
171
+ else:
172
+ raise AssertionError("Expected to raise")
173
+ """
174
+
175
+
176
+ @pytest.mark.usefixtures("tmpdir_cwd")
177
+ @pytest.mark.parametrize(
178
+ ('distutils_version', 'imported_module'),
179
+ [
180
+ ("local", "distutils"),
181
+ # Unfortunately we still get ._distutils.errors.DistutilsError with SETUPTOOLS_USE_DISTUTILS=stdlib
182
+ # But that's a deprecated use-case we don't mind not fully supporting in newer code
183
+ pytest.param(
184
+ "stdlib", "setuptools._distutils", marks=skip_without_stdlib_distutils
185
+ ),
186
+ ],
187
+ )
188
+ def test_consistent_error_from_modified_py(distutils_version, imported_module, venv):
189
+ env = dict(SETUPTOOLS_USE_DISTUTILS=distutils_version)
190
+ cmd = [
191
+ 'python',
192
+ '-c',
193
+ ENSURE_CONSISTENT_ERROR_FROM_MODIFIED_PY.format(
194
+ imported_module=imported_module
195
+ ),
196
+ ]
197
+ output = venv.run(cmd, env=win_sr(env), **_TEXT_KWARGS).strip()
198
+ assert output == "success"
@@ -72,7 +72,7 @@ class TestEasyInstallTest:
72
72
  header = ei.CommandSpec.best().from_environment().as_header()
73
73
  dist = FakeDist()
74
74
  args = next(ei.ScriptWriter.get_args(dist))
75
- name, script = itertools.islice(args, 2)
75
+ _name, script = itertools.islice(args, 2)
76
76
  assert script.startswith(header)
77
77
  assert "'spec'" in script
78
78
  assert "'console_scripts'" in script
@@ -327,9 +327,9 @@ class TestPTHFileWriter:
327
327
  pth_path = str(pth_subdir.join("file1.pth"))
328
328
  pth1 = PthDistributions(pth_path)
329
329
  pth2 = PthDistributions(pth_path)
330
- assert (
331
- pth1.paths == pth2.paths == []
332
- ), "unless there would be some default added at some point"
330
+ assert pth1.paths == pth2.paths == [], (
331
+ "unless there would be some default added at some point"
332
+ )
333
333
  # and so putting the src_subdir in folder distinct than the pth one,
334
334
  # so to keep it absolute by PthDistributions
335
335
  new_src_path = tmpdir.join("src_subdir")
@@ -337,17 +337,17 @@ class TestPTHFileWriter:
337
337
  new_src_path_str = str(new_src_path)
338
338
  pth1.paths.append(new_src_path_str)
339
339
  pth1.save()
340
- assert (
341
- pth1.paths
342
- ), "the new_src_path added must still be present/valid in pth1 after save"
340
+ assert pth1.paths, (
341
+ "the new_src_path added must still be present/valid in pth1 after save"
342
+ )
343
343
  # now,
344
- assert (
345
- new_src_path_str not in pth2.paths
346
- ), "right before we save the entry should still not be present"
344
+ assert new_src_path_str not in pth2.paths, (
345
+ "right before we save the entry should still not be present"
346
+ )
347
347
  pth2.save()
348
- assert (
349
- new_src_path_str in pth2.paths
350
- ), "the new_src_path entry should have been added by pth2 with its save() call"
348
+ assert new_src_path_str in pth2.paths, (
349
+ "the new_src_path entry should have been added by pth2 with its save() call"
350
+ )
351
351
  assert pth2.paths[-1] == new_src_path, (
352
352
  "and it should match exactly on the last entry actually "
353
353
  "given we append to it in save()"
@@ -407,14 +407,14 @@ class TestUserInstallTest:
407
407
  logging.basicConfig(level=logging.INFO, stream=sys.stderr)
408
408
  log.info('this should not break')
409
409
 
410
- @pytest.fixture()
410
+ @pytest.fixture
411
411
  def foo_package(self, tmpdir):
412
412
  egg_file = tmpdir / 'foo-1.0.egg-info'
413
413
  with egg_file.open('w') as f:
414
414
  f.write('Name: foo\n')
415
415
  return str(tmpdir)
416
416
 
417
- @pytest.fixture()
417
+ @pytest.fixture
418
418
  def install_target(self, tmpdir):
419
419
  target = str(tmpdir)
420
420
  with mock.patch('sys.path', sys.path + [target]):
@@ -472,6 +472,12 @@ def distutils_package():
472
472
  yield
473
473
 
474
474
 
475
+ @pytest.mark.usefixtures("distutils_package")
476
+ class TestDistutilsPackage:
477
+ def test_bdist_egg_available_on_distutils_pkg(self):
478
+ run_setup('setup.py', ['bdist_egg'])
479
+
480
+
475
481
  @pytest.fixture
476
482
  def mock_index():
477
483
  # set up a server which will simulate an alternate package index.
@@ -484,11 +490,6 @@ def mock_index():
484
490
  return p_index
485
491
 
486
492
 
487
- class TestDistutilsPackage:
488
- def test_bdist_egg_available_on_distutils_pkg(self, distutils_package):
489
- run_setup('setup.py', ['bdist_egg'])
490
-
491
-
492
493
  class TestInstallRequires:
493
494
  def test_setup_install_includes_dependencies(self, tmp_path, mock_index):
494
495
  """
@@ -650,7 +651,7 @@ class TestSetupRequires:
650
651
  temp_dir, use_setup_cfg=use_setup_cfg
651
652
  )
652
653
  test_setup_py = os.path.join(test_pkg, 'setup.py')
653
- with contexts.quiet() as (stdout, stderr):
654
+ with contexts.quiet() as (stdout, _stderr):
654
655
  # Don't even need to install the package, just
655
656
  # running the setup.py at all is sufficient
656
657
  run_setup(test_setup_py, ['--name'])
@@ -712,15 +713,14 @@ class TestSetupRequires:
712
713
 
713
714
  test_setup_py = os.path.join(test_pkg, 'setup.py')
714
715
 
715
- with contexts.quiet() as (stdout, stderr):
716
+ with contexts.quiet() as (stdout, _stderr):
716
717
  try:
717
718
  # Don't even need to install the package, just
718
719
  # running the setup.py at all is sufficient
719
720
  run_setup(test_setup_py, ['--name'])
720
721
  except pkg_resources.VersionConflict:
721
722
  self.fail(
722
- 'Installing setup.py requirements '
723
- 'caused a VersionConflict'
723
+ 'Installing setup.py requirements caused a VersionConflict'
724
724
  )
725
725
 
726
726
  assert 'FAIL' not in stdout.getvalue()
@@ -765,7 +765,7 @@ class TestSetupRequires:
765
765
  use_setup_cfg=use_setup_cfg + ('version',),
766
766
  )
767
767
  test_setup_py = os.path.join(test_pkg, 'setup.py')
768
- with contexts.quiet() as (stdout, stderr):
768
+ with contexts.quiet() as (stdout, _stderr):
769
769
  run_setup(test_setup_py, ['--version'])
770
770
  lines = stdout.readlines()
771
771
  assert len(lines) > 0
@@ -860,7 +860,9 @@ class TestSetupRequires:
860
860
  )
861
861
  dep_2_0_sdist = 'dep-2.0.tar.gz'
862
862
  dep_2_0_url = path_to_url(str(tmpdir / dep_2_0_sdist))
863
- dep_2_0_python_requires = '!=' + '.'.join(map(str, sys.version_info[:2])) + '.*'
863
+ dep_2_0_python_requires = (
864
+ f'!={sys.version_info.major}.{sys.version_info.minor}.*'
865
+ )
864
866
  make_python_requires_sdist(
865
867
  str(tmpdir / dep_2_0_sdist), 'dep', '2.0', dep_2_0_python_requires
866
868
  )
@@ -1408,6 +1410,10 @@ def test_use_correct_python_version_string(tmpdir, tmpdir_cwd, monkeypatch):
1408
1410
  assert cmd.config_vars['py_version_nodot'] == '310'
1409
1411
 
1410
1412
 
1413
+ @pytest.mark.xfail(
1414
+ sys.platform == "darwin",
1415
+ reason="https://github.com/pypa/setuptools/pull/4716#issuecomment-2447624418",
1416
+ )
1411
1417
  def test_editable_user_and_build_isolation(setup_context, monkeypatch, tmp_path):
1412
1418
  """`setup.py develop` should honor `--user` even under build isolation"""
1413
1419
 
@@ -1,3 +1,5 @@
1
+ from __future__ import annotations
2
+
1
3
  import os
2
4
  import platform
3
5
  import stat
@@ -8,6 +10,7 @@ from importlib import import_module
8
10
  from importlib.machinery import EXTENSION_SUFFIXES
9
11
  from pathlib import Path
10
12
  from textwrap import dedent
13
+ from typing import Any
11
14
  from unittest.mock import Mock
12
15
  from uuid import uuid4
13
16
 
@@ -840,7 +843,8 @@ class TestOverallBehaviour:
840
843
  version = "3.14159"
841
844
  """
842
845
 
843
- FLAT_LAYOUT = {
846
+ # Any: Would need a TypedDict. Keep it simple for tests
847
+ FLAT_LAYOUT: dict[str, Any] = {
844
848
  "pyproject.toml": dedent(PYPROJECT),
845
849
  "MANIFEST.in": EXAMPLE["MANIFEST.in"],
846
850
  "otherfile.py": "",
@@ -878,9 +882,9 @@ class TestOverallBehaviour:
878
882
  "otherfile.py": "",
879
883
  "mypkg": {
880
884
  "__init__.py": "",
881
- "mod1.py": FLAT_LAYOUT["mypkg"]["mod1.py"], # type: ignore
885
+ "mod1.py": FLAT_LAYOUT["mypkg"]["mod1.py"],
882
886
  },
883
- "other": FLAT_LAYOUT["mypkg"]["subpackage"], # type: ignore
887
+ "other": FLAT_LAYOUT["mypkg"]["subpackage"],
884
888
  },
885
889
  "namespace": {
886
890
  "pyproject.toml": dedent(PYPROJECT),
@@ -888,8 +892,8 @@ class TestOverallBehaviour:
888
892
  "otherfile.py": "",
889
893
  "src": {
890
894
  "mypkg": {
891
- "mod1.py": FLAT_LAYOUT["mypkg"]["mod1.py"], # type: ignore
892
- "subpackage": FLAT_LAYOUT["mypkg"]["subpackage"], # type: ignore
895
+ "mod1.py": FLAT_LAYOUT["mypkg"]["mod1.py"],
896
+ "subpackage": FLAT_LAYOUT["mypkg"]["subpackage"],
893
897
  },
894
898
  },
895
899
  },
@@ -1271,7 +1275,7 @@ def assert_path(pkg, expected):
1271
1275
  assert str(Path(path).resolve()) == expected
1272
1276
 
1273
1277
 
1274
- def assert_link_to(file: Path, other: Path):
1278
+ def assert_link_to(file: Path, other: Path) -> None:
1275
1279
  if file.is_symlink():
1276
1280
  assert str(file.resolve()) == str(other.resolve())
1277
1281
  else: