conan 2.20.1__tar.gz → 2.21.0__tar.gz

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 (358) hide show
  1. {conan-2.20.1/conan.egg-info → conan-2.21.0}/PKG-INFO +1 -1
  2. {conan-2.20.1 → conan-2.21.0}/conan/__init__.py +1 -1
  3. {conan-2.20.1 → conan-2.21.0}/conan/api/conan_api.py +9 -1
  4. {conan-2.20.1 → conan-2.21.0}/conan/api/model/list.py +110 -43
  5. {conan-2.20.1 → conan-2.21.0}/conan/api/model/remote.py +4 -1
  6. {conan-2.20.1 → conan-2.21.0}/conan/api/subapi/audit.py +5 -2
  7. {conan-2.20.1 → conan-2.21.0}/conan/api/subapi/cache.py +12 -8
  8. {conan-2.20.1 → conan-2.21.0}/conan/api/subapi/config.py +2 -2
  9. {conan-2.20.1 → conan-2.21.0}/conan/api/subapi/download.py +9 -3
  10. {conan-2.20.1 → conan-2.21.0}/conan/api/subapi/list.py +25 -19
  11. {conan-2.20.1 → conan-2.21.0}/conan/api/subapi/remotes.py +9 -12
  12. {conan-2.20.1 → conan-2.21.0}/conan/api/subapi/upload.py +4 -4
  13. {conan-2.20.1 → conan-2.21.0}/conan/cli/args.py +10 -4
  14. {conan-2.20.1 → conan-2.21.0}/conan/cli/commands/audit.py +7 -4
  15. {conan-2.20.1 → conan-2.21.0}/conan/cli/commands/build.py +3 -1
  16. {conan-2.20.1 → conan-2.21.0}/conan/cli/commands/download.py +1 -1
  17. {conan-2.20.1 → conan-2.21.0}/conan/cli/commands/editable.py +9 -4
  18. {conan-2.20.1 → conan-2.21.0}/conan/cli/commands/export.py +4 -2
  19. {conan-2.20.1 → conan-2.21.0}/conan/cli/commands/export_pkg.py +3 -1
  20. {conan-2.20.1 → conan-2.21.0}/conan/cli/commands/graph.py +1 -6
  21. {conan-2.20.1 → conan-2.21.0}/conan/cli/commands/inspect.py +3 -1
  22. {conan-2.20.1 → conan-2.21.0}/conan/cli/commands/list.py +1 -1
  23. {conan-2.20.1 → conan-2.21.0}/conan/cli/commands/lock.py +0 -3
  24. {conan-2.20.1 → conan-2.21.0}/conan/cli/commands/remote.py +18 -4
  25. {conan-2.20.1 → conan-2.21.0}/conan/cli/commands/remove.py +24 -30
  26. {conan-2.20.1 → conan-2.21.0}/conan/cli/commands/search.py +2 -3
  27. {conan-2.20.1 → conan-2.21.0}/conan/cli/commands/source.py +3 -1
  28. {conan-2.20.1 → conan-2.21.0}/conan/cli/commands/test.py +3 -1
  29. {conan-2.20.1 → conan-2.21.0}/conan/cli/commands/upload.py +18 -21
  30. {conan-2.20.1 → conan-2.21.0}/conan/cli/commands/workspace.py +1 -1
  31. {conan-2.20.1 → conan-2.21.0}/conan/cli/formatters/audit/vulnerabilities.py +1 -1
  32. {conan-2.20.1 → conan-2.21.0}/conan/cli/formatters/report/diff.py +53 -0
  33. conan-2.21.0/conan/cli/formatters/report/diff_html.py +248 -0
  34. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/audit/providers.py +2 -2
  35. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/detect/detect_api.py +3 -2
  36. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/detect/detect_vs.py +1 -1
  37. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/export.py +19 -0
  38. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/list/query_parse.py +2 -2
  39. conan-2.21.0/conan/internal/api/upload.py +18 -0
  40. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/uploader.py +24 -11
  41. {conan-2.20.1 → conan-2.21.0}/conan/internal/cache/integrity_check.py +2 -2
  42. {conan-2.20.1 → conan-2.21.0}/conan/internal/conan_app.py +4 -4
  43. {conan-2.20.1 → conan-2.21.0}/conan/internal/default_settings.py +21 -11
  44. {conan-2.20.1 → conan-2.21.0}/conan/internal/graph/compatibility.py +11 -7
  45. {conan-2.20.1 → conan-2.21.0}/conan/internal/graph/compute_pid.py +12 -6
  46. {conan-2.20.1 → conan-2.21.0}/conan/internal/graph/graph_binaries.py +5 -5
  47. {conan-2.20.1 → conan-2.21.0}/conan/internal/graph/graph_builder.py +8 -3
  48. {conan-2.20.1 → conan-2.21.0}/conan/internal/graph/install_graph.py +1 -1
  49. {conan-2.20.1 → conan-2.21.0}/conan/internal/graph/installer.py +5 -3
  50. {conan-2.20.1 → conan-2.21.0}/conan/internal/graph/python_requires.py +1 -1
  51. {conan-2.20.1 → conan-2.21.0}/conan/internal/hook_manager.py +6 -1
  52. {conan-2.20.1 → conan-2.21.0}/conan/internal/internal_tools.py +2 -1
  53. {conan-2.20.1 → conan-2.21.0}/conan/internal/model/conanfile_interface.py +4 -0
  54. {conan-2.20.1 → conan-2.21.0}/conan/internal/model/conf.py +1 -0
  55. {conan-2.20.1 → conan-2.21.0}/conan/internal/model/info.py +8 -0
  56. {conan-2.20.1 → conan-2.21.0}/conan/internal/model/profile.py +3 -2
  57. {conan-2.20.1 → conan-2.21.0}/conan/internal/model/requires.py +3 -1
  58. {conan-2.20.1 → conan-2.21.0}/conan/internal/model/workspace.py +7 -4
  59. {conan-2.20.1 → conan-2.21.0}/conan/internal/rest/caching_file_downloader.py +0 -1
  60. {conan-2.20.1 → conan-2.21.0}/conan/internal/rest/download_cache.py +8 -8
  61. {conan-2.20.1 → conan-2.21.0}/conan/internal/rest/file_downloader.py +2 -2
  62. {conan-2.20.1 → conan-2.21.0}/conan/internal/rest/pkg_sign.py +4 -2
  63. {conan-2.20.1 → conan-2.21.0}/conan/internal/rest/remote_manager.py +16 -4
  64. {conan-2.20.1 → conan-2.21.0}/conan/internal/rest/rest_client_local_recipe_index.py +2 -2
  65. {conan-2.20.1 → conan-2.21.0}/conan/internal/runner/docker.py +2 -1
  66. {conan-2.20.1 → conan-2.21.0}/conan/internal/util/files.py +0 -1
  67. {conan-2.20.1 → conan-2.21.0}/conan/test/assets/premake.py +2 -2
  68. {conan-2.20.1 → conan-2.21.0}/conan/test/utils/server_launcher.py +2 -2
  69. {conan-2.20.1 → conan-2.21.0}/conan/tools/apple/apple.py +35 -18
  70. {conan-2.20.1 → conan-2.21.0}/conan/tools/apple/xcodebuild.py +12 -3
  71. {conan-2.20.1 → conan-2.21.0}/conan/tools/apple/xcodedeps.py +1 -1
  72. {conan-2.20.1 → conan-2.21.0}/conan/tools/apple/xcodetoolchain.py +6 -3
  73. {conan-2.20.1 → conan-2.21.0}/conan/tools/cmake/cmake.py +31 -9
  74. {conan-2.20.1 → conan-2.21.0}/conan/tools/cmake/cmakedeps/cmakedeps.py +7 -7
  75. {conan-2.20.1 → conan-2.21.0}/conan/tools/cmake/cmakedeps/templates/config.py +25 -0
  76. {conan-2.20.1 → conan-2.21.0}/conan/tools/cmake/cmakedeps2/cmakedeps.py +3 -2
  77. {conan-2.20.1 → conan-2.21.0}/conan/tools/cmake/cmakedeps2/config.py +73 -7
  78. {conan-2.20.1 → conan-2.21.0}/conan/tools/cmake/cmakedeps2/target_configuration.py +4 -40
  79. {conan-2.20.1 → conan-2.21.0}/conan/tools/cmake/presets.py +9 -7
  80. {conan-2.20.1 → conan-2.21.0}/conan/tools/cmake/toolchain/blocks.py +7 -34
  81. conan-2.21.0/conan/tools/cmake/utils.py +41 -0
  82. {conan-2.20.1 → conan-2.21.0}/conan/tools/env/environment.py +21 -1
  83. {conan-2.20.1 → conan-2.21.0}/conan/tools/files/__init__.py +0 -1
  84. {conan-2.20.1 → conan-2.21.0}/conan/tools/files/conandata.py +2 -1
  85. {conan-2.20.1 → conan-2.21.0}/conan/tools/gnu/autotoolstoolchain.py +15 -7
  86. {conan-2.20.1 → conan-2.21.0}/conan/tools/gnu/gnutoolchain.py +17 -7
  87. {conan-2.20.1 → conan-2.21.0}/conan/tools/google/bazeldeps.py +7 -1
  88. {conan-2.20.1 → conan-2.21.0}/conan/tools/layout/__init__.py +3 -0
  89. {conan-2.20.1 → conan-2.21.0}/conan/tools/meson/toolchain.py +1 -1
  90. {conan-2.20.1 → conan-2.21.0}/conan/tools/microsoft/msbuild.py +4 -4
  91. {conan-2.20.1 → conan-2.21.0}/conan/tools/microsoft/visual.py +5 -2
  92. {conan-2.20.1 → conan-2.21.0}/conan/tools/premake/premake.py +1 -0
  93. {conan-2.20.1 → conan-2.21.0}/conan/tools/ros/rosenv.py +1 -2
  94. {conan-2.20.1 → conan-2.21.0}/conan/tools/sbom/cyclonedx.py +34 -19
  95. conan-2.21.0/conan/tools/system/__init__.py +1 -0
  96. conan-2.21.0/conan/tools/system/pip_manager.py +43 -0
  97. {conan-2.20.1 → conan-2.21.0/conan.egg-info}/PKG-INFO +1 -1
  98. {conan-2.20.1 → conan-2.21.0}/conan.egg-info/SOURCES.txt +2 -5
  99. conan-2.20.1/conan/cli/formatters/report/diff_html.py +0 -154
  100. conan-2.20.1/conan/internal/api/upload.py +0 -16
  101. conan-2.20.1/conan/tools/cmake/utils.py +0 -5
  102. conan-2.20.1/conan/tools/files/packager.py +0 -99
  103. conan-2.20.1/conans/__init__.py +0 -0
  104. conan-2.20.1/conans/model/__init__.py +0 -0
  105. conan-2.20.1/conans/model/package_ref.py +0 -31
  106. conan-2.20.1/conans/model/recipe_ref.py +0 -31
  107. {conan-2.20.1 → conan-2.21.0}/LICENSE.md +0 -0
  108. {conan-2.20.1 → conan-2.21.0}/MANIFEST.in +0 -0
  109. {conan-2.20.1 → conan-2.21.0}/README.md +0 -0
  110. {conan-2.20.1 → conan-2.21.0}/conan/api/__init__.py +0 -0
  111. {conan-2.20.1 → conan-2.21.0}/conan/api/input.py +0 -0
  112. {conan-2.20.1 → conan-2.21.0}/conan/api/model/__init__.py +0 -0
  113. {conan-2.20.1 → conan-2.21.0}/conan/api/model/refs.py +0 -0
  114. {conan-2.20.1 → conan-2.21.0}/conan/api/output.py +0 -0
  115. {conan-2.20.1 → conan-2.21.0}/conan/api/subapi/__init__.py +0 -0
  116. {conan-2.20.1 → conan-2.21.0}/conan/api/subapi/command.py +0 -0
  117. {conan-2.20.1 → conan-2.21.0}/conan/api/subapi/export.py +0 -0
  118. {conan-2.20.1 → conan-2.21.0}/conan/api/subapi/graph.py +0 -0
  119. {conan-2.20.1 → conan-2.21.0}/conan/api/subapi/install.py +0 -0
  120. {conan-2.20.1 → conan-2.21.0}/conan/api/subapi/local.py +0 -0
  121. {conan-2.20.1 → conan-2.21.0}/conan/api/subapi/lockfile.py +0 -0
  122. {conan-2.20.1 → conan-2.21.0}/conan/api/subapi/new.py +0 -0
  123. {conan-2.20.1 → conan-2.21.0}/conan/api/subapi/profiles.py +0 -0
  124. {conan-2.20.1 → conan-2.21.0}/conan/api/subapi/remove.py +0 -0
  125. {conan-2.20.1 → conan-2.21.0}/conan/api/subapi/report.py +0 -0
  126. {conan-2.20.1 → conan-2.21.0}/conan/api/subapi/workspace.py +0 -0
  127. {conan-2.20.1 → conan-2.21.0}/conan/cli/__init__.py +0 -0
  128. {conan-2.20.1 → conan-2.21.0}/conan/cli/cli.py +0 -0
  129. {conan-2.20.1 → conan-2.21.0}/conan/cli/command.py +0 -0
  130. {conan-2.20.1 → conan-2.21.0}/conan/cli/commands/__init__.py +0 -0
  131. {conan-2.20.1 → conan-2.21.0}/conan/cli/commands/cache.py +0 -0
  132. {conan-2.20.1 → conan-2.21.0}/conan/cli/commands/config.py +0 -0
  133. {conan-2.20.1 → conan-2.21.0}/conan/cli/commands/create.py +0 -0
  134. {conan-2.20.1 → conan-2.21.0}/conan/cli/commands/install.py +0 -0
  135. {conan-2.20.1 → conan-2.21.0}/conan/cli/commands/new.py +0 -0
  136. {conan-2.20.1 → conan-2.21.0}/conan/cli/commands/pkglist.py +0 -0
  137. {conan-2.20.1 → conan-2.21.0}/conan/cli/commands/profile.py +0 -0
  138. {conan-2.20.1 → conan-2.21.0}/conan/cli/commands/report.py +0 -0
  139. {conan-2.20.1 → conan-2.21.0}/conan/cli/commands/version.py +0 -0
  140. {conan-2.20.1 → conan-2.21.0}/conan/cli/exit_codes.py +0 -0
  141. {conan-2.20.1 → conan-2.21.0}/conan/cli/formatters/__init__.py +0 -0
  142. {conan-2.20.1 → conan-2.21.0}/conan/cli/formatters/audit/__init__.py +0 -0
  143. {conan-2.20.1 → conan-2.21.0}/conan/cli/formatters/graph/__init__.py +0 -0
  144. {conan-2.20.1 → conan-2.21.0}/conan/cli/formatters/graph/build_order_html.py +0 -0
  145. {conan-2.20.1 → conan-2.21.0}/conan/cli/formatters/graph/graph.py +0 -0
  146. {conan-2.20.1 → conan-2.21.0}/conan/cli/formatters/graph/graph_info_text.py +0 -0
  147. {conan-2.20.1 → conan-2.21.0}/conan/cli/formatters/graph/info_graph_dot.py +0 -0
  148. {conan-2.20.1 → conan-2.21.0}/conan/cli/formatters/graph/info_graph_html.py +0 -0
  149. {conan-2.20.1 → conan-2.21.0}/conan/cli/formatters/list/__init__.py +0 -0
  150. {conan-2.20.1 → conan-2.21.0}/conan/cli/formatters/list/list.py +0 -0
  151. {conan-2.20.1 → conan-2.21.0}/conan/cli/formatters/list/search_table_html.py +0 -0
  152. {conan-2.20.1 → conan-2.21.0}/conan/cli/formatters/report/__init__.py +0 -0
  153. {conan-2.20.1 → conan-2.21.0}/conan/cli/printers/__init__.py +0 -0
  154. {conan-2.20.1 → conan-2.21.0}/conan/cli/printers/graph.py +0 -0
  155. {conan-2.20.1 → conan-2.21.0}/conan/cps/__init__.py +0 -0
  156. {conan-2.20.1 → conan-2.21.0}/conan/cps/cps.py +0 -0
  157. {conan-2.20.1 → conan-2.21.0}/conan/errors.py +0 -0
  158. {conan-2.20.1 → conan-2.21.0}/conan/internal/__init__.py +0 -0
  159. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/__init__.py +0 -0
  160. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/audit/__init__.py +0 -0
  161. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/config/__init__.py +0 -0
  162. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/config/config_installer.py +0 -0
  163. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/detect/__init__.py +0 -0
  164. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/install/__init__.py +0 -0
  165. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/install/generators.py +0 -0
  166. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/list/__init__.py +0 -0
  167. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/local/__init__.py +0 -0
  168. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/local/editable.py +0 -0
  169. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/migrations.py +0 -0
  170. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/new/__init__.py +0 -0
  171. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/new/alias_new.py +0 -0
  172. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/new/autoools_exe.py +0 -0
  173. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/new/autotools_lib.py +0 -0
  174. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/new/basic.py +0 -0
  175. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/new/bazel_7_exe.py +0 -0
  176. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/new/bazel_7_lib.py +0 -0
  177. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/new/bazel_exe.py +0 -0
  178. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/new/bazel_lib.py +0 -0
  179. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/new/cmake_exe.py +0 -0
  180. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/new/cmake_lib.py +0 -0
  181. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/new/header_lib.py +0 -0
  182. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/new/local_recipes_index.py +0 -0
  183. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/new/meson_exe.py +0 -0
  184. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/new/meson_lib.py +0 -0
  185. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/new/msbuild_exe.py +0 -0
  186. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/new/msbuild_lib.py +0 -0
  187. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/new/premake_exe.py +0 -0
  188. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/new/premake_lib.py +0 -0
  189. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/new/qbs_lib.py +0 -0
  190. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/new/workspace.py +0 -0
  191. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/profile/__init__.py +0 -0
  192. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/profile/detect.py +0 -0
  193. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/profile/profile_loader.py +0 -0
  194. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/remotes/__init__.py +0 -0
  195. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/remotes/encrypt.py +0 -0
  196. {conan-2.20.1 → conan-2.21.0}/conan/internal/api/remotes/localdb.py +0 -0
  197. {conan-2.20.1 → conan-2.21.0}/conan/internal/cache/__init__.py +0 -0
  198. {conan-2.20.1 → conan-2.21.0}/conan/internal/cache/cache.py +0 -0
  199. {conan-2.20.1 → conan-2.21.0}/conan/internal/cache/conan_reference_layout.py +0 -0
  200. {conan-2.20.1 → conan-2.21.0}/conan/internal/cache/db/__init__.py +0 -0
  201. {conan-2.20.1 → conan-2.21.0}/conan/internal/cache/db/cache_database.py +0 -0
  202. {conan-2.20.1 → conan-2.21.0}/conan/internal/cache/db/packages_table.py +0 -0
  203. {conan-2.20.1 → conan-2.21.0}/conan/internal/cache/db/recipes_table.py +0 -0
  204. {conan-2.20.1 → conan-2.21.0}/conan/internal/cache/db/table.py +0 -0
  205. {conan-2.20.1 → conan-2.21.0}/conan/internal/cache/home_paths.py +0 -0
  206. {conan-2.20.1 → conan-2.21.0}/conan/internal/deploy.py +0 -0
  207. {conan-2.20.1 → conan-2.21.0}/conan/internal/errors.py +0 -0
  208. {conan-2.20.1 → conan-2.21.0}/conan/internal/graph/__init__.py +0 -0
  209. {conan-2.20.1 → conan-2.21.0}/conan/internal/graph/build_mode.py +0 -0
  210. {conan-2.20.1 → conan-2.21.0}/conan/internal/graph/graph.py +0 -0
  211. {conan-2.20.1 → conan-2.21.0}/conan/internal/graph/graph_error.py +0 -0
  212. {conan-2.20.1 → conan-2.21.0}/conan/internal/graph/profile_node_definer.py +0 -0
  213. {conan-2.20.1 → conan-2.21.0}/conan/internal/graph/provides.py +0 -0
  214. {conan-2.20.1 → conan-2.21.0}/conan/internal/graph/proxy.py +0 -0
  215. {conan-2.20.1 → conan-2.21.0}/conan/internal/graph/range_resolver.py +0 -0
  216. {conan-2.20.1 → conan-2.21.0}/conan/internal/loader.py +0 -0
  217. {conan-2.20.1 → conan-2.21.0}/conan/internal/methods.py +0 -0
  218. {conan-2.20.1 → conan-2.21.0}/conan/internal/model/__init__.py +0 -0
  219. {conan-2.20.1 → conan-2.21.0}/conan/internal/model/conan_file.py +0 -0
  220. {conan-2.20.1 → conan-2.21.0}/conan/internal/model/cpp_info.py +0 -0
  221. {conan-2.20.1 → conan-2.21.0}/conan/internal/model/dependencies.py +0 -0
  222. {conan-2.20.1 → conan-2.21.0}/conan/internal/model/layout.py +0 -0
  223. {conan-2.20.1 → conan-2.21.0}/conan/internal/model/lockfile.py +0 -0
  224. {conan-2.20.1 → conan-2.21.0}/conan/internal/model/manifest.py +0 -0
  225. {conan-2.20.1 → conan-2.21.0}/conan/internal/model/options.py +0 -0
  226. {conan-2.20.1 → conan-2.21.0}/conan/internal/model/pkg_type.py +0 -0
  227. {conan-2.20.1 → conan-2.21.0}/conan/internal/model/recipe_ref.py +0 -0
  228. {conan-2.20.1 → conan-2.21.0}/conan/internal/model/settings.py +0 -0
  229. {conan-2.20.1 → conan-2.21.0}/conan/internal/model/version.py +0 -0
  230. {conan-2.20.1 → conan-2.21.0}/conan/internal/model/version_range.py +0 -0
  231. {conan-2.20.1 → conan-2.21.0}/conan/internal/paths.py +0 -0
  232. {conan-2.20.1 → conan-2.21.0}/conan/internal/rest/__init__.py +0 -0
  233. {conan-2.20.1 → conan-2.21.0}/conan/internal/rest/auth_manager.py +0 -0
  234. {conan-2.20.1 → conan-2.21.0}/conan/internal/rest/client_routes.py +0 -0
  235. {conan-2.20.1 → conan-2.21.0}/conan/internal/rest/conan_requester.py +0 -0
  236. {conan-2.20.1 → conan-2.21.0}/conan/internal/rest/file_uploader.py +0 -0
  237. {conan-2.20.1 → conan-2.21.0}/conan/internal/rest/remote_credentials.py +0 -0
  238. {conan-2.20.1 → conan-2.21.0}/conan/internal/rest/rest_client.py +0 -0
  239. {conan-2.20.1 → conan-2.21.0}/conan/internal/rest/rest_client_v2.py +0 -0
  240. {conan-2.20.1 → conan-2.21.0}/conan/internal/rest/rest_routes.py +0 -0
  241. {conan-2.20.1 → conan-2.21.0}/conan/internal/runner/__init__.py +0 -0
  242. {conan-2.20.1 → conan-2.21.0}/conan/internal/runner/output.py +0 -0
  243. {conan-2.20.1 → conan-2.21.0}/conan/internal/runner/ssh.py +0 -0
  244. {conan-2.20.1 → conan-2.21.0}/conan/internal/runner/wsl.py +0 -0
  245. {conan-2.20.1 → conan-2.21.0}/conan/internal/source.py +0 -0
  246. {conan-2.20.1 → conan-2.21.0}/conan/internal/subsystems.py +0 -0
  247. {conan-2.20.1 → conan-2.21.0}/conan/internal/util/__init__.py +0 -0
  248. {conan-2.20.1 → conan-2.21.0}/conan/internal/util/config_parser.py +0 -0
  249. {conan-2.20.1 → conan-2.21.0}/conan/internal/util/dates.py +0 -0
  250. {conan-2.20.1 → conan-2.21.0}/conan/internal/util/runners.py +0 -0
  251. {conan-2.20.1 → conan-2.21.0}/conan/test/__init__.py +0 -0
  252. {conan-2.20.1 → conan-2.21.0}/conan/test/assets/__init__.py +0 -0
  253. {conan-2.20.1 → conan-2.21.0}/conan/test/assets/autotools.py +0 -0
  254. {conan-2.20.1 → conan-2.21.0}/conan/test/assets/cmake.py +0 -0
  255. {conan-2.20.1 → conan-2.21.0}/conan/test/assets/genconanfile.py +0 -0
  256. {conan-2.20.1 → conan-2.21.0}/conan/test/assets/sources.py +0 -0
  257. {conan-2.20.1 → conan-2.21.0}/conan/test/assets/visual_project_files.py +0 -0
  258. {conan-2.20.1 → conan-2.21.0}/conan/test/utils/__init__.py +0 -0
  259. {conan-2.20.1 → conan-2.21.0}/conan/test/utils/artifactory.py +0 -0
  260. {conan-2.20.1 → conan-2.21.0}/conan/test/utils/env.py +0 -0
  261. {conan-2.20.1 → conan-2.21.0}/conan/test/utils/file_server.py +0 -0
  262. {conan-2.20.1 → conan-2.21.0}/conan/test/utils/mocks.py +0 -0
  263. {conan-2.20.1 → conan-2.21.0}/conan/test/utils/profiles.py +0 -0
  264. {conan-2.20.1 → conan-2.21.0}/conan/test/utils/scm.py +0 -0
  265. {conan-2.20.1 → conan-2.21.0}/conan/test/utils/test_files.py +0 -0
  266. {conan-2.20.1 → conan-2.21.0}/conan/test/utils/tools.py +0 -0
  267. {conan-2.20.1 → conan-2.21.0}/conan/tools/__init__.py +0 -0
  268. {conan-2.20.1 → conan-2.21.0}/conan/tools/android/__init__.py +0 -0
  269. {conan-2.20.1 → conan-2.21.0}/conan/tools/android/utils.py +0 -0
  270. {conan-2.20.1 → conan-2.21.0}/conan/tools/apple/__init__.py +0 -0
  271. {conan-2.20.1 → conan-2.21.0}/conan/tools/build/__init__.py +0 -0
  272. {conan-2.20.1 → conan-2.21.0}/conan/tools/build/compiler.py +0 -0
  273. {conan-2.20.1 → conan-2.21.0}/conan/tools/build/cppstd.py +0 -0
  274. {conan-2.20.1 → conan-2.21.0}/conan/tools/build/cpu.py +0 -0
  275. {conan-2.20.1 → conan-2.21.0}/conan/tools/build/cross_building.py +0 -0
  276. {conan-2.20.1 → conan-2.21.0}/conan/tools/build/cstd.py +0 -0
  277. {conan-2.20.1 → conan-2.21.0}/conan/tools/build/flags.py +0 -0
  278. {conan-2.20.1 → conan-2.21.0}/conan/tools/build/stdcpp_library.py +0 -0
  279. {conan-2.20.1 → conan-2.21.0}/conan/tools/cmake/__init__.py +0 -0
  280. {conan-2.20.1 → conan-2.21.0}/conan/tools/cmake/cmakedeps/__init__.py +0 -0
  281. {conan-2.20.1 → conan-2.21.0}/conan/tools/cmake/cmakedeps/templates/__init__.py +0 -0
  282. {conan-2.20.1 → conan-2.21.0}/conan/tools/cmake/cmakedeps/templates/config_version.py +0 -0
  283. {conan-2.20.1 → conan-2.21.0}/conan/tools/cmake/cmakedeps/templates/macros.py +0 -0
  284. {conan-2.20.1 → conan-2.21.0}/conan/tools/cmake/cmakedeps/templates/target_configuration.py +0 -0
  285. {conan-2.20.1 → conan-2.21.0}/conan/tools/cmake/cmakedeps/templates/target_data.py +0 -0
  286. {conan-2.20.1 → conan-2.21.0}/conan/tools/cmake/cmakedeps/templates/targets.py +0 -0
  287. {conan-2.20.1 → conan-2.21.0}/conan/tools/cmake/cmakedeps2/__init__.py +0 -0
  288. {conan-2.20.1 → conan-2.21.0}/conan/tools/cmake/cmakedeps2/config_version.py +0 -0
  289. {conan-2.20.1 → conan-2.21.0}/conan/tools/cmake/cmakedeps2/targets.py +0 -0
  290. {conan-2.20.1 → conan-2.21.0}/conan/tools/cmake/layout.py +0 -0
  291. {conan-2.20.1 → conan-2.21.0}/conan/tools/cmake/toolchain/__init__.py +0 -0
  292. {conan-2.20.1 → conan-2.21.0}/conan/tools/cmake/toolchain/toolchain.py +0 -0
  293. {conan-2.20.1 → conan-2.21.0}/conan/tools/cps/__init__.py +0 -0
  294. {conan-2.20.1 → conan-2.21.0}/conan/tools/cps/cps_deps.py +0 -0
  295. {conan-2.20.1 → conan-2.21.0}/conan/tools/env/__init__.py +0 -0
  296. {conan-2.20.1 → conan-2.21.0}/conan/tools/env/virtualbuildenv.py +0 -0
  297. {conan-2.20.1 → conan-2.21.0}/conan/tools/env/virtualrunenv.py +0 -0
  298. {conan-2.20.1 → conan-2.21.0}/conan/tools/files/copy_pattern.py +0 -0
  299. {conan-2.20.1 → conan-2.21.0}/conan/tools/files/files.py +0 -0
  300. {conan-2.20.1 → conan-2.21.0}/conan/tools/files/patches.py +0 -0
  301. {conan-2.20.1 → conan-2.21.0}/conan/tools/files/symlinks/__init__.py +0 -0
  302. {conan-2.20.1 → conan-2.21.0}/conan/tools/files/symlinks/symlinks.py +0 -0
  303. {conan-2.20.1 → conan-2.21.0}/conan/tools/gnu/__init__.py +0 -0
  304. {conan-2.20.1 → conan-2.21.0}/conan/tools/gnu/autotools.py +0 -0
  305. {conan-2.20.1 → conan-2.21.0}/conan/tools/gnu/autotoolsdeps.py +0 -0
  306. {conan-2.20.1 → conan-2.21.0}/conan/tools/gnu/get_gnu_triplet.py +0 -0
  307. {conan-2.20.1 → conan-2.21.0}/conan/tools/gnu/gnudeps_flags.py +0 -0
  308. {conan-2.20.1 → conan-2.21.0}/conan/tools/gnu/makedeps.py +0 -0
  309. {conan-2.20.1 → conan-2.21.0}/conan/tools/gnu/pkgconfig.py +0 -0
  310. {conan-2.20.1 → conan-2.21.0}/conan/tools/gnu/pkgconfigdeps.py +0 -0
  311. {conan-2.20.1 → conan-2.21.0}/conan/tools/google/__init__.py +0 -0
  312. {conan-2.20.1 → conan-2.21.0}/conan/tools/google/bazel.py +0 -0
  313. {conan-2.20.1 → conan-2.21.0}/conan/tools/google/layout.py +0 -0
  314. {conan-2.20.1 → conan-2.21.0}/conan/tools/google/toolchain.py +0 -0
  315. {conan-2.20.1 → conan-2.21.0}/conan/tools/intel/__init__.py +0 -0
  316. {conan-2.20.1 → conan-2.21.0}/conan/tools/intel/intel_cc.py +0 -0
  317. {conan-2.20.1 → conan-2.21.0}/conan/tools/meson/__init__.py +0 -0
  318. {conan-2.20.1 → conan-2.21.0}/conan/tools/meson/helpers.py +0 -0
  319. {conan-2.20.1 → conan-2.21.0}/conan/tools/meson/meson.py +0 -0
  320. {conan-2.20.1 → conan-2.21.0}/conan/tools/microsoft/__init__.py +0 -0
  321. {conan-2.20.1 → conan-2.21.0}/conan/tools/microsoft/layout.py +0 -0
  322. {conan-2.20.1 → conan-2.21.0}/conan/tools/microsoft/msbuilddeps.py +0 -0
  323. {conan-2.20.1 → conan-2.21.0}/conan/tools/microsoft/nmakedeps.py +0 -0
  324. {conan-2.20.1 → conan-2.21.0}/conan/tools/microsoft/nmaketoolchain.py +0 -0
  325. {conan-2.20.1 → conan-2.21.0}/conan/tools/microsoft/subsystems.py +0 -0
  326. {conan-2.20.1 → conan-2.21.0}/conan/tools/microsoft/toolchain.py +0 -0
  327. {conan-2.20.1 → conan-2.21.0}/conan/tools/premake/__init__.py +0 -0
  328. {conan-2.20.1 → conan-2.21.0}/conan/tools/premake/constants.py +0 -0
  329. {conan-2.20.1 → conan-2.21.0}/conan/tools/premake/premakedeps.py +0 -0
  330. {conan-2.20.1 → conan-2.21.0}/conan/tools/premake/toolchain.py +0 -0
  331. {conan-2.20.1 → conan-2.21.0}/conan/tools/qbs/__init__.py +0 -0
  332. {conan-2.20.1 → conan-2.21.0}/conan/tools/qbs/common.py +0 -0
  333. {conan-2.20.1 → conan-2.21.0}/conan/tools/qbs/qbs.py +0 -0
  334. {conan-2.20.1 → conan-2.21.0}/conan/tools/qbs/qbsdeps.py +0 -0
  335. {conan-2.20.1 → conan-2.21.0}/conan/tools/qbs/qbsprofile.py +0 -0
  336. {conan-2.20.1 → conan-2.21.0}/conan/tools/ros/__init__.py +0 -0
  337. {conan-2.20.1 → conan-2.21.0}/conan/tools/sbom/__init__.py +0 -0
  338. {conan-2.20.1 → conan-2.21.0}/conan/tools/sbom/spdx_licenses.py +0 -0
  339. {conan-2.20.1 → conan-2.21.0}/conan/tools/scm/__init__.py +0 -0
  340. {conan-2.20.1 → conan-2.21.0}/conan/tools/scm/git.py +0 -0
  341. {conan-2.20.1 → conan-2.21.0}/conan/tools/scons/__init__.py +0 -0
  342. {conan-2.20.1 → conan-2.21.0}/conan/tools/scons/sconsdeps.py +0 -0
  343. {conan-2.20.1 → conan-2.21.0}/conan/tools/system/package_manager.py +0 -0
  344. {conan-2.20.1 → conan-2.21.0}/conan.egg-info/dependency_links.txt +0 -0
  345. {conan-2.20.1 → conan-2.21.0}/conan.egg-info/entry_points.txt +0 -0
  346. {conan-2.20.1 → conan-2.21.0}/conan.egg-info/requires.txt +0 -0
  347. {conan-2.20.1 → conan-2.21.0}/conan.egg-info/top_level.txt +0 -0
  348. {conan-2.20.1/conan/tools/system → conan-2.21.0/conans}/__init__.py +0 -0
  349. {conan-2.20.1 → conan-2.21.0}/conans/conan.py +0 -0
  350. {conan-2.20.1 → conan-2.21.0}/conans/conan_server.py +0 -0
  351. {conan-2.20.1 → conan-2.21.0}/conans/migrations.py +0 -0
  352. {conan-2.20.1 → conan-2.21.0}/conans/requirements.txt +0 -0
  353. {conan-2.20.1 → conan-2.21.0}/conans/requirements_dev.txt +0 -0
  354. {conan-2.20.1 → conan-2.21.0}/conans/requirements_runner.txt +0 -0
  355. {conan-2.20.1 → conan-2.21.0}/conans/requirements_server.txt +0 -0
  356. {conan-2.20.1 → conan-2.21.0}/pyproject.toml +0 -0
  357. {conan-2.20.1 → conan-2.21.0}/setup.cfg +0 -0
  358. {conan-2.20.1 → conan-2.21.0}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: conan
