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,42 +1,39 @@
1
1
  # (c) 2012-2014, Michael DeHaan <michael.dehaan@gmail.com>
2
- #
3
- # This file is part of Ansible
4
- #
5
- # Ansible is free software: you can redistribute it and/or modify
6
- # it under the terms of the GNU General Public License as published by
7
- # the Free Software Foundation, either version 3 of the License, or
8
- # (at your option) any later version.
9
- #
10
- # Ansible is distributed in the hope that it will be useful,
11
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- # GNU General Public License for more details.
14
- #
15
- # You should have received a copy of the GNU General Public License
16
- # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
2
+ # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
17
3
 
18
4
  from __future__ import annotations
19
5
 
20
- import re
21
- import traceback
6
+ import collections.abc as _c
7
+ import enum
8
+ import types
9
+ import typing as t
22
10
 
23
- from collections.abc import Sequence
11
+ from json import JSONDecodeError
24
12
 
25
- from ansible.errors.yaml_strings import (
26
- YAML_COMMON_DICT_ERROR,
27
- YAML_COMMON_LEADING_TAB_ERROR,
28
- YAML_COMMON_PARTIALLY_QUOTED_LINE_ERROR,
29
- YAML_COMMON_UNBALANCED_QUOTES_ERROR,
30
- YAML_COMMON_UNQUOTED_COLON_ERROR,
31
- YAML_COMMON_UNQUOTED_VARIABLE_ERROR,
32
- YAML_POSITION_DETAILS,
33
- YAML_AND_SHORTHAND_ERROR,
34
- )
35
- from ansible.module_utils.common.text.converters import to_native, to_text
13
+ from ansible.module_utils.common.text.converters import to_text
14
+ from ..module_utils.datatag import native_type_name
15
+ from ansible._internal._datatag import _tags
16
+ from .._internal._errors import _error_utils
17
+ from ansible.module_utils._internal import _text_utils
18
+
19
+ if t.TYPE_CHECKING:
20
+ from ansible.plugins import loader as _t_loader
21
+
22
+
23
+ class ExitCode(enum.IntEnum):
24
+ SUCCESS = 0 # used by TQM, must be bit-flag safe
25
+ GENERIC_ERROR = 1 # used by TQM, must be bit-flag safe
26
+ HOST_FAILED = 2 # TQM-sourced, must be bit-flag safe
27
+ HOST_UNREACHABLE = 4 # TQM-sourced, must be bit-flag safe
28
+ PARSER_ERROR = 4 # FIXME: CLI-sourced, conflicts with HOST_UNREACHABLE
29
+ INVALID_CLI_OPTION = 5
30
+ UNICODE_ERROR = 6 # obsolete, no longer used
31
+ KEYBOARD_INTERRUPT = 99
32
+ UNKNOWN_ERROR = 250
36
33
 
37
34
 
38
35
  class AnsibleError(Exception):
