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
@@ -14,14 +14,14 @@
14
14
  # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
15
15
  from __future__ import annotations
16
16
 
17
- DOCUMENTATION = '''
17
+ DOCUMENTATION = """
18
18
  name: debug
19
19
  short_description: Executes tasks in interactive debug session.
20
20
  description:
21
21
  - Task execution is 'linear' but controlled by an interactive debug session.
22
22
  version_added: "2.1"
23
23
  author: Kishin Yagami (!UNKNOWN)
24
- '''
24
+ """
25
25
 
26
26
  from ansible.plugins.strategy.linear import StrategyModule as LinearStrategyModule
27
27
 
@@ -16,7 +16,7 @@
16
16
  # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
17
17
  from __future__ import annotations
18
18
 
19
- DOCUMENTATION = '''
19
+ DOCUMENTATION = """
20
20
  name: free
21
21
  short_description: Executes tasks without waiting for all hosts
22
22
  description:
@@ -27,7 +27,7 @@ DOCUMENTATION = '''
27
27
  won't hold up the rest of the hosts and tasks.
28
28
  version_added: "2.0"
29
29
  author: Ansible Core Team
30
- '''
30
+ """
31
31
 
32
32
  import time
33
33
 
@@ -37,8 +37,7 @@ from ansible.playbook.handler import Handler
37
37
  from ansible.playbook.included_file import IncludedFile
38
38
  from ansible.plugins.loader import action_loader
39
39
  from ansible.plugins.strategy import StrategyBase
40
- from ansible.template import Templar
41
- from ansible.module_utils.common.text.converters import to_text
40
+ from ansible._internal._templating._engine import TemplateEngine
42
41
  from ansible.utils.display import Display
43
42
 
44
43
  display = Display()
@@ -54,7 +53,7 @@ class StrategyModule(StrategyBase):
54
53
  self._host_pinned = False
55
54
 
56
55
  def run(self, iterator, play_context):
57
- '''
56
+ """
58
57
  The "free" strategy is a bit more complex, in that it allows tasks to
59
58
  be sent to hosts as quickly as they can be processed. This means that
60
59
  some hosts may finish very quickly if run tasks result in little or no
@@ -65,7 +64,7 @@ class StrategyModule(StrategyBase):
65
64
  and starting the search from there as opposed to the top of the hosts
66
65
  list again, which would end up favoring hosts near the beginning of the
67
66
  list.
