ansible-core 2.16.6__py3-none-any.whl → 2.17.0rc1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ansible-core might be problematic. Click here for more details.

Files changed (596) hide show
  1. ansible/__init__.py +1 -3
  2. ansible/__main__.py +1 -0
  3. ansible/_vendor/__init__.py +1 -2
  4. ansible/cli/__init__.py +7 -8
  5. ansible/cli/adhoc.py +1 -2
  6. ansible/cli/arguments/__init__.py +1 -2
  7. ansible/cli/arguments/option_helpers.py +1 -2
  8. ansible/cli/config.py +1 -2
  9. ansible/cli/console.py +1 -2
  10. ansible/cli/doc.py +320 -198
  11. ansible/cli/galaxy.py +9 -3
  12. ansible/cli/inventory.py +4 -6
  13. ansible/cli/playbook.py +1 -2
  14. ansible/cli/pull.py +4 -5
  15. ansible/cli/scripts/ansible_connection_cli_stub.py +1 -4
  16. ansible/cli/vault.py +1 -2
  17. ansible/collections/list.py +1 -0
  18. ansible/compat/__init__.py +1 -4
  19. ansible/compat/importlib_resources.py +1 -2
  20. ansible/compat/{selectors/__init__.py → selectors.py} +12 -12
  21. ansible/config/ansible_builtin_runtime.yml +2 -0
  22. ansible/config/base.yml +154 -149
  23. ansible/config/manager.py +33 -25
  24. ansible/constants.py +1 -2
  25. ansible/context.py +1 -4
  26. ansible/errors/__init__.py +1 -3
  27. ansible/errors/yaml_strings.py +1 -3
  28. ansible/executor/__init__.py +1 -3
  29. ansible/executor/discovery/python_target.py +1 -2
  30. ansible/executor/interpreter_discovery.py +9 -8
  31. ansible/executor/module_common.py +1 -3
  32. ansible/executor/play_iterator.py +2 -4
  33. ansible/executor/playbook_executor.py +1 -3
  34. ansible/executor/powershell/module_manifest.py +2 -3
  35. ansible/executor/process/__init__.py +1 -3
  36. ansible/executor/process/worker.py +1 -3
  37. ansible/executor/stats.py +1 -3
  38. ansible/executor/task_executor.py +2 -3
  39. ansible/executor/task_queue_manager.py +1 -3
  40. ansible/executor/task_result.py +2 -3
  41. ansible/galaxy/__init__.py +1 -2
  42. ansible/galaxy/api.py +10 -2
  43. ansible/galaxy/collection/__init__.py +38 -24
  44. ansible/galaxy/collection/concrete_artifact_manager.py +1 -2
  45. ansible/galaxy/collection/galaxy_api_proxy.py +1 -2
  46. ansible/galaxy/collection/gpg.py +4 -2
  47. ansible/galaxy/data/apb/meta/main.yml.j2 +0 -15
  48. ansible/galaxy/data/container/meta/main.yml.j2 +0 -18
  49. ansible/galaxy/data/default/role/meta/main.yml.j2 +0 -18
  50. ansible/galaxy/data/network/cliconf_plugins/example.py.j2 +1 -2
  51. ansible/galaxy/data/network/library/example_command.py.j2 +1 -2
  52. ansible/galaxy/data/network/library/example_config.py.j2 +1 -2
  53. ansible/galaxy/data/network/library/example_facts.py.j2 +1 -2
  54. ansible/galaxy/data/network/meta/main.yml.j2 +0 -15
  55. ansible/galaxy/data/network/module_utils/example.py.j2 +1 -2
  56. ansible/galaxy/data/network/netconf_plugins/example.py.j2 +1 -2
  57. ansible/galaxy/data/network/terminal_plugins/example.py.j2 +1 -2
  58. ansible/galaxy/dependency_resolution/__init__.py +1 -2
  59. ansible/galaxy/dependency_resolution/dataclasses.py +5 -6
  60. ansible/galaxy/dependency_resolution/errors.py +1 -2
  61. ansible/galaxy/dependency_resolution/providers.py +3 -4
  62. ansible/galaxy/dependency_resolution/reporters.py +2 -3
  63. ansible/galaxy/dependency_resolution/resolvers.py +1 -2
  64. ansible/galaxy/dependency_resolution/versioning.py +1 -2
  65. ansible/galaxy/role.py +12 -15
  66. ansible/galaxy/token.py +1 -2
  67. ansible/galaxy/user_agent.py +1 -2
  68. ansible/inventory/data.py +1 -2
  69. ansible/inventory/group.py +1 -2
  70. ansible/inventory/helpers.py +1 -2
  71. ansible/inventory/host.py +1 -3
  72. ansible/inventory/manager.py +1 -2
  73. ansible/module_utils/_text.py +1 -2
  74. ansible/module_utils/ansible_release.py +3 -5
  75. ansible/module_utils/api.py +1 -2
  76. ansible/module_utils/basic.py +113 -158
  77. ansible/module_utils/common/_collections_compat.py +1 -2
  78. ansible/module_utils/common/_utils.py +1 -3
  79. ansible/module_utils/common/arg_spec.py +1 -2
  80. ansible/module_utils/common/collections.py +1 -2
  81. ansible/module_utils/common/dict_transformations.py +1 -2
  82. ansible/module_utils/common/file.py +10 -5
  83. ansible/module_utils/common/json.py +1 -3
  84. ansible/module_utils/common/locale.py +1 -2
  85. ansible/module_utils/common/network.py +2 -3
  86. ansible/module_utils/common/parameters.py +9 -9
  87. ansible/module_utils/common/process.py +12 -5
  88. ansible/module_utils/common/respawn.py +2 -3
  89. ansible/module_utils/common/sys_info.py +1 -2
  90. ansible/module_utils/common/text/converters.py +1 -2
  91. ansible/module_utils/common/text/formatters.py +1 -2
  92. ansible/module_utils/common/validation.py +5 -6
  93. ansible/module_utils/common/warnings.py +1 -2
  94. ansible/module_utils/common/yaml.py +1 -2
  95. ansible/module_utils/compat/datetime.py +1 -3
  96. ansible/module_utils/compat/importlib.py +21 -13
  97. ansible/module_utils/compat/paramiko.py +1 -2
  98. ansible/module_utils/compat/selectors.py +10 -34
  99. ansible/module_utils/compat/selinux.py +1 -2
  100. ansible/module_utils/compat/typing.py +1 -2
  101. ansible/module_utils/compat/version.py +1 -2
  102. ansible/module_utils/connection.py +1 -2
  103. ansible/module_utils/csharp/Ansible.Basic.cs +20 -3
  104. ansible/module_utils/distro/__init__.py +3 -4
  105. ansible/module_utils/distro/_distro.py +230 -234
  106. ansible/module_utils/errors.py +1 -2
  107. ansible/module_utils/facts/__init__.py +1 -2
  108. ansible/module_utils/facts/ansible_collector.py +1 -2
  109. ansible/module_utils/facts/collector.py +1 -2
  110. ansible/module_utils/facts/compat.py +1 -2
  111. ansible/module_utils/facts/default_collectors.py +1 -2
  112. ansible/module_utils/facts/hardware/aix.py +1 -2
  113. ansible/module_utils/facts/hardware/base.py +1 -2
  114. ansible/module_utils/facts/hardware/darwin.py +1 -2
  115. ansible/module_utils/facts/hardware/dragonfly.py +1 -2
  116. ansible/module_utils/facts/hardware/freebsd.py +1 -2
  117. ansible/module_utils/facts/hardware/hpux.py +1 -2
  118. ansible/module_utils/facts/hardware/hurd.py +1 -2
  119. ansible/module_utils/facts/hardware/linux.py +8 -6
  120. ansible/module_utils/facts/hardware/netbsd.py +1 -2
  121. ansible/module_utils/facts/hardware/openbsd.py +1 -2
  122. ansible/module_utils/facts/hardware/sunos.py +2 -3
  123. ansible/module_utils/facts/namespace.py +1 -2
  124. ansible/module_utils/facts/network/aix.py +1 -2
  125. ansible/module_utils/facts/network/base.py +1 -2
  126. ansible/module_utils/facts/network/darwin.py +1 -2
  127. ansible/module_utils/facts/network/dragonfly.py +1 -2
  128. ansible/module_utils/facts/network/fc_wwn.py +1 -2
  129. ansible/module_utils/facts/network/freebsd.py +1 -2
  130. ansible/module_utils/facts/network/generic_bsd.py +1 -2
  131. ansible/module_utils/facts/network/hpux.py +1 -2
  132. ansible/module_utils/facts/network/hurd.py +1 -2
  133. ansible/module_utils/facts/network/iscsi.py +1 -2
  134. ansible/module_utils/facts/network/linux.py +1 -2
  135. ansible/module_utils/facts/network/netbsd.py +1 -2
  136. ansible/module_utils/facts/network/nvme.py +1 -2
  137. ansible/module_utils/facts/network/openbsd.py +1 -2
  138. ansible/module_utils/facts/network/sunos.py +1 -2
  139. ansible/module_utils/facts/other/facter.py +1 -2
  140. ansible/module_utils/facts/other/ohai.py +1 -2
  141. ansible/module_utils/facts/packages.py +1 -2
  142. ansible/module_utils/facts/sysctl.py +1 -2
  143. ansible/module_utils/facts/system/apparmor.py +1 -2
  144. ansible/module_utils/facts/system/caps.py +1 -2
  145. ansible/module_utils/facts/system/chroot.py +1 -2
  146. ansible/module_utils/facts/system/cmdline.py +1 -2
  147. ansible/module_utils/facts/system/date_time.py +1 -2
  148. ansible/module_utils/facts/system/distribution.py +4 -5
  149. ansible/module_utils/facts/system/dns.py +1 -2
  150. ansible/module_utils/facts/system/env.py +1 -2
  151. ansible/module_utils/facts/system/fips.py +1 -2
  152. ansible/module_utils/facts/system/loadavg.py +1 -2
  153. ansible/module_utils/facts/system/local.py +1 -2
  154. ansible/module_utils/facts/system/lsb.py +1 -2
  155. ansible/module_utils/facts/system/pkg_mgr.py +7 -30
  156. ansible/module_utils/facts/system/platform.py +1 -2
  157. ansible/module_utils/facts/system/python.py +1 -2
  158. ansible/module_utils/facts/system/selinux.py +1 -2
  159. ansible/module_utils/facts/system/service_mgr.py +1 -2
  160. ansible/module_utils/facts/system/ssh_pub_keys.py +1 -2
  161. ansible/module_utils/facts/system/user.py +1 -2
  162. ansible/module_utils/facts/timeout.py +1 -2
  163. ansible/module_utils/facts/utils.py +1 -2
  164. ansible/module_utils/facts/virtual/base.py +1 -2
  165. ansible/module_utils/facts/virtual/dragonfly.py +1 -2
  166. ansible/module_utils/facts/virtual/freebsd.py +1 -2
  167. ansible/module_utils/facts/virtual/hpux.py +1 -2
  168. ansible/module_utils/facts/virtual/linux.py +1 -2
  169. ansible/module_utils/facts/virtual/netbsd.py +1 -2
  170. ansible/module_utils/facts/virtual/openbsd.py +1 -2
  171. ansible/module_utils/facts/virtual/sunos.py +1 -2
  172. ansible/module_utils/facts/virtual/sysctl.py +1 -2
  173. ansible/module_utils/json_utils.py +1 -2
  174. ansible/module_utils/parsing/convert_bool.py +1 -2
  175. ansible/module_utils/powershell/Ansible.ModuleUtils.Legacy.psm1 +5 -2
  176. ansible/module_utils/powershell/Ansible.ModuleUtils.WebRequest.psm1 +1 -1
  177. ansible/module_utils/pycompat24.py +24 -4
  178. ansible/module_utils/service.py +31 -5
  179. ansible/module_utils/six/__init__.py +1 -1
  180. ansible/module_utils/splitter.py +1 -2
  181. ansible/module_utils/urls.py +335 -1052
  182. ansible/module_utils/yumdnf.py +13 -35
  183. ansible/modules/add_host.py +1 -2
  184. ansible/modules/apt.py +38 -22
  185. ansible/modules/apt_key.py +1 -2
  186. ansible/modules/apt_repository.py +18 -10
  187. ansible/modules/assemble.py +1 -2
  188. ansible/modules/assert.py +8 -4
  189. ansible/modules/async_status.py +17 -14
  190. ansible/modules/async_wrapper.py +11 -9
  191. ansible/modules/blockinfile.py +2 -3
  192. ansible/modules/command.py +1 -2
  193. ansible/modules/copy.py +4 -76
  194. ansible/modules/cron.py +3 -3
  195. ansible/modules/deb822_repository.py +5 -5
  196. ansible/modules/debconf.py +19 -8
  197. ansible/modules/debug.py +1 -2
  198. ansible/modules/dnf.py +59 -186
  199. ansible/modules/dnf5.py +57 -43
  200. ansible/modules/dpkg_selections.py +1 -2
  201. ansible/modules/expect.py +23 -15
  202. ansible/modules/fail.py +1 -2
  203. ansible/modules/fetch.py +1 -2
  204. ansible/modules/file.py +4 -3
  205. ansible/modules/find.py +18 -5
  206. ansible/modules/gather_facts.py +1 -2
  207. ansible/modules/get_url.py +2 -3
  208. ansible/modules/getent.py +2 -3
  209. ansible/modules/git.py +28 -17
  210. ansible/modules/group.py +1 -2
  211. ansible/modules/group_by.py +1 -2
  212. ansible/modules/hostname.py +2 -19
  213. ansible/modules/import_playbook.py +1 -2
  214. ansible/modules/import_role.py +9 -2
  215. ansible/modules/import_tasks.py +1 -2
  216. ansible/modules/include_role.py +1 -2
  217. ansible/modules/include_tasks.py +1 -2
  218. ansible/modules/include_vars.py +1 -2
  219. ansible/modules/iptables.py +38 -21
  220. ansible/modules/known_hosts.py +15 -8
  221. ansible/modules/lineinfile.py +1 -6
  222. ansible/modules/meta.py +3 -2
  223. ansible/modules/package.py +6 -5
  224. ansible/modules/package_facts.py +1 -2
  225. ansible/modules/pause.py +2 -3
  226. ansible/modules/ping.py +1 -2
  227. ansible/modules/pip.py +40 -20
  228. ansible/modules/raw.py +1 -2
  229. ansible/modules/reboot.py +1 -2
  230. ansible/modules/replace.py +7 -5
  231. ansible/modules/rpm_key.py +1 -2
  232. ansible/modules/script.py +1 -2
  233. ansible/modules/service.py +3 -21
  234. ansible/modules/service_facts.py +3 -12
  235. ansible/modules/set_fact.py +1 -2
  236. ansible/modules/set_stats.py +1 -2
  237. ansible/modules/setup.py +1 -2
  238. ansible/modules/shell.py +1 -2
  239. ansible/modules/slurp.py +1 -2
  240. ansible/modules/stat.py +1 -2
  241. ansible/modules/subversion.py +2 -3
  242. ansible/modules/systemd.py +12 -9
  243. ansible/modules/systemd_service.py +12 -9
  244. ansible/modules/sysvinit.py +7 -2
  245. ansible/modules/tempfile.py +7 -2
  246. ansible/modules/template.py +2 -3
  247. ansible/modules/unarchive.py +13 -3
  248. ansible/modules/uri.py +5 -8
  249. ansible/modules/user.py +11 -10
  250. ansible/modules/validate_argument_spec.py +15 -16
  251. ansible/modules/wait_for.py +1 -2
  252. ansible/modules/wait_for_connection.py +1 -2
  253. ansible/modules/yum_repository.py +2 -3
  254. ansible/parsing/__init__.py +1 -3
  255. ansible/parsing/ajson.py +1 -3
  256. ansible/parsing/dataloader.py +23 -12
  257. ansible/parsing/mod_args.py +14 -8
  258. ansible/parsing/plugin_docs.py +1 -2
  259. ansible/parsing/quoting.py +1 -3
  260. ansible/parsing/splitter.py +1 -3
  261. ansible/parsing/utils/__init__.py +1 -3
  262. ansible/parsing/utils/addresses.py +1 -3
  263. ansible/parsing/utils/jsonify.py +1 -3
  264. ansible/parsing/utils/yaml.py +1 -3
  265. ansible/parsing/vault/__init__.py +6 -8
  266. ansible/parsing/yaml/__init__.py +1 -3
  267. ansible/parsing/yaml/constructor.py +1 -3
  268. ansible/parsing/yaml/dumper.py +1 -3
  269. ansible/parsing/yaml/loader.py +1 -3
  270. ansible/parsing/yaml/objects.py +1 -3
  271. ansible/playbook/__init__.py +1 -3
  272. ansible/playbook/attribute.py +1 -3
  273. ansible/playbook/base.py +2 -3
  274. ansible/playbook/block.py +1 -3
  275. ansible/playbook/collectionsearch.py +1 -2
  276. ansible/playbook/conditional.py +1 -3
  277. ansible/playbook/delegatable.py +1 -0
  278. ansible/playbook/handler.py +2 -4
  279. ansible/playbook/handler_task_include.py +1 -3
  280. ansible/playbook/helpers.py +1 -4
  281. ansible/playbook/included_file.py +4 -4
  282. ansible/playbook/loop_control.py +1 -3
  283. ansible/playbook/notifiable.py +1 -0
  284. ansible/playbook/play.py +1 -3
  285. ansible/playbook/play_context.py +1 -3
  286. ansible/playbook/playbook_include.py +1 -3
  287. ansible/playbook/role/__init__.py +1 -3
  288. ansible/playbook/role/definition.py +1 -3
  289. ansible/playbook/role/include.py +1 -3
  290. ansible/playbook/role/metadata.py +1 -3
  291. ansible/playbook/role/requirement.py +1 -3
  292. ansible/playbook/role_include.py +2 -10
  293. ansible/playbook/taggable.py +1 -3
  294. ansible/playbook/task.py +2 -4
  295. ansible/playbook/task_include.py +1 -3
  296. ansible/plugins/__init__.py +4 -5
  297. ansible/plugins/action/__init__.py +20 -14
  298. ansible/plugins/action/add_host.py +2 -4
  299. ansible/plugins/action/assemble.py +2 -3
  300. ansible/plugins/action/assert.py +1 -2
  301. ansible/plugins/action/async_status.py +1 -2
  302. ansible/plugins/action/command.py +1 -2
  303. ansible/plugins/action/copy.py +12 -9
  304. ansible/plugins/action/debug.py +1 -2
  305. ansible/plugins/action/dnf.py +4 -4
  306. ansible/plugins/action/fail.py +1 -2
  307. ansible/plugins/action/fetch.py +2 -3
  308. ansible/plugins/action/gather_facts.py +3 -4
  309. ansible/plugins/action/group_by.py +1 -2
  310. ansible/plugins/action/include_vars.py +1 -2
  311. ansible/plugins/action/normal.py +1 -2
  312. ansible/plugins/action/package.py +36 -21
  313. ansible/plugins/action/pause.py +1 -2
  314. ansible/plugins/action/raw.py +2 -3
  315. ansible/plugins/action/reboot.py +30 -15
  316. ansible/plugins/action/script.py +3 -4
  317. ansible/plugins/action/service.py +1 -2
  318. ansible/plugins/action/set_fact.py +1 -2
  319. ansible/plugins/action/set_stats.py +1 -2
  320. ansible/plugins/action/shell.py +1 -2
  321. ansible/plugins/action/template.py +1 -2
  322. ansible/plugins/action/unarchive.py +1 -2
  323. ansible/plugins/action/uri.py +2 -3
  324. ansible/plugins/action/validate_argument_spec.py +1 -2
  325. ansible/plugins/action/wait_for_connection.py +2 -3
  326. ansible/plugins/become/__init__.py +1 -2
  327. ansible/plugins/become/runas.py +1 -2
  328. ansible/plugins/become/su.py +1 -2
  329. ansible/plugins/become/sudo.py +1 -2
  330. ansible/plugins/cache/__init__.py +3 -3
  331. ansible/plugins/cache/base.py +1 -2
  332. ansible/plugins/cache/jsonfile.py +1 -3
  333. ansible/plugins/cache/memory.py +1 -2
  334. ansible/plugins/callback/__init__.py +2 -4
  335. ansible/plugins/callback/default.py +2 -3
  336. ansible/plugins/callback/junit.py +1 -2
  337. ansible/plugins/callback/minimal.py +1 -3
  338. ansible/plugins/callback/oneline.py +1 -3
  339. ansible/plugins/callback/tree.py +1 -2
  340. ansible/plugins/cliconf/__init__.py +1 -2
  341. ansible/plugins/connection/__init__.py +4 -5
  342. ansible/plugins/connection/local.py +3 -4
  343. ansible/plugins/connection/paramiko_ssh.py +1 -2
  344. ansible/plugins/connection/psrp.py +1 -2
  345. ansible/plugins/connection/ssh.py +18 -54
  346. ansible/plugins/connection/winrm.py +3 -4
  347. ansible/plugins/doc_fragments/action_common_attributes.py +2 -3
  348. ansible/plugins/doc_fragments/action_core.py +3 -4
  349. ansible/plugins/doc_fragments/backup.py +1 -2
  350. ansible/plugins/doc_fragments/connection_pipelining.py +1 -2
  351. ansible/plugins/doc_fragments/constructed.py +1 -2
  352. ansible/plugins/doc_fragments/decrypt.py +2 -3
  353. ansible/plugins/doc_fragments/default_callback.py +1 -2
  354. ansible/plugins/doc_fragments/files.py +1 -2
  355. ansible/plugins/doc_fragments/inventory_cache.py +1 -2
  356. ansible/plugins/doc_fragments/result_format_callback.py +1 -2
  357. ansible/plugins/doc_fragments/return_common.py +1 -2
  358. ansible/plugins/doc_fragments/shell_common.py +1 -2
  359. ansible/plugins/doc_fragments/shell_windows.py +1 -2
  360. ansible/plugins/doc_fragments/template_common.py +1 -2
  361. ansible/plugins/doc_fragments/url.py +1 -2
  362. ansible/plugins/doc_fragments/url_windows.py +1 -2
  363. ansible/plugins/doc_fragments/validate.py +1 -2
  364. ansible/plugins/doc_fragments/vars_plugin_staging.py +1 -2
  365. ansible/plugins/filter/__init__.py +1 -2
  366. ansible/plugins/filter/b64decode.yml +8 -8
  367. ansible/plugins/filter/b64encode.yml +4 -4
  368. ansible/plugins/filter/comment.yml +1 -1
  369. ansible/plugins/filter/core.py +11 -9
  370. ansible/plugins/filter/encryption.py +1 -3
  371. ansible/plugins/filter/extract.yml +1 -1
  372. ansible/plugins/filter/from_yaml_all.yml +1 -1
  373. ansible/plugins/filter/human_readable.yml +3 -3
  374. ansible/plugins/filter/human_to_bytes.yml +2 -2
  375. ansible/plugins/filter/mandatory.yml +1 -1
  376. ansible/plugins/filter/mathstuff.py +2 -2
  377. ansible/plugins/filter/password_hash.yml +3 -2
  378. ansible/plugins/filter/regex_replace.yml +15 -0
  379. ansible/plugins/filter/regex_search.yml +12 -0
  380. ansible/plugins/filter/strftime.yml +2 -9
  381. ansible/plugins/filter/to_datetime.yml +17 -2
  382. ansible/plugins/filter/to_nice_json.yml +4 -0
  383. ansible/plugins/filter/union.yml +1 -1
  384. ansible/plugins/filter/urls.py +1 -2
  385. ansible/plugins/filter/urlsplit.py +1 -2
  386. ansible/plugins/filter/zip.yml +2 -2
  387. ansible/plugins/filter/zip_longest.yml +1 -1
  388. ansible/plugins/httpapi/__init__.py +1 -2
  389. ansible/plugins/inventory/__init__.py +2 -4
  390. ansible/plugins/inventory/advanced_host_list.py +1 -2
  391. ansible/plugins/inventory/auto.py +2 -3
  392. ansible/plugins/inventory/constructed.py +3 -2
  393. ansible/plugins/inventory/generator.py +1 -2
  394. ansible/plugins/inventory/host_list.py +1 -2
  395. ansible/plugins/inventory/ini.py +1 -2
  396. ansible/plugins/inventory/script.py +122 -3
  397. ansible/plugins/inventory/toml.py +1 -2
  398. ansible/plugins/inventory/yaml.py +3 -4
  399. ansible/plugins/list.py +2 -3
  400. ansible/plugins/loader.py +10 -11
  401. ansible/plugins/lookup/__init__.py +1 -3
  402. ansible/plugins/lookup/config.py +19 -15
  403. ansible/plugins/lookup/csvfile.py +16 -7
  404. ansible/plugins/lookup/dict.py +2 -3
  405. ansible/plugins/lookup/env.py +4 -4
  406. ansible/plugins/lookup/file.py +1 -2
  407. ansible/plugins/lookup/fileglob.py +1 -2
  408. ansible/plugins/lookup/first_found.py +8 -7
  409. ansible/plugins/lookup/indexed_items.py +1 -2
  410. ansible/plugins/lookup/ini.py +6 -3
  411. ansible/plugins/lookup/inventory_hostnames.py +1 -2
  412. ansible/plugins/lookup/items.py +1 -2
  413. ansible/plugins/lookup/lines.py +1 -2
  414. ansible/plugins/lookup/list.py +1 -3
  415. ansible/plugins/lookup/nested.py +1 -2
  416. ansible/plugins/lookup/password.py +16 -14
  417. ansible/plugins/lookup/pipe.py +1 -2
  418. ansible/plugins/lookup/random_choice.py +1 -2
  419. ansible/plugins/lookup/sequence.py +21 -52
  420. ansible/plugins/lookup/subelements.py +1 -2
  421. ansible/plugins/lookup/template.py +1 -2
  422. ansible/plugins/lookup/together.py +1 -2
  423. ansible/plugins/lookup/unvault.py +1 -2
  424. ansible/plugins/lookup/url.py +9 -3
  425. ansible/plugins/lookup/varnames.py +1 -2
  426. ansible/plugins/lookup/vars.py +1 -2
  427. ansible/plugins/netconf/__init__.py +1 -2
  428. ansible/plugins/shell/__init__.py +3 -4
  429. ansible/plugins/shell/cmd.py +1 -2
  430. ansible/plugins/shell/powershell.py +1 -2
  431. ansible/plugins/shell/sh.py +1 -2
  432. ansible/plugins/strategy/__init__.py +33 -21
  433. ansible/plugins/strategy/debug.py +1 -2
  434. ansible/plugins/strategy/free.py +17 -7
  435. ansible/plugins/strategy/host_pinned.py +1 -3
  436. ansible/plugins/strategy/linear.py +22 -22
  437. ansible/plugins/terminal/__init__.py +2 -3
  438. ansible/plugins/test/__init__.py +1 -2
  439. ansible/plugins/test/change.yml +1 -1
  440. ansible/plugins/test/changed.yml +1 -1
  441. ansible/plugins/test/contains.yml +1 -1
  442. ansible/plugins/test/core.py +2 -4
  443. ansible/plugins/test/exists.yml +1 -1
  444. ansible/plugins/test/failed.yml +1 -1
  445. ansible/plugins/test/failure.yml +1 -1
  446. ansible/plugins/test/files.py +1 -3
  447. ansible/plugins/test/finished.yml +3 -3
  448. ansible/plugins/test/issuperset.yml +1 -1
  449. ansible/plugins/test/match.yml +1 -1
  450. ansible/plugins/test/mathstuff.py +1 -2
  451. ansible/plugins/test/reachable.yml +1 -1
  452. ansible/plugins/test/regex.yml +1 -1
  453. ansible/plugins/test/search.yml +1 -1
  454. ansible/plugins/test/skip.yml +1 -1
  455. ansible/plugins/test/skipped.yml +1 -1
  456. ansible/plugins/test/started.yml +1 -1
  457. ansible/plugins/test/succeeded.yml +1 -1
  458. ansible/plugins/test/success.yml +1 -1
  459. ansible/plugins/test/successful.yml +1 -1
  460. ansible/plugins/test/superset.yml +1 -1
  461. ansible/plugins/test/unreachable.yml +1 -1
  462. ansible/plugins/test/uri.py +1 -3
  463. ansible/plugins/vars/__init__.py +1 -2
  464. ansible/plugins/vars/host_group_vars.py +2 -3
  465. ansible/release.py +3 -5
  466. ansible/template/__init__.py +24 -37
  467. ansible/template/native_helpers.py +1 -3
  468. ansible/template/template.py +1 -3
  469. ansible/template/vars.py +1 -0
  470. ansible/utils/__init__.py +1 -3
  471. ansible/utils/cmd_functions.py +1 -2
  472. ansible/utils/collection_loader/__init__.py +1 -2
  473. ansible/utils/collection_loader/_collection_config.py +1 -2
  474. ansible/utils/collection_loader/_collection_finder.py +1 -2
  475. ansible/utils/collection_loader/_collection_meta.py +1 -2
  476. ansible/utils/color.py +1 -2
  477. ansible/utils/context_objects.py +1 -4
  478. ansible/utils/display.py +88 -30
  479. ansible/utils/encrypt.py +4 -105
  480. ansible/utils/fqcn.py +1 -2
  481. ansible/utils/galaxy.py +1 -3
  482. ansible/utils/hashing.py +1 -3
  483. ansible/utils/helpers.py +1 -3
  484. ansible/utils/jsonrpc.py +1 -2
  485. ansible/utils/listify.py +1 -3
  486. ansible/utils/lock.py +1 -3
  487. ansible/utils/multiprocessing.py +1 -3
  488. ansible/utils/native_jinja.py +1 -3
  489. ansible/utils/path.py +1 -2
  490. ansible/utils/plugin_docs.py +7 -6
  491. ansible/utils/py3compat.py +17 -55
  492. ansible/utils/sentinel.py +1 -3
  493. ansible/utils/shlex.py +1 -3
  494. ansible/utils/singleton.py +1 -3
  495. ansible/utils/ssh_functions.py +1 -3
  496. ansible/utils/unicode.py +1 -3
  497. ansible/utils/unsafe_proxy.py +1 -2
  498. ansible/utils/vars.py +6 -8
  499. ansible/utils/version.py +1 -3
  500. ansible/vars/clean.py +1 -3
  501. ansible/vars/fact_cache.py +1 -2
  502. ansible/vars/hostvars.py +3 -7
  503. ansible/vars/manager.py +24 -6
  504. ansible/vars/reserved.py +1 -3
  505. {ansible_core-2.16.6.data → ansible_core-2.17.0rc1.data}/scripts/ansible-test +1 -2
  506. {ansible_core-2.16.6.dist-info → ansible_core-2.17.0rc1.dist-info}/METADATA +3 -3
  507. ansible_core-2.17.0rc1.dist-info/RECORD +987 -0
  508. ansible_test/__init__.py +1 -2
  509. ansible_test/_data/completion/docker.txt +7 -9
  510. ansible_test/_data/completion/remote.txt +6 -7
  511. ansible_test/_data/requirements/ansible-test.txt +0 -2
  512. ansible_test/_data/requirements/constraints.txt +1 -6
  513. ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
  514. ansible_test/_data/requirements/sanity.changelog.txt +3 -3
  515. ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
  516. ansible_test/_data/requirements/sanity.mypy.txt +12 -12
  517. ansible_test/_data/requirements/sanity.pep8.txt +1 -1
  518. ansible_test/_data/requirements/sanity.pylint.txt +7 -7
  519. ansible_test/_data/requirements/sanity.runtime-metadata.txt +1 -1
  520. ansible_test/_data/requirements/sanity.validate-modules.txt +3 -3
  521. ansible_test/_data/requirements/sanity.yamllint.txt +2 -2
  522. ansible_test/_internal/bootstrap.py +2 -2
  523. ansible_test/_internal/classification/__init__.py +0 -5
  524. ansible_test/_internal/commands/integration/cloud/cs.py +1 -1
  525. ansible_test/_internal/commands/integration/cloud/nios.py +1 -1
  526. ansible_test/_internal/commands/sanity/__init__.py +1 -27
  527. ansible_test/_internal/commands/sanity/import.py +0 -18
  528. ansible_test/_internal/commands/sanity/mypy.py +7 -10
  529. ansible_test/_internal/commands/units/__init__.py +1 -1
  530. ansible_test/_internal/config.py +0 -1
  531. ansible_test/_internal/content_config.py +0 -5
  532. ansible_test/_internal/coverage_util.py +0 -1
  533. ansible_test/_internal/docker_util.py +1 -1
  534. ansible_test/_internal/host_profiles.py +5 -4
  535. ansible_test/_internal/python_requirements.py +1 -119
  536. ansible_test/_internal/ssh.py +1 -0
  537. ansible_test/_internal/util.py +1 -1
  538. ansible_test/_internal/util_common.py +1 -1
  539. ansible_test/_internal/venv.py +10 -108
  540. ansible_test/_util/__init__.py +1 -2
  541. ansible_test/_util/controller/sanity/mypy/ansible-core.ini +0 -6
  542. ansible_test/_util/controller/sanity/mypy/modules.ini +0 -6
  543. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +0 -1
  544. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +0 -1
  545. ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +0 -1
  546. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +0 -1
  547. ansible_test/_util/controller/sanity/pylint/config/default.cfg +0 -1
  548. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +1 -2
  549. ansible_test/_util/controller/sanity/shellcheck/exclude.txt +0 -1
  550. ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +31 -59
  551. ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +0 -7
  552. ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +10 -2
  553. ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -1
  554. ansible_test/_util/controller/sanity/yamllint/yamllinter.py +16 -4
  555. ansible_test/_util/target/__init__.py +1 -2
  556. ansible_test/_util/target/cli/ansible_test_cli_stub.py +1 -2
  557. ansible_test/_util/target/common/constants.py +1 -4
  558. ansible_test/_util/target/injector/python.py +4 -19
  559. ansible_test/_util/target/pytest/plugins/ansible_forked.py +2 -9
  560. ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +1 -5
  561. ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -2
  562. ansible_test/_util/target/sanity/compile/compile.py +3 -12
  563. ansible_test/_util/target/sanity/import/importer.py +1 -12
  564. ansible_test/_util/target/setup/bootstrap.sh +49 -105
  565. ansible_test/_util/target/setup/probe_cgroups.py +1 -2
  566. ansible_test/_util/target/setup/quiet_pip.py +1 -16
  567. ansible_test/_util/target/setup/requirements.py +9 -2
  568. ansible_test/_util/target/tools/virtualenvcheck.py +1 -2
  569. ansible_test/_util/target/tools/yamlcheck.py +1 -2
  570. ansible/module_utils/common/_json_compat.py +0 -16
  571. ansible/module_utils/compat/_selectors2.py +0 -655
  572. ansible/modules/yum.py +0 -1821
  573. ansible/plugins/action/yum.py +0 -111
  574. ansible_core-2.16.6.dist-info/RECORD +0 -1009
  575. ansible_test/_util/controller/sanity/code-smell/future-import-boilerplate.json +0 -7
  576. ansible_test/_util/controller/sanity/code-smell/future-import-boilerplate.py +0 -46
  577. ansible_test/_util/controller/sanity/code-smell/metaclass-boilerplate.json +0 -7
  578. ansible_test/_util/controller/sanity/code-smell/metaclass-boilerplate.py +0 -44
  579. ansible_test/_util/controller/sanity/code-smell/no-basestring.json +0 -7
  580. ansible_test/_util/controller/sanity/code-smell/no-basestring.py +0 -21
  581. ansible_test/_util/controller/sanity/code-smell/no-dict-iteritems.json +0 -7
  582. ansible_test/_util/controller/sanity/code-smell/no-dict-iteritems.py +0 -21
  583. ansible_test/_util/controller/sanity/code-smell/no-dict-iterkeys.json +0 -7
  584. ansible_test/_util/controller/sanity/code-smell/no-dict-iterkeys.py +0 -21
  585. ansible_test/_util/controller/sanity/code-smell/no-dict-itervalues.json +0 -7
  586. ansible_test/_util/controller/sanity/code-smell/no-dict-itervalues.py +0 -21
  587. ansible_test/_util/controller/sanity/code-smell/no-main-display.json +0 -10
  588. ansible_test/_util/controller/sanity/code-smell/no-main-display.py +0 -21
  589. ansible_test/_util/controller/sanity/code-smell/no-unicode-literals.json +0 -7
  590. ansible_test/_util/controller/sanity/code-smell/no-unicode-literals.py +0 -21
  591. ansible_test/_util/controller/tools/sslcheck.py +0 -22
  592. ansible_test/_util/target/common/__init__.py +0 -2
  593. {ansible_core-2.16.6.dist-info → ansible_core-2.17.0rc1.dist-info}/COPYING +0 -0
  594. {ansible_core-2.16.6.dist-info → ansible_core-2.17.0rc1.dist-info}/WHEEL +0 -0
  595. {ansible_core-2.16.6.dist-info → ansible_core-2.17.0rc1.dist-info}/entry_points.txt +0 -0
  596. {ansible_core-2.16.6.dist-info → ansible_core-2.17.0rc1.dist-info}/top_level.txt +0 -0