39
- '''
36
+ """
40
37
  This is the base class for all errors raised from Ansible code,
41
38
  and can be instantiated with two optional parameters beyond the
42
39
  error message to control whether detailed information is displayed
@@ -44,257 +41,282 @@ class AnsibleError(Exception):
44
41
 
45
42
  Usage:
46
43
 
47
- raise AnsibleError('some message here', obj=obj, show_content=True)
48
-
49
- Where "obj" is some subclass of ansible.parsing.yaml.objects.AnsibleBaseYAMLObject,
50
- which should be returned by the DataLoader() class.
51
- '''
52
-
53
- def __init__(self, message="", obj=None, show_content=True, suppress_extended_error=False, orig_exc=None):
54
- super(AnsibleError, self).__init__(message)
44
+ raise AnsibleError('some message here', obj=obj)
45
+
46
+ Where "obj" may be tagged with Origin to provide context for error messages.
47
+ """
48
+
49
+ _exit_code = ExitCode.GENERIC_ERROR
50
+ _default_message = ''
51
+ _default_help_text: str | None = None
52
+ _include_cause_message = True
53
+ """
54
+ When `True`, the exception message will be augmented with cause message(s).
55
+ Subclasses doing complex error analysis can disable this to take responsibility for reporting cause messages as needed.
56
+ """
57
+
58
+ def __init__(
59
+ self,
60
+ message: str = "",
61
+ obj: t.Any = None,
62
+ show_content: bool = True,
63
+ suppress_extended_error: bool | types.EllipsisType = ...,
64
+ orig_exc: BaseException | None = None,
65
+ help_text: str | None = None,
66
+ ) -> None:
67
+ # DTFIX-FUTURE: these fallback cases mask incorrect use of AnsibleError.message, what should we do?
68
+ if message is None:
69
+ message = ''
70
+ elif not isinstance(message, str):
71
+ message = str(message)
72
+
73
+ if self._default_message and message:
74
+ message = _text_utils.concat_message(self._default_message, message)
75
+ elif self._default_message:
76
+ message = self._default_message
77
+ elif not message:
78
+ message = f'Unexpected {type(self).__name__} error.'
79
+
80
+ super().__init__(message)
55
81
 
56
82
  self._show_content = show_content
57
- self._suppress_extended_error = suppress_extended_error
58
- self._message = to_native(message)
83
+ self._message = message
84
+ self._help_text_value = help_text or self._default_help_text
59
85
  self.obj = obj
86
+
87
+ # deprecated: description='deprecate support for orig_exc, callers should use `raise ... from` only' core_version='2.23'
88
+ # deprecated: description='remove support for orig_exc' core_version='2.27'
60
89
  self.orig_exc = orig_exc
61
90
 
62
- @property
63
- def message(self):
64
- # we import this here to prevent an import loop problem,
65
- # since the objects code also imports ansible.errors
66
- from ansible.parsing.yaml.objects import AnsibleBaseYAMLObject
91
+ if suppress_extended_error is not ...:
92
+ from ..utils.display import Display
67
93
 
68
- message = [self._message]
94
+ if suppress_extended_error:
95
+ self._show_content = False
69
96
 
70
- # Add from previous exceptions
71
- if self.orig_exc:
72
- message.append('. %s' % to_native(self.orig_exc))
97
+ Display().deprecated(
98
+ msg=f"The `suppress_extended_error` argument to `{type(self).__name__}` is deprecated.",
99
+ version="2.23",
100
+ help_text="Use `show_content=False` instead.",
101
+ )
73
102
 
74
- # Add from yaml to give specific file/line no
75
- if isinstance(self.obj, AnsibleBaseYAMLObject):
76
- extended_error = self._get_extended_error()
77
- if extended_error and not self._suppress_extended_error:
78
- message.append(
79
- '\n\n%s' % to_native(extended_error)
80
- )
103
+ @property
104
+ def _original_message(self) -> str:
105
+ return self._message
81
106
 
82
- return ''.join(message)
107
+ @property
108
+ def message(self) -> str:
109
+ """
110
+ Return the original message with cause message(s) appended.
111
+ The cause will not be followed on any `AnsibleError` with `_include_cause_message=False`.
112
+ """
113
+ return _error_utils.format_exception_message(self)
83
114
 
84
115
  @message.setter
85
- def message(self, val):
116
+ def message(self, val) -> None:
86
117
  self._message = val
87
118
 
88
- def __str__(self):
89
- return self.message
119
+ @property
120
+ def _formatted_source_context(self) -> str | None:
121
+ with _error_utils.RedactAnnotatedSourceContext.when(not self._show_content):
122
+ if source_context := _error_utils.SourceContext.from_value(self.obj):
123
+ return str(source_context)
124
+
125
+ return None
90
126
 
91
- def __repr__(self):
127
+ @property
128
+ def _help_text(self) -> str | None:
129
+ return self._help_text_value
130
+
131
+ @_help_text.setter
132
+ def _help_text(self, value: str | None) -> None:
133
+ self._help_text_value = value
134
+
135
+ def __str__(self) -> str:
92
136
  return self.message
93
137
 
94
- def _get_error_lines_from_file(self, file_name, line_number):
95
- '''
96
- Returns the line in the file which corresponds to the reported error
97
- location, as well as the line preceding it (if the error did not
98
- occur on the first line), to provide context to the error.
99
- '''
100
-
101
- target_line = ''
102
- prev_line = ''
103
-
104
- with open(file_name, 'r') as f:
105
- lines = f.readlines()
106
-
107
- # In case of a YAML loading error, PyYAML will report the very last line
108
- # as the location of the error. Avoid an index error here in order to
109
- # return a helpful message.
110
- file_length = len(lines)
111
- if line_number >= file_length:
112
- line_number = file_length - 1
113
-
114
- # If target_line contains only whitespace, move backwards until
115
- # actual code is found. If there are several empty lines after target_line,
116
- # the error lines would just be blank, which is not very helpful.
117
- target_line = lines[line_number]
118
- while not target_line.strip():
119
- line_number -= 1
120
- target_line = lines[line_number]
121
-
122
- if line_number > 0:
123
- prev_line = lines[line_number - 1]
124
-
125
- return (target_line, prev_line)
126
-
127
- def _get_extended_error(self):
128
- '''
129
- Given an object reporting the location of the exception in a file, return
130
- detailed information regarding it including:
131
-
132
- * the line which caused the error as well as the one preceding it
133
- * causes and suggested remedies for common syntax errors
134
-
135
- If this error was created with show_content=False, the reporting of content
136
- is suppressed, as the file contents may be sensitive (ie. vault data).
137
- '''
138
-
139
- error_message = ''
140
-
141
- try:
142
- (src_file, line_number, col_number) = self.obj.ansible_pos
143
- error_message += YAML_POSITION_DETAILS % (src_file, line_number, col_number)
144
- if src_file not in ('<string>', '<unicode>') and self._show_content:
145
- (target_line, prev_line) = self._get_error_lines_from_file(src_file, line_number - 1)
146
- target_line = to_text(target_line)
147
- prev_line = to_text(prev_line)
148
- if target_line:
149
- stripped_line = target_line.replace(" ", "")
150
-
151
- # Check for k=v syntax in addition to YAML syntax and set the appropriate error position,
152
- # arrow index
153
- if re.search(r'\w+(\s+)?=(\s+)?[\w/-]+', prev_line):
154
- error_position = prev_line.rstrip().find('=')
155
- arrow_line = (" " * error_position) + "^ here"
156
- error_message = YAML_POSITION_DETAILS % (src_file, line_number - 1, error_position + 1)
157
- error_message += "\nThe offending line appears to be:\n\n%s\n%s\n\n" % (prev_line.rstrip(), arrow_line)
158
- error_message += YAML_AND_SHORTHAND_ERROR
159
- else:
160
- arrow_line = (" " * (col_number - 1)) + "^ here"
161
- error_message += "\nThe offending line appears to be:\n\n%s\n%s\n%s\n" % (prev_line.rstrip(), target_line.rstrip(), arrow_line)
162
-
163
- # TODO: There may be cases where there is a valid tab in a line that has other errors.
164
- if '\t' in target_line:
165
- error_message += YAML_COMMON_LEADING_TAB_ERROR
166
- # common error/remediation checking here:
167
- # check for unquoted vars starting lines
168
- if ('{{' in target_line and '}}' in target_line) and ('"{{' not in target_line or "'{{" not in target_line):
169
- error_message += YAML_COMMON_UNQUOTED_VARIABLE_ERROR
170
- # check for common dictionary mistakes
171
- elif ":{{" in stripped_line and "}}" in stripped_line:
172
- error_message += YAML_COMMON_DICT_ERROR
173
- # check for common unquoted colon mistakes
174
- elif (len(target_line) and
175
- len(target_line) > 1 and
176
- len(target_line) > col_number and
177
- target_line[col_number] == ":" and
178
- target_line.count(':') > 1):
179
- error_message += YAML_COMMON_UNQUOTED_COLON_ERROR
180
- # otherwise, check for some common quoting mistakes
181
- else:
182
- # FIXME: This needs to split on the first ':' to account for modules like lineinfile
183
- # that may have lines that contain legitimate colons, e.g., line: 'i ALL= (ALL) NOPASSWD: ALL'
184
- # and throw off the quote matching logic.
185
- parts = target_line.split(":")
186
- if len(parts) > 1:
187
- middle = parts[1].strip()
188
- match = False
189
- unbalanced = False
190
-
191
- if middle.startswith("'") and not middle.endswith("'"):
192
- match = True
193
- elif middle.startswith('"') and not middle.endswith('"'):
194
- match = True
195
-
196
- if (len(middle) > 0 and
197
- middle[0] in ['"', "'"] and
198
- middle[-1] in ['"', "'"] and
199
- target_line.count("'") > 2 or
200
- target_line.count('"') > 2):
201
- unbalanced = True
202
-
203
- if match:
204
- error_message += YAML_COMMON_PARTIALLY_QUOTED_LINE_ERROR
205
- if unbalanced:
206
- error_message += YAML_COMMON_UNBALANCED_QUOTES_ERROR
207
-
208
- except (IOError, TypeError):
209
- error_message += '\n(could not open file to display line)'
210
- except IndexError:
211
- error_message += '\n(specified line no longer in file, maybe it changed?)'
212
-
213
- return error_message
138
+ def __getstate__(self) -> dict[str, t.Any]:
139
+ """Augment object.__getstate__ to preserve additional values not represented in BaseException.__dict__."""
140
+ state = t.cast(dict[str, t.Any], super().__getstate__())
141
+ state.update(
142
+ args=self.args,
143
+ __cause__=self.__cause__,
144
+ __context__=self.__context__,
145
+ __suppress_context__=self.__suppress_context__,
146
+ )
147
+
148
+ return state
149
+
150
+ def __reduce__(self) -> tuple[t.Callable, tuple[type], dict[str, t.Any]]:
151
+ """
152
+ Enable copy/pickle of AnsibleError derived types by correcting for BaseException's ancient C __reduce__ impl that:
153
+
154
+ * requires use of a type constructor with positional args
155
+ * assumes positional args are passed through from the derived type __init__ to BaseException.__init__ unmodified
156
+ * does not propagate args/__cause__/__context__/__suppress_context__
157
+
158
+ NOTE: This does not preserve the dunder attributes on non-AnsibleError derived cause/context exceptions.
159
+ As a result, copy/pickle will discard chained exceptions after the first non-AnsibleError cause/context.
160
+ """
161
+ return type(self).__new__, (type(self),), self.__getstate__()
162
+
163
+
164
+ class AnsibleUndefinedConfigEntry(AnsibleError):
165
+ """The requested config entry is not defined."""
166
+
167
+
168
+ class AnsibleTaskError(AnsibleError):
169
+ """Task execution failed; provides contextual information about the task."""
170
+
171
+ _default_message = 'Task failed.'
214
172
 
215
173
 
216
174
  class AnsiblePromptInterrupt(AnsibleError):
217
- '''User interrupt'''
175
+ """User interrupt."""
218
176
 
219
177
 
220
178
  class AnsiblePromptNoninteractive(AnsibleError):
221
- '''Unable to get user input'''
179
+ """Unable to get user input."""
222
180
 
223
181
 
224
182
  class AnsibleAssertionError(AnsibleError, AssertionError):
225
- '''Invalid assertion'''
226
- pass
183
+ """Invalid assertion."""
227
184
 
228
185
 
229
186
  class AnsibleOptionsError(AnsibleError):
230
- ''' bad or incomplete options passed '''
231
- pass
187
+ """Invalid options were passed."""
188
+
189
+ # FIXME: This exception is used for many non-CLI related errors.
190
+ # The few cases which are CLI related should really be handled by argparse instead, at which point the exit code here can be removed.
191
+ _exit_code = ExitCode.INVALID_CLI_OPTION
232
192
 
233
193
 
234
194
  class AnsibleRequiredOptionError(AnsibleOptionsError):
235
- ''' bad or incomplete options passed '''
236
- pass
195
+ """Bad or incomplete options passed."""
237
196
 
238
197
 
239
198
  class AnsibleParserError(AnsibleError):
240
- ''' something was detected early that is wrong about a playbook or data file '''
241
- pass
199
+ """A playbook or data file could not be parsed."""
200
+
201
+ _exit_code = ExitCode.PARSER_ERROR
202
+
203
+
204
+ class AnsibleFieldAttributeError(AnsibleParserError):
205
+ """Errors caused during field attribute processing."""
206
+
207
+
208
+ class AnsibleJSONParserError(AnsibleParserError):
209
+ """JSON-specific parsing failure wrapping an exception raised by the JSON parser."""
210
+
211
+ _default_message = 'JSON parsing failed.'
212
+ _include_cause_message = False # hide the underlying cause message, it's included by `handle_exception` as needed
213
+
214
+ @classmethod
215
+ def handle_exception(cls, exception: Exception, origin: _tags.Origin) -> t.NoReturn:
216
+ if isinstance(exception, JSONDecodeError):
217
+ origin = origin.replace(line_num=exception.lineno, col_num=exception.colno)
218
+
219
+ message = str(exception)
220
+
221
+ error = cls(message, obj=origin)
222
+
223
+ raise error from exception
242
224
 
243
225
 
244
226
  class AnsibleInternalError(AnsibleError):
245
- ''' internal safeguards tripped, something happened in the code that should never happen '''
246
- pass
227
+ """Internal safeguards tripped, something happened in the code that should never happen."""
247
228
 
248
229
 
249
230
  class AnsibleRuntimeError(AnsibleError):
250
- ''' ansible had a problem while running a playbook '''
251
- pass
231
+ """Ansible had a problem while running a playbook."""
252
232
 
253
233
 
254
234
  class AnsibleModuleError(AnsibleRuntimeError):
255
- ''' a module failed somehow '''
256
- pass
235
+ """A module failed somehow."""
236
+
237
+
238
+ class AnsibleConnectionFailure(AnsibleRuntimeError, _error_utils.ContributesToTaskResult):
239
+ """
240
+ The transport / connection_plugin had a fatal error.
257
241
 
