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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (710) hide show
  1. ansible/_internal/__init__.py +53 -0
  2. ansible/_internal/_ansiballz.py +265 -0
  3. ansible/_internal/_collection_proxy.py +47 -0
  4. ansible/_internal/_datatag/__init__.py +0 -0
  5. ansible/_internal/_datatag/_tags.py +130 -0
  6. ansible/_internal/_datatag/_utils.py +19 -0
  7. ansible/_internal/_datatag/_wrappers.py +33 -0
  8. ansible/_internal/_errors/__init__.py +0 -0
  9. ansible/_internal/_errors/_captured.py +128 -0
  10. ansible/_internal/_errors/_handler.py +91 -0
  11. ansible/_internal/_errors/_utils.py +310 -0
  12. ansible/_internal/_json/__init__.py +203 -0
  13. ansible/_internal/_json/_legacy_encoder.py +34 -0
  14. ansible/_internal/_json/_profiles/__init__.py +0 -0
  15. ansible/_internal/_json/_profiles/_cache_persistence.py +55 -0
  16. ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
  17. ansible/_internal/_json/_profiles/_legacy.py +197 -0
  18. ansible/_internal/_locking.py +21 -0
  19. ansible/_internal/_plugins/__init__.py +0 -0
  20. ansible/_internal/_plugins/_cache.py +57 -0
  21. ansible/_internal/_task.py +78 -0
  22. ansible/_internal/_templating/__init__.py +10 -0
  23. ansible/_internal/_templating/_access.py +86 -0
  24. ansible/_internal/_templating/_chain_templar.py +63 -0
  25. ansible/_internal/_templating/_datatag.py +95 -0
  26. ansible/_internal/_templating/_engine.py +588 -0
  27. ansible/_internal/_templating/_errors.py +28 -0
  28. ansible/_internal/_templating/_jinja_bits.py +1066 -0
  29. ansible/_internal/_templating/_jinja_common.py +332 -0
  30. ansible/_internal/_templating/_jinja_patches.py +44 -0
  31. ansible/_internal/_templating/_jinja_plugins.py +345 -0
  32. ansible/_internal/_templating/_lazy_containers.py +633 -0
  33. ansible/_internal/_templating/_marker_behaviors.py +103 -0
  34. ansible/_internal/_templating/_transform.py +63 -0
  35. ansible/_internal/_templating/_utils.py +107 -0
  36. ansible/_internal/_wrapt.py +1052 -0
  37. ansible/_internal/_yaml/__init__.py +0 -0
  38. ansible/_internal/_yaml/_constructor.py +240 -0
  39. ansible/_internal/_yaml/_dumper.py +62 -0
  40. ansible/_internal/_yaml/_errors.py +166 -0
  41. ansible/_internal/_yaml/_loader.py +66 -0
  42. ansible/_internal/ansible_collections/ansible/_protomatter/README.md +11 -0
  43. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/action/debug.py +36 -0
  44. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/apply_trust.py +19 -0
  45. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/dump_object.py +18 -0
  46. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/finalize.py +16 -0
  47. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/origin.py +18 -0
  48. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.py +24 -0
  49. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.yml +33 -0
  50. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/tag_names.py +16 -0
  51. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +17 -0
  52. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +49 -0
  53. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.py +21 -0
  54. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.yml +2 -0
  55. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.py +15 -0
  56. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.yml +19 -0
  57. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.py +18 -0
  58. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.yml +19 -0
  59. ansible/cli/__init__.py +159 -89
  60. ansible/cli/_ssh_askpass.py +47 -0
  61. ansible/cli/adhoc.py +14 -7
  62. ansible/cli/arguments/option_helpers.py +154 -7
  63. ansible/cli/config.py +43 -68
  64. ansible/cli/console.py +10 -8
  65. ansible/cli/doc.py +62 -53
  66. ansible/cli/galaxy.py +27 -20
  67. ansible/cli/inventory.py +28 -26
  68. ansible/cli/playbook.py +4 -12
  69. ansible/cli/pull.py +51 -11
  70. ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
  71. ansible/cli/vault.py +12 -11
  72. ansible/compat/__init__.py +2 -2
  73. ansible/config/base.yml +166 -112
  74. ansible/config/manager.py +52 -49
  75. ansible/constants.py +3 -4
  76. ansible/errors/__init__.py +277 -235
  77. ansible/executor/interpreter_discovery.py +28 -149
  78. ansible/executor/module_common.py +426 -493
  79. ansible/executor/play_iterator.py +22 -27
  80. ansible/executor/playbook_executor.py +11 -11
  81. ansible/executor/powershell/async_watchdog.ps1 +97 -102
  82. ansible/executor/powershell/async_wrapper.ps1 +202 -151
  83. ansible/executor/powershell/become_wrapper.ps1 +89 -144
  84. ansible/executor/powershell/bootstrap_wrapper.ps1 +24 -9
  85. ansible/executor/powershell/coverage_wrapper.ps1 +82 -135
  86. ansible/executor/powershell/exec_wrapper.ps1 +462 -196
  87. ansible/executor/powershell/module_manifest.py +417 -265
  88. ansible/executor/powershell/module_wrapper.ps1 +169 -186
  89. ansible/executor/powershell/psrp_fetch_file.ps1 +41 -0
  90. ansible/executor/powershell/psrp_put_file.ps1 +122 -0
  91. ansible/executor/powershell/winrm_fetch_file.ps1 +46 -0
  92. ansible/executor/powershell/winrm_put_file.ps1 +36 -0
  93. ansible/executor/process/worker.py +161 -96
  94. ansible/executor/stats.py +5 -5
  95. ansible/executor/task_executor.py +268 -258
  96. ansible/executor/task_queue_manager.py +124 -90
  97. ansible/executor/task_result.py +183 -78
  98. ansible/galaxy/__init__.py +2 -2
  99. ansible/galaxy/api.py +22 -18
  100. ansible/galaxy/collection/__init__.py +1 -1
  101. ansible/galaxy/collection/concrete_artifact_manager.py +8 -11
  102. ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
  103. ansible/galaxy/dependency_resolution/providers.py +1 -1
  104. ansible/galaxy/dependency_resolution/reporters.py +81 -0
  105. ansible/galaxy/role.py +4 -8
  106. ansible/galaxy/token.py +28 -21
  107. ansible/inventory/data.py +47 -57
  108. ansible/inventory/group.py +44 -72
  109. ansible/inventory/helpers.py +9 -0
  110. ansible/inventory/host.py +32 -54
  111. ansible/inventory/manager.py +78 -34
  112. ansible/keyword_desc.yml +1 -1
  113. ansible/module_utils/_internal/__init__.py +55 -0
  114. ansible/module_utils/_internal/_ambient_context.py +58 -0
  115. ansible/module_utils/_internal/_ansiballz.py +133 -0
  116. ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
  117. ansible/module_utils/_internal/_dataclass_annotation_patch.py +64 -0
  118. ansible/module_utils/_internal/_dataclass_validation.py +217 -0
  119. ansible/module_utils/_internal/_datatag/__init__.py +928 -0
  120. ansible/module_utils/_internal/_datatag/_tags.py +38 -0
  121. ansible/module_utils/_internal/_debugging.py +31 -0
  122. ansible/module_utils/_internal/_errors.py +30 -0
  123. ansible/module_utils/_internal/_json/__init__.py +63 -0
  124. ansible/module_utils/_internal/_json/_legacy_encoder.py +26 -0
  125. ansible/module_utils/_internal/_json/_profiles/__init__.py +410 -0
  126. ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
  127. ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +31 -0
  128. ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +35 -0
  129. ansible/module_utils/_internal/_json/_profiles/_module_modern_c2m.py +35 -0
  130. ansible/module_utils/_internal/_json/_profiles/_module_modern_m2c.py +33 -0
  131. ansible/module_utils/_internal/_json/_profiles/_tagless.py +50 -0
  132. ansible/module_utils/_internal/_patches/__init__.py +66 -0
  133. ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +55 -0
  134. ansible/module_utils/_internal/_patches/_socket_patch.py +34 -0
  135. ansible/module_utils/_internal/_patches/_sys_intern_patch.py +34 -0
  136. ansible/module_utils/_internal/_plugin_exec_context.py +49 -0
  137. ansible/module_utils/_internal/_testing.py +0 -0
  138. ansible/module_utils/_internal/_traceback.py +89 -0
  139. ansible/module_utils/ansible_release.py +2 -2
  140. ansible/module_utils/api.py +1 -2
  141. ansible/module_utils/basic.py +152 -120
  142. ansible/module_utils/common/_utils.py +24 -28
  143. ansible/module_utils/common/collections.py +1 -2
  144. ansible/module_utils/common/dict_transformations.py +2 -2
  145. ansible/module_utils/common/file.py +2 -2
  146. ansible/module_utils/common/json.py +90 -84
  147. ansible/module_utils/common/locale.py +2 -2
  148. ansible/module_utils/common/messages.py +108 -0
  149. ansible/module_utils/common/parameters.py +27 -24
  150. ansible/module_utils/common/process.py +2 -2
  151. ansible/module_utils/common/respawn.py +41 -19
  152. ansible/module_utils/common/sentinel.py +66 -0
  153. ansible/module_utils/common/sys_info.py +8 -8
  154. ansible/module_utils/common/text/converters.py +16 -37
  155. ansible/module_utils/common/validation.py +35 -24
  156. ansible/module_utils/common/warnings.py +86 -25
  157. ansible/module_utils/common/yaml.py +29 -3
  158. ansible/module_utils/compat/datetime.py +33 -21
  159. ansible/module_utils/compat/paramiko.py +21 -10
  160. ansible/module_utils/compat/typing.py +6 -5
  161. ansible/module_utils/connection.py +2 -2
  162. ansible/module_utils/csharp/Ansible.Basic.cs +14 -11
  163. ansible/module_utils/csharp/Ansible.Become.cs +1 -0
  164. ansible/module_utils/csharp/Ansible._Async.cs +517 -0
  165. ansible/module_utils/datatag.py +46 -0
  166. ansible/module_utils/distro/__init__.py +2 -2
  167. ansible/module_utils/facts/ansible_collector.py +4 -5
  168. ansible/module_utils/facts/collector.py +13 -14
  169. ansible/module_utils/facts/compat.py +4 -4
  170. ansible/module_utils/facts/default_collectors.py +1 -1
  171. ansible/module_utils/facts/hardware/aix.py +34 -0
  172. ansible/module_utils/facts/hardware/base.py +1 -1
  173. ansible/module_utils/facts/hardware/darwin.py +1 -3
  174. ansible/module_utils/facts/hardware/freebsd.py +2 -2
  175. ansible/module_utils/facts/hardware/linux.py +4 -4
  176. ansible/module_utils/facts/namespace.py +1 -1
  177. ansible/module_utils/facts/network/base.py +1 -1
  178. ansible/module_utils/facts/network/fc_wwn.py +1 -2
  179. ansible/module_utils/facts/network/iscsi.py +1 -2
  180. ansible/module_utils/facts/network/nvme.py +1 -2
  181. ansible/module_utils/facts/other/facter.py +1 -2
  182. ansible/module_utils/facts/other/ohai.py +2 -3
  183. ansible/module_utils/facts/system/apparmor.py +1 -2
  184. ansible/module_utils/facts/system/caps.py +1 -1
  185. ansible/module_utils/facts/system/chroot.py +1 -2
  186. ansible/module_utils/facts/system/cmdline.py +1 -2
  187. ansible/module_utils/facts/system/date_time.py +5 -3
  188. ansible/module_utils/facts/system/distribution.py +9 -8
  189. ansible/module_utils/facts/system/dns.py +1 -1
  190. ansible/module_utils/facts/system/env.py +1 -2
  191. ansible/module_utils/facts/system/fips.py +7 -20
  192. ansible/module_utils/facts/system/loadavg.py +1 -2
  193. ansible/module_utils/facts/system/local.py +1 -2
  194. ansible/module_utils/facts/system/lsb.py +1 -2
  195. ansible/module_utils/facts/system/pkg_mgr.py +1 -2
  196. ansible/module_utils/facts/system/platform.py +1 -2
  197. ansible/module_utils/facts/system/python.py +1 -2
  198. ansible/module_utils/facts/system/selinux.py +1 -1
  199. ansible/module_utils/facts/system/service_mgr.py +1 -2
  200. ansible/module_utils/facts/system/ssh_pub_keys.py +1 -1
  201. ansible/module_utils/facts/system/systemd.py +1 -1
  202. ansible/module_utils/facts/system/user.py +1 -2
  203. ansible/module_utils/facts/utils.py +3 -3
  204. ansible/module_utils/facts/virtual/base.py +1 -1
  205. ansible/module_utils/facts/virtual/sunos.py +3 -15
  206. ansible/module_utils/facts/virtual/sysctl.py +3 -16
  207. ansible/module_utils/json_utils.py +2 -2
  208. ansible/module_utils/parsing/convert_bool.py +1 -1
  209. ansible/module_utils/service.py +18 -21
  210. ansible/module_utils/splitter.py +7 -7
  211. ansible/module_utils/testing.py +31 -0
  212. ansible/module_utils/urls.py +60 -31
  213. ansible/modules/add_host.py +4 -4
  214. ansible/modules/apt.py +60 -46
  215. ansible/modules/apt_key.py +19 -12
  216. ansible/modules/apt_repository.py +19 -16
  217. ansible/modules/assemble.py +6 -6
  218. ansible/modules/assert.py +4 -4
  219. ansible/modules/async_status.py +10 -12
  220. ansible/modules/async_wrapper.py +8 -3
  221. ansible/modules/blockinfile.py +6 -7
  222. ansible/modules/command.py +10 -17
  223. ansible/modules/copy.py +57 -144
  224. ansible/modules/cron.py +20 -15
  225. ansible/modules/deb822_repository.py +8 -9
  226. ansible/modules/debconf.py +5 -5
  227. ansible/modules/debug.py +4 -4
  228. ansible/modules/dnf.py +8 -8
  229. ansible/modules/dnf5.py +39 -13
  230. ansible/modules/dpkg_selections.py +4 -4
  231. ansible/modules/expect.py +8 -10
  232. ansible/modules/fail.py +4 -4
  233. ansible/modules/fetch.py +4 -4
  234. ansible/modules/file.py +174 -133
  235. ansible/modules/find.py +19 -17
  236. ansible/modules/gather_facts.py +3 -3
  237. ansible/modules/get_url.py +59 -53
  238. ansible/modules/getent.py +7 -9
  239. ansible/modules/git.py +28 -25
  240. ansible/modules/group.py +6 -6
  241. ansible/modules/group_by.py +4 -4
  242. ansible/modules/hostname.py +13 -29
  243. ansible/modules/import_playbook.py +6 -6
  244. ansible/modules/import_role.py +6 -6
  245. ansible/modules/import_tasks.py +6 -6
  246. ansible/modules/include_role.py +6 -6
  247. ansible/modules/include_tasks.py +6 -6
  248. ansible/modules/include_vars.py +6 -6
  249. ansible/modules/iptables.py +86 -73
  250. ansible/modules/known_hosts.py +10 -10
  251. ansible/modules/lineinfile.py +5 -5
  252. ansible/modules/meta.py +4 -4
  253. ansible/modules/mount_facts.py +2 -2
  254. ansible/modules/package.py +4 -4
  255. ansible/modules/package_facts.py +22 -10
  256. ansible/modules/pause.py +6 -6
  257. ansible/modules/ping.py +6 -6
  258. ansible/modules/pip.py +10 -11
  259. ansible/modules/raw.py +4 -4
  260. ansible/modules/reboot.py +6 -6
  261. ansible/modules/replace.py +9 -13
  262. ansible/modules/rpm_key.py +7 -8
  263. ansible/modules/script.py +4 -4
  264. ansible/modules/service.py +7 -8
  265. ansible/modules/service_facts.py +87 -10
  266. ansible/modules/set_fact.py +5 -5
  267. ansible/modules/set_stats.py +4 -4
  268. ansible/modules/setup.py +2 -2
  269. ansible/modules/shell.py +6 -6
  270. ansible/modules/slurp.py +6 -6
  271. ansible/modules/stat.py +9 -23
  272. ansible/modules/subversion.py +15 -15
  273. ansible/modules/systemd.py +6 -6
  274. ansible/modules/systemd_service.py +6 -6
  275. ansible/modules/sysvinit.py +6 -6
  276. ansible/modules/tempfile.py +5 -6
  277. ansible/modules/template.py +6 -6
  278. ansible/modules/unarchive.py +32 -11
  279. ansible/modules/uri.py +33 -26
  280. ansible/modules/user.py +53 -34
  281. ansible/modules/validate_argument_spec.py +10 -7
  282. ansible/modules/wait_for.py +32 -27
  283. ansible/modules/wait_for_connection.py +6 -6
  284. ansible/modules/yum_repository.py +6 -6
  285. ansible/parsing/ajson.py +14 -32
  286. ansible/parsing/dataloader.py +99 -54
  287. ansible/parsing/mod_args.py +28 -44
  288. ansible/parsing/plugin_docs.py +21 -86
  289. ansible/parsing/quoting.py +1 -1
  290. ansible/parsing/splitter.py +27 -12
  291. ansible/parsing/utils/addresses.py +24 -24
  292. ansible/parsing/utils/jsonify.py +5 -1
  293. ansible/parsing/utils/yaml.py +32 -61
  294. ansible/parsing/vault/__init__.py +319 -87
  295. ansible/parsing/yaml/__init__.py +0 -18
  296. ansible/parsing/yaml/dumper.py +6 -120
  297. ansible/parsing/yaml/loader.py +6 -39
  298. ansible/parsing/yaml/objects.py +43 -335
  299. ansible/playbook/__init__.py +1 -1
  300. ansible/playbook/attribute.py +8 -3
  301. ansible/playbook/base.py +182 -132
  302. ansible/playbook/block.py +26 -24
  303. ansible/playbook/collectionsearch.py +1 -15
  304. ansible/playbook/conditional.py +3 -77
  305. ansible/playbook/handler.py +8 -2
  306. ansible/playbook/helpers.py +41 -53
  307. ansible/playbook/included_file.py +31 -27
  308. ansible/playbook/loop_control.py +2 -2
  309. ansible/playbook/play.py +85 -44
  310. ansible/playbook/play_context.py +12 -17
  311. ansible/playbook/playbook_include.py +14 -15
  312. ansible/playbook/role/__init__.py +24 -26
  313. ansible/playbook/role/definition.py +15 -17
  314. ansible/playbook/role/include.py +2 -4
  315. ansible/playbook/role/metadata.py +10 -11
  316. ansible/playbook/role_include.py +3 -3
  317. ansible/playbook/taggable.py +13 -8
  318. ansible/playbook/task.py +188 -118
  319. ansible/playbook/task_include.py +5 -5
  320. ansible/plugins/__init__.py +68 -21
  321. ansible/plugins/action/__init__.py +209 -176
  322. ansible/plugins/action/add_host.py +1 -1
  323. ansible/plugins/action/assemble.py +1 -1
  324. ansible/plugins/action/assert.py +54 -66
  325. ansible/plugins/action/copy.py +7 -11
  326. ansible/plugins/action/debug.py +37 -31
  327. ansible/plugins/action/dnf.py +3 -4
  328. ansible/plugins/action/fail.py +1 -1
  329. ansible/plugins/action/fetch.py +4 -5
  330. ansible/plugins/action/gather_facts.py +7 -6
  331. ansible/plugins/action/group_by.py +1 -1
  332. ansible/plugins/action/include_vars.py +10 -11
  333. ansible/plugins/action/package.py +3 -6
  334. ansible/plugins/action/pause.py +2 -2
  335. ansible/plugins/action/script.py +15 -8
  336. ansible/plugins/action/service.py +6 -11
  337. ansible/plugins/action/set_fact.py +3 -12
  338. ansible/plugins/action/set_stats.py +3 -8
  339. ansible/plugins/action/template.py +35 -59
  340. ansible/plugins/action/unarchive.py +1 -1
  341. ansible/plugins/action/validate_argument_spec.py +5 -5
  342. ansible/plugins/action/wait_for_connection.py +1 -1
  343. ansible/plugins/become/__init__.py +31 -8
  344. ansible/plugins/become/runas.py +71 -0
  345. ansible/plugins/become/su.py +13 -8
  346. ansible/plugins/become/sudo.py +19 -0
  347. ansible/plugins/cache/__init__.py +35 -44
  348. ansible/plugins/cache/base.py +8 -0
  349. ansible/plugins/cache/jsonfile.py +10 -16
  350. ansible/plugins/cache/memory.py +6 -12
  351. ansible/plugins/callback/__init__.py +284 -179
  352. ansible/plugins/callback/default.py +99 -92
  353. ansible/plugins/callback/junit.py +44 -39
  354. ansible/plugins/callback/minimal.py +28 -25
  355. ansible/plugins/callback/oneline.py +28 -21
  356. ansible/plugins/callback/tree.py +16 -11
  357. ansible/plugins/connection/__init__.py +47 -34
  358. ansible/plugins/connection/local.py +150 -54
  359. ansible/plugins/connection/paramiko_ssh.py +21 -18
  360. ansible/plugins/connection/psrp.py +76 -165
  361. ansible/plugins/connection/ssh.py +301 -78
  362. ansible/plugins/connection/winrm.py +58 -140
  363. ansible/plugins/doc_fragments/action_common_attributes.py +14 -14
  364. ansible/plugins/doc_fragments/action_core.py +6 -6
  365. ansible/plugins/doc_fragments/backup.py +2 -2
  366. ansible/plugins/doc_fragments/checksum_common.py +27 -0
  367. ansible/plugins/doc_fragments/constructed.py +6 -2
  368. ansible/plugins/doc_fragments/decrypt.py +2 -2
  369. ansible/plugins/doc_fragments/default_callback.py +2 -2
  370. ansible/plugins/doc_fragments/files.py +2 -2
  371. ansible/plugins/doc_fragments/inventory_cache.py +2 -2
  372. ansible/plugins/doc_fragments/result_format_callback.py +2 -2
  373. ansible/plugins/doc_fragments/return_common.py +2 -2
  374. ansible/plugins/doc_fragments/template_common.py +4 -4
  375. ansible/plugins/doc_fragments/url.py +17 -1
  376. ansible/plugins/doc_fragments/url_windows.py +2 -2
  377. ansible/plugins/doc_fragments/validate.py +2 -2
  378. ansible/plugins/doc_fragments/vars_plugin_staging.py +2 -2
  379. ansible/plugins/filter/__init__.py +6 -2
  380. ansible/plugins/filter/b64decode.yml +22 -0
  381. ansible/plugins/filter/b64encode.yml +22 -0
  382. ansible/plugins/filter/bool.yml +11 -4
  383. ansible/plugins/filter/core.py +225 -108
  384. ansible/plugins/filter/encryption.py +32 -32
  385. ansible/plugins/filter/flatten.yml +3 -2
  386. ansible/plugins/filter/human_to_bytes.yml +1 -1
  387. ansible/plugins/filter/mathstuff.py +30 -37
  388. ansible/plugins/filter/password_hash.yml +8 -0
  389. ansible/plugins/filter/regex_search.yml +1 -4
  390. ansible/plugins/filter/split.yml +1 -1
  391. ansible/plugins/filter/to_nice_yaml.yml +0 -4
  392. ansible/plugins/filter/to_yaml.yml +0 -4
  393. ansible/plugins/filter/unvault.yml +1 -1
  394. ansible/plugins/filter/urls.py +1 -1
  395. ansible/plugins/filter/urlsplit.py +8 -9
  396. ansible/plugins/filter/vault.yml +14 -9
  397. ansible/plugins/filter/win_basename.yml +6 -1
  398. ansible/plugins/filter/win_dirname.yml +5 -0
  399. ansible/plugins/inventory/__init__.py +97 -77
  400. ansible/plugins/inventory/advanced_host_list.py +7 -5
  401. ansible/plugins/inventory/auto.py +11 -4
  402. ansible/plugins/inventory/constructed.py +21 -24
  403. ansible/plugins/inventory/generator.py +16 -11
  404. ansible/plugins/inventory/host_list.py +7 -5
  405. ansible/plugins/inventory/ini.py +78 -44
  406. ansible/plugins/inventory/script.py +189 -119
  407. ansible/plugins/inventory/toml.py +16 -126
  408. ansible/plugins/inventory/yaml.py +10 -8
  409. ansible/plugins/list.py +3 -3
  410. ansible/plugins/loader.py +197 -82
  411. ansible/plugins/lookup/__init__.py +21 -4
  412. ansible/plugins/lookup/config.py +21 -35
  413. ansible/plugins/lookup/csvfile.py +3 -2
  414. ansible/plugins/lookup/dict.py +1 -6
  415. ansible/plugins/lookup/env.py +12 -9
  416. ansible/plugins/lookup/file.py +5 -8
  417. ansible/plugins/lookup/first_found.py +86 -55
  418. ansible/plugins/lookup/indexed_items.py +1 -10
  419. ansible/plugins/lookup/ini.py +14 -13
  420. ansible/plugins/lookup/items.py +1 -1
  421. ansible/plugins/lookup/lines.py +8 -1
  422. ansible/plugins/lookup/list.py +1 -1
  423. ansible/plugins/lookup/nested.py +2 -18
  424. ansible/plugins/lookup/password.py +5 -5
  425. ansible/plugins/lookup/pipe.py +5 -7
  426. ansible/plugins/lookup/sequence.py +18 -8
  427. ansible/plugins/lookup/subelements.py +1 -4
  428. ansible/plugins/lookup/template.py +42 -36
  429. ansible/plugins/lookup/together.py +0 -12
  430. ansible/plugins/lookup/unvault.py +1 -5
  431. ansible/plugins/lookup/url.py +2 -8
  432. ansible/plugins/lookup/vars.py +16 -24
  433. ansible/plugins/shell/__init__.py +2 -2
  434. ansible/plugins/shell/cmd.py +2 -2
  435. ansible/plugins/shell/powershell.py +39 -22
  436. ansible/plugins/shell/sh.py +3 -2
  437. ansible/plugins/strategy/__init__.py +159 -184
  438. ansible/plugins/strategy/debug.py +2 -2
  439. ansible/plugins/strategy/free.py +16 -31
  440. ansible/plugins/strategy/host_pinned.py +2 -2
  441. ansible/plugins/strategy/linear.py +41 -41
  442. ansible/plugins/terminal/__init__.py +4 -4
  443. ansible/plugins/test/__init__.py +7 -2
  444. ansible/plugins/test/core.py +55 -21
  445. ansible/plugins/test/files.py +1 -1
  446. ansible/plugins/test/mathstuff.py +3 -3
  447. ansible/plugins/test/uri.py +3 -3
  448. ansible/plugins/vars/host_group_vars.py +7 -14
  449. ansible/release.py +2 -2
  450. ansible/template/__init__.py +370 -944
  451. ansible/utils/__init__.py +0 -18
  452. ansible/utils/_ssh_agent.py +657 -0
  453. ansible/utils/collection_loader/__init__.py +52 -5
  454. ansible/utils/collection_loader/_collection_config.py +5 -6
  455. ansible/utils/collection_loader/_collection_finder.py +79 -93
  456. ansible/utils/collection_loader/_collection_meta.py +13 -8
  457. ansible/utils/display.py +433 -63
  458. ansible/utils/encrypt.py +27 -19
  459. ansible/utils/fqcn.py +2 -2
  460. ansible/utils/hashing.py +2 -2
  461. ansible/utils/helpers.py +2 -2
  462. ansible/utils/listify.py +8 -8
  463. ansible/utils/lock.py +2 -2
  464. ansible/utils/path.py +4 -4
  465. ansible/utils/plugin_docs.py +14 -13
  466. ansible/utils/sentinel.py +4 -62
  467. ansible/utils/singleton.py +2 -0
  468. ansible/utils/ssh_functions.py +1 -1
  469. ansible/utils/unsafe_proxy.py +23 -332
  470. ansible/utils/vars.py +51 -8
  471. ansible/utils/version.py +2 -2
  472. ansible/vars/clean.py +5 -5
  473. ansible/vars/hostvars.py +60 -90
  474. ansible/vars/manager.py +206 -282
  475. ansible/vars/reserved.py +8 -9
  476. ansible_core-2.19.0b2.dist-info/BSD-3-Clause.txt +28 -0
  477. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/METADATA +5 -4
  478. ansible_core-2.19.0b2.dist-info/RECORD +1072 -0
  479. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/WHEEL +1 -1
  480. ansible_test/_data/completion/docker.txt +7 -7
  481. ansible_test/_data/completion/remote.txt +6 -6
  482. ansible_test/_data/completion/windows.txt +1 -0
  483. ansible_test/_data/requirements/ansible.txt +2 -2
  484. ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
  485. ansible_test/_data/requirements/sanity.changelog.txt +1 -1
  486. ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
  487. ansible_test/_data/requirements/sanity.pylint.txt +4 -4
  488. ansible_test/_data/requirements/sanity.validate-modules.txt +2 -2
  489. ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
  490. ansible_test/_data/requirements/units.txt +1 -0
  491. ansible_test/_internal/__init__.py +1 -0
  492. ansible_test/_internal/ansible_util.py +2 -0
  493. ansible_test/_internal/become.py +1 -0
  494. ansible_test/_internal/bootstrap.py +1 -0
  495. ansible_test/_internal/cache.py +1 -0
  496. ansible_test/_internal/cgroup.py +1 -0
  497. ansible_test/_internal/ci/__init__.py +1 -0
  498. ansible_test/_internal/ci/azp.py +1 -0
  499. ansible_test/_internal/ci/local.py +1 -0
  500. ansible_test/_internal/classification/__init__.py +1 -0
  501. ansible_test/_internal/classification/common.py +1 -0
  502. ansible_test/_internal/classification/csharp.py +1 -0
  503. ansible_test/_internal/classification/powershell.py +1 -0
  504. ansible_test/_internal/classification/python.py +1 -0
  505. ansible_test/_internal/cli/__init__.py +1 -0
  506. ansible_test/_internal/cli/actions.py +1 -0
  507. ansible_test/_internal/cli/argparsing/__init__.py +1 -0
  508. ansible_test/_internal/cli/argparsing/actions.py +1 -0
  509. ansible_test/_internal/cli/argparsing/argcompletion.py +1 -0
  510. ansible_test/_internal/cli/argparsing/parsers.py +1 -0
  511. ansible_test/_internal/cli/commands/__init__.py +11 -0
  512. ansible_test/_internal/cli/commands/coverage/__init__.py +1 -0
  513. ansible_test/_internal/cli/commands/coverage/analyze/__init__.py +1 -0
  514. ansible_test/_internal/cli/commands/coverage/analyze/targets/__init__.py +1 -0
  515. ansible_test/_internal/cli/commands/coverage/analyze/targets/combine.py +1 -0
  516. ansible_test/_internal/cli/commands/coverage/analyze/targets/expand.py +1 -0
  517. ansible_test/_internal/cli/commands/coverage/analyze/targets/filter.py +1 -0
  518. ansible_test/_internal/cli/commands/coverage/analyze/targets/generate.py +1 -0
  519. ansible_test/_internal/cli/commands/coverage/analyze/targets/missing.py +1 -0
  520. ansible_test/_internal/cli/commands/coverage/combine.py +1 -0
  521. ansible_test/_internal/cli/commands/coverage/erase.py +1 -0
  522. ansible_test/_internal/cli/commands/coverage/html.py +1 -0
  523. ansible_test/_internal/cli/commands/coverage/report.py +1 -0
  524. ansible_test/_internal/cli/commands/coverage/xml.py +1 -0
  525. ansible_test/_internal/cli/commands/env.py +1 -0
  526. ansible_test/_internal/cli/commands/integration/__init__.py +1 -0
  527. ansible_test/_internal/cli/commands/integration/network.py +1 -0
  528. ansible_test/_internal/cli/commands/integration/posix.py +1 -0
  529. ansible_test/_internal/cli/commands/integration/windows.py +1 -0
  530. ansible_test/_internal/cli/commands/sanity.py +9 -0
  531. ansible_test/_internal/cli/commands/shell.py +1 -0
  532. ansible_test/_internal/cli/commands/units.py +1 -0
  533. ansible_test/_internal/cli/compat.py +1 -0
  534. ansible_test/_internal/cli/completers.py +1 -0
  535. ansible_test/_internal/cli/converters.py +1 -0
  536. ansible_test/_internal/cli/environments.py +1 -0
  537. ansible_test/_internal/cli/epilog.py +1 -0
  538. ansible_test/_internal/cli/parsers/__init__.py +1 -0
  539. ansible_test/_internal/cli/parsers/base_argument_parsers.py +1 -0
  540. ansible_test/_internal/cli/parsers/helpers.py +1 -0
  541. ansible_test/_internal/cli/parsers/host_config_parsers.py +1 -0
  542. ansible_test/_internal/cli/parsers/key_value_parsers.py +1 -0
  543. ansible_test/_internal/cli/parsers/value_parsers.py +1 -0
  544. ansible_test/_internal/commands/__init__.py +1 -0
  545. ansible_test/_internal/commands/coverage/__init__.py +2 -1
  546. ansible_test/_internal/commands/coverage/analyze/__init__.py +1 -0
  547. ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +1 -0
  548. ansible_test/_internal/commands/coverage/analyze/targets/combine.py +1 -0
  549. ansible_test/_internal/commands/coverage/analyze/targets/expand.py +1 -0
  550. ansible_test/_internal/commands/coverage/analyze/targets/filter.py +1 -0
  551. ansible_test/_internal/commands/coverage/analyze/targets/generate.py +1 -0
  552. ansible_test/_internal/commands/coverage/analyze/targets/missing.py +1 -0
  553. ansible_test/_internal/commands/coverage/combine.py +2 -1
  554. ansible_test/_internal/commands/coverage/erase.py +1 -0
  555. ansible_test/_internal/commands/coverage/html.py +1 -0
  556. ansible_test/_internal/commands/coverage/report.py +1 -0
  557. ansible_test/_internal/commands/coverage/xml.py +1 -0
  558. ansible_test/_internal/commands/env/__init__.py +2 -0
  559. ansible_test/_internal/commands/integration/__init__.py +4 -0
  560. ansible_test/_internal/commands/integration/cloud/__init__.py +1 -0
  561. ansible_test/_internal/commands/integration/cloud/acme.py +2 -1
  562. ansible_test/_internal/commands/integration/cloud/aws.py +1 -0
  563. ansible_test/_internal/commands/integration/cloud/azure.py +1 -0
  564. ansible_test/_internal/commands/integration/cloud/cs.py +1 -0
  565. ansible_test/_internal/commands/integration/cloud/digitalocean.py +1 -0
  566. ansible_test/_internal/commands/integration/cloud/galaxy.py +3 -2
  567. ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -0
  568. ansible_test/_internal/commands/integration/cloud/httptester.py +2 -1
  569. ansible_test/_internal/commands/integration/cloud/nios.py +2 -1
  570. ansible_test/_internal/commands/integration/cloud/opennebula.py +1 -0
  571. ansible_test/_internal/commands/integration/cloud/openshift.py +1 -0
  572. ansible_test/_internal/commands/integration/cloud/scaleway.py +1 -0
  573. ansible_test/_internal/commands/integration/cloud/vcenter.py +1 -0
  574. ansible_test/_internal/commands/integration/cloud/vultr.py +1 -0
  575. ansible_test/_internal/commands/integration/coverage.py +1 -0
  576. ansible_test/_internal/commands/integration/filters.py +1 -0
  577. ansible_test/_internal/commands/integration/network.py +1 -0
  578. ansible_test/_internal/commands/integration/posix.py +1 -0
  579. ansible_test/_internal/commands/integration/windows.py +1 -0
  580. ansible_test/_internal/commands/sanity/__init__.py +16 -1
  581. ansible_test/_internal/commands/sanity/ansible_doc.py +1 -0
  582. ansible_test/_internal/commands/sanity/bin_symlinks.py +1 -0
  583. ansible_test/_internal/commands/sanity/compile.py +1 -0
  584. ansible_test/_internal/commands/sanity/ignores.py +1 -0
  585. ansible_test/_internal/commands/sanity/import.py +1 -0
  586. ansible_test/_internal/commands/sanity/integration_aliases.py +1 -0
  587. ansible_test/_internal/commands/sanity/pep8.py +1 -0
  588. ansible_test/_internal/commands/sanity/pslint.py +1 -0
  589. ansible_test/_internal/commands/sanity/pylint.py +24 -26
  590. ansible_test/_internal/commands/sanity/shellcheck.py +1 -0
  591. ansible_test/_internal/commands/sanity/validate_modules.py +1 -0
  592. ansible_test/_internal/commands/sanity/yamllint.py +1 -0
  593. ansible_test/_internal/commands/shell/__init__.py +1 -0
  594. ansible_test/_internal/commands/units/__init__.py +1 -0
  595. ansible_test/_internal/compat/__init__.py +1 -0
  596. ansible_test/_internal/compat/packaging.py +1 -0
  597. ansible_test/_internal/compat/yaml.py +1 -0
  598. ansible_test/_internal/completion.py +1 -0
  599. ansible_test/_internal/config.py +2 -0
  600. ansible_test/_internal/connections.py +1 -0
  601. ansible_test/_internal/constants.py +1 -0
  602. ansible_test/_internal/containers.py +1 -0
  603. ansible_test/_internal/content_config.py +1 -0
  604. ansible_test/_internal/core_ci.py +1 -0
  605. ansible_test/_internal/coverage_util.py +11 -10
  606. ansible_test/_internal/data.py +1 -0
  607. ansible_test/_internal/delegation.py +1 -0
  608. ansible_test/_internal/dev/__init__.py +1 -0
  609. ansible_test/_internal/dev/container_probe.py +1 -0
  610. ansible_test/_internal/diff.py +3 -2
  611. ansible_test/_internal/docker_util.py +2 -1
  612. ansible_test/_internal/encoding.py +1 -0
  613. ansible_test/_internal/executor.py +1 -0
  614. ansible_test/_internal/git.py +1 -0
  615. ansible_test/_internal/host_configs.py +1 -0
  616. ansible_test/_internal/host_profiles.py +1 -0
  617. ansible_test/_internal/http.py +1 -0
  618. ansible_test/_internal/init.py +1 -0
  619. ansible_test/_internal/inventory.py +35 -3
  620. ansible_test/_internal/io.py +1 -0
  621. ansible_test/_internal/metadata.py +1 -0
  622. ansible_test/_internal/payload.py +1 -0
  623. ansible_test/_internal/provider/__init__.py +1 -0
  624. ansible_test/_internal/provider/layout/__init__.py +1 -0
  625. ansible_test/_internal/provider/layout/ansible.py +1 -0
  626. ansible_test/_internal/provider/layout/collection.py +1 -0
  627. ansible_test/_internal/provider/layout/unsupported.py +1 -0
  628. ansible_test/_internal/provider/source/__init__.py +1 -0
  629. ansible_test/_internal/provider/source/git.py +1 -0
  630. ansible_test/_internal/provider/source/installed.py +1 -0
  631. ansible_test/_internal/provider/source/unsupported.py +1 -0
  632. ansible_test/_internal/provider/source/unversioned.py +1 -0
  633. ansible_test/_internal/provisioning.py +1 -0
  634. ansible_test/_internal/pypi_proxy.py +6 -5
  635. ansible_test/_internal/python_requirements.py +1 -0
  636. ansible_test/_internal/ssh.py +1 -0
  637. ansible_test/_internal/target.py +1 -0
  638. ansible_test/_internal/test.py +3 -2
  639. ansible_test/_internal/thread.py +1 -0
  640. ansible_test/_internal/timeout.py +1 -0
  641. ansible_test/_internal/util.py +1 -0
  642. ansible_test/_internal/util_common.py +5 -2
  643. ansible_test/_internal/venv.py +1 -0
  644. ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +1 -0
  645. ansible_test/_util/controller/sanity/code-smell/changelog/sphinx.py +1 -0
  646. ansible_test/_util/controller/sanity/code-smell/changelog.py +1 -0
  647. ansible_test/_util/controller/sanity/code-smell/empty-init.py +1 -0
  648. ansible_test/_util/controller/sanity/code-smell/line-endings.py +1 -0
  649. ansible_test/_util/controller/sanity/code-smell/no-assert.py +1 -0
  650. ansible_test/_util/controller/sanity/code-smell/no-get-exception.py +1 -0
  651. ansible_test/_util/controller/sanity/code-smell/no-illegal-filenames.py +1 -0
  652. ansible_test/_util/controller/sanity/code-smell/no-smart-quotes.py +1 -0
  653. ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py +1 -0
  654. ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +28 -1
  655. ansible_test/_util/controller/sanity/code-smell/shebang.py +1 -0
  656. ansible_test/_util/controller/sanity/code-smell/symlinks.py +1 -0
  657. ansible_test/_util/controller/sanity/code-smell/use-argspec-type-path.py +1 -0
  658. ansible_test/_util/controller/sanity/code-smell/use-compat-six.py +1 -0
  659. ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py +2 -1
  660. ansible_test/_util/controller/sanity/pep8/current-ignore.txt +4 -0
  661. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +7 -5
  662. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +7 -5
  663. ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +7 -5
  664. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +3 -5
  665. ansible_test/_util/controller/sanity/pylint/config/default.cfg +7 -7
  666. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +1 -13
  667. ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +1 -0
  668. ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +1 -8
  669. ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +1 -8
  670. ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +55 -28
  671. ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +12 -5
  672. ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +13 -2
  673. ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -0
  674. ansible_test/_util/controller/sanity/yamllint/yamllinter.py +35 -17
  675. ansible_test/_util/controller/tools/collection_detail.py +1 -0
  676. ansible_test/_util/controller/tools/yaml_to_json.py +2 -1
  677. ansible_test/_util/target/pytest/plugins/ansible_forked.py +6 -1
  678. ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +2 -1
  679. ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -0
  680. ansible_test/_util/target/sanity/compile/compile.py +1 -0
  681. ansible_test/_util/target/sanity/import/importer.py +15 -16
  682. ansible_test/_util/target/setup/bootstrap.sh +9 -20
  683. ansible_test/_util/target/setup/probe_cgroups.py +1 -0
  684. ansible_test/_util/target/setup/quiet_pip.py +1 -0
  685. ansible_test/_util/target/setup/requirements.py +35 -27
  686. ansible_test/_util/target/tools/virtualenvcheck.py +2 -1
  687. ansible_test/_util/target/tools/yamlcheck.py +2 -1
  688. ansible/compat/selectors.py +0 -32
  689. ansible/errors/yaml_strings.py +0 -138
  690. ansible/executor/action_write_locks.py +0 -44
  691. ansible/executor/discovery/python_target.py +0 -47
  692. ansible/executor/powershell/module_powershell_wrapper.ps1 +0 -86
  693. ansible/executor/powershell/module_script_wrapper.ps1 +0 -22
  694. ansible/module_utils/compat/importlib.py +0 -26
  695. ansible/module_utils/compat/selectors.py +0 -32
  696. ansible/module_utils/pycompat24.py +0 -73
  697. ansible/parsing/yaml/constructor.py +0 -178
  698. ansible/template/native_helpers.py +0 -251
  699. ansible/template/template.py +0 -43
  700. ansible/template/vars.py +0 -77
  701. ansible/utils/native_jinja.py +0 -11
  702. ansible/vars/fact_cache.py +0 -71
  703. ansible_core-2.18.5rc1.dist-info/RECORD +0 -992
  704. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/Apache-License.txt +0 -0
  705. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/COPYING +0 -0
  706. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/MIT-license.txt +0 -0
  707. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/PSF-license.txt +0 -0
  708. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/entry_points.txt +0 -0
  709. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/simplified_bsd.txt +0 -0
  710. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/top_level.txt +0 -0