@@ -2,8 +2,7 @@
2
2
 
3
3
  # Copyright: (c) 2014, Matt Martz <matt@sivel.net>
4
4
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
5
- from __future__ import (absolute_import, division, print_function)
6
- __metaclass__ = type
5
+ from __future__ import annotations
7
6
 
8
7
 
9
8
  class ModuleDocFragment(object):
@@ -2,8 +2,7 @@
2
2
 
3
3
  # Copyright: (c) 2017, Ansible Project
4
4
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
5
- from __future__ import (absolute_import, division, print_function)
6
- __metaclass__ = type
5
+ from __future__ import annotations
7
6
 
8
7
 
9
8
  class ModuleDocFragment(object):
@@ -2,8 +2,7 @@
2
2
 
3
3
  # Copyright: (c) 2017, Ansible Project
4
4
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
5
- from __future__ import (absolute_import, division, print_function)
6
- __metaclass__ = type
5
+ from __future__ import annotations
7
6
 
8
7
 
9
8
  class ModuleDocFragment(object):
@@ -2,8 +2,7 @@
2
2
 
3
3
  # Copyright: (c) 2016, Ansible, Inc
4
4
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
5
- from __future__ import (absolute_import, division, print_function)
6
- __metaclass__ = type
5
+ from __future__ import annotations
7
6
 