242
+ This exception provides a result dictionary via the ContributesToTaskResult mixin.
243
+ """
258
244
 
259
- class AnsibleConnectionFailure(AnsibleRuntimeError):
260
- ''' the transport / connection_plugin had a fatal error '''
261
- pass
245
+ @property
246
+ def result_contribution(self) -> t.Mapping[str, object]:
247
+ return dict(unreachable=True)
248
+
249
+ @property
250
+ def omit_failed_key(self) -> bool:
251
+ return True
262
252
 
263
253
 
264
254
  class AnsibleAuthenticationFailure(AnsibleConnectionFailure):
265
- '''invalid username/password/key'''
266
- pass
255
+ """Invalid username/password/key."""
256
+
257
+ _default_message = "Failed to authenticate."
267
258
 
268
259
 
269
260
  class AnsibleCallbackError(AnsibleRuntimeError):
270
- ''' a callback failure '''
271
- pass
261
+ """A callback failure."""
272
262
 
273
263
 
274
264
  class AnsibleTemplateError(AnsibleRuntimeError):
275
- '''A template related error'''
276
- pass
265
+ """A template related error."""
266
+
267
+
268
+ class TemplateTrustCheckFailedError(AnsibleTemplateError):
269
+ """Raised when processing was requested on an untrusted template or expression."""
270
+
271
+ _default_message = 'Encountered untrusted template or expression.'
272
+ _default_help_text = ('Templates and expressions must be defined by trusted sources such as playbooks or roles, '
273
+ 'not untrusted sources such as module results.')
274
+
277
275
 
276
+ class AnsibleTemplateTransformLimitError(AnsibleTemplateError):
277
+ """The internal template transform limit was exceeded."""
278
278
 
279
- class AnsibleFilterError(AnsibleTemplateError):
280
- ''' a templating failure '''
281
- pass
279
+ _default_message = "Template transform limit exceeded."
282
280
 
283
281
 
284
- class AnsibleLookupError(AnsibleTemplateError):
285
- ''' a lookup failure '''
286
- pass
282
+ class AnsibleTemplateSyntaxError(AnsibleTemplateError):
283
+ """A syntax error was encountered while parsing a Jinja template or expression."""
284
+
285
+
286
+ class AnsibleBrokenConditionalError(AnsibleTemplateError):
287
+ """A broken conditional with non-boolean result was used."""
288
+
289
+ _default_help_text = 'Broken conditionals can be temporarily allowed with the `ALLOW_BROKEN_CONDITIONALS` configuration option.'
287
290
 
288
291
 
289
292
  class AnsibleUndefinedVariable(AnsibleTemplateError):
290
- ''' a templating failure '''
291
- pass
293
+ """An undefined variable was encountered while processing a template or expression."""
294
+
295
+
296
+ class AnsibleValueOmittedError(AnsibleTemplateError):
297
+ """
298
+ Raised when the result of a template operation was the Omit singleton. This exception purposely does
299
+ not derive from AnsibleError to avoid elision of the traceback, since uncaught errors of this type always
300
+ indicate a bug.
301
+ """
302
+
303
+ _default_message = "A template was resolved to an Omit scalar."
304
+ _default_help_text = "Callers must be prepared to handle this value. This is most likely a bug in the code requesting templating."
305
+
306
+
307
+ class AnsibleTemplatePluginError(AnsibleTemplateError):
308
+ """An error sourced by a template plugin (lookup/filter/test)."""
309
+
310
+
311
+ # deprecated: description='add deprecation warnings for these aliases' core_version='2.23'
312
+ AnsibleFilterError = AnsibleTemplatePluginError
313
+ AnsibleLookupError = AnsibleTemplatePluginError
292
314
 
293
315
 
294
316
  class AnsibleFileNotFound(AnsibleRuntimeError):
295
- ''' a file missing failure '''
317
+ """A file missing failure."""
296
318
 
297
- def __init__(self, message="", obj=None, show_content=True, suppress_extended_error=False, orig_exc=None, paths=None, file_name=None):
319
+ def __init__(self, message="", obj=None, show_content=True, suppress_extended_error=..., orig_exc=None, paths=None, file_name=None):
298
320
 
299
321
  self.file_name = file_name
300
322
  self.paths = paths
@@ -306,7 +328,7 @@ class AnsibleFileNotFound(AnsibleRuntimeError):
306
328
  else:
307
329
  message += "Could not find file"
308
330
 
309
- if self.paths and isinstance(self.paths, Sequence):
331
+ if self.paths and isinstance(self.paths, _c.Sequence):
310
332
  searched = to_text('\n\t'.join(self.paths))
311
333
  if message:
312
334
  message += "\n"
@@ -318,71 +340,143 @@ class AnsibleFileNotFound(AnsibleRuntimeError):
318
340
  suppress_extended_error=suppress_extended_error, orig_exc=orig_exc)
319
341
 
320
342
 
321
- # These Exceptions are temporary, using them as flow control until we can get a better solution.
322
- # DO NOT USE as they will probably be removed soon.
323
- # We will port the action modules in our tree to use a context manager instead.
324
- class AnsibleAction(AnsibleRuntimeError):
325
- ''' Base Exception for Action plugin flow control '''
343
+ class AnsibleAction(AnsibleRuntimeError, _error_utils.ContributesToTaskResult):
344
+ """Base Exception for Action plugin flow control."""
326
345
 
327
- def __init__(self, message="", obj=None, show_content=True, suppress_extended_error=False, orig_exc=None, result=None):
346
+ def __init__(self, message="", obj=None, show_content=True, suppress_extended_error=..., orig_exc=None, result=None):
347
+ super().__init__(message=message, obj=obj, show_content=show_content, suppress_extended_error=suppress_extended_error, orig_exc=orig_exc)
328
348
 
329
- super(AnsibleAction, self).__init__(message=message, obj=obj, show_content=show_content,
330
- suppress_extended_error=suppress_extended_error, orig_exc=orig_exc)
331
- if result is None:
332
- self.result = {}
333
- else:
334
- self.result = result
349
+ self._result = result or {}
350
+
351
+ @property
352
+ def result_contribution(self) -> _c.Mapping[str, object]:
353
+ return self._result
354
+
355
+ @property
356
+ def result(self) -> dict[str, object]:
357
+ """Backward compatibility property returning a mutable dictionary."""
358
+ return dict(self.result_contribution)
335
359
 
336
360
 
337
361
  class AnsibleActionSkip(AnsibleAction):
338
- ''' an action runtime skip'''
362
+ """
363
+ An action runtime skip.
339
364
 
