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
ansible/cli/console.py CHANGED
@@ -29,13 +29,14 @@ from ansible.plugins.list import list_plugins
29
29
  from ansible.plugins.loader import module_loader, fragment_loader
30
30
  from ansible.utils import plugin_docs
31
31
  from ansible.utils.color import stringc
32
+ from ansible._internal._datatag._tags import TrustedAsTemplate
32
33
  from ansible.utils.display import Display
33
34
 
34
35
  display = Display()
35
36
 
36
37
 
37
38
  class ConsoleCLI(CLI, cmd.Cmd):
38
- '''
39
+ """
39
40
  A REPL that allows for running ad-hoc tasks against a chosen inventory
40
41
  from a nice shell with built-in tab completion (based on dominis'
41
42
  ``ansible-shell``).
@@ -62,7 +63,7 @@ class ConsoleCLI(CLI, cmd.Cmd):
62
63
  - ``help [command/module]``: display documentation for
63
64
  the command or module
64
65
  - ``exit``: exit ``ansible-console``
65
- '''
66
+ """
66
67
 
67
68
  name = 'ansible-console'
68
69
  modules = [] # type: list[str] | None
@@ -72,6 +73,8 @@ class ConsoleCLI(CLI, cmd.Cmd):
72
73
  # use specific to console, but fallback to highlight for backwards compatibility
73
74
  NORMAL_PROMPT = C.COLOR_CONSOLE_PROMPT or C.COLOR_HIGHLIGHT
74
75
 
76
+ USES_CONNECTION = True
77
+
75
78
  def __init__(self, args):
76
79
 
77
80
  super(ConsoleCLI, self).__init__(args)
@@ -179,6 +182,8 @@ class ConsoleCLI(CLI, cmd.Cmd):
179
182
  else:
180
183
  module_args = ''
181
184
 
185
+ module_args = TrustedAsTemplate().tag(module_args)
186
+
182
187
  if self.callback:
183
188
  cb = self.callback
184
189
  elif C.DEFAULT_LOAD_CALLBACK_PLUGINS and C.DEFAULT_STDOUT_CALLBACK != 'default':
@@ -189,7 +194,7 @@ class ConsoleCLI(CLI, cmd.Cmd):
189
194
  result = None
190
195
  try:
191
196
  check_raw = module in C._ACTION_ALLOWS_RAW_ARGS
192
- task = dict(action=dict(module=module, args=parse_kv(module_args, check_raw=check_raw)), timeout=self.task_timeout)
197
+ task = dict(action=module, args=parse_kv(module_args, check_raw=check_raw), timeout=self.task_timeout)
193
198
  play_ds = dict(
194
199
  name="Ansible Shell",
195
200
  hosts=self.cwd,
@@ -217,7 +222,7 @@ class ConsoleCLI(CLI, cmd.Cmd):
217
222
  variable_manager=self.variable_manager,
218
223
  loader=self.loader,
219
224
  passwords=self.passwords,
220
- stdout_callback=cb,
225
+ stdout_callback_name=cb,
221
226
  run_additional_callbacks=C.DEFAULT_LOAD_CALLBACK_PLUGINS,
222
227
  run_tree=False,
223
228
  forks=self.forks,
@@ -237,11 +242,8 @@ class ConsoleCLI(CLI, cmd.Cmd):
237
242
  except KeyboardInterrupt:
238
243
  display.error('User interrupted execution')
239
244
  return False
240
- except Exception as e:
241
- if self.verbosity >= 3:
242
- import traceback
243
- display.v(traceback.format_exc())
244
- display.error(to_text(e))
245
+ except Exception as ex:
246
+ display.error(ex)
245
247
  return False
246
248
 
247
249
  def emptyline(self):
@@ -571,7 +573,7 @@ class ConsoleCLI(CLI, cmd.Cmd):
571
573
  histfile = os.path.join(os.path.expanduser("~"), ".ansible-console_history")
572
574
  try:
573
575
  readline.read_history_file(histfile)
574
- except IOError:
576
+ except OSError:
575
577
  pass
576
578
 
577
579
  atexit.register(readline.write_history_file, histfile)
@@ -579,7 +581,7 @@ class ConsoleCLI(CLI, cmd.Cmd):
579
581
  self.cmdloop()
580
582
 
581
583
  def __getattr__(self, name):
582
- ''' handle not found to populate dynamically a module function if module matching name exists '''
584
+ """ handle not found to populate dynamically a module function if module matching name exists """
583
585
  attr = None
584
586
 
585
587
  if name.startswith('do_'):
ansible/cli/doc.py CHANGED
@@ -9,13 +9,16 @@ from __future__ import annotations
9
9
  # ansible.cli needs to be imported first, to ensure the source bin/* scripts run that code first
10
10
  from ansible.cli import CLI
11
11
 
12
+ import collections.abc
12
13
  import importlib
13
14
  import pkgutil
14
15
  import os
15
16
  import os.path
16
17
  import re
17
18
  import textwrap
18
- import traceback
19
+ import typing as t
20
+
21
+ import yaml
19
22
 
20
23
  import ansible.plugins.loader as plugin_loader
21
24
 
@@ -28,19 +31,22 @@ from ansible.collections.list import list_collection_dirs
28
31
  from ansible.errors import AnsibleError, AnsibleOptionsError, AnsibleParserError, AnsiblePluginNotFound
29
32
  from ansible.module_utils.common.text.converters import to_native, to_text
30
33
  from ansible.module_utils.common.collections import is_sequence
31
- from ansible.module_utils.common.json import json_dump
32
34
  from ansible.module_utils.common.yaml import yaml_dump
33
35
  from ansible.module_utils.six import string_types
34
36
  from ansible.parsing.plugin_docs import read_docstub
35
- from ansible.parsing.utils.yaml import from_yaml
36
37
  from ansible.parsing.yaml.dumper import AnsibleDumper
37
- from ansible.plugins.list import list_plugins
38
+ from ansible.parsing.yaml.loader import AnsibleLoader
39
+ from ansible._internal._yaml._loader import AnsibleInstrumentedLoader
40
+ from ansible.plugins.list import _list_plugins_with_info, _PluginDocMetadata
38
41
  from ansible.plugins.loader import action_loader, fragment_loader
39
42
  from ansible.utils.collection_loader import AnsibleCollectionConfig, AnsibleCollectionRef
40
43
  from ansible.utils.collection_loader._collection_finder import _get_collection_name_from_path
41
44
  from ansible.utils.color import stringc
42
45
  from ansible.utils.display import Display
43
46
  from ansible.utils.plugin_docs import get_plugin_docs, get_docstring, get_versioned_doclink
47
+ from ansible.template import trust_as_template
48
+ from ansible._internal import _json
49
+ from ansible._internal._templating import _jinja_plugins
44
50
 
45
51
  display = Display()
46
52
 
@@ -83,10 +89,9 @@ ref_style = {
83
89
 
84
90
  def jdump(text):
85
91
  try:
86
- display.display(json_dump(text))
87
- except TypeError as e:
88
- display.vvv(traceback.format_exc())
89
- raise AnsibleError('We could not convert all the documentation into JSON as there was a conversion issue: %s' % to_native(e))
92
+ display.display(_json.json_dumps_formatted(text))
93
+ except TypeError as ex:
94
+ raise AnsibleError('We could not convert all the documentation into JSON as there was a conversion issue.') from ex
90
95
 
91
96
 
92
97
  class RoleMixin(object):
@@ -104,7 +109,7 @@ class RoleMixin(object):
104
109
  """ Load and process the YAML for the first found of a set of role files