@@ -1,38 +1,34 @@
1
1
  # Copyright (c) 2018, Ansible Project
2
2
  # Simplified BSD License (see licenses/simplified_bsd.txt or https://opensource.org/licenses/BSD-2-Clause)
3
-
4
-
5
3
  """
6
4
  Modules in _utils are waiting to find a better home. If you need to use them, be prepared for them
7
5
  to move to a different location in the future.
8
6
  """
7
+
9
8
  from __future__ import annotations
10
9
 
10
+ import inspect
11
+ import typing as t
12
+
13
+ _Type = t.TypeVar('_Type')
14
+
15
+
16
+ def get_all_subclasses(cls: type[_Type], *, include_abstract: bool = True, consider_self: bool = False) -> set[type[_Type]]:
17
+ """Recursively find all subclasses of a given type, including abstract classes by default."""
18
+ subclasses: set[type[_Type]] = {cls} if consider_self else set()
19
+ queue: list[type[_Type]] = [cls]
20
+
21
+ while queue:
22
+ parent = queue.pop()
23
+
24
+ for child in parent.__subclasses__():
25
+ if child in subclasses:
26
+ continue
27
+
28
+ queue.append(child)
29
+ subclasses.add(child)
30
+
31
+ if not include_abstract:
32
+ subclasses = {sc for sc in subclasses if not inspect.isabstract(sc)}
11
33
 
