ansible-core 2.18.5rc1__py3-none-any.whl → 2.19.0b2__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.
Files changed (710) hide show
  1. ansible/_internal/__init__.py +53 -0
  2. ansible/_internal/_ansiballz.py +265 -0
  3. ansible/_internal/_collection_proxy.py +47 -0
  4. ansible/_internal/_datatag/__init__.py +0 -0
  5. ansible/_internal/_datatag/_tags.py +130 -0
  6. ansible/_internal/_datatag/_utils.py +19 -0
  7. ansible/_internal/_datatag/_wrappers.py +33 -0
  8. ansible/_internal/_errors/__init__.py +0 -0
  9. ansible/_internal/_errors/_captured.py +128 -0
  10. ansible/_internal/_errors/_handler.py +91 -0
  11. ansible/_internal/_errors/_utils.py +310 -0
  12. ansible/_internal/_json/__init__.py +203 -0
  13. ansible/_internal/_json/_legacy_encoder.py +34 -0
  14. ansible/_internal/_json/_profiles/__init__.py +0 -0
  15. ansible/_internal/_json/_profiles/_cache_persistence.py +55 -0
  16. ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
  17. ansible/_internal/_json/_profiles/_legacy.py +197 -0
  18. ansible/_internal/_locking.py +21 -0
  19. ansible/_internal/_plugins/__init__.py +0 -0
  20. ansible/_internal/_plugins/_cache.py +57 -0
  21. ansible/_internal/_task.py +78 -0
  22. ansible/_internal/_templating/__init__.py +10 -0
  23. ansible/_internal/_templating/_access.py +86 -0
  24. ansible/_internal/_templating/_chain_templar.py +63 -0
  25. ansible/_internal/_templating/_datatag.py +95 -0
  26. ansible/_internal/_templating/_engine.py +588 -0
  27. ansible/_internal/_templating/_errors.py +28 -0
  28. ansible/_internal/_templating/_jinja_bits.py +1066 -0
  29. ansible/_internal/_templating/_jinja_common.py +332 -0
  30. ansible/_internal/_templating/_jinja_patches.py +44 -0
  31. ansible/_internal/_templating/_jinja_plugins.py +345 -0
  32. ansible/_internal/_templating/_lazy_containers.py +633 -0
  33. ansible/_internal/_templating/_marker_behaviors.py +103 -0
  34. ansible/_internal/_templating/_transform.py +63 -0
  35. ansible/_internal/_templating/_utils.py +107 -0
  36. ansible/_internal/_wrapt.py +1052 -0
  37. ansible/_internal/_yaml/__init__.py +0 -0
  38. ansible/_internal/_yaml/_constructor.py +240 -0
  39. ansible/_internal/_yaml/_dumper.py +62 -0
  40. ansible/_internal/_yaml/_errors.py +166 -0
  41. ansible/_internal/_yaml/_loader.py +66 -0
  42. ansible/_internal/ansible_collections/ansible/_protomatter/README.md +11 -0
  43. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/action/debug.py +36 -0
  44. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/apply_trust.py +19 -0
  45. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/dump_object.py +18 -0
  46. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/finalize.py +16 -0
  47. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/origin.py +18 -0
  48. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.py +24 -0
  49. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.yml +33 -0
  50. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/tag_names.py +16 -0
  51. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +17 -0
  52. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +49 -0
  53. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.py +21 -0
  54. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.yml +2 -0
  55. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.py +15 -0
  56. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.yml +19 -0
  57. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.py +18 -0
  58. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.yml +19 -0
  59. ansible/cli/__init__.py +159 -89
  60. ansible/cli/_ssh_askpass.py +47 -0
  61. ansible/cli/adhoc.py +14 -7
  62. ansible/cli/arguments/option_helpers.py +154 -7
  63. ansible/cli/config.py +43 -68
  64. ansible/cli/console.py +10 -8
  65. ansible/cli/doc.py +62 -53
  66. ansible/cli/galaxy.py +27 -20
  67. ansible/cli/inventory.py +28 -26
  68. ansible/cli/playbook.py +4 -12
  69. ansible/cli/pull.py +51 -11
  70. ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
  71. ansible/cli/vault.py +12 -11
  72. ansible/compat/__init__.py +2 -2
  73. ansible/config/base.yml +166 -112
  74. ansible/config/manager.py +52 -49
  75. ansible/constants.py +3 -4
  76. ansible/errors/__init__.py +277 -235
  77. ansible/executor/interpreter_discovery.py +28 -149
  78. ansible/executor/module_common.py +426 -493
  79. ansible/executor/play_iterator.py +22 -27
  80. ansible/executor/playbook_executor.py +11 -11
  81. ansible/executor/powershell/async_watchdog.ps1 +97 -102
  82. ansible/executor/powershell/async_wrapper.ps1 +202 -151
  83. ansible/executor/powershell/become_wrapper.ps1 +89 -144
  84. ansible/executor/powershell/bootstrap_wrapper.ps1 +24 -9
  85. ansible/executor/powershell/coverage_wrapper.ps1 +82 -135
  86. ansible/executor/powershell/exec_wrapper.ps1 +462 -196
  87. ansible/executor/powershell/module_manifest.py +417 -265
  88. ansible/executor/powershell/module_wrapper.ps1 +169 -186
  89. ansible/executor/powershell/psrp_fetch_file.ps1 +41 -0
  90. ansible/executor/powershell/psrp_put_file.ps1 +122 -0
  91. ansible/executor/powershell/winrm_fetch_file.ps1 +46 -0
  92. ansible/executor/powershell/winrm_put_file.ps1 +36 -0
  93. ansible/executor/process/worker.py +161 -96
  94. ansible/executor/stats.py +5 -5
  95. ansible/executor/task_executor.py +268 -258
  96. ansible/executor/task_queue_manager.py +124 -90
  97. ansible/executor/task_result.py +183 -78
  98. ansible/galaxy/__init__.py +2 -2
  99. ansible/galaxy/api.py +22 -18
  100. ansible/galaxy/collection/__init__.py +1 -1
  101. ansible/galaxy/collection/concrete_artifact_manager.py +8 -11
  102. ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
  103. ansible/galaxy/dependency_resolution/providers.py +1 -1
  104. ansible/galaxy/dependency_resolution/reporters.py +81 -0
  105. ansible/galaxy/role.py +4 -8
  106. ansible/galaxy/token.py +28 -21
  107. ansible/inventory/data.py +47 -57
  108. ansible/inventory/group.py +44 -72
  109. ansible/inventory/helpers.py +9 -0
  110. ansible/inventory/host.py +32 -54
  111. ansible/inventory/manager.py +78 -34
  112. ansible/keyword_desc.yml +1 -1
  113. ansible/module_utils/_internal/__init__.py +55 -0
  114. ansible/module_utils/_internal/_ambient_context.py +58 -0
  115. ansible/module_utils/_internal/_ansiballz.py +133 -0
  116. ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
  117. ansible/module_utils/_internal/_dataclass_annotation_patch.py +64 -0
  118. ansible/module_utils/_internal/_dataclass_validation.py +217 -0
  119. ansible/module_utils/_internal/_datatag/__init__.py +928 -0
  120. ansible/module_utils/_internal/_datatag/_tags.py +38 -0
  121. ansible/module_utils/_internal/_debugging.py +31 -0
  122. ansible/module_utils/_internal/_errors.py +30 -0
  123. ansible/module_utils/_internal/_json/__init__.py +63 -0
  124. ansible/module_utils/_internal/_json/_legacy_encoder.py +26 -0
  125. ansible/module_utils/_internal/_json/_profiles/__init__.py +410 -0
  126. ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
  127. ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +31 -0
  128. ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +35 -0
  129. ansible/module_utils/_internal/_json/_profiles/_module_modern_c2m.py +35 -0
  130. ansible/module_utils/_internal/_json/_profiles/_module_modern_m2c.py +33 -0
  131. ansible/module_utils/_internal/_json/_profiles/_tagless.py +50 -0
  132. ansible/module_utils/_internal/_patches/__init__.py +66 -0
  133. ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +55 -0
  134. ansible/module_utils/_internal/_patches/_socket_patch.py +34 -0
  135. ansible/module_utils/_internal/_patches/_sys_intern_patch.py +34 -0
  136. ansible/module_utils/_internal/_plugin_exec_context.py +49 -0
  137. ansible/module_utils/_internal/_testing.py +0 -0
  138. ansible/module_utils/_internal/_traceback.py +89 -0
  139. ansible/module_utils/ansible_release.py +2 -2
  140. ansible/module_utils/api.py +1 -2
  141. ansible/module_utils/basic.py +152 -120
  142. ansible/module_utils/common/_utils.py +24 -28
  143. ansible/module_utils/common/collections.py +1 -2
  144. ansible/module_utils/common/dict_transformations.py +2 -2
  145. ansible/module_utils/common/file.py +2 -2
  146. ansible/module_utils/common/json.py +90 -84
  147. ansible/module_utils/common/locale.py +2 -2
  148. ansible/module_utils/common/messages.py +108 -0
  149. ansible/module_utils/common/parameters.py +27 -24
  150. ansible/module_utils/common/process.py +2 -2
  151. ansible/module_utils/common/respawn.py +41 -19
  152. ansible/module_utils/common/sentinel.py +66 -0
  153. ansible/module_utils/common/sys_info.py +8 -8
  154. ansible/module_utils/common/text/converters.py +16 -37
  155. ansible/module_utils/common/validation.py +35 -24
  156. ansible/module_utils/common/warnings.py +86 -25
  157. ansible/module_utils/common/yaml.py +29 -3
  158. ansible/module_utils/compat/datetime.py +33 -21
  159. ansible/module_utils/compat/paramiko.py +21 -10
  160. ansible/module_utils/compat/typing.py +6 -5
  161. ansible/module_utils/connection.py +2 -2
  162. ansible/module_utils/csharp/Ansible.Basic.cs +14 -11
  163. ansible/module_utils/csharp/Ansible.Become.cs +1 -0
  164. ansible/module_utils/csharp/Ansible._Async.cs +517 -0
  165. ansible/module_utils/datatag.py +46 -0
  166. ansible/module_utils/distro/__init__.py +2 -2
  167. ansible/module_utils/facts/ansible_collector.py +4 -5
  168. ansible/module_utils/facts/collector.py +13 -14
  169. ansible/module_utils/facts/compat.py +4 -4
  170. ansible/module_utils/facts/default_collectors.py +1 -1
  171. ansible/module_utils/facts/hardware/aix.py +34 -0
  172. ansible/module_utils/facts/hardware/base.py +1 -1
  173. ansible/module_utils/facts/hardware/darwin.py +1 -3
  174. ansible/module_utils/facts/hardware/freebsd.py +2 -2
  175. ansible/module_utils/facts/hardware/linux.py +4 -4
  176. ansible/module_utils/facts/namespace.py +1 -1
  177. ansible/module_utils/facts/network/base.py +1 -1
  178. ansible/module_utils/facts/network/fc_wwn.py +1 -2
  179. ansible/module_utils/facts/network/iscsi.py +1 -2
  180. ansible/module_utils/facts/network/nvme.py +1 -2
  181. ansible/module_utils/facts/other/facter.py +1 -2
  182. ansible/module_utils/facts/other/ohai.py +2 -3
  183. ansible/module_utils/facts/system/apparmor.py +1 -2
  184. ansible/module_utils/facts/system/caps.py +1 -1
  185. ansible/module_utils/facts/system/chroot.py +1 -2
  186. ansible/module_utils/facts/system/cmdline.py +1 -2
  187. ansible/module_utils/facts/system/date_time.py +5 -3
  188. ansible/module_utils/facts/system/distribution.py +9 -8
  189. ansible/module_utils/facts/system/dns.py +1 -1
  190. ansible/module_utils/facts/system/env.py +1 -2
  191. ansible/module_utils/facts/system/fips.py +7 -20
  192. ansible/module_utils/facts/system/loadavg.py +1 -2
  193. ansible/module_utils/facts/system/local.py +1 -2
  194. ansible/module_utils/facts/system/lsb.py +1 -2
  195. ansible/module_utils/facts/system/pkg_mgr.py +1 -2
  196. ansible/module_utils/facts/system/platform.py +1 -2
  197. ansible/module_utils/facts/system/python.py +1 -2
  198. ansible/module_utils/facts/system/selinux.py +1 -1
  199. ansible/module_utils/facts/system/service_mgr.py +1 -2
  200. ansible/module_utils/facts/system/ssh_pub_keys.py +1 -1
  201. ansible/module_utils/facts/system/systemd.py +1 -1
  202. ansible/module_utils/facts/system/user.py +1 -2
  203. ansible/module_utils/facts/utils.py +3 -3
  204. ansible/module_utils/facts/virtual/base.py +1 -1
  205. ansible/module_utils/facts/virtual/sunos.py +3 -15
  206. ansible/module_utils/facts/virtual/sysctl.py +3 -16
  207. ansible/module_utils/json_utils.py +2 -2
  208. ansible/module_utils/parsing/convert_bool.py +1 -1
  209. ansible/module_utils/service.py +18 -21
  210. ansible/module_utils/splitter.py +7 -7
  211. ansible/module_utils/testing.py +31 -0
  212. ansible/module_utils/urls.py +60 -31
  213. ansible/modules/add_host.py +4 -4
  214. ansible/modules/apt.py +60 -46
  215. ansible/modules/apt_key.py +19 -12
  216. ansible/modules/apt_repository.py +19 -16
  217. ansible/modules/assemble.py +6 -6
  218. ansible/modules/assert.py +4 -4
  219. ansible/modules/async_status.py +10 -12
  220. ansible/modules/async_wrapper.py +8 -3
  221. ansible/modules/blockinfile.py +6 -7
  222. ansible/modules/command.py +10 -17
  223. ansible/modules/copy.py +57 -144
  224. ansible/modules/cron.py +20 -15
  225. ansible/modules/deb822_repository.py +8 -9
  226. ansible/modules/debconf.py +5 -5
  227. ansible/modules/debug.py +4 -4
  228. ansible/modules/dnf.py +8 -8
  229. ansible/modules/dnf5.py +39 -13
  230. ansible/modules/dpkg_selections.py +4 -4
  231. ansible/modules/expect.py +8 -10
  232. ansible/modules/fail.py +4 -4
  233. ansible/modules/fetch.py +4 -4
  234. ansible/modules/file.py +174 -133
  235. ansible/modules/find.py +19 -17
  236. ansible/modules/gather_facts.py +3 -3
  237. ansible/modules/get_url.py +59 -53
  238. ansible/modules/getent.py +7 -9
  239. ansible/modules/git.py +28 -25
  240. ansible/modules/group.py +6 -6
  241. ansible/modules/group_by.py +4 -4
  242. ansible/modules/hostname.py +13 -29
  243. ansible/modules/import_playbook.py +6 -6
  244. ansible/modules/import_role.py +6 -6
  245. ansible/modules/import_tasks.py +6 -6
  246. ansible/modules/include_role.py +6 -6
  247. ansible/modules/include_tasks.py +6 -6
  248. ansible/modules/include_vars.py +6 -6
  249. ansible/modules/iptables.py +86 -73
  250. ansible/modules/known_hosts.py +10 -10
  251. ansible/modules/lineinfile.py +5 -5
  252. ansible/modules/meta.py +4 -4
  253. ansible/modules/mount_facts.py +2 -2
  254. ansible/modules/package.py +4 -4
  255. ansible/modules/package_facts.py +22 -10
  256. ansible/modules/pause.py +6 -6
  257. ansible/modules/ping.py +6 -6
  258. ansible/modules/pip.py +10 -11
  259. ansible/modules/raw.py +4 -4
  260. ansible/modules/reboot.py +6 -6
  261. ansible/modules/replace.py +9 -13
  262. ansible/modules/rpm_key.py +7 -8
  263. ansible/modules/script.py +4 -4
  264. ansible/modules/service.py +7 -8
  265. ansible/modules/service_facts.py +87 -10
  266. ansible/modules/set_fact.py +5 -5
  267. ansible/modules/set_stats.py +4 -4
  268. ansible/modules/setup.py +2 -2
  269. ansible/modules/shell.py +6 -6
  270. ansible/modules/slurp.py +6 -6
  271. ansible/modules/stat.py +9 -23
  272. ansible/modules/subversion.py +15 -15
  273. ansible/modules/systemd.py +6 -6
  274. ansible/modules/systemd_service.py +6 -6
  275. ansible/modules/sysvinit.py +6 -6
  276. ansible/modules/tempfile.py +5 -6
  277. ansible/modules/template.py +6 -6
  278. ansible/modules/unarchive.py +32 -11
  279. ansible/modules/uri.py +33 -26
  280. ansible/modules/user.py +53 -34
  281. ansible/modules/validate_argument_spec.py +10 -7
  282. ansible/modules/wait_for.py +32 -27
  283. ansible/modules/wait_for_connection.py +6 -6
  284. ansible/modules/yum_repository.py +6 -6
  285. ansible/parsing/ajson.py +14 -32
  286. ansible/parsing/dataloader.py +99 -54
  287. ansible/parsing/mod_args.py +28 -44
  288. ansible/parsing/plugin_docs.py +21 -86
  289. ansible/parsing/quoting.py +1 -1
  290. ansible/parsing/splitter.py +27 -12
  291. ansible/parsing/utils/addresses.py +24 -24
  292. ansible/parsing/utils/jsonify.py +5 -1
  293. ansible/parsing/utils/yaml.py +32 -61
  294. ansible/parsing/vault/__init__.py +319 -87
  295. ansible/parsing/yaml/__init__.py +0 -18
  296. ansible/parsing/yaml/dumper.py +6 -120
  297. ansible/parsing/yaml/loader.py +6 -39
  298. ansible/parsing/yaml/objects.py +43 -335
  299. ansible/playbook/__init__.py +1 -1
  300. ansible/playbook/attribute.py +8 -3
  301. ansible/playbook/base.py +182 -132
  302. ansible/playbook/block.py +26 -24
  303. ansible/playbook/collectionsearch.py +1 -15
  304. ansible/playbook/conditional.py +3 -77
  305. ansible/playbook/handler.py +8 -2
  306. ansible/playbook/helpers.py +41 -53
  307. ansible/playbook/included_file.py +31 -27
  308. ansible/playbook/loop_control.py +2 -2
  309. ansible/playbook/play.py +85 -44
  310. ansible/playbook/play_context.py +12 -17
  311. ansible/playbook/playbook_include.py +14 -15
  312. ansible/playbook/role/__init__.py +24 -26
  313. ansible/playbook/role/definition.py +15 -17
  314. ansible/playbook/role/include.py +2 -4
  315. ansible/playbook/role/metadata.py +10 -11
  316. ansible/playbook/role_include.py +3 -3
  317. ansible/playbook/taggable.py +13 -8
  318. ansible/playbook/task.py +188 -118
  319. ansible/playbook/task_include.py +5 -5
  320. ansible/plugins/__init__.py +68 -21
  321. ansible/plugins/action/__init__.py +209 -176
  322. ansible/plugins/action/add_host.py +1 -1
  323. ansible/plugins/action/assemble.py +1 -1
  324. ansible/plugins/action/assert.py +54 -66
  325. ansible/plugins/action/copy.py +7 -11
  326. ansible/plugins/action/debug.py +37 -31
  327. ansible/plugins/action/dnf.py +3 -4
  328. ansible/plugins/action/fail.py +1 -1
  329. ansible/plugins/action/fetch.py +4 -5
  330. ansible/plugins/action/gather_facts.py +7 -6
  331. ansible/plugins/action/group_by.py +1 -1
  332. ansible/plugins/action/include_vars.py +10 -11
  333. ansible/plugins/action/package.py +3 -6
  334. ansible/plugins/action/pause.py +2 -2
  335. ansible/plugins/action/script.py +15 -8
  336. ansible/plugins/action/service.py +6 -11
  337. ansible/plugins/action/set_fact.py +3 -12
  338. ansible/plugins/action/set_stats.py +3 -8
  339. ansible/plugins/action/template.py +35 -59
  340. ansible/plugins/action/unarchive.py +1 -1
  341. ansible/plugins/action/validate_argument_spec.py +5 -5
  342. ansible/plugins/action/wait_for_connection.py +1 -1
  343. ansible/plugins/become/__init__.py +31 -8
  344. ansible/plugins/become/runas.py +71 -0
  345. ansible/plugins/become/su.py +13 -8
  346. ansible/plugins/become/sudo.py +19 -0
  347. ansible/plugins/cache/__init__.py +35 -44
  348. ansible/plugins/cache/base.py +8 -0
  349. ansible/plugins/cache/jsonfile.py +10 -16
  350. ansible/plugins/cache/memory.py +6 -12
  351. ansible/plugins/callback/__init__.py +284 -179
  352. ansible/plugins/callback/default.py +99 -92
  353. ansible/plugins/callback/junit.py +44 -39
  354. ansible/plugins/callback/minimal.py +28 -25
  355. ansible/plugins/callback/oneline.py +28 -21
  356. ansible/plugins/callback/tree.py +16 -11
  357. ansible/plugins/connection/__init__.py +47 -34
  358. ansible/plugins/connection/local.py +150 -54
  359. ansible/plugins/connection/paramiko_ssh.py +21 -18
  360. ansible/plugins/connection/psrp.py +76 -165
  361. ansible/plugins/connection/ssh.py +301 -78
  362. ansible/plugins/connection/winrm.py +58 -140
  363. ansible/plugins/doc_fragments/action_common_attributes.py +14 -14
  364. ansible/plugins/doc_fragments/action_core.py +6 -6
  365. ansible/plugins/doc_fragments/backup.py +2 -2
  366. ansible/plugins/doc_fragments/checksum_common.py +27 -0
  367. ansible/plugins/doc_fragments/constructed.py +6 -2
  368. ansible/plugins/doc_fragments/decrypt.py +2 -2
  369. ansible/plugins/doc_fragments/default_callback.py +2 -2
  370. ansible/plugins/doc_fragments/files.py +2 -2
  371. ansible/plugins/doc_fragments/inventory_cache.py +2 -2
  372. ansible/plugins/doc_fragments/result_format_callback.py +2 -2
  373. ansible/plugins/doc_fragments/return_common.py +2 -2
  374. ansible/plugins/doc_fragments/template_common.py +4 -4
  375. ansible/plugins/doc_fragments/url.py +17 -1
  376. ansible/plugins/doc_fragments/url_windows.py +2 -2
  377. ansible/plugins/doc_fragments/validate.py +2 -2
  378. ansible/plugins/doc_fragments/vars_plugin_staging.py +2 -2
  379. ansible/plugins/filter/__init__.py +6 -2
  380. ansible/plugins/filter/b64decode.yml +22 -0
  381. ansible/plugins/filter/b64encode.yml +22 -0
  382. ansible/plugins/filter/bool.yml +11 -4
  383. ansible/plugins/filter/core.py +225 -108
  384. ansible/plugins/filter/encryption.py +32 -32
  385. ansible/plugins/filter/flatten.yml +3 -2
  386. ansible/plugins/filter/human_to_bytes.yml +1 -1
  387. ansible/plugins/filter/mathstuff.py +30 -37
  388. ansible/plugins/filter/password_hash.yml +8 -0
  389. ansible/plugins/filter/regex_search.yml +1 -4
  390. ansible/plugins/filter/split.yml +1 -1
  391. ansible/plugins/filter/to_nice_yaml.yml +0 -4
  392. ansible/plugins/filter/to_yaml.yml +0 -4
  393. ansible/plugins/filter/unvault.yml +1 -1
  394. ansible/plugins/filter/urls.py +1 -1
  395. ansible/plugins/filter/urlsplit.py +8 -9
  396. ansible/plugins/filter/vault.yml +14 -9
  397. ansible/plugins/filter/win_basename.yml +6 -1
  398. ansible/plugins/filter/win_dirname.yml +5 -0
  399. ansible/plugins/inventory/__init__.py +97 -77
  400. ansible/plugins/inventory/advanced_host_list.py +7 -5
  401. ansible/plugins/inventory/auto.py +11 -4
  402. ansible/plugins/inventory/constructed.py +21 -24
  403. ansible/plugins/inventory/generator.py +16 -11
  404. ansible/plugins/inventory/host_list.py +7 -5
  405. ansible/plugins/inventory/ini.py +78 -44
  406. ansible/plugins/inventory/script.py +189 -119
  407. ansible/plugins/inventory/toml.py +16 -126
  408. ansible/plugins/inventory/yaml.py +10 -8
  409. ansible/plugins/list.py +3 -3
  410. ansible/plugins/loader.py +197 -82
  411. ansible/plugins/lookup/__init__.py +21 -4
  412. ansible/plugins/lookup/config.py +21 -35
  413. ansible/plugins/lookup/csvfile.py +3 -2
  414. ansible/plugins/lookup/dict.py +1 -6
  415. ansible/plugins/lookup/env.py +12 -9
  416. ansible/plugins/lookup/file.py +5 -8
  417. ansible/plugins/lookup/first_found.py +86 -55
  418. ansible/plugins/lookup/indexed_items.py +1 -10
  419. ansible/plugins/lookup/ini.py +14 -13
  420. ansible/plugins/lookup/items.py +1 -1
  421. ansible/plugins/lookup/lines.py +8 -1
  422. ansible/plugins/lookup/list.py +1 -1
  423. ansible/plugins/lookup/nested.py +2 -18
  424. ansible/plugins/lookup/password.py +5 -5
  425. ansible/plugins/lookup/pipe.py +5 -7
  426. ansible/plugins/lookup/sequence.py +18 -8
  427. ansible/plugins/lookup/subelements.py +1 -4
  428. ansible/plugins/lookup/template.py +42 -36
  429. ansible/plugins/lookup/together.py +0 -12
  430. ansible/plugins/lookup/unvault.py +1 -5
  431. ansible/plugins/lookup/url.py +2 -8
  432. ansible/plugins/lookup/vars.py +16 -24
  433. ansible/plugins/shell/__init__.py +2 -2
  434. ansible/plugins/shell/cmd.py +2 -2
  435. ansible/plugins/shell/powershell.py +39 -22
  436. ansible/plugins/shell/sh.py +3 -2
  437. ansible/plugins/strategy/__init__.py +159 -184
  438. ansible/plugins/strategy/debug.py +2 -2
  439. ansible/plugins/strategy/free.py +16 -31
  440. ansible/plugins/strategy/host_pinned.py +2 -2
  441. ansible/plugins/strategy/linear.py +41 -41
  442. ansible/plugins/terminal/__init__.py +4 -4
  443. ansible/plugins/test/__init__.py +7 -2
  444. ansible/plugins/test/core.py +55 -21
  445. ansible/plugins/test/files.py +1 -1
  446. ansible/plugins/test/mathstuff.py +3 -3
  447. ansible/plugins/test/uri.py +3 -3
  448. ansible/plugins/vars/host_group_vars.py +7 -14
  449. ansible/release.py +2 -2
  450. ansible/template/__init__.py +370 -944
  451. ansible/utils/__init__.py +0 -18
  452. ansible/utils/_ssh_agent.py +657 -0
  453. ansible/utils/collection_loader/__init__.py +52 -5
  454. ansible/utils/collection_loader/_collection_config.py +5 -6
  455. ansible/utils/collection_loader/_collection_finder.py +79 -93
  456. ansible/utils/collection_loader/_collection_meta.py +13 -8
  457. ansible/utils/display.py +433 -63
  458. ansible/utils/encrypt.py +27 -19
  459. ansible/utils/fqcn.py +2 -2
  460. ansible/utils/hashing.py +2 -2
  461. ansible/utils/helpers.py +2 -2
  462. ansible/utils/listify.py +8 -8
  463. ansible/utils/lock.py +2 -2
  464. ansible/utils/path.py +4 -4
  465. ansible/utils/plugin_docs.py +14 -13
  466. ansible/utils/sentinel.py +4 -62
  467. ansible/utils/singleton.py +2 -0
  468. ansible/utils/ssh_functions.py +1 -1
  469. ansible/utils/unsafe_proxy.py +23 -332
  470. ansible/utils/vars.py +51 -8
  471. ansible/utils/version.py +2 -2
  472. ansible/vars/clean.py +5 -5
  473. ansible/vars/hostvars.py +60 -90
  474. ansible/vars/manager.py +206 -282
  475. ansible/vars/reserved.py +8 -9
  476. ansible_core-2.19.0b2.dist-info/BSD-3-Clause.txt +28 -0
  477. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/METADATA +5 -4
  478. ansible_core-2.19.0b2.dist-info/RECORD +1072 -0
  479. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/WHEEL +1 -1
  480. ansible_test/_data/completion/docker.txt +7 -7
  481. ansible_test/_data/completion/remote.txt +6 -6
  482. ansible_test/_data/completion/windows.txt +1 -0
  483. ansible_test/_data/requirements/ansible.txt +2 -2
  484. ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
  485. ansible_test/_data/requirements/sanity.changelog.txt +1 -1
  486. ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
  487. ansible_test/_data/requirements/sanity.pylint.txt +4 -4
  488. ansible_test/_data/requirements/sanity.validate-modules.txt +2 -2
  489. ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
  490. ansible_test/_data/requirements/units.txt +1 -0
  491. ansible_test/_internal/__init__.py +1 -0
  492. ansible_test/_internal/ansible_util.py +2 -0
  493. ansible_test/_internal/become.py +1 -0
  494. ansible_test/_internal/bootstrap.py +1 -0
  495. ansible_test/_internal/cache.py +1 -0
  496. ansible_test/_internal/cgroup.py +1 -0
  497. ansible_test/_internal/ci/__init__.py +1 -0
  498. ansible_test/_internal/ci/azp.py +1 -0
  499. ansible_test/_internal/ci/local.py +1 -0
  500. ansible_test/_internal/classification/__init__.py +1 -0
  501. ansible_test/_internal/classification/common.py +1 -0
  502. ansible_test/_internal/classification/csharp.py +1 -0
  503. ansible_test/_internal/classification/powershell.py +1 -0
  504. ansible_test/_internal/classification/python.py +1 -0
  505. ansible_test/_internal/cli/__init__.py +1 -0
  506. ansible_test/_internal/cli/actions.py +1 -0
  507. ansible_test/_internal/cli/argparsing/__init__.py +1 -0
  508. ansible_test/_internal/cli/argparsing/actions.py +1 -0
  509. ansible_test/_internal/cli/argparsing/argcompletion.py +1 -0
  510. ansible_test/_internal/cli/argparsing/parsers.py +1 -0
  511. ansible_test/_internal/cli/commands/__init__.py +11 -0
  512. ansible_test/_internal/cli/commands/coverage/__init__.py +1 -0
  513. ansible_test/_internal/cli/commands/coverage/analyze/__init__.py +1 -0
  514. ansible_test/_internal/cli/commands/coverage/analyze/targets/__init__.py +1 -0
  515. ansible_test/_internal/cli/commands/coverage/analyze/targets/combine.py +1 -0
  516. ansible_test/_internal/cli/commands/coverage/analyze/targets/expand.py +1 -0
  517. ansible_test/_internal/cli/commands/coverage/analyze/targets/filter.py +1 -0
  518. ansible_test/_internal/cli/commands/coverage/analyze/targets/generate.py +1 -0
  519. ansible_test/_internal/cli/commands/coverage/analyze/targets/missing.py +1 -0
  520. ansible_test/_internal/cli/commands/coverage/combine.py +1 -0
  521. ansible_test/_internal/cli/commands/coverage/erase.py +1 -0
  522. ansible_test/_internal/cli/commands/coverage/html.py +1 -0
  523. ansible_test/_internal/cli/commands/coverage/report.py +1 -0
  524. ansible_test/_internal/cli/commands/coverage/xml.py +1 -0
  525. ansible_test/_internal/cli/commands/env.py +1 -0
  526. ansible_test/_internal/cli/commands/integration/__init__.py +1 -0
  527. ansible_test/_internal/cli/commands/integration/network.py +1 -0
  528. ansible_test/_internal/cli/commands/integration/posix.py +1 -0
  529. ansible_test/_internal/cli/commands/integration/windows.py +1 -0
  530. ansible_test/_internal/cli/commands/sanity.py +9 -0
  531. ansible_test/_internal/cli/commands/shell.py +1 -0
  532. ansible_test/_internal/cli/commands/units.py +1 -0
  533. ansible_test/_internal/cli/compat.py +1 -0
  534. ansible_test/_internal/cli/completers.py +1 -0
  535. ansible_test/_internal/cli/converters.py +1 -0
  536. ansible_test/_internal/cli/environments.py +1 -0
  537. ansible_test/_internal/cli/epilog.py +1 -0
  538. ansible_test/_internal/cli/parsers/__init__.py +1 -0
  539. ansible_test/_internal/cli/parsers/base_argument_parsers.py +1 -0
  540. ansible_test/_internal/cli/parsers/helpers.py +1 -0
  541. ansible_test/_internal/cli/parsers/host_config_parsers.py +1 -0
  542. ansible_test/_internal/cli/parsers/key_value_parsers.py +1 -0
  543. ansible_test/_internal/cli/parsers/value_parsers.py +1 -0
  544. ansible_test/_internal/commands/__init__.py +1 -0
  545. ansible_test/_internal/commands/coverage/__init__.py +2 -1
  546. ansible_test/_internal/commands/coverage/analyze/__init__.py +1 -0
  547. ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +1 -0
  548. ansible_test/_internal/commands/coverage/analyze/targets/combine.py +1 -0
  549. ansible_test/_internal/commands/coverage/analyze/targets/expand.py +1 -0
  550. ansible_test/_internal/commands/coverage/analyze/targets/filter.py +1 -0
  551. ansible_test/_internal/commands/coverage/analyze/targets/generate.py +1 -0
  552. ansible_test/_internal/commands/coverage/analyze/targets/missing.py +1 -0
  553. ansible_test/_internal/commands/coverage/combine.py +2 -1
  554. ansible_test/_internal/commands/coverage/erase.py +1 -0
  555. ansible_test/_internal/commands/coverage/html.py +1 -0
  556. ansible_test/_internal/commands/coverage/report.py +1 -0
  557. ansible_test/_internal/commands/coverage/xml.py +1 -0
  558. ansible_test/_internal/commands/env/__init__.py +2 -0
  559. ansible_test/_internal/commands/integration/__init__.py +4 -0
  560. ansible_test/_internal/commands/integration/cloud/__init__.py +1 -0
  561. ansible_test/_internal/commands/integration/cloud/acme.py +2 -1
  562. ansible_test/_internal/commands/integration/cloud/aws.py +1 -0
  563. ansible_test/_internal/commands/integration/cloud/azure.py +1 -0
  564. ansible_test/_internal/commands/integration/cloud/cs.py +1 -0
  565. ansible_test/_internal/commands/integration/cloud/digitalocean.py +1 -0
  566. ansible_test/_internal/commands/integration/cloud/galaxy.py +3 -2
  567. ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -0
  568. ansible_test/_internal/commands/integration/cloud/httptester.py +2 -1
  569. ansible_test/_internal/commands/integration/cloud/nios.py +2 -1
  570. ansible_test/_internal/commands/integration/cloud/opennebula.py +1 -0
  571. ansible_test/_internal/commands/integration/cloud/openshift.py +1 -0
  572. ansible_test/_internal/commands/integration/cloud/scaleway.py +1 -0
  573. ansible_test/_internal/commands/integration/cloud/vcenter.py +1 -0
  574. ansible_test/_internal/commands/integration/cloud/vultr.py +1 -0
  575. ansible_test/_internal/commands/integration/coverage.py +1 -0
  576. ansible_test/_internal/commands/integration/filters.py +1 -0
  577. ansible_test/_internal/commands/integration/network.py +1 -0
  578. ansible_test/_internal/commands/integration/posix.py +1 -0
  579. ansible_test/_internal/commands/integration/windows.py +1 -0
  580. ansible_test/_internal/commands/sanity/__init__.py +16 -1
  581. ansible_test/_internal/commands/sanity/ansible_doc.py +1 -0
  582. ansible_test/_internal/commands/sanity/bin_symlinks.py +1 -0
  583. ansible_test/_internal/commands/sanity/compile.py +1 -0
  584. ansible_test/_internal/commands/sanity/ignores.py +1 -0
  585. ansible_test/_internal/commands/sanity/import.py +1 -0
  586. ansible_test/_internal/commands/sanity/integration_aliases.py +1 -0
  587. ansible_test/_internal/commands/sanity/pep8.py +1 -0
  588. ansible_test/_internal/commands/sanity/pslint.py +1 -0
  589. ansible_test/_internal/commands/sanity/pylint.py +24 -26
  590. ansible_test/_internal/commands/sanity/shellcheck.py +1 -0
  591. ansible_test/_internal/commands/sanity/validate_modules.py +1 -0
  592. ansible_test/_internal/commands/sanity/yamllint.py +1 -0
  593. ansible_test/_internal/commands/shell/__init__.py +1 -0
  594. ansible_test/_internal/commands/units/__init__.py +1 -0
  595. ansible_test/_internal/compat/__init__.py +1 -0
  596. ansible_test/_internal/compat/packaging.py +1 -0
  597. ansible_test/_internal/compat/yaml.py +1 -0
  598. ansible_test/_internal/completion.py +1 -0
  599. ansible_test/_internal/config.py +2 -0
  600. ansible_test/_internal/connections.py +1 -0
  601. ansible_test/_internal/constants.py +1 -0
  602. ansible_test/_internal/containers.py +1 -0
  603. ansible_test/_internal/content_config.py +1 -0
  604. ansible_test/_internal/core_ci.py +1 -0
  605. ansible_test/_internal/coverage_util.py +11 -10
  606. ansible_test/_internal/data.py +1 -0
  607. ansible_test/_internal/delegation.py +1 -0
  608. ansible_test/_internal/dev/__init__.py +1 -0
  609. ansible_test/_internal/dev/container_probe.py +1 -0
  610. ansible_test/_internal/diff.py +3 -2
  611. ansible_test/_internal/docker_util.py +2 -1
  612. ansible_test/_internal/encoding.py +1 -0
  613. ansible_test/_internal/executor.py +1 -0
  614. ansible_test/_internal/git.py +1 -0
  615. ansible_test/_internal/host_configs.py +1 -0
  616. ansible_test/_internal/host_profiles.py +1 -0
  617. ansible_test/_internal/http.py +1 -0
  618. ansible_test/_internal/init.py +1 -0
  619. ansible_test/_internal/inventory.py +35 -3
  620. ansible_test/_internal/io.py +1 -0
  621. ansible_test/_internal/metadata.py +1 -0
  622. ansible_test/_internal/payload.py +1 -0
  623. ansible_test/_internal/provider/__init__.py +1 -0
  624. ansible_test/_internal/provider/layout/__init__.py +1 -0
  625. ansible_test/_internal/provider/layout/ansible.py +1 -0
  626. ansible_test/_internal/provider/layout/collection.py +1 -0
  627. ansible_test/_internal/provider/layout/unsupported.py +1 -0
  628. ansible_test/_internal/provider/source/__init__.py +1 -0
  629. ansible_test/_internal/provider/source/git.py +1 -0
  630. ansible_test/_internal/provider/source/installed.py +1 -0
  631. ansible_test/_internal/provider/source/unsupported.py +1 -0
  632. ansible_test/_internal/provider/source/unversioned.py +1 -0
  633. ansible_test/_internal/provisioning.py +1 -0
  634. ansible_test/_internal/pypi_proxy.py +6 -5
  635. ansible_test/_internal/python_requirements.py +1 -0
  636. ansible_test/_internal/ssh.py +1 -0
  637. ansible_test/_internal/target.py +1 -0
  638. ansible_test/_internal/test.py +3 -2
  639. ansible_test/_internal/thread.py +1 -0
  640. ansible_test/_internal/timeout.py +1 -0
  641. ansible_test/_internal/util.py +1 -0
  642. ansible_test/_internal/util_common.py +5 -2
  643. ansible_test/_internal/venv.py +1 -0
  644. ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +1 -0
  645. ansible_test/_util/controller/sanity/code-smell/changelog/sphinx.py +1 -0
  646. ansible_test/_util/controller/sanity/code-smell/changelog.py +1 -0
  647. ansible_test/_util/controller/sanity/code-smell/empty-init.py +1 -0
  648. ansible_test/_util/controller/sanity/code-smell/line-endings.py +1 -0
  649. ansible_test/_util/controller/sanity/code-smell/no-assert.py +1 -0
  650. ansible_test/_util/controller/sanity/code-smell/no-get-exception.py +1 -0
  651. ansible_test/_util/controller/sanity/code-smell/no-illegal-filenames.py +1 -0
  652. ansible_test/_util/controller/sanity/code-smell/no-smart-quotes.py +1 -0
  653. ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py +1 -0
  654. ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +28 -1
  655. ansible_test/_util/controller/sanity/code-smell/shebang.py +1 -0
  656. ansible_test/_util/controller/sanity/code-smell/symlinks.py +1 -0
  657. ansible_test/_util/controller/sanity/code-smell/use-argspec-type-path.py +1 -0
  658. ansible_test/_util/controller/sanity/code-smell/use-compat-six.py +1 -0
  659. ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py +2 -1
  660. ansible_test/_util/controller/sanity/pep8/current-ignore.txt +4 -0
  661. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +7 -5
  662. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +7 -5
  663. ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +7 -5
  664. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +3 -5
  665. ansible_test/_util/controller/sanity/pylint/config/default.cfg +7 -7
  666. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +1 -13
  667. ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +1 -0
  668. ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +1 -8
  669. ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +1 -8
  670. ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +55 -28
  671. ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +12 -5
  672. ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +13 -2
  673. ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -0
  674. ansible_test/_util/controller/sanity/yamllint/yamllinter.py +35 -17
  675. ansible_test/_util/controller/tools/collection_detail.py +1 -0
  676. ansible_test/_util/controller/tools/yaml_to_json.py +2 -1
  677. ansible_test/_util/target/pytest/plugins/ansible_forked.py +6 -1
  678. ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +2 -1
  679. ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -0
  680. ansible_test/_util/target/sanity/compile/compile.py +1 -0
  681. ansible_test/_util/target/sanity/import/importer.py +15 -16
  682. ansible_test/_util/target/setup/bootstrap.sh +9 -20
  683. ansible_test/_util/target/setup/probe_cgroups.py +1 -0
  684. ansible_test/_util/target/setup/quiet_pip.py +1 -0
  685. ansible_test/_util/target/setup/requirements.py +35 -27
  686. ansible_test/_util/target/tools/virtualenvcheck.py +2 -1
  687. ansible_test/_util/target/tools/yamlcheck.py +2 -1
  688. ansible/compat/selectors.py +0 -32
  689. ansible/errors/yaml_strings.py +0 -138
  690. ansible/executor/action_write_locks.py +0 -44
  691. ansible/executor/discovery/python_target.py +0 -47
  692. ansible/executor/powershell/module_powershell_wrapper.ps1 +0 -86
  693. ansible/executor/powershell/module_script_wrapper.ps1 +0 -22
  694. ansible/module_utils/compat/importlib.py +0 -26
  695. ansible/module_utils/compat/selectors.py +0 -32
  696. ansible/module_utils/pycompat24.py +0 -73
  697. ansible/parsing/yaml/constructor.py +0 -178
  698. ansible/template/native_helpers.py +0 -251
  699. ansible/template/template.py +0 -43
  700. ansible/template/vars.py +0 -77
  701. ansible/utils/native_jinja.py +0 -11
  702. ansible/vars/fact_cache.py +0 -71
  703. ansible_core-2.18.5rc1.dist-info/RECORD +0 -992
  704. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/Apache-License.txt +0 -0
  705. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/COPYING +0 -0
  706. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/MIT-license.txt +0 -0
  707. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/PSF-license.txt +0 -0
  708. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/entry_points.txt +0 -0
  709. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/simplified_bsd.txt +0 -0
  710. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/top_level.txt +0 -0