105
110
 
106
111
  :param str root: The root path to get the files from
107
- :param str files: List of candidate file names in order of precedence
112
+ :param list files: List of candidate file names in order of precedence
108
113
  :param str role_name: The name of the role for which we want the argspec data.
109
114
  :param str collection: collection name or None in case of stand alone roles
110
115
 
@@ -117,6 +122,7 @@ class RoleMixin(object):
117
122
  meta_path = os.path.join(root, 'meta')
118
123
 
119
124
  # Check all potential spec files
125
+ path = None
120
126
  for specfile in files:
121
127
  full_path = os.path.join(meta_path, specfile)
122
128
  if os.path.exists(full_path):
@@ -128,11 +134,11 @@ class RoleMixin(object):
128
134
 
129
135
  try:
130
136
  with open(path, 'r') as f:
131
- data = from_yaml(f.read(), file_name=path)
137
+ data = yaml.load(trust_as_template(f), Loader=AnsibleLoader)
132
138
  if data is None:
133
139
  data = {}
134
- except (IOError, OSError) as e:
135
- raise AnsibleParserError("Could not read the role '%s' (at %s)" % (role_name, path), orig_exc=e)
140
+ except OSError as ex:
141
+ raise AnsibleParserError(f"Could not read the role {role_name!r} at {path!r}.") from ex
136
142
 
