ansible-core 2.18.7__py3-none-any.whl → 2.19.0__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (757) hide show
  1. ansible/_internal/__init__.py +53 -0
  2. ansible/_internal/_ansiballz/__init__.py +0 -0
  3. ansible/_internal/_ansiballz/_builder.py +101 -0
  4. ansible/_internal/_ansiballz/_wrapper.py +262 -0
  5. ansible/_internal/_collection_proxy.py +47 -0
  6. ansible/_internal/_datatag/__init__.py +0 -0
  7. ansible/_internal/_datatag/_tags.py +130 -0
  8. ansible/_internal/_datatag/_utils.py +19 -0
  9. ansible/_internal/_datatag/_wrappers.py +33 -0
  10. ansible/_internal/_errors/__init__.py +0 -0
  11. ansible/_internal/_errors/_alarm_timeout.py +66 -0
  12. ansible/_internal/_errors/_captured.py +123 -0
  13. ansible/_internal/_errors/_error_factory.py +89 -0
  14. ansible/_internal/_errors/_error_utils.py +240 -0
  15. ansible/_internal/_errors/_handler.py +91 -0
  16. ansible/_internal/_errors/_task_timeout.py +28 -0
  17. ansible/_internal/_event_formatting.py +127 -0
  18. ansible/_internal/_json/__init__.py +214 -0
  19. ansible/_internal/_json/_legacy_encoder.py +34 -0
  20. ansible/_internal/_json/_profiles/__init__.py +0 -0
  21. ansible/_internal/_json/_profiles/_cache_persistence.py +57 -0
  22. ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
  23. ansible/_internal/_json/_profiles/_legacy.py +189 -0
  24. ansible/_internal/_locking.py +21 -0
  25. ansible/_internal/_plugins/__init__.py +0 -0
  26. ansible/_internal/_plugins/_cache.py +57 -0
  27. ansible/_internal/_ssh/__init__.py +0 -0
  28. ansible/_internal/_ssh/_agent_launch.py +91 -0
  29. ansible/_internal/_ssh/_ssh_agent.py +619 -0
  30. ansible/_internal/_task.py +78 -0
  31. ansible/_internal/_templating/__init__.py +12 -0
  32. ansible/_internal/_templating/_access.py +86 -0
  33. ansible/_internal/_templating/_chain_templar.py +63 -0
  34. ansible/_internal/_templating/_datatag.py +95 -0
  35. ansible/_internal/_templating/_engine.py +592 -0
  36. ansible/_internal/_templating/_errors.py +28 -0
  37. ansible/_internal/_templating/_jinja_bits.py +1106 -0
  38. ansible/_internal/_templating/_jinja_common.py +323 -0
  39. ansible/_internal/_templating/_jinja_patches.py +44 -0
  40. ansible/_internal/_templating/_jinja_plugins.py +375 -0
  41. ansible/_internal/_templating/_lazy_containers.py +633 -0
  42. ansible/_internal/_templating/_marker_behaviors.py +103 -0
  43. ansible/_internal/_templating/_template_vars.py +72 -0
  44. ansible/_internal/_templating/_transform.py +70 -0
  45. ansible/_internal/_templating/_utils.py +108 -0
  46. ansible/_internal/_testing.py +26 -0
  47. ansible/_internal/_wrapt.py +1052 -0
  48. ansible/_internal/_yaml/__init__.py +0 -0
  49. ansible/_internal/_yaml/_constructor.py +240 -0
  50. ansible/_internal/_yaml/_dumper.py +70 -0
  51. ansible/_internal/_yaml/_errors.py +166 -0
  52. ansible/_internal/_yaml/_loader.py +66 -0
  53. ansible/_internal/ansible_collections/ansible/_protomatter/README.md +11 -0
  54. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/action/debug.py +36 -0
  55. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/apply_trust.py +19 -0
  56. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/dump_object.py +27 -0
  57. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/finalize.py +16 -0
  58. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/origin.py +18 -0
  59. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.py +24 -0
  60. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.yml +33 -0
  61. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/tag_names.py +16 -0
  62. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +17 -0
  63. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +49 -0
  64. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.py +21 -0
  65. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.yml +2 -0
  66. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.py +15 -0
  67. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.yml +19 -0
  68. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.py +18 -0
  69. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.yml +19 -0
  70. ansible/cli/__init__.py +93 -104
  71. ansible/cli/_ssh_askpass.py +54 -0
  72. ansible/cli/adhoc.py +20 -10
  73. ansible/cli/arguments/option_helpers.py +163 -10
  74. ansible/cli/config.py +43 -68
  75. ansible/cli/console.py +13 -11
  76. ansible/cli/doc.py +134 -77
  77. ansible/cli/galaxy.py +27 -20
  78. ansible/cli/inventory.py +28 -28
  79. ansible/cli/playbook.py +4 -12
  80. ansible/cli/pull.py +6 -3
  81. ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
  82. ansible/cli/vault.py +12 -11
  83. ansible/compat/__init__.py +2 -2
  84. ansible/compat/importlib_resources.py +9 -12
  85. ansible/config/base.yml +218 -133
  86. ansible/config/manager.py +220 -159
  87. ansible/constants.py +2 -65
  88. ansible/errors/__init__.py +350 -256
  89. ansible/executor/interpreter_discovery.py +28 -149
  90. ansible/executor/module_common.py +480 -514
  91. ansible/executor/play_iterator.py +22 -27
  92. ansible/executor/playbook_executor.py +11 -11
  93. ansible/executor/powershell/async_watchdog.ps1 +97 -102
  94. ansible/executor/powershell/async_wrapper.ps1 +204 -153
  95. ansible/executor/powershell/become_wrapper.ps1 +107 -144
  96. ansible/executor/powershell/bootstrap_wrapper.ps1 +46 -9
  97. ansible/executor/powershell/coverage_wrapper.ps1 +91 -135
  98. ansible/executor/powershell/exec_wrapper.ps1 +675 -196
  99. ansible/executor/powershell/module_manifest.py +469 -265
  100. ansible/executor/powershell/module_wrapper.ps1 +195 -186
  101. ansible/executor/powershell/powershell_expand_user.ps1 +20 -0
  102. ansible/executor/powershell/powershell_mkdtemp.ps1 +17 -0
  103. ansible/executor/powershell/psrp_fetch_file.ps1 +41 -0
  104. ansible/executor/powershell/psrp_put_file.ps1 +122 -0
  105. ansible/executor/powershell/winrm_fetch_file.ps1 +46 -0
  106. ansible/executor/powershell/winrm_put_file.ps1 +36 -0
  107. ansible/executor/process/worker.py +139 -149
  108. ansible/executor/stats.py +5 -5
  109. ansible/executor/task_executor.py +270 -297
  110. ansible/executor/task_queue_manager.py +135 -137
  111. ansible/executor/task_result.py +182 -79
  112. ansible/galaxy/__init__.py +2 -2
  113. ansible/galaxy/api.py +26 -25
  114. ansible/galaxy/collection/__init__.py +6 -14
  115. ansible/galaxy/collection/concrete_artifact_manager.py +12 -21
  116. ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
  117. ansible/galaxy/dependency_resolution/providers.py +4 -4
  118. ansible/galaxy/dependency_resolution/reporters.py +81 -0
  119. ansible/galaxy/role.py +6 -10
  120. ansible/galaxy/token.py +28 -21
  121. ansible/inventory/data.py +47 -57
  122. ansible/inventory/group.py +50 -73
  123. ansible/inventory/helpers.py +9 -0
  124. ansible/inventory/host.py +37 -54
  125. ansible/inventory/manager.py +79 -34
  126. ansible/keyword_desc.yml +1 -1
  127. ansible/module_utils/_internal/__init__.py +55 -0
  128. ansible/module_utils/_internal/_ambient_context.py +58 -0
  129. ansible/module_utils/_internal/_ansiballz/__init__.py +0 -0
  130. ansible/module_utils/_internal/_ansiballz/_extensions/__init__.py +0 -0
  131. ansible/module_utils/_internal/_ansiballz/_extensions/_coverage.py +45 -0
  132. ansible/module_utils/_internal/_ansiballz/_extensions/_pydevd.py +62 -0
  133. ansible/module_utils/_internal/_ansiballz/_loader.py +81 -0
  134. ansible/module_utils/_internal/_ansiballz/_respawn.py +32 -0
  135. ansible/module_utils/_internal/_ansiballz/_respawn_wrapper.py +23 -0
  136. ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
  137. ansible/module_utils/_internal/_dataclass_validation.py +217 -0
  138. ansible/module_utils/_internal/_datatag/__init__.py +961 -0
  139. ansible/module_utils/_internal/_datatag/_tags.py +16 -0
  140. ansible/module_utils/_internal/_debugging.py +31 -0
  141. ansible/module_utils/_internal/_deprecator.py +157 -0
  142. ansible/module_utils/_internal/_errors.py +101 -0
  143. ansible/module_utils/_internal/_event_utils.py +61 -0
  144. ansible/module_utils/_internal/_json/__init__.py +63 -0
  145. ansible/module_utils/_internal/_json/_legacy_encoder.py +26 -0
  146. ansible/module_utils/_internal/_json/_profiles/__init__.py +428 -0
  147. ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
  148. ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +33 -0
  149. ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +37 -0
  150. ansible/module_utils/_internal/_json/_profiles/_module_modern_c2m.py +35 -0
  151. ansible/module_utils/_internal/_json/_profiles/_module_modern_m2c.py +33 -0
  152. ansible/module_utils/_internal/_json/_profiles/_tagless.py +52 -0
  153. ansible/module_utils/_internal/_messages.py +130 -0
  154. ansible/module_utils/_internal/_patches/__init__.py +66 -0
  155. ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +53 -0
  156. ansible/module_utils/_internal/_patches/_socket_patch.py +34 -0
  157. ansible/module_utils/_internal/_patches/_sys_intern_patch.py +34 -0
  158. ansible/module_utils/_internal/_plugin_info.py +38 -0
  159. ansible/module_utils/_internal/_stack.py +22 -0
  160. ansible/module_utils/_internal/_testing.py +0 -0
  161. ansible/module_utils/_internal/_text_utils.py +6 -0
  162. ansible/module_utils/_internal/_traceback.py +92 -0
  163. ansible/module_utils/_internal/_validation.py +14 -0
  164. ansible/module_utils/ansible_release.py +2 -2
  165. ansible/module_utils/api.py +1 -2
  166. ansible/module_utils/basic.py +303 -202
  167. ansible/module_utils/common/_utils.py +24 -28
  168. ansible/module_utils/common/arg_spec.py +8 -3
  169. ansible/module_utils/common/collections.py +7 -2
  170. ansible/module_utils/common/dict_transformations.py +2 -2
  171. ansible/module_utils/common/file.py +2 -2
  172. ansible/module_utils/common/json.py +90 -84
  173. ansible/module_utils/common/locale.py +2 -2
  174. ansible/module_utils/common/parameters.py +27 -24
  175. ansible/module_utils/common/process.py +2 -3
  176. ansible/module_utils/common/respawn.py +11 -33
  177. ansible/module_utils/common/sentinel.py +66 -0
  178. ansible/module_utils/common/sys_info.py +8 -8
  179. ansible/module_utils/common/text/converters.py +16 -37
  180. ansible/module_utils/common/validation.py +35 -24
  181. ansible/module_utils/common/warnings.py +143 -25
  182. ansible/module_utils/common/yaml.py +29 -3
  183. ansible/module_utils/compat/datetime.py +33 -21
  184. ansible/module_utils/compat/paramiko.py +21 -10
  185. ansible/module_utils/compat/typing.py +6 -5
  186. ansible/module_utils/connection.py +10 -13
  187. ansible/module_utils/csharp/Ansible.Basic.cs +15 -12
  188. ansible/module_utils/csharp/Ansible.Become.cs +1 -0
  189. ansible/module_utils/csharp/Ansible.Privilege.cs +2 -2
  190. ansible/module_utils/csharp/Ansible._Async.cs +517 -0
  191. ansible/module_utils/datatag.py +49 -0
  192. ansible/module_utils/distro/__init__.py +2 -2
  193. ansible/module_utils/facts/ansible_collector.py +4 -5
  194. ansible/module_utils/facts/collector.py +13 -14
  195. ansible/module_utils/facts/compat.py +4 -4
  196. ansible/module_utils/facts/default_collectors.py +1 -1
  197. ansible/module_utils/facts/hardware/aix.py +34 -0
  198. ansible/module_utils/facts/hardware/base.py +2 -2
  199. ansible/module_utils/facts/hardware/darwin.py +1 -3
  200. ansible/module_utils/facts/hardware/freebsd.py +2 -2
  201. ansible/module_utils/facts/hardware/linux.py +5 -5
  202. ansible/module_utils/facts/namespace.py +1 -1
  203. ansible/module_utils/facts/network/base.py +1 -1
  204. ansible/module_utils/facts/network/fc_wwn.py +1 -2
  205. ansible/module_utils/facts/network/iscsi.py +1 -2
  206. ansible/module_utils/facts/network/nvme.py +1 -2
  207. ansible/module_utils/facts/other/facter.py +2 -3
  208. ansible/module_utils/facts/other/ohai.py +2 -3
  209. ansible/module_utils/facts/sysctl.py +4 -6
  210. ansible/module_utils/facts/system/apparmor.py +1 -2
  211. ansible/module_utils/facts/system/caps.py +3 -3
  212. ansible/module_utils/facts/system/chroot.py +1 -2
  213. ansible/module_utils/facts/system/cmdline.py +1 -2
  214. ansible/module_utils/facts/system/date_time.py +5 -3
  215. ansible/module_utils/facts/system/distribution.py +27 -13
  216. ansible/module_utils/facts/system/dns.py +1 -1
  217. ansible/module_utils/facts/system/env.py +1 -2
  218. ansible/module_utils/facts/system/fips.py +7 -20
  219. ansible/module_utils/facts/system/loadavg.py +1 -2
  220. ansible/module_utils/facts/system/local.py +2 -3
  221. ansible/module_utils/facts/system/lsb.py +1 -2
  222. ansible/module_utils/facts/system/pkg_mgr.py +1 -2
  223. ansible/module_utils/facts/system/platform.py +1 -2
  224. ansible/module_utils/facts/system/python.py +1 -2
  225. ansible/module_utils/facts/system/selinux.py +1 -1
  226. ansible/module_utils/facts/system/service_mgr.py +1 -2
  227. ansible/module_utils/facts/system/ssh_pub_keys.py +1 -1
  228. ansible/module_utils/facts/system/systemd.py +1 -1
  229. ansible/module_utils/facts/system/user.py +1 -2
  230. ansible/module_utils/facts/utils.py +3 -3
  231. ansible/module_utils/facts/virtual/base.py +1 -1
  232. ansible/module_utils/facts/virtual/linux.py +3 -3
  233. ansible/module_utils/facts/virtual/sunos.py +3 -15
  234. ansible/module_utils/facts/virtual/sysctl.py +3 -16
  235. ansible/module_utils/json_utils.py +2 -2
  236. ansible/module_utils/parsing/convert_bool.py +7 -1
  237. ansible/module_utils/powershell/Ansible.ModuleUtils.AddType.psm1 +1 -1
  238. ansible/module_utils/powershell/Ansible.ModuleUtils.CamelConversion.psm1 +1 -1
  239. ansible/module_utils/powershell/Ansible.ModuleUtils.CommandUtil.psm1 +1 -1
  240. ansible/module_utils/powershell/Ansible.ModuleUtils.WebRequest.psm1 +1 -1
  241. ansible/module_utils/service.py +21 -31
  242. ansible/module_utils/splitter.py +7 -7
  243. ansible/module_utils/testing.py +31 -0
  244. ansible/module_utils/urls.py +64 -35
  245. ansible/modules/add_host.py +4 -4
  246. ansible/modules/apt.py +69 -49
  247. ansible/modules/apt_key.py +19 -12
  248. ansible/modules/apt_repository.py +32 -51
  249. ansible/modules/assemble.py +16 -14
  250. ansible/modules/assert.py +4 -4
  251. ansible/modules/async_status.py +24 -24
  252. ansible/modules/async_wrapper.py +20 -25
  253. ansible/modules/blockinfile.py +6 -7
  254. ansible/modules/command.py +13 -20
  255. ansible/modules/copy.py +60 -147
  256. ansible/modules/cron.py +24 -21
  257. ansible/modules/deb822_repository.py +8 -9
  258. ansible/modules/debconf.py +5 -5
  259. ansible/modules/debug.py +4 -4
  260. ansible/modules/dnf.py +8 -8
  261. ansible/modules/dnf5.py +39 -13
  262. ansible/modules/dpkg_selections.py +4 -4
  263. ansible/modules/expect.py +13 -15
  264. ansible/modules/fail.py +4 -4
  265. ansible/modules/fetch.py +4 -4
  266. ansible/modules/file.py +184 -144
  267. ansible/modules/find.py +22 -20
  268. ansible/modules/gather_facts.py +3 -3
  269. ansible/modules/get_url.py +77 -54
  270. ansible/modules/getent.py +7 -9
  271. ansible/modules/git.py +38 -38
  272. ansible/modules/group.py +6 -6
  273. ansible/modules/group_by.py +4 -4
  274. ansible/modules/hostname.py +15 -32
  275. ansible/modules/import_playbook.py +6 -6
  276. ansible/modules/import_role.py +6 -6
  277. ansible/modules/import_tasks.py +6 -6
  278. ansible/modules/include_role.py +6 -6
  279. ansible/modules/include_tasks.py +6 -6
  280. ansible/modules/include_vars.py +6 -6
  281. ansible/modules/iptables.py +86 -73
  282. ansible/modules/known_hosts.py +22 -24
  283. ansible/modules/lineinfile.py +5 -5
  284. ansible/modules/meta.py +4 -4
  285. ansible/modules/mount_facts.py +2 -2
  286. ansible/modules/package.py +10 -4
  287. ansible/modules/package_facts.py +22 -10
  288. ansible/modules/pause.py +6 -6
  289. ansible/modules/ping.py +6 -6
  290. ansible/modules/pip.py +21 -26
  291. ansible/modules/raw.py +6 -6
  292. ansible/modules/reboot.py +6 -6
  293. ansible/modules/replace.py +10 -14
  294. ansible/modules/rpm_key.py +7 -8
  295. ansible/modules/script.py +4 -4
  296. ansible/modules/service.py +10 -17
  297. ansible/modules/service_facts.py +87 -10
  298. ansible/modules/set_fact.py +5 -5
  299. ansible/modules/set_stats.py +4 -4
  300. ansible/modules/setup.py +2 -2
  301. ansible/modules/shell.py +6 -6
  302. ansible/modules/slurp.py +16 -19
  303. ansible/modules/stat.py +15 -31
  304. ansible/modules/subversion.py +15 -15
  305. ansible/modules/systemd.py +7 -7
  306. ansible/modules/systemd_service.py +7 -7
  307. ansible/modules/sysvinit.py +9 -9
  308. ansible/modules/tempfile.py +5 -6
  309. ansible/modules/template.py +6 -6
  310. ansible/modules/unarchive.py +38 -17
  311. ansible/modules/uri.py +33 -26
  312. ansible/modules/user.py +45 -32
  313. ansible/modules/validate_argument_spec.py +10 -7
  314. ansible/modules/wait_for.py +70 -60
  315. ansible/modules/wait_for_connection.py +6 -6
  316. ansible/modules/yum_repository.py +10 -9
  317. ansible/parsing/ajson.py +17 -37
  318. ansible/parsing/dataloader.py +99 -54
  319. ansible/parsing/mod_args.py +62 -60
  320. ansible/parsing/plugin_docs.py +21 -86
  321. ansible/parsing/quoting.py +1 -1
  322. ansible/parsing/splitter.py +27 -12
  323. ansible/parsing/utils/addresses.py +24 -24
  324. ansible/parsing/utils/jsonify.py +5 -1
  325. ansible/parsing/utils/yaml.py +32 -61
  326. ansible/parsing/vault/__init__.py +327 -99
  327. ansible/parsing/yaml/__init__.py +0 -18
  328. ansible/parsing/yaml/dumper.py +6 -120
  329. ansible/parsing/yaml/loader.py +6 -39
  330. ansible/parsing/yaml/objects.py +43 -335
  331. ansible/playbook/__init__.py +1 -1
  332. ansible/playbook/attribute.py +8 -3
  333. ansible/playbook/base.py +187 -134
  334. ansible/playbook/block.py +26 -24
  335. ansible/playbook/collectionsearch.py +1 -15
  336. ansible/playbook/conditional.py +3 -77
  337. ansible/playbook/handler.py +8 -2
  338. ansible/playbook/helpers.py +41 -53
  339. ansible/playbook/included_file.py +32 -26
  340. ansible/playbook/loop_control.py +2 -2
  341. ansible/playbook/play.py +85 -44
  342. ansible/playbook/play_context.py +14 -17
  343. ansible/playbook/playbook_include.py +27 -62
  344. ansible/playbook/role/__init__.py +64 -49
  345. ansible/playbook/role/definition.py +15 -17
  346. ansible/playbook/role/include.py +2 -4
  347. ansible/playbook/role/metadata.py +10 -11
  348. ansible/playbook/role_include.py +3 -3
  349. ansible/playbook/taggable.py +28 -12
  350. ansible/playbook/task.py +192 -121
  351. ansible/playbook/task_include.py +5 -5
  352. ansible/plugins/__init__.py +58 -26
  353. ansible/plugins/action/__init__.py +188 -186
  354. ansible/plugins/action/add_host.py +2 -2
  355. ansible/plugins/action/assemble.py +11 -18
  356. ansible/plugins/action/assert.py +55 -67
  357. ansible/plugins/action/async_status.py +7 -2
  358. ansible/plugins/action/copy.py +14 -17
  359. ansible/plugins/action/debug.py +37 -31
  360. ansible/plugins/action/dnf.py +3 -4
  361. ansible/plugins/action/fail.py +1 -1
  362. ansible/plugins/action/fetch.py +7 -8
  363. ansible/plugins/action/gather_facts.py +13 -14
  364. ansible/plugins/action/group_by.py +1 -1
  365. ansible/plugins/action/include_vars.py +10 -11
  366. ansible/plugins/action/package.py +8 -14
  367. ansible/plugins/action/pause.py +2 -2
  368. ansible/plugins/action/script.py +27 -38
  369. ansible/plugins/action/service.py +9 -18
  370. ansible/plugins/action/set_fact.py +3 -12
  371. ansible/plugins/action/set_stats.py +3 -8
  372. ansible/plugins/action/template.py +47 -67
  373. ansible/plugins/action/unarchive.py +6 -16
  374. ansible/plugins/action/uri.py +9 -20
  375. ansible/plugins/action/validate_argument_spec.py +5 -5
  376. ansible/plugins/action/wait_for_connection.py +1 -1
  377. ansible/plugins/become/__init__.py +31 -8
  378. ansible/plugins/become/runas.py +71 -0
  379. ansible/plugins/become/su.py +13 -8
  380. ansible/plugins/become/sudo.py +19 -0
  381. ansible/plugins/cache/__init__.py +52 -63
  382. ansible/plugins/cache/base.py +8 -0
  383. ansible/plugins/cache/jsonfile.py +10 -16
  384. ansible/plugins/cache/memory.py +6 -12
  385. ansible/plugins/callback/__init__.py +294 -201
  386. ansible/plugins/callback/default.py +99 -95
  387. ansible/plugins/callback/junit.py +44 -43
  388. ansible/plugins/callback/minimal.py +28 -25
  389. ansible/plugins/callback/oneline.py +34 -21
  390. ansible/plugins/callback/tree.py +27 -16
  391. ansible/plugins/connection/__init__.py +47 -34
  392. ansible/plugins/connection/local.py +156 -60
  393. ansible/plugins/connection/paramiko_ssh.py +34 -24
  394. ansible/plugins/connection/psrp.py +76 -165
  395. ansible/plugins/connection/ssh.py +326 -86
  396. ansible/plugins/connection/winrm.py +62 -141
  397. ansible/plugins/doc_fragments/action_common_attributes.py +14 -14
  398. ansible/plugins/doc_fragments/action_core.py +6 -6
  399. ansible/plugins/doc_fragments/backup.py +2 -2
  400. ansible/plugins/doc_fragments/checksum_common.py +27 -0
  401. ansible/plugins/doc_fragments/constructed.py +8 -4
  402. ansible/plugins/doc_fragments/decrypt.py +2 -2
  403. ansible/plugins/doc_fragments/default_callback.py +2 -2
  404. ansible/plugins/doc_fragments/files.py +2 -2
  405. ansible/plugins/doc_fragments/inventory_cache.py +2 -2
  406. ansible/plugins/doc_fragments/result_format_callback.py +2 -2
  407. ansible/plugins/doc_fragments/return_common.py +2 -2
  408. ansible/plugins/doc_fragments/template_common.py +4 -4
  409. ansible/plugins/doc_fragments/url.py +17 -1
  410. ansible/plugins/doc_fragments/url_windows.py +2 -2
  411. ansible/plugins/doc_fragments/validate.py +2 -2
  412. ansible/plugins/doc_fragments/vars_plugin_staging.py +2 -2
  413. ansible/plugins/filter/__init__.py +6 -2
  414. ansible/plugins/filter/b64decode.yml +22 -0
  415. ansible/plugins/filter/b64encode.yml +22 -0
  416. ansible/plugins/filter/bool.yml +11 -4
  417. ansible/plugins/filter/core.py +245 -120
  418. ansible/plugins/filter/encryption.py +42 -34
  419. ansible/plugins/filter/flatten.yml +3 -2
  420. ansible/plugins/filter/human_to_bytes.yml +1 -1
  421. ansible/plugins/filter/mathstuff.py +30 -37
  422. ansible/plugins/filter/password_hash.yml +8 -0
  423. ansible/plugins/filter/pow.yml +1 -1
  424. ansible/plugins/filter/regex_search.yml +1 -4
  425. ansible/plugins/filter/root.yml +1 -1
  426. ansible/plugins/filter/split.yml +1 -1
  427. ansible/plugins/filter/strftime.yml +3 -3
  428. ansible/plugins/filter/to_nice_yaml.yml +0 -4
  429. ansible/plugins/filter/to_uuid.yml +1 -1
  430. ansible/plugins/filter/to_yaml.yml +0 -4
  431. ansible/plugins/filter/unvault.yml +1 -1
  432. ansible/plugins/filter/urls.py +1 -1
  433. ansible/plugins/filter/urlsplit.py +8 -9
  434. ansible/plugins/filter/vault.yml +14 -9
  435. ansible/plugins/filter/win_basename.yml +6 -1
  436. ansible/plugins/filter/win_dirname.yml +5 -0
  437. ansible/plugins/inventory/__init__.py +107 -86
  438. ansible/plugins/inventory/advanced_host_list.py +7 -5
  439. ansible/plugins/inventory/auto.py +11 -4
  440. ansible/plugins/inventory/constructed.py +21 -24
  441. ansible/plugins/inventory/generator.py +16 -11
  442. ansible/plugins/inventory/host_list.py +7 -5
  443. ansible/plugins/inventory/ini.py +78 -44
  444. ansible/plugins/inventory/script.py +190 -120
  445. ansible/plugins/inventory/toml.py +16 -126
  446. ansible/plugins/inventory/yaml.py +10 -8
  447. ansible/plugins/list.py +72 -19
  448. ansible/plugins/loader.py +383 -198
  449. ansible/plugins/lookup/__init__.py +21 -4
  450. ansible/plugins/lookup/config.py +21 -35
  451. ansible/plugins/lookup/csvfile.py +19 -73
  452. ansible/plugins/lookup/dict.py +1 -6
  453. ansible/plugins/lookup/env.py +12 -9
  454. ansible/plugins/lookup/file.py +5 -8
  455. ansible/plugins/lookup/first_found.py +87 -55
  456. ansible/plugins/lookup/indexed_items.py +1 -10
  457. ansible/plugins/lookup/ini.py +14 -13
  458. ansible/plugins/lookup/items.py +1 -1
  459. ansible/plugins/lookup/lines.py +8 -1
  460. ansible/plugins/lookup/list.py +1 -1
  461. ansible/plugins/lookup/nested.py +2 -18
  462. ansible/plugins/lookup/password.py +5 -5
  463. ansible/plugins/lookup/pipe.py +5 -7
  464. ansible/plugins/lookup/sequence.py +18 -8
  465. ansible/plugins/lookup/subelements.py +1 -4
  466. ansible/plugins/lookup/template.py +47 -36
  467. ansible/plugins/lookup/together.py +0 -12
  468. ansible/plugins/lookup/unvault.py +1 -5
  469. ansible/plugins/lookup/url.py +4 -10
  470. ansible/plugins/lookup/vars.py +16 -24
  471. ansible/plugins/shell/__init__.py +58 -4
  472. ansible/plugins/shell/cmd.py +2 -2
  473. ansible/plugins/shell/powershell.py +106 -31
  474. ansible/plugins/shell/sh.py +13 -7
  475. ansible/plugins/strategy/__init__.py +168 -193
  476. ansible/plugins/strategy/debug.py +2 -2
  477. ansible/plugins/strategy/free.py +16 -31
  478. ansible/plugins/strategy/host_pinned.py +2 -2
  479. ansible/plugins/strategy/linear.py +41 -41
  480. ansible/plugins/terminal/__init__.py +4 -4
  481. ansible/plugins/test/__init__.py +7 -2
  482. ansible/plugins/test/core.py +75 -35
  483. ansible/plugins/test/files.py +1 -1
  484. ansible/plugins/test/finished.yml +1 -1
  485. ansible/plugins/test/mathstuff.py +3 -3
  486. ansible/plugins/test/uri.py +5 -8
  487. ansible/plugins/vars/host_group_vars.py +7 -14
  488. ansible/release.py +2 -2
  489. ansible/template/__init__.py +353 -943
  490. ansible/utils/__init__.py +0 -18
  491. ansible/utils/collection_loader/__init__.py +54 -5
  492. ansible/utils/collection_loader/_collection_config.py +5 -6
  493. ansible/utils/collection_loader/_collection_finder.py +82 -96
  494. ansible/utils/collection_loader/_collection_meta.py +15 -8
  495. ansible/utils/display.py +485 -73
  496. ansible/utils/encrypt.py +27 -19
  497. ansible/utils/fqcn.py +2 -2
  498. ansible/utils/galaxy.py +2 -2
  499. ansible/utils/hashing.py +8 -10
  500. ansible/utils/helpers.py +2 -2
  501. ansible/utils/listify.py +10 -8
  502. ansible/utils/lock.py +2 -2
  503. ansible/utils/path.py +10 -12
  504. ansible/utils/plugin_docs.py +16 -14
  505. ansible/utils/py3compat.py +2 -7
  506. ansible/utils/sentinel.py +4 -62
  507. ansible/utils/singleton.py +2 -0
  508. ansible/utils/ssh_functions.py +6 -2
  509. ansible/utils/unsafe_proxy.py +23 -332
  510. ansible/utils/vars.py +55 -8
  511. ansible/utils/version.py +2 -2
  512. ansible/vars/clean.py +5 -5
  513. ansible/vars/hostvars.py +60 -90
  514. ansible/vars/manager.py +220 -285
  515. ansible/vars/plugins.py +4 -4
  516. ansible/vars/reserved.py +13 -12
  517. {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/METADATA +4 -3
  518. ansible_core-2.19.0.dist-info/RECORD +1097 -0
  519. ansible_core-2.19.0.dist-info/licenses/licenses/BSD-3-Clause.txt +28 -0
  520. ansible_test/_data/completion/docker.txt +7 -7
  521. ansible_test/_data/completion/remote.txt +6 -6
  522. ansible_test/_data/completion/windows.txt +1 -0
  523. ansible_test/_data/requirements/ansible.txt +2 -2
  524. ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
  525. ansible_test/_data/requirements/sanity.changelog.txt +2 -2
  526. ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
  527. ansible_test/_data/requirements/sanity.pep8.txt +1 -1
  528. ansible_test/_data/requirements/sanity.pylint.txt +5 -5
  529. ansible_test/_data/requirements/sanity.validate-modules.txt +2 -2
  530. ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
  531. ansible_test/_data/requirements/units.txt +1 -0
  532. ansible_test/_internal/__init__.py +6 -0
  533. ansible_test/_internal/ansible_util.py +3 -1
  534. ansible_test/_internal/become.py +1 -0
  535. ansible_test/_internal/bootstrap.py +1 -0
  536. ansible_test/_internal/cache.py +1 -0
  537. ansible_test/_internal/cgroup.py +1 -0
  538. ansible_test/_internal/ci/__init__.py +1 -0
  539. ansible_test/_internal/ci/azp.py +1 -0
  540. ansible_test/_internal/ci/local.py +1 -0
  541. ansible_test/_internal/classification/__init__.py +1 -0
  542. ansible_test/_internal/classification/common.py +1 -0
  543. ansible_test/_internal/classification/csharp.py +1 -0
  544. ansible_test/_internal/classification/powershell.py +1 -0
  545. ansible_test/_internal/classification/python.py +1 -0
  546. ansible_test/_internal/cli/__init__.py +1 -0
  547. ansible_test/_internal/cli/actions.py +1 -0
  548. ansible_test/_internal/cli/argparsing/__init__.py +1 -0
  549. ansible_test/_internal/cli/argparsing/actions.py +1 -0
  550. ansible_test/_internal/cli/argparsing/argcompletion.py +1 -0
  551. ansible_test/_internal/cli/argparsing/parsers.py +1 -0
  552. ansible_test/_internal/cli/commands/__init__.py +11 -5
  553. ansible_test/_internal/cli/commands/coverage/__init__.py +1 -0
  554. ansible_test/_internal/cli/commands/coverage/analyze/__init__.py +1 -0
  555. ansible_test/_internal/cli/commands/coverage/analyze/targets/__init__.py +1 -0
  556. ansible_test/_internal/cli/commands/coverage/analyze/targets/combine.py +1 -0
  557. ansible_test/_internal/cli/commands/coverage/analyze/targets/expand.py +1 -0
  558. ansible_test/_internal/cli/commands/coverage/analyze/targets/filter.py +1 -0
  559. ansible_test/_internal/cli/commands/coverage/analyze/targets/generate.py +1 -0
  560. ansible_test/_internal/cli/commands/coverage/analyze/targets/missing.py +1 -0
  561. ansible_test/_internal/cli/commands/coverage/combine.py +1 -0
  562. ansible_test/_internal/cli/commands/coverage/erase.py +1 -0
  563. ansible_test/_internal/cli/commands/coverage/html.py +1 -0
  564. ansible_test/_internal/cli/commands/coverage/report.py +1 -0
  565. ansible_test/_internal/cli/commands/coverage/xml.py +1 -0
  566. ansible_test/_internal/cli/commands/env.py +1 -0
  567. ansible_test/_internal/cli/commands/integration/__init__.py +1 -0
  568. ansible_test/_internal/cli/commands/integration/network.py +1 -0
  569. ansible_test/_internal/cli/commands/integration/posix.py +1 -0
  570. ansible_test/_internal/cli/commands/integration/windows.py +1 -0
  571. ansible_test/_internal/cli/commands/sanity.py +9 -0
  572. ansible_test/_internal/cli/commands/shell.py +1 -0
  573. ansible_test/_internal/cli/commands/units.py +1 -0
  574. ansible_test/_internal/cli/compat.py +1 -0
  575. ansible_test/_internal/cli/completers.py +1 -0
  576. ansible_test/_internal/cli/converters.py +1 -0
  577. ansible_test/_internal/cli/environments.py +52 -5
  578. ansible_test/_internal/cli/epilog.py +1 -0
  579. ansible_test/_internal/cli/parsers/__init__.py +1 -0
  580. ansible_test/_internal/cli/parsers/base_argument_parsers.py +1 -0
  581. ansible_test/_internal/cli/parsers/helpers.py +1 -0
  582. ansible_test/_internal/cli/parsers/host_config_parsers.py +1 -0
  583. ansible_test/_internal/cli/parsers/key_value_parsers.py +1 -0
  584. ansible_test/_internal/cli/parsers/value_parsers.py +1 -0
  585. ansible_test/_internal/commands/__init__.py +1 -0
  586. ansible_test/_internal/commands/coverage/__init__.py +3 -2
  587. ansible_test/_internal/commands/coverage/analyze/__init__.py +1 -0
  588. ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +1 -0
  589. ansible_test/_internal/commands/coverage/analyze/targets/combine.py +1 -0
  590. ansible_test/_internal/commands/coverage/analyze/targets/expand.py +1 -0
  591. ansible_test/_internal/commands/coverage/analyze/targets/filter.py +1 -0
  592. ansible_test/_internal/commands/coverage/analyze/targets/generate.py +1 -0
  593. ansible_test/_internal/commands/coverage/analyze/targets/missing.py +1 -0
  594. ansible_test/_internal/commands/coverage/combine.py +2 -1
  595. ansible_test/_internal/commands/coverage/erase.py +1 -0
  596. ansible_test/_internal/commands/coverage/html.py +1 -0
  597. ansible_test/_internal/commands/coverage/report.py +1 -0
  598. ansible_test/_internal/commands/coverage/xml.py +1 -0
  599. ansible_test/_internal/commands/env/__init__.py +2 -0
  600. ansible_test/_internal/commands/integration/__init__.py +22 -5
  601. ansible_test/_internal/commands/integration/cloud/__init__.py +1 -0
  602. ansible_test/_internal/commands/integration/cloud/acme.py +2 -1
  603. ansible_test/_internal/commands/integration/cloud/aws.py +1 -0
  604. ansible_test/_internal/commands/integration/cloud/azure.py +1 -0
  605. ansible_test/_internal/commands/integration/cloud/cs.py +1 -0
  606. ansible_test/_internal/commands/integration/cloud/digitalocean.py +1 -0
  607. ansible_test/_internal/commands/integration/cloud/galaxy.py +3 -2
  608. ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -0
  609. ansible_test/_internal/commands/integration/cloud/httptester.py +3 -2
  610. ansible_test/_internal/commands/integration/cloud/nios.py +2 -1
  611. ansible_test/_internal/commands/integration/cloud/opennebula.py +1 -0
  612. ansible_test/_internal/commands/integration/cloud/openshift.py +1 -0
  613. ansible_test/_internal/commands/integration/cloud/scaleway.py +1 -0
  614. ansible_test/_internal/commands/integration/cloud/vcenter.py +1 -0
  615. ansible_test/_internal/commands/integration/cloud/vultr.py +1 -0
  616. ansible_test/_internal/commands/integration/coverage.py +8 -2
  617. ansible_test/_internal/commands/integration/filters.py +1 -0
  618. ansible_test/_internal/commands/integration/network.py +1 -0
  619. ansible_test/_internal/commands/integration/posix.py +1 -0
  620. ansible_test/_internal/commands/integration/windows.py +1 -0
  621. ansible_test/_internal/commands/sanity/__init__.py +19 -2
  622. ansible_test/_internal/commands/sanity/ansible_doc.py +1 -0
  623. ansible_test/_internal/commands/sanity/bin_symlinks.py +1 -0
  624. ansible_test/_internal/commands/sanity/compile.py +1 -0
  625. ansible_test/_internal/commands/sanity/ignores.py +1 -0
  626. ansible_test/_internal/commands/sanity/import.py +1 -0
  627. ansible_test/_internal/commands/sanity/integration_aliases.py +12 -0
  628. ansible_test/_internal/commands/sanity/pep8.py +1 -0
  629. ansible_test/_internal/commands/sanity/pslint.py +1 -0
  630. ansible_test/_internal/commands/sanity/pylint.py +25 -26
  631. ansible_test/_internal/commands/sanity/shellcheck.py +1 -0
  632. ansible_test/_internal/commands/sanity/validate_modules.py +1 -0
  633. ansible_test/_internal/commands/sanity/yamllint.py +1 -0
  634. ansible_test/_internal/commands/shell/__init__.py +44 -4
  635. ansible_test/_internal/commands/units/__init__.py +5 -1
  636. ansible_test/_internal/compat/__init__.py +1 -0
  637. ansible_test/_internal/compat/packaging.py +1 -0
  638. ansible_test/_internal/compat/yaml.py +1 -0
  639. ansible_test/_internal/completion.py +1 -0
  640. ansible_test/_internal/config.py +23 -13
  641. ansible_test/_internal/connections.py +1 -0
  642. ansible_test/_internal/constants.py +1 -0
  643. ansible_test/_internal/containers.py +1 -0
  644. ansible_test/_internal/content_config.py +1 -0
  645. ansible_test/_internal/core_ci.py +1 -0
  646. ansible_test/_internal/coverage_util.py +11 -10
  647. ansible_test/_internal/data.py +1 -0
  648. ansible_test/_internal/debugging.py +166 -0
  649. ansible_test/_internal/delegation.py +22 -13
  650. ansible_test/_internal/dev/__init__.py +1 -0
  651. ansible_test/_internal/dev/container_probe.py +1 -0
  652. ansible_test/_internal/diff.py +3 -2
  653. ansible_test/_internal/docker_util.py +2 -1
  654. ansible_test/_internal/encoding.py +1 -0
  655. ansible_test/_internal/executor.py +1 -0
  656. ansible_test/_internal/git.py +1 -0
  657. ansible_test/_internal/host_configs.py +1 -0
  658. ansible_test/_internal/host_profiles.py +260 -16
  659. ansible_test/_internal/http.py +1 -0
  660. ansible_test/_internal/init.py +1 -0
  661. ansible_test/_internal/inventory.py +39 -3
  662. ansible_test/_internal/io.py +1 -0
  663. ansible_test/_internal/metadata.py +95 -4
  664. ansible_test/_internal/payload.py +1 -0
  665. ansible_test/_internal/processes.py +80 -0
  666. ansible_test/_internal/provider/__init__.py +1 -0
  667. ansible_test/_internal/provider/layout/__init__.py +1 -0
  668. ansible_test/_internal/provider/layout/ansible.py +1 -0
  669. ansible_test/_internal/provider/layout/collection.py +1 -0
  670. ansible_test/_internal/provider/layout/unsupported.py +1 -0
  671. ansible_test/_internal/provider/source/__init__.py +1 -0
  672. ansible_test/_internal/provider/source/git.py +1 -0
  673. ansible_test/_internal/provider/source/installed.py +1 -0
  674. ansible_test/_internal/provider/source/unsupported.py +1 -0
  675. ansible_test/_internal/provider/source/unversioned.py +1 -0
  676. ansible_test/_internal/provisioning.py +11 -4
  677. ansible_test/_internal/pypi_proxy.py +6 -5
  678. ansible_test/_internal/python_requirements.py +28 -0
  679. ansible_test/_internal/ssh.py +2 -5
  680. ansible_test/_internal/target.py +9 -0
  681. ansible_test/_internal/test.py +3 -2
  682. ansible_test/_internal/thread.py +3 -1
  683. ansible_test/_internal/timeout.py +2 -1
  684. ansible_test/_internal/util.py +41 -12
  685. ansible_test/_internal/util_common.py +18 -5
  686. ansible_test/_internal/venv.py +1 -0
  687. ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +1 -0
  688. ansible_test/_util/controller/sanity/code-smell/changelog/sphinx.py +1 -0
  689. ansible_test/_util/controller/sanity/code-smell/changelog.py +1 -0
  690. ansible_test/_util/controller/sanity/code-smell/empty-init.py +1 -0
  691. ansible_test/_util/controller/sanity/code-smell/line-endings.py +1 -0
  692. ansible_test/_util/controller/sanity/code-smell/no-assert.py +1 -0
  693. ansible_test/_util/controller/sanity/code-smell/no-get-exception.py +1 -0
  694. ansible_test/_util/controller/sanity/code-smell/no-illegal-filenames.py +1 -0
  695. ansible_test/_util/controller/sanity/code-smell/no-smart-quotes.py +1 -0
  696. ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py +1 -0
  697. ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +28 -1
  698. ansible_test/_util/controller/sanity/code-smell/shebang.py +1 -0
  699. ansible_test/_util/controller/sanity/code-smell/symlinks.py +1 -0
  700. ansible_test/_util/controller/sanity/code-smell/use-argspec-type-path.py +1 -0
  701. ansible_test/_util/controller/sanity/code-smell/use-compat-six.py +1 -0
  702. ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py +2 -1
  703. ansible_test/_util/controller/sanity/pep8/current-ignore.txt +4 -0
  704. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +8 -5
  705. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +8 -5
  706. ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +8 -5
  707. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +4 -5
  708. ansible_test/_util/controller/sanity/pylint/config/default.cfg +8 -7
  709. ansible_test/_util/controller/sanity/pylint/plugins/deprecated_calls.py +541 -0
  710. ansible_test/_util/controller/sanity/pylint/plugins/deprecated_comment.py +137 -0
  711. ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +1 -0
  712. ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +1 -8
  713. ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +1 -8
  714. ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +55 -28
  715. ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +12 -5
  716. ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +13 -2
  717. ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -0
  718. ansible_test/_util/controller/sanity/yamllint/yamllinter.py +35 -17
  719. ansible_test/_util/controller/tools/collection_detail.py +1 -0
  720. ansible_test/_util/controller/tools/yaml_to_json.py +2 -1
  721. ansible_test/_util/target/injector/python.py +8 -0
  722. ansible_test/_util/target/pytest/plugins/ansible_forked.py +6 -1
  723. ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +2 -1
  724. ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -0
  725. ansible_test/_util/target/sanity/compile/compile.py +1 -0
  726. ansible_test/_util/target/sanity/import/importer.py +15 -16
  727. ansible_test/_util/target/setup/bootstrap.sh +9 -20
  728. ansible_test/_util/target/setup/probe_cgroups.py +1 -0
  729. ansible_test/_util/target/setup/quiet_pip.py +1 -0
  730. ansible_test/_util/target/setup/requirements.py +38 -36
  731. ansible_test/_util/target/tools/virtualenvcheck.py +2 -1
  732. ansible_test/_util/target/tools/yamlcheck.py +2 -1
  733. ansible/compat/selectors.py +0 -32
  734. ansible/errors/yaml_strings.py +0 -138
  735. ansible/executor/action_write_locks.py +0 -44
  736. ansible/executor/discovery/python_target.py +0 -47
  737. ansible/executor/powershell/module_powershell_wrapper.ps1 +0 -86
  738. ansible/executor/powershell/module_script_wrapper.ps1 +0 -22
  739. ansible/module_utils/compat/importlib.py +0 -26
  740. ansible/module_utils/compat/selectors.py +0 -32
  741. ansible/module_utils/pycompat24.py +0 -73
  742. ansible/parsing/yaml/constructor.py +0 -178
  743. ansible/template/native_helpers.py +0 -251
  744. ansible/template/template.py +0 -43
  745. ansible/template/vars.py +0 -77
  746. ansible/utils/native_jinja.py +0 -11
  747. ansible/vars/fact_cache.py +0 -71
  748. ansible_core-2.18.7.dist-info/RECORD +0 -992
  749. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +0 -411
  750. {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/WHEEL +0 -0
  751. {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/entry_points.txt +0 -0
  752. {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/licenses/COPYING +0 -0
  753. {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/Apache-License.txt +0 -0
  754. {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/MIT-license.txt +0 -0
  755. {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/PSF-license.txt +0 -0
  756. {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/simplified_bsd.txt +0 -0
  757. {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,5 @@
1
1
  """Ansible specific pylint plugin for checking format string usage."""
2
+
2
3
  # (c) 2018, Matt Martz <matt@sivel.net>
3
4
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
4
5
  # -*- coding: utf-8 -*-
@@ -6,13 +7,6 @@ from __future__ import annotations
6
7
 
7
8
  import astroid
8
9
 
9
- # support pylint 2.x and 3.x -- remove when supporting only 3.x
10
- try:
11
- from pylint.interfaces import IAstroidChecker
12
- except ImportError:
13
- class IAstroidChecker:
14
- """Backwards compatibility for 2.x / 3.x support."""
15
-
16
10
  try:
17
11
  from pylint.checkers.utils import check_messages
18
12
  except ImportError:
@@ -38,7 +32,6 @@ class AnsibleStringFormatChecker(BaseChecker):
38
32
  is valid and the arguments match the format string.
39
33
  """
40
34
 
41
- __implements__ = (IAstroidChecker,)
42
35
  name = 'string'
43
36
  msgs = MSGS
44
37
 
@@ -1,4 +1,5 @@
1
1
  """A plugin for pylint to identify imports and functions which should not be used."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import os
@@ -6,13 +7,6 @@ import typing as t
6
7
 
7
8
  import astroid
8
9
 
9
- # support pylint 2.x and 3.x -- remove when supporting only 3.x
10
- try:
11
- from pylint.interfaces import IAstroidChecker
12
- except ImportError:
13
- class IAstroidChecker:
14
- """Backwards compatibility for 2.x / 3.x support."""
15
-
16
10
  from pylint.checkers import BaseChecker
17
11
 
18
12
  ANSIBLE_TEST_MODULES_PATH = os.environ['ANSIBLE_TEST_MODULES_PATH']
@@ -63,7 +57,6 @@ def is_module_path(path): # type: (str) -> bool
63
57
 
64
58
  class AnsibleUnwantedChecker(BaseChecker):
65
59
  """Checker for unwanted imports and functions."""
66
- __implements__ = (IAstroidChecker,)
67
60
 
68
61
  name = 'unwanted'
69
62
 
@@ -65,7 +65,7 @@ def setup_collection_loader():
65
65
  setup_collection_loader()
66
66
 
67
67
  from ansible import __version__ as ansible_version
68
- from ansible.executor.module_common import REPLACER_WINDOWS, NEW_STYLE_PYTHON_MODULE_RE
68
+ from ansible.executor.module_common import REPLACER_WINDOWS as _REPLACER_WINDOWS, NEW_STYLE_PYTHON_MODULE_RE
69
69
  from ansible.module_utils.common.collections import is_iterable
70
70
  from ansible.module_utils.common.parameters import DEFAULT_TYPE_VALIDATORS
71
71
  from ansible.module_utils.compat.version import StrictVersion, LooseVersion
@@ -90,7 +90,7 @@ from .utils import CaptureStd, NoArgsAnsibleModule, compare_unordered_lists, par
90
90
  TRY_EXCEPT = ast.Try
91
91
  # REPLACER_WINDOWS from ansible.executor.module_common is byte
92
92
  # string but we need unicode for Python 3
93
- REPLACER_WINDOWS = REPLACER_WINDOWS.decode('utf-8')
93
+ REPLACER_WINDOWS = _REPLACER_WINDOWS.decode('utf-8')
94
94
 
95
95
  REJECTLIST_DIRS = frozenset(('.git', 'test', '.github', '.idea'))
96
96
  INDENT_REGEX = re.compile(r'([\t]*)')
@@ -311,8 +311,8 @@ class ModuleValidator(Validator):
311
311
 
312
312
  self.analyze_arg_spec = analyze_arg_spec and plugin_type == 'module'
313
313
 
314
- self._Version = LooseVersion
315
- self._StrictVersion = StrictVersion
314
+ self._Version: type[LooseVersion | SemanticVersion] = LooseVersion
315
+ self._StrictVersion: type[StrictVersion | SemanticVersion] = StrictVersion
316
316
 
317
317
  self.collection = collection
318
318
  self.collection_name = 'ansible.builtin'
@@ -687,30 +687,57 @@ class ModuleValidator(Validator):
687
687
  # get module list for each
688
688
  # check "shape" of each module name
689
689
 
690
- module_requires = r'(?im)^#\s*requires\s+\-module(?:s?)\s*(Ansible\.ModuleUtils\..+)'
691
- csharp_requires = r'(?im)^#\s*ansiblerequires\s+\-csharputil\s*(Ansible\..+)'
690
+ legacy_ps_requires = r'(?im)^#\s*Requires\s+\-Module(?:s?)\s+(Ansible\.ModuleUtils\..+)'
691
+ ps_requires = r"""(?imx)
692
+ ^\#\s*AnsibleRequires\s+-PowerShell\s+
693
+ (
694
+ # Builtin PowerShell module
695
+ (Ansible\.ModuleUtils\.[\w\.]+)
696
+ |
697
+ # Fully qualified collection PowerShell module
698
+ (ansible_collections\.\w+\.\w+\.plugins\.module_utils\.[\w\.]+)
699
+ |
700
+ # Relative collection PowerShell module
701
+ (\.[\w\.]+)
702
+ )
703
+ (\s+-Optional)?"""
704
+ csharp_requires = r"""(?imx)
705
+ ^\#\s*AnsibleRequires\s+-CSharpUtil\s+
706
+ (
707
+ # Builtin C# util
708
+ (Ansible\.[\w\.]+)
709
+ |
710
+ # Fully qualified collection C# util
711
+ (ansible_collections\.\w+\.\w+\.plugins\.module_utils\.[\w\.]+)
712
+ |
713
+ # Relative collection C# util
714
+ (\.[\w\.]+)
715
+ )
716
+ (\s+-Optional)?"""
717
+
692
718
  found_requires = False
693
719
 
694
- for req_stmt in re.finditer(module_requires, self.text):
695
- found_requires = True
696
- # this will bomb on dictionary format - "don't do that"
697
- module_list = [x.strip() for x in req_stmt.group(1).split(',')]
698
- if len(module_list) > 1:
699
- self.reporter.error(
700
- path=self.object_path,
701
- code='multiple-utils-per-requires',
702
- msg='Ansible.ModuleUtils requirements do not support multiple modules per statement: "%s"' % req_stmt.group(0)
703
- )
704
- continue
720
+ for pattern, required_type in [(legacy_ps_requires, "Requires"), (ps_requires, "AnsibleRequires")]:
721
+ for req_stmt in re.finditer(pattern, self.text):
722
+ found_requires = True
723
+ # this will bomb on dictionary format - "don't do that"
724
+ module_list = [x.strip() for x in req_stmt.group(1).split(',')]
725
+ if len(module_list) > 1:
726
+ self.reporter.error(
727
+ path=self.object_path,
728
+ code='multiple-utils-per-requires',
729
+ msg='Ansible.ModuleUtils requirements do not support multiple modules per statement: "%s"' % req_stmt.group(0)
730
+ )
731
+ continue
705
732
 
706
- module_name = module_list[0]
733
+ module_name = module_list[0]
707
734
 
708
- if module_name.lower().endswith('.psm1'):
709
- self.reporter.error(
710
- path=self.object_path,
711
- code='invalid-requires-extension',
712
- msg='Module #Requires should not end in .psm1: "%s"' % module_name
713
- )
735
+ if module_name.lower().endswith('.psm1'):
736
+ self.reporter.error(
737
+ path=self.object_path,
738
+ code='invalid-requires-extension',
739
+ msg='Module #%s should not end in .psm1: "%s"' % (required_type, module_name)
740
+ )
714
741
 
715
742
  for req_stmt in re.finditer(csharp_requires, self.text):
716
743
  found_requires = True
@@ -979,7 +1006,7 @@ class ModuleValidator(Validator):
979
1006
  missing_fragment = False
980
1007
  with CaptureStd():
981
1008
  try:
982
- get_docstring(self.path, fragment_loader=fragment_loader,
1009
+ get_docstring(os.path.abspath(self.path), fragment_loader=fragment_loader,
983
1010
  verbose=True,
984
1011
  collection_name=self.collection_name,
985
1012
  plugin_type=self.plugin_type)
@@ -1003,7 +1030,7 @@ class ModuleValidator(Validator):
1003
1030
  )
1004
1031
 
1005
1032
  if not missing_fragment:
1006
- add_fragments(doc, self.object_path, fragment_loader=fragment_loader,
1033
+ add_fragments(doc, os.path.abspath(self.object_path), fragment_loader=fragment_loader,
1007
1034
  is_module=self.plugin_type == 'module')
1008
1035
 
1009
1036
  if 'options' in doc and doc['options'] is None:
@@ -1589,7 +1616,7 @@ class ModuleValidator(Validator):
1589
1616
 
1590
1617
  try:
1591
1618
  if not context:
1592
- add_fragments(docs, self.object_path, fragment_loader=fragment_loader,
1619
+ add_fragments(docs, os.path.abspath(self.object_path), fragment_loader=fragment_loader,
1593
1620
  is_module=self.plugin_type == 'module')
1594
1621
  except Exception:
1595
1622
  # Cannot merge fragments
@@ -2186,7 +2213,7 @@ class ModuleValidator(Validator):
2186
2213
  with CaptureStd():
2187
2214
  try:
2188
2215
  existing_doc, dummy_examples, dummy_return, existing_metadata = get_docstring(
2189
- self.base_module, fragment_loader, verbose=True, collection_name=self.collection_name,
2216
+ os.path.abspath(self.base_module), fragment_loader, verbose=True, collection_name=self.collection_name,
2190
2217
  is_module=self.plugin_type == 'module')
2191
2218
  existing_options = existing_doc.get('options', {}) or {}
2192
2219
  except AssertionError:
@@ -110,15 +110,22 @@ def get_ps_argument_spec(filename, collection):
110
110
  b_module_data = module_fd.read()
111
111
 
112
112
  ps_dep_finder = PSModuleDepFinder()
113
- ps_dep_finder.scan_module(b_module_data, fqn=fqc_name)
113
+ module_deps = ps_dep_finder.scan_module(b_module_data, fqn=fqc_name)
114
+ ansible_basic = ''
115
+ ps_utils = {}
116
+ for dep in module_deps:
117
+ dep_info = ps_dep_finder.scripts[dep]
114
118
 
115
- # For ps_argspec.ps1 to compile Ansible.Basic it also needs the AddType module_util.
116
- ps_dep_finder._add_module(name=b"Ansible.ModuleUtils.AddType", ext=".psm1", fqn=None, optional=False, wrapper=False)
119
+ if dep == 'Ansible.Basic.cs':
120
+ ansible_basic = dep_info.path
121
+
122
+ elif dep.endswith('.psm1'):
123
+ ps_utils[dep] = dep_info.path
117
124
 
118
125
  util_manifest = json.dumps({
119
126
  'module_path': to_text(module_path, errors='surrogate_or_strict'),
120
- 'ansible_basic': ps_dep_finder.cs_utils_module["Ansible.Basic"]['path'],
121
- 'ps_utils': {name: info['path'] for name, info in ps_dep_finder.ps_modules.items()}
127
+ 'ansible_basic': ansible_basic,
128
+ 'ps_utils': ps_utils,
122
129
  })
123
130
 
124
131
  script_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'ps_argspec.ps1')
@@ -67,6 +67,17 @@ def collection_name(v, error_code=None):
67
67
  return v
68
68
 
69
69
 
70
+ def fqcn(v, error_code=None):
71
+ if not isinstance(v, string_types):
72
+ raise _add_ansible_error_code(
73
+ Invalid('Module/plugin name must be a string'), error_code or 'invalid-documentation')
74
+ m = FULLY_QUALIFIED_COLLECTION_RESOURCE_RE.match(v)
75
+ if not m:
76
+ raise _add_ansible_error_code(
77
+ Invalid('Module/plugin name must be of format `<namespace>.<collection>.<name>(.<subname>)*`'), error_code or 'invalid-documentation')
78
+ return v
79
+
80
+
70
81
  def deprecation_versions():
71
82
  """Create a list of valid version for deprecation entries, current+4"""
72
83
  major, minor = [int(version) for version in __version__.split('.')[0:2]]
@@ -196,11 +207,11 @@ seealso_schema = Schema(
196
207
  [
197
208
  Any(
198
209
  {
199
- Required('module'): Any(*string_types),
210
+ Required('module'): fqcn,
200
211
  'description': doc_string,
201
212
  },
202
213
  {
203
- Required('plugin'): Any(*string_types),
214
+ Required('plugin'): fqcn,
204
215
  Required('plugin_type'): Any(*DOCUMENTABLE_PLUGINS),
205
216
  'description': doc_string,
206
217
  },
@@ -199,6 +199,7 @@ class NoArgsAnsibleModule(AnsibleModule):
199
199
  """AnsibleModule that does not actually load params. This is used to get access to the
200
200
  methods within AnsibleModule without having to fake a bunch of data
201
201
  """
202
+
202
203
  def _load_params(self):
203
204
  self.params = {'_ansible_selinux_special_fs': [], '_ansible_remote_tmp': '/tmp', '_ansible_keep_remote_files': False, '_ansible_check_mode': False}
204
205
 
@@ -1,7 +1,9 @@
1
1
  """Wrapper around yamllint that supports YAML embedded in Ansible modules."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import ast
6
+ import copy
5
7
  import json
6
8
  import os
7
9
  import re
@@ -9,10 +11,10 @@ import sys
9
11
  import typing as t
10
12
 
11
13
  import yaml
12
- from yaml.resolver import Resolver
13
- from yaml.constructor import SafeConstructor
14
+ from yaml.resolver import Resolver, BaseResolver
15
+ from yaml.constructor import SafeConstructor, ConstructorError
14
16
  from yaml.error import MarkedYAMLError
15
- from yaml.cyaml import CParser
17
+ from yaml.cyaml import CParser # type: ignore[attr-defined]
16
18
 
17
19
  from yamllint import linter
18
20
  from yamllint.config import YamlLintConfig
@@ -29,37 +31,49 @@ def main():
29
31
 
30
32
  class TestConstructor(SafeConstructor):
31
33
  """Yaml Safe Constructor that knows about Ansible tags."""
34
+
32
35
  def construct_yaml_unsafe(self, node):
33
36
  """Construct an unsafe tag."""
34
- try:
35
- constructor = getattr(node, 'id', 'object')
36
- if constructor is not None:
37
- constructor = getattr(self, 'construct_%s' % constructor)
38
- except AttributeError:
39
- constructor = self.construct_object
37
+ return self._resolve_and_construct_object(node)
38
+
39
+ def construct_yaml_vault(self, node):
40
+ """Construct a vault tag."""
41
+ ciphertext = self._resolve_and_construct_object(node)
42
+
43
+ if not isinstance(ciphertext, str):
44
+ raise ConstructorError(problem=f"the {node.tag!r} tag requires a string value", problem_mark=node.start_mark)
40
45
 
41
- value = constructor(node)
46
+ return ciphertext
42
47
 
43
- return value
48
+ def _resolve_and_construct_object(self, node):
49
+ # use a copied node to avoid mutating existing node and tripping the recursion check in construct_object
50
+ copied_node = copy.copy(node)
51
+ # repeat implicit resolution process to determine the proper tag for the value in the unsafe node
52
+ copied_node.tag = t.cast(BaseResolver, self).resolve(type(node), node.value, (True, False)) # pylint: disable=no-member
53
+
54
+ # re-entrant call using the correct tag
55
+ # non-deferred construction of hierarchical nodes so the result is a fully realized object, and so our stateful unsafe propagation behavior works
56
+ return self.construct_object(copied_node, deep=True)
44
57
 
45
58
 
46
59
  TestConstructor.add_constructor(
47
60
  '!unsafe',
48
- TestConstructor.construct_yaml_unsafe)
61
+ TestConstructor.construct_yaml_unsafe) # type: ignore[type-var]
49
62
 
50
63
 
51
64
  TestConstructor.add_constructor(
52
65
  '!vault',
53
- TestConstructor.construct_yaml_str)
66
+ TestConstructor.construct_yaml_vault) # type: ignore[type-var]
54
67
 
55
68
 
56
69
  TestConstructor.add_constructor(
57
70
  '!vault-encrypted',
58
- TestConstructor.construct_yaml_str)
71
+ TestConstructor.construct_yaml_vault) # type: ignore[type-var]
59
72
 
60
73
 
61
74
  class TestLoader(CParser, TestConstructor, Resolver):
62
75
  """Custom YAML loader that recognizes custom Ansible tags."""
76
+
63
77
  def __init__(self, stream):
64
78
  CParser.__init__(self, stream)
65
79
  TestConstructor.__init__(self)
@@ -68,6 +82,7 @@ class TestLoader(CParser, TestConstructor, Resolver):
68
82
 
69
83
  class YamlChecker:
70
84
  """Wrapper around yamllint that supports YAML embedded in Ansible modules."""
85
+
71
86
  def __init__(self):
72
87
  self.messages = []
73
88
 
@@ -135,11 +150,11 @@ class YamlChecker:
135
150
 
136
151
  self.messages += [self.result_to_message(r, path, lineno - 1, key) for r in messages]
137
152
 
138
- def check_parsable(self, path, contents, lineno=1, allow_multiple=False, prefix=""): # type: (str, str, int, bool) -> None
153
+ def check_parsable(self, path: str, contents: str, lineno: int = 1, allow_multiple: bool = False, prefix: str = "") -> None:
139
154
  """Check the given contents to verify they can be parsed as YAML."""
140
155
  prefix = f"{prefix}: " if prefix else ""
141
156
  try:
142
- documents = len(list(yaml.load_all(contents, Loader=TestLoader)))
157
+ documents = len(list(yaml.load_all(contents, Loader=TestLoader))) # type: ignore[arg-type]
143
158
  if documents > 1 and not allow_multiple:
144
159
  self.messages += [{'code': 'multiple-yaml-documents',
145
160
  'message': f'{prefix}expected a single document in the stream',
@@ -149,8 +164,11 @@ class YamlChecker:
149
164
  'level': 'error',
150
165
  }]
151
166
  except MarkedYAMLError as ex:
167
+ message = ' '.join(filter(None, (ex.context, ex.problem, ex.note)))
168
+ message = message.strip()
169
+
152
170
  self.messages += [{'code': 'unparsable-with-libyaml',
153
- 'message': f'{prefix}{ex.args[0]} - {ex.args[2]}',
171
+ 'message': f'{prefix}{message}',
154
172
  'path': path,
155
173
  'line': ex.problem_mark.line + lineno,
156
174
  'column': ex.problem_mark.column + 1,
@@ -1,4 +1,5 @@
1
1
  """Retrieve collection detail."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import json
@@ -1,4 +1,5 @@
1
1
  """Read YAML from stdin and write JSON to stdout."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import datetime
@@ -10,7 +11,7 @@ from yaml import load
10
11
  try:
11
12
  from yaml import CSafeLoader as SafeLoader
12
13
  except ImportError:
13
- from yaml import SafeLoader
14
+ from yaml import SafeLoader # type: ignore[assignment]
14
15
 
15
16
  # unique ISO date marker matching the one present in importer.py
16
17
  ISO_DATE_MARKER = 'isodate:f23983df-f3df-453c-9904-bcd08af468cc:'
@@ -15,6 +15,7 @@ def main():
15
15
  args = [sys.executable]
16
16
 
17
17
  ansible_lib_root = os.environ.get('ANSIBLE_TEST_ANSIBLE_LIB_ROOT')
18
+ debugger_config = os.environ.get('ANSIBLE_TEST_DEBUGGER_CONFIG')
18
19
  coverage_config = os.environ.get('COVERAGE_CONF')
19
20
  coverage_output = os.environ.get('COVERAGE_FILE')
20
21
 
@@ -28,6 +29,13 @@ def main():
28
29
  sys.exit('ERROR: Could not find `coverage` module. '
29
30
  'Did you use a virtualenv created without --system-site-packages or with the wrong interpreter?')
30
31
 
32
+ if debugger_config:
33
+ import json
34
+
35
+ debugger_options = json.loads(debugger_config)
36
+ os.environ.update(debugger_options['env'])
37
+ args += debugger_options['args']
38
+
31
39
  if name == 'python.py':
32
40
  if sys.argv[1] == '-c':
33
41
  # prevent simple misuse of python.py with -c which does not work with coverage
@@ -1,4 +1,5 @@
1
1
  """Run each test in its own fork. PYTEST_DONT_REWRITE"""
2
+
2
3
  # MIT License (see licenses/MIT-license.txt or https://opensource.org/licenses/MIT)
3
4
  # Based on code originally from:
4
5
  # https://github.com/pytest-dev/pytest-forked
@@ -63,6 +64,8 @@ def run_parent(item, pid, result_path): # type: (Item, int, str) -> list[TestRe
63
64
  """Wait for the child process to exit and return the test reports. Called in the parent process."""
64
65
  exit_code = waitstatus_to_exitcode(os.waitpid(pid, 0)[1])
65
66
 
67
+ reports: list[TestReport]
68
+
66
69
  if exit_code:
67
70
  reason = "Test CRASHED with exit code {}.".format(exit_code)
68
71
  report = TestReport(item.nodeid, item.location, {x: 1 for x in item.keywords}, "failed", reason, "call", user_properties=item.user_properties)
@@ -73,8 +76,10 @@ def run_parent(item, pid, result_path): # type: (Item, int, str) -> list[TestRe
73
76
 
74
77
  reports = [report]
75
78
  else:
79
+ captured_warnings: list[warnings.WarningMessage]
80
+
76
81
  with open(result_path, "rb") as result_file:
77
- reports, captured_warnings = pickle.load(result_file) # type: list[TestReport], list[warnings.WarningMessage]
82
+ reports, captured_warnings = pickle.load(result_file)
78
83
 
79
84
  for warning in captured_warnings:
80
85
  warnings.warn_explicit(warning.message, warning.category, warning.filename, warning.lineno)
@@ -1,4 +1,5 @@
1
1
  """Enable unit testing of Ansible collections. PYTEST_DONT_REWRITE"""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import os
@@ -69,7 +70,7 @@ def enable_assertion_rewriting_hook(): # type: () -> None
69
70
  # noinspection PyProtectedMember
70
71
  from ansible.utils.collection_loader._collection_finder import _AnsibleCollectionPkgLoaderBase
71
72
 
72
- _AnsibleCollectionPkgLoaderBase.exec_module = exec_module
73
+ _AnsibleCollectionPkgLoaderBase.exec_module = exec_module # type: ignore[method-assign]
73
74
 
74
75
 
75
76
  def pytest_configure():
@@ -1,4 +1,5 @@
1
1
  """Monkey patch os._exit when running under coverage so we don't lose coverage data in forks, such as with `pytest --boxed`. PYTEST_DONT_REWRITE"""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
 
@@ -1,4 +1,5 @@
1
1
  """Python syntax checker with lint friendly output."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import sys
@@ -1,4 +1,5 @@
1
1
  """Import the given python module(s) and report error(s) encountered."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
 
@@ -43,6 +44,7 @@ def main():
43
44
  # noinspection PyCompatibility
44
45
  from importlib import import_module
45
46
  except ImportError:
47
+
46
48
  def import_module(name, package=None): # type: (str, str | None) -> types.ModuleType
47
49
  assert package is None
48
50
  __import__(name)
@@ -60,11 +62,10 @@ def main():
60
62
 
61
63
  if collection_full_name:
62
64
  # allow importing code from collections when testing a collection
63
- from ansible.module_utils.common.text.converters import to_bytes, to_text, to_native, text_type
64
65
 
65
66
  # noinspection PyProtectedMember
66
67
  from ansible.utils.collection_loader._collection_finder import _AnsibleCollectionFinder
67
- from ansible.utils.collection_loader import _collection_finder
68
+ from ansible.utils.collection_loader import _collection_finder, _to_text
68
69
 
69
70
  yaml_to_dict_cache = {}
70
71
 
@@ -74,7 +75,7 @@ def main():
74
75
 
75
76
  def parse_value(value):
76
77
  """Custom value parser for JSON deserialization that recognizes our internal ISO date format."""
77
- if isinstance(value, text_type):
78
+ if isinstance(value, str):
78
79
  match = iso_date_re.search(value)
79
80
 
80
81
  if match:
@@ -86,7 +87,7 @@ def main():
86
87
  """Object hook for custom ISO date deserialization from JSON."""
87
88
  return dict((key, parse_value(value)) for key, value in data.items())
88
89
 
89
- def yaml_to_dict(yaml, content_id):
90
+ def yaml_to_dict(yaml: str | bytes, content_id):
90
91
  """
91
92
  Return a Python dict version of the provided YAML.
92
93
  Conversion is done in a subprocess since the current Python interpreter does not have access to PyYAML.
@@ -96,18 +97,18 @@ def main():
96
97
 
97
98
  try:
98
99
  cmd = [external_python, yaml_to_json_path]
99
- proc = subprocess.Popen([to_bytes(c) for c in cmd], # pylint: disable=consider-using-with
100
- stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
101
- stdout_bytes, stderr_bytes = proc.communicate(to_bytes(yaml))
100
+ proc = subprocess.Popen(cmd, # pylint: disable=consider-using-with
101
+ stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
102
+ stdout, stderr = proc.communicate(_to_text(yaml))
102
103
 
103
104
  if proc.returncode != 0:
104
- raise Exception('command %s failed with return code %d: %s' % ([to_native(c) for c in cmd], proc.returncode, to_native(stderr_bytes)))
105
+ raise Exception('command %s failed with return code %d: %s' % (cmd, proc.returncode, stderr))
105
106
 
106
- data = yaml_to_dict_cache[content_id] = json.loads(to_text(stdout_bytes), object_hook=object_hook)
107
+ data = yaml_to_dict_cache[content_id] = json.loads(stdout, object_hook=object_hook)
107
108
 
108
109
  return data
109
110
  except Exception as ex:
110
- raise Exception('internal importer error - failed to parse yaml: %s' % to_native(ex))
111
+ raise Exception(f'internal importer error - failed to parse yaml: {ex}')
111
112
 
112
113
  _collection_finder._meta_yml_to_dict = yaml_to_dict # pylint: disable=protected-access
113
114
 
@@ -142,11 +143,13 @@ def main():
142
143
 
143
144
  class ImporterAnsibleModule:
144
145
  """Replacement for AnsibleModule to support import testing."""
146
+
145
147
  def __init__(self, *args, **kwargs):
146
148
  raise ImporterAnsibleModuleException()
147
149
 
148
150
  class RestrictedModuleLoader:
149
151
  """Python module loader that restricts inappropriate imports."""
152
+
150
153
  def __init__(self, path, name, restrict_to_module_paths):
151
154
  self.path = path
152
155
  self.name = name
@@ -431,6 +434,7 @@ def main():
431
434
 
432
435
  class Capture:
433
436
  """Captured output and/or exception."""
437
+
434
438
  def __init__(self):
435
439
  # use buffered IO to simulate StringIO; allows Ansible's stream patching to behave without warnings
436
440
  self.stdout = TextIOWrapper(BytesIO())
@@ -489,6 +493,7 @@ def main():
489
493
  finally:
490
494
  if import_type == 'plugin' and not collection_loader:
491
495
  from ansible.utils.collection_loader._collection_finder import _AnsibleCollectionFinder
496
+
492
497
  _AnsibleCollectionFinder._remove() # pylint: disable=protected-access
493
498
 
494
499
  if sys.meta_path[0] != restricted_loader:
@@ -541,12 +546,6 @@ def main():
541
546
  "ignore",
542
547
  "AnsibleCollectionFinder has already been configured")
543
548
 
544
- # ansible.utils.unsafe_proxy attempts patching sys.intern generating a warning if it was already patched
545
- warnings.filterwarnings(
546
- "ignore",
547
- "skipped sys.intern patch; appears to have already been patched"
548
- )
549
-
550
549
  try:
551
550
  yield
552
551
  finally: