ansible-core 2.18.7rc1__py3-none-any.whl → 2.19.0__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 (757) hide show
  1. ansible/_internal/__init__.py +53 -0
  2. ansible/_internal/_ansiballz/__init__.py +0 -0
  3. ansible/_internal/_ansiballz/_builder.py +101 -0
  4. ansible/_internal/_ansiballz/_wrapper.py +262 -0
  5. ansible/_internal/_collection_proxy.py +47 -0
  6. ansible/_internal/_datatag/__init__.py +0 -0
  7. ansible/_internal/_datatag/_tags.py +130 -0
  8. ansible/_internal/_datatag/_utils.py +19 -0
  9. ansible/_internal/_datatag/_wrappers.py +33 -0
  10. ansible/_internal/_errors/__init__.py +0 -0
  11. ansible/_internal/_errors/_alarm_timeout.py +66 -0
  12. ansible/_internal/_errors/_captured.py +123 -0
  13. ansible/_internal/_errors/_error_factory.py +89 -0
  14. ansible/_internal/_errors/_error_utils.py +240 -0
  15. ansible/_internal/_errors/_handler.py +91 -0
  16. ansible/_internal/_errors/_task_timeout.py +28 -0
  17. ansible/_internal/_event_formatting.py +127 -0
  18. ansible/_internal/_json/__init__.py +214 -0
  19. ansible/_internal/_json/_legacy_encoder.py +34 -0
  20. ansible/_internal/_json/_profiles/__init__.py +0 -0
  21. ansible/_internal/_json/_profiles/_cache_persistence.py +57 -0
  22. ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
  23. ansible/_internal/_json/_profiles/_legacy.py +189 -0
  24. ansible/_internal/_locking.py +21 -0
  25. ansible/_internal/_plugins/__init__.py +0 -0
  26. ansible/_internal/_plugins/_cache.py +57 -0
  27. ansible/_internal/_ssh/__init__.py +0 -0
  28. ansible/_internal/_ssh/_agent_launch.py +91 -0
  29. ansible/_internal/_ssh/_ssh_agent.py +619 -0
  30. ansible/_internal/_task.py +78 -0
  31. ansible/_internal/_templating/__init__.py +12 -0
  32. ansible/_internal/_templating/_access.py +86 -0
  33. ansible/_internal/_templating/_chain_templar.py +63 -0
  34. ansible/_internal/_templating/_datatag.py +95 -0
  35. ansible/_internal/_templating/_engine.py +592 -0
  36. ansible/_internal/_templating/_errors.py +28 -0
  37. ansible/_internal/_templating/_jinja_bits.py +1106 -0
  38. ansible/_internal/_templating/_jinja_common.py +323 -0
  39. ansible/_internal/_templating/_jinja_patches.py +44 -0
  40. ansible/_internal/_templating/_jinja_plugins.py +375 -0
  41. ansible/_internal/_templating/_lazy_containers.py +633 -0
  42. ansible/_internal/_templating/_marker_behaviors.py +103 -0
  43. ansible/_internal/_templating/_template_vars.py +72 -0
  44. ansible/_internal/_templating/_transform.py +70 -0
  45. ansible/_internal/_templating/_utils.py +108 -0
  46. ansible/_internal/_testing.py +26 -0
  47. ansible/_internal/_wrapt.py +1052 -0
  48. ansible/_internal/_yaml/__init__.py +0 -0
  49. ansible/_internal/_yaml/_constructor.py +240 -0
  50. ansible/_internal/_yaml/_dumper.py +70 -0
  51. ansible/_internal/_yaml/_errors.py +166 -0
  52. ansible/_internal/_yaml/_loader.py +66 -0
  53. ansible/_internal/ansible_collections/ansible/_protomatter/README.md +11 -0
  54. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/action/debug.py +36 -0
  55. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/apply_trust.py +19 -0
  56. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/dump_object.py +27 -0
  57. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/finalize.py +16 -0
  58. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/origin.py +18 -0
  59. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.py +24 -0
  60. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.yml +33 -0
  61. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/tag_names.py +16 -0
  62. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +17 -0
  63. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +49 -0
  64. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.py +21 -0
  65. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.yml +2 -0
  66. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.py +15 -0
  67. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.yml +19 -0
  68. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.py +18 -0
  69. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.yml +19 -0
  70. ansible/cli/__init__.py +93 -104
  71. ansible/cli/_ssh_askpass.py +54 -0
  72. ansible/cli/adhoc.py +20 -10
  73. ansible/cli/arguments/option_helpers.py +163 -10
  74. ansible/cli/config.py +43 -68
  75. ansible/cli/console.py +13 -11
  76. ansible/cli/doc.py +134 -77
  77. ansible/cli/galaxy.py +27 -20
  78. ansible/cli/inventory.py +28 -28
  79. ansible/cli/playbook.py +4 -12
  80. ansible/cli/pull.py +6 -3
  81. ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
  82. ansible/cli/vault.py +12 -11
  83. ansible/compat/__init__.py +2 -2
  84. ansible/compat/importlib_resources.py +9 -12
  85. ansible/config/base.yml +218 -133
  86. ansible/config/manager.py +220 -159
  87. ansible/constants.py +2 -65
  88. ansible/errors/__init__.py +350 -256
  89. ansible/executor/interpreter_discovery.py +28 -149
  90. ansible/executor/module_common.py +480 -514
  91. ansible/executor/play_iterator.py +22 -27
  92. ansible/executor/playbook_executor.py +11 -11
  93. ansible/executor/powershell/async_watchdog.ps1 +97 -102
  94. ansible/executor/powershell/async_wrapper.ps1 +204 -153
  95. ansible/executor/powershell/become_wrapper.ps1 +107 -144
  96. ansible/executor/powershell/bootstrap_wrapper.ps1 +46 -9
  97. ansible/executor/powershell/coverage_wrapper.ps1 +91 -135
  98. ansible/executor/powershell/exec_wrapper.ps1 +675 -196
  99. ansible/executor/powershell/module_manifest.py +469 -265
  100. ansible/executor/powershell/module_wrapper.ps1 +195 -186
  101. ansible/executor/powershell/powershell_expand_user.ps1 +20 -0
  102. ansible/executor/powershell/powershell_mkdtemp.ps1 +17 -0
  103. ansible/executor/powershell/psrp_fetch_file.ps1 +41 -0
  104. ansible/executor/powershell/psrp_put_file.ps1 +122 -0
  105. ansible/executor/powershell/winrm_fetch_file.ps1 +46 -0
  106. ansible/executor/powershell/winrm_put_file.ps1 +36 -0
  107. ansible/executor/process/worker.py +139 -149
  108. ansible/executor/stats.py +5 -5
  109. ansible/executor/task_executor.py +270 -297
  110. ansible/executor/task_queue_manager.py +135 -137
  111. ansible/executor/task_result.py +182 -79
  112. ansible/galaxy/__init__.py +2 -2
  113. ansible/galaxy/api.py +26 -25
  114. ansible/galaxy/collection/__init__.py +6 -14
  115. ansible/galaxy/collection/concrete_artifact_manager.py +12 -21
  116. ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
  117. ansible/galaxy/dependency_resolution/providers.py +4 -4
  118. ansible/galaxy/dependency_resolution/reporters.py +81 -0
  119. ansible/galaxy/role.py +6 -10
  120. ansible/galaxy/token.py +28 -21
  121. ansible/inventory/data.py +47 -57
  122. ansible/inventory/group.py +50 -73
  123. ansible/inventory/helpers.py +9 -0
  124. ansible/inventory/host.py +37 -54
  125. ansible/inventory/manager.py +79 -34
  126. ansible/keyword_desc.yml +1 -1
  127. ansible/module_utils/_internal/__init__.py +55 -0
  128. ansible/module_utils/_internal/_ambient_context.py +58 -0
  129. ansible/module_utils/_internal/_ansiballz/__init__.py +0 -0
  130. ansible/module_utils/_internal/_ansiballz/_extensions/__init__.py +0 -0
  131. ansible/module_utils/_internal/_ansiballz/_extensions/_coverage.py +45 -0
  132. ansible/module_utils/_internal/_ansiballz/_extensions/_pydevd.py +62 -0
  133. ansible/module_utils/_internal/_ansiballz/_loader.py +81 -0
  134. ansible/module_utils/_internal/_ansiballz/_respawn.py +32 -0
  135. ansible/module_utils/_internal/_ansiballz/_respawn_wrapper.py +23 -0
  136. ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
  137. ansible/module_utils/_internal/_dataclass_validation.py +217 -0
  138. ansible/module_utils/_internal/_datatag/__init__.py +961 -0
  139. ansible/module_utils/_internal/_datatag/_tags.py +16 -0
  140. ansible/module_utils/_internal/_debugging.py +31 -0
  141. ansible/module_utils/_internal/_deprecator.py +157 -0
  142. ansible/module_utils/_internal/_errors.py +101 -0
  143. ansible/module_utils/_internal/_event_utils.py +61 -0
  144. ansible/module_utils/_internal/_json/__init__.py +63 -0
  145. ansible/module_utils/_internal/_json/_legacy_encoder.py +26 -0
  146. ansible/module_utils/_internal/_json/_profiles/__init__.py +428 -0
  147. ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
  148. ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +33 -0
  149. ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +37 -0
  150. ansible/module_utils/_internal/_json/_profiles/_module_modern_c2m.py +35 -0
  151. ansible/module_utils/_internal/_json/_profiles/_module_modern_m2c.py +33 -0
  152. ansible/module_utils/_internal/_json/_profiles/_tagless.py +52 -0
  153. ansible/module_utils/_internal/_messages.py +130 -0
  154. ansible/module_utils/_internal/_patches/__init__.py +66 -0
  155. ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +53 -0
  156. ansible/module_utils/_internal/_patches/_socket_patch.py +34 -0
  157. ansible/module_utils/_internal/_patches/_sys_intern_patch.py +34 -0
  158. ansible/module_utils/_internal/_plugin_info.py +38 -0
  159. ansible/module_utils/_internal/_stack.py +22 -0
  160. ansible/module_utils/_internal/_testing.py +0 -0
  161. ansible/module_utils/_internal/_text_utils.py +6 -0
  162. ansible/module_utils/_internal/_traceback.py +92 -0
  163. ansible/module_utils/_internal/_validation.py +14 -0
  164. ansible/module_utils/ansible_release.py +2 -2
  165. ansible/module_utils/api.py +1 -2
  166. ansible/module_utils/basic.py +303 -202
  167. ansible/module_utils/common/_utils.py +24 -28
  168. ansible/module_utils/common/arg_spec.py +8 -3
  169. ansible/module_utils/common/collections.py +7 -2
  170. ansible/module_utils/common/dict_transformations.py +2 -2
  171. ansible/module_utils/common/file.py +2 -2
  172. ansible/module_utils/common/json.py +90 -84
  173. ansible/module_utils/common/locale.py +2 -2
  174. ansible/module_utils/common/parameters.py +27 -24
  175. ansible/module_utils/common/process.py +2 -3
  176. ansible/module_utils/common/respawn.py +11 -33
  177. ansible/module_utils/common/sentinel.py +66 -0
  178. ansible/module_utils/common/sys_info.py +8 -8
  179. ansible/module_utils/common/text/converters.py +16 -37
  180. ansible/module_utils/common/validation.py +35 -24
  181. ansible/module_utils/common/warnings.py +143 -25
  182. ansible/module_utils/common/yaml.py +29 -3
  183. ansible/module_utils/compat/datetime.py +33 -21
  184. ansible/module_utils/compat/paramiko.py +21 -10
  185. ansible/module_utils/compat/typing.py +6 -5
  186. ansible/module_utils/connection.py +10 -13
  187. ansible/module_utils/csharp/Ansible.Basic.cs +15 -12
  188. ansible/module_utils/csharp/Ansible.Become.cs +1 -0
  189. ansible/module_utils/csharp/Ansible.Privilege.cs +2 -2
  190. ansible/module_utils/csharp/Ansible._Async.cs +517 -0
  191. ansible/module_utils/datatag.py +49 -0
  192. ansible/module_utils/distro/__init__.py +2 -2
  193. ansible/module_utils/facts/ansible_collector.py +4 -5
  194. ansible/module_utils/facts/collector.py +13 -14
  195. ansible/module_utils/facts/compat.py +4 -4
  196. ansible/module_utils/facts/default_collectors.py +1 -1
  197. ansible/module_utils/facts/hardware/aix.py +34 -0
  198. ansible/module_utils/facts/hardware/base.py +2 -2
  199. ansible/module_utils/facts/hardware/darwin.py +1 -3
  200. ansible/module_utils/facts/hardware/freebsd.py +2 -2
  201. ansible/module_utils/facts/hardware/linux.py +5 -5
  202. ansible/module_utils/facts/namespace.py +1 -1
  203. ansible/module_utils/facts/network/base.py +1 -1
  204. ansible/module_utils/facts/network/fc_wwn.py +1 -2
  205. ansible/module_utils/facts/network/iscsi.py +1 -2
  206. ansible/module_utils/facts/network/nvme.py +1 -2
  207. ansible/module_utils/facts/other/facter.py +2 -3
  208. ansible/module_utils/facts/other/ohai.py +2 -3
  209. ansible/module_utils/facts/sysctl.py +4 -6
  210. ansible/module_utils/facts/system/apparmor.py +1 -2
  211. ansible/module_utils/facts/system/caps.py +3 -3
  212. ansible/module_utils/facts/system/chroot.py +1 -2
  213. ansible/module_utils/facts/system/cmdline.py +1 -2
  214. ansible/module_utils/facts/system/date_time.py +5 -3
  215. ansible/module_utils/facts/system/distribution.py +27 -13
  216. ansible/module_utils/facts/system/dns.py +1 -1
  217. ansible/module_utils/facts/system/env.py +1 -2
  218. ansible/module_utils/facts/system/fips.py +7 -20
  219. ansible/module_utils/facts/system/loadavg.py +1 -2
  220. ansible/module_utils/facts/system/local.py +2 -3
  221. ansible/module_utils/facts/system/lsb.py +1 -2
  222. ansible/module_utils/facts/system/pkg_mgr.py +1 -2
  223. ansible/module_utils/facts/system/platform.py +1 -2
  224. ansible/module_utils/facts/system/python.py +1 -2
  225. ansible/module_utils/facts/system/selinux.py +1 -1
  226. ansible/module_utils/facts/system/service_mgr.py +1 -2
  227. ansible/module_utils/facts/system/ssh_pub_keys.py +1 -1
  228. ansible/module_utils/facts/system/systemd.py +1 -1
  229. ansible/module_utils/facts/system/user.py +1 -2
  230. ansible/module_utils/facts/utils.py +3 -3
  231. ansible/module_utils/facts/virtual/base.py +1 -1
  232. ansible/module_utils/facts/virtual/linux.py +3 -3
  233. ansible/module_utils/facts/virtual/sunos.py +3 -15
  234. ansible/module_utils/facts/virtual/sysctl.py +3 -16
  235. ansible/module_utils/json_utils.py +2 -2
  236. ansible/module_utils/parsing/convert_bool.py +7 -1
  237. ansible/module_utils/powershell/Ansible.ModuleUtils.AddType.psm1 +1 -1
  238. ansible/module_utils/powershell/Ansible.ModuleUtils.CamelConversion.psm1 +1 -1
  239. ansible/module_utils/powershell/Ansible.ModuleUtils.CommandUtil.psm1 +1 -1
  240. ansible/module_utils/powershell/Ansible.ModuleUtils.WebRequest.psm1 +1 -1
  241. ansible/module_utils/service.py +21 -31
  242. ansible/module_utils/splitter.py +7 -7
  243. ansible/module_utils/testing.py +31 -0
  244. ansible/module_utils/urls.py +64 -35
  245. ansible/modules/add_host.py +4 -4
  246. ansible/modules/apt.py +69 -49
  247. ansible/modules/apt_key.py +19 -12
  248. ansible/modules/apt_repository.py +32 -51
  249. ansible/modules/assemble.py +16 -14
  250. ansible/modules/assert.py +4 -4
  251. ansible/modules/async_status.py +24 -24
  252. ansible/modules/async_wrapper.py +20 -25
  253. ansible/modules/blockinfile.py +6 -7
  254. ansible/modules/command.py +13 -20
  255. ansible/modules/copy.py +60 -147
  256. ansible/modules/cron.py +24 -21
  257. ansible/modules/deb822_repository.py +8 -9
  258. ansible/modules/debconf.py +5 -5
  259. ansible/modules/debug.py +4 -4
  260. ansible/modules/dnf.py +8 -8
  261. ansible/modules/dnf5.py +39 -13
  262. ansible/modules/dpkg_selections.py +4 -4
  263. ansible/modules/expect.py +13 -15
  264. ansible/modules/fail.py +4 -4
  265. ansible/modules/fetch.py +4 -4
  266. ansible/modules/file.py +184 -144
  267. ansible/modules/find.py +22 -20
  268. ansible/modules/gather_facts.py +3 -3
  269. ansible/modules/get_url.py +77 -54
  270. ansible/modules/getent.py +7 -9
  271. ansible/modules/git.py +38 -38
  272. ansible/modules/group.py +6 -6
  273. ansible/modules/group_by.py +4 -4
  274. ansible/modules/hostname.py +15 -32
  275. ansible/modules/import_playbook.py +6 -6
  276. ansible/modules/import_role.py +6 -6
  277. ansible/modules/import_tasks.py +6 -6
  278. ansible/modules/include_role.py +6 -6
  279. ansible/modules/include_tasks.py +6 -6
  280. ansible/modules/include_vars.py +6 -6
  281. ansible/modules/iptables.py +86 -73
  282. ansible/modules/known_hosts.py +22 -24
  283. ansible/modules/lineinfile.py +5 -5
  284. ansible/modules/meta.py +4 -4
  285. ansible/modules/mount_facts.py +2 -2
  286. ansible/modules/package.py +10 -4
  287. ansible/modules/package_facts.py +22 -10
  288. ansible/modules/pause.py +6 -6
  289. ansible/modules/ping.py +6 -6
  290. ansible/modules/pip.py +21 -26
  291. ansible/modules/raw.py +6 -6
  292. ansible/modules/reboot.py +6 -6
  293. ansible/modules/replace.py +10 -14
  294. ansible/modules/rpm_key.py +7 -8
  295. ansible/modules/script.py +4 -4
  296. ansible/modules/service.py +10 -17
  297. ansible/modules/service_facts.py +87 -10
  298. ansible/modules/set_fact.py +5 -5
  299. ansible/modules/set_stats.py +4 -4
  300. ansible/modules/setup.py +2 -2
  301. ansible/modules/shell.py +6 -6
  302. ansible/modules/slurp.py +16 -19
  303. ansible/modules/stat.py +15 -31
  304. ansible/modules/subversion.py +15 -15
  305. ansible/modules/systemd.py +7 -7
  306. ansible/modules/systemd_service.py +7 -7
  307. ansible/modules/sysvinit.py +9 -9
  308. ansible/modules/tempfile.py +5 -6
  309. ansible/modules/template.py +6 -6
  310. ansible/modules/unarchive.py +38 -17
  311. ansible/modules/uri.py +33 -26
  312. ansible/modules/user.py +45 -32
  313. ansible/modules/validate_argument_spec.py +10 -7
  314. ansible/modules/wait_for.py +70 -60
  315. ansible/modules/wait_for_connection.py +6 -6
  316. ansible/modules/yum_repository.py +10 -9
  317. ansible/parsing/ajson.py +17 -37
  318. ansible/parsing/dataloader.py +99 -54
  319. ansible/parsing/mod_args.py +62 -60
  320. ansible/parsing/plugin_docs.py +21 -86
  321. ansible/parsing/quoting.py +1 -1
  322. ansible/parsing/splitter.py +27 -12
  323. ansible/parsing/utils/addresses.py +24 -24
  324. ansible/parsing/utils/jsonify.py +5 -1
  325. ansible/parsing/utils/yaml.py +32 -61
  326. ansible/parsing/vault/__init__.py +327 -99
  327. ansible/parsing/yaml/__init__.py +0 -18
  328. ansible/parsing/yaml/dumper.py +6 -120
  329. ansible/parsing/yaml/loader.py +6 -39
  330. ansible/parsing/yaml/objects.py +43 -335
  331. ansible/playbook/__init__.py +1 -1
  332. ansible/playbook/attribute.py +8 -3
  333. ansible/playbook/base.py +187 -134
  334. ansible/playbook/block.py +26 -24
  335. ansible/playbook/collectionsearch.py +1 -15
  336. ansible/playbook/conditional.py +3 -77
  337. ansible/playbook/handler.py +8 -2
  338. ansible/playbook/helpers.py +41 -53
  339. ansible/playbook/included_file.py +32 -26
  340. ansible/playbook/loop_control.py +2 -2
  341. ansible/playbook/play.py +85 -44
  342. ansible/playbook/play_context.py +14 -17
  343. ansible/playbook/playbook_include.py +27 -62
  344. ansible/playbook/role/__init__.py +64 -49
  345. ansible/playbook/role/definition.py +15 -17
  346. ansible/playbook/role/include.py +2 -4
  347. ansible/playbook/role/metadata.py +10 -11
  348. ansible/playbook/role_include.py +3 -3
  349. ansible/playbook/taggable.py +28 -12
  350. ansible/playbook/task.py +192 -121
  351. ansible/playbook/task_include.py +5 -5
  352. ansible/plugins/__init__.py +58 -26
  353. ansible/plugins/action/__init__.py +188 -186
  354. ansible/plugins/action/add_host.py +2 -2
  355. ansible/plugins/action/assemble.py +11 -18
  356. ansible/plugins/action/assert.py +55 -67
  357. ansible/plugins/action/async_status.py +7 -2
  358. ansible/plugins/action/copy.py +14 -17
  359. ansible/plugins/action/debug.py +37 -31
  360. ansible/plugins/action/dnf.py +3 -4
  361. ansible/plugins/action/fail.py +1 -1
  362. ansible/plugins/action/fetch.py +7 -8
  363. ansible/plugins/action/gather_facts.py +13 -14
  364. ansible/plugins/action/group_by.py +1 -1
  365. ansible/plugins/action/include_vars.py +10 -11
  366. ansible/plugins/action/package.py +8 -14
  367. ansible/plugins/action/pause.py +2 -2
  368. ansible/plugins/action/script.py +27 -38
  369. ansible/plugins/action/service.py +9 -18
  370. ansible/plugins/action/set_fact.py +3 -12
  371. ansible/plugins/action/set_stats.py +3 -8
  372. ansible/plugins/action/template.py +47 -67
  373. ansible/plugins/action/unarchive.py +6 -16
  374. ansible/plugins/action/uri.py +9 -20
  375. ansible/plugins/action/validate_argument_spec.py +5 -5
  376. ansible/plugins/action/wait_for_connection.py +1 -1
  377. ansible/plugins/become/__init__.py +31 -8
  378. ansible/plugins/become/runas.py +71 -0
  379. ansible/plugins/become/su.py +13 -8
  380. ansible/plugins/become/sudo.py +19 -0
  381. ansible/plugins/cache/__init__.py +52 -63
  382. ansible/plugins/cache/base.py +8 -0
  383. ansible/plugins/cache/jsonfile.py +10 -16
  384. ansible/plugins/cache/memory.py +6 -12
  385. ansible/plugins/callback/__init__.py +294 -201
  386. ansible/plugins/callback/default.py +99 -95
  387. ansible/plugins/callback/junit.py +44 -43
  388. ansible/plugins/callback/minimal.py +28 -25
  389. ansible/plugins/callback/oneline.py +34 -21
  390. ansible/plugins/callback/tree.py +27 -16
  391. ansible/plugins/connection/__init__.py +47 -34
  392. ansible/plugins/connection/local.py +156 -60
  393. ansible/plugins/connection/paramiko_ssh.py +34 -24
  394. ansible/plugins/connection/psrp.py +76 -165
  395. ansible/plugins/connection/ssh.py +326 -86
  396. ansible/plugins/connection/winrm.py +62 -141
  397. ansible/plugins/doc_fragments/action_common_attributes.py +14 -14
  398. ansible/plugins/doc_fragments/action_core.py +6 -6
  399. ansible/plugins/doc_fragments/backup.py +2 -2
  400. ansible/plugins/doc_fragments/checksum_common.py +27 -0
  401. ansible/plugins/doc_fragments/constructed.py +8 -4
  402. ansible/plugins/doc_fragments/decrypt.py +2 -2
  403. ansible/plugins/doc_fragments/default_callback.py +2 -2
  404. ansible/plugins/doc_fragments/files.py +2 -2
  405. ansible/plugins/doc_fragments/inventory_cache.py +2 -2
  406. ansible/plugins/doc_fragments/result_format_callback.py +2 -2
  407. ansible/plugins/doc_fragments/return_common.py +2 -2
  408. ansible/plugins/doc_fragments/template_common.py +4 -4
  409. ansible/plugins/doc_fragments/url.py +17 -1
  410. ansible/plugins/doc_fragments/url_windows.py +2 -2
  411. ansible/plugins/doc_fragments/validate.py +2 -2
  412. ansible/plugins/doc_fragments/vars_plugin_staging.py +2 -2
  413. ansible/plugins/filter/__init__.py +6 -2
  414. ansible/plugins/filter/b64decode.yml +22 -0
  415. ansible/plugins/filter/b64encode.yml +22 -0
  416. ansible/plugins/filter/bool.yml +11 -4
  417. ansible/plugins/filter/core.py +245 -120
  418. ansible/plugins/filter/encryption.py +42 -34
  419. ansible/plugins/filter/flatten.yml +3 -2
  420. ansible/plugins/filter/human_to_bytes.yml +1 -1
  421. ansible/plugins/filter/mathstuff.py +30 -37
  422. ansible/plugins/filter/password_hash.yml +8 -0
  423. ansible/plugins/filter/pow.yml +1 -1
  424. ansible/plugins/filter/regex_search.yml +1 -4
  425. ansible/plugins/filter/root.yml +1 -1
  426. ansible/plugins/filter/split.yml +1 -1
  427. ansible/plugins/filter/strftime.yml +3 -3
  428. ansible/plugins/filter/to_nice_yaml.yml +0 -4
  429. ansible/plugins/filter/to_uuid.yml +1 -1
  430. ansible/plugins/filter/to_yaml.yml +0 -4
  431. ansible/plugins/filter/unvault.yml +1 -1
  432. ansible/plugins/filter/urls.py +1 -1
  433. ansible/plugins/filter/urlsplit.py +8 -9
  434. ansible/plugins/filter/vault.yml +14 -9
  435. ansible/plugins/filter/win_basename.yml +6 -1
  436. ansible/plugins/filter/win_dirname.yml +5 -0
  437. ansible/plugins/inventory/__init__.py +107 -86
  438. ansible/plugins/inventory/advanced_host_list.py +7 -5
  439. ansible/plugins/inventory/auto.py +11 -4
  440. ansible/plugins/inventory/constructed.py +21 -24
  441. ansible/plugins/inventory/generator.py +16 -11
  442. ansible/plugins/inventory/host_list.py +7 -5
  443. ansible/plugins/inventory/ini.py +78 -44
  444. ansible/plugins/inventory/script.py +190 -120
  445. ansible/plugins/inventory/toml.py +16 -126
  446. ansible/plugins/inventory/yaml.py +10 -8
  447. ansible/plugins/list.py +72 -19
  448. ansible/plugins/loader.py +383 -198
  449. ansible/plugins/lookup/__init__.py +21 -4
  450. ansible/plugins/lookup/config.py +21 -35
  451. ansible/plugins/lookup/csvfile.py +19 -73
  452. ansible/plugins/lookup/dict.py +1 -6
  453. ansible/plugins/lookup/env.py +12 -9
  454. ansible/plugins/lookup/file.py +5 -8
  455. ansible/plugins/lookup/first_found.py +87 -55
  456. ansible/plugins/lookup/indexed_items.py +1 -10
  457. ansible/plugins/lookup/ini.py +14 -13
  458. ansible/plugins/lookup/items.py +1 -1
  459. ansible/plugins/lookup/lines.py +8 -1
  460. ansible/plugins/lookup/list.py +1 -1
  461. ansible/plugins/lookup/nested.py +2 -18
  462. ansible/plugins/lookup/password.py +5 -5
  463. ansible/plugins/lookup/pipe.py +5 -7
  464. ansible/plugins/lookup/sequence.py +18 -8
  465. ansible/plugins/lookup/subelements.py +1 -4
  466. ansible/plugins/lookup/template.py +47 -36
  467. ansible/plugins/lookup/together.py +0 -12
  468. ansible/plugins/lookup/unvault.py +1 -5
  469. ansible/plugins/lookup/url.py +4 -10
  470. ansible/plugins/lookup/vars.py +16 -24
  471. ansible/plugins/shell/__init__.py +58 -4
  472. ansible/plugins/shell/cmd.py +2 -2
  473. ansible/plugins/shell/powershell.py +106 -31
  474. ansible/plugins/shell/sh.py +13 -7
  475. ansible/plugins/strategy/__init__.py +168 -193
  476. ansible/plugins/strategy/debug.py +2 -2
  477. ansible/plugins/strategy/free.py +16 -31
  478. ansible/plugins/strategy/host_pinned.py +2 -2
  479. ansible/plugins/strategy/linear.py +41 -41
  480. ansible/plugins/terminal/__init__.py +4 -4
  481. ansible/plugins/test/__init__.py +7 -2
  482. ansible/plugins/test/core.py +75 -35
  483. ansible/plugins/test/files.py +1 -1
  484. ansible/plugins/test/finished.yml +1 -1
  485. ansible/plugins/test/mathstuff.py +3 -3
  486. ansible/plugins/test/uri.py +5 -8
  487. ansible/plugins/vars/host_group_vars.py +7 -14
  488. ansible/release.py +2 -2
  489. ansible/template/__init__.py +353 -943
  490. ansible/utils/__init__.py +0 -18
  491. ansible/utils/collection_loader/__init__.py +54 -5
  492. ansible/utils/collection_loader/_collection_config.py +5 -6
  493. ansible/utils/collection_loader/_collection_finder.py +82 -96
  494. ansible/utils/collection_loader/_collection_meta.py +15 -8
  495. ansible/utils/display.py +485 -73
  496. ansible/utils/encrypt.py +27 -19
  497. ansible/utils/fqcn.py +2 -2
  498. ansible/utils/galaxy.py +2 -2
  499. ansible/utils/hashing.py +8 -10
  500. ansible/utils/helpers.py +2 -2
  501. ansible/utils/listify.py +10 -8
  502. ansible/utils/lock.py +2 -2
  503. ansible/utils/path.py +10 -12
  504. ansible/utils/plugin_docs.py +16 -14
  505. ansible/utils/py3compat.py +2 -7
  506. ansible/utils/sentinel.py +4 -62
  507. ansible/utils/singleton.py +2 -0
  508. ansible/utils/ssh_functions.py +6 -2
  509. ansible/utils/unsafe_proxy.py +23 -332
  510. ansible/utils/vars.py +55 -8
  511. ansible/utils/version.py +2 -2
  512. ansible/vars/clean.py +5 -5
  513. ansible/vars/hostvars.py +60 -90
  514. ansible/vars/manager.py +220 -285
  515. ansible/vars/plugins.py +4 -4
  516. ansible/vars/reserved.py +13 -12
  517. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/METADATA +4 -3
  518. ansible_core-2.19.0.dist-info/RECORD +1097 -0
  519. ansible_core-2.19.0.dist-info/licenses/licenses/BSD-3-Clause.txt +28 -0
  520. ansible_test/_data/completion/docker.txt +7 -7
  521. ansible_test/_data/completion/remote.txt +6 -6
  522. ansible_test/_data/completion/windows.txt +1 -0
  523. ansible_test/_data/requirements/ansible.txt +2 -2
  524. ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
  525. ansible_test/_data/requirements/sanity.changelog.txt +2 -2
  526. ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
  527. ansible_test/_data/requirements/sanity.pep8.txt +1 -1
  528. ansible_test/_data/requirements/sanity.pylint.txt +5 -5
  529. ansible_test/_data/requirements/sanity.validate-modules.txt +2 -2
  530. ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
  531. ansible_test/_data/requirements/units.txt +1 -0
  532. ansible_test/_internal/__init__.py +6 -0
  533. ansible_test/_internal/ansible_util.py +3 -1
  534. ansible_test/_internal/become.py +1 -0
  535. ansible_test/_internal/bootstrap.py +1 -0
  536. ansible_test/_internal/cache.py +1 -0
  537. ansible_test/_internal/cgroup.py +1 -0
  538. ansible_test/_internal/ci/__init__.py +1 -0
  539. ansible_test/_internal/ci/azp.py +1 -0
  540. ansible_test/_internal/ci/local.py +1 -0
  541. ansible_test/_internal/classification/__init__.py +1 -0
  542. ansible_test/_internal/classification/common.py +1 -0
  543. ansible_test/_internal/classification/csharp.py +1 -0
  544. ansible_test/_internal/classification/powershell.py +1 -0
  545. ansible_test/_internal/classification/python.py +1 -0
  546. ansible_test/_internal/cli/__init__.py +1 -0
  547. ansible_test/_internal/cli/actions.py +1 -0
  548. ansible_test/_internal/cli/argparsing/__init__.py +1 -0
  549. ansible_test/_internal/cli/argparsing/actions.py +1 -0
  550. ansible_test/_internal/cli/argparsing/argcompletion.py +1 -0
  551. ansible_test/_internal/cli/argparsing/parsers.py +1 -0
  552. ansible_test/_internal/cli/commands/__init__.py +11 -5
  553. ansible_test/_internal/cli/commands/coverage/__init__.py +1 -0
  554. ansible_test/_internal/cli/commands/coverage/analyze/__init__.py +1 -0
  555. ansible_test/_internal/cli/commands/coverage/analyze/targets/__init__.py +1 -0
  556. ansible_test/_internal/cli/commands/coverage/analyze/targets/combine.py +1 -0
  557. ansible_test/_internal/cli/commands/coverage/analyze/targets/expand.py +1 -0
  558. ansible_test/_internal/cli/commands/coverage/analyze/targets/filter.py +1 -0
  559. ansible_test/_internal/cli/commands/coverage/analyze/targets/generate.py +1 -0
  560. ansible_test/_internal/cli/commands/coverage/analyze/targets/missing.py +1 -0
  561. ansible_test/_internal/cli/commands/coverage/combine.py +1 -0
  562. ansible_test/_internal/cli/commands/coverage/erase.py +1 -0
  563. ansible_test/_internal/cli/commands/coverage/html.py +1 -0
  564. ansible_test/_internal/cli/commands/coverage/report.py +1 -0
  565. ansible_test/_internal/cli/commands/coverage/xml.py +1 -0
  566. ansible_test/_internal/cli/commands/env.py +1 -0
  567. ansible_test/_internal/cli/commands/integration/__init__.py +1 -0
  568. ansible_test/_internal/cli/commands/integration/network.py +1 -0
  569. ansible_test/_internal/cli/commands/integration/posix.py +1 -0
  570. ansible_test/_internal/cli/commands/integration/windows.py +1 -0
  571. ansible_test/_internal/cli/commands/sanity.py +9 -0
  572. ansible_test/_internal/cli/commands/shell.py +1 -0
  573. ansible_test/_internal/cli/commands/units.py +1 -0
  574. ansible_test/_internal/cli/compat.py +1 -0
  575. ansible_test/_internal/cli/completers.py +1 -0
  576. ansible_test/_internal/cli/converters.py +1 -0
  577. ansible_test/_internal/cli/environments.py +52 -5
  578. ansible_test/_internal/cli/epilog.py +1 -0
  579. ansible_test/_internal/cli/parsers/__init__.py +1 -0
  580. ansible_test/_internal/cli/parsers/base_argument_parsers.py +1 -0
  581. ansible_test/_internal/cli/parsers/helpers.py +1 -0
  582. ansible_test/_internal/cli/parsers/host_config_parsers.py +1 -0
  583. ansible_test/_internal/cli/parsers/key_value_parsers.py +1 -0
  584. ansible_test/_internal/cli/parsers/value_parsers.py +1 -0
  585. ansible_test/_internal/commands/__init__.py +1 -0
  586. ansible_test/_internal/commands/coverage/__init__.py +3 -2
  587. ansible_test/_internal/commands/coverage/analyze/__init__.py +1 -0
  588. ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +1 -0
  589. ansible_test/_internal/commands/coverage/analyze/targets/combine.py +1 -0
  590. ansible_test/_internal/commands/coverage/analyze/targets/expand.py +1 -0
  591. ansible_test/_internal/commands/coverage/analyze/targets/filter.py +1 -0
  592. ansible_test/_internal/commands/coverage/analyze/targets/generate.py +1 -0
  593. ansible_test/_internal/commands/coverage/analyze/targets/missing.py +1 -0
  594. ansible_test/_internal/commands/coverage/combine.py +2 -1
  595. ansible_test/_internal/commands/coverage/erase.py +1 -0
  596. ansible_test/_internal/commands/coverage/html.py +1 -0
  597. ansible_test/_internal/commands/coverage/report.py +1 -0
  598. ansible_test/_internal/commands/coverage/xml.py +1 -0
  599. ansible_test/_internal/commands/env/__init__.py +2 -0
  600. ansible_test/_internal/commands/integration/__init__.py +22 -5
  601. ansible_test/_internal/commands/integration/cloud/__init__.py +1 -0
  602. ansible_test/_internal/commands/integration/cloud/acme.py +2 -1
  603. ansible_test/_internal/commands/integration/cloud/aws.py +1 -0
  604. ansible_test/_internal/commands/integration/cloud/azure.py +1 -0
  605. ansible_test/_internal/commands/integration/cloud/cs.py +1 -0
  606. ansible_test/_internal/commands/integration/cloud/digitalocean.py +1 -0
  607. ansible_test/_internal/commands/integration/cloud/galaxy.py +3 -2
  608. ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -0
  609. ansible_test/_internal/commands/integration/cloud/httptester.py +3 -2
  610. ansible_test/_internal/commands/integration/cloud/nios.py +2 -1
  611. ansible_test/_internal/commands/integration/cloud/opennebula.py +1 -0
  612. ansible_test/_internal/commands/integration/cloud/openshift.py +1 -0
  613. ansible_test/_internal/commands/integration/cloud/scaleway.py +1 -0
  614. ansible_test/_internal/commands/integration/cloud/vcenter.py +1 -0
  615. ansible_test/_internal/commands/integration/cloud/vultr.py +1 -0
  616. ansible_test/_internal/commands/integration/coverage.py +8 -2
  617. ansible_test/_internal/commands/integration/filters.py +1 -0
  618. ansible_test/_internal/commands/integration/network.py +1 -0
  619. ansible_test/_internal/commands/integration/posix.py +1 -0
  620. ansible_test/_internal/commands/integration/windows.py +1 -0
  621. ansible_test/_internal/commands/sanity/__init__.py +19 -2
  622. ansible_test/_internal/commands/sanity/ansible_doc.py +1 -0
  623. ansible_test/_internal/commands/sanity/bin_symlinks.py +1 -0
  624. ansible_test/_internal/commands/sanity/compile.py +1 -0
  625. ansible_test/_internal/commands/sanity/ignores.py +1 -0
  626. ansible_test/_internal/commands/sanity/import.py +1 -0
  627. ansible_test/_internal/commands/sanity/integration_aliases.py +12 -0
  628. ansible_test/_internal/commands/sanity/pep8.py +1 -0
  629. ansible_test/_internal/commands/sanity/pslint.py +1 -0
  630. ansible_test/_internal/commands/sanity/pylint.py +25 -26
  631. ansible_test/_internal/commands/sanity/shellcheck.py +1 -0
  632. ansible_test/_internal/commands/sanity/validate_modules.py +1 -0
  633. ansible_test/_internal/commands/sanity/yamllint.py +1 -0
  634. ansible_test/_internal/commands/shell/__init__.py +44 -4
  635. ansible_test/_internal/commands/units/__init__.py +5 -1
  636. ansible_test/_internal/compat/__init__.py +1 -0
  637. ansible_test/_internal/compat/packaging.py +1 -0
  638. ansible_test/_internal/compat/yaml.py +1 -0
  639. ansible_test/_internal/completion.py +1 -0
  640. ansible_test/_internal/config.py +23 -13
  641. ansible_test/_internal/connections.py +1 -0
  642. ansible_test/_internal/constants.py +1 -0
  643. ansible_test/_internal/containers.py +1 -0
  644. ansible_test/_internal/content_config.py +1 -0
  645. ansible_test/_internal/core_ci.py +1 -0
  646. ansible_test/_internal/coverage_util.py +11 -10
  647. ansible_test/_internal/data.py +1 -0
  648. ansible_test/_internal/debugging.py +166 -0
  649. ansible_test/_internal/delegation.py +22 -13
  650. ansible_test/_internal/dev/__init__.py +1 -0
  651. ansible_test/_internal/dev/container_probe.py +1 -0
  652. ansible_test/_internal/diff.py +3 -2
  653. ansible_test/_internal/docker_util.py +2 -1
  654. ansible_test/_internal/encoding.py +1 -0
  655. ansible_test/_internal/executor.py +1 -0
  656. ansible_test/_internal/git.py +1 -0
  657. ansible_test/_internal/host_configs.py +1 -0
  658. ansible_test/_internal/host_profiles.py +260 -16
  659. ansible_test/_internal/http.py +1 -0
  660. ansible_test/_internal/init.py +1 -0
  661. ansible_test/_internal/inventory.py +39 -3
  662. ansible_test/_internal/io.py +1 -0
  663. ansible_test/_internal/metadata.py +95 -4
  664. ansible_test/_internal/payload.py +1 -0
  665. ansible_test/_internal/processes.py +80 -0
  666. ansible_test/_internal/provider/__init__.py +1 -0
  667. ansible_test/_internal/provider/layout/__init__.py +1 -0
  668. ansible_test/_internal/provider/layout/ansible.py +1 -0
  669. ansible_test/_internal/provider/layout/collection.py +1 -0
  670. ansible_test/_internal/provider/layout/unsupported.py +1 -0
  671. ansible_test/_internal/provider/source/__init__.py +1 -0
  672. ansible_test/_internal/provider/source/git.py +1 -0
  673. ansible_test/_internal/provider/source/installed.py +1 -0
  674. ansible_test/_internal/provider/source/unsupported.py +1 -0
  675. ansible_test/_internal/provider/source/unversioned.py +1 -0
  676. ansible_test/_internal/provisioning.py +11 -4
  677. ansible_test/_internal/pypi_proxy.py +6 -5
  678. ansible_test/_internal/python_requirements.py +28 -0
  679. ansible_test/_internal/ssh.py +2 -5
  680. ansible_test/_internal/target.py +9 -0
  681. ansible_test/_internal/test.py +3 -2
  682. ansible_test/_internal/thread.py +3 -1
  683. ansible_test/_internal/timeout.py +2 -1
  684. ansible_test/_internal/util.py +41 -12
  685. ansible_test/_internal/util_common.py +18 -5
  686. ansible_test/_internal/venv.py +1 -0
  687. ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +1 -0
  688. ansible_test/_util/controller/sanity/code-smell/changelog/sphinx.py +1 -0
  689. ansible_test/_util/controller/sanity/code-smell/changelog.py +1 -0
  690. ansible_test/_util/controller/sanity/code-smell/empty-init.py +1 -0
  691. ansible_test/_util/controller/sanity/code-smell/line-endings.py +1 -0
  692. ansible_test/_util/controller/sanity/code-smell/no-assert.py +1 -0
  693. ansible_test/_util/controller/sanity/code-smell/no-get-exception.py +1 -0
  694. ansible_test/_util/controller/sanity/code-smell/no-illegal-filenames.py +1 -0
  695. ansible_test/_util/controller/sanity/code-smell/no-smart-quotes.py +1 -0
  696. ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py +1 -0
  697. ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +28 -1
  698. ansible_test/_util/controller/sanity/code-smell/shebang.py +1 -0
  699. ansible_test/_util/controller/sanity/code-smell/symlinks.py +1 -0
  700. ansible_test/_util/controller/sanity/code-smell/use-argspec-type-path.py +1 -0
  701. ansible_test/_util/controller/sanity/code-smell/use-compat-six.py +1 -0
  702. ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py +2 -1
  703. ansible_test/_util/controller/sanity/pep8/current-ignore.txt +4 -0
  704. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +8 -5
  705. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +8 -5
  706. ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +8 -5
  707. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +4 -5
  708. ansible_test/_util/controller/sanity/pylint/config/default.cfg +8 -7
  709. ansible_test/_util/controller/sanity/pylint/plugins/deprecated_calls.py +541 -0
  710. ansible_test/_util/controller/sanity/pylint/plugins/deprecated_comment.py +137 -0
  711. ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +1 -0
  712. ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +1 -8
  713. ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +1 -8
  714. ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +55 -28
  715. ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +12 -5
  716. ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +13 -2
  717. ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -0
  718. ansible_test/_util/controller/sanity/yamllint/yamllinter.py +35 -17
  719. ansible_test/_util/controller/tools/collection_detail.py +1 -0
  720. ansible_test/_util/controller/tools/yaml_to_json.py +2 -1
  721. ansible_test/_util/target/injector/python.py +8 -0
  722. ansible_test/_util/target/pytest/plugins/ansible_forked.py +6 -1
  723. ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +2 -1
  724. ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -0
  725. ansible_test/_util/target/sanity/compile/compile.py +1 -0
  726. ansible_test/_util/target/sanity/import/importer.py +15 -16
  727. ansible_test/_util/target/setup/bootstrap.sh +9 -20
  728. ansible_test/_util/target/setup/probe_cgroups.py +1 -0
  729. ansible_test/_util/target/setup/quiet_pip.py +1 -0
  730. ansible_test/_util/target/setup/requirements.py +38 -36
  731. ansible_test/_util/target/tools/virtualenvcheck.py +2 -1
  732. ansible_test/_util/target/tools/yamlcheck.py +2 -1
  733. ansible/compat/selectors.py +0 -32
  734. ansible/errors/yaml_strings.py +0 -138
  735. ansible/executor/action_write_locks.py +0 -44
  736. ansible/executor/discovery/python_target.py +0 -47
  737. ansible/executor/powershell/module_powershell_wrapper.ps1 +0 -86
  738. ansible/executor/powershell/module_script_wrapper.ps1 +0 -22
  739. ansible/module_utils/compat/importlib.py +0 -26
  740. ansible/module_utils/compat/selectors.py +0 -32
  741. ansible/module_utils/pycompat24.py +0 -73
  742. ansible/parsing/yaml/constructor.py +0 -178
  743. ansible/template/native_helpers.py +0 -251
  744. ansible/template/template.py +0 -43
  745. ansible/template/vars.py +0 -77
  746. ansible/utils/native_jinja.py +0 -11
  747. ansible/vars/fact_cache.py +0 -71
  748. ansible_core-2.18.7rc1.dist-info/RECORD +0 -992
  749. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +0 -411
  750. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/WHEEL +0 -0
  751. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/entry_points.txt +0 -0
  752. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/COPYING +0 -0
  753. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/Apache-License.txt +0 -0
  754. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/MIT-license.txt +0 -0
  755. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/PSF-license.txt +0 -0
  756. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/simplified_bsd.txt +0 -0
  757. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,5 @@
1
1
  """Execute Ansible sanity tests."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import abc
@@ -75,6 +76,7 @@ from ...python_requirements import (
75
76
  PipInstall,
76
77
  collect_requirements,
77
78
  run_pip,
79
+ install_requirements,
78
80
  )
79
81
 
80
82
  from ...config import (
@@ -177,6 +179,7 @@ def command_sanity(args: SanityConfig) -> None:
177
179
  if args.delegate:
178
180
  raise Delegate(host_state=host_state, require=changes, exclude=args.exclude)
179
181
 
182
+ install_requirements(args, host_state.controller_profile, host_state.controller_profile.python) # sanity
180
183
  configure_pypi_proxy(args, host_state.controller_profile) # sanity
181
184
 
182
185
  if disabled:
@@ -302,7 +305,7 @@ def command_sanity(args: SanityConfig) -> None:
302
305
 
303
306
  if created_venvs and isinstance(controller, DockerConfig) and controller.name == 'default' and not args.prime_venvs:
304
307
  names = ', '.join(created_venvs)
305
- display.warning(f'There following sanity test virtual environments are out-of-date in the "default" container: {names}')
308
+ display.warning(f'The following sanity test virtual environments are out-of-date in the "default" container: {names}')
306
309
 
307
310
  if failed:
308
311
  message = 'The %d sanity test(s) listed below (out of %d) failed. See error output above for details.\n%s' % (
@@ -872,6 +875,7 @@ class SanityScript(SanityTest, metaclass=abc.ABCMeta):
872
875
 
873
876
  self.__all_targets: bool = self.config.get('all_targets')
874
877
  self.__no_targets: bool = self.config.get('no_targets')
878
+ self.__split_targets: bool = self.config.get('split_targets')
875
879
  self.__include_directories: bool = self.config.get('include_directories')
876
880
  self.__include_symlinks: bool = self.config.get('include_symlinks')
877
881
  self.__error_code: str | None = self.config.get('error_code', None)
@@ -889,6 +893,7 @@ class SanityScript(SanityTest, metaclass=abc.ABCMeta):
889
893
 
890
894
  self.__all_targets = False
891
895
  self.__no_targets = True
896
+ self.__split_targets = False
892
897
  self.__include_directories = False
893
898
  self.__include_symlinks = False
894
899
  self.__error_code = None
@@ -925,6 +930,11 @@ class SanityScript(SanityTest, metaclass=abc.ABCMeta):
925
930
  """True if the test does not use test targets. Mutually exclusive with all_targets."""
926
931
  return self.__no_targets
927
932
 
933
+ @property
934
+ def split_targets(self) -> bool:
935
+ """True if the test requires target paths to be split between controller-only and target paths."""
936
+ return self.__split_targets
937
+
928
938
  @property
929
939
  def include_directories(self) -> bool:
930
940
  """True if the test targets should include directories."""
@@ -992,6 +1002,7 @@ class SanityScript(SanityTest, metaclass=abc.ABCMeta):
992
1002
  ANSIBLE_TEST_TARGET_PYTHON_VERSION=python.version,
993
1003
  ANSIBLE_TEST_CONTROLLER_PYTHON_VERSIONS=','.join(CONTROLLER_PYTHON_VERSIONS),
994
1004
  ANSIBLE_TEST_REMOTE_ONLY_PYTHON_VERSIONS=','.join(REMOTE_ONLY_PYTHON_VERSIONS),
1005
+ ANSIBLE_TEST_FIX_MODE=str(int(args.fix)),
995
1006
  )
996
1007
 
997
1008
  if self.min_max_python_only:
@@ -1018,6 +1029,12 @@ class SanityScript(SanityTest, metaclass=abc.ABCMeta):
1018
1029
  raise ApplicationError('Unsupported output type: %s' % self.output)
1019
1030
 
1020
1031
  if not self.no_targets:
1032
+ if self.split_targets:
1033
+ target_paths = set(target.path for target in self.filter_remote_targets(list(targets.targets)))
1034
+ controller_path_list = sorted(set(paths) - target_paths)
1035
+ target_path_list = sorted(set(paths) & target_paths)
1036
+ paths = controller_path_list + ['--'] + target_path_list
1037
+
1021
1038
  data = '\n'.join(paths)
1022
1039
 
1023
1040
  if data:
@@ -1070,7 +1087,7 @@ class SanityScript(SanityTest, metaclass=abc.ABCMeta):
1070
1087
 
1071
1088
 
1072
1089
  class SanityVersionNeutral(SanityTest, metaclass=abc.ABCMeta):
1073
- """Base class for sanity test plugins which are idependent of the python version being used."""
1090
+ """Base class for sanity test plugins which are independent of the python version being used."""
1074
1091
 
1075
1092
  @abc.abstractmethod
1076
1093
  def test(self, args: SanityConfig, targets: SanityTargets) -> TestResult:
@@ -1,4 +1,5 @@
1
1
  """Sanity test for ansible-doc."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import collections
@@ -1,4 +1,5 @@
1
1
  """Sanity test for symlinks in the bin directory."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import os
@@ -1,4 +1,5 @@
1
1
  """Sanity test for proper python syntax."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import os
@@ -1,4 +1,5 @@
1
1
  """Sanity test for the sanity ignore file."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import os
@@ -1,4 +1,5 @@
1
1
  """Sanity test for proper import exception handling."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import collections.abc as c
@@ -1,4 +1,5 @@
1
1
  """Sanity test to check integration test aliases."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import dataclasses
@@ -180,6 +181,8 @@ class IntegrationAliasesTest(SanitySingleVersion):
180
181
  group_numbers = self.ci_test_groups.get(name, None)
181
182
 
182
183
  if group_numbers:
184
+ group_numbers = [num for num in group_numbers if num not in (6, 7)] # HACK: ignore special groups 6 and 7
185
+
183
186
  if min(group_numbers) != 1:
184
187
  display.warning('Min test group "%s" in %s is %d instead of 1.' % (name, self.CI_YML, min(group_numbers)), unique=True)
185
188
 
@@ -290,6 +293,9 @@ class IntegrationAliasesTest(SanitySingleVersion):
290
293
  if target.name == 'ansible-test-container':
291
294
  continue # special test target which uses group 6 -- nothing else should be in that group
292
295
 
296
+ if target.name in ('dnf-oldest', 'dnf-latest'):
297
+ continue # special test targets which use group 7 -- nothing else should be in that group
298
+
293
299
  if f'{self.TEST_ALIAS_PREFIX}/posix/' not in target.aliases:
294
300
  continue
295
301
 
@@ -350,6 +356,12 @@ class IntegrationAliasesTest(SanitySingleVersion):
350
356
  if path == 'test/integration/targets/ansible-test-container':
351
357
  continue # special test target which uses group 6 -- nothing else should be in that group
352
358
 
359
+ if path in (
360
+ 'test/integration/targets/dnf-oldest',
361
+ 'test/integration/targets/dnf-latest',
362
+ ):
363
+ continue # special test targets which use group 7 -- nothing else should be in that group
364
+
353
365
  messages.append(SanityMessage(unassigned_message, '%s/aliases' % path))
354
366
 
355
367
  for path in conflicting_paths:
@@ -1,4 +1,5 @@
1
1
  """Sanity test for PEP 8 style guidelines using pycodestyle."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import os