137
143
  return data
138
144
 
@@ -409,7 +415,7 @@ def _doclink(url):
409
415
 
410
416
  def _format(string, *args):
411
417
 
412
- ''' add ascii formatting or delimiters '''
418
+ """ add ascii formatting or delimiters """
413
419
 
414
420
  for style in args:
415
421
 
@@ -433,10 +439,10 @@ def _format(string, *args):
433
439
 
434
440
 
435
441
  class DocCLI(CLI, RoleMixin):
436
- ''' displays information on modules installed in Ansible libraries.
442
+ """ displays information on modules installed in Ansible libraries.
437
443
  It displays a terse listing of plugins and their short descriptions,
438
444
  provides a printout of their DOCUMENTATION strings,
439
- and it can create a short "snippet" which can be pasted into a playbook. '''
445
+ and it can create a short "snippet" which can be pasted into a playbook. """
440
446
 
441
447
  name = 'ansible-doc'
442
448
 
@@ -696,16 +702,16 @@ class DocCLI(CLI, RoleMixin):
696
702
  display.warning("Skipping role '%s' due to: %s" % (role, role_json[role]['error']), True)
697
703
  continue
698
704
  text += self.get_role_man_text(role, role_json[role])
699
- except AnsibleParserError as e:
705
+ except AnsibleError as ex:
700
706
  # TODO: warn and skip role?
701
- raise AnsibleParserError("Role '%s" % (role), orig_exc=e)
707
+ raise AnsibleParserError(f"Error extracting role docs from {role!r}.") from ex
702
708
 
703
709
  # display results
704
710
  DocCLI.pager("\n".join(text))
705
711
 
706
712
  @staticmethod
707
713
  def _list_keywords():
708
- return from_yaml(pkgutil.get_data('ansible', 'keyword_desc.yml'))
714
+ return yaml.load(pkgutil.get_data('ansible', 'keyword_desc.yml'), Loader=AnsibleInstrumentedLoader)
709
715
 
710
716
  @staticmethod
711
717
  def _get_keywords_docs(keys):
@@ -768,10 +774,8 @@ class DocCLI(CLI, RoleMixin):
768
774
 
769
775
  data[key] = kdata
770
776
 
771
- except (AttributeError, KeyError) as e:
772
- display.warning("Skipping Invalid keyword '%s' specified: %s" % (key, to_text(e)))
773
- if display.verbosity >= 3:
774
- display.verbose(traceback.format_exc())
777
+ except (AttributeError, KeyError) as ex:
778
+ display.error_as_warning(f'Skipping invalid keyword {key!r}.', ex)
775
779
 
776
780
  return data
777
781
 
@@ -787,48 +791,63 @@ class DocCLI(CLI, RoleMixin):
787
791
  return coll_filter
788
792
 
789
793
  def _list_plugins(self, plugin_type, content):
790
-
791
- results = {}
792
- self.plugins = {}
793
- loader = DocCLI._prep_loader(plugin_type)
794
+ DocCLI._prep_loader(plugin_type)
794
795
 
795
796
  coll_filter = self._get_collection_filter()
796
- self.plugins.update(list_plugins(plugin_type, coll_filter))
797
+ plugins = _list_plugins_with_info(plugin_type, coll_filter)
798
+
799
+ # Remove the internal ansible._protomatter plugins if getting all plugins
800
+ if not coll_filter:
801
+ plugins = {k: v for k, v in plugins.items() if not k.startswith('ansible._protomatter.')}
797
802
 
798
803
  # get appropriate content depending on option
799
804
  if content == 'dir':
800
- results = self._get_plugin_list_descriptions(loader)
805
+ results = self._get_plugin_list_descriptions(plugins)
801
806
  elif content == 'files':
802
- results = {k: self.plugins[k][0] for k in self.plugins.keys()}
807
+ results = {k: v.path for k, v in plugins.items()}
803
808
  else:
804
- results = {k: {} for k in self.plugins.keys()}
809
+ results = {k: {} for k in plugins.keys()}
805
810
  self.plugin_list = set() # reset for next iteration
806
811
 
807
812
  return results
808
813
 
809
- def _get_plugins_docs(self, plugin_type, names, fail_ok=False, fail_on_errors=True):
810
-
814
+ def _get_plugins_docs(self, plugin_type: str, names: collections.abc.Iterable[str], fail_ok: bool = False, fail_on_errors: bool = True) -> dict[str, dict]:
811
815
  loader = DocCLI._prep_loader(plugin_type)
812
816
 
817
+ if plugin_type in ('filter', 'test'):
818
+ jinja2_builtins = _jinja_plugins.get_jinja_builtin_plugin_descriptions(plugin_type)
819
+ jinja2_builtins.update({name.split('.')[-1]: value for name, value in jinja2_builtins.items()}) # add short-named versions for lookup
820
+ else:
821
+ jinja2_builtins = {}
822
+
813
823
  # get the docs for plugins in the command line list
814
824
  plugin_docs = {}
815
825
  for plugin in names:
816
- doc = {}
826
+ doc: dict[str, t.Any] = {}
817
827
  try:
818
- doc, plainexamples, returndocs, metadata = get_plugin_docs(plugin, plugin_type, loader, fragment_loader, (context.CLIARGS['verbosity'] > 0))
828
+ doc, plainexamples, returndocs, metadata = self._get_plugin_docs_with_jinja2_builtins(
829
+ plugin,
830
+ plugin_type,
831
+ loader,
832
+ fragment_loader,
833
+ jinja2_builtins,
834
+ )
819
835
  except AnsiblePluginNotFound as e:
820
836
  display.warning(to_native(e))
821
837
  continue
822
- except Exception as e:
838
+ except Exception as ex:
839
+ msg = "Missing documentation (or could not parse documentation)"
840
+
823
841
  if not fail_on_errors:
824
- plugin_docs[plugin] = {'error': 'Missing documentation or could not parse documentation: %s' % to_native(e)}
842
+ plugin_docs[plugin] = {'error': f'{msg}: {ex}.'}
825
843
  continue
826
- display.vvv(traceback.format_exc())
827
- msg = "%s %s missing documentation (or could not parse documentation): %s\n" % (plugin_type, plugin, to_native(e))
844
+
845
+ msg = f"{plugin_type} {plugin} {msg}"
846
+
828
847
  if fail_ok:
829
- display.warning(msg)
848
+ display.warning(f'{msg}: {ex}')
830
849
  else:
831
- raise AnsibleError(msg)
850
+ raise AnsibleError(f'{msg}.') from ex
832
851
 
833
852
  if not doc:
834
853
  # The doc section existed but was empty
@@ -840,24 +859,57 @@ class DocCLI(CLI, RoleMixin):
840
859
  if not fail_on_errors:
841
860
  # Check whether JSON serialization would break
842
861
  try:
843
- json_dump(docs)
844
- except Exception as e: # pylint:disable=broad-except
845
- plugin_docs[plugin] = {'error': 'Cannot serialize documentation as JSON: %s' % to_native(e)}
862
+ _json.json_dumps_formatted(docs)
863
+ except Exception as ex: # pylint:disable=broad-except
864
+ plugin_docs[plugin] = {'error': f'Cannot serialize documentation as JSON: {ex}'}
846
865
  continue
847
866
 
848
867
  plugin_docs[plugin] = docs
849
868
 
850
869
  return plugin_docs
851
870
 
871
+ def _get_plugin_docs_with_jinja2_builtins(
872
+ self,
873
+ plugin_name: str,
874
+ plugin_type: str,
875
+ loader: t.Any,
876
+ fragment_loader: t.Any,
877
+ jinja_builtins: dict[str, str],
878
+ ) -> tuple[dict, str | None, dict | None, dict | None]:
879
+ try:
880
+ return get_plugin_docs(plugin_name, plugin_type, loader, fragment_loader, (context.CLIARGS['verbosity'] > 0))
881
+ except Exception:
882
+ if (desc := jinja_builtins.get(plugin_name, ...)) is not ...:
883
+ short_name = plugin_name.split('.')[-1]
884
+ long_name = f'ansible.builtin.{short_name}'
885
+ # Dynamically build a doc stub for any Jinja2 builtin plugin we haven't
886
+ # explicitly documented.
887
+ doc = dict(
888
+ collection='ansible.builtin',
889
+ plugin_name=long_name,
890
+ filename='',
891
+ short_description=desc,
892
+ description=[
893
+ desc,
894
+ '',
895
+ f"This is the Jinja builtin {plugin_type} plugin {short_name!r}.",
896
+ f"See: U(https://jinja.palletsprojects.com/en/stable/templates/#jinja-{plugin_type}s.{short_name})",
897
+ ],
898
+ )
899
+
900
+ return doc, None, None, None
901
+
902
+ raise
903
+
852
904
  def _get_roles_path(self):
853
- '''
905
+ """
854
906
  Add any 'roles' subdir in playbook dir to the roles search path.