12
- def get_all_subclasses(cls):
13
- '''
14
- Recursively search and find all subclasses of a given class
15
-
16
- :arg cls: A python class
17
- :rtype: set
18
- :returns: The set of python classes which are the subclasses of `cls`.
19
-
20
- In python, you can use a class's :py:meth:`__subclasses__` method to determine what subclasses
21
- of a class exist. However, `__subclasses__` only goes one level deep. This function searches
22
- each child class's `__subclasses__` method to find all of the descendent classes. It then
23
- returns an iterable of the descendent classes.
24
- '''
25
- # Retrieve direct subclasses
26
- subclasses = set(cls.__subclasses__())
27
- to_visit = list(subclasses)
28
- # Then visit all subclasses
29
- while to_visit:
30
- for sc in to_visit:
31
- # The current class is now visited, so remove it from list
32
- to_visit.remove(sc)
33
- # Appending all subclasses to visit and keep a reference of available class
34
- for ssc in sc.__subclasses__():
35
- if ssc not in subclasses:
36
- to_visit.append(ssc)
37
- subclasses.add(ssc)
38
34
  return subclasses
@@ -66,8 +66,7 @@ class ImmutableDict(Hashable, Mapping):
66
66
 
67
67
  def is_string(seq):
68
68
  """Identify whether the input has a string-like type (including bytes)."""
