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
@@ -18,15 +18,16 @@
18
18
  from __future__ import annotations
19
19
 
20
20
  import os
21
+ import typing as _t
21
22
 
22
23
  from collections.abc import Container, Mapping, Set, Sequence
23
24
  from types import MappingProxyType
24
25
 
25
26
  from ansible import constants as C
26
27
  from ansible.errors import AnsibleError, AnsibleParserError, AnsibleAssertionError
28
+ from ansible.module_utils.common.sentinel import Sentinel
27
29
  from ansible.module_utils.common.text.converters import to_text
28
30
  from ansible.module_utils.six import binary_type, text_type
29
- from ansible.playbook.attribute import FieldAttribute
30
31
  from ansible.playbook.base import Base
31
32
  from ansible.playbook.collectionsearch import CollectionSearch
32
33
  from ansible.playbook.conditional import Conditional
@@ -37,9 +38,18 @@ from ansible.playbook.taggable import Taggable
37
38
  from ansible.plugins.loader import add_all_plugin_dirs
38
39
  from ansible.utils.collection_loader import AnsibleCollectionConfig
39
40
  from ansible.utils.path import is_subpath
40
- from ansible.utils.sentinel import Sentinel
41
41
  from ansible.utils.vars import combine_vars
42
42
 
43
+ # NOTE: This import is only needed for the type-checking in __init__. While there's an alternative
44
+ # available by using forward references this seems not to work well with commonly used IDEs.
45
+ # Therefore the TYPE_CHECKING hack seems to be a more universal approach, even if not being very elegant.
46
+ # References:
47
+ # * https://stackoverflow.com/q/39740632/199513
48
+ # * https://peps.python.org/pep-0484/#forward-references
49
+ if _t.TYPE_CHECKING:
50
+ from ansible.playbook.block import Block
51
+ from ansible.playbook.play import Play
52
+
43
53
  __all__ = ['Role', 'hash_params']
44
54
 
45
55
  # TODO: this should be a utility function, but can't be a member of
@@ -98,13 +108,19 @@ def hash_params(params):
98
108
 
99
109
  class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
100
110
 
101
- def __init__(self, play=None, from_files=None, from_include=False, validate=True, public=None, static=True):
102
- self._role_name = None
103
- self._role_path = None
104
- self._role_collection = None
105
- self._role_params = dict()
111
+ def __init__(self,
112
+ play: Play = None,
113
+ from_files: dict[str, list[str]] = None,
114
+ from_include: bool = False,
115
+ validate: bool = True,
116
+ public: bool = None,
117
+ static: bool = True) -> None:
118
+ self._role_name: str = None
119
+ self._role_path: str = None
120
+ self._role_collection: str = None
121
+ self._role_params: dict[str, dict[str, str]] = dict()
106
122
  self._loader = None
107
- self.static = static
123
+ self.static: bool = static
108
124
 
109
125
  # includes (static=false) default to private, while imports (static=true) default to public
110
126
  # but both can be overridden by global config if set
@@ -117,26 +133,26 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
117
133
  else:
118
134
  self.public = public
119
135
 
120
- self._metadata = RoleMetadata()
121
- self._play = play
122
- self._parents = []
123
- self._dependencies = []
124
- self._all_dependencies = None
125
- self._task_blocks = []
126
- self._handler_blocks = []
127
- self._compiled_handler_blocks = None
128
- self._default_vars = dict()
129
- self._role_vars = dict()
130
- self._had_task_run = dict()
131
- self._completed = dict()
132
- self._should_validate = validate
136
+ self._metadata: RoleMetadata = RoleMetadata()
137
+ self._play: Play = play
138
+ self._parents: list[Role] = []
139
+ self._dependencies: list[Role] = []
140
+ self._all_dependencies: list[Role] | None = None
141
+ self._task_blocks: list[Block] = []
142
+ self._handler_blocks: list[Block] = []
143
+ self._compiled_handler_blocks: list[Block] | None = None
144
+ self._default_vars: dict[str, str] | None = dict()
145
+ self._role_vars: dict[str, str] | None = dict()
146
+ self._had_task_run: dict[str, bool] = dict()
147
+ self._completed: dict[str, bool] = dict()
148
+ self._should_validate: bool = validate
133
149
 
134
150
  if from_files is None:
135
151
  from_files = {}