68
- '''
67
+ """
69
68
 
70
69
  # the last host to be given a task
71
70
  last_host = 0
@@ -124,13 +123,13 @@ class StrategyModule(StrategyBase):
124
123
  _hosts=self._hosts_cache,
125
124
  _hosts_all=self._hosts_cache_all)
126
125
  self.add_tqm_variables(task_vars, play=iterator._play)
127
- templar = Templar(loader=self._loader, variables=task_vars)
126
+ templar = TemplateEngine(loader=self._loader, variables=task_vars)
128
127
  display.debug("done getting variables", host=host_name)
129
128
 
130
129
  try:
131
130
  throttle = int(templar.template(task.throttle))
132
- except Exception as e:
133
- raise AnsibleError("Failed to convert the throttle value to an integer.", obj=task._ds, orig_exc=e)
131
+ except Exception as ex:
132
+ raise AnsibleError("Failed to convert the throttle value to an integer.", obj=task.throttle) from ex
134
133
 
135
134
  if throttle > 0:
136
135
  same_tasks = 0
@@ -155,13 +154,7 @@ class StrategyModule(StrategyBase):
155
154
  # corresponding action plugin
156
155
  action = None
157
156
 
158
- try:
159
- task.name = to_text(templar.template(task.name, fail_on_undefined=False), nonstring='empty')
160
- display.debug("done templating", host=host_name)
161
- except Exception:
162
- # just ignore any errors during task name templating,
163
- # we don't care if it just shows the raw name
164
- display.debug("templating failed for some reason", host=host_name)
157
+ task.post_validate_attribute("name", templar=templar)
165
158
 
166
159
  run_once = templar.template(task.run_once) or action and getattr(action, 'BYPASS_HOST_LOOP', False)
167
160
  if run_once:
@@ -172,15 +165,6 @@ class StrategyModule(StrategyBase):
172
165
  display.warning("Using run_once with the free strategy is not currently supported. This task will still be "
173
166
  "executed for every host in the inventory list.")
174
167
 
175
- # check to see if this task should be skipped, due to it being a member of a
176
- # role which has already run (and whether that role allows duplicate execution)
177
- if not isinstance(task, Handler) and task._role:
178
- role_obj = self._get_cached_role(task, iterator._play)
179
- if role_obj.has_run(host) and task._role._metadata.allow_duplicates is False:
180
- display.debug("'%s' skipped because role has already run" % task, host=host_name)
181
- del self._blocked_hosts[host_name]
182
- continue
183
-
184
168
  if task.action in C._ACTION_META:
185
169
  if self._host_pinned:
186
170
  meta_task_dummy_results_count += 1
@@ -264,14 +248,15 @@ class StrategyModule(StrategyBase):
264
248
  iterator.handlers = [h for b in iterator._play.handlers for h in b.block]
265
249
  except AnsibleParserError:
266
250
  raise
267
- except AnsibleError as e:
268
- display.error(to_text(e), wrap_text=False)
251
+ except AnsibleError as ex:
252
+ # FIXME: send the error to the callback; don't directly write to display here
253
+ display.error(ex)
269
254
  for r in included_file._results:
270
- r._result['failed'] = True
271
- r._result['reason'] = str(e)
272
- self._tqm._stats.increment('failures', r._host.name)
255
+ r._return_data['failed'] = True
256
+ r._return_data['reason'] = str(ex)
257
+ self._tqm._stats.increment('failures', r.host.name)
273
258
  self._tqm.send_callback('v2_runner_on_failed', r)
274
- failed_includes_hosts.add(r._host)
259
+ failed_includes_hosts.add(r.host)
275
260
  continue
276
261
  else:
277
262
  # since we skip incrementing the stats when the task result is
@@ -16,7 +16,7 @@
16
16
  # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
17
17
  from __future__ import annotations
18
18
 
19
- DOCUMENTATION = '''
19
+ DOCUMENTATION = """
20
20
  name: host_pinned
21
21
  short_description: Executes tasks on each host without interruption
22
22
  description:
@@ -28,7 +28,7 @@ DOCUMENTATION = '''
28
28
  Other than that, it behaves just like the "free" strategy.
29
29
  version_added: "2.7"
30
30
  author: Ansible Core Team
31
- '''
31
+ """
32
32
 
33
33
  from ansible.plugins.strategy.free import StrategyModule as FreeStrategyModule
34
34
  from ansible.utils.display import Display
@@ -16,7 +16,7 @@
16
16
  # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
17
17
  from __future__ import annotations
18
18
 
19
- DOCUMENTATION = '''
19
+ DOCUMENTATION = """
20
20
  name: linear
21
21
  short_description: Executes tasks in a linear fashion
22
22
  description:
@@ -27,29 +27,34 @@ DOCUMENTATION = '''
27
27
  notes:
28
28
  - This was the default Ansible behaviour before 'strategy plugins' were introduced in 2.0.
29
29
  author: Ansible Core Team
30
- '''
30
+ """
31
31
 
32
32
  from ansible import constants as C
33
- from ansible.errors import AnsibleError, AnsibleAssertionError, AnsibleParserError
34
- from ansible.module_utils.common.text.converters import to_text
33
+ from ansible.errors import AnsibleError, AnsibleAssertionError, AnsibleParserError, AnsibleValueOmittedError
35
34
  from ansible.playbook.handler import Handler
36
35
  from ansible.playbook.included_file import IncludedFile
37
36
  from ansible.plugins.loader import action_loader
38
37
  from ansible.plugins.strategy import StrategyBase
39
- from ansible.template import Templar
38
+ from ansible._internal._templating._engine import TemplateEngine
40
39
  from ansible.utils.display import Display
40
+ from ansible.inventory.host import Host
41
+ from ansible.playbook.task import Task
42
+ from ansible.executor.play_iterator import PlayIterator
43
+ from ansible.playbook.play_context import PlayContext
44
+ from ansible.executor import task_result as _task_result
41
45
 
42
46
  display = Display()
43
47
 
44
48
 
45
49
  class StrategyModule(StrategyBase):
46
50
 
47
- def _get_next_task_lockstep(self, hosts, iterator):
48
- '''
51
+ def _get_next_task_lockstep(self, hosts: list[Host], iterator: PlayIterator) -> list[tuple[Host, Task]]:
52
+ """
49
53
  Returns a list of (host, task) tuples, where the task may
50
54
  be a noop task to keep the iterator in lock step across
51
55
  all hosts.
52
- '''
56
+ """
57
+
53
58
  state_task_per_host = {}