69
- # AnsibleVaultEncryptedUnicode inherits from Sequence, but is expected to be a string like object
70
- return isinstance(seq, (text_type, binary_type)) or getattr(seq, '__ENCRYPTED__', False)
69
+ return isinstance(seq, (text_type, binary_type))
71
70
 
72
71
 
73
72
  def is_iterable(seq, include_strings=False):
@@ -109,9 +109,9 @@ def _camel_to_snake(name, reversible=False):
109
109
 
110
110
 
111
111
  def dict_merge(a, b):
112
- '''recursively merges dicts. not just simple a['key'] = b['key'], if
112
+ """recursively merges dicts. not just simple a['key'] = b['key'], if
113
113
  both a and b have a key whose value is a dict then dict_merge is called
114
- on both values and the result stored in the returned dictionary.'''
114
+ on both values and the result stored in the returned dictionary."""
115
115
  if not isinstance(b, dict):
116
116
  return b
117
117
  result = deepcopy(a)
@@ -55,7 +55,7 @@ def is_executable(path):
55
55
  # This method is reused by the basic module,
56
56
  # the repetition helps the basic module's html documentation come out right.
57
57
  # http://www.sphinx-doc.org/en/master/usage/extensions/autodoc.html#confval-autodoc_docstring_signature
58
- '''is_executable(path)
58
+ """is_executable(path)
59
59
 
