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
@@ -16,8 +16,8 @@
16
16
  # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
17
17
  from __future__ import annotations
18
18
 
19
- from ansible.errors import AnsibleAction, AnsibleActionFail
20
- from ansible.executor.module_common import get_action_args_with_defaults
19
+ from ansible.errors import AnsibleActionFail
20
+ from ansible.executor.module_common import _apply_action_arg_defaults
21
21
  from ansible.module_utils.facts.system.pkg_mgr import PKG_MGRS
22
22
  from ansible.plugins.action import ActionBase
23
23
  from ansible.utils.display import Display
@@ -33,12 +33,12 @@ class ActionModule(ActionBase):
33
33
  BUILTIN_PKG_MGR_MODULES = {manager['name'] for manager in PKG_MGRS}
34
34
 
35
35
  def run(self, tmp=None, task_vars=None):
36
- ''' handler for package operations '''
36
+ """ handler for package operations """
37
37
 
38
38
  self._supports_check_mode = True
39
39
  self._supports_async = True
40
40
 
41
- result = super(ActionModule, self).run(tmp, task_vars)
41
+ super(ActionModule, self).run(tmp, task_vars)
42
42
 
43
43
  module = self._task.args.get('use', 'auto')
44
44
 
@@ -92,21 +92,15 @@ class ActionModule(ActionBase):
92
92
 
93
93
  # get defaults for specific module
94
94
  context = self._shared_loader_obj.module_loader.find_plugin_with_context(module, collection_list=self._task.collections)
95
- new_module_args = get_action_args_with_defaults(
96
- context.resolved_fqcn, new_module_args, self._task.module_defaults, self._templar,
97
- action_groups=self._task._parent._play._action_groups
98
- )
95
+ new_module_args = _apply_action_arg_defaults(context.resolved_fqcn, self._task, new_module_args, self._templar)
99
96
 
100
97
  if module in self.BUILTIN_PKG_MGR_MODULES:
101
98
  # prefix with ansible.legacy to eliminate external collisions while still allowing library/ override
102
99
  module = 'ansible.legacy.' + module
103
100
 
104
101
  display.vvvv("Running %s" % module)
105
- result.update(self._execute_module(module_name=module, module_args=new_module_args, task_vars=task_vars, wrap_async=self._task.async_val))
102
+ return self._execute_module(module_name=module, module_args=new_module_args, task_vars=task_vars, wrap_async=self._task.async_val)
106
103
  else:
107
104
  raise AnsibleActionFail('Could not detect which package manager to use. Try gathering facts or setting the "use" option.')
108
-
109
- except AnsibleAction as e:
110
- result.update(e.result)
111
-
112
- return result
105
+ finally:
106
+ pass # avoid de-dent all on refactor
@@ -28,12 +28,12 @@ display = Display()
28
28
 
29
29
 
30
30
  class ActionModule(ActionBase):
31
- ''' pauses execution for a length or time, or until input is received '''
31
+ """ pauses execution for a length or time, or until input is received """
32
32
 
33
33
  BYPASS_HOST_LOOP = True
34
34
 
35
35
  def run(self, tmp=None, task_vars=None):
36
- ''' run the pause action module '''
36
+ """ run the pause action module """
37
37
  if task_vars is None:
38
38
  task_vars = dict()
39
39
 
@@ -17,10 +17,12 @@
17
17
  from __future__ import annotations
18
18
 
19
19
  import os
20
+ import pathlib
20
21
  import re
21
22
  import shlex
23
+ import typing as _t
22
24
 
23
- from ansible.errors import AnsibleError, AnsibleAction, _AnsibleActionDone, AnsibleActionFail, AnsibleActionSkip
25
+ from ansible.errors import AnsibleError, AnsibleActionFail, AnsibleActionSkip
24
26
  from ansible.executor.powershell import module_manifest as ps_manifest
25
27
  from ansible.module_utils.common.text.converters import to_bytes, to_native, to_text
26
28
  from ansible.plugins.action import ActionBase
@@ -34,8 +36,8 @@ class ActionModule(ActionBase):
34
36
  # after chopping off a potential drive letter.
35
37
  windows_absolute_path_detection = re.compile(r'^(?:[a-zA-Z]\:)?(\\|\/)')
36
38
 
37
- def run(self, tmp=None, task_vars=None):
38
- ''' handler for file transfer operations '''
39
+ def run(self, tmp: str | None = None, task_vars: dict[str, _t.Any] | None = None) -> dict[str, _t.Any]:
40
+ """ handler for file transfer operations """
39
41
  if task_vars is None:
