ansible-core 2.18.5rc1__py3-none-any.whl → 2.19.0b2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (710) hide show
  1. ansible/_internal/__init__.py +53 -0
  2. ansible/_internal/_ansiballz.py +265 -0
  3. ansible/_internal/_collection_proxy.py +47 -0
  4. ansible/_internal/_datatag/__init__.py +0 -0
  5. ansible/_internal/_datatag/_tags.py +130 -0
  6. ansible/_internal/_datatag/_utils.py +19 -0
  7. ansible/_internal/_datatag/_wrappers.py +33 -0
  8. ansible/_internal/_errors/__init__.py +0 -0
  9. ansible/_internal/_errors/_captured.py +128 -0
  10. ansible/_internal/_errors/_handler.py +91 -0
  11. ansible/_internal/_errors/_utils.py +310 -0
  12. ansible/_internal/_json/__init__.py +203 -0
  13. ansible/_internal/_json/_legacy_encoder.py +34 -0
  14. ansible/_internal/_json/_profiles/__init__.py +0 -0
  15. ansible/_internal/_json/_profiles/_cache_persistence.py +55 -0
  16. ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
  17. ansible/_internal/_json/_profiles/_legacy.py +197 -0
  18. ansible/_internal/_locking.py +21 -0
  19. ansible/_internal/_plugins/__init__.py +0 -0
  20. ansible/_internal/_plugins/_cache.py +57 -0
  21. ansible/_internal/_task.py +78 -0
  22. ansible/_internal/_templating/__init__.py +10 -0
  23. ansible/_internal/_templating/_access.py +86 -0
  24. ansible/_internal/_templating/_chain_templar.py +63 -0
  25. ansible/_internal/_templating/_datatag.py +95 -0
  26. ansible/_internal/_templating/_engine.py +588 -0
  27. ansible/_internal/_templating/_errors.py +28 -0
  28. ansible/_internal/_templating/_jinja_bits.py +1066 -0
  29. ansible/_internal/_templating/_jinja_common.py +332 -0
  30. ansible/_internal/_templating/_jinja_patches.py +44 -0
  31. ansible/_internal/_templating/_jinja_plugins.py +345 -0
  32. ansible/_internal/_templating/_lazy_containers.py +633 -0
  33. ansible/_internal/_templating/_marker_behaviors.py +103 -0
  34. ansible/_internal/_templating/_transform.py +63 -0
  35. ansible/_internal/_templating/_utils.py +107 -0
  36. ansible/_internal/_wrapt.py +1052 -0
  37. ansible/_internal/_yaml/__init__.py +0 -0
  38. ansible/_internal/_yaml/_constructor.py +240 -0
  39. ansible/_internal/_yaml/_dumper.py +62 -0
  40. ansible/_internal/_yaml/_errors.py +166 -0
  41. ansible/_internal/_yaml/_loader.py +66 -0
  42. ansible/_internal/ansible_collections/ansible/_protomatter/README.md +11 -0
  43. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/action/debug.py +36 -0
  44. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/apply_trust.py +19 -0
  45. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/dump_object.py +18 -0
  46. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/finalize.py +16 -0
  47. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/origin.py +18 -0
  48. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.py +24 -0
  49. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.yml +33 -0
  50. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/tag_names.py +16 -0
  51. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +17 -0
  52. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +49 -0
  53. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.py +21 -0
  54. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.yml +2 -0
  55. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.py +15 -0
  56. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.yml +19 -0
  57. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.py +18 -0
  58. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.yml +19 -0
  59. ansible/cli/__init__.py +159 -89
  60. ansible/cli/_ssh_askpass.py +47 -0
  61. ansible/cli/adhoc.py +14 -7
  62. ansible/cli/arguments/option_helpers.py +154 -7
  63. ansible/cli/config.py +43 -68
  64. ansible/cli/console.py +10 -8
  65. ansible/cli/doc.py +62 -53
  66. ansible/cli/galaxy.py +27 -20
  67. ansible/cli/inventory.py +28 -26
  68. ansible/cli/playbook.py +4 -12
  69. ansible/cli/pull.py +51 -11
  70. ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
  71. ansible/cli/vault.py +12 -11
  72. ansible/compat/__init__.py +2 -2
  73. ansible/config/base.yml +166 -112
  74. ansible/config/manager.py +52 -49
  75. ansible/constants.py +3 -4
  76. ansible/errors/__init__.py +277 -235
  77. ansible/executor/interpreter_discovery.py +28 -149
  78. ansible/executor/module_common.py +426 -493
  79. ansible/executor/play_iterator.py +22 -27
  80. ansible/executor/playbook_executor.py +11 -11
  81. ansible/executor/powershell/async_watchdog.ps1 +97 -102
  82. ansible/executor/powershell/async_wrapper.ps1 +202 -151
  83. ansible/executor/powershell/become_wrapper.ps1 +89 -144
  84. ansible/executor/powershell/bootstrap_wrapper.ps1 +24 -9
  85. ansible/executor/powershell/coverage_wrapper.ps1 +82 -135
  86. ansible/executor/powershell/exec_wrapper.ps1 +462 -196
  87. ansible/executor/powershell/module_manifest.py +417 -265
  88. ansible/executor/powershell/module_wrapper.ps1 +169 -186
  89. ansible/executor/powershell/psrp_fetch_file.ps1 +41 -0
  90. ansible/executor/powershell/psrp_put_file.ps1 +122 -0
  91. ansible/executor/powershell/winrm_fetch_file.ps1 +46 -0
  92. ansible/executor/powershell/winrm_put_file.ps1 +36 -0
  93. ansible/executor/process/worker.py +161 -96
  94. ansible/executor/stats.py +5 -5
  95. ansible/executor/task_executor.py +268 -258
  96. ansible/executor/task_queue_manager.py +124 -90
  97. ansible/executor/task_result.py +183 -78
  98. ansible/galaxy/__init__.py +2 -2
  99. ansible/galaxy/api.py +22 -18
  100. ansible/galaxy/collection/__init__.py +1 -1
  101. ansible/galaxy/collection/concrete_artifact_manager.py +8 -11
  102. ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
  103. ansible/galaxy/dependency_resolution/providers.py +1 -1
  104. ansible/galaxy/dependency_resolution/reporters.py +81 -0
  105. ansible/galaxy/role.py +4 -8
  106. ansible/galaxy/token.py +28 -21
  107. ansible/inventory/data.py +47 -57
  108. ansible/inventory/group.py +44 -72
  109. ansible/inventory/helpers.py +9 -0
  110. ansible/inventory/host.py +32 -54
  111. ansible/inventory/manager.py +78 -34
  112. ansible/keyword_desc.yml +1 -1
  113. ansible/module_utils/_internal/__init__.py +55 -0
  114. ansible/module_utils/_internal/_ambient_context.py +58 -0
  115. ansible/module_utils/_internal/_ansiballz.py +133 -0
  116. ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
  117. ansible/module_utils/_internal/_dataclass_annotation_patch.py +64 -0
  118. ansible/module_utils/_internal/_dataclass_validation.py +217 -0
  119. ansible/module_utils/_internal/_datatag/__init__.py +928 -0
  120. ansible/module_utils/_internal/_datatag/_tags.py +38 -0
  121. ansible/module_utils/_internal/_debugging.py +31 -0
  122. ansible/module_utils/_internal/_errors.py +30 -0
  123. ansible/module_utils/_internal/_json/__init__.py +63 -0
  124. ansible/module_utils/_internal/_json/_legacy_encoder.py +26 -0
  125. ansible/module_utils/_internal/_json/_profiles/__init__.py +410 -0
  126. ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
  127. ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +31 -0
  128. ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +35 -0
  129. ansible/module_utils/_internal/_json/_profiles/_module_modern_c2m.py +35 -0
  130. ansible/module_utils/_internal/_json/_profiles/_module_modern_m2c.py +33 -0
  131. ansible/module_utils/_internal/_json/_profiles/_tagless.py +50 -0
  132. ansible/module_utils/_internal/_patches/__init__.py +66 -0
  133. ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +55 -0
  134. ansible/module_utils/_internal/_patches/_socket_patch.py +34 -0
  135. ansible/module_utils/_internal/_patches/_sys_intern_patch.py +34 -0
  136. ansible/module_utils/_internal/_plugin_exec_context.py +49 -0
  137. ansible/module_utils/_internal/_testing.py +0 -0
  138. ansible/module_utils/_internal/_traceback.py +89 -0
  139. ansible/module_utils/ansible_release.py +2 -2
  140. ansible/module_utils/api.py +1 -2
  141. ansible/module_utils/basic.py +152 -120
  142. ansible/module_utils/common/_utils.py +24 -28
  143. ansible/module_utils/common/collections.py +1 -2
  144. ansible/module_utils/common/dict_transformations.py +2 -2
  145. ansible/module_utils/common/file.py +2 -2
  146. ansible/module_utils/common/json.py +90 -84
  147. ansible/module_utils/common/locale.py +2 -2
  148. ansible/module_utils/common/messages.py +108 -0
  149. ansible/module_utils/common/parameters.py +27 -24
  150. ansible/module_utils/common/process.py +2 -2
  151. ansible/module_utils/common/respawn.py +41 -19
  152. ansible/module_utils/common/sentinel.py +66 -0
  153. ansible/module_utils/common/sys_info.py +8 -8
  154. ansible/module_utils/common/text/converters.py +16 -37
  155. ansible/module_utils/common/validation.py +35 -24
  156. ansible/module_utils/common/warnings.py +86 -25
  157. ansible/module_utils/common/yaml.py +29 -3
  158. ansible/module_utils/compat/datetime.py +33 -21
  159. ansible/module_utils/compat/paramiko.py +21 -10
  160. ansible/module_utils/compat/typing.py +6 -5
  161. ansible/module_utils/connection.py +2 -2
  162. ansible/module_utils/csharp/Ansible.Basic.cs +14 -11
  163. ansible/module_utils/csharp/Ansible.Become.cs +1 -0
  164. ansible/module_utils/csharp/Ansible._Async.cs +517 -0
  165. ansible/module_utils/datatag.py +46 -0
  166. ansible/module_utils/distro/__init__.py +2 -2
  167. ansible/module_utils/facts/ansible_collector.py +4 -5
  168. ansible/module_utils/facts/collector.py +13 -14
  169. ansible/module_utils/facts/compat.py +4 -4
  170. ansible/module_utils/facts/default_collectors.py +1 -1
  171. ansible/module_utils/facts/hardware/aix.py +34 -0
  172. ansible/module_utils/facts/hardware/base.py +1 -1
  173. ansible/module_utils/facts/hardware/darwin.py +1 -3
  174. ansible/module_utils/facts/hardware/freebsd.py +2 -2
  175. ansible/module_utils/facts/hardware/linux.py +4 -4
  176. ansible/module_utils/facts/namespace.py +1 -1
  177. ansible/module_utils/facts/network/base.py +1 -1
  178. ansible/module_utils/facts/network/fc_wwn.py +1 -2
  179. ansible/module_utils/facts/network/iscsi.py +1 -2
  180. ansible/module_utils/facts/network/nvme.py +1 -2
  181. ansible/module_utils/facts/other/facter.py +1 -2
  182. ansible/module_utils/facts/other/ohai.py +2 -3
  183. ansible/module_utils/facts/system/apparmor.py +1 -2
  184. ansible/module_utils/facts/system/caps.py +1 -1
  185. ansible/module_utils/facts/system/chroot.py +1 -2
  186. ansible/module_utils/facts/system/cmdline.py +1 -2
  187. ansible/module_utils/facts/system/date_time.py +5 -3
  188. ansible/module_utils/facts/system/distribution.py +9 -8
  189. ansible/module_utils/facts/system/dns.py +1 -1
  190. ansible/module_utils/facts/system/env.py +1 -2
  191. ansible/module_utils/facts/system/fips.py +7 -20
  192. ansible/module_utils/facts/system/loadavg.py +1 -2
  193. ansible/module_utils/facts/system/local.py +1 -2
  194. ansible/module_utils/facts/system/lsb.py +1 -2
  195. ansible/module_utils/facts/system/pkg_mgr.py +1 -2
  196. ansible/module_utils/facts/system/platform.py +1 -2
  197. ansible/module_utils/facts/system/python.py +1 -2
  198. ansible/module_utils/facts/system/selinux.py +1 -1
  199. ansible/module_utils/facts/system/service_mgr.py +1 -2
  200. ansible/module_utils/facts/system/ssh_pub_keys.py +1 -1
  201. ansible/module_utils/facts/system/systemd.py +1 -1
  202. ansible/module_utils/facts/system/user.py +1 -2
  203. ansible/module_utils/facts/utils.py +3 -3
  204. ansible/module_utils/facts/virtual/base.py +1 -1
  205. ansible/module_utils/facts/virtual/sunos.py +3 -15
  206. ansible/module_utils/facts/virtual/sysctl.py +3 -16
  207. ansible/module_utils/json_utils.py +2 -2
  208. ansible/module_utils/parsing/convert_bool.py +1 -1
  209. ansible/module_utils/service.py +18 -21
  210. ansible/module_utils/splitter.py +7 -7
  211. ansible/module_utils/testing.py +31 -0
  212. ansible/module_utils/urls.py +60 -31
  213. ansible/modules/add_host.py +4 -4
  214. ansible/modules/apt.py +60 -46
  215. ansible/modules/apt_key.py +19 -12
  216. ansible/modules/apt_repository.py +19 -16
  217. ansible/modules/assemble.py +6 -6
  218. ansible/modules/assert.py +4 -4
  219. ansible/modules/async_status.py +10 -12
  220. ansible/modules/async_wrapper.py +8 -3
  221. ansible/modules/blockinfile.py +6 -7
  222. ansible/modules/command.py +10 -17
  223. ansible/modules/copy.py +57 -144
  224. ansible/modules/cron.py +20 -15
  225. ansible/modules/deb822_repository.py +8 -9
  226. ansible/modules/debconf.py +5 -5
  227. ansible/modules/debug.py +4 -4
  228. ansible/modules/dnf.py +8 -8
  229. ansible/modules/dnf5.py +39 -13
  230. ansible/modules/dpkg_selections.py +4 -4
  231. ansible/modules/expect.py +8 -10
  232. ansible/modules/fail.py +4 -4
  233. ansible/modules/fetch.py +4 -4
  234. ansible/modules/file.py +174 -133
  235. ansible/modules/find.py +19 -17
  236. ansible/modules/gather_facts.py +3 -3
  237. ansible/modules/get_url.py +59 -53
  238. ansible/modules/getent.py +7 -9
  239. ansible/modules/git.py +28 -25
  240. ansible/modules/group.py +6 -6
  241. ansible/modules/group_by.py +4 -4
  242. ansible/modules/hostname.py +13 -29
  243. ansible/modules/import_playbook.py +6 -6
  244. ansible/modules/import_role.py +6 -6
  245. ansible/modules/import_tasks.py +6 -6
  246. ansible/modules/include_role.py +6 -6
  247. ansible/modules/include_tasks.py +6 -6
  248. ansible/modules/include_vars.py +6 -6
  249. ansible/modules/iptables.py +86 -73
  250. ansible/modules/known_hosts.py +10 -10
  251. ansible/modules/lineinfile.py +5 -5
  252. ansible/modules/meta.py +4 -4
  253. ansible/modules/mount_facts.py +2 -2
  254. ansible/modules/package.py +4 -4
  255. ansible/modules/package_facts.py +22 -10
  256. ansible/modules/pause.py +6 -6
  257. ansible/modules/ping.py +6 -6
  258. ansible/modules/pip.py +10 -11
  259. ansible/modules/raw.py +4 -4
  260. ansible/modules/reboot.py +6 -6
  261. ansible/modules/replace.py +9 -13
  262. ansible/modules/rpm_key.py +7 -8
  263. ansible/modules/script.py +4 -4
  264. ansible/modules/service.py +7 -8
  265. ansible/modules/service_facts.py +87 -10
  266. ansible/modules/set_fact.py +5 -5
  267. ansible/modules/set_stats.py +4 -4
  268. ansible/modules/setup.py +2 -2
  269. ansible/modules/shell.py +6 -6
  270. ansible/modules/slurp.py +6 -6
  271. ansible/modules/stat.py +9 -23
  272. ansible/modules/subversion.py +15 -15
  273. ansible/modules/systemd.py +6 -6
  274. ansible/modules/systemd_service.py +6 -6
  275. ansible/modules/sysvinit.py +6 -6
  276. ansible/modules/tempfile.py +5 -6
  277. ansible/modules/template.py +6 -6
  278. ansible/modules/unarchive.py +32 -11
  279. ansible/modules/uri.py +33 -26
  280. ansible/modules/user.py +53 -34
  281. ansible/modules/validate_argument_spec.py +10 -7
  282. ansible/modules/wait_for.py +32 -27
  283. ansible/modules/wait_for_connection.py +6 -6
  284. ansible/modules/yum_repository.py +6 -6
  285. ansible/parsing/ajson.py +14 -32
  286. ansible/parsing/dataloader.py +99 -54
  287. ansible/parsing/mod_args.py +28 -44
  288. ansible/parsing/plugin_docs.py +21 -86
  289. ansible/parsing/quoting.py +1 -1
  290. ansible/parsing/splitter.py +27 -12
  291. ansible/parsing/utils/addresses.py +24 -24
  292. ansible/parsing/utils/jsonify.py +5 -1
  293. ansible/parsing/utils/yaml.py +32 -61
  294. ansible/parsing/vault/__init__.py +319 -87
  295. ansible/parsing/yaml/__init__.py +0 -18
  296. ansible/parsing/yaml/dumper.py +6 -120
  297. ansible/parsing/yaml/loader.py +6 -39
  298. ansible/parsing/yaml/objects.py +43 -335
  299. ansible/playbook/__init__.py +1 -1
  300. ansible/playbook/attribute.py +8 -3
  301. ansible/playbook/base.py +182 -132
  302. ansible/playbook/block.py +26 -24
  303. ansible/playbook/collectionsearch.py +1 -15
  304. ansible/playbook/conditional.py +3 -77
  305. ansible/playbook/handler.py +8 -2
  306. ansible/playbook/helpers.py +41 -53
  307. ansible/playbook/included_file.py +31 -27
  308. ansible/playbook/loop_control.py +2 -2
  309. ansible/playbook/play.py +85 -44
  310. ansible/playbook/play_context.py +12 -17
  311. ansible/playbook/playbook_include.py +14 -15
  312. ansible/playbook/role/__init__.py +24 -26
  313. ansible/playbook/role/definition.py +15 -17
  314. ansible/playbook/role/include.py +2 -4
  315. ansible/playbook/role/metadata.py +10 -11
  316. ansible/playbook/role_include.py +3 -3
  317. ansible/playbook/taggable.py +13 -8
  318. ansible/playbook/task.py +188 -118
  319. ansible/playbook/task_include.py +5 -5
  320. ansible/plugins/__init__.py +68 -21
  321. ansible/plugins/action/__init__.py +209 -176
  322. ansible/plugins/action/add_host.py +1 -1
  323. ansible/plugins/action/assemble.py +1 -1
  324. ansible/plugins/action/assert.py +54 -66
  325. ansible/plugins/action/copy.py +7 -11
  326. ansible/plugins/action/debug.py +37 -31
  327. ansible/plugins/action/dnf.py +3 -4
  328. ansible/plugins/action/fail.py +1 -1
  329. ansible/plugins/action/fetch.py +4 -5
  330. ansible/plugins/action/gather_facts.py +7 -6
  331. ansible/plugins/action/group_by.py +1 -1
  332. ansible/plugins/action/include_vars.py +10 -11
  333. ansible/plugins/action/package.py +3 -6
  334. ansible/plugins/action/pause.py +2 -2
  335. ansible/plugins/action/script.py +15 -8
  336. ansible/plugins/action/service.py +6 -11
  337. ansible/plugins/action/set_fact.py +3 -12
  338. ansible/plugins/action/set_stats.py +3 -8
  339. ansible/plugins/action/template.py +35 -59
  340. ansible/plugins/action/unarchive.py +1 -1
  341. ansible/plugins/action/validate_argument_spec.py +5 -5
  342. ansible/plugins/action/wait_for_connection.py +1 -1
  343. ansible/plugins/become/__init__.py +31 -8
  344. ansible/plugins/become/runas.py +71 -0
  345. ansible/plugins/become/su.py +13 -8
  346. ansible/plugins/become/sudo.py +19 -0
  347. ansible/plugins/cache/__init__.py +35 -44
  348. ansible/plugins/cache/base.py +8 -0
  349. ansible/plugins/cache/jsonfile.py +10 -16
  350. ansible/plugins/cache/memory.py +6 -12
  351. ansible/plugins/callback/__init__.py +284 -179
  352. ansible/plugins/callback/default.py +99 -92
  353. ansible/plugins/callback/junit.py +44 -39
  354. ansible/plugins/callback/minimal.py +28 -25
  355. ansible/plugins/callback/oneline.py +28 -21
  356. ansible/plugins/callback/tree.py +16 -11
  357. ansible/plugins/connection/__init__.py +47 -34
  358. ansible/plugins/connection/local.py +150 -54
  359. ansible/plugins/connection/paramiko_ssh.py +21 -18
  360. ansible/plugins/connection/psrp.py +76 -165
  361. ansible/plugins/connection/ssh.py +301 -78
  362. ansible/plugins/connection/winrm.py +58 -140
  363. ansible/plugins/doc_fragments/action_common_attributes.py +14 -14
  364. ansible/plugins/doc_fragments/action_core.py +6 -6
  365. ansible/plugins/doc_fragments/backup.py +2 -2
  366. ansible/plugins/doc_fragments/checksum_common.py +27 -0
  367. ansible/plugins/doc_fragments/constructed.py +6 -2
  368. ansible/plugins/doc_fragments/decrypt.py +2 -2
  369. ansible/plugins/doc_fragments/default_callback.py +2 -2
  370. ansible/plugins/doc_fragments/files.py +2 -2
  371. ansible/plugins/doc_fragments/inventory_cache.py +2 -2
  372. ansible/plugins/doc_fragments/result_format_callback.py +2 -2
  373. ansible/plugins/doc_fragments/return_common.py +2 -2
  374. ansible/plugins/doc_fragments/template_common.py +4 -4
  375. ansible/plugins/doc_fragments/url.py +17 -1
  376. ansible/plugins/doc_fragments/url_windows.py +2 -2
  377. ansible/plugins/doc_fragments/validate.py +2 -2
  378. ansible/plugins/doc_fragments/vars_plugin_staging.py +2 -2
  379. ansible/plugins/filter/__init__.py +6 -2
  380. ansible/plugins/filter/b64decode.yml +22 -0
  381. ansible/plugins/filter/b64encode.yml +22 -0
  382. ansible/plugins/filter/bool.yml +11 -4
  383. ansible/plugins/filter/core.py +225 -108
  384. ansible/plugins/filter/encryption.py +32 -32
  385. ansible/plugins/filter/flatten.yml +3 -2
  386. ansible/plugins/filter/human_to_bytes.yml +1 -1
  387. ansible/plugins/filter/mathstuff.py +30 -37
  388. ansible/plugins/filter/password_hash.yml +8 -0
  389. ansible/plugins/filter/regex_search.yml +1 -4
  390. ansible/plugins/filter/split.yml +1 -1
  391. ansible/plugins/filter/to_nice_yaml.yml +0 -4
  392. ansible/plugins/filter/to_yaml.yml +0 -4
  393. ansible/plugins/filter/unvault.yml +1 -1
  394. ansible/plugins/filter/urls.py +1 -1
  395. ansible/plugins/filter/urlsplit.py +8 -9
  396. ansible/plugins/filter/vault.yml +14 -9
  397. ansible/plugins/filter/win_basename.yml +6 -1
  398. ansible/plugins/filter/win_dirname.yml +5 -0
  399. ansible/plugins/inventory/__init__.py +97 -77
  400. ansible/plugins/inventory/advanced_host_list.py +7 -5
  401. ansible/plugins/inventory/auto.py +11 -4
  402. ansible/plugins/inventory/constructed.py +21 -24
  403. ansible/plugins/inventory/generator.py +16 -11
  404. ansible/plugins/inventory/host_list.py +7 -5
  405. ansible/plugins/inventory/ini.py +78 -44
  406. ansible/plugins/inventory/script.py +189 -119
  407. ansible/plugins/inventory/toml.py +16 -126
  408. ansible/plugins/inventory/yaml.py +10 -8
  409. ansible/plugins/list.py +3 -3
  410. ansible/plugins/loader.py +197 -82
  411. ansible/plugins/lookup/__init__.py +21 -4
  412. ansible/plugins/lookup/config.py +21 -35
  413. ansible/plugins/lookup/csvfile.py +3 -2
  414. ansible/plugins/lookup/dict.py +1 -6
  415. ansible/plugins/lookup/env.py +12 -9
  416. ansible/plugins/lookup/file.py +5 -8
  417. ansible/plugins/lookup/first_found.py +86 -55
  418. ansible/plugins/lookup/indexed_items.py +1 -10
  419. ansible/plugins/lookup/ini.py +14 -13
  420. ansible/plugins/lookup/items.py +1 -1
  421. ansible/plugins/lookup/lines.py +8 -1
  422. ansible/plugins/lookup/list.py +1 -1
  423. ansible/plugins/lookup/nested.py +2 -18
  424. ansible/plugins/lookup/password.py +5 -5
  425. ansible/plugins/lookup/pipe.py +5 -7
  426. ansible/plugins/lookup/sequence.py +18 -8
  427. ansible/plugins/lookup/subelements.py +1 -4
  428. ansible/plugins/lookup/template.py +42 -36
  429. ansible/plugins/lookup/together.py +0 -12
  430. ansible/plugins/lookup/unvault.py +1 -5
  431. ansible/plugins/lookup/url.py +2 -8
  432. ansible/plugins/lookup/vars.py +16 -24
  433. ansible/plugins/shell/__init__.py +2 -2
  434. ansible/plugins/shell/cmd.py +2 -2
  435. ansible/plugins/shell/powershell.py +39 -22
  436. ansible/plugins/shell/sh.py +3 -2
  437. ansible/plugins/strategy/__init__.py +159 -184
  438. ansible/plugins/strategy/debug.py +2 -2
  439. ansible/plugins/strategy/free.py +16 -31
  440. ansible/plugins/strategy/host_pinned.py +2 -2
  441. ansible/plugins/strategy/linear.py +41 -41
  442. ansible/plugins/terminal/__init__.py +4 -4
  443. ansible/plugins/test/__init__.py +7 -2
  444. ansible/plugins/test/core.py +55 -21
  445. ansible/plugins/test/files.py +1 -1
  446. ansible/plugins/test/mathstuff.py +3 -3
  447. ansible/plugins/test/uri.py +3 -3
  448. ansible/plugins/vars/host_group_vars.py +7 -14
  449. ansible/release.py +2 -2
  450. ansible/template/__init__.py +370 -944
  451. ansible/utils/__init__.py +0 -18
  452. ansible/utils/_ssh_agent.py +657 -0
  453. ansible/utils/collection_loader/__init__.py +52 -5
  454. ansible/utils/collection_loader/_collection_config.py +5 -6
  455. ansible/utils/collection_loader/_collection_finder.py +79 -93
  456. ansible/utils/collection_loader/_collection_meta.py +13 -8
  457. ansible/utils/display.py +433 -63
  458. ansible/utils/encrypt.py +27 -19
  459. ansible/utils/fqcn.py +2 -2
  460. ansible/utils/hashing.py +2 -2
  461. ansible/utils/helpers.py +2 -2
  462. ansible/utils/listify.py +8 -8
  463. ansible/utils/lock.py +2 -2
  464. ansible/utils/path.py +4 -4
  465. ansible/utils/plugin_docs.py +14 -13
  466. ansible/utils/sentinel.py +4 -62
  467. ansible/utils/singleton.py +2 -0
  468. ansible/utils/ssh_functions.py +1 -1
  469. ansible/utils/unsafe_proxy.py +23 -332
  470. ansible/utils/vars.py +51 -8
  471. ansible/utils/version.py +2 -2
  472. ansible/vars/clean.py +5 -5
  473. ansible/vars/hostvars.py +60 -90
  474. ansible/vars/manager.py +206 -282
  475. ansible/vars/reserved.py +8 -9
  476. ansible_core-2.19.0b2.dist-info/BSD-3-Clause.txt +28 -0
  477. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/METADATA +5 -4
  478. ansible_core-2.19.0b2.dist-info/RECORD +1072 -0
  479. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/WHEEL +1 -1
  480. ansible_test/_data/completion/docker.txt +7 -7
  481. ansible_test/_data/completion/remote.txt +6 -6
  482. ansible_test/_data/completion/windows.txt +1 -0
  483. ansible_test/_data/requirements/ansible.txt +2 -2
  484. ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
  485. ansible_test/_data/requirements/sanity.changelog.txt +1 -1
  486. ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
  487. ansible_test/_data/requirements/sanity.pylint.txt +4 -4
  488. ansible_test/_data/requirements/sanity.validate-modules.txt +2 -2
  489. ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
  490. ansible_test/_data/requirements/units.txt +1 -0
  491. ansible_test/_internal/__init__.py +1 -0
  492. ansible_test/_internal/ansible_util.py +2 -0
  493. ansible_test/_internal/become.py +1 -0
  494. ansible_test/_internal/bootstrap.py +1 -0
  495. ansible_test/_internal/cache.py +1 -0
  496. ansible_test/_internal/cgroup.py +1 -0
  497. ansible_test/_internal/ci/__init__.py +1 -0
  498. ansible_test/_internal/ci/azp.py +1 -0
  499. ansible_test/_internal/ci/local.py +1 -0
  500. ansible_test/_internal/classification/__init__.py +1 -0
  501. ansible_test/_internal/classification/common.py +1 -0
  502. ansible_test/_internal/classification/csharp.py +1 -0
  503. ansible_test/_internal/classification/powershell.py +1 -0
  504. ansible_test/_internal/classification/python.py +1 -0
  505. ansible_test/_internal/cli/__init__.py +1 -0
  506. ansible_test/_internal/cli/actions.py +1 -0
  507. ansible_test/_internal/cli/argparsing/__init__.py +1 -0
  508. ansible_test/_internal/cli/argparsing/actions.py +1 -0
  509. ansible_test/_internal/cli/argparsing/argcompletion.py +1 -0
  510. ansible_test/_internal/cli/argparsing/parsers.py +1 -0
  511. ansible_test/_internal/cli/commands/__init__.py +11 -0
  512. ansible_test/_internal/cli/commands/coverage/__init__.py +1 -0
  513. ansible_test/_internal/cli/commands/coverage/analyze/__init__.py +1 -0
  514. ansible_test/_internal/cli/commands/coverage/analyze/targets/__init__.py +1 -0
  515. ansible_test/_internal/cli/commands/coverage/analyze/targets/combine.py +1 -0
  516. ansible_test/_internal/cli/commands/coverage/analyze/targets/expand.py +1 -0
  517. ansible_test/_internal/cli/commands/coverage/analyze/targets/filter.py +1 -0
  518. ansible_test/_internal/cli/commands/coverage/analyze/targets/generate.py +1 -0
  519. ansible_test/_internal/cli/commands/coverage/analyze/targets/missing.py +1 -0
  520. ansible_test/_internal/cli/commands/coverage/combine.py +1 -0
  521. ansible_test/_internal/cli/commands/coverage/erase.py +1 -0
  522. ansible_test/_internal/cli/commands/coverage/html.py +1 -0
  523. ansible_test/_internal/cli/commands/coverage/report.py +1 -0
  524. ansible_test/_internal/cli/commands/coverage/xml.py +1 -0
  525. ansible_test/_internal/cli/commands/env.py +1 -0
  526. ansible_test/_internal/cli/commands/integration/__init__.py +1 -0
  527. ansible_test/_internal/cli/commands/integration/network.py +1 -0
  528. ansible_test/_internal/cli/commands/integration/posix.py +1 -0
  529. ansible_test/_internal/cli/commands/integration/windows.py +1 -0
  530. ansible_test/_internal/cli/commands/sanity.py +9 -0
  531. ansible_test/_internal/cli/commands/shell.py +1 -0
  532. ansible_test/_internal/cli/commands/units.py +1 -0
  533. ansible_test/_internal/cli/compat.py +1 -0
  534. ansible_test/_internal/cli/completers.py +1 -0
  535. ansible_test/_internal/cli/converters.py +1 -0
  536. ansible_test/_internal/cli/environments.py +1 -0
  537. ansible_test/_internal/cli/epilog.py +1 -0
  538. ansible_test/_internal/cli/parsers/__init__.py +1 -0
  539. ansible_test/_internal/cli/parsers/base_argument_parsers.py +1 -0
  540. ansible_test/_internal/cli/parsers/helpers.py +1 -0
  541. ansible_test/_internal/cli/parsers/host_config_parsers.py +1 -0
  542. ansible_test/_internal/cli/parsers/key_value_parsers.py +1 -0
  543. ansible_test/_internal/cli/parsers/value_parsers.py +1 -0
  544. ansible_test/_internal/commands/__init__.py +1 -0
  545. ansible_test/_internal/commands/coverage/__init__.py +2 -1
  546. ansible_test/_internal/commands/coverage/analyze/__init__.py +1 -0
  547. ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +1 -0
  548. ansible_test/_internal/commands/coverage/analyze/targets/combine.py +1 -0
  549. ansible_test/_internal/commands/coverage/analyze/targets/expand.py +1 -0
  550. ansible_test/_internal/commands/coverage/analyze/targets/filter.py +1 -0
  551. ansible_test/_internal/commands/coverage/analyze/targets/generate.py +1 -0
  552. ansible_test/_internal/commands/coverage/analyze/targets/missing.py +1 -0
  553. ansible_test/_internal/commands/coverage/combine.py +2 -1
  554. ansible_test/_internal/commands/coverage/erase.py +1 -0
  555. ansible_test/_internal/commands/coverage/html.py +1 -0
  556. ansible_test/_internal/commands/coverage/report.py +1 -0
  557. ansible_test/_internal/commands/coverage/xml.py +1 -0
  558. ansible_test/_internal/commands/env/__init__.py +2 -0
  559. ansible_test/_internal/commands/integration/__init__.py +4 -0
  560. ansible_test/_internal/commands/integration/cloud/__init__.py +1 -0
  561. ansible_test/_internal/commands/integration/cloud/acme.py +2 -1
  562. ansible_test/_internal/commands/integration/cloud/aws.py +1 -0
  563. ansible_test/_internal/commands/integration/cloud/azure.py +1 -0
  564. ansible_test/_internal/commands/integration/cloud/cs.py +1 -0
  565. ansible_test/_internal/commands/integration/cloud/digitalocean.py +1 -0
  566. ansible_test/_internal/commands/integration/cloud/galaxy.py +3 -2
  567. ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -0
  568. ansible_test/_internal/commands/integration/cloud/httptester.py +2 -1
  569. ansible_test/_internal/commands/integration/cloud/nios.py +2 -1
  570. ansible_test/_internal/commands/integration/cloud/opennebula.py +1 -0
  571. ansible_test/_internal/commands/integration/cloud/openshift.py +1 -0
  572. ansible_test/_internal/commands/integration/cloud/scaleway.py +1 -0
  573. ansible_test/_internal/commands/integration/cloud/vcenter.py +1 -0
  574. ansible_test/_internal/commands/integration/cloud/vultr.py +1 -0
  575. ansible_test/_internal/commands/integration/coverage.py +1 -0
  576. ansible_test/_internal/commands/integration/filters.py +1 -0
  577. ansible_test/_internal/commands/integration/network.py +1 -0
  578. ansible_test/_internal/commands/integration/posix.py +1 -0
  579. ansible_test/_internal/commands/integration/windows.py +1 -0
  580. ansible_test/_internal/commands/sanity/__init__.py +16 -1
  581. ansible_test/_internal/commands/sanity/ansible_doc.py +1 -0
  582. ansible_test/_internal/commands/sanity/bin_symlinks.py +1 -0
  583. ansible_test/_internal/commands/sanity/compile.py +1 -0
  584. ansible_test/_internal/commands/sanity/ignores.py +1 -0
  585. ansible_test/_internal/commands/sanity/import.py +1 -0
  586. ansible_test/_internal/commands/sanity/integration_aliases.py +1 -0
  587. ansible_test/_internal/commands/sanity/pep8.py +1 -0
  588. ansible_test/_internal/commands/sanity/pslint.py +1 -0
  589. ansible_test/_internal/commands/sanity/pylint.py +24 -26
  590. ansible_test/_internal/commands/sanity/shellcheck.py +1 -0
  591. ansible_test/_internal/commands/sanity/validate_modules.py +1 -0
  592. ansible_test/_internal/commands/sanity/yamllint.py +1 -0
  593. ansible_test/_internal/commands/shell/__init__.py +1 -0
  594. ansible_test/_internal/commands/units/__init__.py +1 -0
  595. ansible_test/_internal/compat/__init__.py +1 -0
  596. ansible_test/_internal/compat/packaging.py +1 -0
  597. ansible_test/_internal/compat/yaml.py +1 -0
  598. ansible_test/_internal/completion.py +1 -0
  599. ansible_test/_internal/config.py +2 -0
  600. ansible_test/_internal/connections.py +1 -0
  601. ansible_test/_internal/constants.py +1 -0
  602. ansible_test/_internal/containers.py +1 -0
  603. ansible_test/_internal/content_config.py +1 -0
  604. ansible_test/_internal/core_ci.py +1 -0
  605. ansible_test/_internal/coverage_util.py +11 -10
  606. ansible_test/_internal/data.py +1 -0
  607. ansible_test/_internal/delegation.py +1 -0
  608. ansible_test/_internal/dev/__init__.py +1 -0
  609. ansible_test/_internal/dev/container_probe.py +1 -0
  610. ansible_test/_internal/diff.py +3 -2
  611. ansible_test/_internal/docker_util.py +2 -1
  612. ansible_test/_internal/encoding.py +1 -0
  613. ansible_test/_internal/executor.py +1 -0
  614. ansible_test/_internal/git.py +1 -0
  615. ansible_test/_internal/host_configs.py +1 -0
  616. ansible_test/_internal/host_profiles.py +1 -0
  617. ansible_test/_internal/http.py +1 -0
  618. ansible_test/_internal/init.py +1 -0
  619. ansible_test/_internal/inventory.py +35 -3
  620. ansible_test/_internal/io.py +1 -0
  621. ansible_test/_internal/metadata.py +1 -0
  622. ansible_test/_internal/payload.py +1 -0
  623. ansible_test/_internal/provider/__init__.py +1 -0
  624. ansible_test/_internal/provider/layout/__init__.py +1 -0
  625. ansible_test/_internal/provider/layout/ansible.py +1 -0
  626. ansible_test/_internal/provider/layout/collection.py +1 -0
  627. ansible_test/_internal/provider/layout/unsupported.py +1 -0
  628. ansible_test/_internal/provider/source/__init__.py +1 -0
  629. ansible_test/_internal/provider/source/git.py +1 -0
  630. ansible_test/_internal/provider/source/installed.py +1 -0
  631. ansible_test/_internal/provider/source/unsupported.py +1 -0
  632. ansible_test/_internal/provider/source/unversioned.py +1 -0
  633. ansible_test/_internal/provisioning.py +1 -0
  634. ansible_test/_internal/pypi_proxy.py +6 -5
  635. ansible_test/_internal/python_requirements.py +1 -0
  636. ansible_test/_internal/ssh.py +1 -0
  637. ansible_test/_internal/target.py +1 -0
  638. ansible_test/_internal/test.py +3 -2
  639. ansible_test/_internal/thread.py +1 -0
  640. ansible_test/_internal/timeout.py +1 -0
  641. ansible_test/_internal/util.py +1 -0
  642. ansible_test/_internal/util_common.py +5 -2
  643. ansible_test/_internal/venv.py +1 -0
  644. ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +1 -0
  645. ansible_test/_util/controller/sanity/code-smell/changelog/sphinx.py +1 -0
  646. ansible_test/_util/controller/sanity/code-smell/changelog.py +1 -0
  647. ansible_test/_util/controller/sanity/code-smell/empty-init.py +1 -0
  648. ansible_test/_util/controller/sanity/code-smell/line-endings.py +1 -0
  649. ansible_test/_util/controller/sanity/code-smell/no-assert.py +1 -0
  650. ansible_test/_util/controller/sanity/code-smell/no-get-exception.py +1 -0
  651. ansible_test/_util/controller/sanity/code-smell/no-illegal-filenames.py +1 -0
  652. ansible_test/_util/controller/sanity/code-smell/no-smart-quotes.py +1 -0
  653. ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py +1 -0
  654. ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +28 -1
  655. ansible_test/_util/controller/sanity/code-smell/shebang.py +1 -0
  656. ansible_test/_util/controller/sanity/code-smell/symlinks.py +1 -0
  657. ansible_test/_util/controller/sanity/code-smell/use-argspec-type-path.py +1 -0
  658. ansible_test/_util/controller/sanity/code-smell/use-compat-six.py +1 -0
  659. ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py +2 -1
  660. ansible_test/_util/controller/sanity/pep8/current-ignore.txt +4 -0
  661. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +7 -5
  662. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +7 -5
  663. ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +7 -5
  664. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +3 -5
  665. ansible_test/_util/controller/sanity/pylint/config/default.cfg +7 -7
  666. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +1 -13
  667. ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +1 -0
  668. ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +1 -8
  669. ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +1 -8
  670. ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +55 -28
  671. ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +12 -5
  672. ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +13 -2
  673. ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -0
  674. ansible_test/_util/controller/sanity/yamllint/yamllinter.py +35 -17
  675. ansible_test/_util/controller/tools/collection_detail.py +1 -0
  676. ansible_test/_util/controller/tools/yaml_to_json.py +2 -1
  677. ansible_test/_util/target/pytest/plugins/ansible_forked.py +6 -1
  678. ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +2 -1
  679. ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -0
  680. ansible_test/_util/target/sanity/compile/compile.py +1 -0
  681. ansible_test/_util/target/sanity/import/importer.py +15 -16
  682. ansible_test/_util/target/setup/bootstrap.sh +9 -20
  683. ansible_test/_util/target/setup/probe_cgroups.py +1 -0
  684. ansible_test/_util/target/setup/quiet_pip.py +1 -0
  685. ansible_test/_util/target/setup/requirements.py +35 -27
  686. ansible_test/_util/target/tools/virtualenvcheck.py +2 -1
  687. ansible_test/_util/target/tools/yamlcheck.py +2 -1
  688. ansible/compat/selectors.py +0 -32
  689. ansible/errors/yaml_strings.py +0 -138
  690. ansible/executor/action_write_locks.py +0 -44
  691. ansible/executor/discovery/python_target.py +0 -47
  692. ansible/executor/powershell/module_powershell_wrapper.ps1 +0 -86
  693. ansible/executor/powershell/module_script_wrapper.ps1 +0 -22
  694. ansible/module_utils/compat/importlib.py +0 -26
  695. ansible/module_utils/compat/selectors.py +0 -32
  696. ansible/module_utils/pycompat24.py +0 -73
  697. ansible/parsing/yaml/constructor.py +0 -178
  698. ansible/template/native_helpers.py +0 -251
  699. ansible/template/template.py +0 -43
  700. ansible/template/vars.py +0 -77
  701. ansible/utils/native_jinja.py +0 -11
  702. ansible/vars/fact_cache.py +0 -71
  703. ansible_core-2.18.5rc1.dist-info/RECORD +0 -992
  704. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/Apache-License.txt +0 -0
  705. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/COPYING +0 -0
  706. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/MIT-license.txt +0 -0
  707. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/PSF-license.txt +0 -0
  708. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/entry_points.txt +0 -0
  709. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/simplified_bsd.txt +0 -0
  710. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/top_level.txt +0 -0