60
60
  is the given path executable?
61
61
 
@@ -66,7 +66,7 @@ def is_executable(path):
66
66
  * Does not account for FSACLs.
67
67
  * Most times we really want to know "Can the current user execute this
68
68
  file". This function does not tell us that, only if any execute bit is set.
69
- '''
69
+ """
70
70
  # These are all bitfields so first bitwise-or all the permissions we're
71
71
  # looking for, then bitwise-and with the file's mode to determine if any
72
72
  # execute bits are set.
@@ -1,84 +1,90 @@
1
- # -*- coding: utf-8 -*-
2
- # Copyright (c) 2019 Ansible Project
3
- # Simplified BSD License (see licenses/simplified_bsd.txt or https://opensource.org/licenses/BSD-2-Clause)
4
-
5
- from __future__ import annotations
6
-
7
- import json
8
-
9
- import datetime
10
-
11
- from ansible.module_utils.common.text.converters import to_text
12
- from ansible.module_utils.six.moves.collections_abc import Mapping
13
- from ansible.module_utils.common.collections import is_sequence
14
-
15
-
16
- def _is_unsafe(value):
17
- return getattr(value, '__UNSAFE__', False) and not getattr(value, '__ENCRYPTED__', False)
18
-
19
-
20
- def _is_vault(value):
21
- return getattr(value, '__ENCRYPTED__', False)
22
-
23
-
24
- def _preprocess_unsafe_encode(value):
25
- """Recursively preprocess a data structure converting instances of ``AnsibleUnsafe``
26
- into their JSON dict representations
27
-
28
- Used in ``AnsibleJSONEncoder.iterencode``
29
- """
30
- if _is_unsafe(value):
31
- value = {'__ansible_unsafe': to_text(value._strip_unsafe(), errors='surrogate_or_strict', nonstring='strict')}
32
- elif is_sequence(value):
33
- value = [_preprocess_unsafe_encode(v) for v in value]
34
- elif isinstance(value, Mapping):
35
- value = dict((k, _preprocess_unsafe_encode(v)) for k, v in value.items())
36
-
37
- return value
38
-
39
-
40
- def json_dump(structure):
41
- return json.dumps(structure, cls=AnsibleJSONEncoder, sort_keys=True, indent=4)
42
-
43
-
44
- class AnsibleJSONEncoder(json.JSONEncoder):
45
- '''
46
- Simple encoder class to deal with JSON encoding of Ansible internal types
47
- '''
48
-
49
- def __init__(self, preprocess_unsafe=False, vault_to_text=False, **kwargs):
50
- self._preprocess_unsafe = preprocess_unsafe
51
- self._vault_to_text = vault_to_text
52
- super(AnsibleJSONEncoder, self).__init__(**kwargs)
53
-
54
- # NOTE: ALWAYS inform AWS/Tower when new items get added as they consume them downstream via a callback
55
- def default(self, o):
56
- if getattr(o, '__ENCRYPTED__', False):
57
- # vault object
58
- if self._vault_to_text:
59
- value = to_text(o, errors='surrogate_or_strict')
60
- else:
61
- value = {'__ansible_vault': to_text(o._ciphertext, errors='surrogate_or_strict', nonstring='strict')}
62
- elif getattr(o, '__UNSAFE__', False):
63
- # unsafe object, this will never be triggered, see ``AnsibleJSONEncoder.iterencode``
64
- value = {'__ansible_unsafe': to_text(o._strip_unsafe(), errors='surrogate_or_strict', nonstring='strict')}
65
- elif isinstance(o, Mapping):
66
- # hostvars and other objects
67
- value = dict(o)
68
- elif isinstance(o, (datetime.date, datetime.datetime)):
69
- # date object
70
- value = o.isoformat()
71
- else:
72
- # use default encoder
73
- value = super(AnsibleJSONEncoder, self).default(o)
74
- return value
75
-
76
- def iterencode(self, o, **kwargs):
77
- """Custom iterencode, primarily design to handle encoding ``AnsibleUnsafe``
78
- as the ``AnsibleUnsafe`` subclasses inherit from string types and
79
- ``json.JSONEncoder`` does not support custom encoders for string types
80
- """
81
- if self._preprocess_unsafe:
82
- o = _preprocess_unsafe_encode(o)
83
-
84
- return super(AnsibleJSONEncoder, self).iterencode(o, **kwargs)
1
+ from __future__ import annotations as _annotations
2
+
3
+ import enum as _enum
4
+ import json as _stdlib_json
5
+ import types as _types
6
+
7
+ from ansible.module_utils import _internal
8
+ from ansible.module_utils._internal import _json
9
+ from ansible.module_utils._internal._json import _legacy_encoder
10
+ from ansible.module_utils._internal._json import _profiles
11
+ from ansible.module_utils._internal._json._profiles import _tagless
12
+ from ansible.module_utils.common import warnings as _warnings
13
+
14
+
15
+ def __getattr__(name: str) -> object:
16
+ """Handle dynamic module members which are or will be deprecated."""
17
+ if name in ('AnsibleJSONEncoder', '_AnsibleJSONEncoder'):
18
+ # deprecated: description='deprecate legacy encoder' core_version='2.23'
19
+ # if not name.startswith('_'): # avoid duplicate deprecation warning for imports from ajson
20
+ # _warnings.deprecate(
21
+ # msg="The `AnsibleJSONEncoder` type is deprecated.",
22
+ # version="2.27",
23
+ # help_text="Use a profile-based encoder instead.", # DTFIX-RELEASE: improve this help text
24
+ # )
25
+
26
+ return _get_legacy_encoder()
27
+
28
+ if name in ('AnsibleJSONDecoder', '_AnsibleJSONDecoder'):
29
+ # deprecated: description='deprecate legacy decoder' core_version='2.23'
30
+ # if not name.startswith('_'): # avoid duplicate deprecation warning for imports from ajson
31
+ # _warnings.deprecate(
32
+ # msg="The `AnsibleJSONDecoder` type is deprecated.",
33
+ # version="2.27",
34
+ # help_text="Use a profile-based decoder instead.", # DTFIX-RELEASE: improve this help text
35
+ # )
36
+
37
+ return _tagless.Decoder
38
+
39
+ if name == 'json_dump':
40
+ _warnings.deprecate(
41
+ msg="The `json_dump` function is deprecated.",
42
+ version="2.23",
43
+ help_text="Use `json.dumps` with the appropriate `cls` instead.",
44
+ )
45
+
46
+ return _json_dump
47
+
48
+ raise AttributeError(name)
49
+
50
+
51
+ def _get_legacy_encoder() -> type[_stdlib_json.JSONEncoder]:
52
+ """Compatibility hack: previous module_utils AnsibleJSONEncoder impl did controller-side work, controller plugins require a more fully-featured impl."""
53
+ if _internal.is_controller:
54
+ return _internal.import_controller_module('ansible._internal._json._legacy_encoder').LegacyControllerJSONEncoder
55
+
56
+ return _legacy_encoder.LegacyTargetJSONEncoder
57
+
58
+
59
+ def _json_dump(structure):
60
+ """JSON dumping function maintained for temporary backward compatibility."""
61
+ return _stdlib_json.dumps(structure, cls=_get_legacy_encoder(), sort_keys=True, indent=4)
62
+
63
+
64
+ class Direction(_enum.Enum):
65
+ """Enumeration used to select a contextually-appropriate JSON profile for module messaging."""
66
+
67
+ CONTROLLER_TO_MODULE = _enum.auto()
68
+ """Encode/decode messages from the Ansible controller to an Ansible module."""
69
+ MODULE_TO_CONTROLLER = _enum.auto()
70
+ """Encode/decode messages from an Ansible module to the Ansible controller."""
71
+
72
+
73
+ def get_encoder(profile: str | _types.ModuleType, /) -> type[_stdlib_json.JSONEncoder]:
74
+ """Return a `JSONEncoder` for the given `profile`."""
75
+ return _json.get_encoder_decoder(profile, _profiles.AnsibleProfileJSONEncoder)
76
+
77
+
78
+ def get_decoder(profile: str | _types.ModuleType, /) -> type[_stdlib_json.JSONDecoder]:
79
+ """Return a `JSONDecoder` for the given `profile`."""
80
+ return _json.get_encoder_decoder(profile, _profiles.AnsibleProfileJSONDecoder)
81
+
82
+
83
+ def get_module_encoder(name: str, direction: Direction, /) -> type[_stdlib_json.JSONEncoder]:
84
+ """Return a `JSONEncoder` for the module profile specified by `name` and `direction`."""
85
+ return get_encoder(_json.get_module_serialization_profile_name(name, direction == Direction.CONTROLLER_TO_MODULE))
86
+
87
+
88
+ def get_module_decoder(name: str, direction: Direction, /) -> type[_stdlib_json.JSONDecoder]:
89
+ """Return a `JSONDecoder` for the module profile specified by `name` and `direction`."""
90
+ return get_decoder(_json.get_module_serialization_profile_name(name, direction == Direction.CONTROLLER_TO_MODULE))
@@ -7,7 +7,7 @@ from ansible.module_utils.common.text.converters import to_native
7
7
 
8
8
 
9
9
  def get_best_parsable_locale(module, preferences=None, raise_on_locale=False):
10
- '''
10
+ """
11
11
  Attempts to return the best possible locale for parsing output in English
12
12
  useful for scraping output with i18n tools. When this raises an exception
13
13
  and the caller wants to continue, it should use the 'C' locale.
@@ -17,7 +17,7 @@ def get_best_parsable_locale(module, preferences=None, raise_on_locale=False):
17
17
  :param raise_on_locale: boolean that determines if we raise exception or not
18
18
  due to locale CLI issues
19
19
  :returns: The first matched preferred locale or 'C' which is the default
20
- '''
20
+ """
21
21
 