@@ -1,42 +1,38 @@
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
6
+ import enum
21
7
  import traceback
8
+ import sys
9
+ import types
10
+ import typing as t
22
11
 
23
12
  from collections.abc import Sequence
24
13
 
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
14
+ from json import JSONDecodeError
15
+
16
+ from ansible.module_utils.common.text.converters import to_text
17
+ from ..module_utils.datatag import native_type_name
18
+ from ansible._internal._datatag import _tags
19
+ from .._internal._errors import _utils
20
+
21
+
22
+ class ExitCode(enum.IntEnum):
23
+ SUCCESS = 0 # used by TQM, must be bit-flag safe
24
+ GENERIC_ERROR = 1 # used by TQM, must be bit-flag safe
25
+ HOST_FAILED = 2 # TQM-sourced, must be bit-flag safe
26
+ HOST_UNREACHABLE = 4 # TQM-sourced, must be bit-flag safe
27
+ PARSER_ERROR = 4 # FIXME: CLI-sourced, conflicts with HOST_UNREACHABLE
28
+ INVALID_CLI_OPTION = 5
29
+ UNICODE_ERROR = 6 # obsolete, no longer used
30
+ KEYBOARD_INTERRUPT = 99
31
+ UNKNOWN_ERROR = 250
36
32
 