@@ -3,11 +3,14 @@
3
3
 
4
4
  from __future__ import annotations
5
5
 
6
+ import dataclasses
6
7
  import os
7
8
  import pathlib
8
9
  import subprocess
9
10
  import sys
11
+ import typing as t
10
12
 
13
+ from ansible.module_utils._internal import _plugin_exec_context
11
14
  from ansible.module_utils.common.text.converters import to_bytes
12
15
 
13
16
  _ANSIBLE_PARENT_PATH = pathlib.Path(__file__).parents[3]
@@ -17,7 +20,7 @@ def has_respawned():
17
20
  return hasattr(sys.modules['__main__'], '_respawned')
18
21
 
19
22
 
20
- def respawn_module(interpreter_path):
23
+ def respawn_module(interpreter_path) -> t.NoReturn:
21
24
  """
22
25
  Respawn the currently-running Ansible Python module under the specified Python interpreter.
23
26
 
@@ -55,10 +58,13 @@ def probe_interpreters_for_module(interpreter_paths, module_name):
55
58
  :arg interpreter_paths: iterable of paths to Python interpreters. The paths will be probed
56
59
  in order, and the first path that exists and can successfully import the named module will
57
60
  be returned (or ``None`` if probing fails for all supplied paths).
58
- :arg module_name: fully-qualified Python module name to probe for (eg, ``selinux``)
61
+ :arg module_name: fully-qualified Python module name to probe for (for example, ``selinux``)
59
62
  """