22
22
  found = 'C' # default posix, its ascii but always there
23
23
  try:
@@ -0,0 +1,108 @@
1
+ """
2
+ Message contract definitions for various target-side types.
3
+
4
+ These types and the wire format they implement are currently considered provisional and subject to change without notice.
5
+ A future release will remove the provisional status.
6
+ """
7
+
8
+ from __future__ import annotations as _annotations
9
+
10
+ import sys as _sys
11
+ import dataclasses as _dataclasses
12
+
13
+ # deprecated: description='typing.Self exists in Python 3.11+' python_version='3.10'
14
+ from ..compat import typing as _t
15
+
16
+ from ansible.module_utils._internal import _datatag
17
+
18
+ if _sys.version_info >= (3, 10):
19
+ # Using slots for reduced memory usage and improved performance.
20
+ _dataclass_kwargs = dict(frozen=True, kw_only=True, slots=True)
21
+ else:
22
+ # deprecated: description='always use dataclass slots and keyword-only args' python_version='3.9'
23
+ _dataclass_kwargs = dict(frozen=True)
24
+
25
+
26
+ @_dataclasses.dataclass(**_dataclass_kwargs)
27
+ class PluginInfo(_datatag.AnsibleSerializableDataclass):
28
+ """Information about a loaded plugin."""
29
+
30
+ requested_name: str
31
+ """The plugin name as requested, before resolving, which may be partially or fully qualified."""
32
+ resolved_name: str
33
+ """The resolved canonical plugin name; always fully-qualified for collection plugins."""
34
+ type: str
35
+ """The plugin type."""
36
+
37
+
38
+ @_dataclasses.dataclass(**_dataclass_kwargs)
39
+ class Detail(_datatag.AnsibleSerializableDataclass):
40
+ """Message detail with optional source context and help text."""
41
+
42
+ msg: str
43
+ formatted_source_context: _t.Optional[str] = None
44
+ help_text: _t.Optional[str] = None
45
+
46
+
47
+ @_dataclasses.dataclass(**_dataclass_kwargs)
48
+ class SummaryBase(_datatag.AnsibleSerializableDataclass):
49
+ """Base class for an error/warning/deprecation summary with details (possibly derived from an exception __cause__ chain) and an optional traceback."""
50
+
51
+ details: _t.Tuple[Detail, ...]
52
+ formatted_traceback: _t.Optional[str] = None
53
+
54
+ def _format(self) -> str:
55
+ """Returns a string representation of the details."""
56
+ # DTFIX-RELEASE: eliminate this function and use a common message squashing utility such as get_chained_message on instances of this type
57
+ return ': '.join(detail.msg for detail in self.details)
58
+
59
+ def _post_validate(self) -> None:
60
+ if not self.details:
61
+ raise ValueError(f'{type(self).__name__}.details cannot be empty')
62
+
63
+
64
+ @_dataclasses.dataclass(**_dataclass_kwargs)
65
+ class ErrorSummary(SummaryBase):
66
+ """Error summary with details (possibly derived from an exception __cause__ chain) and an optional traceback."""
67
+
68
+
69
+ @_dataclasses.dataclass(**_dataclass_kwargs)
70
+ class WarningSummary(SummaryBase):
71
+ """Warning summary with details (possibly derived from an exception __cause__ chain) and an optional traceback."""
72
+
73
+
74
+ @_dataclasses.dataclass(**_dataclass_kwargs)
75
+ class DeprecationSummary(WarningSummary):
76
+ """Deprecation summary with details (possibly derived from an exception __cause__ chain) and an optional traceback."""
77
+
78
+ version: _t.Optional[str] = None
79
+ date: _t.Optional[str] = None
80
+ plugin: _t.Optional[PluginInfo] = None
81
+
82
+ @property
83
+ def collection_name(self) -> _t.Optional[str]:
84
+ if not self.plugin:
85
+ return None
86
+
87
+ parts = self.plugin.resolved_name.split('.')
88
+
89
+ if len(parts) < 2:
90
+ return None
91
+
92
+ collection_name = '.'.join(parts[:2])
93
+
94
+ # deprecated: description='enable the deprecation message for collection_name' core_version='2.23'
95
+ # from ansible.module_utils.datatag import deprecate_value
96
+ # collection_name = deprecate_value(collection_name, 'The `collection_name` property is deprecated.', removal_version='2.27')
97
+
98
+ return collection_name
99
+
100
+ def _as_simple_dict(self) -> _t.Dict[str, _t.Any]:
101
+ """Returns a dictionary representation of the deprecation object in the format exposed to playbooks."""
102
+ result = self._as_dict()
103
+ result.update(
104
+ msg=self._format(),
105
+ collection_name=self.collection_name,
106
+ )
107
+
108
+ return result
@@ -6,13 +6,16 @@ from __future__ import annotations
6
6
 