54
59
  for host in hosts:
55
60
  state, task = iterator.get_next_task_for_host(host, peek=True)
@@ -84,20 +89,20 @@ class StrategyModule(StrategyBase):
84
89
  iterator.set_state_for_host(host.name, state)
85
90
  host_tasks.append((host, task))
86
91
 
87
- if cur_task.action in C._ACTION_META and cur_task.args.get('_raw_params') == 'flush_handlers':
92
+ if cur_task._get_meta() == 'flush_handlers':
88
93
  iterator.all_tasks[iterator.cur_task:iterator.cur_task] = [h for b in iterator._play.handlers for h in b.block]
89
94
 
90
95
  return host_tasks
91
96
 
92
- def run(self, iterator, play_context):
93
- '''
97
+ def run(self, iterator, play_context: PlayContext): # type: ignore[override]
98
+ """
94
99
  The linear strategy is simple - get the next task and queue
95
100
  it for all hosts, then wait for the queue to drain before
96
101
  moving on to the next task
97
- '''
102
+ """
98
103
 
99
104
  # iterate over each task, while there is one left to run
100
- result = self._tqm.RUN_OK
105
+ result = int(self._tqm.RUN_OK)
101
106
  work_to_do = True
102
107
 
103
108
  self._set_hosts_cache(iterator._play)
@@ -122,7 +127,7 @@ class StrategyModule(StrategyBase):
122
127
  # flag set if task is set to any_errors_fatal
123
128
  any_errors_fatal = False
124
129
 
125
- results = []
130
+ results: list[_task_result._RawTaskResult] = []
126
131
  for (host, task) in host_tasks:
127
132
  if self._tqm._terminated:
128
133
  break
@@ -130,26 +135,23 @@ class StrategyModule(StrategyBase):
130
135
  run_once = False
131
136
  work_to_do = True
132
137
 
133
- # check to see if this task should be skipped, due to it being a member of a
134
- # role which has already run (and whether that role allows duplicate execution)
135
- if not isinstance(task, Handler) and task._role:
136
- role_obj = self._get_cached_role(task, iterator._play)
137
- if role_obj.has_run(host) and task._role._metadata.allow_duplicates is False:
138
- display.debug("'%s' skipped because role has already run" % task)
139
- continue
138
+ host_name = host.get_name()
140
139
 
141
140
  display.debug("getting variables")
142
141
  task_vars = self._variable_manager.get_vars(play=iterator._play, host=host, task=task,
143
142
  _hosts=self._hosts_cache, _hosts_all=self._hosts_cache_all)
144
143
  self.add_tqm_variables(task_vars, play=iterator._play)
145
- templar = Templar(loader=self._loader, variables=task_vars)
144
+ templar = TemplateEngine(loader=self._loader, variables=task_vars)
146
145
  display.debug("done getting variables")
147
146
 
148
147
  # test to see if the task across all hosts points to an action plugin which
149
148
  # sets BYPASS_HOST_LOOP to true, or if it has run_once enabled. If so, we
150
149
  # will only send this task to the first host in the list.
151
150
 
152
- task_action = templar.template(task.action)
151
+ try:
152
+ task_action = templar.template(task.action)
153
+ except AnsibleValueOmittedError:
154
+ raise AnsibleParserError("Omit is not valid for the `action` keyword.", obj=task.action) from None
153
155
 
154
156
  try:
155
157
  action = action_loader.get(task_action, class_only=True, collection_list=task.collections)
@@ -162,7 +164,7 @@ class StrategyModule(StrategyBase):
162
164
  # for the linear strategy, we run meta tasks just once and for
163
165
  # all hosts currently being iterated over rather than one host
164
166
  results.extend(self._execute_meta(task, play_context, iterator, host))
165
- if task.args.get('_raw_params', None) not in ('noop', 'reset_connection', 'end_host', 'role_complete', 'flush_handlers', 'end_role'):
167
+ if task._get_meta() not in ('noop', 'reset_connection', 'end_host', 'role_complete', 'flush_handlers', 'end_role'):
166
168
  run_once = True
167
169
  if (task.any_errors_fatal or run_once) and not task.ignore_errors:
168
170
  any_errors_fatal = True
@@ -176,22 +178,20 @@ class StrategyModule(StrategyBase):
176
178
  break
177
179
 
178
180
  run_once = action and getattr(action, 'BYPASS_HOST_LOOP', False) or templar.template(task.run_once)
179
- try:
180
- task.name = to_text(templar.template(task.name, fail_on_undefined=False), nonstring='empty')
181
- except Exception as e:
182
- display.debug(f"Failed to templalte task name ({task.name}), ignoring error and continuing: {e}")
183
181
 
184
182
  if (task.any_errors_fatal or run_once) and not task.ignore_errors:
185
183
  any_errors_fatal = True
186
184
 
187
185
  if not callback_sent:
186
+ task.post_validate_attribute("name", templar=templar)
187
+
188
188
  if isinstance(task, Handler):
189
189
  self._tqm.send_callback('v2_playbook_on_handler_task_start', task)
190
190
  else:
191
191
  self._tqm.send_callback('v2_playbook_on_task_start', task, is_conditional=False)
192
192
  callback_sent = True
193
193
 
194
- self._blocked_hosts[host.get_name()] = True
194
+ self._blocked_hosts[host_name] = True
195
195
  self._queue_task(host, task, task_vars, play_context)
196
196
  del task_vars
197
197
 
@@ -283,14 +283,15 @@ class StrategyModule(StrategyBase):
283
283
  display.debug("done iterating over new_blocks loaded from include file")
284
284
  except AnsibleParserError:
285
285
  raise
286
- except AnsibleError as e:
287
- display.error(to_text(e), wrap_text=False)
286
+ except AnsibleError as ex:
287
+ # FIXME: send the error to the callback; don't directly write to display here
288
+ display.error(ex)
288
289
  for r in included_file._results:
289
- r._result['failed'] = True
290
- r._result['reason'] = str(e)
291
- self._tqm._stats.increment('failures', r._host.name)
290
+ r._return_data['failed'] = True
291
+ r._return_data['reason'] = str(ex)
292
+ self._tqm._stats.increment('failures', r.host.name)
292
293
  self._tqm.send_callback('v2_runner_on_failed', r)
293
- failed_includes_hosts.add(r._host)
294
+ failed_includes_hosts.add(r.host)
294
295
  else:
295
296
  # since we skip incrementing the stats when the task result is
296
297
  # first processed, we do so now for each host in the list
@@ -321,9 +322,9 @@ class StrategyModule(StrategyBase):
321
322
  unreachable_hosts = []
322
323
  for res in results:
323
324
  if res.is_failed():
324
- failed_hosts.append(res._host.name)
325
+ failed_hosts.append(res.host.name)
325
326
  elif res.is_unreachable():
326
- unreachable_hosts.append(res._host.name)
327
+ unreachable_hosts.append(res.host.name)
327
328
 
328
329
  if any_errors_fatal and (failed_hosts or unreachable_hosts):
329
330
  for host in hosts_left:
@@ -355,10 +356,9 @@ class StrategyModule(StrategyBase):
355
356
  return result
356
357
  display.debug("done checking to see if all hosts have failed")
357
358
 
358
- except (IOError, EOFError) as e:
359
- display.debug("got IOError/EOFError in task loop: %s" % e)
360
- # most likely an abort, return failed
361
- return self._tqm.RUN_UNKNOWN_ERROR
359
+ finally:
360
+ # removed unnecessary exception handler, don't want to mis-attribute the entire code block by changing indentation
361
+ pass
362
362
 
363
363
  # run the base class run() method, which executes the cleanup function
364
364
  # and runs any outstanding handlers which have been triggered
@@ -26,7 +26,7 @@ from ansible.errors import AnsibleConnectionFailure
26
26
 
27
27
 
28
28
  class TerminalBase(ABC):
29
- '''
29
+ """
30
30
  A base class for implementing cli connections