136
- self._from_files = from_files
152
+ self._from_files: dict[str, list[str]] = from_files
137
153
 
138
154
  # Indicates whether this role was included via include/import_role
139
- self.from_include = from_include
155
+ self.from_include: bool = from_include
140
156
 
141
157
  self._hash = None
142
158
 
@@ -200,9 +216,9 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
200
216
 
201
217
  return r
202
218
 
203
- except RuntimeError:
219
+ except RecursionError as ex:
204
220
  raise AnsibleError("A recursion loop was detected with the roles specified. Make sure child roles do not have dependencies on parent roles",
205
- obj=role_include._ds)
221
+ obj=role_include._ds) from ex
206
222
 
207
223
  def _load_role_data(self, role_include, parent_role=None):
208
224
  self._role_name = role_include.role
@@ -274,18 +290,17 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
274
290
  if task_data:
275
291
  try:
276
292
  self._task_blocks = load_list_of_blocks(task_data, play=self._play, role=self, loader=self._loader, variable_manager=self._variable_manager)
277
- except AssertionError as e:
278
- raise AnsibleParserError("The tasks/main.yml file for role '%s' must contain a list of tasks" % self._role_name,
279
- obj=task_data, orig_exc=e)
293
+ except AssertionError as ex:
294
+ raise AnsibleParserError(f"The tasks/main.yml file for role {self._role_name!r} must contain a list of tasks.", obj=task_data) from ex
280
295
 
281
296
  handler_data = self._load_role_yaml('handlers', main=self._from_files.get('handlers'))
282
297
  if handler_data:
283
298
  try:
284
299
  self._handler_blocks = load_list_of_blocks(handler_data, play=self._play, role=self, use_handlers=True, loader=self._loader,
285
300
  variable_manager=self._variable_manager)
286
- except AssertionError as e:
287
- raise AnsibleParserError("The handlers/main.yml file for role '%s' must contain a list of tasks" % self._role_name,
288
- obj=handler_data, orig_exc=e)
301
+ except AssertionError as ex:
302
+ raise AnsibleParserError(f"The handlers/main.yml file for role {self._role_name!r} must contain a list of tasks.",
303
+ obj=handler_data) from ex
289
304
 
290
305
  def _get_role_argspecs(self):
291
306
  """Get the role argument spec data.
@@ -316,7 +331,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
316
331
  return getattr(self._metadata, 'argument_specs', {})
317
332
 
318
333
  def _prepend_validation_task(self, task_data, argspecs):
319
- '''Insert a role validation task if we have a role argument spec.
334
+ """Insert a role validation task if we have a role argument spec.
320
335
 
321
336
  This method will prepend a validation task to the front of the role task
322
337
  list to perform argument spec validation before any other tasks, if an arg spec
@@ -326,7 +341,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
326
341
  :param argspecs: The role argument spec data dict.
327
342
 
328
343
  :returns: The (possibly modified) task list.
329
- '''
344
+ """
330
345
  if argspecs:
331
346
  # Determine the role entry point so we can retrieve the correct argument spec.
332
347
  # This comes from the `tasks_from` value to include_role or import_role.
@@ -345,13 +360,13 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
345
360
  return task_data
346
361
 
347
362
  def _create_validation_task(self, argument_spec, entrypoint_name):
348
- '''Create a new task data structure that uses the validate_argument_spec action plugin.
363
+ """Create a new task data structure that uses the validate_argument_spec action plugin.
349
364
 
350
365
  :param argument_spec: The arg spec definition for a particular role entry point.
351
366
  This will be the entire arg spec for the entry point as read from the input file.
352
367
  :param entrypoint_name: The name of the role entry point associated with the
353
368
  supplied `argument_spec`.
354
- '''
369
+ """
355
370
 
356
371
  # If the arg spec provides a short description, use it to flesh out the validation task name
357
372
  task_name = "Validating arguments against arg spec '%s'" % entrypoint_name
@@ -359,8 +374,8 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
359
374
  task_name = task_name + ' - ' + argument_spec['short_description']
360
375
 