8
7
 
9
8
  class ModuleDocFragment(object):
@@ -1,7 +1,6 @@
1
1
  # Copyright (c) 2017 Ansible Project
2
2
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
3
- from __future__ import (absolute_import, division, print_function)
4
- __metaclass__ = type
3
+ from __future__ import annotations
5
4
 
6
5
 
7
6
  class ModuleDocFragment(object):
@@ -1,7 +1,6 @@
1
1
  # Copyright (c) 2019 Ansible Project
2
2
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
3
- from __future__ import (absolute_import, division, print_function)
4
- __metaclass__ = type
3
+ from __future__ import annotations
5
4
 
6
5
 
7
6
  class ModuleDocFragment(object):
@@ -3,8 +3,7 @@
3
3
  # Copyright (c) 2019 Ansible Project
4
4
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
5
5
 
6
- from __future__ import (absolute_import, division, print_function)
7
- __metaclass__ = type
6
+ from __future__ import annotations
8
7
 
9
8
 
10
9
  class ModuleDocFragment(object):
@@ -2,8 +2,7 @@
2
2
 
3
3
  # Copyright: (c) 2018, John Barker <gundalow@redhat.com>
4
4
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
5
- from __future__ import (absolute_import, division, print_function)
6
- __metaclass__ = type
5
+ from __future__ import annotations
7
6
 