855
907
  And as a last resort, add the playbook dir itself. Order being:
856
908
  - 'roles' subdir of playbook dir
857
909
  - DEFAULT_ROLES_PATH (default in cliargs)
858
910
  - playbook dir (basedir)
859
911
  NOTE: This matches logic in RoleDefinition._load_role_path() method.
860
- '''
912
+ """
861
913
  roles_path = context.CLIARGS['roles_path']
862
914
  if context.CLIARGS['basedir'] is not None:
863
915
  subdir = os.path.join(context.CLIARGS['basedir'], "roles")
@@ -868,7 +920,7 @@ class DocCLI(CLI, RoleMixin):
868
920
 
869
921
  @staticmethod
870
922
  def _prep_loader(plugin_type):
871
- ''' return a plugint type specific loader '''
923
+ """ return a plugint type specific loader """
872
924
  loader = getattr(plugin_loader, '%s_loader' % plugin_type)
873
925
 
874
926
  # add to plugin paths from command line
@@ -997,10 +1049,10 @@ class DocCLI(CLI, RoleMixin):
997
1049
  def get_all_plugins_of_type(plugin_type):
998
1050
  loader = getattr(plugin_loader, '%s_loader' % plugin_type)
999
1051
  paths = loader._get_paths_with_context()
1000
- plugins = {}
1052
+ plugins = []
1001
1053
  for path_context in paths:
1002
- plugins.update(list_plugins(plugin_type))
1003
- return sorted(plugins.keys())
1054
+ plugins += _list_plugins_with_info(plugin_type).keys()
1055
+ return sorted(plugins)
1004
1056
 
1005
1057
  @staticmethod
1006
1058
  def get_plugin_metadata(plugin_type, plugin_name):
@@ -1015,9 +1067,8 @@ class DocCLI(CLI, RoleMixin):
1015
1067
  try:
1016
1068
  doc, __, __, __ = get_docstring(filename, fragment_loader, verbose=(context.CLIARGS['verbosity'] > 0),
1017
1069
  collection_name=collection_name, plugin_type=plugin_type)
1018
- except Exception:
1019
- display.vvv(traceback.format_exc())
1020
- raise AnsibleError("%s %s at %s has a documentation formatting error or is missing documentation." % (plugin_type, plugin_name, filename))
1070
+ except Exception as ex:
1071
+ raise AnsibleError(f"{plugin_type} {plugin_name} at {filename!r} has a documentation formatting error or is missing documentation.") from ex
1021
1072
 
1022
1073
  if doc is None:
1023
1074
  # Removed plugins don't have any documentation
@@ -1058,7 +1109,7 @@ class DocCLI(CLI, RoleMixin):
1058
1109
 
1059
1110
  @staticmethod
1060
1111
  def format_snippet(plugin, plugin_type, doc):
1061
- ''' return heavily commented plugin use to insert into play '''
1112
+ """ return heavily commented plugin use to insert into play """
1062
1113
  if plugin_type == 'inventory' and doc.get('options', {}).get('plugin'):
1063
1114
  # these do not take a yaml config that we can write a snippet for
1064
1115
  raise ValueError('The {0} inventory plugin does not take YAML type config source'
@@ -1093,24 +1144,25 @@ class DocCLI(CLI, RoleMixin):
1093
1144
 
1094
1145
  try:
1095
1146
  text = DocCLI.get_man_text(doc, collection_name, plugin_type)
1096
- except Exception as e:
1097
- display.vvv(traceback.format_exc())
1098
- raise AnsibleError("Unable to retrieve documentation from '%s'" % (plugin), orig_exc=e)
1147
+ except Exception as ex:
1148
+ raise AnsibleError(f"Unable to retrieve documentation from {plugin!r}.") from ex
1099
1149
 
1100
1150
  return text
1101
1151
 
1102
- def _get_plugin_list_descriptions(self, loader):
1152
+ def _get_plugin_list_descriptions(self, plugins: dict[str, _PluginDocMetadata]) -> dict[str, str]:
1103
1153
 
1104
1154
  descs = {}
1105
- for plugin in self.plugins.keys():
1155
+ for plugin, plugin_info in plugins.items():
1106
1156
  # TODO: move to plugin itself i.e: plugin.get_desc()
1107
1157
  doc = None
1108
- filename = Path(to_native(self.plugins[plugin][0]))
1158
+
1109
1159
  docerror = None
1110
- try:
1111
- doc = read_docstub(filename)
1112
- except Exception as e:
1113
- docerror = e
1160
+ if plugin_info.path:
1161
+ filename = Path(to_native(plugin_info.path))
1162
+ try:
1163
+ doc = read_docstub(filename)
1164
+ except Exception as e:
1165
+ docerror = e
1114
1166
 
1115
1167
  # plugin file was empty or had error, lets try other options
1116
1168
  if doc is None:
@@ -1125,9 +1177,15 @@ class DocCLI(CLI, RoleMixin):
1125
1177
  except Exception as e:
1126
1178
  docerror = e
1127
1179
 
1128
- if docerror:
1129
- display.warning("%s has a documentation formatting error: %s" % (plugin, docerror))
1130
- continue
1180
+ # Do a final fallback to see if the plugin is a shadowed Jinja2 plugin
1181
+ # without any explicit documentation.
1182
+ if doc is None and plugin_info.jinja_builtin_short_description:
1183
+ descs[plugin] = plugin_info.jinja_builtin_short_description
1184
+ continue
1185
+
1186
+ if docerror:
1187
+ display.error_as_warning(f"{plugin} has a documentation formatting error.", exception=docerror)
1188
+ continue
1131
1189
 
1132
1190
  if not doc or not isinstance(doc, dict):
1133
1191
  desc = 'UNDOCUMENTED'
@@ -1140,7 +1198,7 @@ class DocCLI(CLI, RoleMixin):
1140
1198
 
1141
1199
  @staticmethod
1142
1200
  def print_paths(finder):
1143
- ''' Returns a string suitable for printing of the search path '''
1201
+ """ Returns a string suitable for printing of the search path """
1144
1202
 
1145
1203
  # Uses a list to get the order right
1146
1204
  ret = []
@@ -1251,7 +1309,7 @@ class DocCLI(CLI, RoleMixin):
1251
1309
  if ignore in item:
1252
1310
  del item[ignore]
1253
1311
 
1254
- # reformat cli optoins
1312
+ # reformat cli options
1255
1313
  if 'cli' in opt and opt['cli']:
1256
1314
  conf['cli'] = []
1257
1315
  for cli in opt['cli']:
@@ -1287,7 +1345,7 @@ class DocCLI(CLI, RoleMixin):
1287
1345
  DocCLI.add_fields(text, subdata, limit, opt_indent + ' ', return_values, opt_indent)
1288
1346
 
1289
1347
  def get_role_man_text(self, role, role_json):
1290
- '''Generate text for the supplied role suitable for display.
1348
+ """Generate text for the supplied role suitable for display.
1291
1349
 
1292
1350
  This is similar to get_man_text(), but roles are different enough that we have
1293
1351
  a separate method for formatting their display.
@@ -1296,7 +1354,7 @@ class DocCLI(CLI, RoleMixin):
1296
1354
  :param role_json: The JSON for the given role as returned from _create_role_doc().
1297
1355
 
1298
1356
  :returns: A array of text suitable for displaying to screen.
1299
- '''
1357
+ """
1300
1358
  text = []