40
42
  task_vars = dict()
41
43
 
@@ -48,12 +50,11 @@ class ActionModule(ActionBase):
48
50
  'chdir': {'type': 'str'},
49
51
  'executable': {'type': 'str'},
50
52
  },
51
- required_one_of=[
52
- ['_raw_params', 'cmd']
53
- ]
53
+ required_one_of=[['_raw_params', 'cmd']],
54
+ mutually_exclusive=[['_raw_params', 'cmd']],
54
55
  )
55
56
 
56
- result = super(ActionModule, self).run(tmp, task_vars)
57
+ super(ActionModule, self).run(tmp, task_vars)
57
58
  del tmp # tmp no longer has any effect
58
59
 
59
60
  try:
@@ -88,7 +89,7 @@ class ActionModule(ActionBase):
88
89
  # Split out the script as the first item in raw_params using
89
90
  # shlex.split() in order to support paths and files with spaces in the name.
90
91
  # Any arguments passed to the script will be added back later.
91
- raw_params = to_native(new_module_args.get('_raw_params', ''), errors='surrogate_or_strict')
92
+ raw_params = new_module_args['_raw_params'] or new_module_args['cmd']
92
93
  parts = [to_text(s, errors='surrogate_or_strict') for s in shlex.split(raw_params.strip())]
93
94
  source = parts[0]
94
95
 
@@ -105,16 +106,11 @@ class ActionModule(ActionBase):
105
106
  # check mode is supported if 'creates' or 'removes' are provided
106
107
  # the task has already been skipped if a change would not occur
107
108
  if new_module_args['creates'] or new_module_args['removes']:
108
- result['changed'] = True
109
- raise _AnsibleActionDone(result=result)
109
+ return dict(changed=True)
110
110
  # If the script doesn't return changed in the result, it defaults to True,
111
111
  # but since the script may override 'changed', just skip instead of guessing.
112
112
  else:
113
- result['changed'] = False
114
- raise AnsibleActionSkip('Check mode is not supported for this task.', result=result)
115
-
116
- # now we execute script, always assume changed.
117
- result['changed'] = True
113
+ raise AnsibleActionSkip('Check mode is not supported for this task.', result=dict(changed=False))
118
114
 
119
115
  # transfer the file to a remote tmp location