8
7
 
9
8
  class ModuleDocFragment(object):
@@ -3,8 +3,7 @@
3
3
  # Copyright (c) 2019 Ansible Project
4
4
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
5
5
 
6
- from __future__ import (absolute_import, division, print_function)
7
- __metaclass__ = type
6
+ from __future__ import annotations
8
7
 
9
8
 
10
9
  class ModuleDocFragment:
@@ -2,8 +2,7 @@
2
2
 
3
3
  # Copyright: (c) 2015, Ansible, Inc
4
4
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
5
- from __future__ import (absolute_import, division, print_function)
6
- __metaclass__ = type
5
+ from __future__ import annotations
7
6
 
8
7
 
9
8
  class ModuleDocFragment(object):
@@ -3,8 +3,7 @@
3
3
  # Copyright: (c) 2019, Ansible Project
4
4
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
5
5
 
6
- from __future__ import absolute_import, division, print_function
7
- __metaclass__ = type
6
+ from __future__ import annotations
8
7
 
9
8
 
10
9
  class ModuleDocFragment(object):
@@ -1,8 +1,7 @@
1
1
  # (c) Ansible Project
2
2
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
3
3
 
4
- from __future__ import (absolute_import, division, print_function)
5
- __metaclass__ = type
4
+ from __future__ import annotations
6
5
 