60
63
  PYTHONPATH = os.getenv('PYTHONPATH', '')
61
- env = os.environ | {'PYTHONPATH': f'{_ANSIBLE_PARENT_PATH}:{PYTHONPATH}'.rstrip(': ')}
64
+ env = os.environ.copy()
65
+ env.update({
66
+ 'PYTHONPATH': f'{_ANSIBLE_PARENT_PATH}:{PYTHONPATH}'.rstrip(': ')
67
+ })
62
68
  for interpreter_path in interpreter_paths:
63
69
  if not os.path.exists(interpreter_path):
64
70
  continue
@@ -80,29 +86,45 @@ def probe_interpreters_for_module(interpreter_paths, module_name):
80
86
 
81
87
 
82
88
  def _create_payload():
89
+ # FIXME: move this into _ansiballz and skip the template
83
90
  from ansible.module_utils import basic
84
- smuggled_args = getattr(basic, '_ANSIBLE_ARGS')
85
- if not smuggled_args:
86
- raise Exception('unable to access ansible.module_utils.basic._ANSIBLE_ARGS (not launched by AnsiballZ?)')
91
+
87
92
  module_fqn = sys.modules['__main__']._module_fqn
88
93
  modlib_path = sys.modules['__main__']._modlib_path
89
- respawn_code_template = '''
90
- import runpy
91
- import sys
92
-
93
- module_fqn = {module_fqn!r}
94
- modlib_path = {modlib_path!r}
95
- smuggled_args = {smuggled_args!r}
96
94
 
95
+ respawn_code_template = """
97
96
  if __name__ == '__main__':
98
- sys.path.insert(0, modlib_path)
97
+ import runpy
98
+ import sys
99
99
 
100
- from ansible.module_utils import basic
101
- basic._ANSIBLE_ARGS = smuggled_args
100
+ json_params = {json_params!r}
101
+ profile = {profile!r}
102
+ plugin_info_dict = {plugin_info_dict!r}
103
+ module_fqn = {module_fqn!r}
104
+ modlib_path = {modlib_path!r}
102
105
 
103
- runpy.run_module(module_fqn, init_globals=dict(_respawned=True), run_name='__main__', alter_sys=True)
104
- '''
106
+ sys.path.insert(0, modlib_path)
105
107
 