3
- Version: 2.20.1
3
+ Version: 2.21.0
4
4
  Summary: Conan C/C++ package manager
5
5
  Home-page: https://conan.io
6
6
  Author: JFrog LTD
@@ -2,5 +2,5 @@ from conan.internal.model.conan_file import ConanFile
2
2
  from conan.internal.model.workspace import Workspace
3
3
  from conan.internal.model.version import Version
4
4
 
5
- __version__ = '2.20.1'
5
+ __version__ = '2.21.0'
6
6
  conan_version = Version(__version__)
@@ -28,6 +28,7 @@ from conan.internal.model.settings import load_settings_yml
28
28
  from conan.internal.paths import get_conan_user_home
29
29
  from conan.internal.api.migrations import ClientMigrator
30
30
  from conan.internal.model.version_range import validate_conan_version
31
+ from conan.internal.rest.conan_requester import ConanRequester
31
32
 
32
33
 
33
34
  class ConanAPI:
@@ -94,7 +95,6 @@ class ConanAPI:
94
95
  Reinitialize the Conan API. This is useful when the configuration changes.
95
96
  """
96
97
  self._api_helpers.reinit()
97
- self.remotes.reinit()
98
98
  self.local.reinit()
99
99
 
100
100
  def migrate(self):
@@ -110,6 +110,8 @@ class ConanAPI:
110
110
  self._cli_core_confs = None
111
111
  self._init_global_conf()
112
112
  self.hook_manager = HookManager(HomePaths(self._conan_api.home_folder).hooks_path)
113
+ # Wraps an http_requester to inject proxies, certs, etc
114
+ self._requester = ConanRequester(self.global_conf, self._conan_api.home_folder)
113
115
 
114
116
  def set_core_confs(self, core_confs):
115
117
  confs = ConfDefinition()
@@ -134,7 +136,13 @@ class ConanAPI:
134
136
  def reinit(self):
135
137
  self._init_global_conf()
136
138
  self.hook_manager.reinit()
139
+ self._requester = ConanRequester(self.global_conf, self._conan_api.home_folder)
137
140
 
138
141
  @property
139
142
  def settings_yml(self):
140
143
  return load_settings_yml(self._conan_api.home_folder)
144
+
145
+ @property
146
+ def requester(self):
147
+ return self._requester
148
+
@@ -1,9 +1,12 @@
1
+ import copy
1
2
  import fnmatch
2
3
  import json
3
4
  import os
4
5
  from json import JSONDecodeError
6
+ from typing import Iterable, Tuple, Dict
5
7
 
6
8
  from conan.api.model import RecipeReference, PkgReference
9
+ from conan.api.output import ConanOutput
7
10
  from conan.errors import ConanException
8
11
  from conan.internal.errors import NotFoundException
9
12
  from conan.internal.model.version_range import VersionRange
@@ -104,7 +107,7 @@ class MultiPackagesList:
104
107
  )
105
108
 
106
109
  mpkglist = MultiPackagesList._define_graph(graph, graph_recipes, graph_binaries,
107
- context=base_context)
110
+ context=base_context)
108
111
  if context == "build-only":
109
112
  host = MultiPackagesList._define_graph(graph, graph_recipes, graph_binaries,
110
113
  context="host")
@@ -150,11 +153,11 @@ class MultiPackagesList:
150
153
  continue
151
154
  pyref = RecipeReference.loads(pyref)
152
155
  if any(r == "*" or r == pyrecipe for r in recipes):
153
- cache_list.add_refs([pyref])
156
+ cache_list.add_ref(pyref)
154
157
  pyremote = pyreq["remote"]
155
158
  if pyremote:
156
159
  remote_list = pkglist.lists.setdefault(pyremote, PackagesList())
157
- remote_list.add_refs([pyref])
160
+ remote_list.add_ref(pyref)
158
161
 
159
162
  recipe = node["recipe"]
160
163
  if recipe in (RECIPE_EDITABLE, RECIPE_CONSUMER, RECIPE_VIRTUAL, RECIPE_PLATFORM):
@@ -165,18 +168,18 @@ class MultiPackagesList:
165
168
  ref.timestamp = node["rrev_timestamp"]
166
169
  recipe = recipe.lower()
167
170
  if any(r == "*" or r == recipe for r in recipes):
168
- cache_list.add_refs([ref])
171
+ cache_list.add_ref(ref)
169
172
 
170
173
  remote = node["remote"]
171
174
  if remote:
172
175
  remote_list = pkglist.lists.setdefault(remote, PackagesList())
173
- remote_list.add_refs([ref])
176
+ remote_list.add_ref(ref)
174
177
  pref = PkgReference(ref, node["package_id"], node["prev"], node["prev_timestamp"])
175
178
  binary_remote = node["binary_remote"]
176
179
  if binary_remote:
177
180
  remote_list = pkglist.lists.setdefault(binary_remote, PackagesList())
178
- remote_list.add_refs([ref]) # Binary listed forces recipe listed
179
- remote_list.add_prefs(ref, [pref])
181
+ remote_list.add_ref(ref) # Binary listed forces recipe listed
182
+ remote_list.add_pref(pref)
180
183
 
181
184
  binary = node["binary"]
182
185
  if binary in (BINARY_SKIP, BINARY_INVALID, BINARY_MISSING):
@@ -184,18 +187,22 @@ class MultiPackagesList:
184
187
 
185
188
  binary = binary.lower()
186
189
  if any(b == "*" or b == binary for b in binaries):
187
- cache_list.add_refs([ref]) # Binary listed forces recipe listed
188
- cache_list.add_prefs(ref, [pref])
189
- cache_list.add_configurations({pref: node["info"]})
190
+ cache_list.add_ref(ref) # Binary listed forces recipe listed
191
+ cache_list.add_pref(pref, node["info"])
190
192
  return pkglist
191
193
 
192
194
 
193
195
  class PackagesList:
194
196
  """ A collection of recipes, revisions and packages."""
195
197
  def __init__(self):
196
- self.recipes = {}
198
+ self._data = {}
199
+
200
+ def __bool__(self):
201
+ """ Whether the package list contains any recipe"""
202
+ return bool(self._data)
197
203
 
198
204
  def merge(self, other):
205
+ assert isinstance(other, PackagesList)
199
206
  def recursive_dict_update(d, u): # TODO: repeated from conandata.py
200
207
  for k, v in u.items():
201
208
  if isinstance(v, dict):
@@ -203,71 +210,94 @@ class PackagesList:
203
210
  else:
204
211
  d[k] = v
205
212
  return d
206
- recursive_dict_update(self.recipes, other.recipes)
213
+ recursive_dict_update(self._data, other._data)
207
214
 
208
215
  def keep_outer(self, other):
209
- if not self.recipes:
216
+ assert isinstance(other, PackagesList)
217
+ if not self._data:
210
218
  return
211
219
 
212
- for ref, info in other.recipes.items():
213
- if self.recipes.get(ref, {}) == info:
214
- self.recipes.pop(ref)
220
+ for ref, info in other._data.items():
221
+ if self._data.get(ref, {}) == info:
222
+ self._data.pop(ref)
215
223
 
216
224
  def split(self):
217
225
  """