7
6
  from ansible import constants as C
8
7
  from ansible.plugins import AnsibleJinja2Plugin
@@ -2,28 +2,28 @@ DOCUMENTATION:
2
2
  name: b64decode
3
3
  author: ansible core team
4
4
  version_added: 'historical'
5
- short_description: Decode a base64 string
5
+ short_description: Decode a Base64 string
6
6
  description:
7
7
  - Base64 decoding function.
8
8
  - The return value is a string.
9
- - Trying to store a binary blob in a string most likely corrupts the binary. To base64 decode a binary blob,
10
- use the ``base64`` command and pipe the encoded data through standard input.
11
- For example, in the ansible.builtin.shell`` module, ``cmd="base64 --decode > myfile.bin" stdin="{{ encoded }}"``.
9
+ - Trying to store a binary blob in a string most likely corrupts the binary. To Base64 decode a binary blob,
10
+ use the I(base64) command and pipe the encoded data through standard input.
11
+ For example, in the M(ansible.builtin.shell) module, ``cmd="base64 --decode > myfile.bin" stdin="{{ encoded }}"``.
12
12
  positional: _input
13
13
  options:
14
14
  _input:
15
- description: A base64 string to decode.
15
+ description: A Base64 string to decode.
16
16
  type: string
17
17
  required: true