120
116
  tmp_src = self._connection._shell.join_path(self._connection._shell.tmpdir,
@@ -135,7 +131,7 @@ class ActionModule(ActionBase):
135
131
  self._fixup_perms2((self._connection._shell.tmpdir, tmp_src), execute=True)
136
132
 
137
133
  # add preparation steps to one ssh roundtrip executing the script
138
- env_dict = dict()
134
+ env_dict: dict[str, _t.Any] = {}
139
135
  env_string = self._compute_environment_string(env_dict)
140
136
 
141
137
  if executable:
@@ -150,37 +146,30 @@ class ActionModule(ActionBase):
150
146
  # like become and environment args
151
147
  if getattr(self._connection._shell, "_IS_WINDOWS", False):
152
148
  # FUTURE: use a more public method to get the exec payload
153
- become = False
154
- become_method = None
155
- become_user = None
156
- become_pass = None
157
- become_flags = None
158
- if self._connection.become:
159
- become_plugin = self._connection.become
160
- become = True
161
- become_method = become_plugin.name
162
- become_user = become_plugin.get_option('become_user', playcontext=self._play_context)
163
- become_pass = become_plugin.get_option('become_pass', playcontext=self._play_context)
164
- become_flags = become_plugin.get_option('become_flags', playcontext=self._play_context)
165
-
149
+ pc = self._task
166
150
  exec_data = ps_manifest._create_powershell_wrapper(
167
- to_bytes(script_cmd), source, {}, env_dict, self._task.async_val,
168
- become, become_method, become_user,
169
- become_pass, become_flags, "script", task_vars, None
151
+ name=f"ansible.builtin.script.{pathlib.Path(source).stem}",
152
+ module_data=to_bytes(script_cmd),
153
+ module_path=source,
154
+ module_args={},
155
+ environment=env_dict,
156
+ async_timeout=self._task.async_val,
157
+ become_plugin=self._connection.become,
158
+ substyle="script",
159
+ task_vars=task_vars,
160
+ profile='legacy', # the profile doesn't really matter since the module args dict is empty
170
161
  )
171
162
  # build the necessary exec wrapper command
172
163
  # FUTURE: this still doesn't let script work on Windows with non-pipelined connections or
173
164
  # full manual exec of KEEP_REMOTE_FILES
174
165
  script_cmd = self._connection._shell.build_module_command(env_string='', shebang='#!powershell', cmd='')
175
166
 
176
- result.update(self._low_level_execute_command(cmd=script_cmd, in_data=exec_data, sudoable=True, chdir=chdir))
167
+ # now we execute script, always assume changed.
168
+ result: dict[str, object] = dict(self._low_level_execute_command(cmd=script_cmd, in_data=exec_data, sudoable=True, chdir=chdir), changed=True)
177
169
 
178
170
  if 'rc' in result and result['rc'] != 0:
179
- raise AnsibleActionFail('non-zero return code')
171
+ result.update(msg='non-zero return code', failed=True)
180
172
 
181
- except AnsibleAction as e:
182
- result.update(e.result)
173
+ return result
183
174
  finally:
184
175
  self._remove_tmp_path(self._connection._shell.tmpdir)
185
-
186
- return result
@@ -16,9 +16,8 @@
16
16
  # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
17
17
  from __future__ import annotations
18
18
 
19
-
20
- from ansible.errors import AnsibleAction, AnsibleActionFail
21
- from ansible.executor.module_common import get_action_args_with_defaults
19
+ from ansible.errors import AnsibleActionFail
20
+ from ansible.executor.module_common import _apply_action_arg_defaults
22
21
  from ansible.plugins.action import ActionBase
23
22
 
24
23
 
@@ -35,22 +34,21 @@ class ActionModule(ActionBase):
35
34
  BUILTIN_SVC_MGR_MODULES = set(['openwrt_init', 'service', 'systemd', 'sysvinit'])
36
35
 
37
36
  def run(self, tmp=None, task_vars=None):
38
- ''' handler for package operations '''
37
+ """ handler for package operations """
39
38
 
40
39
  self._supports_check_mode = True
41
40
  self._supports_async = True
42
41
 
43
- result = super(ActionModule, self).run(tmp, task_vars)
42
+ super(ActionModule, self).run(tmp, task_vars)
44
43
  del tmp # tmp no longer has any effect
45
44
 
46
45
  module = self._task.args.get('use', 'auto').lower()
47
46
 
48
47
  if module == 'auto':
49
48
  try:
50
- if self._task.delegate_to: # if we delegate, we should use delegated host's facts
51
- module = self._templar.template("{{hostvars['%s']['ansible_facts']['service_mgr']}}" % self._task.delegate_to)
52
- else:
53
- module = self._templar.template('{{ansible_facts.service_mgr}}')
49
+ # if we delegate, we should use delegated host's facts
50
+ expr = "hostvars[delegate_to].ansible_facts.service_mgr" if self._task.delegate_to else "ansible_facts.service_mgr"
51
+ module = self._templar.resolve_variable_expression(expr, local_variables=dict(delegate_to=self._task.delegate_to))
54
52
  except Exception:
55
53
  pass # could not get it from template!
56
54
 
@@ -79,24 +77,17 @@ class ActionModule(ActionBase):
79
77
 
80
78
  # get defaults for specific module
81
79
  context = self._shared_loader_obj.module_loader.find_plugin_with_context(module, collection_list=self._task.collections)
82
- new_module_args = get_action_args_with_defaults(
83
- context.resolved_fqcn, new_module_args, self._task.module_defaults, self._templar,
84
- action_groups=self._task._parent._play._action_groups
85
- )
80
+ new_module_args = _apply_action_arg_defaults(context.resolved_fqcn, self._task, new_module_args, self._templar)
86
81
 
87
82
  # collection prefix known internal modules to avoid collisions from collections search, while still allowing library/ overrides
88
83
  if module in self.BUILTIN_SVC_MGR_MODULES:
89
84
  module = 'ansible.legacy.' + module
90
85
 
91
86
  self._display.vvvv("Running %s" % module)
92
- result.update(self._execute_module(module_name=module, module_args=new_module_args, task_vars=task_vars, wrap_async=self._task.async_val))
87
+ return self._execute_module(module_name=module, module_args=new_module_args, task_vars=task_vars, wrap_async=self._task.async_val)
93
88
  else:
94
89
  raise AnsibleActionFail('Could not detect which service manager to use. Try gathering facts or setting the "use" option.')
95
90
 
96
- except AnsibleAction as e:
97
- result.update(e.result)
98
91
  finally:
99
92
  if not self._task.async_val:
100
93
  self._remove_tmp_path(self._connection._shell.tmpdir)
101
-
102
- return result
@@ -18,12 +18,9 @@
18
18
  from __future__ import annotations
19
19
 
20
20
  from ansible.errors import AnsibleActionFail
21
- from ansible.module_utils.six import string_types
22
21
  from ansible.module_utils.parsing.convert_bool import boolean
23
22
  from ansible.plugins.action import ActionBase
24
- from ansible.utils.vars import isidentifier
25
-
26
- import ansible.constants as C
23
+ from ansible.utils.vars import validate_variable_name
27
24
 
28
25
 
29
26
  class ActionModule(ActionBase):
@@ -43,16 +40,10 @@ class ActionModule(ActionBase):
43
40
 
44
41
  if self._task.args:
45
42
  for (k, v) in self._task.args.items():
46
- k = self._templar.template(k)
43
+ k = self._templar.template(k) # a rare case where key templating is allowed; backward-compatibility for dynamic storage
47
44
 
48
- if not isidentifier(k):
49
- raise AnsibleActionFail("The variable name '%s' is not valid. Variables must start with a letter or underscore character, "
50
- "and contain only letters, numbers and underscores." % k)
45
+ validate_variable_name(k)
51
46
 
52
- # NOTE: this should really use BOOLEANS from convert_bool, but only in the k=v case,
53
- # right now it converts matching explicit YAML strings also when 'jinja2_native' is disabled.
54
- if not C.DEFAULT_JINJA2_NATIVE and isinstance(v, string_types) and v.lower() in ('true', 'false', 'yes', 'no'):
55
- v = boolean(v, strict=False)
56
47
  facts[k] = v
57
48
  else:
58
49
  raise AnsibleActionFail('No key/value pairs provided, at least one is required for this action to succeed')
@@ -19,7 +19,7 @@ from __future__ import annotations
19
19
 
20
20
  from ansible.module_utils.parsing.convert_bool import boolean
21
21
  from ansible.plugins.action import ActionBase
22
- from ansible.utils.vars import isidentifier
22
+ from ansible.utils.vars import validate_variable_name
23
23
 
24
24
 
25
25
  class ActionModule(ActionBase):
@@ -42,7 +42,7 @@ class ActionModule(ActionBase):
42
42
  data = self._task.args.get('data', {})
43
43
 
44
44
  if not isinstance(data, dict):
45
- data = self._templar.template(data, convert_bare=False, fail_on_undefined=True)
45
+ data = self._templar.template(data)
46
46
 
47
47
  if not isinstance(data, dict):
48
48
  result['failed'] = True
@@ -59,14 +59,9 @@ class ActionModule(ActionBase):
59
59
  stats[opt] = val
60
60
 
61
61
  for (k, v) in data.items():
62
-
63
62
  k = self._templar.template(k)
64
63
 
65
- if not isidentifier(k):
66
- result['failed'] = True
67
- result['msg'] = ("The variable name '%s' is not valid. Variables must start with a letter or underscore character, and contain only "
68
- "letters, numbers and underscores." % k)
69
- return result
64
+ validate_variable_name(k)
70
65
 
71
66
  stats['data'][k] = self._templar.template(v)
72
67
 
@@ -20,12 +20,13 @@ from jinja2.defaults import (
20
20
 
21
21
  from ansible import constants as C
22
22
  from ansible.config.manager import ensure_type
23
- from ansible.errors import AnsibleError, AnsibleFileNotFound, AnsibleAction, AnsibleActionFail
23
+ from ansible.errors import AnsibleError, AnsibleActionFail
24
24
  from ansible.module_utils.common.text.converters import to_bytes, to_text, to_native
25
25
  from ansible.module_utils.parsing.convert_bool import boolean
26
26
  from ansible.module_utils.six import string_types
27
27
  from ansible.plugins.action import ActionBase
28
- from ansible.template import generate_ansible_template_vars, AnsibleEnvironment
28
+ from ansible.template import trust_as_template
29
+ from ansible._internal._templating import _template_vars
29
30
 
30
31
 
31
32
  class ActionModule(ActionBase):
@@ -34,16 +35,16 @@ class ActionModule(ActionBase):
34
35
  DEFAULT_NEWLINE_SEQUENCE = "\n"
35
36
 
36
37
  def run(self, tmp=None, task_vars=None):
37
- ''' handler for template operations '''
38
+ """ handler for template operations """
38
39
 
39
40
  if task_vars is None:
40
41
  task_vars = dict()
41
42
 
42
- result = super(ActionModule, self).run(tmp, task_vars)
43
+ super(ActionModule, self).run(tmp, task_vars)
43
44
  del tmp # tmp no longer has any effect
44
45
 
45
46
  # Options type validation
46
- # stings
47
+ # strings
47
48
  for s_type in ('src', 'dest', 'state', 'newline_sequence', 'variable_start_string', 'variable_end_string', 'block_start_string',
48
49
  'block_end_string', 'comment_start_string', 'comment_end_string'):
49
50
  if s_type in self._task.args:
@@ -98,63 +99,47 @@ class ActionModule(ActionBase):
98
99
  if mode == 'preserve':
99
100
  mode = '0%03o' % stat.S_IMODE(os.stat(source).st_mode)
100
101
 
101
- # Get vault decrypted tmp file
102
- try:
103
- tmp_source = self._loader.get_real_file(source)
104
- except AnsibleFileNotFound as e:
105
- raise AnsibleActionFail("could not find src=%s, %s" % (source, to_text(e)))
106
- b_tmp_source = to_bytes(tmp_source, errors='surrogate_or_strict')
107
-
108
102
  # template the source data locally & get ready to transfer
109
- try:
110
- with open(b_tmp_source, 'rb') as f:
111
- try:
112
- template_data = to_text(f.read(), errors='surrogate_or_strict')
113
- except UnicodeError:
114
- raise AnsibleActionFail("Template source files must be utf-8 encoded")
115
-
116
- # set jinja2 internal search path for includes
117
- searchpath = task_vars.get('ansible_search_path', [])
118
- searchpath.extend([self._loader._basedir, os.path.dirname(source)])
119
-
120
- # We want to search into the 'templates' subdir of each search path in
121
- # addition to our original search paths.
122
- newsearchpath = []
123
- for p in searchpath:
124
- newsearchpath.append(os.path.join(p, 'templates'))
125
- newsearchpath.append(p)
126
- searchpath = newsearchpath
127
-
128
- # add ansible 'template' vars
129
- temp_vars = task_vars.copy()
130
- # NOTE in the case of ANSIBLE_DEBUG=1 task_vars is VarsWithSources(MutableMapping)
131
- # so | operator cannot be used as it can be used only on dicts
132
- # https://peps.python.org/pep-0584/#what-about-mapping-and-mutablemapping
133
- temp_vars.update(generate_ansible_template_vars(self._task.args.get('src', None), source, dest))
134
-
135
- # force templar to use AnsibleEnvironment to prevent issues with native types
136
- # https://github.com/ansible/ansible/issues/46169
137
- templar = self._templar.copy_with_new_env(environment_class=AnsibleEnvironment,
138
- searchpath=searchpath,
139
- newline_sequence=newline_sequence,
140
- available_variables=temp_vars)
141
- overrides = dict(
142
- block_start_string=block_start_string,
143
- block_end_string=block_end_string,
144
- variable_start_string=variable_start_string,
145
- variable_end_string=variable_end_string,
146
- comment_start_string=comment_start_string,
147
- comment_end_string=comment_end_string,
148
- trim_blocks=trim_blocks,
149
- lstrip_blocks=lstrip_blocks
150
- )
151
- resultant = templar.do_template(template_data, preserve_trailing_newlines=True, escape_backslashes=False, overrides=overrides)
152
- except AnsibleAction:
153
- raise
154
- except Exception as e:
155
- raise AnsibleActionFail("%s: %s" % (type(e).__name__, to_text(e)))
156
- finally:
157
- self._loader.cleanup_tmp_file(b_tmp_source)
103
+ template_data = trust_as_template(self._loader.get_text_file_contents(source))
104
+
105
+ # set jinja2 internal search path for includes
106
+ searchpath = task_vars.get('ansible_search_path', [])
107
+ searchpath.extend([self._loader._basedir, os.path.dirname(source)])
108
+
109
+ # We want to search into the 'templates' subdir of each search path in
110
+ # addition to our original search paths.
111
+ newsearchpath = []
112
+ for p in searchpath:
113
+ newsearchpath.append(os.path.join(p, 'templates'))
114
+ newsearchpath.append(p)
115
+ searchpath = newsearchpath
116
+
117
+ # add ansible 'template' vars
118
+ temp_vars = task_vars.copy()
119
+ temp_vars.update(_template_vars.generate_ansible_template_vars(
120
+ path=self._task.args.get('src', None),
121
+ fullpath=source,
122
+ dest_path=dest,
123
+ include_ansible_managed='ansible_managed' not in temp_vars, # do not clobber ansible_managed when set by the user
124
+ ))
125
+
126
+ overrides = dict(
127
+ block_start_string=block_start_string,
128
+ block_end_string=block_end_string,
129
+ variable_start_string=variable_start_string,
130
+ variable_end_string=variable_end_string,
131
+ comment_start_string=comment_start_string,
132
+ comment_end_string=comment_end_string,
133
+ trim_blocks=trim_blocks,
134
+ lstrip_blocks=lstrip_blocks,
135
+ newline_sequence=newline_sequence,
136
+ )
137
+
138
+ data_templar = self._templar.copy_with_new_env(searchpath=searchpath, available_variables=temp_vars)
139
+ resultant = data_templar.template(template_data, escape_backslashes=False, overrides=overrides)
140
+
141
+ if resultant is None:
142
+ resultant = ''
158
143
 
159
144
  new_task = self._task.copy()
160
145
  # mode is either the mode from task.args or the mode of the source file if the task.args
@@ -188,13 +173,8 @@ class ActionModule(ActionBase):
188
173
  loader=self._loader,
189
174
  templar=self._templar,
190
175
  shared_loader_obj=self._shared_loader_obj)
191
- result.update(copy_action.run(task_vars=task_vars))
176
+ return copy_action.run(task_vars=task_vars)
192
177
  finally:
193
178
  shutil.rmtree(to_bytes(local_tempdir, errors='surrogate_or_strict'))
194
-
195
- except AnsibleAction as e:
196
- result.update(e.result)
197
179
  finally:
198
180
  self._remove_tmp_path(self._connection._shell.tmpdir)
199
-
200
- return result
@@ -19,8 +19,7 @@ from __future__ import annotations
19
19
 
20
20
  import os
21
21
 
22
- from ansible.errors import AnsibleError, AnsibleAction, AnsibleActionFail, AnsibleActionSkip
23
- from ansible.module_utils.common.text.converters import to_text
22
+ from ansible.errors import AnsibleActionFail, AnsibleActionSkip
24
23
  from ansible.module_utils.parsing.convert_bool import boolean
25
24
  from ansible.plugins.action import ActionBase
26
25
 
@@ -30,11 +29,11 @@ class ActionModule(ActionBase):
30
29
  TRANSFERS_FILES = True
31
30
 
32
31
  def run(self, tmp=None, task_vars=None):
33
- ''' handler for unarchive operations '''
32
+ """ handler for unarchive operations """
34
33
  if task_vars is None:
35
34
  task_vars = dict()
36
35
 
37
- result = super(ActionModule, self).run(tmp, task_vars)
36
+ super(ActionModule, self).run(tmp, task_vars)
38
37
  del tmp # tmp no longer has any effect
39
38
 
40
39
  source = self._task.args.get('src', None)
@@ -68,15 +67,9 @@ class ActionModule(ActionBase):
68
67
  source = os.path.expanduser(source)
69
68
 
70
69
  if not remote_src:
71
- try:
72
- source = self._loader.get_real_file(self._find_needle('files', source), decrypt=decrypt)
73
- except AnsibleError as e:
74
- raise AnsibleActionFail(to_text(e))
70
+ source = self._loader.get_real_file(self._find_needle('files', source), decrypt=decrypt)
75
71
 
76
- try:
77
- remote_stat = self._execute_remote_stat(dest, all_vars=task_vars, follow=True)
78
- except AnsibleError as e:
79
- raise AnsibleActionFail(to_text(e))
72
+ remote_stat = self._execute_remote_stat(dest, all_vars=task_vars, follow=True)
80
73
 
81
74
  if not remote_stat['exists'] or not remote_stat['isdir']:
82
75
  raise AnsibleActionFail("dest '%s' must be an existing dir" % dest)
@@ -102,9 +95,6 @@ class ActionModule(ActionBase):
102
95
 
103
96
  # execute the unarchive module now, with the updated args (using ansible.legacy prefix to eliminate collections
104
97
  # collisions with local override
105
- result.update(self._execute_module(module_name='ansible.legacy.unarchive', module_args=new_module_args, task_vars=task_vars))
106
- except AnsibleAction as e:
107
- result.update(e.result)
98
+ return self._execute_module(module_name='ansible.legacy.unarchive', module_args=new_module_args, task_vars=task_vars)
108
99
  finally:
109
100
  self._remove_tmp_path(self._connection._shell.tmpdir)
110
- return result
@@ -5,11 +5,10 @@
5
5
 
6
6
  from __future__ import annotations
7
7
 
8
+ import collections.abc as _c
8
9
  import os
9
10
 
10
- from ansible.errors import AnsibleError, AnsibleAction, _AnsibleActionDone, AnsibleActionFail
11
- from ansible.module_utils.common.text.converters import to_native
12
- from ansible.module_utils.common.collections import Mapping, MutableMapping
11
+ from ansible.errors import AnsibleActionFail
13
12
  from ansible.module_utils.parsing.convert_bool import boolean
14
13
  from ansible.plugins.action import ActionBase
15
14
 
@@ -25,7 +24,7 @@ class ActionModule(ActionBase):
25
24
  if task_vars is None:
26
25
  task_vars = dict()
27
26
 
28
- result = super(ActionModule, self).run(tmp, task_vars)
27
+ super(ActionModule, self).run(tmp, task_vars)
29
28
  del tmp # tmp no longer has any effect
30
29
 
31
30
  body_format = self._task.args.get('body_format', 'raw')
@@ -38,38 +37,31 @@ class ActionModule(ActionBase):
38
37
  # everything is remote, so we just execute the module
39
38
  # without changing any of the module arguments
40
39
  # call with ansible.legacy prefix to prevent collections collisions while allowing local override
41
- raise _AnsibleActionDone(result=self._execute_module(module_name='ansible.legacy.uri',
42
- task_vars=task_vars, wrap_async=self._task.async_val))
40
+ return self._execute_module(module_name='ansible.legacy.uri', task_vars=task_vars, wrap_async=self._task.async_val)
43
41
 
44
42
  kwargs = {}
45
43
 
46
44
  if src:
47
- try:
48
- src = self._find_needle('files', src)
49
- except AnsibleError as e:
50
- raise AnsibleActionFail(to_native(e))
45
+ src = self._find_needle('files', src)
51
46
 
52
47
  tmp_src = self._connection._shell.join_path(self._connection._shell.tmpdir, os.path.basename(src))
53
48
  kwargs['src'] = tmp_src
54
49
  self._transfer_file(src, tmp_src)
55
50
  self._fixup_perms2((self._connection._shell.tmpdir, tmp_src))
56
51
  elif body_format == 'form-multipart':
57
- if not isinstance(body, Mapping):
52
+ if not isinstance(body, _c.Mapping):
58
53
  raise AnsibleActionFail(
59
54
  'body must be mapping, cannot be type %s' % body.__class__.__name__
60
55
  )
61
56
  for field, value in body.items():
62
- if not isinstance(value, MutableMapping):
57
+ if not isinstance(value, _c.MutableMapping):
63
58
  continue
64
59
  content = value.get('content')
65
60
  filename = value.get('filename')
66
61
  if not filename or content:
67
62
  continue
68
63
 
69
- try:
70
- filename = self._find_needle('files', filename)
71
- except AnsibleError as e:
72
- raise AnsibleActionFail(to_native(e))
64
+ filename = self._find_needle('files', filename)
73
65
 
74
66
  tmp_src = self._connection._shell.join_path(
75
67
  self._connection._shell.tmpdir,
@@ -83,10 +75,7 @@ class ActionModule(ActionBase):
83
75
  new_module_args = self._task.args | kwargs
84
76
 
85
77
  # call with ansible.legacy prefix to prevent collections collisions while allowing local override
86
- result.update(self._execute_module('ansible.legacy.uri', module_args=new_module_args, task_vars=task_vars, wrap_async=self._task.async_val))
87
- except AnsibleAction as e:
88
- result.update(e.result)
78
+ return self._execute_module('ansible.legacy.uri', module_args=new_module_args, task_vars=task_vars, wrap_async=self._task.async_val)
89
79
  finally:
90
80
  if not self._task.async_val:
91
81
  self._remove_tmp_path(self._connection._shell.tmpdir)
92
- return result