340
- def __init__(self, message="", obj=None, show_content=True, suppress_extended_error=False, orig_exc=None, result=None):
341
- super(AnsibleActionSkip, self).__init__(message=message, obj=obj, show_content=show_content,
342
- suppress_extended_error=suppress_extended_error, orig_exc=orig_exc, result=result)
343
- self.result.update({'skipped': True, 'msg': message})
365
+ This exception provides a result dictionary via the ContributesToTaskResult mixin.
366
+ """
367
+
368
+ @property
369
+ def result_contribution(self) -> _c.Mapping[str, object]:
370
+ return self._result | dict(
371
+ skipped=True,
372
+ msg=self.message,
373
+ )
374
+
375
+ @property
376
+ def omit_failed_key(self) -> bool:
377
+ return True
378
+
379
+ @property
380
+ def omit_exception_key(self) -> bool:
381
+ return True
344
382
 
345
383
 
346
384
  class AnsibleActionFail(AnsibleAction):
347
- ''' an action runtime failure'''
348
- def __init__(self, message="", obj=None, show_content=True, suppress_extended_error=False, orig_exc=None, result=None):
349
- super(AnsibleActionFail, self).__init__(message=message, obj=obj, show_content=show_content,
350
- suppress_extended_error=suppress_extended_error, orig_exc=orig_exc, result=result)
351
- self.result.update({'failed': True, 'msg': message, 'exception': traceback.format_exc()})
385
+ """
386
+ An action runtime failure.
387
+
388
+ This exception provides a result dictionary via the ContributesToTaskResult mixin.
389
+ """
352
390
 
391
+ @property
392
+ def result_contribution(self) -> _c.Mapping[str, object]:
393
+ return self._result | dict(
394
+ failed=True,
395
+ msg=self.message,
396
+ )
397
+
398
+
399
+ class _ActionDone(AnsibleAction):
400
+ """
401
+ Imports as `_AnsibleActionDone` are deprecated. An action runtime early exit.
353
402
 