18
18
 
19
19
  EXAMPLES: |
20
- # b64 decode a string
20
+ # Base64 decode a string
21
21
  lola: "{{ 'bG9sYQ==' | b64decode }}"
22
22
 
23
- # b64 decode the content of 'b64stuff' variable
23
+ # Base64 decode the content of 'b64stuff' variable
24
24
  stuff: "{{ b64stuff | b64decode }}"
25
25
 
26
26
  RETURN:
27
27
  _value:
28
- description: The contents of the base64 encoded string.
28
+ description: The contents of the Base64 encoded string.
29
29
  type: string
@@ -2,7 +2,7 @@ DOCUMENTATION:
2
2
  name: b64encode
3
3
  author: ansible core team
4
4
  version_added: 'historical'
5
- short_description: Encode a string as base64
5
+ short_description: Encode a string as Base64
6
6
  description:
7
7
  - Base64 encoding function.
8
8
  positional: _input
@@ -13,13 +13,13 @@ DOCUMENTATION:
13
13
  required: true
14
14
 
15
15
  EXAMPLES: |
16
- # b64 encode a string
16
+ # Base64 encode a string
17
17
  b64lola: "{{ 'lola'| b64encode }}"
18
18
 
19
- # b64 encode the content of 'stuff' variable
19
+ # Base64 encode the content of 'stuff' variable
20
20
  b64stuff: "{{ stuff | b64encode }}"
21
21
 
22
22
  RETURN:
23
23
  _value:
24
- description: A base64 encoded string.
24
+ description: A Base64 encoded string.
25
25
  type: string
@@ -18,7 +18,7 @@ DOCUMENTATION:
18
18
  decoration:
19
19
  description: Indicator for comment or intermediate comment depending on the style.
20
20
  type: string
21
- begining:
21
+ beginning:
22
22
  description: Indicator of the start of a comment block, only available for styles that support multiline comments.
23
23
  type: string
24
24
  end:
@@ -1,9 +1,7 @@
1
1
  # (c) 2012, Jeroen Hoekx <jeroen@hoekx.be>
2
2
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
3
3
 
4
- # Make coding more python3-ish
5
- from __future__ import (absolute_import, division, print_function)
6
- __metaclass__ = type
4
+ from __future__ import annotations
7
5
 
8
6
  import base64
9
7
  import glob
@@ -46,7 +44,7 @@ UUID_NAMESPACE_ANSIBLE = uuid.UUID('361E6D51-FAEC-444A-9079-341386DA8E2E')
46
44
 
47
45
 
48
46
  def to_yaml(a, *args, **kw):
49
- '''Make verbose, human readable yaml'''
47
+ '''Make verbose, human-readable yaml'''
50
48
  default_flow_style = kw.pop('default_flow_style', None)
51
49
  try:
52
50
  transformed = yaml.dump(a, Dumper=AnsibleDumper, allow_unicode=True, default_flow_style=default_flow_style, **kw)
@@ -56,7 +54,7 @@ def to_yaml(a, *args, **kw):
56
54
 
57
55
 
58
56
  def to_nice_yaml(a, indent=4, *args, **kw):
59
- '''Make verbose, human readable yaml'''
57
+ '''Make verbose, human-readable yaml'''
60
58
  try:
61
59
  transformed = yaml.dump(a, Dumper=AnsibleDumper, indent=indent, allow_unicode=True, default_flow_style=False, **kw)
62
60
  except Exception as e:
@@ -77,7 +75,7 @@ def to_json(a, *args, **kw):
77
75
 
78
76
 
79
77
  def to_nice_json(a, indent=4, sort_keys=True, *args, **kw):
80
- '''Make verbose, human readable JSON'''
78
+ '''Make verbose, human-readable JSON'''
81
79
  return to_json(a, indent=indent, sort_keys=sort_keys, separators=(',', ': '), *args, **kw)
82
80
 
83
81
 
@@ -122,7 +120,7 @@ def fileglob(pathname):
122
120
  return [g for g in glob.glob(pathname) if os.path.isfile(g)]
123
121
 
124
122
 
125
- def regex_replace(value='', pattern='', replacement='', ignorecase=False, multiline=False):
123
+ def regex_replace(value='', pattern='', replacement='', ignorecase=False, multiline=False, count=0, mandatory_count=0):
126
124
  ''' Perform a `re.sub` returning a string '''
127
125
 
128
126
  value = to_text(value, errors='surrogate_or_strict', nonstring='simplerepr')