1301
1359
  opt_indent = " "
1302
1360
  pad = display.columns * 0.20
@@ -1333,7 +1391,6 @@ class DocCLI(CLI, RoleMixin):
1333
1391
  'This was unintentionally allowed when plugin attributes were added, '
1334
1392
  'but the feature does not map well to role argument specs.',
1335
1393
  version='2.20',
1336
- collection_name='ansible.builtin',
1337
1394
  )
1338
1395
  text.append("")
1339
1396
  text.append(_format("ATTRIBUTES:", 'bold'))
@@ -1367,7 +1424,7 @@ class DocCLI(CLI, RoleMixin):
1367
1424
  try:
1368
1425
  text.append(yaml_dump(doc.pop('examples'), indent=2, default_flow_style=False))
1369
1426
  except Exception as e:
1370
- raise AnsibleParserError("Unable to parse examples section", orig_exc=e)
1427
+ raise AnsibleParserError("Unable to parse examples section.") from e
1371
1428
 
1372
1429
  return text
1373
1430
 
@@ -1383,7 +1440,7 @@ class DocCLI(CLI, RoleMixin):
1383
1440
  pad = display.columns * 0.20
1384
1441
  limit = max(display.columns - int(pad), 70)
1385
1442
 
1386
- text.append("> %s %s (%s)" % (plugin_type.upper(), _format(doc.pop('plugin_name'), 'bold'), doc.pop('filename')))
1443
+ text.append("> %s %s (%s)" % (plugin_type.upper(), _format(doc.pop('plugin_name'), 'bold'), doc.pop('filename') or 'Jinja2'))
1387
1444
 
