ansible-core 2.16.6__py3-none-any.whl → 2.17.0rc1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ansible-core might be problematic. Click here for more details.

Files changed (596) hide show
  1. ansible/__init__.py +1 -3
  2. ansible/__main__.py +1 -0
  3. ansible/_vendor/__init__.py +1 -2
  4. ansible/cli/__init__.py +7 -8
  5. ansible/cli/adhoc.py +1 -2
  6. ansible/cli/arguments/__init__.py +1 -2
  7. ansible/cli/arguments/option_helpers.py +1 -2
  8. ansible/cli/config.py +1 -2
  9. ansible/cli/console.py +1 -2
  10. ansible/cli/doc.py +320 -198
  11. ansible/cli/galaxy.py +9 -3
  12. ansible/cli/inventory.py +4 -6
  13. ansible/cli/playbook.py +1 -2
  14. ansible/cli/pull.py +4 -5
  15. ansible/cli/scripts/ansible_connection_cli_stub.py +1 -4
  16. ansible/cli/vault.py +1 -2
  17. ansible/collections/list.py +1 -0
  18. ansible/compat/__init__.py +1 -4
  19. ansible/compat/importlib_resources.py +1 -2
  20. ansible/compat/{selectors/__init__.py → selectors.py} +12 -12
  21. ansible/config/ansible_builtin_runtime.yml +2 -0
  22. ansible/config/base.yml +154 -149
  23. ansible/config/manager.py +33 -25
  24. ansible/constants.py +1 -2
  25. ansible/context.py +1 -4
  26. ansible/errors/__init__.py +1 -3
  27. ansible/errors/yaml_strings.py +1 -3
  28. ansible/executor/__init__.py +1 -3
  29. ansible/executor/discovery/python_target.py +1 -2
  30. ansible/executor/interpreter_discovery.py +9 -8
  31. ansible/executor/module_common.py +1 -3
  32. ansible/executor/play_iterator.py +2 -4
  33. ansible/executor/playbook_executor.py +1 -3
  34. ansible/executor/powershell/module_manifest.py +2 -3
  35. ansible/executor/process/__init__.py +1 -3
  36. ansible/executor/process/worker.py +1 -3
  37. ansible/executor/stats.py +1 -3
  38. ansible/executor/task_executor.py +2 -3
  39. ansible/executor/task_queue_manager.py +1 -3
  40. ansible/executor/task_result.py +2 -3
  41. ansible/galaxy/__init__.py +1 -2
  42. ansible/galaxy/api.py +10 -2
  43. ansible/galaxy/collection/__init__.py +38 -24
  44. ansible/galaxy/collection/concrete_artifact_manager.py +1 -2
  45. ansible/galaxy/collection/galaxy_api_proxy.py +1 -2
  46. ansible/galaxy/collection/gpg.py +4 -2
  47. ansible/galaxy/data/apb/meta/main.yml.j2 +0 -15
  48. ansible/galaxy/data/container/meta/main.yml.j2 +0 -18
  49. ansible/galaxy/data/default/role/meta/main.yml.j2 +0 -18
  50. ansible/galaxy/data/network/cliconf_plugins/example.py.j2 +1 -2
  51. ansible/galaxy/data/network/library/example_command.py.j2 +1 -2
  52. ansible/galaxy/data/network/library/example_config.py.j2 +1 -2
  53. ansible/galaxy/data/network/library/example_facts.py.j2 +1 -2
  54. ansible/galaxy/data/network/meta/main.yml.j2 +0 -15
  55. ansible/galaxy/data/network/module_utils/example.py.j2 +1 -2
  56. ansible/galaxy/data/network/netconf_plugins/example.py.j2 +1 -2
  57. ansible/galaxy/data/network/terminal_plugins/example.py.j2 +1 -2
  58. ansible/galaxy/dependency_resolution/__init__.py +1 -2
  59. ansible/galaxy/dependency_resolution/dataclasses.py +5 -6
  60. ansible/galaxy/dependency_resolution/errors.py +1 -2
  61. ansible/galaxy/dependency_resolution/providers.py +3 -4
  62. ansible/galaxy/dependency_resolution/reporters.py +2 -3
  63. ansible/galaxy/dependency_resolution/resolvers.py +1 -2
  64. ansible/galaxy/dependency_resolution/versioning.py +1 -2
  65. ansible/galaxy/role.py +12 -15
  66. ansible/galaxy/token.py +1 -2
  67. ansible/galaxy/user_agent.py +1 -2
  68. ansible/inventory/data.py +1 -2
  69. ansible/inventory/group.py +1 -2
  70. ansible/inventory/helpers.py +1 -2
  71. ansible/inventory/host.py +1 -3
  72. ansible/inventory/manager.py +1 -2
  73. ansible/module_utils/_text.py +1 -2
  74. ansible/module_utils/ansible_release.py +3 -5
  75. ansible/module_utils/api.py +1 -2
  76. ansible/module_utils/basic.py +113 -158
  77. ansible/module_utils/common/_collections_compat.py +1 -2
  78. ansible/module_utils/common/_utils.py +1 -3
  79. ansible/module_utils/common/arg_spec.py +1 -2
  80. ansible/module_utils/common/collections.py +1 -2
  81. ansible/module_utils/common/dict_transformations.py +1 -2
  82. ansible/module_utils/common/file.py +10 -5
  83. ansible/module_utils/common/json.py +1 -3
  84. ansible/module_utils/common/locale.py +1 -2
  85. ansible/module_utils/common/network.py +2 -3
  86. ansible/module_utils/common/parameters.py +9 -9
  87. ansible/module_utils/common/process.py +12 -5
  88. ansible/module_utils/common/respawn.py +2 -3
  89. ansible/module_utils/common/sys_info.py +1 -2
  90. ansible/module_utils/common/text/converters.py +1 -2
  91. ansible/module_utils/common/text/formatters.py +1 -2
  92. ansible/module_utils/common/validation.py +5 -6
  93. ansible/module_utils/common/warnings.py +1 -2
  94. ansible/module_utils/common/yaml.py +1 -2
  95. ansible/module_utils/compat/datetime.py +1 -3
  96. ansible/module_utils/compat/importlib.py +21 -13
  97. ansible/module_utils/compat/paramiko.py +1 -2
  98. ansible/module_utils/compat/selectors.py +10 -34
  99. ansible/module_utils/compat/selinux.py +1 -2
  100. ansible/module_utils/compat/typing.py +1 -2
  101. ansible/module_utils/compat/version.py +1 -2
  102. ansible/module_utils/connection.py +1 -2
  103. ansible/module_utils/csharp/Ansible.Basic.cs +20 -3
  104. ansible/module_utils/distro/__init__.py +3 -4
  105. ansible/module_utils/distro/_distro.py +230 -234
  106. ansible/module_utils/errors.py +1 -2
  107. ansible/module_utils/facts/__init__.py +1 -2
  108. ansible/module_utils/facts/ansible_collector.py +1 -2
  109. ansible/module_utils/facts/collector.py +1 -2
  110. ansible/module_utils/facts/compat.py +1 -2
  111. ansible/module_utils/facts/default_collectors.py +1 -2
  112. ansible/module_utils/facts/hardware/aix.py +1 -2
  113. ansible/module_utils/facts/hardware/base.py +1 -2
  114. ansible/module_utils/facts/hardware/darwin.py +1 -2
  115. ansible/module_utils/facts/hardware/dragonfly.py +1 -2
  116. ansible/module_utils/facts/hardware/freebsd.py +1 -2
  117. ansible/module_utils/facts/hardware/hpux.py +1 -2
  118. ansible/module_utils/facts/hardware/hurd.py +1 -2
  119. ansible/module_utils/facts/hardware/linux.py +8 -6
  120. ansible/module_utils/facts/hardware/netbsd.py +1 -2
  121. ansible/module_utils/facts/hardware/openbsd.py +1 -2
  122. ansible/module_utils/facts/hardware/sunos.py +2 -3
  123. ansible/module_utils/facts/namespace.py +1 -2
  124. ansible/module_utils/facts/network/aix.py +1 -2
  125. ansible/module_utils/facts/network/base.py +1 -2
  126. ansible/module_utils/facts/network/darwin.py +1 -2
  127. ansible/module_utils/facts/network/dragonfly.py +1 -2
  128. ansible/module_utils/facts/network/fc_wwn.py +1 -2
  129. ansible/module_utils/facts/network/freebsd.py +1 -2
  130. ansible/module_utils/facts/network/generic_bsd.py +1 -2
  131. ansible/module_utils/facts/network/hpux.py +1 -2
  132. ansible/module_utils/facts/network/hurd.py +1 -2
  133. ansible/module_utils/facts/network/iscsi.py +1 -2
  134. ansible/module_utils/facts/network/linux.py +1 -2
  135. ansible/module_utils/facts/network/netbsd.py +1 -2
  136. ansible/module_utils/facts/network/nvme.py +1 -2
  137. ansible/module_utils/facts/network/openbsd.py +1 -2
  138. ansible/module_utils/facts/network/sunos.py +1 -2
  139. ansible/module_utils/facts/other/facter.py +1 -2
  140. ansible/module_utils/facts/other/ohai.py +1 -2
  141. ansible/module_utils/facts/packages.py +1 -2
  142. ansible/module_utils/facts/sysctl.py +1 -2
  143. ansible/module_utils/facts/system/apparmor.py +1 -2
  144. ansible/module_utils/facts/system/caps.py +1 -2
  145. ansible/module_utils/facts/system/chroot.py +1 -2
  146. ansible/module_utils/facts/system/cmdline.py +1 -2
  147. ansible/module_utils/facts/system/date_time.py +1 -2
  148. ansible/module_utils/facts/system/distribution.py +4 -5
  149. ansible/module_utils/facts/system/dns.py +1 -2
  150. ansible/module_utils/facts/system/env.py +1 -2
  151. ansible/module_utils/facts/system/fips.py +1 -2
  152. ansible/module_utils/facts/system/loadavg.py +1 -2
  153. ansible/module_utils/facts/system/local.py +1 -2
  154. ansible/module_utils/facts/system/lsb.py +1 -2
  155. ansible/module_utils/facts/system/pkg_mgr.py +7 -30
  156. ansible/module_utils/facts/system/platform.py +1 -2
  157. ansible/module_utils/facts/system/python.py +1 -2
  158. ansible/module_utils/facts/system/selinux.py +1 -2
  159. ansible/module_utils/facts/system/service_mgr.py +1 -2
  160. ansible/module_utils/facts/system/ssh_pub_keys.py +1 -2
  161. ansible/module_utils/facts/system/user.py +1 -2
  162. ansible/module_utils/facts/timeout.py +1 -2
  163. ansible/module_utils/facts/utils.py +1 -2
  164. ansible/module_utils/facts/virtual/base.py +1 -2
  165. ansible/module_utils/facts/virtual/dragonfly.py +1 -2
  166. ansible/module_utils/facts/virtual/freebsd.py +1 -2
  167. ansible/module_utils/facts/virtual/hpux.py +1 -2
  168. ansible/module_utils/facts/virtual/linux.py +1 -2
  169. ansible/module_utils/facts/virtual/netbsd.py +1 -2
  170. ansible/module_utils/facts/virtual/openbsd.py +1 -2
  171. ansible/module_utils/facts/virtual/sunos.py +1 -2
  172. ansible/module_utils/facts/virtual/sysctl.py +1 -2
  173. ansible/module_utils/json_utils.py +1 -2
  174. ansible/module_utils/parsing/convert_bool.py +1 -2
  175. ansible/module_utils/powershell/Ansible.ModuleUtils.Legacy.psm1 +5 -2
  176. ansible/module_utils/powershell/Ansible.ModuleUtils.WebRequest.psm1 +1 -1
  177. ansible/module_utils/pycompat24.py +24 -4
  178. ansible/module_utils/service.py +31 -5
  179. ansible/module_utils/six/__init__.py +1 -1
  180. ansible/module_utils/splitter.py +1 -2
  181. ansible/module_utils/urls.py +335 -1052
  182. ansible/module_utils/yumdnf.py +13 -35
  183. ansible/modules/add_host.py +1 -2
  184. ansible/modules/apt.py +38 -22
  185. ansible/modules/apt_key.py +1 -2
  186. ansible/modules/apt_repository.py +18 -10
  187. ansible/modules/assemble.py +1 -2
  188. ansible/modules/assert.py +8 -4
  189. ansible/modules/async_status.py +17 -14
  190. ansible/modules/async_wrapper.py +11 -9
  191. ansible/modules/blockinfile.py +2 -3
  192. ansible/modules/command.py +1 -2
  193. ansible/modules/copy.py +4 -76
  194. ansible/modules/cron.py +3 -3
  195. ansible/modules/deb822_repository.py +5 -5
  196. ansible/modules/debconf.py +19 -8
  197. ansible/modules/debug.py +1 -2
  198. ansible/modules/dnf.py +59 -186
  199. ansible/modules/dnf5.py +57 -43
  200. ansible/modules/dpkg_selections.py +1 -2
  201. ansible/modules/expect.py +23 -15
  202. ansible/modules/fail.py +1 -2
  203. ansible/modules/fetch.py +1 -2
  204. ansible/modules/file.py +4 -3
  205. ansible/modules/find.py +18 -5
  206. ansible/modules/gather_facts.py +1 -2
  207. ansible/modules/get_url.py +2 -3
  208. ansible/modules/getent.py +2 -3
  209. ansible/modules/git.py +28 -17
  210. ansible/modules/group.py +1 -2
  211. ansible/modules/group_by.py +1 -2
  212. ansible/modules/hostname.py +2 -19
  213. ansible/modules/import_playbook.py +1 -2
  214. ansible/modules/import_role.py +9 -2
  215. ansible/modules/import_tasks.py +1 -2
  216. ansible/modules/include_role.py +1 -2
  217. ansible/modules/include_tasks.py +1 -2
  218. ansible/modules/include_vars.py +1 -2
  219. ansible/modules/iptables.py +38 -21
  220. ansible/modules/known_hosts.py +15 -8
  221. ansible/modules/lineinfile.py +1 -6
  222. ansible/modules/meta.py +3 -2
  223. ansible/modules/package.py +6 -5
  224. ansible/modules/package_facts.py +1 -2
  225. ansible/modules/pause.py +2 -3
  226. ansible/modules/ping.py +1 -2
  227. ansible/modules/pip.py +40 -20
  228. ansible/modules/raw.py +1 -2
  229. ansible/modules/reboot.py +1 -2
  230. ansible/modules/replace.py +7 -5
  231. ansible/modules/rpm_key.py +1 -2
  232. ansible/modules/script.py +1 -2
  233. ansible/modules/service.py +3 -21
  234. ansible/modules/service_facts.py +3 -12
  235. ansible/modules/set_fact.py +1 -2
  236. ansible/modules/set_stats.py +1 -2
  237. ansible/modules/setup.py +1 -2
  238. ansible/modules/shell.py +1 -2
  239. ansible/modules/slurp.py +1 -2
  240. ansible/modules/stat.py +1 -2
  241. ansible/modules/subversion.py +2 -3
  242. ansible/modules/systemd.py +12 -9
  243. ansible/modules/systemd_service.py +12 -9
  244. ansible/modules/sysvinit.py +7 -2
  245. ansible/modules/tempfile.py +7 -2
  246. ansible/modules/template.py +2 -3
  247. ansible/modules/unarchive.py +13 -3
  248. ansible/modules/uri.py +5 -8
  249. ansible/modules/user.py +11 -10
  250. ansible/modules/validate_argument_spec.py +15 -16
  251. ansible/modules/wait_for.py +1 -2
  252. ansible/modules/wait_for_connection.py +1 -2
  253. ansible/modules/yum_repository.py +2 -3
  254. ansible/parsing/__init__.py +1 -3
  255. ansible/parsing/ajson.py +1 -3
  256. ansible/parsing/dataloader.py +23 -12
  257. ansible/parsing/mod_args.py +14 -8
  258. ansible/parsing/plugin_docs.py +1 -2
  259. ansible/parsing/quoting.py +1 -3
  260. ansible/parsing/splitter.py +1 -3
  261. ansible/parsing/utils/__init__.py +1 -3
  262. ansible/parsing/utils/addresses.py +1 -3
  263. ansible/parsing/utils/jsonify.py +1 -3
  264. ansible/parsing/utils/yaml.py +1 -3
  265. ansible/parsing/vault/__init__.py +6 -8
  266. ansible/parsing/yaml/__init__.py +1 -3
  267. ansible/parsing/yaml/constructor.py +1 -3
  268. ansible/parsing/yaml/dumper.py +1 -3
  269. ansible/parsing/yaml/loader.py +1 -3
  270. ansible/parsing/yaml/objects.py +1 -3
  271. ansible/playbook/__init__.py +1 -3
  272. ansible/playbook/attribute.py +1 -3
  273. ansible/playbook/base.py +2 -3
  274. ansible/playbook/block.py +1 -3
  275. ansible/playbook/collectionsearch.py +1 -2
  276. ansible/playbook/conditional.py +1 -3
  277. ansible/playbook/delegatable.py +1 -0
  278. ansible/playbook/handler.py +2 -4
  279. ansible/playbook/handler_task_include.py +1 -3
  280. ansible/playbook/helpers.py +1 -4
  281. ansible/playbook/included_file.py +4 -4
  282. ansible/playbook/loop_control.py +1 -3
  283. ansible/playbook/notifiable.py +1 -0
  284. ansible/playbook/play.py +1 -3
  285. ansible/playbook/play_context.py +1 -3
  286. ansible/playbook/playbook_include.py +1 -3
  287. ansible/playbook/role/__init__.py +1 -3
  288. ansible/playbook/role/definition.py +1 -3
  289. ansible/playbook/role/include.py +1 -3
  290. ansible/playbook/role/metadata.py +1 -3
  291. ansible/playbook/role/requirement.py +1 -3
  292. ansible/playbook/role_include.py +2 -10
  293. ansible/playbook/taggable.py +1 -3
  294. ansible/playbook/task.py +2 -4
  295. ansible/playbook/task_include.py +1 -3
  296. ansible/plugins/__init__.py +4 -5
  297. ansible/plugins/action/__init__.py +20 -14
  298. ansible/plugins/action/add_host.py +2 -4
  299. ansible/plugins/action/assemble.py +2 -3
  300. ansible/plugins/action/assert.py +1 -2
  301. ansible/plugins/action/async_status.py +1 -2
  302. ansible/plugins/action/command.py +1 -2
  303. ansible/plugins/action/copy.py +12 -9
  304. ansible/plugins/action/debug.py +1 -2
  305. ansible/plugins/action/dnf.py +4 -4
  306. ansible/plugins/action/fail.py +1 -2
  307. ansible/plugins/action/fetch.py +2 -3
  308. ansible/plugins/action/gather_facts.py +3 -4
  309. ansible/plugins/action/group_by.py +1 -2
  310. ansible/plugins/action/include_vars.py +1 -2
  311. ansible/plugins/action/normal.py +1 -2
  312. ansible/plugins/action/package.py +36 -21
  313. ansible/plugins/action/pause.py +1 -2
  314. ansible/plugins/action/raw.py +2 -3
  315. ansible/plugins/action/reboot.py +30 -15
  316. ansible/plugins/action/script.py +3 -4
  317. ansible/plugins/action/service.py +1 -2
  318. ansible/plugins/action/set_fact.py +1 -2
  319. ansible/plugins/action/set_stats.py +1 -2
  320. ansible/plugins/action/shell.py +1 -2
  321. ansible/plugins/action/template.py +1 -2
  322. ansible/plugins/action/unarchive.py +1 -2
  323. ansible/plugins/action/uri.py +2 -3
  324. ansible/plugins/action/validate_argument_spec.py +1 -2
  325. ansible/plugins/action/wait_for_connection.py +2 -3
  326. ansible/plugins/become/__init__.py +1 -2
  327. ansible/plugins/become/runas.py +1 -2
  328. ansible/plugins/become/su.py +1 -2
  329. ansible/plugins/become/sudo.py +1 -2
  330. ansible/plugins/cache/__init__.py +3 -3
  331. ansible/plugins/cache/base.py +1 -2
  332. ansible/plugins/cache/jsonfile.py +1 -3
  333. ansible/plugins/cache/memory.py +1 -2
  334. ansible/plugins/callback/__init__.py +2 -4
  335. ansible/plugins/callback/default.py +2 -3
  336. ansible/plugins/callback/junit.py +1 -2
  337. ansible/plugins/callback/minimal.py +1 -3
  338. ansible/plugins/callback/oneline.py +1 -3
  339. ansible/plugins/callback/tree.py +1 -2
  340. ansible/plugins/cliconf/__init__.py +1 -2
  341. ansible/plugins/connection/__init__.py +4 -5
  342. ansible/plugins/connection/local.py +3 -4
  343. ansible/plugins/connection/paramiko_ssh.py +1 -2
  344. ansible/plugins/connection/psrp.py +1 -2
  345. ansible/plugins/connection/ssh.py +18 -54
  346. ansible/plugins/connection/winrm.py +3 -4
  347. ansible/plugins/doc_fragments/action_common_attributes.py +2 -3
  348. ansible/plugins/doc_fragments/action_core.py +3 -4
  349. ansible/plugins/doc_fragments/backup.py +1 -2
  350. ansible/plugins/doc_fragments/connection_pipelining.py +1 -2
  351. ansible/plugins/doc_fragments/constructed.py +1 -2
  352. ansible/plugins/doc_fragments/decrypt.py +2 -3
  353. ansible/plugins/doc_fragments/default_callback.py +1 -2
  354. ansible/plugins/doc_fragments/files.py +1 -2
  355. ansible/plugins/doc_fragments/inventory_cache.py +1 -2
  356. ansible/plugins/doc_fragments/result_format_callback.py +1 -2
  357. ansible/plugins/doc_fragments/return_common.py +1 -2
  358. ansible/plugins/doc_fragments/shell_common.py +1 -2
  359. ansible/plugins/doc_fragments/shell_windows.py +1 -2
  360. ansible/plugins/doc_fragments/template_common.py +1 -2
  361. ansible/plugins/doc_fragments/url.py +1 -2
  362. ansible/plugins/doc_fragments/url_windows.py +1 -2
  363. ansible/plugins/doc_fragments/validate.py +1 -2
  364. ansible/plugins/doc_fragments/vars_plugin_staging.py +1 -2
  365. ansible/plugins/filter/__init__.py +1 -2
  366. ansible/plugins/filter/b64decode.yml +8 -8
  367. ansible/plugins/filter/b64encode.yml +4 -4
  368. ansible/plugins/filter/comment.yml +1 -1
  369. ansible/plugins/filter/core.py +11 -9
  370. ansible/plugins/filter/encryption.py +1 -3
  371. ansible/plugins/filter/extract.yml +1 -1
  372. ansible/plugins/filter/from_yaml_all.yml +1 -1
  373. ansible/plugins/filter/human_readable.yml +3 -3
  374. ansible/plugins/filter/human_to_bytes.yml +2 -2
  375. ansible/plugins/filter/mandatory.yml +1 -1
  376. ansible/plugins/filter/mathstuff.py +2 -2
  377. ansible/plugins/filter/password_hash.yml +3 -2
  378. ansible/plugins/filter/regex_replace.yml +15 -0
  379. ansible/plugins/filter/regex_search.yml +12 -0
  380. ansible/plugins/filter/strftime.yml +2 -9
  381. ansible/plugins/filter/to_datetime.yml +17 -2
  382. ansible/plugins/filter/to_nice_json.yml +4 -0
  383. ansible/plugins/filter/union.yml +1 -1
  384. ansible/plugins/filter/urls.py +1 -2
  385. ansible/plugins/filter/urlsplit.py +1 -2
  386. ansible/plugins/filter/zip.yml +2 -2
  387. ansible/plugins/filter/zip_longest.yml +1 -1
  388. ansible/plugins/httpapi/__init__.py +1 -2
  389. ansible/plugins/inventory/__init__.py +2 -4
  390. ansible/plugins/inventory/advanced_host_list.py +1 -2
  391. ansible/plugins/inventory/auto.py +2 -3
  392. ansible/plugins/inventory/constructed.py +3 -2
  393. ansible/plugins/inventory/generator.py +1 -2
  394. ansible/plugins/inventory/host_list.py +1 -2
  395. ansible/plugins/inventory/ini.py +1 -2
  396. ansible/plugins/inventory/script.py +122 -3
  397. ansible/plugins/inventory/toml.py +1 -2
  398. ansible/plugins/inventory/yaml.py +3 -4
  399. ansible/plugins/list.py +2 -3
  400. ansible/plugins/loader.py +10 -11
  401. ansible/plugins/lookup/__init__.py +1 -3
  402. ansible/plugins/lookup/config.py +19 -15
  403. ansible/plugins/lookup/csvfile.py +16 -7
  404. ansible/plugins/lookup/dict.py +2 -3
  405. ansible/plugins/lookup/env.py +4 -4
  406. ansible/plugins/lookup/file.py +1 -2
  407. ansible/plugins/lookup/fileglob.py +1 -2
  408. ansible/plugins/lookup/first_found.py +8 -7
  409. ansible/plugins/lookup/indexed_items.py +1 -2
  410. ansible/plugins/lookup/ini.py +6 -3
  411. ansible/plugins/lookup/inventory_hostnames.py +1 -2
  412. ansible/plugins/lookup/items.py +1 -2
  413. ansible/plugins/lookup/lines.py +1 -2
  414. ansible/plugins/lookup/list.py +1 -3
  415. ansible/plugins/lookup/nested.py +1 -2
  416. ansible/plugins/lookup/password.py +16 -14
  417. ansible/plugins/lookup/pipe.py +1 -2
  418. ansible/plugins/lookup/random_choice.py +1 -2
  419. ansible/plugins/lookup/sequence.py +21 -52
  420. ansible/plugins/lookup/subelements.py +1 -2
  421. ansible/plugins/lookup/template.py +1 -2
  422. ansible/plugins/lookup/together.py +1 -2
  423. ansible/plugins/lookup/unvault.py +1 -2
  424. ansible/plugins/lookup/url.py +9 -3
  425. ansible/plugins/lookup/varnames.py +1 -2
  426. ansible/plugins/lookup/vars.py +1 -2
  427. ansible/plugins/netconf/__init__.py +1 -2
  428. ansible/plugins/shell/__init__.py +3 -4
  429. ansible/plugins/shell/cmd.py +1 -2
  430. ansible/plugins/shell/powershell.py +1 -2
  431. ansible/plugins/shell/sh.py +1 -2
  432. ansible/plugins/strategy/__init__.py +33 -21
  433. ansible/plugins/strategy/debug.py +1 -2
  434. ansible/plugins/strategy/free.py +17 -7
  435. ansible/plugins/strategy/host_pinned.py +1 -3
  436. ansible/plugins/strategy/linear.py +22 -22
  437. ansible/plugins/terminal/__init__.py +2 -3
  438. ansible/plugins/test/__init__.py +1 -2
  439. ansible/plugins/test/change.yml +1 -1
  440. ansible/plugins/test/changed.yml +1 -1
  441. ansible/plugins/test/contains.yml +1 -1
  442. ansible/plugins/test/core.py +2 -4
  443. ansible/plugins/test/exists.yml +1 -1
  444. ansible/plugins/test/failed.yml +1 -1
  445. ansible/plugins/test/failure.yml +1 -1
  446. ansible/plugins/test/files.py +1 -3
  447. ansible/plugins/test/finished.yml +3 -3
  448. ansible/plugins/test/issuperset.yml +1 -1
  449. ansible/plugins/test/match.yml +1 -1
  450. ansible/plugins/test/mathstuff.py +1 -2
  451. ansible/plugins/test/reachable.yml +1 -1
  452. ansible/plugins/test/regex.yml +1 -1
  453. ansible/plugins/test/search.yml +1 -1
  454. ansible/plugins/test/skip.yml +1 -1
  455. ansible/plugins/test/skipped.yml +1 -1
  456. ansible/plugins/test/started.yml +1 -1
  457. ansible/plugins/test/succeeded.yml +1 -1
  458. ansible/plugins/test/success.yml +1 -1
  459. ansible/plugins/test/successful.yml +1 -1
  460. ansible/plugins/test/superset.yml +1 -1
  461. ansible/plugins/test/unreachable.yml +1 -1
  462. ansible/plugins/test/uri.py +1 -3
  463. ansible/plugins/vars/__init__.py +1 -2
  464. ansible/plugins/vars/host_group_vars.py +2 -3
  465. ansible/release.py +3 -5
  466. ansible/template/__init__.py +24 -37
  467. ansible/template/native_helpers.py +1 -3
  468. ansible/template/template.py +1 -3
  469. ansible/template/vars.py +1 -0
  470. ansible/utils/__init__.py +1 -3
  471. ansible/utils/cmd_functions.py +1 -2
  472. ansible/utils/collection_loader/__init__.py +1 -2
  473. ansible/utils/collection_loader/_collection_config.py +1 -2
  474. ansible/utils/collection_loader/_collection_finder.py +1 -2
  475. ansible/utils/collection_loader/_collection_meta.py +1 -2
  476. ansible/utils/color.py +1 -2
  477. ansible/utils/context_objects.py +1 -4
  478. ansible/utils/display.py +88 -30
  479. ansible/utils/encrypt.py +4 -105
  480. ansible/utils/fqcn.py +1 -2
  481. ansible/utils/galaxy.py +1 -3
  482. ansible/utils/hashing.py +1 -3
  483. ansible/utils/helpers.py +1 -3
  484. ansible/utils/jsonrpc.py +1 -2
  485. ansible/utils/listify.py +1 -3
  486. ansible/utils/lock.py +1 -3
  487. ansible/utils/multiprocessing.py +1 -3
  488. ansible/utils/native_jinja.py +1 -3
  489. ansible/utils/path.py +1 -2
  490. ansible/utils/plugin_docs.py +7 -6
  491. ansible/utils/py3compat.py +17 -55
  492. ansible/utils/sentinel.py +1 -3
  493. ansible/utils/shlex.py +1 -3
  494. ansible/utils/singleton.py +1 -3
  495. ansible/utils/ssh_functions.py +1 -3
  496. ansible/utils/unicode.py +1 -3
  497. ansible/utils/unsafe_proxy.py +1 -2
  498. ansible/utils/vars.py +6 -8
  499. ansible/utils/version.py +1 -3
  500. ansible/vars/clean.py +1 -3
  501. ansible/vars/fact_cache.py +1 -2
  502. ansible/vars/hostvars.py +3 -7
  503. ansible/vars/manager.py +24 -6
  504. ansible/vars/reserved.py +1 -3
  505. {ansible_core-2.16.6.data → ansible_core-2.17.0rc1.data}/scripts/ansible-test +1 -2
  506. {ansible_core-2.16.6.dist-info → ansible_core-2.17.0rc1.dist-info}/METADATA +3 -3
  507. ansible_core-2.17.0rc1.dist-info/RECORD +987 -0
  508. ansible_test/__init__.py +1 -2
  509. ansible_test/_data/completion/docker.txt +7 -9
  510. ansible_test/_data/completion/remote.txt +6 -7
  511. ansible_test/_data/requirements/ansible-test.txt +0 -2
  512. ansible_test/_data/requirements/constraints.txt +1 -6
  513. ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
  514. ansible_test/_data/requirements/sanity.changelog.txt +3 -3
  515. ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
  516. ansible_test/_data/requirements/sanity.mypy.txt +12 -12
  517. ansible_test/_data/requirements/sanity.pep8.txt +1 -1
  518. ansible_test/_data/requirements/sanity.pylint.txt +7 -7
  519. ansible_test/_data/requirements/sanity.runtime-metadata.txt +1 -1
  520. ansible_test/_data/requirements/sanity.validate-modules.txt +3 -3
  521. ansible_test/_data/requirements/sanity.yamllint.txt +2 -2
  522. ansible_test/_internal/bootstrap.py +2 -2
  523. ansible_test/_internal/classification/__init__.py +0 -5
  524. ansible_test/_internal/commands/integration/cloud/cs.py +1 -1
  525. ansible_test/_internal/commands/integration/cloud/nios.py +1 -1
  526. ansible_test/_internal/commands/sanity/__init__.py +1 -27
  527. ansible_test/_internal/commands/sanity/import.py +0 -18
  528. ansible_test/_internal/commands/sanity/mypy.py +7 -10
  529. ansible_test/_internal/commands/units/__init__.py +1 -1
  530. ansible_test/_internal/config.py +0 -1
  531. ansible_test/_internal/content_config.py +0 -5
  532. ansible_test/_internal/coverage_util.py +0 -1
  533. ansible_test/_internal/docker_util.py +1 -1
  534. ansible_test/_internal/host_profiles.py +5 -4
  535. ansible_test/_internal/python_requirements.py +1 -119
  536. ansible_test/_internal/ssh.py +1 -0
  537. ansible_test/_internal/util.py +1 -1
  538. ansible_test/_internal/util_common.py +1 -1
  539. ansible_test/_internal/venv.py +10 -108
  540. ansible_test/_util/__init__.py +1 -2
  541. ansible_test/_util/controller/sanity/mypy/ansible-core.ini +0 -6
  542. ansible_test/_util/controller/sanity/mypy/modules.ini +0 -6
  543. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +0 -1
  544. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +0 -1
  545. ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +0 -1
  546. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +0 -1
  547. ansible_test/_util/controller/sanity/pylint/config/default.cfg +0 -1
  548. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +1 -2
  549. ansible_test/_util/controller/sanity/shellcheck/exclude.txt +0 -1
  550. ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +31 -59
  551. ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +0 -7
  552. ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +10 -2
  553. ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -1
  554. ansible_test/_util/controller/sanity/yamllint/yamllinter.py +16 -4
  555. ansible_test/_util/target/__init__.py +1 -2
  556. ansible_test/_util/target/cli/ansible_test_cli_stub.py +1 -2
  557. ansible_test/_util/target/common/constants.py +1 -4
  558. ansible_test/_util/target/injector/python.py +4 -19
  559. ansible_test/_util/target/pytest/plugins/ansible_forked.py +2 -9
  560. ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +1 -5
  561. ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -2
  562. ansible_test/_util/target/sanity/compile/compile.py +3 -12
  563. ansible_test/_util/target/sanity/import/importer.py +1 -12
  564. ansible_test/_util/target/setup/bootstrap.sh +49 -105
  565. ansible_test/_util/target/setup/probe_cgroups.py +1 -2
  566. ansible_test/_util/target/setup/quiet_pip.py +1 -16
  567. ansible_test/_util/target/setup/requirements.py +9 -2
  568. ansible_test/_util/target/tools/virtualenvcheck.py +1 -2
  569. ansible_test/_util/target/tools/yamlcheck.py +1 -2
  570. ansible/module_utils/common/_json_compat.py +0 -16
  571. ansible/module_utils/compat/_selectors2.py +0 -655
  572. ansible/modules/yum.py +0 -1821
  573. ansible/plugins/action/yum.py +0 -111
  574. ansible_core-2.16.6.dist-info/RECORD +0 -1009
  575. ansible_test/_util/controller/sanity/code-smell/future-import-boilerplate.json +0 -7
  576. ansible_test/_util/controller/sanity/code-smell/future-import-boilerplate.py +0 -46
  577. ansible_test/_util/controller/sanity/code-smell/metaclass-boilerplate.json +0 -7
  578. ansible_test/_util/controller/sanity/code-smell/metaclass-boilerplate.py +0 -44
  579. ansible_test/_util/controller/sanity/code-smell/no-basestring.json +0 -7
  580. ansible_test/_util/controller/sanity/code-smell/no-basestring.py +0 -21
  581. ansible_test/_util/controller/sanity/code-smell/no-dict-iteritems.json +0 -7
  582. ansible_test/_util/controller/sanity/code-smell/no-dict-iteritems.py +0 -21
  583. ansible_test/_util/controller/sanity/code-smell/no-dict-iterkeys.json +0 -7
  584. ansible_test/_util/controller/sanity/code-smell/no-dict-iterkeys.py +0 -21
  585. ansible_test/_util/controller/sanity/code-smell/no-dict-itervalues.json +0 -7
  586. ansible_test/_util/controller/sanity/code-smell/no-dict-itervalues.py +0 -21
  587. ansible_test/_util/controller/sanity/code-smell/no-main-display.json +0 -10
  588. ansible_test/_util/controller/sanity/code-smell/no-main-display.py +0 -21
  589. ansible_test/_util/controller/sanity/code-smell/no-unicode-literals.json +0 -7
  590. ansible_test/_util/controller/sanity/code-smell/no-unicode-literals.py +0 -21
  591. ansible_test/_util/controller/tools/sslcheck.py +0 -22
  592. ansible_test/_util/target/common/__init__.py +0 -2
  593. {ansible_core-2.16.6.dist-info → ansible_core-2.17.0rc1.dist-info}/COPYING +0 -0
  594. {ansible_core-2.16.6.dist-info → ansible_core-2.17.0rc1.dist-info}/WHEEL +0 -0
  595. {ansible_core-2.16.6.dist-info → ansible_core-2.17.0rc1.dist-info}/entry_points.txt +0 -0
  596. {ansible_core-2.16.6.dist-info → ansible_core-2.17.0rc1.dist-info}/top_level.txt +0 -0
@@ -5,7 +5,6 @@ import base64
5
5
  import dataclasses
6
6
  import json
7
7
  import os
8
- import re
9
8
  import typing as t
10
9
 
11
10
  from .encoding import (
@@ -20,14 +19,9 @@ from .io import (
20
19
  from .util import (
21
20
  ANSIBLE_TEST_DATA_ROOT,
22
21
  ANSIBLE_TEST_TARGET_ROOT,
23
- ANSIBLE_TEST_TOOLS_ROOT,
24
22
  ApplicationError,
25
23
  SubprocessError,
26
24
  display,
27
- find_executable,
28
- raw_command,
29
- str_to_version,
30
- version_to_str,
31
25
  )
32
26
 
33
27
  from .util_common import (
@@ -63,9 +57,6 @@ from .coverage_util import (
63
57
  QUIET_PIP_SCRIPT_PATH = os.path.join(ANSIBLE_TEST_TARGET_ROOT, 'setup', 'quiet_pip.py')
64
58
  REQUIREMENTS_SCRIPT_PATH = os.path.join(ANSIBLE_TEST_TARGET_ROOT, 'setup', 'requirements.py')
65
59
 
66
- # IMPORTANT: Keep this in sync with the ansible-test.txt requirements file.
67
- VIRTUALENV_VERSION = '16.7.12'
68
-
69
60
  # Pip Abstraction
70
61
 
71
62
 
@@ -132,7 +123,6 @@ def install_requirements(
132
123
  ansible: bool = False,
133
124
  command: bool = False,
134
125
  coverage: bool = False,
135
- virtualenv: bool = False,
136
126
  controller: bool = True,
137
127
  connection: t.Optional[Connection] = None,
138
128
  ) -> None:
@@ -145,8 +135,6 @@ def install_requirements(
145
135
  if command and isinstance(args, (UnitsConfig, IntegrationConfig)) and args.coverage:
146
136
  coverage = True
147
137
 
148
- cryptography = False
149
-
150
138
  if ansible:
151
139
  try:
152
140
  ansible_cache = install_requirements.ansible_cache # type: ignore[attr-defined]
@@ -160,19 +148,12 @@ def install_requirements(
160
148
  else:
161
149
  ansible_cache[python.path] = True
162
150
 
163
- # Install the latest cryptography version that the current requirements can support if it is not already available.
164
- # This avoids downgrading cryptography when OS packages provide a newer version than we are able to install using pip.
165
- # If not installed here, later install commands may try to install a version of cryptography which cannot be installed.
166
- cryptography = not is_cryptography_available(python.path)
167
-
168
151
  commands = collect_requirements(
169
152
  python=python,
170
153
  controller=controller,
171
154
  ansible=ansible,
172
- cryptography=cryptography,
173
155
  command=args.command if command else None,
174
156
  coverage=coverage,
175
- virtualenv=virtualenv,
176
157
  minimize=False,
177
158
  sanity=None,
178
159
  )
@@ -205,9 +186,7 @@ def collect_requirements(
205
186
  python: PythonConfig,
206
187
  controller: bool,
207
188
  ansible: bool,
208
- cryptography: bool,
209
189
  coverage: bool,
210
- virtualenv: bool,
211
190
  minimize: bool,
212
191
  command: t.Optional[str],
213
192
  sanity: t.Optional[str],
@@ -215,17 +194,9 @@ def collect_requirements(
215
194
  """Collect requirements for the given Python using the specified arguments."""
216
195
  commands: list[PipCommand] = []
217
196
 
218
- if virtualenv:
219
- # sanity tests on Python 2.x install virtualenv when it is too old or is not already installed and the `--requirements` option is given
220
- # the last version of virtualenv with no dependencies is used to minimize the changes made outside a virtual environment
221
- commands.extend(collect_package_install(packages=[f'virtualenv=={VIRTUALENV_VERSION}'], constraints=False))
222
-
223
197
  if coverage:
224
198
  commands.extend(collect_package_install(packages=[f'coverage=={get_coverage_version(python.version).coverage_version}'], constraints=False))
225
199
 
226
- if cryptography:
227
- commands.extend(collect_package_install(packages=get_cryptography_requirements(python)))
228
-
229
200
  if ansible or command:
230
201
  commands.extend(collect_general_install(command, ansible))
231
202
 
@@ -446,17 +417,7 @@ def get_venv_packages(python: PythonConfig) -> dict[str, str]:
446
417
  wheel='0.37.1',
447
418
  )
448
419
 
449
- override_packages = {
450
- '2.7': dict(
451
- pip='20.3.4', # 21.0 requires Python 3.6+
452
- setuptools='44.1.1', # 45.0.0 requires Python 3.5+
453
- wheel=None,
454
- ),
455
- '3.6': dict(
456
- pip='21.3.1', # 22.0 requires Python 3.7+
457
- setuptools='59.6.0', # 59.7.0 requires Python 3.7+
458
- wheel=None,
459
- ),
420
+ override_packages: dict[str, dict[str, str]] = {
460
421
  }
461
422
 
462
423
  packages = {name: version or default_packages[name] for name, version in override_packages.get(python.version, default_packages).items()}
@@ -510,82 +471,3 @@ def prepare_pip_script(commands: list[PipCommand]) -> str:
510
471
  def usable_pip_file(path: t.Optional[str]) -> bool:
511
472
  """Return True if the specified pip file is usable, otherwise False."""
512
473
  return bool(path) and os.path.exists(path) and bool(os.path.getsize(path))
513
-
514
-
515
- # Cryptography
516
-
517
-
518
- def is_cryptography_available(python: str) -> bool:
519
- """Return True if cryptography is available for the given python."""
520
- try:
521
- raw_command([python, '-c', 'import cryptography'], capture=True)
522
- except SubprocessError:
523
- return False
524
-
525
- return True
526
-
527
-
528
- def get_cryptography_requirements(python: PythonConfig) -> list[str]:
529
- """
530
- Return the correct cryptography and pyopenssl requirements for the given python version.
531
- The version of cryptography installed depends on the python version and openssl version.
532
- """
533
- openssl_version = get_openssl_version(python)
534
-
535
- if openssl_version and openssl_version < (1, 1, 0):
536
- # cryptography 3.2 requires openssl 1.1.x or later
537
- # see https://cryptography.io/en/latest/changelog.html#v3-2
538
- cryptography = 'cryptography < 3.2'
539
- # pyopenssl 20.0.0 requires cryptography 3.2 or later
540
- pyopenssl = 'pyopenssl < 20.0.0'
541
- else:
542
- # cryptography 3.4+ builds require a working rust toolchain
543
- # systems bootstrapped using ansible-core-ci can access additional wheels through the spare-tire package index
544
- cryptography = 'cryptography'
545
- # any future installation of pyopenssl is free to use any compatible version of cryptography
546
- pyopenssl = ''
547
-
548
- requirements = [
549
- cryptography,
550
- pyopenssl,
551
- ]
552
-
553
- requirements = [requirement for requirement in requirements if requirement]
554
-
555
- return requirements
556
-
557
-
558
- def get_openssl_version(python: PythonConfig) -> t.Optional[tuple[int, ...]]:
559
- """Return the openssl version."""
560
- if not python.version.startswith('2.'):
561
- # OpenSSL version checking only works on Python 3.x.
562
- # This should be the most accurate, since it is the Python we will be using.
563
- version = json.loads(raw_command([python.path, os.path.join(ANSIBLE_TEST_TOOLS_ROOT, 'sslcheck.py')], capture=True)[0])['version']
564
-
565
- if version:
566
- display.info(f'Detected OpenSSL version {version_to_str(version)} under Python {python.version}.', verbosity=1)
567
-
568
- return tuple(version)
569
-
570
- # Fall back to detecting the OpenSSL version from the CLI.
571
- # This should provide an adequate solution on Python 2.x.
572
- openssl_path = find_executable('openssl', required=False)
573
-
574
- if openssl_path:
575
- try:
576
- result = raw_command([openssl_path, 'version'], capture=True)[0]
577
- except SubprocessError:
578
- result = ''
579
-
580
- match = re.search(r'^OpenSSL (?P<version>[0-9]+\.[0-9]+\.[0-9]+)', result)
581
-
582
- if match:
583
- version = str_to_version(match.group('version'))
584
-
585
- display.info(f'Detected OpenSSL version {version_to_str(version)} using the openssl CLI.', verbosity=1)
586
-
587
- return version
588
-
589
- display.info('Unable to detect OpenSSL version.', verbosity=1)
590
-
591
- return None
@@ -245,6 +245,7 @@ def create_ssh_port_forwards(
245
245
  """
246
246
  options: dict[str, t.Union[str, int]] = dict(
247
247
  LogLevel='INFO', # info level required to get messages on stderr indicating the ports assigned to each forward
248
+ ControlPath='none', # if the user has ControlPath set up for every host, it will prevent creation of forwards
248
249
  )
249
250
 
250
251
  cli_args = []
@@ -998,7 +998,7 @@ def retry(func: t.Callable[..., TValue], ex_type: t.Type[BaseException] = Subpro
998
998
  def parse_to_list_of_dict(pattern: str, value: str) -> list[dict[str, str]]:
999
999
  """Parse lines from the given value using the specified pattern and return the extracted list of key/value pair dictionaries."""
1000
1000
  matched = []
1001
- unmatched = []
1001
+ unmatched: list[str] = []
1002
1002
 
1003
1003
  for line in value.splitlines():
1004
1004
  match = re.search(pattern, line)
@@ -409,7 +409,7 @@ def create_interpreter_wrapper(interpreter: str, injected_interpreter: str) -> N
409
409
  code = textwrap.dedent('''
410
410
  #!%s
411
411
 
412
- from __future__ import absolute_import
412
+ from __future__ import annotations
413
413
 
414
414
  from os import execv
415
415
  from sys import argv
@@ -15,7 +15,6 @@ from .config import (
15
15
  from .util import (
16
16
  find_python,
17
17
  SubprocessError,
18
- get_available_python_versions,
19
18
  ANSIBLE_TEST_TARGET_TOOLS_ROOT,
20
19
  display,
21
20
  remove_tree,
@@ -85,49 +84,21 @@ def create_virtual_environment(
85
84
  system_site_packages: bool = False,
86
85
  pip: bool = False,
87
86
  ) -> bool:
88
- """Create a virtual environment using venv or virtualenv for the requested Python version."""
87
+ """Create a virtual environment using venv for the requested Python version."""
89
88
  if not os.path.exists(python.path):
90
89
  # the requested python version could not be found
91
90
  return False
92
91
 
93
- if str_to_version(python.version) >= (3, 0):
94
- # use the built-in 'venv' module on Python 3.x
95
- # creating a virtual environment using 'venv' when running in a virtual environment created by 'virtualenv' results
96
- # in a copy of the original virtual environment instead of creation of a new one
97
- # avoid this issue by only using "real" python interpreters to invoke 'venv'
98
- for real_python in iterate_real_pythons(python.version):
99
- if run_venv(args, real_python, system_site_packages, pip, path):
100
- display.info('Created Python %s virtual environment using "venv": %s' % (python.version, path), verbosity=1)
101
- return True
102
-
103
- # something went wrong, most likely the package maintainer for the Python installation removed ensurepip
104
- # which will prevent creation of a virtual environment without installation of other OS packages
105
-
106
- # use the installed 'virtualenv' module on the Python requested version
107
- if run_virtualenv(args, python.path, python.path, system_site_packages, pip, path):
108
- display.info('Created Python %s virtual environment using "virtualenv": %s' % (python.version, path), verbosity=1)
109
- return True
110
-
111
- available_pythons = get_available_python_versions()
112
-
113
- for available_python_version, available_python_interpreter in sorted(available_pythons.items()):
114
- if available_python_interpreter == python.path:
115
- # already attempted to use this interpreter
116
- continue
117
-
118
- virtualenv_version = get_virtualenv_version(args, available_python_interpreter)
119
-
120
- if not virtualenv_version:
121
- # virtualenv not available for this Python or we were unable to detect the version
122
- continue
123
-
124
- # try using 'virtualenv' from another Python to setup the desired version
125
- if run_virtualenv(args, available_python_interpreter, python.path, system_site_packages, pip, path):
126
- display.info('Created Python %s virtual environment using "virtualenv" on Python %s: %s' % (python.version, available_python_version, path),
127
- verbosity=1)
92
+ # creating a virtual environment using 'venv' when running in a virtual environment created by 'virtualenv' results
93
+ # in a copy of the original virtual environment instead of creation of a new one
94
+ # avoid this issue by only using "real" python interpreters to invoke 'venv'
95
+ for real_python in iterate_real_pythons(python.version):
96
+ if run_venv(args, real_python, system_site_packages, pip, path):
97
+ display.info('Created Python %s virtual environment using "venv": %s' % (python.version, path), verbosity=1)
128
98
  return True
129
99
 
130
- # no suitable 'virtualenv' available
100
+ # something went wrong, most likely the package maintainer for the Python installation removed ensurepip
101
+ # which will prevent creation of a virtual environment without installation of other OS packages
131
102
  return False
132
103
 
133
104
 
@@ -188,7 +159,7 @@ def run_venv(
188
159
  pip: bool,
189
160
  path: str,
190
161
  ) -> bool:
191
- """Create a virtual environment using the 'venv' module. Not available on Python 2.x."""
162
+ """Create a virtual environment using the 'venv' module."""
192
163
  cmd = [run_python, '-m', 'venv']
193
164
 
194
165
  if system_site_packages:
@@ -210,72 +181,3 @@ def run_venv(
210
181
  return False
211
182
 
212
183
  return True
213
-
214
-
215
- def run_virtualenv(
216
- args: EnvironmentConfig,
217
- run_python: str,
218
- env_python: str,
219
- system_site_packages: bool,
220
- pip: bool,
221
- path: str,
222
- ) -> bool:
223
- """Create a virtual environment using the 'virtualenv' module."""
224
- # always specify which interpreter to use to guarantee the desired interpreter is provided
225
- # otherwise virtualenv may select a different interpreter than the one running virtualenv
226
- cmd = [run_python, '-m', 'virtualenv', '--python', env_python]
227
-
228
- if system_site_packages:
229
- cmd.append('--system-site-packages')
230
-
231
- if not pip:
232
- cmd.append('--no-pip')
233
- # these options provide consistency with venv, which does not install them without pip
234
- cmd.append('--no-setuptools')
235
- cmd.append('--no-wheel')
236
-
237
- cmd.append(path)
238
-
239
- try:
240
- run_command(args, cmd, capture=True)
241
- except SubprocessError as ex:
242
- remove_tree(path)
243
-
244
- if args.verbosity > 1:
245
- display.error(ex.message)
246
-
247
- return False
248
-
249
- return True
250
-
251
-
252
- def get_virtualenv_version(args: EnvironmentConfig, python: str) -> t.Optional[tuple[int, ...]]:
253
- """Get the virtualenv version for the given python interpreter, if available, otherwise return None."""
254
- try:
255
- cache = get_virtualenv_version.cache # type: ignore[attr-defined]
256
- except AttributeError:
257
- cache = get_virtualenv_version.cache = {} # type: ignore[attr-defined]
258
-
259
- if python not in cache:
260
- try:
261
- stdout = run_command(args, [python, '-m', 'virtualenv', '--version'], capture=True)[0]
262
- except SubprocessError as ex:
263
- stdout = ''
264
-
265
- if args.verbosity > 1:
266
- display.error(ex.message)
267
-
268
- version = None
269
-
270
- if stdout:
271
- # noinspection PyBroadException
272
- try:
273
- version = str_to_version(stdout.strip())
274
- except Exception: # pylint: disable=broad-except
275
- pass
276
-
277
- cache[python] = version
278
-
279
- version = cache[python]
280
-
281
- return version
@@ -1,2 +1 @@
1
- # Empty __init__.py to allow importing of `ansible_test._util.target.common` under Python 2.x.
2
- # This allows the ansible-test entry point to report supported Python versions before exiting.
1
+ # Empty __init__.py to keep pylint happy.
@@ -46,9 +46,6 @@ ignore_missing_imports = True
46
46
  [mypy-lxml.*]
47
47
  ignore_missing_imports = True
48
48
 
49
- [mypy-yum.*]
50
- ignore_missing_imports = True
51
-
52
49
  [mypy-rpmUtils.*]
53
50
  ignore_missing_imports = True
54
51
 
@@ -85,9 +82,6 @@ ignore_missing_imports = True
85
82
  [mypy-distro.*]
86
83
  ignore_missing_imports = True
87
84
 
88
- [mypy-selectors2.*]
89
- ignore_missing_imports = True
90
-
91
85
  [mypy-resolvelib.*]
92
86
  ignore_missing_imports = True
93
87
 
@@ -13,9 +13,6 @@ ignore_missing_imports = True
13
13
  [mypy-md5.*]
14
14
  ignore_missing_imports = True
15
15
 
16
- [mypy-yum.*]
17
- ignore_missing_imports = True
18
-
19
16
  [mypy-rpmUtils.*]
20
17
  ignore_missing_imports = True
21
18
 
@@ -52,9 +49,6 @@ ignore_missing_imports = True
52
49
  [mypy-distro.*]
53
50
  ignore_missing_imports = True
54
51
 
55
- [mypy-selectors2.*]
56
- ignore_missing_imports = True
57
-
58
52
  [mypy-selinux.*]
59
53
  ignore_missing_imports = True
60
54
 
@@ -35,7 +35,6 @@ bad-names=
35
35
  tutu,
36
36
 
37
37
  good-names=
38
- __metaclass__,
39
38
  C,
40
39
  ex,
41
40
  i,
@@ -34,7 +34,6 @@ bad-names=
34
34
  tutu,
35
35
 
36
36
  good-names=
37
- __metaclass__,
38
37
  C,
39
38
  ex,
40
39
  i,
@@ -33,7 +33,6 @@ bad-names=
33
33
  tutu,
34
34
 
35
35
  good-names=
36
- __metaclass__,
37
36
  C,
38
37
  ex,
39
38
  i,
@@ -102,7 +102,6 @@ disable=
102
102
  undefined-loop-variable,
103
103
  unexpected-keyword-arg,
104
104
  ungrouped-imports,
105
- unidiomatic-typecheck,
106
105
  unnecessary-pass,
107
106
  unnecessary-dunder-call,
108
107
  unsubscriptable-object,
@@ -95,7 +95,6 @@ disable=
95
95
  undefined-loop-variable,
96
96
  unexpected-keyword-arg,
97
97
  ungrouped-imports,
98
- unidiomatic-typecheck,
99
98
  unnecessary-pass,
100
99
  unsubscriptable-object,
101
100
  unsupported-assignment-operation,
@@ -32,7 +32,6 @@ except ImportError:
32
32
  from pylint.checkers import BaseChecker, BaseTokenChecker
33
33
 
34
34
  from ansible.module_utils.compat.version import LooseVersion
35
- from ansible.module_utils.six import string_types
36
35
  from ansible.release import __version__ as ansible_version_raw
37
36
  from ansible.utils.version import SemanticVersion
38
37
 
@@ -137,7 +136,7 @@ def _get_func_name(node):
137
136
  def parse_isodate(value):
138
137
  """Parse an ISO 8601 date string."""
139
138
  msg = 'Expected ISO 8601 date string (YYYY-MM-DD)'
140
- if not isinstance(value, string_types):
139
+ if not isinstance(value, str):
141
140
  raise ValueError(msg)
142
141
  # From Python 3.7 in, there is datetime.date.fromisoformat(). For older versions,
143
142
  # we have to do things manually.
@@ -1,3 +1,2 @@
1
1
  SC1090
2
2
  SC1091
3
- SC2164