361
376
  return {
362
- 'action': {
363
- 'module': 'ansible.builtin.validate_argument_spec',
377
+ 'action': 'ansible.builtin.validate_argument_spec',
378
+ 'args': {
364
379
  # Pass only the 'options' portion of the arg spec to the module.
365
380
  'argument_spec': argument_spec.get('options', {}),
366
381
  'provided_arguments': self._role_params,
@@ -376,7 +391,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
376
391
  }
377
392
 
378
393
  def _load_role_yaml(self, subdir, main=None, allow_dir=False):
379
- '''
394
+ """
380
395
  Find and load role YAML files and return data found.
381
396
  :param subdir: subdir of role to search (vars, files, tasks, handlers, defaults)
382
397
  :type subdir: string
@@ -387,7 +402,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
387
402
  :type allow_dir: bool
388
403
 
389
404
  :returns: data from the matched file(s), type can be dict or list depending on vars or tasks.
390
- '''
405
+ """
391
406
  data = None
392
407
  file_path = os.path.join(self._role_path, subdir)
393
408
  if self._loader.path_exists(file_path) and self._loader.is_directory(file_path):
@@ -412,7 +427,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
412
427
  raise AnsibleParserError("Failed loading '%s' for role (%s) as it is not inside the expected role path: '%s'" %
413
428
  (to_text(found), self._role_name, to_text(file_path)))
414
429
 
415
- new_data = self._loader.load_from_file(found)
430
+ new_data = self._loader.load_from_file(found, trusted_as_template=True)
416
431
  if new_data:
417
432
  if data is not None and isinstance(new_data, Mapping):
418
433
  data = combine_vars(data, new_data)
@@ -430,10 +445,10 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
430
445
  return data
431
446
 
432
447
  def _load_dependencies(self):
433
- '''
448
+ """
434
449
  Recursively loads role dependencies from the metadata list of
435
450
  dependencies, if it exists
436
- '''
451
+ """
437
452
 
438
453
  deps = []
439
454
  for role_include in self._metadata.dependencies:
@@ -445,7 +460,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
445
460
  # other functions
446
461
 
447
462
  def add_parent(self, parent_role):
448
- ''' adds a role to the list of this roles parents '''
463
+ """ adds a role to the list of this roles parents """
449
464
  if not isinstance(parent_role, Role):
450
465
  raise AnsibleAssertionError()
451
466
 
@@ -533,10 +548,10 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
533
548
  return self._dependencies[:]
534
549
 
535
550
  def get_all_dependencies(self):
536
- '''
551
+ """
537
552
  Returns a list of all deps, built recursively from all child dependencies,
538
553
  in the proper order in which they should be executed or evaluated.
539
- '''
554
+ """
540
555
  if self._all_dependencies is None:
541
556
 
542
557
  self._all_dependencies = []
@@ -579,15 +594,15 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
579
594
  return block_list
580
595
 
581
596
  def has_run(self, host):
582
- '''
597
+ """
583
598
  Returns true if this role has been iterated over completely and
584
599
  at least one task was run
585
- '''
600
+ """
586
601
 
587
602
  return host.name in self._completed
588
603
 
589
604
  def compile(self, play, dep_chain=None):
590
- '''
605
+ """
591
606
  Returns the task list for this role, which is created by first
592
607
  recursively compiling the tasks for all direct dependencies, and
593
608
  then adding on the tasks for this role.
@@ -595,7 +610,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
595
610
  The role compile() also remembers and saves the dependency chain
596
611
  with each task, so tasks know by which route they were found, and
597
612
  can correctly take their parent's tags/conditionals into account.
598
- '''
613
+ """
599
614
  from ansible.playbook.block import Block
600
615
  from ansible.playbook.task import Task
601
616
 
@@ -21,14 +21,14 @@ import os
21
21
 
22
22
  from ansible import constants as C
23
23
  from ansible.errors import AnsibleError, AnsibleAssertionError
24
+ from ansible.module_utils._internal._datatag import AnsibleTagHelper
24
25
  from ansible.module_utils.six import string_types
25
- from ansible.parsing.yaml.objects import AnsibleBaseYAMLObject, AnsibleMapping
26
26
  from ansible.playbook.attribute import NonInheritableFieldAttribute
27
27
  from ansible.playbook.base import Base
28
28
  from ansible.playbook.collectionsearch import CollectionSearch
29
29
  from ansible.playbook.conditional import Conditional
30
30
  from ansible.playbook.taggable import Taggable
31
- from ansible.template import Templar
31
+ from ansible._internal._templating._engine import TemplateEngine
32
32
  from ansible.utils.collection_loader import AnsibleCollectionRef
33
33
  from ansible.utils.collection_loader._collection_finder import _get_collection_role_path
34
34
  from ansible.utils.path import unfrackpath
@@ -70,7 +70,7 @@ class RoleDefinition(Base, Conditional, Taggable, CollectionSearch):
70
70
  if isinstance(ds, int):
71
71
  ds = "%s" % ds
72
72
 
73
- if not isinstance(ds, dict) and not isinstance(ds, string_types) and not isinstance(ds, AnsibleBaseYAMLObject):
73
+ if not isinstance(ds, dict) and not isinstance(ds, string_types):
74
74
  raise AnsibleAssertionError()
75
75
 
76
76
  if isinstance(ds, dict):
@@ -79,12 +79,9 @@ class RoleDefinition(Base, Conditional, Taggable, CollectionSearch):
79
79
  # save the original ds for use later
80
80
  self._ds = ds
81
81
 
82
- # we create a new data structure here, using the same
83
- # object used internally by the YAML parsing code so we
84
- # can preserve file:line:column information if it exists
85
- new_ds = AnsibleMapping()
86
- if isinstance(ds, AnsibleBaseYAMLObject):
87
- new_ds.ansible_pos = ds.ansible_pos
82
+ # the new, cleaned datastructure, which will have legacy items reduced to a standard structure suitable for the
83
+ # attributes of the task class; copy any tagged data to preserve things like origin
84
+ new_ds = AnsibleTagHelper.tag_copy(ds, {})
88
85
 
89
86
  # first we pull the role name out of the data structure,
90
87
  # and then use that to determine the role path (which may
@@ -110,11 +107,11 @@ class RoleDefinition(Base, Conditional, Taggable, CollectionSearch):
110
107
  return new_ds
111
108
 
112
109
  def _load_role_name(self, ds):
113
- '''
110
+ """
114
111
  Returns the role name (either the role: or name: field) from
115
112
  the role definition, or (when the role definition is a simple
116
113
  string), just that string
117
- '''
114
+ """
118
115
 
119
116
  if isinstance(ds, string_types):
120
117
  return ds
@@ -127,18 +124,18 @@ class RoleDefinition(Base, Conditional, Taggable, CollectionSearch):
127
124
  # contains a variable, try and template it now
128
125
  if self._variable_manager:
129
126
  all_vars = self._variable_manager.get_vars(play=self._play)
130
- templar = Templar(loader=self._loader, variables=all_vars)
127
+ templar = TemplateEngine(loader=self._loader, variables=all_vars)
131
128
  role_name = templar.template(role_name)
132
129
 
133
130
  return role_name
134
131
 
135
132
  def _load_role_path(self, role_name):
136
- '''
133
+ """
137
134
  the 'role', as specified in the ds (or as a bare string), can either
138
135
  be a simple name or a full path. If it is a full path, we use the
139
136
  basename as the role name, otherwise we take the name as-given and
140
137
  append it to the default role path
141
- '''
138
+ """
142
139
 
143
140
  # create a templar class to template the dependency names, in
144
141
  # case they contain variables
@@ -147,7 +144,7 @@ class RoleDefinition(Base, Conditional, Taggable, CollectionSearch):
147
144
  else:
148
145
  all_vars = dict()
149
146
 
150
- templar = Templar(loader=self._loader, variables=all_vars)
147
+ templar = TemplateEngine(loader=self._loader, variables=all_vars)
151
148
  role_name = templar.template(role_name)
152
149
 
153
150
  role_tuple = None
@@ -198,13 +195,14 @@ class RoleDefinition(Base, Conditional, Taggable, CollectionSearch):
198
195
  return (role_name, role_path)
199
196
 
200
197
  searches = (self._collection_list or []) + role_search_paths
198
+
201
199
  raise AnsibleError("the role '%s' was not found in %s" % (role_name, ":".join(searches)), obj=self._ds)
202
200
 
203
201
  def _split_role_params(self, ds):
204
- '''
202
+ """
205
203
  Splits any random role params off from the role spec and store
206
204
  them in a dictionary of params for parsing later
207
- '''
205
+ """
208
206
 
209
207
  role_def = dict()
210
208
  role_params = dict()
@@ -19,10 +19,8 @@ from __future__ import annotations
19
19
 
20
20
  from ansible.errors import AnsibleError, AnsibleParserError
21
21
  from ansible.module_utils.six import string_types
22
- from ansible.parsing.yaml.objects import AnsibleBaseYAMLObject
23
22
  from ansible.playbook.delegatable import Delegatable
24
23
  from ansible.playbook.role.definition import RoleDefinition
25
- from ansible.module_utils.common.text.converters import to_native
26
24
 
27
25
 
28
26
  __all__ = ['RoleInclude']
@@ -42,8 +40,8 @@ class RoleInclude(RoleDefinition, Delegatable):
42
40
  @staticmethod
43
41
  def load(data, play, current_role_path=None, parent_role=None, variable_manager=None, loader=None, collection_list=None):
44
42
 
45
- if not (isinstance(data, string_types) or isinstance(data, dict) or isinstance(data, AnsibleBaseYAMLObject)):
46
- raise AnsibleParserError("Invalid role definition: %s" % to_native(data))
43
+ if not (isinstance(data, string_types) or isinstance(data, dict)):
44
+ raise AnsibleParserError("Invalid role definition.", obj=data)
47
45
 
48
46
  if isinstance(data, string_types) and ',' in data:
49
47
  raise AnsibleError("Invalid old style role requirement: %s" % data)
@@ -20,7 +20,6 @@ from __future__ import annotations
20
20
  import os
21
21
 
22
22
  from ansible.errors import AnsibleParserError, AnsibleError
23
- from ansible.module_utils.common.text.converters import to_native
24
23
  from ansible.module_utils.six import string_types
25
24
  from ansible.playbook.attribute import NonInheritableFieldAttribute
26
25
  from ansible.playbook.base import Base
@@ -32,10 +31,10 @@ __all__ = ['RoleMetadata']
32
31
 
33
32
 
34
33
  class RoleMetadata(Base, CollectionSearch):
35
- '''
34
+ """
36
35
  This class wraps the parsing and validation of the optional metadata
37
36
  within each Role (meta/main.yml).
38
- '''
37
+ """
39
38
 
40
39
  allow_duplicates = NonInheritableFieldAttribute(isa='bool', default=False)
41
40
  dependencies = NonInheritableFieldAttribute(isa='list', default=list)
@@ -48,9 +47,9 @@ class RoleMetadata(Base, CollectionSearch):
48
47
 
49
48
  @staticmethod
50
49
  def load(data, owner, variable_manager=None, loader=None):
51
- '''
50
+ """
52
51
  Returns a new RoleMetadata object based on the datastructure passed in.
53
- '''
52
+ """
54
53
 
55
54
  if not isinstance(data, dict):
56
55
  raise AnsibleParserError("the 'meta/main.yml' for role %s is not a dictionary" % owner.get_name())
@@ -59,10 +58,10 @@ class RoleMetadata(Base, CollectionSearch):
59
58
  return m
60
59
 
61
60
  def _load_dependencies(self, attr, ds):
62
- '''
61
+ """
63
62
  This is a helper loading function for the dependencies list,
64
63
  which returns a list of RoleInclude objects
65
- '''
64
+ """
66
65
 
67
66
  roles = []
68
67
  if ds:
@@ -80,8 +79,8 @@ class RoleMetadata(Base, CollectionSearch):
80
79
  if def_parsed.get('name'):
81
80
  role_def['name'] = def_parsed['name']
82
81
  roles.append(role_def)
83
- except AnsibleError as exc:
84
- raise AnsibleParserError(to_native(exc), obj=role_def, orig_exc=exc)
82
+ except AnsibleError as ex:
83
+ raise AnsibleParserError("Error parsing role dependencies.", obj=role_def) from ex
85
84
 
86
85
  current_role_path = None
87
86
  collection_search_list = None
@@ -105,8 +104,8 @@ class RoleMetadata(Base, CollectionSearch):
105
104
  return load_list_of_roles(roles, play=self._owner._play, current_role_path=current_role_path,
106
105
  variable_manager=self._variable_manager, loader=self._loader,
107
106
  collection_search_list=collection_search_list)
108
- except AssertionError as e:
109
- raise AnsibleParserError("A malformed list of role dependencies was encountered.", obj=self._ds, orig_exc=e)
107
+ except AssertionError as ex:
108
+ raise AnsibleParserError("A malformed list of role dependencies was encountered.", obj=self._ds) from ex
110
109
 
111
110
  def serialize(self):
112
111
  return dict(
@@ -24,7 +24,7 @@ from ansible.playbook.role import Role
24
24
  from ansible.playbook.role.include import RoleInclude
25
25
  from ansible.utils.display import Display
26
26
  from ansible.module_utils.six import string_types
27
- from ansible.template import Templar
27
+ from ansible._internal._templating._engine import TemplateEngine
28
28
 
29
29
  __all__ = ['IncludeRole']
30
30
 
@@ -61,7 +61,7 @@ class IncludeRole(TaskInclude):
61
61
  self._role_path = None
62
62
 
63
63
  def get_name(self):
64
- ''' return the name of the task '''
64
+ """ return the name of the task """
65
65
  return self.name or "%s : %s" % (self.action, self._role_name)
66
66
 
67
67
  def get_block_list(self, play=None, variable_manager=None, loader=None):
@@ -79,7 +79,7 @@ class IncludeRole(TaskInclude):
79
79
  available_variables = variable_manager.get_vars(play=myplay, task=self)
80
80
  else:
81
81
  available_variables = {}
82
- templar = Templar(loader=loader, variables=available_variables)
82
+ templar = TemplateEngine(loader=loader, variables=available_variables)
83
83
  from_files = templar.template(self._from_files)
84
84
 
85
85
  # build role
@@ -17,14 +17,17 @@
17
17
 
18
18
  from __future__ import annotations
19
19
 
20
+ import typing as t
21
+
20
22
  from ansible.errors import AnsibleError
21
23
  from ansible.module_utils.six import string_types
24
+ from ansible.module_utils.common.sentinel import Sentinel
25
+ from ansible.module_utils._internal._datatag import AnsibleTagHelper
22
26
  from ansible.playbook.attribute import FieldAttribute
23
- from ansible.template import Templar
24
- from ansible.utils.sentinel import Sentinel
27
+ from ansible._internal._templating._engine import TemplateEngine
25
28
 
26
29
 
27
- def _flatten_tags(tags: list) -> list:
30
+ def _flatten_tags(tags: list[str | int]) -> list[str | int]:
28
31
  rv = set()
29
32
  for tag in tags:
30
33
  if isinstance(tag, list):
@@ -42,21 +45,34 @@ class Taggable:
42
45
  def _load_tags(self, attr, ds):
43
46
  if isinstance(ds, list):
44
47
  return ds
45
- elif isinstance(ds, string_types):
46
- return [x.strip() for x in ds.split(',')]
47
- else:
48
- raise AnsibleError('tags must be specified as a list', obj=ds)
48
+
49
+ if isinstance(ds, str):
50
+ return [AnsibleTagHelper.tag_copy(ds, item.strip()) for item in ds.split(',')]
51
+
52
+ raise AnsibleError('tags must be specified as a list', obj=ds)
53
+
54
+ def _get_all_taggable_objects(self) -> t.Iterable[Taggable]:
55
+ obj = self
56
+ while obj is not None:
57
+ yield obj
58
+
59
+ if (role := getattr(obj, "_role", Sentinel)) is not Sentinel:
60
+ yield role # type: ignore[misc]
61
+
62
+ obj = obj._parent
63
+
64
+ yield self.get_play()
49
65
 
50
66
  def evaluate_tags(self, only_tags, skip_tags, all_vars):
51
- ''' this checks if the current item should be executed depending on tag options '''
67
+ """Check if the current item should be executed depending on the specified tags.
52
68
 
69
+ NOTE this method is assumed to be called only on Task objects.
70
+ """
53
71
  if self.tags:
54
- templar = Templar(loader=self._loader, variables=all_vars)
55
- obj = self
56
- while obj is not None:
72
+ templar = TemplateEngine(loader=self._loader, variables=all_vars)
73
+ for obj in self._get_all_taggable_objects():
57
74
  if (_tags := getattr(obj, "_tags", Sentinel)) is not Sentinel:
58
75
  obj._tags = _flatten_tags(templar.template(_tags))
59
- obj = obj._parent
60
76
  tags = set(self.tags)
61
77
  else:
62
78
  # this makes isdisjoint work for untagged