1388
1445
  if isinstance(doc['description'], list):
1389
1446
  descs = doc.pop('description')
@@ -1403,9 +1460,9 @@ class DocCLI(CLI, RoleMixin):
1403
1460
  if 'removed_at_date' not in doc['deprecated'] and 'version' in doc['deprecated'] and 'removed_in' not in doc['deprecated']:
1404
1461
  doc['deprecated']['removed_in'] = doc['deprecated']['version']
1405
1462
  try:
1406
- text.append('\t' + C.config.get_deprecated_msg_from_config(doc['deprecated'], True))
1463
+ text.append('\t' + C.config.get_deprecated_msg_from_config(doc['deprecated'], True, collection_name=collection_name))
1407
1464
  except KeyError as e:
1408
- raise AnsibleError("Invalid deprecation documentation structure", orig_exc=e)
1465
+ raise AnsibleError("Invalid deprecation documentation structure.") from e
1409
1466
  else:
1410
1467
  text.append("%s" % doc['deprecated'])
1411
1468
  del doc['deprecated']
@@ -1514,8 +1571,8 @@ class DocCLI(CLI, RoleMixin):
1514
1571
  else:
1515
1572
  try:
1516
1573
  text.append(yaml_dump(doc.pop('plainexamples'), indent=2, default_flow_style=False))
1517
- except Exception as e:
1518
- raise AnsibleParserError("Unable to parse examples section", orig_exc=e)
1574
+ except Exception as ex:
1575
+ raise AnsibleParserError("Unable to parse examples section.") from ex
1519
1576
 
1520
1577
  if doc.get('returndocs', False):
1521
1578
  text.append('')