@@ -1,4 +1,5 @@
1
1
  """Sanity test using PSScriptAnalyzer."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import json
@@ -1,4 +1,5 @@
1
1
  """Sanity test using pylint."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import collections.abc as c
@@ -6,7 +7,6 @@ import itertools
6
7
  import json
7
8
  import os
8
9
  import datetime
9
- import configparser
10
10
  import typing as t
11
11
 
12
12
  from . import (
@@ -227,17 +227,6 @@ class PylintTest(SanitySingleVersion):
227
227
  else:
228
228
  rcfile = os.path.join(SANITY_ROOT, 'pylint', 'config', 'default.cfg')
229
229
 
230
- parser = configparser.ConfigParser()
231
- parser.read(rcfile)
232
-
233
- if parser.has_section('ansible-test'):
234
- config = dict(parser.items('ansible-test'))
235
- else:
236
- config = {}
237
-
238
- disable_plugins = set(i.strip() for i in config.get('disable-plugins', '').split(',') if i)
239
- load_plugins = set(plugin_names + ['pylint.extensions.mccabe']) - disable_plugins
240
-
241
230
  if is_target:
242
231
  context_label = 'target'
243
232
  min_python_version = REMOTE_ONLY_PYTHON_VERSIONS[0]
@@ -245,24 +234,34 @@ class PylintTest(SanitySingleVersion):
245
234
  context_label = 'controller'
246
235
  min_python_version = CONTROLLER_PYTHON_VERSIONS[0]
247
236
 
248
- cmd = [
249
- python.path,
250
- '-m', 'pylint',
251
- '--jobs', '0',
252
- '--reports', 'n',
253
- '--max-line-length', '160',
254
- '--max-complexity', '20',
255
- '--rcfile', rcfile,
256
- '--output-format', 'json',
257
- '--load-plugins', ','.join(sorted(load_plugins)),
258
- '--py-version', min_python_version,
259
- ] + paths # fmt: skip
237
+ load_plugins = set(plugin_names)
238
+ plugin_options: dict[str, str] = {}
260
239
 
240
+ # plugin: deprecated (ansible-test)
261
241
  if data_context().content.collection:
262
- cmd.extend(['--collection-name', data_context().content.collection.full_name])
242
+ plugin_options.update({'--collection-name': data_context().content.collection.full_name})
243
+ plugin_options.update({'--collection-path': os.path.join(data_context().content.collection.root, data_context().content.collection.directory)})
263
244
 
264
245
  if collection_detail and collection_detail.version:
265
- cmd.extend(['--collection-version', collection_detail.version])
246
+ plugin_options.update({'--collection-version': collection_detail.version})
247
+
248
+ # plugin: pylint.extensions.mccabe
249
+ if args.enable_optional_errors:
250
+ load_plugins.add('pylint.extensions.mccabe')
251
+ plugin_options.update({'--max-complexity': '20'})
252
+
253
+ options = {
254
+ '--py-version': min_python_version,
255
+ '--load-plugins': ','.join(sorted(load_plugins)),
256
+ '--rcfile': rcfile,
257
+ '--jobs': '0',
258
+ '--reports': 'n',
259
+ '--output-format': 'json',
260
+ }
261
+
262
+ cmd = [python.path, '-m', 'pylint']
263
+ cmd.extend(itertools.chain.from_iterable((options | plugin_options).items()))
264
+ cmd.extend(paths)
266
265
 
267
266
  append_python_path = [plugin_dir]
268
267
 
@@ -1,4 +1,5 @@
1
1
  """Sanity test using shellcheck."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import os
@@ -1,4 +1,5 @@
1
1
  """Sanity test using validate-modules."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import collections
@@ -1,4 +1,5 @@
1
1
  """Sanity test using yamllint."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import json
@@ -1,6 +1,8 @@
1
1
  """Open a shell prompt inside an ansible-test environment."""
2
+
2
3
  from __future__ import annotations
3
4
 
5
+ import dataclasses
4
6
  import os
5
7
  import sys
6
8
  import typing as t
@@ -13,6 +15,10 @@ from ...util import (
13
15
  HostConnectionError,
14
16
  )
15
17
 
18
+ from ...ansible_util import (
19
+ ansible_environment,
20
+ )
21
+
16
22
  from ...config import (
17
23
  ShellConfig,
18
24
  )
@@ -31,6 +37,7 @@ from ...host_profiles import (
31
37
  ControllerProfile,
32
38
  PosixProfile,
33
39
  SshTargetHostProfile,
40
+ DebuggableProfile,
34
41
  )
35
42
 
36
43
  from ...provisioning import (
@@ -38,7 +45,6 @@ from ...provisioning import (
38
45
  )
39
46
 
40
47
  from ...host_configs import (
41
- ControllerConfig,
42
48
  OriginConfig,
43
49
  )
44
50
 
@@ -47,12 +53,21 @@ from ...inventory import (
47
53
  create_posix_inventory,
48
54
  )
49
55
 
56
+ from ...python_requirements import (
57
+ install_requirements,
58
+ )
59
+
60
+ from ...util_common import (
61
+ get_injector_env,
62
+ )
63
+
64
+ from ...delegation import (
65
+ metadata_context,
66
+ )
67
+
50
68
 
51
69
  def command_shell(args: ShellConfig) -> None:
52
70
  """Entry point for the `shell` command."""
53
- if args.raw and isinstance(args.targets[0], ControllerConfig):
54
- raise ApplicationError('The --raw option has no effect on the controller.')
55
-
56
71
  if not args.export and not args.cmd and not sys.stdin.isatty():
57
72
  raise ApplicationError('Standard input must be a TTY to launch a shell.')
58
73
 
@@ -61,6 +76,8 @@ def command_shell(args: ShellConfig) -> None:
61
76
  if args.delegate:
62
77
  raise Delegate(host_state=host_state)
63
78
 
79
+ install_requirements(args, host_state.controller_profile, host_state.controller_profile.python) # shell
80
+
64
81
  if args.raw and not isinstance(args.controller, OriginConfig):
65
82
  display.warning('The --raw option will only be applied to the target.')
66
83
 
@@ -91,6 +108,20 @@ def command_shell(args: ShellConfig) -> None:
91
108
  con.run(args.cmd, capture=False, interactive=False, output_stream=OutputStream.ORIGINAL)
92
109
  return
93
110
 
111
+ if isinstance(con, LocalConnection) and isinstance(target_profile, DebuggableProfile) and target_profile.debugging_enabled:
112
+ # HACK: ensure the pydevd port visible in the shell is the forwarded port, not the original
113
+ args.metadata.debugger_settings = dataclasses.replace(args.metadata.debugger_settings, port=target_profile.pydevd_port)
114
+
115
+ with metadata_context(args):
116
+ interactive_shell(args, target_profile, con)
117
+
118
+
119
+ def interactive_shell(
120
+ args: ShellConfig,
121
+ target_profile: SshTargetHostProfile,
122
+ con: Connection,
123
+ ) -> None:
124
+ """Run an interactive shell."""
94
125
  if isinstance(con, SshConnection) and args.raw:
95
126
  cmd: list[str] = []
96
127
  elif isinstance(target_profile, PosixProfile):
@@ -110,6 +141,15 @@ def command_shell(args: ShellConfig) -> None:
110
141
 
111
142
  env = {name: os.environ[name] for name in optional_vars if name in os.environ}
112
143
 
144
+ if isinstance(con, LocalConnection): # configure the controller environment
145
+ env.update(ansible_environment(args))
146
+ env.update(get_injector_env(target_profile.python, env))
147
+ env.update(ANSIBLE_TEST_METADATA_PATH=os.path.abspath(args.metadata_path))
148
+
149
+ if isinstance(target_profile, DebuggableProfile):
150
+ env.update(target_profile.get_ansiballz_environment_variables())
151
+ env.update(target_profile.get_ansible_cli_environment_variables())
152
+
113
153
  if env:
114
154
  cmd = ['/usr/bin/env'] + [f'{name}={value}' for name, value in env.items()]
115
155
 
@@ -1,4 +1,5 @@
1
1
  """Execute unit tests using pytest."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import os
@@ -63,6 +64,7 @@ from ...executor import (
63
64
 
64
65
  from ...python_requirements import (
65
66
  install_requirements,
67
+ post_install,
66
68
  )
67
69
 
68
70
  from ...content_config import (
@@ -229,7 +231,9 @@ def command_units(args: UnitsConfig) -> None:
229
231
  controller = any(test_context == TestContext.controller for test_context, python, paths, env in final_candidates)
230
232
 
231
233
  if args.requirements_mode != 'skip':
232
- install_requirements(args, target_profile.python, ansible=controller, command=True, controller=False) # units
234
+ install_requirements(args, target_profile, target_profile.python, ansible=controller, command=True, controller=False) # units
235
+ else:
236
+ post_install(target_profile)
233
237
 
234
238
  test_sets.extend(final_candidates)
235
239
 
@@ -1,2 +1,3 @@
1
1
  """Nearly empty __init__.py to keep pylint happy."""
2
+
2
3
  from __future__ import annotations
@@ -1,4 +1,5 @@
1
1
  """Packaging compatibility."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import typing as t
@@ -1,4 +1,5 @@
1
1
  """PyYAML compatibility."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import typing as t
@@ -1,4 +1,5 @@
1
1
  """Loading, parsing and storing of completion configurations."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import abc
@@ -1,4 +1,5 @@
1
1
  """Configuration classes."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import dataclasses
@@ -19,6 +20,7 @@ from .util_common import (
19
20
 
20
21
  from .metadata import (
21
22
  Metadata,
23
+ DebuggerFlags,
22
24
  )
23
25
 
24
26
  from .data import (
@@ -117,6 +119,26 @@ class EnvironmentConfig(CommonConfig):
117
119
  self.dev_systemd_debug: bool = args.dev_systemd_debug
118
120
  self.dev_probe_cgroups: t.Optional[str] = args.dev_probe_cgroups
119
121
 
122
+ debugger_flags = DebuggerFlags(
123
+ on_demand=args.dev_debug_on_demand,
124
+ cli=args.dev_debug_cli,
125
+ ansiballz=args.dev_debug_ansiballz,
126
+ self=args.dev_debug_self,
127
+ )
128
+
129
+ self.metadata = Metadata.from_file(args.metadata) if args.metadata else Metadata(debugger_flags=debugger_flags)
130
+ self.metadata_path: t.Optional[str] = None
131
+
132
+ def metadata_callback(payload_config: PayloadConfig) -> None:
133
+ """Add the metadata file to the payload file list."""
134
+ config = self
135
+ files = payload_config.files
136
+
137
+ if config.metadata_path:
138
+ files.append((os.path.abspath(config.metadata_path), config.metadata_path))
139
+
140
+ data_context().register_payload_callback(metadata_callback)
141
+
120
142
  def host_callback(payload_config: PayloadConfig) -> None:
121
143
  """Add the host files to the payload file list."""
122
144
  config = self
@@ -219,22 +241,9 @@ class TestConfig(EnvironmentConfig):
219
241
  self.junit: bool = getattr(args, 'junit', False)
220
242
  self.failure_ok: bool = getattr(args, 'failure_ok', False)
221
243
 
222
- self.metadata = Metadata.from_file(args.metadata) if args.metadata else Metadata()
223
- self.metadata_path: t.Optional[str] = None
224
-
225
244
  if self.coverage_check:
226
245
  self.coverage = True
227
246
 
228
- def metadata_callback(payload_config: PayloadConfig) -> None:
229
- """Add the metadata file to the payload file list."""
230
- config = self
231
- files = payload_config.files
232
-
233
- if config.metadata_path:
234
- files.append((os.path.abspath(config.metadata_path), config.metadata_path))
235
-
236
- data_context().register_payload_callback(metadata_callback)
237
-
238
247
 
239
248
  class ShellConfig(EnvironmentConfig):
240
249
  """Configuration for the shell command."""
@@ -262,6 +271,7 @@ class SanityConfig(TestConfig):
262
271
  self.allow_disabled: bool = args.allow_disabled
263
272
  self.enable_optional_errors: bool = args.enable_optional_errors
264
273
  self.prime_venvs: bool = args.prime_venvs
274
+ self.fix: bool = getattr(args, 'fix', False)
265
275
 
266
276
  self.display_stderr = self.lint or self.list_tests
267
277
 
@@ -1,4 +1,5 @@
1
1
  """Connection abstraction for interacting with test hosts."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import abc
@@ -1,4 +1,5 @@
1
1
  """Constants used by ansible-test. Imports should not be used in this file (other than to import the target common constants)."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  from .._util.target.common.constants import (
@@ -1,4 +1,5 @@
1
1
  """High level functions for working with containers."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import collections.abc as c
@@ -1,4 +1,5 @@
1
1
  """Content configuration."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import os
@@ -1,4 +1,5 @@
1
1
  """Access Ansible Core CI remote services."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import abc
@@ -1,4 +1,5 @@
1
1
  """Utility code for facilitating collection of code coverage when running tests."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import dataclasses
@@ -246,7 +247,7 @@ def generate_coverage_config(args: TestConfig) -> str:
246
247
 
247
248
  def generate_ansible_coverage_config() -> str:
248
249
  """Generate code coverage configuration for Ansible tests."""
249
- coverage_config = '''
250
+ coverage_config = """
250
251
  [run]
251
252
  branch = True
252
253
  concurrency =
@@ -262,14 +263,14 @@ omit =
262
263
  */pytest
263
264
  */AnsiballZ_*.py
264
265
  */test/results/*
265
- '''
266
+ """
266
267
 
267
268
  return coverage_config
268
269
 
269
270
 
270
271
  def generate_collection_coverage_config(args: TestConfig) -> str:
271
272
  """Generate code coverage configuration for Ansible Collection tests."""
272
- coverage_config = '''
273
+ coverage_config = """
273
274
  [run]
274
275
  branch = True
275
276
  concurrency =
@@ -278,28 +279,28 @@ concurrency =
278
279
  parallel = True
279
280
  disable_warnings =
280
281
  no-data-collected
281
- '''
282
+ """
282
283
 
283
284
  if isinstance(args, IntegrationConfig):
284
- coverage_config += '''
285
+ coverage_config += """
285
286
  include =
286
287
  %s/*
287
288
  */%s/*
288
- ''' % (data_context().content.root, data_context().content.collection.directory)
289
+ """ % (data_context().content.root, data_context().content.collection.directory)
289
290
  elif isinstance(args, SanityConfig):
290
291
  # temporary work-around for import sanity test
291
- coverage_config += '''
292
+ coverage_config += """
292
293
  include =
293
294
  %s/*
294
295
 
295
296
  omit =
296
297
  %s/*
297
- ''' % (data_context().content.root, os.path.join(data_context().content.root, data_context().content.results_path))
298
+ """ % (data_context().content.root, os.path.join(data_context().content.root, data_context().content.results_path))
298
299
  else:
299
- coverage_config += '''
300
+ coverage_config += """
300
301
  include =
301
302
  %s/*
302
- ''' % data_context().content.root
303
+ """ % data_context().content.root
303
304
 
304
305
  return coverage_config
305
306
 
@@ -1,4 +1,5 @@
1
1
  """Context information for the current invocation of ansible-test."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import collections.abc as c