7
7
  import datetime
8
8
  import os
9
+ import typing as t
9
10
 
10
11
  from collections import deque
11
12
  from itertools import chain
12
13
 
13
14
  from ansible.module_utils.common.collections import is_iterable
15
+ from ansible.module_utils._internal._datatag import AnsibleSerializable, AnsibleTagHelper
14
16
  from ansible.module_utils.common.text.converters import to_bytes, to_native, to_text
15
17
  from ansible.module_utils.common.warnings import warn
18
+ from ansible.module_utils.datatag import native_type_name
16
19
  from ansible.module_utils.errors import (
17
20
  AliasError,
18
21
  AnsibleFallbackNotFound,
@@ -83,7 +86,7 @@ _ADDITIONAL_CHECKS = (
83
86
  # if adding boolean attribute, also add to PASS_BOOL
84
87
  # some of this dupes defaults from controller config
85
88
  # keep in sync with copy in lib/ansible/module_utils/csharp/Ansible.Basic.cs
86
- PASS_VARS = {
89
+ PASS_VARS: dict[str, t.Any] = {
87
90
  'check_mode': ('check_mode', False),
88
91
  'debug': ('_debug', False),
89
92
  'diff': ('_diff', False),
@@ -96,9 +99,9 @@ PASS_VARS = {
96
99
  'selinux_special_fs': ('_selinux_special_fs', ['fuse', 'nfs', 'vboxsf', 'ramfs', '9p', 'vfat']),
97
100
  'shell_executable': ('_shell', '/bin/sh'),
98
101
  'socket': ('_socket_path', None),
99
- 'string_conversion_action': ('_string_conversion_action', 'warn'),
100
102
  'syslog_facility': ('_syslog_facility', 'INFO'),
101
103
  'tmpdir': ('_tmpdir', None),
104
+ 'tracebacks_for': ('_tracebacks_for', frozenset()),
102
105
  'verbosity': ('_verbosity', 0),
103
106
  'version': ('ansible_version', '0.0'),
104
107
  }
@@ -408,6 +411,8 @@ def _remove_values_conditions(value, no_log_strings, deferred_removals):
408
411
  dictionary for ``level1``, then the dict for ``level2``, and finally
409
412
  the list for ``level3``.
410
413
  """
414
+ original_value = value
415
+
411
416
  if isinstance(value, (text_type, binary_type)):
412
417
  # Need native str type
413
418
  native_str_value = value
@@ -432,31 +437,25 @@ def _remove_values_conditions(value, no_log_strings, deferred_removals):
432
437
  else:
433
438
  value = native_str_value
434
439
 
440
+ elif value is True or value is False or value is None:
441
+ return value
442
+
435
443
  elif isinstance(value, Sequence):
436
- if isinstance(value, MutableSequence):
437
- new_value = type(value)()
438
- else:
439
- new_value = [] # Need a mutable value
444
+ new_value = AnsibleTagHelper.tag_copy(original_value, [])
440
445
  deferred_removals.append((value, new_value))
441
- value = new_value
446
+ return new_value
442
447
 
443
448
  elif isinstance(value, Set):
444
- if isinstance(value, MutableSet):
445
- new_value = type(value)()
446
- else:
447
- new_value = set() # Need a mutable value
449
+ new_value = AnsibleTagHelper.tag_copy(original_value, set())
448
450
  deferred_removals.append((value, new_value))
449
- value = new_value
451
+ return new_value
450
452
 
451
453
  elif isinstance(value, Mapping):
452
- if isinstance(value, MutableMapping):
453
- new_value = type(value)()
454
- else:
455
- new_value = {} # Need a mutable value
454
+ new_value = AnsibleTagHelper.tag_copy(original_value, {})
456
455
  deferred_removals.append((value, new_value))
457
- value = new_value
456
+ return new_value
458
457
 
459
- elif isinstance(value, tuple(chain(integer_types, (float, bool, NoneType)))):
458
+ elif isinstance(value, (int, float)):
460
459
  stringy_value = to_native(value, encoding='utf-8', errors='surrogate_or_strict')
461
460
  if stringy_value in no_log_strings:
462
461
  return 'VALUE_SPECIFIED_IN_NO_LOG_PARAMETER'
@@ -464,11 +463,15 @@ def _remove_values_conditions(value, no_log_strings, deferred_removals):
464
463
  if omit_me in stringy_value:
465
464
  return 'VALUE_SPECIFIED_IN_NO_LOG_PARAMETER'
466
465
 
467
- elif isinstance(value, (datetime.datetime, datetime.date)):
468
- value = value.isoformat()
466
+ elif isinstance(value, (datetime.datetime, datetime.date, datetime.time)):
467
+ return value
468
+ elif isinstance(value, AnsibleSerializable):
469
+ return value
469
470
  else:
470
471
  raise TypeError('Value of unknown type: %s, %s' % (type(value), value))
471
472
 
473
+ value = AnsibleTagHelper.tag_copy(original_value, value)
474
+
472
475
  return value
473
476
 
474
477
 
@@ -541,7 +544,7 @@ def _sanitize_keys_conditions(value, no_log_strings, ignore_keys, deferred_remov
541
544
  if isinstance(value, tuple(chain(integer_types, (float, bool, NoneType)))):
542
545
  return value
543
546
 
544
- if isinstance(value, (datetime.datetime, datetime.date)):
547
+ if isinstance(value, (datetime.datetime, datetime.date, datetime.time)):
545
548
  return value
546
549
 
547
550
  raise TypeError('Value of unknown type: %s, %s' % (type(value), value))
@@ -570,7 +573,7 @@ def _validate_elements(wanted_type, parameter, values, options_context=None, err
570
573
  msg = "Elements value for option '%s'" % parameter
571
574
  if options_context:
572
575
  msg += " found in '%s'" % " -> ".join(options_context)
573
- msg += " is of type %s and we were unable to convert to %s: %s" % (type(value), wanted_element_type, to_native(e))
576
+ msg += " is of type %s and we were unable to convert to %s: %s" % (native_type_name(value), wanted_element_type, to_native(e))
574
577
  errors.append(ElementError(msg))
575
578
  return validated_parameters
576
579
 
@@ -629,7 +632,7 @@ def _validate_argument_types(argument_spec, parameters, prefix='', options_conte
629
632
  elements_wanted_type = spec.get('elements', None)
630
633
  if elements_wanted_type:
631
634
  elements = parameters[param]
632
- if wanted_type != 'list' or not isinstance(elements, list):
635
+ if not isinstance(parameters[param], list) or not isinstance(elements, list):
633
636
  msg = "Invalid type %s for option '%s'" % (wanted_name, elements)
634
637
  if options_context:
635
638
  msg += " found in '%s'." % " -> ".join(options_context)
@@ -638,7 +641,7 @@ def _validate_argument_types(argument_spec, parameters, prefix='', options_conte
638
641
  parameters[param] = _validate_elements(elements_wanted_type, param, elements, options_context, errors)
639
642
 
640
643
  except (TypeError, ValueError) as e:
641
- msg = "argument '%s' is of type %s" % (param, type(value))
644
+ msg = "argument '%s' is of type %s" % (param, native_type_name(value))
642
645
  if options_context:
643
646
  msg += " found in '%s'." % " -> ".join(options_context)
644
647
  msg += " and we were unable to convert to %s: %s" % (wanted_name, to_native(e))
@@ -10,7 +10,7 @@ from ansible.module_utils.common.warnings import deprecate
10
10
 
11
11
 
12
12
  def get_bin_path(arg, opt_dirs=None, required=None):
13
- '''
13
+ """
14
14
  Find system executable in PATH. Raises ValueError if the executable is not found.
15
15
 
16
16
  :param arg: the executable to find
@@ -24,7 +24,7 @@ def get_bin_path(arg, opt_dirs=None, required=None):
24
24
 
25
25
  In addition to PATH and opt_dirs, this function also looks through /sbin, /usr/sbin and /usr/local/sbin. A lot of
26
26
  modules, especially for gathering facts, depend on this behaviour.
27
- '''
27
+ """
28
28
  if required is not None:
29
29
  deprecate(
30
30
  msg="The `required` parameter in `get_bin_path` API is deprecated.",