106
- respawn_code = respawn_code_template.format(module_fqn=module_fqn, modlib_path=modlib_path, smuggled_args=smuggled_args.strip())
108
+ from ansible.module_utils._internal import _ansiballz
109
+
110
+ _ansiballz.run_module(
111
+ json_params=json_params,
112
+ profile=profile,
113
+ plugin_info_dict=plugin_info_dict,
114
+ module_fqn=module_fqn,
115
+ modlib_path=modlib_path,
116
+ init_globals=dict(_respawned=True),
117
+ )
118
+ """
119
+
120
+ plugin_info = _plugin_exec_context.PluginExecContext.get_current_plugin_info()
121
+
122
+ respawn_code = respawn_code_template.format(
123
+ json_params=basic._ANSIBLE_ARGS,
124
+ profile=basic._ANSIBLE_PROFILE,
125
+ plugin_info_dict=dataclasses.asdict(plugin_info),
126
+ module_fqn=module_fqn,
127
+ modlib_path=modlib_path,
128
+ )
107
129
 
108
130
  return respawn_code
@@ -0,0 +1,66 @@
1
+ # Copyright (c) 2019 Ansible Project
2
+ # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
3
+
4
+ from __future__ import annotations
5
+
6
+
7
+ class Sentinel:
8
+ """
9
+ Object which can be used to mark whether an entry as being special
10
+
11
+ A sentinel value demarcates a value or marks an entry as having a special meaning. In C, the
12
+ Null byte is used as a sentinel for the end of a string. In Python, None is often used as
13
+ a Sentinel in optional parameters to mean that the parameter was not set by the user.
14
+
15
+ You should use None as a Sentinel value any Python code where None is not a valid entry. If
16
+ None is a valid entry, though, then you need to create a different value, which is the purpose
17
+ of this class.
18
+
19
+ Example of using Sentinel as a default parameter value::
20
+
21
+ def confirm_big_red_button(tristate=Sentinel):
22
+ if tristate is Sentinel:
23
+ print('You must explicitly press the big red button to blow up the base')
24
+ elif tristate is True:
25
+ print('Countdown to destruction activated')
26
+ elif tristate is False:
27
+ print('Countdown stopped')
28
+ elif tristate is None:
29
+ print('Waiting for more input')
30
+
31
+ Example of using Sentinel to tell whether a dict which has a default value has been changed::
32
+
33
+ values = {'one': Sentinel, 'two': Sentinel}
34
+ defaults = {'one': 1, 'two': 2}
35
+
36
+ # [.. Other code which does things including setting a new value for 'one' ..]
37
+ values['one'] = None
38
+ # [..]
39
+
40
+ print('You made changes to:')
41
+ for key, value in values.items():
42
+ if value is Sentinel:
43
+ continue
44
+ print('%s: %s' % (key, value)
45
+ """
46
+
47
+ def __new__(cls):
48
+ """
49
+ Return the cls itself. This makes both equality and identity True for comparing the class
50
+ to an instance of the class, preventing common usage errors.
51
+
52
+ Preferred usage::
53
+
54
+ a = Sentinel
55
+ if a is Sentinel:
56
+ print('Sentinel value')
57
+
58
+ However, these are True as well, eliminating common usage errors::
59
+
60
+ if Sentinel is Sentinel():
61
+ print('Sentinel value')
62
+
63
+ if Sentinel == Sentinel():
64
+ print('Sentinel value')
65
+ """
66
+ return cls
@@ -14,7 +14,7 @@ __all__ = ('get_distribution', 'get_distribution_version', 'get_platform_subclas
14
14
 
15
15
 
16
16
  def get_distribution():
17
- '''
17
+ """
18
18
  Return the name of the distribution the module is running on.
19
19
 
20
20
  :rtype: NativeString or None
@@ -23,7 +23,7 @@ def get_distribution():
23
23
  This function attempts to determine what distribution the code is running
24
24
  on and return a string representing that value. If the platform is Linux
25
25
  and the distribution cannot be determined, it returns ``OtherLinux``.
26
- '''
26
+ """
27
27
  distribution = distro.id().capitalize()
28
28
 
29
29
  if platform.system() == 'Linux':
@@ -38,14 +38,14 @@ def get_distribution():
38
38
 
39
39
 
40
40
  def get_distribution_version():
41
- '''
41
+ """
42
42
  Get the version of the distribution the code is running on
43
43
 
44
44
  :rtype: NativeString or None
45
45
  :returns: A string representation of the version of the distribution. If it
46
46
  cannot determine the version, it returns an empty string. If this is not run on
47
47
  a Linux machine it returns None.
48
- '''
48
+ """
49
49
  version = None
50
50
 
51
51
  needs_best_version = frozenset((
@@ -79,12 +79,12 @@ def get_distribution_version():
79
79
 
80
80
 
81
81
  def get_distribution_codename():
82
- '''
82
+ """
83
83
  Return the code name for this Linux Distribution
84
84
 
85
85
  :rtype: NativeString or None
86
86
  :returns: A string representation of the distribution's codename or None if not a Linux distro
87
- '''
87
+ """
88
88
  codename = None
89
89
  if platform.system() == 'Linux':
90
90
  # Until this gets merged and we update our bundled copy of distro:
@@ -109,7 +109,7 @@ def get_distribution_codename():
109
109
 
110
110
 
111
111
  def get_platform_subclass(cls):
112
- '''
112
+ """
113
113
  Finds a subclass implementing desired functionality on the platform the code is running on
114
114
 
115
115
  :arg cls: Class to find an appropriate subclass for
@@ -135,7 +135,7 @@ def get_platform_subclass(cls):
135
135
  def __new__(cls, *args, **kwargs):
136
136
  new_cls = get_platform_subclass(User)
137
137
  return super(cls, new_cls).__new__(new_cls)
138
- '''
138
+ """
139
139
  this_platform = platform.system()
140
140
  distribution = get_distribution()
141
141
 
@@ -6,12 +6,9 @@
6
6
  from __future__ import annotations
7
7
 
8
8
  import codecs
9
- import datetime
10
9
  import json
11
10
 
12
- from ansible.module_utils.six.moves.collections_abc import Set
13
11
  from ansible.module_utils.six import (
14
- PY3,
15
12
  binary_type,
16
13
  iteritems,
17
14
  text_type,
@@ -237,49 +234,30 @@ def to_text(obj, encoding='utf-8', errors=None, nonstring='simplerepr'):
237
234
  return to_text(value, encoding, errors)
238
235
 
239
236
 
240
- #: :py:func:`to_native`
241
- #: Transform a variable into the native str type for the python version
242
- #:
243
- #: On Python2, this is an alias for
244
- #: :func:`~ansible.module_utils.to_bytes`. On Python3 it is an alias for
245
- #: :func:`~ansible.module_utils.to_text`. It makes it easier to
246
- #: transform a variable into the native str type for the python version
247
- #: the code is running on. Use this when constructing the message to
248
- #: send to exceptions or when dealing with an API that needs to take
249
- #: a native string. Example::
250
- #:
251
- #: try:
252
- #: 1//0
253
- #: except ZeroDivisionError as e:
254
- #: raise MyException('Encountered and error: %s' % to_native(e))
255
- if PY3:
256
- to_native = to_text
257
- else:
258
- to_native = to_bytes
259
-
260
-
261
- def _json_encode_fallback(obj):
262
- if isinstance(obj, Set):
263
- return list(obj)
264
- elif isinstance(obj, datetime.datetime):
265
- return obj.isoformat()
266
- raise TypeError("Cannot json serialize %s" % to_native(obj))
237
+ to_native = to_text
267
238
 
268
239
 
269
240
  def jsonify(data, **kwargs):
270
- try:
271
- new_data = container_to_text(data, encoding='utf-8')
272
- except UnicodeDecodeError:
273
- raise UnicodeError('Invalid unicode encoding encountered')
274
- return json.dumps(new_data, default=_json_encode_fallback, **kwargs)
241
+ from ansible.module_utils.common import json as _common_json
242
+ # from ansible.module_utils.common.warnings import deprecate
243
+
244
+ # deprecated: description='deprecate jsonify()' core_version='2.23'
245
+ # deprecate(
246
+ # msg="The `jsonify` function is deprecated.",
247
+ # version="2.27",
248
+ # # help_text="", # DTFIX-RELEASE: fill in this help text
249
+ # )
250
+
251
+ return json.dumps(data, cls=_common_json._get_legacy_encoder(), _decode_bytes=True, **kwargs)
275
252
 
276
253
 
277
254
  def container_to_bytes(d, encoding='utf-8', errors='surrogate_or_strict'):
278
- ''' Recursively convert dict keys and values to byte str
255
+ """ Recursively convert dict keys and values to byte str
279
256
 
280
257
  Specialized for json return because this only handles, lists, tuples,
281
258
  and dict container types (the containers that the json module returns)
282
- '''
259
+ """
260
+ # DTFIX-RELEASE: deprecate
283
261
 
284
262
  if isinstance(d, text_type):
285
263
  return to_bytes(d, encoding=encoding, errors=errors)
@@ -299,6 +277,7 @@ def container_to_text(d, encoding='utf-8', errors='surrogate_or_strict'):
299
277
  Specialized for json return because this only handles, lists, tuples,
300
278
  and dict container types (the containers that the json module returns)
301
279
  """
280
+ # DTFIX-RELEASE: deprecate
302
281
 
303
282
  if isinstance(d, binary_type):
304
283
  # Warning, can traceback
@@ -10,16 +10,14 @@ import os
10
10
  import re
11
11
 
12
12
  from ast import literal_eval
13
+ from ansible.module_utils.common import json as _common_json
13
14
  from ansible.module_utils.common.text.converters import to_native
14
15
  from ansible.module_utils.common.collections import is_iterable
15
- from ansible.module_utils.common.text.converters import jsonify
16
16
  from ansible.module_utils.common.text.formatters import human_to_bytes
17
17
  from ansible.module_utils.common.warnings import deprecate
18
18
  from ansible.module_utils.parsing.convert_bool import boolean
19
19
  from ansible.module_utils.six import (
20
- binary_type,
21
20
  string_types,
22
- text_type,
23
21
  )
24
22
 
25
23
 
@@ -185,7 +183,7 @@ def check_required_by(requirements, parameters, options_context=None):
185
183
  :kwarg options_context: List of strings of parent key names if ``requirements`` are
186
184
  in a sub spec.
187
185
 
188
- :returns: Empty dictionary or raises :class:`TypeError` if the
186
+ :returns: Empty dictionary or raises :class:`TypeError` if the check fails.
189
187
  """
190
188
 
191
189
  result = {}
@@ -195,22 +193,15 @@ def check_required_by(requirements, parameters, options_context=None):
195
193
  for (key, value) in requirements.items():
196
194
  if key not in parameters or parameters[key] is None:
197
195
  continue
198
- result[key] = []
199
196
  # Support strings (single-item lists)
200
197
  if isinstance(value, string_types):
201
198
  value = [value]
202
- for required in value:
203
- if required not in parameters or parameters[required] is None:
204
- result[key].append(required)
205
-
206
- if result:
207
- for key, missing in result.items():
208
- if len(missing) > 0:
209
- msg = "missing parameter(s) required by '%s': %s" % (key, ', '.join(missing))
210
- if options_context:
211
- msg = "{0} found in {1}".format(msg, " -> ".join(options_context))
212
- raise TypeError(to_native(msg))
213
199
 
200
+ if missing := [required for required in value if required not in parameters or parameters[required] is None]:
201
+ msg = f"missing parameter(s) required by '{key}': {', '.join(missing)}"
202
+ if options_context:
203
+ msg = f"{msg} found in {' -> '.join(options_context)}"
204
+ raise TypeError(to_native(msg))
214
205
  return result
215
206
 
216
207
 
@@ -392,6 +383,10 @@ def check_type_str(value, allow_conversion=True, param=None, prefix=''):
392
383
  raise TypeError(to_native(msg))
393
384
 
394
385
 
386
+ def _check_type_str_no_conversion(value) -> str:
387
+ return check_type_str(value, allow_conversion=False)
388
+
389
+
395
390
  def check_type_list(value):
396
391
  """Verify that the value is a list or convert to a list
397
392
 
@@ -407,6 +402,7 @@ def check_type_list(value):
407
402
  if isinstance(value, list):
408
403
  return value
409
404
 
405
+ # DTFIX-RELEASE: deprecate legacy comma split functionality, eventually replace with `_check_type_list_strict`
410
406
  if isinstance(value, string_types):
411
407
  return value.split(",")
412
408
  elif isinstance(value, int) or isinstance(value, float):
@@ -415,6 +411,14 @@ def check_type_list(value):
415
411
  raise TypeError('%s cannot be converted to a list' % type(value))
416
412
 
417
413
 
414
+ def _check_type_list_strict(value):
415
+ # FUTURE: this impl should replace `check_type_list`
416
+ if isinstance(value, list):
417
+ return value
418
+
419
+ return [value]
420
+
421
+
418
422
  def check_type_dict(value):
419
423
  """Verify that value is a dict or convert it to a dict and return it.
420
424
 
@@ -572,14 +576,21 @@ def check_type_bits(value):
572
576
 
573
577
 
574
578
  def check_type_jsonarg(value):
575
- """Return a jsonified string. Sometimes the controller turns a json string
576
- into a dict/list so transform it back into json here
577
-
578
- Raises :class:`TypeError` if unable to convert the value
579
-
580
579
  """
581
- if isinstance(value, (text_type, binary_type)):
580
+ JSON serialize dict/list/tuple, strip str and bytes.
581
+ Previously required for cases where Ansible/Jinja classic-mode literal eval pass could inadvertently deserialize objects.
582
+ """
583
+ # deprecated: description='deprecate jsonarg type support' core_version='2.23'
584
+ # deprecate(
585
+ # msg="The `jsonarg` type is deprecated.",
586
+ # version="2.27",
587
+ # help_text="JSON string arguments should use `str`; structures can be explicitly serialized as JSON with the `to_json` filter.",
588
+ # )
589
+
590
+ if isinstance(value, (str, bytes)):
582
591
  return value.strip()
583
- elif isinstance(value, (list, tuple, dict)):
584
- return jsonify(value)
592
+
593
+ if isinstance(value, (list, tuple, dict)):
594
+ return json.dumps(value, cls=_common_json._get_legacy_encoder(), _decode_bytes=True)
595
+
585
596
  raise TypeError('%s cannot be converted to a json string' % type(value))
@@ -2,38 +2,99 @@
2
2
  # Copyright (c) 2019 Ansible Project
3
3
  # Simplified BSD License (see licenses/simplified_bsd.txt or https://opensource.org/licenses/BSD-2-Clause)
4
4
 
5
- from __future__ import annotations
5
+ from __future__ import annotations as _annotations
6
6
 
7
- from ansible.module_utils.six import string_types
7
+ import datetime as _datetime
8
+ import typing as _t
8
9
 
9
- _global_warnings = []
10
- _global_deprecations = []
10
+ from ansible.module_utils._internal import _traceback, _plugin_exec_context
11
+ from ansible.module_utils.common import messages as _messages
12
+ from ansible.module_utils import _internal
11
13
 
14
+ _UNSET = _t.cast(_t.Any, object())
12
15
 
13
- def warn(warning):
14
- if isinstance(warning, string_types):
15
- _global_warnings.append(warning)
16
- else:
17
- raise TypeError("warn requires a string not a %s" % type(warning))
18
16
 
17
+ def warn(warning: str) -> None:
18
+ """Record a warning to be returned with the module result."""
19
+ # DTFIX-RELEASE: shim to controller display warning like `deprecate`
20
+ _global_warnings[_messages.WarningSummary(
21
+ details=(
22
+ _messages.Detail(msg=warning),
23
+ ),
24
+ formatted_traceback=_traceback.maybe_capture_traceback(_traceback.TracebackEvent.WARNING),
25
+ )] = None
19
26
 
20
- def deprecate(msg, version=None, date=None, collection_name=None):
21
- if isinstance(msg, string_types):
22
- # For compatibility, we accept that neither version nor date is set,
23
- # and treat that the same as if version would haven been set
24
- if date is not None:
25
- _global_deprecations.append({'msg': msg, 'date': date, 'collection_name': collection_name})
26
- else:
27
- _global_deprecations.append({'msg': msg, 'version': version, 'collection_name': collection_name})
28
- else:
29
- raise TypeError("deprecate requires a string not a %s" % type(msg))
30
27
 
28
+ def deprecate(
29
+ msg: str,
30
+ version: str | None = None,
31
+ date: str | _datetime.date | None = None,
32
+ collection_name: str | None = _UNSET,
33
+ *,
34
+ help_text: str | None = None,
35
+ obj: object | None = None,
36
+ ) -> None:
37
+ """
38
+ Record a deprecation warning to be returned with the module result.
39
+ The `obj` argument is only useful in a controller context; it is ignored for target-side callers.
40
+ """
41
+ if isinstance(date, _datetime.date):
42
+ date = str(date)
31
43
 
32
- def get_warning_messages():
33
- """Return a tuple of warning messages accumulated over this run"""
34
- return tuple(_global_warnings)
44
+ # deprecated: description='enable the deprecation message for collection_name' core_version='2.23'
45
+ # if collection_name is not _UNSET:
46
+ # deprecate('The `collection_name` argument to `deprecate` is deprecated.', version='2.27')
35
47
 
48
+ if _internal.is_controller:
49
+ _display = _internal.import_controller_module('ansible.utils.display').Display()
50
+ _display.deprecated(
51
+ msg=msg,
52
+ version=version,
53
+ date=date,
54
+ help_text=help_text,
55
+ obj=obj,
56
+ )
36
57
 
37
- def get_deprecation_messages():
38
- """Return a tuple of deprecations accumulated over this run"""
39
- return tuple(_global_deprecations)
58
+ return
59
+
60
+ _global_deprecations[_messages.DeprecationSummary(
61
+ details=(
62
+ _messages.Detail(msg=msg, help_text=help_text),
63
+ ),
64
+ formatted_traceback=_traceback.maybe_capture_traceback(_traceback.TracebackEvent.DEPRECATED),
65
+ version=version,
66
+ date=date,
67
+ plugin=_plugin_exec_context.PluginExecContext.get_current_plugin_info(),
68
+ )] = None
69
+
70
+
71
+ def get_warning_messages() -> tuple[str, ...]:
72
+ """Return a tuple of warning messages accumulated over this run."""
73
+ # DTFIX-RELEASE: add future deprecation comment
74
+ return tuple(item._format() for item in _global_warnings)
75
+
76
+
77
+ _DEPRECATION_MESSAGE_KEYS = frozenset({'msg', 'date', 'version', 'collection_name'})
78
+
79
+
80
+ def get_deprecation_messages() -> tuple[dict[str, _t.Any], ...]:
81
+ """Return a tuple of deprecation warning messages accumulated over this run."""
82
+ # DTFIX-RELEASE: add future deprecation comment
83
+ return tuple({key: value for key, value in item._as_simple_dict().items() if key in _DEPRECATION_MESSAGE_KEYS} for item in _global_deprecations)
84
+
85
+
86
+ def get_warnings() -> list[_messages.WarningSummary]:
87
+ """Return a list of warning messages accumulated over this run."""
88
+ return list(_global_warnings)
89
+
90
+
91
+ def get_deprecations() -> list[_messages.DeprecationSummary]:
92
+ """Return a list of deprecations accumulated over this run."""
93
+ return list(_global_deprecations)
94
+
95
+
96
+ _global_warnings: dict[_messages.WarningSummary, object] = {}
97
+ """Global, ordered, de-deplicated storage of acculumated warnings for the current module run."""
98
+
99
+ _global_deprecations: dict[_messages.DeprecationSummary, object] = {}
100
+ """Global, ordered, de-deplicated storage of acculumated deprecations for the current module run."""
@@ -6,10 +6,15 @@ This file provides ease of use shortcuts for loading and dumping YAML,
6
6
  preferring the YAML compiled C extensions to reduce duplicated code.
7
7
  """
8
8
 
9
- from __future__ import annotations
9
+ from __future__ import annotations as _annotations
10
+
11
+ import collections.abc as _c
12
+ import typing as _t
10
13
 
11
14
  from functools import partial as _partial
12
15
 
16
+ from .._internal import _datatag
17
+
13
18
  HAS_LIBYAML = False
14
19
 
15
20
  try:
@@ -19,23 +24,44 @@ except ImportError:
19
24
  else:
20
25
  HAS_YAML = True
21
26
 
27
+ # DTFIX-RELEASE: refactor this to share the implementation with the controller version
28
+ # use an abstract base class, with __init_subclass__ for representer registration, and instance methods for overridable representers
29
+ # then tests can be consolidated intead of having two nearly identical copies
30
+
22
31
  if HAS_YAML:
23
32
  try:
24
33
  from yaml import CSafeLoader as SafeLoader
25
34
  from yaml import CSafeDumper as SafeDumper
35
+ from yaml.representer import SafeRepresenter
26
36
  from yaml.cyaml import CParser as Parser # type: ignore[attr-defined] # pylint: disable=unused-import
27
37
 
28
38
  HAS_LIBYAML = True
29
39
  except (ImportError, AttributeError):
30
40
  from yaml import SafeLoader # type: ignore[assignment]
31
41
  from yaml import SafeDumper # type: ignore[assignment]
42
+ from yaml.representer import SafeRepresenter # type: ignore[assignment]
32
43
  from yaml.parser import Parser # type: ignore[assignment] # pylint: disable=unused-import
33
44
 
45
+ class _AnsibleDumper(SafeDumper):
46
+ pass
47
+
48
+ def _represent_ansible_tagged_object(self, data: _datatag.AnsibleTaggedObject) -> _t.Any:
49
+ return self.represent_data(_datatag.AnsibleTagHelper.as_native_type(data))
50
+
51
+ def _represent_tripwire(self, data: _datatag.Tripwire) -> _t.NoReturn:
52
+ data.trip()
53
+
54
+ _AnsibleDumper.add_multi_representer(_datatag.AnsibleTaggedObject, _represent_ansible_tagged_object)
55
+
56
+ _AnsibleDumper.add_multi_representer(_datatag.Tripwire, _represent_tripwire)
57
+ _AnsibleDumper.add_multi_representer(_c.Mapping, SafeRepresenter.represent_dict)
58
+ _AnsibleDumper.add_multi_representer(_c.Sequence, SafeRepresenter.represent_list)
59
+
34
60
  yaml_load = _partial(_yaml.load, Loader=SafeLoader)
35
61
  yaml_load_all = _partial(_yaml.load_all, Loader=SafeLoader)
36
62
 
37
- yaml_dump = _partial(_yaml.dump, Dumper=SafeDumper)
38
- yaml_dump_all = _partial(_yaml.dump_all, Dumper=SafeDumper)
63
+ yaml_dump = _partial(_yaml.dump, Dumper=_AnsibleDumper)
64
+ yaml_dump_all = _partial(_yaml.dump_all, Dumper=_AnsibleDumper)
39
65
  else:
40
66
  SafeLoader = object # type: ignore[assignment,misc]
41
67
  SafeDumper = object # type: ignore[assignment,misc]