37
33
 
38
34
  class AnsibleError(Exception):
39
- '''
35
+ """
40
36
  This is the base class for all errors raised from Ansible code,
41
37
  and can be instantiated with two optional parameters beyond the
42
38
  error message to control whether detailed information is displayed
@@ -44,257 +40,271 @@ class AnsibleError(Exception):
44
40
 
45
41
  Usage:
46
42
 
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)
43
+ raise AnsibleError('some message here', obj=obj)
44
+
45
+ Where "obj" may be tagged with Origin to provide context for error messages.
46
+ """
47
+
48
+ _exit_code = ExitCode.GENERIC_ERROR
49
+ _default_message = ''
50
+ _default_help_text: str | None = None
51
+ _include_cause_message = True
52
+ """
53
+ When `True`, the exception message will be augmented with cause message(s).
54
+ Subclasses doing complex error analysis can disable this to take responsibility for reporting cause messages as needed.
55
+ """
56
+
57
+ def __init__(
58
+ self,
59
+ message: str = "",
60
+ obj: t.Any = None,
61
+ show_content: bool = True,
62
+ suppress_extended_error: bool | types.EllipsisType = ...,
63
+ orig_exc: BaseException | None = None,
64
+ help_text: str | None = None,
65
+ ) -> None:
66
+ # DTFIX-FUTURE: these fallback cases mask incorrect use of AnsibleError.message, what should we do?
67
+ if message is None:
68
+ message = ''
69
+ elif not isinstance(message, str):
70
+ message = str(message)
71
+
72
+ if self._default_message and message:
73
+ message = _utils.concat_message(self._default_message, message)
74
+ elif self._default_message:
75
+ message = self._default_message
76
+ elif not message:
77
+ message = f'Unexpected {type(self).__name__} error.'
78
+
79
+ super().__init__(message)
55
80
 
56
81
  self._show_content = show_content
57
- self._suppress_extended_error = suppress_extended_error
58
- self._message = to_native(message)
82
+ self._message = message
83
+ self._help_text_value = help_text or self._default_help_text
59
84
  self.obj = obj
85
+
86
+ # deprecated: description='deprecate support for orig_exc, callers should use `raise ... from` only' core_version='2.23'
87
+ # deprecated: description='remove support for orig_exc' core_version='2.27'
60
88
  self.orig_exc = orig_exc
61
89
 
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
90
+ if suppress_extended_error is not ...:
91
+ from ..utils.display import Display
67
92
 
68
- message = [self._message]
93
+ if suppress_extended_error:
94
+ self._show_content = False
69
95
 
70
- # Add from previous exceptions
71
- if self.orig_exc:
72
- message.append('. %s' % to_native(self.orig_exc))
96
+ Display().deprecated(
97
+ msg=f"The `suppress_extended_error` argument to `{type(self).__name__}` is deprecated. Use `show_content=False` instead.",
98
+ version="2.23",
99
+ )
73
100
 
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
- )
101
+ @property
102
+ def _original_message(self) -> str:
103
+ return self._message
81
104
 
82
- return ''.join(message)
105
+ @property
106
+ def message(self) -> str:
107
+ """
108
+ If `include_cause_message` is False, return the original message.
109
+ Otherwise, return the original message with cause message(s) appended, stopping on (and including) the first non-AnsibleError.
110
+ The recursion is due to `AnsibleError.__str__` calling this method, which uses `str` on child exceptions to create the cause message.
111
+ Recursion stops on the first non-AnsibleError since those exceptions do not implement the custom `__str__` behavior.
112
+ """
113
+ return _utils.get_chained_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 _utils.RedactAnnotatedSourceContext.when(not self._show_content):
122
+ if source_context := _utils.SourceContext.from_value(self.obj):
123
+ return str(source_context)
124
+
125
+ return None
126
+
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
90
134
 
91
- def __repr__(self):
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."""
257
236
 
258
237
 
259
238
  class AnsibleConnectionFailure(AnsibleRuntimeError):
260
- ''' the transport / connection_plugin had a fatal error '''
261
- pass
239
+ """The transport / connection_plugin had a fatal error."""
262
240
 
263
241
 
264
242
  class AnsibleAuthenticationFailure(AnsibleConnectionFailure):
265
- '''invalid username/password/key'''
266
- pass
243
+ """Invalid username/password/key."""
244
+
245
+ _default_message = "Failed to authenticate."
267
246
 
268
247
 
269
248
  class AnsibleCallbackError(AnsibleRuntimeError):
270
- ''' a callback failure '''
271
- pass
249
+ """A callback failure."""
272
250
 
273
251
 
274
252
  class AnsibleTemplateError(AnsibleRuntimeError):
275
- '''A template related error'''
276
- pass
253
+ """A template related error."""
254
+
255
+
256
+ class TemplateTrustCheckFailedError(AnsibleTemplateError):
257
+ """Raised when processing was requested on an untrusted template or expression."""
258
+
259
+ _default_message = 'Encountered untrusted template or expression.'
260
+ _default_help_text = ('Templates and expressions must be defined by trusted sources such as playbooks or roles, '
261
+ 'not untrusted sources such as module results.')
262
+
263
+
264
+ class AnsibleTemplateTransformLimitError(AnsibleTemplateError):
265
+ """The internal template transform limit was exceeded."""
266
+
267
+ _default_message = "Template transform limit exceeded."
277
268
 
278
269
 
279
- class AnsibleFilterError(AnsibleTemplateError):
280
- ''' a templating failure '''
281
- pass
270
+ class AnsibleTemplateSyntaxError(AnsibleTemplateError):
271
+ """A syntax error was encountered while parsing a Jinja template or expression."""
282
272
 
283
273
 
284
- class AnsibleLookupError(AnsibleTemplateError):
285
- ''' a lookup failure '''
286
- pass
274
+ class AnsibleBrokenConditionalError(AnsibleTemplateError):
275
+ """A broken conditional with non-boolean result was used."""
276
+
277
+ _default_help_text = 'Broken conditionals can be temporarily allowed with the `ALLOW_BROKEN_CONDITIONALS` configuration option.'
287
278
 
288
279
 
289
280
  class AnsibleUndefinedVariable(AnsibleTemplateError):
290
- ''' a templating failure '''
291
- pass
281
+ """An undefined variable was encountered while processing a template or expression."""
282
+
283
+
284
+ class AnsibleValueOmittedError(AnsibleTemplateError):
285
+ """
286
+ Raised when the result of a template operation was the Omit singleton. This exception purposely does
287
+ not derive from AnsibleError to avoid elision of the traceback, since uncaught errors of this type always
288
+ indicate a bug.
289
+ """
290
+
291
+ _default_message = "A template was resolved to an Omit scalar."
292
+ _default_help_text = "Callers must be prepared to handle this value. This is most likely a bug in the code requesting templating."
293
+
294
+
295
+ class AnsibleTemplatePluginError(AnsibleTemplateError):
296
+ """An error sourced by a template plugin (lookup/filter/test)."""
297
+
298
+
299
+ # deprecated: description='add deprecation warnings for these aliases' core_version='2.23'
300
+ AnsibleFilterError = AnsibleTemplatePluginError
301
+ AnsibleLookupError = AnsibleTemplatePluginError
292
302
 
293
303
 
294
304
  class AnsibleFileNotFound(AnsibleRuntimeError):
295
- ''' a file missing failure '''
305
+ """A file missing failure."""
296
306
 
297
- def __init__(self, message="", obj=None, show_content=True, suppress_extended_error=False, orig_exc=None, paths=None, file_name=None):
307
+ def __init__(self, message="", obj=None, show_content=True, suppress_extended_error=..., orig_exc=None, paths=None, file_name=None):
298
308
 
299
309
  self.file_name = file_name
300
310
  self.paths = paths
@@ -322,10 +332,9 @@ class AnsibleFileNotFound(AnsibleRuntimeError):
322
332
  # DO NOT USE as they will probably be removed soon.
323
333
  # We will port the action modules in our tree to use a context manager instead.
324
334
  class AnsibleAction(AnsibleRuntimeError):
325
- ''' Base Exception for Action plugin flow control '''
326
-
327
- def __init__(self, message="", obj=None, show_content=True, suppress_extended_error=False, orig_exc=None, result=None):
335
+ """Base Exception for Action plugin flow control."""
328
336
 
337
+ def __init__(self, message="", obj=None, show_content=True, suppress_extended_error=..., orig_exc=None, result=None):
329
338
  super(AnsibleAction, self).__init__(message=message, obj=obj, show_content=show_content,
330
339
  suppress_extended_error=suppress_extended_error, orig_exc=orig_exc)
331
340
  if result is None:
@@ -335,54 +344,87 @@ class AnsibleAction(AnsibleRuntimeError):
335
344
 
336
345
 
337
346
  class AnsibleActionSkip(AnsibleAction):
338
- ''' an action runtime skip'''
347
+ """An action runtime skip."""
339
348
 
340
- def __init__(self, message="", obj=None, show_content=True, suppress_extended_error=False, orig_exc=None, result=None):
349
+ def __init__(self, message="", obj=None, show_content=True, suppress_extended_error=..., orig_exc=None, result=None):
341
350
  super(AnsibleActionSkip, self).__init__(message=message, obj=obj, show_content=show_content,
342
351
  suppress_extended_error=suppress_extended_error, orig_exc=orig_exc, result=result)
343
352
  self.result.update({'skipped': True, 'msg': message})
344
353
 
345
354
 
346
355
  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):
356
+ """An action runtime failure."""
357
+
358
+ def __init__(self, message="", obj=None, show_content=True, suppress_extended_error=..., orig_exc=None, result=None):
349
359
  super(AnsibleActionFail, self).__init__(message=message, obj=obj, show_content=show_content,
350
360
  suppress_extended_error=suppress_extended_error, orig_exc=orig_exc, result=result)
351
- self.result.update({'failed': True, 'msg': message, 'exception': traceback.format_exc()})
361
+
362
+ result_overrides = {'failed': True, 'msg': message}
363
+ # deprecated: description='use sys.exception()' python_version='3.11'
364
+ if sys.exc_info()[1]: # DTFIX-RELEASE: remove this hack once TaskExecutor is no longer shucking AnsibleActionFail and returning its result
365
+ result_overrides['exception'] = traceback.format_exc()
366
+
367
+ self.result.update(result_overrides)
352
368
 
353
369
 
354
370
  class _AnsibleActionDone(AnsibleAction):
355
- ''' an action runtime early exit'''
356
- pass
371
+ """An action runtime early exit."""
357
372
 
358
373
 
359
374
  class AnsiblePluginError(AnsibleError):
360
- ''' base class for Ansible plugin-related errors that do not need AnsibleError contextual data '''
375
+ """Base class for Ansible plugin-related errors that do not need AnsibleError contextual data."""
376
+
361
377
  def __init__(self, message=None, plugin_load_context=None):
362
378
  super(AnsiblePluginError, self).__init__(message)
363
379
  self.plugin_load_context = plugin_load_context
364
380
 
365
381
 
366
382
  class AnsiblePluginRemovedError(AnsiblePluginError):
367
- ''' a requested plugin has been removed '''
368
- pass
383
+ """A requested plugin has been removed."""
369
384
 
370
385
 
371
386
  class AnsiblePluginCircularRedirect(AnsiblePluginError):
372
- '''a cycle was detected in plugin redirection'''
373
- pass
387
+ """A cycle was detected in plugin redirection."""
374
388
 
375
389
 
376
390
  class AnsibleCollectionUnsupportedVersionError(AnsiblePluginError):
377
- '''a collection is not supported by this version of Ansible'''
378
- pass
391
+ """A collection is not supported by this version of Ansible."""
379
392
 
380
393
 
381
- class AnsibleFilterTypeError(AnsibleTemplateError, TypeError):
382
- ''' a Jinja filter templating failure due to bad type'''
383
- pass
394
+ class AnsibleTypeError(AnsibleRuntimeError, TypeError):
395
+ """Ansible-augmented TypeError subclass."""
384
396
 
385
397
 
386
398
  class AnsiblePluginNotFound(AnsiblePluginError):
387
- ''' Indicates we did not find an Ansible plugin '''
388
- pass
399
+ """Indicates we did not find an Ansible plugin."""
400
+
401
+
402
+ class AnsibleConditionalError(AnsibleRuntimeError):
403
+ """Errors related to failed conditional expression evaluation."""
404
+
405
+
406
+ class AnsibleVariableTypeError(AnsibleRuntimeError):
407
+ """An error due to attempted storage of an unsupported variable type."""
408
+
409
+ @classmethod
410
+ def from_value(cls, *, obj: t.Any) -> t.Self:
411
+ # avoid an incorrect error message when `obj` is a type
412
+ type_name = type(obj).__name__ if isinstance(obj, type) else native_type_name(obj)
413
+
414
+ return cls(message=f'Type {type_name!r} is unsupported for variable storage.', obj=obj)
415
+
416
+
417
+ def __getattr__(name: str) -> t.Any:
418
+ """Inject import-time deprecation warnings."""
419
+ from ..utils.display import Display
420
+
421
+ if name == 'AnsibleFilterTypeError':
422
+ Display().deprecated(
423
+ msg="Importing 'AnsibleFilterTypeError' is deprecated.",
424
+ help_text=f"Import {AnsibleTypeError.__name__!r} instead.",
425
+ version="2.23",
426
+ )
427
+
428
+ return AnsibleTypeError
429
+
430
+ raise AttributeError(f'module {__name__!r} has no attribute {name!r}')