31
31
 
32
32
  .. note:: Unlike most of Ansible, nearly all strings in
@@ -36,7 +36,7 @@ class TerminalBase(ABC):
36
36
  :func:`~ansible.module_utils.common.text.converters.to_bytes` and
37
37
  :func:`~ansible.module_utils.common.text.converters.to_text` to avoid unexpected
38
38
  problems.
39
- '''
39
+ """
40
40
 
41
41
  #: compiled bytes regular expressions as stdout
42
42
  terminal_stdout_re = [] # type: list[re.Pattern]
@@ -64,11 +64,11 @@ class TerminalBase(ABC):
64
64
  self._connection = connection
65
65
 
66
66
  def _exec_cli_command(self, cmd, check_rc=True):
67
- '''
67
+ """
68
68
  Executes the CLI command on the remote device and returns the output
69
69
 
70
70
  :arg cmd: Byte string command to be executed
71
- '''
71
+ """
72
72
  return self._connection.exec_command(cmd)
73
73
 
74
74
  def _get_prompt(self):
@@ -3,10 +3,15 @@
3
3
 
4
4
  from __future__ import annotations
5
5
 
6
+ import typing as t
7
+
6
8
  from ansible.plugins import AnsibleJinja2Plugin
7
9
 
8
10
 
9
11
  class AnsibleJinja2Test(AnsibleJinja2Plugin):