218
- Returns a list of PackageList, splitted one per reference.
226
+ Returns a list of PackageList, split one per reference.
219
227
  This can be useful to parallelize things like upload, parallelizing per-reference
220
228
  """
221
229
  result = []
222
- for r, content in self.recipes.items():
230
+ for r, content in self._data.items():
223
231
  subpkglist = PackagesList()
224
- subpkglist.recipes[r] = content
232
+ subpkglist._data[r] = content
225
233
  result.append(subpkglist)
226
234
  return result
227
235
 
228
236
  def only_recipes(self) -> None:
229
237
  """ Filter out all the packages and package revisions, keep only the recipes and
230
- recipe revisions in self.recipes.
238
+ recipe revisions in self._data.
231
239
  """
232
- for ref, ref_dict in self.recipes.items():
240
+ for ref, ref_dict in self._data.items():
233
241
  for rrev_dict in ref_dict.get("revisions", {}).values():
234
242
  rrev_dict.pop("packages", None)
235
243
 
236
244
  def add_refs(self, refs):
245
+ ConanOutput().warning("PackagesLists.add_refs() non-public, non-documented method will be "
246
+ "removed, use .add_ref() instead", warn_tag="deprecated")
237
247
  # RREVS alreday come in ASCENDING order, so upload does older revisions first
238
248
  for ref in refs:
239
- ref_dict = self.recipes.setdefault(str(ref), {})
240
- if ref.revision:
241
- revs_dict = ref_dict.setdefault("revisions", {})
242
- rev_dict = revs_dict.setdefault(ref.revision, {})
243
- if ref.timestamp:
244
- rev_dict["timestamp"] = ref.timestamp
249
+ self.add_ref(ref)
250
+
251
+ def add_ref(self, ref: RecipeReference) -> None:
252
+ """
253
+ Adds a new RecipeReference to a package list
254
+ """
255
+ ref_dict = self._data.setdefault(str(ref), {})
256
+ if ref.revision:
257
+ revs_dict = ref_dict.setdefault("revisions", {})
258
+ rev_dict = revs_dict.setdefault(ref.revision, {})
259
+ if ref.timestamp:
260
+ rev_dict["timestamp"] = ref.timestamp
245
261
 
246
262
  def add_prefs(self, rrev, prefs):
263
+ ConanOutput().warning("PackageLists.add_prefs() non-public, non-documented method will be "
264
+ "removed, use .add_pref() instead", warn_tag="deprecated")
247
265
  # Prevs already come in ASCENDING order, so upload does older revisions first
248
- revs_dict = self.recipes[str(rrev)]["revisions"]
249
- rev_dict = revs_dict[rrev.revision]
250
- packages_dict = rev_dict.setdefault("packages", {})
266
+ for p in prefs:
267
+ self.add_pref(p)
251
268
 
252
- for pref in prefs:
253
- package_dict = packages_dict.setdefault(pref.package_id, {})
254
- if pref.revision:
255
- prevs_dict = package_dict.setdefault("revisions", {})
256
- prev_dict = prevs_dict.setdefault(pref.revision, {})
257
- if pref.timestamp:
258
- prev_dict["timestamp"] = pref.timestamp
269
+ def add_pref(self, pref: PkgReference, pkg_info: dict = None) -> None:
270
+ """
271
+ Add a PkgReference to an already existing RecipeReference inside a package list
272
+ """
273
+ # Prevs already come in ASCENDING order, so upload does older revisions first
274
+ rev_dict = self.recipe_dict(pref.ref)
275
+ packages_dict = rev_dict.setdefault("packages", {})
276
+ package_dict = packages_dict.setdefault(pref.package_id, {})
277
+ if pref.revision:
278
+ prevs_dict = package_dict.setdefault("revisions", {})
279
+ prev_dict = prevs_dict.setdefault(pref.revision, {})
280
+ if pref.timestamp:
281
+ prev_dict["timestamp"] = pref.timestamp
282
+ if pkg_info is not None:
283
+ package_dict["info"] = pkg_info
259
284
 
260
285
  def add_configurations(self, confs):
286
+ ConanOutput().warning("PackageLists.add_configurations() non-public, non-documented method "
287
+ "will be removed, use .add_pref() instead",
288
+ warn_tag="deprecated")
261
289
  for pref, conf in confs.items():
262
- rev_dict = self.recipes[str(pref.ref)]["revisions"][pref.ref.revision]
290
+ rev_dict = self.recipe_dict(pref.ref)
263
291
  try:
264
292
  rev_dict["packages"][pref.package_id]["info"] = conf
265
293
  except KeyError: # If package_id does not exist, do nothing, only add to existing prefs
266
294
  pass
267
295
 
268
296
  def refs(self):
297
+ ConanOutput().warning("PackageLists.refs() non-public, non-documented method will be "
298
+ "removed, use .items() instead", warn_tag="deprecated")
269
299
  result = {}
270
- for ref, ref_dict in self.recipes.items():
300
+ for ref, ref_dict in self._data.items():
271
301
  for rrev, rrev_dict in ref_dict.get("revisions", {}).items():
272
302
  t = rrev_dict.get("timestamp")
273
303
  recipe = RecipeReference.loads(f"{ref}#{rrev}") # TODO: optimize this
@@ -276,8 +306,45 @@ class PackagesList:
276
306
  result[recipe] = rrev_dict
277
307
  return result
278
308
 
309
+ def items(self) -> Iterable[Tuple[RecipeReference, Dict[PkgReference, Dict]]]:
310
+ """ Iterate the contents of the package list.
311
+
312
+ The first dictionary is the information directly belonging to the recipe-revision.
313
+ The second dictionary contains PkgReference as keys, and a dictionary with the values
314
+ belonging to that specific package reference (settings, options, etc.).
315
+ """
316
+ for ref, ref_dict in self._data.items():
317
+ for rrev, rrev_dict in ref_dict.get("revisions", {}).items():
318
+ recipe = RecipeReference.loads(f"{ref}#{rrev}") # TODO: optimize this
319
+ t = rrev_dict.get("timestamp")
320
+ if t is not None:
321
+ recipe.timestamp = t
322
+ packages = {}
323
+ for package_id, pkg_info in rrev_dict.get("packages", {}).items():
324
+ prevs = pkg_info.get("revisions", {})
325
+ for prev, prev_info in prevs.items():
326
+ t = prev_info.get("timestamp")
327
+ pref = PkgReference(recipe, package_id, prev, t)
328
+ packages[pref] = prev_info
329
+ yield recipe, packages
330
+
331
+ def recipe_dict(self, ref: RecipeReference):
332
+ """ Gives read/write access to the dictionary containing a specific RecipeReference
333
+ information.
334
+ """
335
+ return self._data[str(ref)]["revisions"][ref.revision]
336
+
337
+ def package_dict(self, pref: PkgReference):
338
+ """ Gives read/write access to the dictionary containing a specific PkgReference
339
+ information
340
+ """
341
+ ref_dict = self.recipe_dict(pref.ref)
342
+ return ref_dict["packages"][pref.package_id]["revisions"][pref.revision]
343
+
279
344
  @staticmethod
280
345
  def prefs(ref, recipe_bundle):
346
+ ConanOutput().warning("PackageLists.prefs() non-public, non-documented method will be "
347
+ "removed, use .items() instead", warn_tag="deprecated")
281
348
  result = {}
282
349
  for package_id, pkg_bundle in recipe_bundle.get("packages", {}).items():
283
350
  prevs = pkg_bundle.get("revisions", {})
@@ -289,13 +356,13 @@ class PackagesList:
289
356
 
290
357
  def serialize(self):
291
358
  """ Serialize the instance to a dictionary."""
292
- return self.recipes.copy()
359
+ return copy.deepcopy(self._data)
293
360
 
294
361
  @staticmethod
295
362
  def deserialize(data):
296
363
  """ Loads the data from a serialized dictionary."""
297
364
  result = PackagesList()
298
- result.recipes = data
365
+ result._data = copy.deepcopy(data)
299
366
  return result
300
367
 
301
368
 
@@ -358,10 +425,10 @@ class ListPattern:
358
425
  if self.version and self.version.startswith("[") and self.version.endswith("]"):
359
426
  return VersionRange(self.version[1:-1])
360
427
 
361
- def filter_versions(self, refs):
428
+ def filter_versions(self, refs, resolve_prereleases=None):
362
429
  vrange = self._version_range
363
430
  if vrange:
364
- refs = [r for r in refs if vrange.contains(r.version, None)]
431
+ refs = [r for r in refs if vrange.contains(r.version, resolve_prereleases)]
365
432
  return refs
366
433
 
367
434
  @property
@@ -7,12 +7,13 @@ class Remote:
7
7
  should not be created directly, but obtained from the relevant ``RemotesAPI`` subapi methods.
8
8
  """