@@ -133,7 +131,11 @@ def regex_replace(value='', pattern='', replacement='', ignorecase=False, multil
133
131
  if multiline:
134
132
  flags |= re.M
135
133
  _re = re.compile(pattern, flags=flags)
136
- return _re.sub(replacement, value)
134
+ (output, subs) = _re.subn(replacement, value, count=count)
135
+ if mandatory_count and mandatory_count != subs:
136
+ raise AnsibleFilterError("'%s' should match %d times, but matches %d times in '%s'"
137
+ % (pattern, mandatory_count, count, value))
138
+ return output
137
139
 
138
140
 
139
141
  def regex_findall(value, regex, multiline=False, ignorecase=False):
@@ -595,7 +597,7 @@ def commonpath(paths):
595
597
  :rtype: str
596
598
  """
597
599
  if not is_sequence(paths):
598
- raise AnsibleFilterTypeError("|path_join expects sequence, got %s instead." % type(paths))
600
+ raise AnsibleFilterTypeError("|commonpath expects sequence, got %s instead." % type(paths))
599
601
 
600
602
  return os.path.commonpath(paths)
601
603
 
@@ -1,8 +1,6 @@
1
1
  # Copyright: (c) 2021, Ansible Project
2
2
 
3
- # Make coding more python3-ish
4
- from __future__ import (absolute_import, division, print_function)
5
- __metaclass__ = type
3
+ from __future__ import annotations
6
4
 
7
5
  from jinja2.runtime import Undefined
8
6
  from jinja2.exceptions import UndefinedError
@@ -17,7 +17,7 @@ DOCUMENTATION:
17
17
  type: raw
18
18
  required: true
19
19
  morekeys:
20
- description: Indicies or keys to extract from the initial result (subkeys/subindices).
20
+ description: Indices or keys to extract from the initial result (subkeys/subindices).
21
21
  type: list
22
22
  elements: dictionary
23
23
  required: true
@@ -5,7 +5,7 @@ DOCUMENTATION:
5
5
  description:
6
6
  - Converts a YAML documents in a string representation into an equivalent structured Ansible variable.
7
7
  - Ansible internally auto-converts YAML strings into variable structures in most contexts, but by default does not handle 'multi document' YAML files or strings.
8
- - If multiple YAML documents are not supplied, this is the equivalend of using C(from_yaml).
8
+ - If multiple YAML documents are not supplied, this is the equivalence of using C(from_yaml).
9
9
  notes:
10
10
  - This filter functions as a wrapper to the Python C(yaml.safe_load_all) function, part of the L(pyyaml Python library, https://pypi.org/project/PyYAML/).
11
11
  - Possible conflicts in variable names from the multiple documents are resolved directly by the pyyaml library.
@@ -1,9 +1,9 @@
1
1
  DOCUMENTATION:
2
2
  name: human_redable
3
3
  version_added: "historical"
4
- short_description: Make bytes/bits human readable
4
+ short_description: Make bytes/bits human-readable
5
5
  description:
6
- - Convert byte or bit figures to more human readable formats.
6
+ - Convert byte or bit figures to more human-readable formats.
7
7
  positional: _input, isbits, unit
8
8
  options:
9
9
  _input:
@@ -31,5 +31,5 @@ EXAMPLES: |
31
31
 
32
32
  RETURN:
33
33
  _value:
34
- description: Human readable byte or bit size.
34
+ description: human-readable byte or bit size.
35
35
  type: str
@@ -3,11 +3,11 @@ DOCUMENTATION:
3
3
  version_added: "historical"
4
4
  short_description: Get bytes from string
5
5
  description:
6
- - Convert a human readable byte or bit string into a number bytes.
6
+ - Convert a human-readable byte or bit string into a number bytes.
7
7
  positional: _input, default_unit, isbits
8
8
  options:
9
9
  _input:
10
- description: Human readable description of a number of bytes.
10
+ description: human-readable description of a number of bytes.
11
11
  type: int
12
12
  required: true
13
13
  default_unit:
@@ -1,7 +1,7 @@
1
1
  DOCUMENTATION:
2
2
  name: mandatory
3
3
  version_added: "historical"
4
- short_description: make a variable's existance mandatory
4
+ short_description: make a variable's existence mandatory
5
5
  description:
6
6
  - Depending on context undefined variables can be ignored or skipped, this ensures they force an error.
7
7
  positional: _input
@@ -145,7 +145,7 @@ def inversepower(x, base=2):
145
145
 
146
146
 
147
147
  def human_readable(size, isbits=False, unit=None):
148
- ''' Return a human readable string '''
148
+ ''' Return a human-readable string '''
149
149
  try:
150
150
  return formatters.bytes_to_human(size, isbits, unit)
151
151
  except TypeError as e:
@@ -155,7 +155,7 @@ def human_readable(size, isbits=False, unit=None):
155
155
 
156
156
 
157
157
  def human_to_bytes(size, default_unit=None, isbits=False):
158
- ''' Return bytes count from a human readable string '''
158
+ ''' Return bytes count from a human-readable string '''
159
159
  try:
160
160
  return formatters.human_to_bytes(size, default_unit, isbits)
161
161
  except TypeError as e:
@@ -7,6 +7,7 @@ DOCUMENTATION:
7
7
  positional: _input
8
8
  notes:
9
9
  - Algorithms available might be restricted by the system.
10
+ - Algorithms may restrict salt length or content. For example, Blowfish/bcrypt requires a 22-character salt.
10
11
  options:
11
12
  _input:
12
13
  description: Secret to hash.
@@ -18,8 +19,8 @@ DOCUMENTATION:
18
19
  default: sha512
19
20
  choices: [ md5, blowfish, sha256, sha512 ]
20
21
  salt:
21
- description: Secret string that is used for the hashing, if none is provided a random one can be generated.
22
- type: int
22
+ description: Secret string used for the hashing. If none is provided a random one can be generated. Use only numbers and letters (characters matching V([./0-9A-Za-z]+)).
23
+ type: string
23
24
  rounds:
24
25
  description: Number of encryption rounds, default varies by algorithm used.
25
26
  type: int
@@ -6,6 +6,8 @@ DOCUMENTATION:
6
6
  - Replace a substring defined by a regular expression with another defined by another regular expression based on the first match.
7
7
  notes:
8
8
  - Maps to Python's C(re.sub).
9
+ - 'The substring matched by the group is accessible via the symbolic group name or
10
+ the ``\{number}`` special sequence. See examples section.'
9
11
  positional: _input, _regex_match, _regex_replace
10
12
  options:
11
13
  _input:
@@ -28,6 +30,16 @@ DOCUMENTATION:
28
30
  description: Force the search to be case insensitive if V(True), case sensitive otherwise.
29
31
  type: bool
30
32
  default: no
33
+ count:
34
+ description: Maximum number of pattern occurrences to replace. If zero, replace all occurrences.
35
+ type: int
36
+ default: 0
37
+ version_added: "2.17"
38
+ mandatory_count:
39
+ description: Except a certain number of replacements. Raises an error otherwise. If zero, ignore.
40
+ type: int
41
+ default: 0
42
+ version_added: "2.17"
31
43
 
32
44
  EXAMPLES: |
33
45
 
@@ -46,6 +58,9 @@ EXAMPLES: |
46
58
  # piratecomment => '#CAR\n#tar\nfoo\n#bar\n'
47
59
  piratecomment: "{{ 'CAR\ntar\nfoo\nbar\n' | regex_replace('(?im)^(.ar)$', '#\\1') }}"
48
60
 
61
+ # 'foo=bar=baz' => 'foo:bar=baz'
62
+ key_value: "{{ 'foo=bar=baz' | regex_replace('=', ':', count=1) }}"
63
+
49
64
  RETURN:
50
65
  _value:
51
66
  description: String with substitution (or original if no match).
@@ -6,6 +6,8 @@ DOCUMENTATION:
6
6
  - Search in a string to extract the part that matches the regular expression.
7
7
  notes:
8
8
  - Maps to Python's C(re.search).
9
+ - 'The substring matched by the group is accessible via the symbolic group name or
10
+ the ``\{number}`` special sequence. See examples section.'
9
11
  positional: _input, _regex
10
12
  options:
11
13
  _input:
@@ -38,6 +40,16 @@ EXAMPLES: |
38
40
  # drinkat => 'BAR'
39
41
  drinkat: "{{ 'foo\nBAR' | regex_search('^bar', multiline=True, ignorecase=True) }}"
40
42
 
43
+ # Extracts server and database id from a string using number
44
+ # (the substring matched by the group is accessible via the \number special sequence)
45
+ db: "{{ 'server1/database42' | regex_search('server([0-9]+)/database([0-9]+)', '\\1', '\\2') }}"
46
+ # => ['1', '42']
47
+
48
+ # Extracts dividend and divisor from a division
49
+ # (the substring matched by the group is accessible via the symbolic group name)
50
+ db: "{{ '21/42' | regex_search('(?P<dividend>[0-9]+)/(?P<divisor>[0-9]+)', '\\g<dividend>', '\\g<divisor>') }}"
51
+ # => ['21', '42']
52
+
41
53
  RETURN:
42
54
  _value:
43
55
  description: Matched string or empty string if no match.
@@ -21,6 +21,7 @@ DOCUMENTATION:
21
21
  description: Whether time supplied is in UTC.
22
22
  type: bool
23
23
  default: false
24
+ version_added: '2.14'
24
25
 
25
26
  EXAMPLES: |
26
27
  # for a complete set of features go to https://strftime.org/
@@ -39,15 +40,7 @@ EXAMPLES: |
39
40
 
40
41
  # Use arbitrary epoch value
41
42
  {{ '%Y-%m-%d' | strftime(0) }} # => 1970-01-01
42
- {{ '%Y-%m-%d' | strftime(1441357287) }} # => 2015-09-04
43
-
44
- # complex examples
45
- vars:
46
- date1: '2022-11-15T03:23:13.686956868Z'
47
- date2: '2021-12-15T16:06:24.400087Z'
48
- date_short: '{{ date1|regex_replace("([^.]+)(\.\d{6})(\d*)(.+)", "\1\2\4") }}' #shorten microseconds
49
- iso8601format: '%Y-%m-%dT%H:%M:%S.%fZ'
50
- date_diff_isoed: '{{ (date1|to_datetime(isoformat) - date2|to_datetime(isoformat)).total_seconds() }}'
43
+ {{ '%Y-%m-%d' | strftime(seconds=1441357287, utc=true) }} # => 2015-09-04
51
44
 
52
45
  RETURN:
53
46
  _value:
@@ -4,9 +4,14 @@ DOCUMENTATION:
4
4
  short_description: Get C(datetime) from string
5
5
  description:
6
6
  - Using the input string attempt to create a matching Python C(datetime) object.
7
+ - Adding or Subtracting two datetime objects will result in a Python C(timedelta) object.
7
8
  notes:
8
9
  - For a full list of format codes for working with Python date format strings, see
9
10
  L(the Python documentation, https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior).
11
+ - The timedelta object produced by the difference of two datetimes store the days, seconds, and microseconds of
12
+ the delta. This results in the C(seconds) attribute being the total seconds of the minutes and hours of that
13
+ delta. See L(datatime.timedelta, https://docs.python.org/3/library/datetime.html#timedelta-objects) for more
14
+ information about how a timedelta works.
10
15
  positional: _input
11
16
  options:
12
17
  _input:
@@ -22,13 +27,23 @@ EXAMPLES: |
22
27
  # Get total amount of seconds between two dates. Default date format is %Y-%m-%d %H:%M:%S but you can pass your own format
23
28
  secsdiff: '{{ (("2016-08-14 20:00:12" | to_datetime) - ("2015-12-25" | to_datetime("%Y-%m-%d"))).total_seconds() }}'
24
29
 
25
- # Get remaining seconds after delta has been calculated. NOTE: This does NOT convert years, days, hours, and so on to seconds. For that, use total_seconds()
30
+ # Get remaining seconds after delta has been calculated. NOTE: This does NOT convert years and days to seconds. For that, use total_seconds()
26
31
  {{ (("2016-08-14 20:00:12" | to_datetime) - ("2016-08-14 18:00:00" | to_datetime)).seconds }}
27
- # This expression evaluates to "12" and not "132". Delta is 2 hours, 12 seconds
32
+ # This expression evaluates to "7212". Delta is 2 hours, 12 seconds
28
33
 
29
34
  # get amount of days between two dates. This returns only number of days and discards remaining hours, minutes, and seconds
30
35
  {{ (("2016-08-14 20:00:12" | to_datetime) - ("2015-12-25" | to_datetime('%Y-%m-%d'))).days }}
31
36
 
37
+ # difference between to dotnet (100ns precision) and iso8601 microsecond timestamps
38
+ # the date1_short regex replace will work for any timestamp that has a higher than microsecond precision
39
+ # by cutting off anything more precise than microseconds
40
+ vars:
41
+ date1: '2022-11-15T03:23:13.6869568Z'
42
+ date2: '2021-12-15T16:06:24.400087Z'
43
+ date1_short: '{{ date1|regex_replace("([^.]+)(\.\d{6})(\d*)(.+)", "\1\2\4") }}' # shorten to microseconds
44
+ iso8601format: '%Y-%m-%dT%H:%M:%S.%fZ'
45
+ date_diff_isoed: '{{ (date1_short|to_datetime(iso8601format) - date2|to_datetime(iso8601format)).total_seconds() }}'
46
+
32
47
  RETURN:
33
48
  _value:
34
49
  description: C(datetime) object from the represented value.
@@ -39,6 +39,10 @@ DOCUMENTATION:
39
39
  description: If V(True), keys that are not basic Python types will be skipped.
40
40
  default: False
41
41
  type: bool
42
+ sort_keys:
43
+ description: Affects sorting of dictionary keys.
44
+ default: True
45
+ type: bool
42
46
  notes:
43
47
  - Both O(vault_to_text) and O(preprocess_unsafe) defaulted to V(False) between Ansible 2.9 and 2.12.
44
48
  - 'These parameters to C(json.dumps) will be ignored, they are overridden for internal use: I(cls), I(default), I(indent), I(separators), I(sort_keys).'
@@ -29,7 +29,7 @@ EXAMPLES: |
29
29
  # list1: [1, 2, 5, 1, 3, 4, 10]
30
30
  # list2: [1, 2, 3, 4, 5, 11, 99]
31
31
  {{ list1 | union(list2) }}
32
- # => [1, 2, 5, 1, 3, 4, 10, 11, 99]
32
+ # => [1, 2, 5, 3, 4, 10, 11, 99]
33
33
  RETURN:
34
34
  _value:
35
35
  description: A unique list of all the elements from both lists.
@@ -3,8 +3,7 @@
3
3
  # Copyright: (c) 2012, Dag Wieers (@dagwieers) <dag@wieers.com>
4
4
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
5
5
 
6
- from __future__ import absolute_import, division, print_function
7
- __metaclass__ = type
6
+ from __future__ import annotations
8
7
 
9
8
  from functools import partial
10
9
 
@@ -2,8 +2,7 @@
2
2
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
3
3
 
4
4
 
5
- from __future__ import (absolute_import, division, print_function)
6
- __metaclass__ = type
5
+ from __future__ import annotations
7
6
 
8
7
  DOCUMENTATION = r'''
9
8
  name: urlsplit
@@ -5,7 +5,7 @@ DOCUMENTATION:
5
5
  positional: _input, _additional_lists
6
6
  description: Iterate over several iterables in parallel, producing tuples with an item from each one.
7
7
  notes:
8
- - This is mostly a passhtrough to Python's C(zip) function.
8
+ - This is mostly a passthrough to Python's C(zip) function.
9
9
  options:
10
10
  _input:
11
11
  description: Original list.
@@ -34,7 +34,7 @@ EXAMPLES: |
34
34
  shorter: "{{ [1,2,3] | zip(['a','b','c','d','e','f']) }}"
35
35
 
36
36
  # compose dict from lists of keys and values
37
- mydcit: "{{ dict(keys_list | zip(values_list)) }}"
37
+ mydict: "{{ dict(keys_list | zip(values_list)) }}"
38
38
 
39
39
  RETURN:
40
40
  _value:
@@ -8,7 +8,7 @@ DOCUMENTATION:
8
8
  If the iterables are of uneven length, missing values are filled-in with O(fillvalue).
9
9
  Iteration continues until the longest iterable is exhausted.
10
10
  notes:
11
- - This is mostly a passhtrough to Python's C(itertools.zip_longest) function
11
+ - This is mostly a passthrough to Python's C(itertools.zip_longest) function
12
12
  options:
13
13
  _input:
14
14
  description: Original list.
@@ -1,8 +1,7 @@
1
1
  # (c) 2018 Red Hat Inc.
2
2
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
3
3
 
4
- from __future__ import (absolute_import, division, print_function)
5
- __metaclass__ = type
4
+ from __future__ import annotations
6
5
 
7
6
  from abc import abstractmethod
8
7
 
@@ -15,9 +15,7 @@
15
15
  # You should have received a copy of the GNU General Public License
16
16
  # along with Ansible. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
- # Make coding more python3-ish
19
- from __future__ import (absolute_import, division, print_function)
20
- __metaclass__ = type
18
+ from __future__ import annotations
21
19
 
22
20
  import hashlib
23
21
  import os
@@ -220,7 +218,7 @@ class BaseInventoryPlugin(AnsiblePlugin):
220
218
  try:
221
219
  # avoid loader cache so meta: refresh_inventory can pick up config changes
222
220
  # if we read more than once, fs cache should be good enough
223
- config = self.loader.load_from_file(path, cache=False)
221
+ config = self.loader.load_from_file(path, cache='none')
224
222
  except Exception as e:
225
223
  raise AnsibleParserError(to_native(e))
226
224
 
@@ -1,8 +1,7 @@
1
1
  # Copyright (c) 2017 Ansible Project
2
2
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
3
3
 
4
- from __future__ import (absolute_import, division, print_function)
5
- __metaclass__ = type
4
+ from __future__ import annotations
6
5
 
7
6
  DOCUMENTATION = '''
8
7
  name: advanced_host_list