12
+ @property
13
+ def plugin_type(self) -> str:
14
+ return "test"
10
15
 
11
- def _no_options(self, *args, **kwargs):
12
- raise NotImplementedError("Jinaj2 test plugins do not support option functions, they use direct arguments instead.")
16
+ def _no_options(self, *args, **kwargs) -> t.NoReturn:
17
+ raise NotImplementedError("Jinja2 test plugins do not support option functions, they use direct arguments instead.")
@@ -17,17 +17,22 @@
17
17
 
18
18
  from __future__ import annotations
19
19
 
20
+ import functools
20
21
  import re
21
22
  import operator as py_operator
22
23
 
23
24
  from collections.abc import MutableMapping, MutableSequence
24
25
 
26
+ from jinja2.tests import test_defined, test_undefined
27
+
25
28
  from ansible.module_utils.compat.version import LooseVersion, StrictVersion
26
29
 
27
30
  from ansible import errors
28
31
  from ansible.module_utils.common.text.converters import to_native, to_text, to_bytes
32
+ from ansible._internal._templating._jinja_common import Marker, UndefinedMarker
29
33
  from ansible.module_utils.parsing.convert_bool import boolean
30
- from ansible.parsing.vault import is_encrypted_file
34
+ from ansible.plugins import accept_args_markers
35
+ from ansible.parsing.vault import is_encrypted_file, VaultHelper, VaultLib
31
36
  from ansible.utils.display import Display
32
37
  from ansible.utils.version import SemanticVersion
33
38
 
@@ -41,38 +46,38 @@ display = Display()
41
46
 
42
47
 
43
48
  def timedout(result):
44
- ''' Test if task result yields a time out'''
49
+ """ Test if task result yields a time out"""
45
50
  if not isinstance(result, MutableMapping):
46
51
  raise errors.AnsibleFilterError("The 'timedout' test expects a dictionary")
47
- return result.get('timedout', False) and result['timedout'].get('period', False)
52
+ return result.get('timedout', False) and bool(result['timedout'].get('period', False))
48
53
 
49
54
 
50
55
  def failed(result):
51
- ''' Test if task result yields failed '''
56
+ """ Test if task result yields failed """
52
57
  if not isinstance(result, MutableMapping):
53
58
  raise errors.AnsibleFilterError("The 'failed' test expects a dictionary")
54
59
  return result.get('failed', False)
55
60
 
56
61
 
57
62
  def success(result):
58
- ''' Test if task result yields success '''
63
+ """ Test if task result yields success """
59
64
  return not failed(result)
60
65
 
61
66
 
62
67
  def unreachable(result):