9
9
  def __init__(self, name, url, verify_ssl=True, disabled=False, allowed_packages=None,
10
- remote_type=None):
10
+ remote_type=None, recipes_only=False):
11
11
  self.name = name # Read only, is the key
12
12
  self.url = url
13
13
  self.verify_ssl = verify_ssl
14
14
  self.disabled = disabled
15
15
  self.allowed_packages = allowed_packages
16
+ self.recipes_only = recipes_only
16
17
  self.remote_type = remote_type
17
18
  self._caching = {}
18
19
 
@@ -26,6 +27,8 @@ class Remote:
26
27
  allowed_msg = ""
27
28
  if self.allowed_packages:
28
29
  allowed_msg = ", Allowed packages: {}".format(", ".join(self.allowed_packages))
30
+ if self.recipes_only:
31
+ allowed_msg += ", Recipes only"
29
32
  if self.remote_type == LOCAL_RECIPES_INDEX:
30
33
  return "{}: {} [{}, Enabled: {}{}]".format(self.name, self.url, LOCAL_RECIPES_INDEX,
31
34
  not self.disabled, allowed_msg)
@@ -3,6 +3,7 @@ import json
3
3
  import os
4
4
  import base64
5
5
 
6
+ from conan.api.output import ConanOutput
6
7
  from conan.internal.api.audit.providers import ConanCenterProvider, PrivateProvider