354
- class _AnsibleActionDone(AnsibleAction):
355
- ''' an action runtime early exit'''
356
- pass
403
+ This exception provides a result dictionary via the ContributesToTaskResult mixin.
404
+ """
405
+
406
+ @property
407
+ def omit_failed_key(self) -> bool:
408
+ return not self._result.get('failed')
409
+
410
+ @property
411
+ def omit_exception_key(self) -> bool:
412
+ return not self._result.get('failed')
357
413
 
358
414
 
359
415
  class AnsiblePluginError(AnsibleError):
360
- ''' base class for Ansible plugin-related errors that do not need AnsibleError contextual data '''
361
- def __init__(self, message=None, plugin_load_context=None):
362
- super(AnsiblePluginError, self).__init__(message)
416
+ """Base class for Ansible plugin-related errors that do not need AnsibleError contextual data."""
417
+
418
+ def __init__(self, message: str | None = None, plugin_load_context: _t_loader.PluginLoadContext | None = None, help_text: str | None = None) -> None:
419
+ super(AnsiblePluginError, self).__init__(message, help_text=help_text)
420
+
363
421
  self.plugin_load_context = plugin_load_context
364
422
 
365
423
 
366
424
  class AnsiblePluginRemovedError(AnsiblePluginError):
367
- ''' a requested plugin has been removed '''
368
- pass
425
+ """A requested plugin has been removed."""
369
426
 
370
427
 
371
428
  class AnsiblePluginCircularRedirect(AnsiblePluginError):
372
- '''a cycle was detected in plugin redirection'''
373
- pass
429
+ """A cycle was detected in plugin redirection."""
374
430
 
375
431
 
376
432
  class AnsibleCollectionUnsupportedVersionError(AnsiblePluginError):
377
- '''a collection is not supported by this version of Ansible'''
378
- pass
433
+ """A collection is not supported by this version of Ansible."""
379
434
 
380
435
 
381
- class AnsibleFilterTypeError(AnsibleTemplateError, TypeError):
382
- ''' a Jinja filter templating failure due to bad type'''
383
- pass
436
+ class AnsibleTypeError(AnsibleRuntimeError, TypeError):
437
+ """Ansible-augmented TypeError subclass."""
384
438
 
385
439
 
386
440
  class AnsiblePluginNotFound(AnsiblePluginError):
387
- ''' Indicates we did not find an Ansible plugin '''
388
- pass
441
+ """Indicates we did not find an Ansible plugin."""
442
+
443
+
444
+ class AnsibleConditionalError(AnsibleRuntimeError):
445
+ """Errors related to failed conditional expression evaluation."""
446
+
447
+
448
+ class AnsibleVariableTypeError(AnsibleRuntimeError):
449
+ """An error due to attempted storage of an unsupported variable type."""
450
+
451
+ @classmethod
452
+ def from_value(cls, *, obj: t.Any) -> t.Self:
453
+ # avoid an incorrect error message when `obj` is a type
454
+ type_name = type(obj).__name__ if isinstance(obj, type) else native_type_name(obj)
455
+
456
+ return cls(message=f'Type {type_name!r} is unsupported for variable storage.', obj=obj)
457
+
458
+
459
+ def __getattr__(name: str) -> t.Any:
460
+ """Inject import-time deprecation warnings."""
461
+ from ..utils.display import Display
462
+
463
+ match name:
464
+ case 'AnsibleFilterTypeError':
465
+ Display().deprecated(
466
+ msg=f"Importing {name!r} is deprecated.",
467
+ help_text=f"Import {AnsibleTypeError.__name__!r} instead.",
468
+ version="2.23",
469
+ )
470
+
471
+ return AnsibleTypeError
472
+
473
+ case '_AnsibleActionDone':
474
+ Display().deprecated(
475
+ msg=f"Importing {name!r} is deprecated.",
476
+ help_text="Return directly from action plugins instead.",
477
+ version="2.23",
478
+ )
479
+
480
+ return _ActionDone
481
+
482
+ raise AttributeError(f'module {__name__!r} has no attribute {name!r}')