63
- ''' Test if task result yields unreachable '''
68
+ """ Test if task result yields unreachable """
64
69
  if not isinstance(result, MutableMapping):
65
70
  raise errors.AnsibleFilterError("The 'unreachable' test expects a dictionary")
66
71
  return result.get('unreachable', False)
67
72
 
68
73
 
69
74
  def reachable(result):
70
- ''' Test if task result yields reachable '''
75
+ """ Test if task result yields reachable """
71
76
  return not unreachable(result)
72
77
 
73
78
 
74
79
  def changed(result):
75
- ''' Test if task result yields changed '''
80
+ """ Test if task result yields changed """
76
81
  if not isinstance(result, MutableMapping):
77
82
  raise errors.AnsibleFilterError("The 'changed' test expects a dictionary")
78
83
  if 'changed' not in result:
@@ -92,14 +97,14 @@ def changed(result):
92
97
 
93
98
 
94
99
  def skipped(result):
95
- ''' Test if task result yields skipped '''
100
+ """ Test if task result yields skipped """
96
101
  if not isinstance(result, MutableMapping):
97
102
  raise errors.AnsibleFilterError("The 'skipped' test expects a dictionary")
98
103
  return result.get('skipped', False)
99
104
 
100
105
 
101
106
  def started(result):
102
- ''' Test if async task has started '''
107
+ """ Test if async task has started """
103
108
  if not isinstance(result, MutableMapping):
104
109
  raise errors.AnsibleFilterError("The 'started' test expects a dictionary")
105
110
  if 'started' in result:
@@ -113,7 +118,7 @@ def started(result):
113
118
 
114
119
 
115
120
  def finished(result):
116
- ''' Test if async task has finished '''
121
+ """ Test if async task has finished """
117
122
  if not isinstance(result, MutableMapping):
118
123
  raise errors.AnsibleFilterError("The 'finished' test expects a dictionary")
119
124
  if 'finished' in result:
@@ -127,12 +132,10 @@ def finished(result):
127
132
 
128
133
 
129
134
  def regex(value='', pattern='', ignorecase=False, multiline=False, match_type='search'):
130
- ''' Expose `re` as a boolean filter using the `search` method by default.
135
+ """ Expose `re` as a boolean filter using the `search` method by default.
131
136
  This is likely only useful for `search` and `match` which already
132
137
  have their own filters.
133
- '''
134
- # In addition to ensuring the correct type, to_text here will ensure
135
- # _fail_with_undefined_error happens if the value is Undefined
138
+ """
136
139
  value = to_text(value, errors='surrogate_or_strict')
137
140
  flags = 0
138
141
  if ignorecase:
@@ -143,12 +146,19 @@ def regex(value='', pattern='', ignorecase=False, multiline=False, match_type='s
143
146
  return bool(getattr(_re, match_type, 'search')(value))
144
147
 
145
148
 
146
- def vault_encrypted(value):
149
+ @accept_args_markers
150
+ def vault_encrypted(value: object) -> bool:
147
151
  """Evaluate whether a variable is a single vault encrypted value
148
152
 
149
153
  .. versionadded:: 2.10