7
8
  from conan.errors import ConanException
8
9
  from conan.internal.api.remotes.encrypt import encode, decode
@@ -28,12 +29,14 @@ class AuditAPI:
28
29
  }
29
30
 
30
31
  @staticmethod
31
- def scan(deps_graph, provider):
32
+ def scan(deps_graph, provider, context=None):
32
33
  """
33
34
  Scan a given recipe for vulnerabilities in its dependencies.
34
35
  """
35
36
  refs = sorted(set(RecipeReference.loads(f"{node.ref.name}/{node.ref.version}")
36
- for node in deps_graph.nodes[1:]), key=lambda ref: ref.name)
37
+ for node in deps_graph.nodes[1:]
38
+ if context is None or node.context == context),
39
+ key=lambda ref: ref.name)
37
40
  return provider.get_cves(refs)
38
41
 
39
42
  @staticmethod
@@ -109,14 +109,14 @@ class CacheAPI:
109
109
  for f in backup_files:
110
110
  remove(f)
111
111
 
112
- for ref, ref_bundle in package_list.refs().items():
112
+ for ref, packages in package_list.items():
113
113
  ConanOutput(ref.repr_notime()).verbose("Cleaning recipe cache contents")
114
114
  ref_layout = cache.recipe_layout(ref)
115
115
  if source:
116
116
  rmdir(ref_layout.source())
117
117
  if download:
118
118
  rmdir(ref_layout.download_export())
119
- for pref, _ in package_list.prefs(ref, ref_bundle).items():
119
+ for pref in packages:
120
120
  ConanOutput(pref).verbose("Cleaning package cache contents")
121
121
  pref_layout = cache.pkg_layout(pref)
122
122
  if build:
@@ -135,10 +135,11 @@ class CacheAPI:
135
135
  compresslevel = global_conf.get("core.gzip:compresslevel", check_type=int)
136
136
  tar_files: dict[str, str] = {} # {path_in_tar: abs_path}
137
137
 
138
- for ref, ref_bundle in package_list.refs().items():
138
+ for ref, packages in package_list.items():
139
139
  ref_layout = cache.recipe_layout(ref)
140
140
  recipe_folder = os.path.relpath(ref_layout.base_folder, cache_folder)
141
141
  recipe_folder = recipe_folder.replace("\\", "/") # make win paths portable
142
+ ref_bundle = package_list.recipe_dict(ref)
142
143
  ref_bundle["recipe_folder"] = recipe_folder
143
144
  out.info(f"Saving {ref}: {recipe_folder}")
144
145
  # Package only selected folders, not DOWNLOAD one
@@ -152,19 +153,20 @@ class CacheAPI:
152
153
  if os.path.exists(path):
153
154
  tar_files[f"{recipe_folder}/{DOWNLOAD_EXPORT_FOLDER}/{METADATA}"] = path
154
155
 
155
- for pref, pref_bundle in package_list.prefs(ref, ref_bundle).items():
156
+ for pref in packages:
156
157
  pref_layout = cache.pkg_layout(pref)
157
158
  pkg_folder = pref_layout.package()
158
159
  folder = os.path.relpath(pkg_folder, cache_folder)
159
160
  folder = folder.replace("\\", "/") # make win paths portable
160
- pref_bundle["package_folder"] = folder
161
+ pkg_dict = package_list.package_dict(pref)
162
+ pkg_dict["package_folder"] = folder
161
163
  out.info(f"Saving {pref}: {folder}")
162
164
  tar_files[folder] = os.path.join(cache_folder, folder)
163
165
 
164
166
  if os.path.exists(pref_layout.metadata()):
165
167
  metadata_folder = os.path.relpath(pref_layout.metadata(), cache_folder)
166
168
  metadata_folder = metadata_folder.replace("\\", "/") # make paths portable
167
- pref_bundle["metadata_folder"] = metadata_folder
169
+ pkg_dict["metadata_folder"] = metadata_folder
168
170
  out.info(f"Saving {pref} metadata: {metadata_folder}")
169
171
  tar_files[metadata_folder] = os.path.join(cache_folder, metadata_folder)
170
172
 
@@ -194,7 +196,8 @@ class CacheAPI:
194
196
  # After unzipping the files, we need to update the DB that references these files
195
197
  out = ConanOutput()
196
198
  package_list = PackagesList.deserialize(json.loads(pkglist))
197
- for ref, ref_bundle in package_list.refs().items():
199
+ for ref, packages in package_list.items():
200
+ ref_bundle = package_list.recipe_dict(ref)
198
201
  ref.timestamp = revision_timestamp_now()
199
202
  ref_bundle["timestamp"] = ref.timestamp
200
203
  try:
@@ -207,8 +210,9 @@ class CacheAPI:
207
210
  # In the case of recipes, they are always "in place", so just checking it
208
211
  assert rel_path == recipe_folder, f"{rel_path}!={recipe_folder}"
209
212
  out.info(f"Restore: {ref} in {recipe_folder}")
210
- for pref, pref_bundle in package_list.prefs(ref, ref_bundle).items():
213
+ for pref in packages:
211
214
  pref.timestamp = revision_timestamp_now()
215
+ pref_bundle = package_list.package_dict(pref)
212
216
  pref_bundle["timestamp"] = pref.timestamp
213
217
  try:
214
218
  pkg_layout = cache.pkg_layout(pref)