150
154
  """
151
- return getattr(value, '__ENCRYPTED__', False) and value.is_encrypted()
155
+ if ciphertext := VaultHelper.get_ciphertext(value, with_tags=False):
156
+ return VaultLib.is_encrypted(ciphertext)
157
+
158
+ if isinstance(value, Marker):
159
+ value.trip()
160
+
161
+ return False
152
162
 
153
163
 
154
164
  def vaulted_file(value):
@@ -164,17 +174,17 @@ def vaulted_file(value):
164
174
 
165
175
 
166
176
  def match(value, pattern='', ignorecase=False, multiline=False):
167
- ''' Perform a `re.match` returning a boolean '''
177
+ """ Perform a `re.match` returning a boolean """
168
178
  return regex(value, pattern, ignorecase, multiline, 'match')
169
179
 
170
180
 
171
181
  def search(value, pattern='', ignorecase=False, multiline=False):
172
- ''' Perform a `re.search` returning a boolean '''
182
+ """ Perform a `re.search` returning a boolean """
173
183
  return regex(value, pattern, ignorecase, multiline, 'search')
174
184
 
175
185
 
176
186
  def version_compare(value, version, operator='eq', strict=None, version_type=None):
177
- ''' Perform a version comparison on a value '''
187
+ """ Perform a version comparison on a value """
178
188
  op_map = {
179
189
  '==': 'eq', '=': 'eq', 'eq': 'eq',
180
190
  '<': 'lt', 'lt': 'lt',
@@ -257,8 +267,28 @@ def falsy(value, convert_bool=False):
257
267
  return not truthy(value, convert_bool=convert_bool)
258
268
 
259
269
 
270
+ @accept_args_markers
271
+ @functools.wraps(test_defined)
272
+ def wrapped_test_defined(value: object) -> Marker | bool:
273
+ """Wrapper around Jinja's `defined` test to avoid mutating the externally-owned function with our marker attribute."""
274
+ if isinstance(value, Marker) and not isinstance(value, UndefinedMarker):
275
+ return value
276
+
277
+ return test_defined(value)
278
+
279
+
280
+ @accept_args_markers
281
+ @functools.wraps(test_undefined)
282
+ def wrapped_test_undefined(value: object) -> Marker | bool:
283
+ """Wrapper around Jinja's `undefined` test to avoid mutating the externally-owned function with our marker attribute."""
284
+ if isinstance(value, Marker) and not isinstance(value, UndefinedMarker):
285
+ return value
286
+
287
+ return test_undefined(value)
288
+
289
+
260
290
  class TestModule(object):
261
- ''' Ansible core jinja2 tests '''
291
+ """ Ansible core jinja2 tests """
262
292
 
263
293
  def tests(self):
264
294
  return {
@@ -304,4 +334,8 @@ class TestModule(object):
304
334
  # vault
305
335
  'vault_encrypted': vault_encrypted,
306
336
  'vaulted_file': vaulted_file,
337
+
338
+ # overrides that require special arg handling
339
+ 'defined': wrapped_test_defined,
340
+ 'undefined': wrapped_test_undefined,
307
341
  }
@@ -21,7 +21,7 @@ from os.path import isdir, isfile, isabs, exists, lexists, islink, samefile, ism
21
21
 
22
22
 
23
23
  class TestModule(object):
24
- ''' Ansible file jinja2 tests '''
24
+ """ Ansible file jinja2 tests """
25
25
 
26
26
  def tests(self):
27
27
  return {
@@ -36,15 +36,15 @@ def isnotanumber(x):
36
36
 
37
37
 
38
38
  def contains(seq, value):
39
- '''Opposite of the ``in`` test, allowing use as a test in filters like ``selectattr``
39
+ """Opposite of the ``in`` test, allowing use as a test in filters like ``selectattr``
40
40
 
41
41
  .. versionadded:: 2.8
42
- '''
42
+ """
43
43
  return value in seq
44
44
 
45
45
 
46
46
  class TestModule:
47
- ''' Ansible math jinja2 tests '''
47
+ """ Ansible math jinja2 tests """
48
48
 
49
49
  def tests(self):
50
50
  return {
@@ -6,7 +6,7 @@ from urllib.parse import urlparse
6
6
 
7
7
 
8
8
  def is_uri(value, schemes=None):
9
- ''' Will verify that the string passed is a valid 'URI', if given a list of valid schemes it will match those '''
9
+ """ Will verify that the string passed is a valid 'URI', if given a list of valid schemes it will match those """
10
10
  try:
11
11
  x = urlparse(value)
12
12
  isit = all([x.scheme is not None, x.path is not None, not schemes or x.scheme in schemes])
@@ -16,7 +16,7 @@ def is_uri(value, schemes=None):
16
16
 
17
17
 
18
18
  def is_url(value, schemes=None):
19
- ''' Will verify that the string passed is a valid 'URL' '''
19
+ """ Will verify that the string passed is a valid 'URL' """
20
20
 
21
21
  isit = is_uri(value, schemes)
22
22
  if isit:
@@ -33,7 +33,7 @@ def is_urn(value):
33
33
 
34
34
 
35
35
  class TestModule(object):
36
- ''' Ansible URI jinja2 test '''
36
+ """ Ansible URI jinja2 test """
37
37
 
38
38
  def tests(self):
39
39
  return {