@@ -42,7 +42,7 @@ class ConfigAPI:
42
42
  """
43
43
  from conan.internal.api.config.config_installer import configuration_install
44
44
  cache_folder = self._conan_api.cache_folder
45
- requester = self._conan_api.remotes.requester
45
+ requester = self._helpers.requester
46
46
  configuration_install(cache_folder, requester, path_or_url, verify_ssl,
47
47
  config_type=config_type, args=args,
48
48
  source_folder=source_folder, target_folder=target_folder)
@@ -103,7 +103,7 @@ class ConfigAPI:
103
103
 
104
104
  from conan.internal.api.config.config_installer import configuration_install
105
105
  cache_folder = self._conan_api.cache_folder
106
- requester = self._conan_api.remotes.requester
106
+ requester = self._helpers.requester
107
107
  configuration_install(cache_folder, requester, uri=pkg.conanfile.package_folder,
108
108
  verify_ssl=False, config_type="dir",
109
109
  ignore=["conaninfo.txt", "conanmanifest.txt"])
@@ -83,15 +83,21 @@ class DownloadAPI:
83
83
  """Download the recipes and packages specified in the ``package_list`` from the remote,
84
84
  parallelized based on ``core.download:parallel``"""
85
85
  def _download_pkglist(pkglist):
86
- for ref, recipe_bundle in pkglist.refs().items():
86
+ for ref, packages in pkglist.items():
87
87
  self.recipe(ref, remote, metadata)
88
- for pref, _ in pkglist.prefs(ref, recipe_bundle).items():
88
+ ref_dict = pkglist.recipe_dict(ref)
89
+ ref_dict.pop("files", None)
90
+ ref_dict.pop("upload-urls", None)
91
+ for pref in packages:
89
92
  self.package(pref, remote, metadata)
93
+ pkg_dict = pkglist.package_dict(pref)
94
+ pkg_dict.pop("files", None)
95
+ pkg_dict.pop("upload-urls", None)
90
96
 
91
97
  t = time.time()
92
98
  parallel = self._conan_api.config.get("core.download:parallel", default=1, check_type=int)
93
99
  thread_pool = ThreadPool(parallel) if parallel > 1 else None
94
- if not thread_pool or len(package_list.refs()) <= 1:
100
+ if not thread_pool or len(package_list._data) <= 1: # FIXME: Iteration when multiple rrevs
95
101
  _download_pkglist(package_list)
96
102
  else:
97
103
  ConanOutput().subtitle(f"Downloading with {parallel} parallel threads")
@@ -163,7 +163,8 @@ class ListAPI:
163
163
 
164
164
  return result
165
165
 
166
- def select(self, pattern: ListPattern, package_query=None, remote: Remote = None, lru=None, profile=None) -> PackagesList:
166
+ def select(self, pattern: ListPattern, package_query=None, remote: Remote = None, lru=None,
167
+ profile=None) -> PackagesList:
167
168
  """For a given pattern, return a list of recipes and packages matching the provided filters.
168
169
 
169
170
  :parameter ListPattern pattern: Search criteria
@@ -192,7 +193,9 @@ class ListAPI:
192
193
  remote_name = "local cache" if not remote else remote.name
193
194
  if search_ref:
194
195
  refs = _search_recipes(app, search_ref, remote=remote)
195
- refs = pattern.filter_versions(refs)
196
+ global_conf = self._conan_api._api_helpers.global_conf # noqa
197
+ resolve_prereleases = global_conf.get("core.version_ranges:resolve_prereleases")
198
+ refs = pattern.filter_versions(refs, resolve_prereleases)
196
199
  pattern.check_refs(refs)
197
200
  out.info(f"Found {len(refs)} pkg/version recipes matching {search_ref} in {remote_name}")
198
201
  else:
@@ -200,7 +203,8 @@ class ListAPI:
200
203
 
201
204
  # Show only the recipe references
202
205
  if pattern.package_id is None and pattern.rrev is None:
203
- select_bundle.add_refs(refs)
206
+ for r in refs:
207
+ select_bundle.add_ref(r)
204
208
  return select_bundle
205
209
 
206
210
  def msg_format(msg, item, total):
@@ -222,7 +226,8 @@ class ListAPI:
222
226
  if lru and pattern.package_id is None: # Filter LRUs
223
227
  rrevs = [r for r in rrevs if app.cache.get_recipe_lru(r) < limit_time]
224
228
 
225
- select_bundle.add_refs(rrevs)
229
+ for rr in rrevs:
230
+ select_bundle.add_ref(rr)
226
231
 
227
232
  if pattern.package_id is None: # Stop if not displaying binaries
228
233
  continue
@@ -263,8 +268,12 @@ class ListAPI:
263
268
  if lru: # Filter LRUs
264
269
  prefs = [r for r in prefs if app.cache.get_package_lru(r) < limit_time]
265
270
 
266
- select_bundle.add_prefs(rrev, prefs)
267
- select_bundle.add_configurations(packages)
271
+ # Packages dict has been listed, even if empty
272
+ select_bundle.recipe_dict(rrev)["packages"] = {}
273
+ for p in prefs:
274
+ # the "packages" dict is not using the package-revision
275
+ pkg_info = packages.get(PkgReference(p.ref, p.package_id))
276
+ select_bundle.add_pref(p, pkg_info)
268
277
  return select_bundle
269
278
 
270
279
  def explain_missing_binaries(self, ref, conaninfo, remotes):
@@ -292,7 +301,7 @@ class ListAPI:
292
301
 
293
302
  candidates.sort()
294
303
  pkglist = PackagesList()
295
- pkglist.add_refs([ref])
304
+ pkglist.add_ref(ref)
296
305
  # Return the closest matches, stop adding when distance is increased
297
306
  candidate_distance = None
298
307
  for candidate in candidates:
@@ -300,10 +309,9 @@ class ListAPI:
300
309
  break
301
310
  candidate_distance = candidate.distance
302
311
  pref = candidate.pref
303
- pkglist.add_prefs(ref, [pref])
304
- pkglist.add_configurations({pref: candidate.binary_config})
312
+ pkglist.add_pref(pref, candidate.binary_config)
305
313
  # Add the diff data
306
- rev_dict = pkglist.recipes[str(pref.ref)]["revisions"][pref.ref.revision]
314
+ rev_dict = pkglist.recipe_dict(ref)
307
315
  rev_dict["packages"][pref.package_id]["diff"] = candidate.serialize()
308
316
  remote = candidate.remote.name if candidate.remote else "Local Cache"
309
317
  rev_dict["packages"][pref.package_id]["remote"] = remote
@@ -316,7 +324,7 @@ class ListAPI:
316
324
  result = MultiPackagesList()
317
325
  for r in remotes:
318
326
  result_pkg_list = PackagesList()
319
- for ref, recipe_bundle in package_list.refs().items():
327
+ for ref, packages in package_list.items():
320
328
  ref_no_rev = copy.copy(ref) # TODO: Improve ugly API
321
329
  ref_no_rev.revision = None
322
330
  try:
@@ -325,8 +333,8 @@ class ListAPI:
325
333
  continue
326
334
  if ref not in revs: # not found
327
335
  continue
328
- result_pkg_list.add_refs([ref])
329
- for pref, pref_bundle in package_list.prefs(ref, recipe_bundle).items():
336
+ result_pkg_list.add_ref(ref)
337
+ for pref, pkg_info in packages.items():
330
338
  pref_no_rev = copy.copy(pref) # TODO: Improve ugly API
331
339
  pref_no_rev.revision = None
332
340
  try:
@@ -334,10 +342,8 @@ class ListAPI:
334
342
  except NotFoundException:
335
343
  continue
336
344
  if pref in prevs:
337
- result_pkg_list.add_prefs(ref, [pref])
338
- info = recipe_bundle["packages"][pref.package_id]["info"]
339
- result_pkg_list.add_configurations({pref: info})
340
- if result_pkg_list.recipes:
345
+ result_pkg_list.add_pref(pref, pkg_info)
346
+ if result_pkg_list:
341
347
  result.add(r.name, result_pkg_list)
342
348
  return result
343
349
 
@@ -368,9 +374,9 @@ class ListAPI:
368
374
  remote_ref_list = self.select(ref_pattern, package_query=None, remote=remote)
369
375
  except NotFoundException:
370
376
  continue
371
- if not remote_ref_list.recipes:
377
+ if not remote_ref_list:
372
378
  continue
373
- str_latest_ref = list(remote_ref_list.recipes.keys())[-1]
379
+ str_latest_ref = list(remote_ref_list.serialize().keys())[-1]
374
380
  recipe_ref = RecipeReference.loads(str_latest_ref)
375
381
  if (node_info["latest_remote"] is None
376
382
  or node_info["latest_remote"]["ref"] < recipe_ref):