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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (710) hide show
  1. ansible/_internal/__init__.py +53 -0
  2. ansible/_internal/_ansiballz.py +265 -0
  3. ansible/_internal/_collection_proxy.py +47 -0
  4. ansible/_internal/_datatag/__init__.py +0 -0
  5. ansible/_internal/_datatag/_tags.py +130 -0
  6. ansible/_internal/_datatag/_utils.py +19 -0
  7. ansible/_internal/_datatag/_wrappers.py +33 -0
  8. ansible/_internal/_errors/__init__.py +0 -0
  9. ansible/_internal/_errors/_captured.py +128 -0
  10. ansible/_internal/_errors/_handler.py +91 -0
  11. ansible/_internal/_errors/_utils.py +310 -0
  12. ansible/_internal/_json/__init__.py +203 -0
  13. ansible/_internal/_json/_legacy_encoder.py +34 -0
  14. ansible/_internal/_json/_profiles/__init__.py +0 -0
  15. ansible/_internal/_json/_profiles/_cache_persistence.py +55 -0
  16. ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
  17. ansible/_internal/_json/_profiles/_legacy.py +197 -0
  18. ansible/_internal/_locking.py +21 -0
  19. ansible/_internal/_plugins/__init__.py +0 -0
  20. ansible/_internal/_plugins/_cache.py +57 -0
  21. ansible/_internal/_task.py +78 -0
  22. ansible/_internal/_templating/__init__.py +10 -0
  23. ansible/_internal/_templating/_access.py +86 -0
  24. ansible/_internal/_templating/_chain_templar.py +63 -0
  25. ansible/_internal/_templating/_datatag.py +95 -0
  26. ansible/_internal/_templating/_engine.py +588 -0
  27. ansible/_internal/_templating/_errors.py +28 -0
  28. ansible/_internal/_templating/_jinja_bits.py +1066 -0
  29. ansible/_internal/_templating/_jinja_common.py +332 -0
  30. ansible/_internal/_templating/_jinja_patches.py +44 -0
  31. ansible/_internal/_templating/_jinja_plugins.py +345 -0
  32. ansible/_internal/_templating/_lazy_containers.py +633 -0
  33. ansible/_internal/_templating/_marker_behaviors.py +103 -0
  34. ansible/_internal/_templating/_transform.py +63 -0
  35. ansible/_internal/_templating/_utils.py +107 -0
  36. ansible/_internal/_wrapt.py +1052 -0
  37. ansible/_internal/_yaml/__init__.py +0 -0
  38. ansible/_internal/_yaml/_constructor.py +240 -0
  39. ansible/_internal/_yaml/_dumper.py +62 -0
  40. ansible/_internal/_yaml/_errors.py +166 -0
  41. ansible/_internal/_yaml/_loader.py +66 -0
  42. ansible/_internal/ansible_collections/ansible/_protomatter/README.md +11 -0
  43. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/action/debug.py +36 -0
  44. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/apply_trust.py +19 -0
  45. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/dump_object.py +18 -0
  46. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/finalize.py +16 -0
  47. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/origin.py +18 -0
  48. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.py +24 -0
  49. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.yml +33 -0
  50. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/tag_names.py +16 -0
  51. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +17 -0
  52. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +49 -0
  53. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.py +21 -0
  54. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.yml +2 -0
  55. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.py +15 -0
  56. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.yml +19 -0
  57. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.py +18 -0
  58. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.yml +19 -0
  59. ansible/cli/__init__.py +159 -89
  60. ansible/cli/_ssh_askpass.py +47 -0
  61. ansible/cli/adhoc.py +14 -7
  62. ansible/cli/arguments/option_helpers.py +154 -7
  63. ansible/cli/config.py +43 -68
  64. ansible/cli/console.py +10 -8
  65. ansible/cli/doc.py +62 -53
  66. ansible/cli/galaxy.py +27 -20
  67. ansible/cli/inventory.py +28 -26
  68. ansible/cli/playbook.py +4 -12
  69. ansible/cli/pull.py +51 -11
  70. ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
  71. ansible/cli/vault.py +12 -11
  72. ansible/compat/__init__.py +2 -2
  73. ansible/config/base.yml +166 -112
  74. ansible/config/manager.py +52 -49
  75. ansible/constants.py +3 -4
  76. ansible/errors/__init__.py +277 -235
  77. ansible/executor/interpreter_discovery.py +28 -149
  78. ansible/executor/module_common.py +426 -493
  79. ansible/executor/play_iterator.py +22 -27
  80. ansible/executor/playbook_executor.py +11 -11
  81. ansible/executor/powershell/async_watchdog.ps1 +97 -102
  82. ansible/executor/powershell/async_wrapper.ps1 +202 -151
  83. ansible/executor/powershell/become_wrapper.ps1 +89 -144
  84. ansible/executor/powershell/bootstrap_wrapper.ps1 +24 -9
  85. ansible/executor/powershell/coverage_wrapper.ps1 +82 -135
  86. ansible/executor/powershell/exec_wrapper.ps1 +462 -196
  87. ansible/executor/powershell/module_manifest.py +417 -265
  88. ansible/executor/powershell/module_wrapper.ps1 +169 -186
  89. ansible/executor/powershell/psrp_fetch_file.ps1 +41 -0
  90. ansible/executor/powershell/psrp_put_file.ps1 +122 -0
  91. ansible/executor/powershell/winrm_fetch_file.ps1 +46 -0
  92. ansible/executor/powershell/winrm_put_file.ps1 +36 -0
  93. ansible/executor/process/worker.py +161 -96
  94. ansible/executor/stats.py +5 -5
  95. ansible/executor/task_executor.py +268 -258
  96. ansible/executor/task_queue_manager.py +124 -90
  97. ansible/executor/task_result.py +183 -78
  98. ansible/galaxy/__init__.py +2 -2
  99. ansible/galaxy/api.py +22 -18
  100. ansible/galaxy/collection/__init__.py +1 -1
  101. ansible/galaxy/collection/concrete_artifact_manager.py +8 -11
  102. ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
  103. ansible/galaxy/dependency_resolution/providers.py +1 -1
  104. ansible/galaxy/dependency_resolution/reporters.py +81 -0
  105. ansible/galaxy/role.py +4 -8
  106. ansible/galaxy/token.py +28 -21
  107. ansible/inventory/data.py +47 -57
  108. ansible/inventory/group.py +44 -72
  109. ansible/inventory/helpers.py +9 -0
  110. ansible/inventory/host.py +32 -54
  111. ansible/inventory/manager.py +78 -34
  112. ansible/keyword_desc.yml +1 -1
  113. ansible/module_utils/_internal/__init__.py +55 -0
  114. ansible/module_utils/_internal/_ambient_context.py +58 -0
  115. ansible/module_utils/_internal/_ansiballz.py +133 -0
  116. ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
  117. ansible/module_utils/_internal/_dataclass_annotation_patch.py +64 -0
  118. ansible/module_utils/_internal/_dataclass_validation.py +217 -0
  119. ansible/module_utils/_internal/_datatag/__init__.py +928 -0
  120. ansible/module_utils/_internal/_datatag/_tags.py +38 -0
  121. ansible/module_utils/_internal/_debugging.py +31 -0
  122. ansible/module_utils/_internal/_errors.py +30 -0
  123. ansible/module_utils/_internal/_json/__init__.py +63 -0
  124. ansible/module_utils/_internal/_json/_legacy_encoder.py +26 -0
  125. ansible/module_utils/_internal/_json/_profiles/__init__.py +410 -0
  126. ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
  127. ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +31 -0
  128. ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +35 -0
  129. ansible/module_utils/_internal/_json/_profiles/_module_modern_c2m.py +35 -0
  130. ansible/module_utils/_internal/_json/_profiles/_module_modern_m2c.py +33 -0
  131. ansible/module_utils/_internal/_json/_profiles/_tagless.py +50 -0
  132. ansible/module_utils/_internal/_patches/__init__.py +66 -0
  133. ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +55 -0
  134. ansible/module_utils/_internal/_patches/_socket_patch.py +34 -0
  135. ansible/module_utils/_internal/_patches/_sys_intern_patch.py +34 -0
  136. ansible/module_utils/_internal/_plugin_exec_context.py +49 -0
  137. ansible/module_utils/_internal/_testing.py +0 -0
  138. ansible/module_utils/_internal/_traceback.py +89 -0
  139. ansible/module_utils/ansible_release.py +2 -2
  140. ansible/module_utils/api.py +1 -2
  141. ansible/module_utils/basic.py +152 -120
  142. ansible/module_utils/common/_utils.py +24 -28
  143. ansible/module_utils/common/collections.py +1 -2
  144. ansible/module_utils/common/dict_transformations.py +2 -2
  145. ansible/module_utils/common/file.py +2 -2
  146. ansible/module_utils/common/json.py +90 -84
  147. ansible/module_utils/common/locale.py +2 -2
  148. ansible/module_utils/common/messages.py +108 -0
  149. ansible/module_utils/common/parameters.py +27 -24
  150. ansible/module_utils/common/process.py +2 -2
  151. ansible/module_utils/common/respawn.py +41 -19
  152. ansible/module_utils/common/sentinel.py +66 -0
  153. ansible/module_utils/common/sys_info.py +8 -8
  154. ansible/module_utils/common/text/converters.py +16 -37
  155. ansible/module_utils/common/validation.py +35 -24
  156. ansible/module_utils/common/warnings.py +86 -25
  157. ansible/module_utils/common/yaml.py +29 -3
  158. ansible/module_utils/compat/datetime.py +33 -21
  159. ansible/module_utils/compat/paramiko.py +21 -10
  160. ansible/module_utils/compat/typing.py +6 -5
  161. ansible/module_utils/connection.py +2 -2
  162. ansible/module_utils/csharp/Ansible.Basic.cs +14 -11
  163. ansible/module_utils/csharp/Ansible.Become.cs +1 -0
  164. ansible/module_utils/csharp/Ansible._Async.cs +517 -0
  165. ansible/module_utils/datatag.py +46 -0
  166. ansible/module_utils/distro/__init__.py +2 -2
  167. ansible/module_utils/facts/ansible_collector.py +4 -5
  168. ansible/module_utils/facts/collector.py +13 -14
  169. ansible/module_utils/facts/compat.py +4 -4
  170. ansible/module_utils/facts/default_collectors.py +1 -1
  171. ansible/module_utils/facts/hardware/aix.py +34 -0
  172. ansible/module_utils/facts/hardware/base.py +1 -1
  173. ansible/module_utils/facts/hardware/darwin.py +1 -3
  174. ansible/module_utils/facts/hardware/freebsd.py +2 -2
  175. ansible/module_utils/facts/hardware/linux.py +4 -4
  176. ansible/module_utils/facts/namespace.py +1 -1
  177. ansible/module_utils/facts/network/base.py +1 -1
  178. ansible/module_utils/facts/network/fc_wwn.py +1 -2
  179. ansible/module_utils/facts/network/iscsi.py +1 -2
  180. ansible/module_utils/facts/network/nvme.py +1 -2
  181. ansible/module_utils/facts/other/facter.py +1 -2
  182. ansible/module_utils/facts/other/ohai.py +2 -3
  183. ansible/module_utils/facts/system/apparmor.py +1 -2
  184. ansible/module_utils/facts/system/caps.py +1 -1
  185. ansible/module_utils/facts/system/chroot.py +1 -2
  186. ansible/module_utils/facts/system/cmdline.py +1 -2
  187. ansible/module_utils/facts/system/date_time.py +5 -3
  188. ansible/module_utils/facts/system/distribution.py +9 -8
  189. ansible/module_utils/facts/system/dns.py +1 -1
  190. ansible/module_utils/facts/system/env.py +1 -2
  191. ansible/module_utils/facts/system/fips.py +7 -20
  192. ansible/module_utils/facts/system/loadavg.py +1 -2
  193. ansible/module_utils/facts/system/local.py +1 -2
  194. ansible/module_utils/facts/system/lsb.py +1 -2
  195. ansible/module_utils/facts/system/pkg_mgr.py +1 -2
  196. ansible/module_utils/facts/system/platform.py +1 -2
  197. ansible/module_utils/facts/system/python.py +1 -2
  198. ansible/module_utils/facts/system/selinux.py +1 -1
  199. ansible/module_utils/facts/system/service_mgr.py +1 -2
  200. ansible/module_utils/facts/system/ssh_pub_keys.py +1 -1
  201. ansible/module_utils/facts/system/systemd.py +1 -1
  202. ansible/module_utils/facts/system/user.py +1 -2
  203. ansible/module_utils/facts/utils.py +3 -3
  204. ansible/module_utils/facts/virtual/base.py +1 -1
  205. ansible/module_utils/facts/virtual/sunos.py +3 -15
  206. ansible/module_utils/facts/virtual/sysctl.py +3 -16
  207. ansible/module_utils/json_utils.py +2 -2
  208. ansible/module_utils/parsing/convert_bool.py +1 -1
  209. ansible/module_utils/service.py +18 -21
  210. ansible/module_utils/splitter.py +7 -7
  211. ansible/module_utils/testing.py +31 -0
  212. ansible/module_utils/urls.py +60 -31
  213. ansible/modules/add_host.py +4 -4
  214. ansible/modules/apt.py +60 -46
  215. ansible/modules/apt_key.py +19 -12
  216. ansible/modules/apt_repository.py +19 -16
  217. ansible/modules/assemble.py +6 -6
  218. ansible/modules/assert.py +4 -4
  219. ansible/modules/async_status.py +10 -12
  220. ansible/modules/async_wrapper.py +8 -3
  221. ansible/modules/blockinfile.py +6 -7
  222. ansible/modules/command.py +10 -17
  223. ansible/modules/copy.py +57 -144
  224. ansible/modules/cron.py +20 -15
  225. ansible/modules/deb822_repository.py +8 -9
  226. ansible/modules/debconf.py +5 -5
  227. ansible/modules/debug.py +4 -4
  228. ansible/modules/dnf.py +8 -8
  229. ansible/modules/dnf5.py +39 -13
  230. ansible/modules/dpkg_selections.py +4 -4
  231. ansible/modules/expect.py +8 -10
  232. ansible/modules/fail.py +4 -4
  233. ansible/modules/fetch.py +4 -4
  234. ansible/modules/file.py +174 -133
  235. ansible/modules/find.py +19 -17
  236. ansible/modules/gather_facts.py +3 -3
  237. ansible/modules/get_url.py +59 -53
  238. ansible/modules/getent.py +7 -9
  239. ansible/modules/git.py +28 -25
  240. ansible/modules/group.py +6 -6
  241. ansible/modules/group_by.py +4 -4
  242. ansible/modules/hostname.py +13 -29
  243. ansible/modules/import_playbook.py +6 -6
  244. ansible/modules/import_role.py +6 -6
  245. ansible/modules/import_tasks.py +6 -6
  246. ansible/modules/include_role.py +6 -6
  247. ansible/modules/include_tasks.py +6 -6
  248. ansible/modules/include_vars.py +6 -6
  249. ansible/modules/iptables.py +86 -73
  250. ansible/modules/known_hosts.py +10 -10
  251. ansible/modules/lineinfile.py +5 -5
  252. ansible/modules/meta.py +4 -4
  253. ansible/modules/mount_facts.py +2 -2
  254. ansible/modules/package.py +4 -4
  255. ansible/modules/package_facts.py +22 -10
  256. ansible/modules/pause.py +6 -6
  257. ansible/modules/ping.py +6 -6
  258. ansible/modules/pip.py +10 -11
  259. ansible/modules/raw.py +4 -4
  260. ansible/modules/reboot.py +6 -6
  261. ansible/modules/replace.py +9 -13
  262. ansible/modules/rpm_key.py +7 -8
  263. ansible/modules/script.py +4 -4
  264. ansible/modules/service.py +7 -8
  265. ansible/modules/service_facts.py +87 -10
  266. ansible/modules/set_fact.py +5 -5
  267. ansible/modules/set_stats.py +4 -4
  268. ansible/modules/setup.py +2 -2
  269. ansible/modules/shell.py +6 -6
  270. ansible/modules/slurp.py +6 -6
  271. ansible/modules/stat.py +9 -23
  272. ansible/modules/subversion.py +15 -15
  273. ansible/modules/systemd.py +6 -6
  274. ansible/modules/systemd_service.py +6 -6
  275. ansible/modules/sysvinit.py +6 -6
  276. ansible/modules/tempfile.py +5 -6
  277. ansible/modules/template.py +6 -6
  278. ansible/modules/unarchive.py +32 -11
  279. ansible/modules/uri.py +33 -26
  280. ansible/modules/user.py +53 -34
  281. ansible/modules/validate_argument_spec.py +10 -7
  282. ansible/modules/wait_for.py +32 -27
  283. ansible/modules/wait_for_connection.py +6 -6
  284. ansible/modules/yum_repository.py +6 -6
  285. ansible/parsing/ajson.py +14 -32
  286. ansible/parsing/dataloader.py +99 -54
  287. ansible/parsing/mod_args.py +28 -44
  288. ansible/parsing/plugin_docs.py +21 -86
  289. ansible/parsing/quoting.py +1 -1
  290. ansible/parsing/splitter.py +27 -12
  291. ansible/parsing/utils/addresses.py +24 -24
  292. ansible/parsing/utils/jsonify.py +5 -1
  293. ansible/parsing/utils/yaml.py +32 -61
  294. ansible/parsing/vault/__init__.py +319 -87
  295. ansible/parsing/yaml/__init__.py +0 -18
  296. ansible/parsing/yaml/dumper.py +6 -120
  297. ansible/parsing/yaml/loader.py +6 -39
  298. ansible/parsing/yaml/objects.py +43 -335
  299. ansible/playbook/__init__.py +1 -1
  300. ansible/playbook/attribute.py +8 -3
  301. ansible/playbook/base.py +182 -132
  302. ansible/playbook/block.py +26 -24
  303. ansible/playbook/collectionsearch.py +1 -15
  304. ansible/playbook/conditional.py +3 -77
  305. ansible/playbook/handler.py +8 -2
  306. ansible/playbook/helpers.py +41 -53
  307. ansible/playbook/included_file.py +31 -27
  308. ansible/playbook/loop_control.py +2 -2
  309. ansible/playbook/play.py +85 -44
  310. ansible/playbook/play_context.py +12 -17
  311. ansible/playbook/playbook_include.py +14 -15
  312. ansible/playbook/role/__init__.py +24 -26
  313. ansible/playbook/role/definition.py +15 -17
  314. ansible/playbook/role/include.py +2 -4
  315. ansible/playbook/role/metadata.py +10 -11
  316. ansible/playbook/role_include.py +3 -3
  317. ansible/playbook/taggable.py +13 -8
  318. ansible/playbook/task.py +188 -118
  319. ansible/playbook/task_include.py +5 -5
  320. ansible/plugins/__init__.py +68 -21
  321. ansible/plugins/action/__init__.py +209 -176
  322. ansible/plugins/action/add_host.py +1 -1
  323. ansible/plugins/action/assemble.py +1 -1
  324. ansible/plugins/action/assert.py +54 -66
  325. ansible/plugins/action/copy.py +7 -11
  326. ansible/plugins/action/debug.py +37 -31
  327. ansible/plugins/action/dnf.py +3 -4
  328. ansible/plugins/action/fail.py +1 -1
  329. ansible/plugins/action/fetch.py +4 -5
  330. ansible/plugins/action/gather_facts.py +7 -6
  331. ansible/plugins/action/group_by.py +1 -1
  332. ansible/plugins/action/include_vars.py +10 -11
  333. ansible/plugins/action/package.py +3 -6
  334. ansible/plugins/action/pause.py +2 -2
  335. ansible/plugins/action/script.py +15 -8
  336. ansible/plugins/action/service.py +6 -11
  337. ansible/plugins/action/set_fact.py +3 -12
  338. ansible/plugins/action/set_stats.py +3 -8
  339. ansible/plugins/action/template.py +35 -59
  340. ansible/plugins/action/unarchive.py +1 -1
  341. ansible/plugins/action/validate_argument_spec.py +5 -5
  342. ansible/plugins/action/wait_for_connection.py +1 -1
  343. ansible/plugins/become/__init__.py +31 -8
  344. ansible/plugins/become/runas.py +71 -0
  345. ansible/plugins/become/su.py +13 -8
  346. ansible/plugins/become/sudo.py +19 -0
  347. ansible/plugins/cache/__init__.py +35 -44
  348. ansible/plugins/cache/base.py +8 -0
  349. ansible/plugins/cache/jsonfile.py +10 -16
  350. ansible/plugins/cache/memory.py +6 -12
  351. ansible/plugins/callback/__init__.py +284 -179
  352. ansible/plugins/callback/default.py +99 -92
  353. ansible/plugins/callback/junit.py +44 -39
  354. ansible/plugins/callback/minimal.py +28 -25
  355. ansible/plugins/callback/oneline.py +28 -21
  356. ansible/plugins/callback/tree.py +16 -11
  357. ansible/plugins/connection/__init__.py +47 -34
  358. ansible/plugins/connection/local.py +150 -54
  359. ansible/plugins/connection/paramiko_ssh.py +21 -18
  360. ansible/plugins/connection/psrp.py +76 -165
  361. ansible/plugins/connection/ssh.py +301 -78
  362. ansible/plugins/connection/winrm.py +58 -140
  363. ansible/plugins/doc_fragments/action_common_attributes.py +14 -14
  364. ansible/plugins/doc_fragments/action_core.py +6 -6
  365. ansible/plugins/doc_fragments/backup.py +2 -2
  366. ansible/plugins/doc_fragments/checksum_common.py +27 -0
  367. ansible/plugins/doc_fragments/constructed.py +6 -2
  368. ansible/plugins/doc_fragments/decrypt.py +2 -2
  369. ansible/plugins/doc_fragments/default_callback.py +2 -2
  370. ansible/plugins/doc_fragments/files.py +2 -2
  371. ansible/plugins/doc_fragments/inventory_cache.py +2 -2
  372. ansible/plugins/doc_fragments/result_format_callback.py +2 -2
  373. ansible/plugins/doc_fragments/return_common.py +2 -2
  374. ansible/plugins/doc_fragments/template_common.py +4 -4
  375. ansible/plugins/doc_fragments/url.py +17 -1
  376. ansible/plugins/doc_fragments/url_windows.py +2 -2
  377. ansible/plugins/doc_fragments/validate.py +2 -2
  378. ansible/plugins/doc_fragments/vars_plugin_staging.py +2 -2
  379. ansible/plugins/filter/__init__.py +6 -2
  380. ansible/plugins/filter/b64decode.yml +22 -0
  381. ansible/plugins/filter/b64encode.yml +22 -0
  382. ansible/plugins/filter/bool.yml +11 -4
  383. ansible/plugins/filter/core.py +225 -108
  384. ansible/plugins/filter/encryption.py +32 -32
  385. ansible/plugins/filter/flatten.yml +3 -2
  386. ansible/plugins/filter/human_to_bytes.yml +1 -1
  387. ansible/plugins/filter/mathstuff.py +30 -37
  388. ansible/plugins/filter/password_hash.yml +8 -0
  389. ansible/plugins/filter/regex_search.yml +1 -4
  390. ansible/plugins/filter/split.yml +1 -1
  391. ansible/plugins/filter/to_nice_yaml.yml +0 -4
  392. ansible/plugins/filter/to_yaml.yml +0 -4
  393. ansible/plugins/filter/unvault.yml +1 -1
  394. ansible/plugins/filter/urls.py +1 -1
  395. ansible/plugins/filter/urlsplit.py +8 -9
  396. ansible/plugins/filter/vault.yml +14 -9
  397. ansible/plugins/filter/win_basename.yml +6 -1
  398. ansible/plugins/filter/win_dirname.yml +5 -0
  399. ansible/plugins/inventory/__init__.py +97 -77
  400. ansible/plugins/inventory/advanced_host_list.py +7 -5
  401. ansible/plugins/inventory/auto.py +11 -4
  402. ansible/plugins/inventory/constructed.py +21 -24
  403. ansible/plugins/inventory/generator.py +16 -11
  404. ansible/plugins/inventory/host_list.py +7 -5
  405. ansible/plugins/inventory/ini.py +78 -44
  406. ansible/plugins/inventory/script.py +189 -119
  407. ansible/plugins/inventory/toml.py +16 -126
  408. ansible/plugins/inventory/yaml.py +10 -8
  409. ansible/plugins/list.py +3 -3
  410. ansible/plugins/loader.py +197 -82
  411. ansible/plugins/lookup/__init__.py +21 -4
  412. ansible/plugins/lookup/config.py +21 -35
  413. ansible/plugins/lookup/csvfile.py +3 -2
  414. ansible/plugins/lookup/dict.py +1 -6
  415. ansible/plugins/lookup/env.py +12 -9
  416. ansible/plugins/lookup/file.py +5 -8
  417. ansible/plugins/lookup/first_found.py +86 -55
  418. ansible/plugins/lookup/indexed_items.py +1 -10
  419. ansible/plugins/lookup/ini.py +14 -13
  420. ansible/plugins/lookup/items.py +1 -1
  421. ansible/plugins/lookup/lines.py +8 -1
  422. ansible/plugins/lookup/list.py +1 -1
  423. ansible/plugins/lookup/nested.py +2 -18
  424. ansible/plugins/lookup/password.py +5 -5
  425. ansible/plugins/lookup/pipe.py +5 -7
  426. ansible/plugins/lookup/sequence.py +18 -8
  427. ansible/plugins/lookup/subelements.py +1 -4
  428. ansible/plugins/lookup/template.py +42 -36
  429. ansible/plugins/lookup/together.py +0 -12
  430. ansible/plugins/lookup/unvault.py +1 -5
  431. ansible/plugins/lookup/url.py +2 -8
  432. ansible/plugins/lookup/vars.py +16 -24
  433. ansible/plugins/shell/__init__.py +2 -2
  434. ansible/plugins/shell/cmd.py +2 -2
  435. ansible/plugins/shell/powershell.py +39 -22
  436. ansible/plugins/shell/sh.py +3 -2
  437. ansible/plugins/strategy/__init__.py +159 -184
  438. ansible/plugins/strategy/debug.py +2 -2
  439. ansible/plugins/strategy/free.py +16 -31
  440. ansible/plugins/strategy/host_pinned.py +2 -2
  441. ansible/plugins/strategy/linear.py +41 -41
  442. ansible/plugins/terminal/__init__.py +4 -4
  443. ansible/plugins/test/__init__.py +7 -2
  444. ansible/plugins/test/core.py +55 -21
  445. ansible/plugins/test/files.py +1 -1
  446. ansible/plugins/test/mathstuff.py +3 -3
  447. ansible/plugins/test/uri.py +3 -3
  448. ansible/plugins/vars/host_group_vars.py +7 -14
  449. ansible/release.py +2 -2
  450. ansible/template/__init__.py +370 -944
  451. ansible/utils/__init__.py +0 -18
  452. ansible/utils/_ssh_agent.py +657 -0
  453. ansible/utils/collection_loader/__init__.py +52 -5
  454. ansible/utils/collection_loader/_collection_config.py +5 -6
  455. ansible/utils/collection_loader/_collection_finder.py +79 -93
  456. ansible/utils/collection_loader/_collection_meta.py +13 -8
  457. ansible/utils/display.py +433 -63
  458. ansible/utils/encrypt.py +27 -19
  459. ansible/utils/fqcn.py +2 -2
  460. ansible/utils/hashing.py +2 -2
  461. ansible/utils/helpers.py +2 -2
  462. ansible/utils/listify.py +8 -8
  463. ansible/utils/lock.py +2 -2
  464. ansible/utils/path.py +4 -4
  465. ansible/utils/plugin_docs.py +14 -13
  466. ansible/utils/sentinel.py +4 -62
  467. ansible/utils/singleton.py +2 -0
  468. ansible/utils/ssh_functions.py +1 -1
  469. ansible/utils/unsafe_proxy.py +23 -332
  470. ansible/utils/vars.py +51 -8
  471. ansible/utils/version.py +2 -2
  472. ansible/vars/clean.py +5 -5
  473. ansible/vars/hostvars.py +60 -90
  474. ansible/vars/manager.py +206 -282
  475. ansible/vars/reserved.py +8 -9
  476. ansible_core-2.19.0b2.dist-info/BSD-3-Clause.txt +28 -0
  477. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/METADATA +5 -4
  478. ansible_core-2.19.0b2.dist-info/RECORD +1072 -0
  479. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/WHEEL +1 -1
  480. ansible_test/_data/completion/docker.txt +7 -7
  481. ansible_test/_data/completion/remote.txt +6 -6
  482. ansible_test/_data/completion/windows.txt +1 -0
  483. ansible_test/_data/requirements/ansible.txt +2 -2
  484. ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
  485. ansible_test/_data/requirements/sanity.changelog.txt +1 -1
  486. ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
  487. ansible_test/_data/requirements/sanity.pylint.txt +4 -4
  488. ansible_test/_data/requirements/sanity.validate-modules.txt +2 -2
  489. ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
  490. ansible_test/_data/requirements/units.txt +1 -0
  491. ansible_test/_internal/__init__.py +1 -0
  492. ansible_test/_internal/ansible_util.py +2 -0
  493. ansible_test/_internal/become.py +1 -0
  494. ansible_test/_internal/bootstrap.py +1 -0
  495. ansible_test/_internal/cache.py +1 -0
  496. ansible_test/_internal/cgroup.py +1 -0
  497. ansible_test/_internal/ci/__init__.py +1 -0
  498. ansible_test/_internal/ci/azp.py +1 -0
  499. ansible_test/_internal/ci/local.py +1 -0
  500. ansible_test/_internal/classification/__init__.py +1 -0
  501. ansible_test/_internal/classification/common.py +1 -0
  502. ansible_test/_internal/classification/csharp.py +1 -0
  503. ansible_test/_internal/classification/powershell.py +1 -0
  504. ansible_test/_internal/classification/python.py +1 -0
  505. ansible_test/_internal/cli/__init__.py +1 -0
  506. ansible_test/_internal/cli/actions.py +1 -0
  507. ansible_test/_internal/cli/argparsing/__init__.py +1 -0
  508. ansible_test/_internal/cli/argparsing/actions.py +1 -0
  509. ansible_test/_internal/cli/argparsing/argcompletion.py +1 -0
  510. ansible_test/_internal/cli/argparsing/parsers.py +1 -0
  511. ansible_test/_internal/cli/commands/__init__.py +11 -0
  512. ansible_test/_internal/cli/commands/coverage/__init__.py +1 -0
  513. ansible_test/_internal/cli/commands/coverage/analyze/__init__.py +1 -0
  514. ansible_test/_internal/cli/commands/coverage/analyze/targets/__init__.py +1 -0
  515. ansible_test/_internal/cli/commands/coverage/analyze/targets/combine.py +1 -0
  516. ansible_test/_internal/cli/commands/coverage/analyze/targets/expand.py +1 -0
  517. ansible_test/_internal/cli/commands/coverage/analyze/targets/filter.py +1 -0
  518. ansible_test/_internal/cli/commands/coverage/analyze/targets/generate.py +1 -0
  519. ansible_test/_internal/cli/commands/coverage/analyze/targets/missing.py +1 -0
  520. ansible_test/_internal/cli/commands/coverage/combine.py +1 -0
  521. ansible_test/_internal/cli/commands/coverage/erase.py +1 -0
  522. ansible_test/_internal/cli/commands/coverage/html.py +1 -0
  523. ansible_test/_internal/cli/commands/coverage/report.py +1 -0
  524. ansible_test/_internal/cli/commands/coverage/xml.py +1 -0
  525. ansible_test/_internal/cli/commands/env.py +1 -0
  526. ansible_test/_internal/cli/commands/integration/__init__.py +1 -0
  527. ansible_test/_internal/cli/commands/integration/network.py +1 -0
  528. ansible_test/_internal/cli/commands/integration/posix.py +1 -0
  529. ansible_test/_internal/cli/commands/integration/windows.py +1 -0
  530. ansible_test/_internal/cli/commands/sanity.py +9 -0
  531. ansible_test/_internal/cli/commands/shell.py +1 -0
  532. ansible_test/_internal/cli/commands/units.py +1 -0
  533. ansible_test/_internal/cli/compat.py +1 -0
  534. ansible_test/_internal/cli/completers.py +1 -0
  535. ansible_test/_internal/cli/converters.py +1 -0
  536. ansible_test/_internal/cli/environments.py +1 -0
  537. ansible_test/_internal/cli/epilog.py +1 -0
  538. ansible_test/_internal/cli/parsers/__init__.py +1 -0
  539. ansible_test/_internal/cli/parsers/base_argument_parsers.py +1 -0
  540. ansible_test/_internal/cli/parsers/helpers.py +1 -0
  541. ansible_test/_internal/cli/parsers/host_config_parsers.py +1 -0
  542. ansible_test/_internal/cli/parsers/key_value_parsers.py +1 -0
  543. ansible_test/_internal/cli/parsers/value_parsers.py +1 -0
  544. ansible_test/_internal/commands/__init__.py +1 -0
  545. ansible_test/_internal/commands/coverage/__init__.py +2 -1
  546. ansible_test/_internal/commands/coverage/analyze/__init__.py +1 -0
  547. ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +1 -0
  548. ansible_test/_internal/commands/coverage/analyze/targets/combine.py +1 -0
  549. ansible_test/_internal/commands/coverage/analyze/targets/expand.py +1 -0
  550. ansible_test/_internal/commands/coverage/analyze/targets/filter.py +1 -0
  551. ansible_test/_internal/commands/coverage/analyze/targets/generate.py +1 -0
  552. ansible_test/_internal/commands/coverage/analyze/targets/missing.py +1 -0
  553. ansible_test/_internal/commands/coverage/combine.py +2 -1
  554. ansible_test/_internal/commands/coverage/erase.py +1 -0
  555. ansible_test/_internal/commands/coverage/html.py +1 -0
  556. ansible_test/_internal/commands/coverage/report.py +1 -0
  557. ansible_test/_internal/commands/coverage/xml.py +1 -0
  558. ansible_test/_internal/commands/env/__init__.py +2 -0
  559. ansible_test/_internal/commands/integration/__init__.py +4 -0
  560. ansible_test/_internal/commands/integration/cloud/__init__.py +1 -0
  561. ansible_test/_internal/commands/integration/cloud/acme.py +2 -1
  562. ansible_test/_internal/commands/integration/cloud/aws.py +1 -0
  563. ansible_test/_internal/commands/integration/cloud/azure.py +1 -0
  564. ansible_test/_internal/commands/integration/cloud/cs.py +1 -0
  565. ansible_test/_internal/commands/integration/cloud/digitalocean.py +1 -0
  566. ansible_test/_internal/commands/integration/cloud/galaxy.py +3 -2
  567. ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -0
  568. ansible_test/_internal/commands/integration/cloud/httptester.py +2 -1
  569. ansible_test/_internal/commands/integration/cloud/nios.py +2 -1
  570. ansible_test/_internal/commands/integration/cloud/opennebula.py +1 -0
  571. ansible_test/_internal/commands/integration/cloud/openshift.py +1 -0
  572. ansible_test/_internal/commands/integration/cloud/scaleway.py +1 -0
  573. ansible_test/_internal/commands/integration/cloud/vcenter.py +1 -0
  574. ansible_test/_internal/commands/integration/cloud/vultr.py +1 -0
  575. ansible_test/_internal/commands/integration/coverage.py +1 -0
  576. ansible_test/_internal/commands/integration/filters.py +1 -0
  577. ansible_test/_internal/commands/integration/network.py +1 -0
  578. ansible_test/_internal/commands/integration/posix.py +1 -0
  579. ansible_test/_internal/commands/integration/windows.py +1 -0
  580. ansible_test/_internal/commands/sanity/__init__.py +16 -1
  581. ansible_test/_internal/commands/sanity/ansible_doc.py +1 -0
  582. ansible_test/_internal/commands/sanity/bin_symlinks.py +1 -0
  583. ansible_test/_internal/commands/sanity/compile.py +1 -0
  584. ansible_test/_internal/commands/sanity/ignores.py +1 -0
  585. ansible_test/_internal/commands/sanity/import.py +1 -0
  586. ansible_test/_internal/commands/sanity/integration_aliases.py +1 -0
  587. ansible_test/_internal/commands/sanity/pep8.py +1 -0
  588. ansible_test/_internal/commands/sanity/pslint.py +1 -0
  589. ansible_test/_internal/commands/sanity/pylint.py +24 -26
  590. ansible_test/_internal/commands/sanity/shellcheck.py +1 -0
  591. ansible_test/_internal/commands/sanity/validate_modules.py +1 -0
  592. ansible_test/_internal/commands/sanity/yamllint.py +1 -0
  593. ansible_test/_internal/commands/shell/__init__.py +1 -0
  594. ansible_test/_internal/commands/units/__init__.py +1 -0
  595. ansible_test/_internal/compat/__init__.py +1 -0
  596. ansible_test/_internal/compat/packaging.py +1 -0
  597. ansible_test/_internal/compat/yaml.py +1 -0
  598. ansible_test/_internal/completion.py +1 -0
  599. ansible_test/_internal/config.py +2 -0
  600. ansible_test/_internal/connections.py +1 -0
  601. ansible_test/_internal/constants.py +1 -0
  602. ansible_test/_internal/containers.py +1 -0
  603. ansible_test/_internal/content_config.py +1 -0
  604. ansible_test/_internal/core_ci.py +1 -0
  605. ansible_test/_internal/coverage_util.py +11 -10
  606. ansible_test/_internal/data.py +1 -0
  607. ansible_test/_internal/delegation.py +1 -0
  608. ansible_test/_internal/dev/__init__.py +1 -0
  609. ansible_test/_internal/dev/container_probe.py +1 -0
  610. ansible_test/_internal/diff.py +3 -2
  611. ansible_test/_internal/docker_util.py +2 -1
  612. ansible_test/_internal/encoding.py +1 -0
  613. ansible_test/_internal/executor.py +1 -0
  614. ansible_test/_internal/git.py +1 -0
  615. ansible_test/_internal/host_configs.py +1 -0
  616. ansible_test/_internal/host_profiles.py +1 -0
  617. ansible_test/_internal/http.py +1 -0
  618. ansible_test/_internal/init.py +1 -0
  619. ansible_test/_internal/inventory.py +35 -3
  620. ansible_test/_internal/io.py +1 -0
  621. ansible_test/_internal/metadata.py +1 -0
  622. ansible_test/_internal/payload.py +1 -0
  623. ansible_test/_internal/provider/__init__.py +1 -0
  624. ansible_test/_internal/provider/layout/__init__.py +1 -0
  625. ansible_test/_internal/provider/layout/ansible.py +1 -0
  626. ansible_test/_internal/provider/layout/collection.py +1 -0
  627. ansible_test/_internal/provider/layout/unsupported.py +1 -0
  628. ansible_test/_internal/provider/source/__init__.py +1 -0
  629. ansible_test/_internal/provider/source/git.py +1 -0
  630. ansible_test/_internal/provider/source/installed.py +1 -0
  631. ansible_test/_internal/provider/source/unsupported.py +1 -0
  632. ansible_test/_internal/provider/source/unversioned.py +1 -0
  633. ansible_test/_internal/provisioning.py +1 -0
  634. ansible_test/_internal/pypi_proxy.py +6 -5
  635. ansible_test/_internal/python_requirements.py +1 -0
  636. ansible_test/_internal/ssh.py +1 -0
  637. ansible_test/_internal/target.py +1 -0
  638. ansible_test/_internal/test.py +3 -2
  639. ansible_test/_internal/thread.py +1 -0
  640. ansible_test/_internal/timeout.py +1 -0
  641. ansible_test/_internal/util.py +1 -0
  642. ansible_test/_internal/util_common.py +5 -2
  643. ansible_test/_internal/venv.py +1 -0
  644. ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +1 -0
  645. ansible_test/_util/controller/sanity/code-smell/changelog/sphinx.py +1 -0
  646. ansible_test/_util/controller/sanity/code-smell/changelog.py +1 -0
  647. ansible_test/_util/controller/sanity/code-smell/empty-init.py +1 -0
  648. ansible_test/_util/controller/sanity/code-smell/line-endings.py +1 -0
  649. ansible_test/_util/controller/sanity/code-smell/no-assert.py +1 -0
  650. ansible_test/_util/controller/sanity/code-smell/no-get-exception.py +1 -0
  651. ansible_test/_util/controller/sanity/code-smell/no-illegal-filenames.py +1 -0
  652. ansible_test/_util/controller/sanity/code-smell/no-smart-quotes.py +1 -0
  653. ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py +1 -0
  654. ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +28 -1
  655. ansible_test/_util/controller/sanity/code-smell/shebang.py +1 -0
  656. ansible_test/_util/controller/sanity/code-smell/symlinks.py +1 -0
  657. ansible_test/_util/controller/sanity/code-smell/use-argspec-type-path.py +1 -0
  658. ansible_test/_util/controller/sanity/code-smell/use-compat-six.py +1 -0
  659. ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py +2 -1
  660. ansible_test/_util/controller/sanity/pep8/current-ignore.txt +4 -0
  661. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +7 -5
  662. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +7 -5
  663. ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +7 -5
  664. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +3 -5
  665. ansible_test/_util/controller/sanity/pylint/config/default.cfg +7 -7
  666. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +1 -13
  667. ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +1 -0
  668. ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +1 -8
  669. ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +1 -8
  670. ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +55 -28
  671. ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +12 -5
  672. ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +13 -2
  673. ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -0
  674. ansible_test/_util/controller/sanity/yamllint/yamllinter.py +35 -17
  675. ansible_test/_util/controller/tools/collection_detail.py +1 -0
  676. ansible_test/_util/controller/tools/yaml_to_json.py +2 -1
  677. ansible_test/_util/target/pytest/plugins/ansible_forked.py +6 -1
  678. ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +2 -1
  679. ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -0
  680. ansible_test/_util/target/sanity/compile/compile.py +1 -0
  681. ansible_test/_util/target/sanity/import/importer.py +15 -16
  682. ansible_test/_util/target/setup/bootstrap.sh +9 -20
  683. ansible_test/_util/target/setup/probe_cgroups.py +1 -0
  684. ansible_test/_util/target/setup/quiet_pip.py +1 -0
  685. ansible_test/_util/target/setup/requirements.py +35 -27
  686. ansible_test/_util/target/tools/virtualenvcheck.py +2 -1
  687. ansible_test/_util/target/tools/yamlcheck.py +2 -1
  688. ansible/compat/selectors.py +0 -32
  689. ansible/errors/yaml_strings.py +0 -138
  690. ansible/executor/action_write_locks.py +0 -44
  691. ansible/executor/discovery/python_target.py +0 -47
  692. ansible/executor/powershell/module_powershell_wrapper.ps1 +0 -86
  693. ansible/executor/powershell/module_script_wrapper.ps1 +0 -22
  694. ansible/module_utils/compat/importlib.py +0 -26
  695. ansible/module_utils/compat/selectors.py +0 -32
  696. ansible/module_utils/pycompat24.py +0 -73
  697. ansible/parsing/yaml/constructor.py +0 -178
  698. ansible/template/native_helpers.py +0 -251
  699. ansible/template/template.py +0 -43
  700. ansible/template/vars.py +0 -77
  701. ansible/utils/native_jinja.py +0 -11
  702. ansible/vars/fact_cache.py +0 -71
  703. ansible_core-2.18.5rc1.dist-info/RECORD +0 -992
  704. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/Apache-License.txt +0 -0
  705. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/COPYING +0 -0
  706. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/MIT-license.txt +0 -0
  707. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/PSF-license.txt +0 -0
  708. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/entry_points.txt +0 -0
  709. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/simplified_bsd.txt +0 -0
  710. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,12 @@
1
- [MESSAGES CONTROL]
1
+ [pylint]
2
+
3
+ max-line-length=160
4
+
5
+ load-plugins=
6
+ pylint.extensions.docstyle,
2
7
 
3
8
  disable=
9
+ docstring-first-line-empty,
4
10
  consider-using-f-string, # Python 2.x support still required
5
11
  cyclic-import, # consistent results require running with --jobs 1 and testing all files
6
12
  deprecated-argument, # results vary by Python version
@@ -28,8 +34,6 @@ disable=
28
34
  use-dict-literal, # ignoring as a common style issue
29
35
  useless-return, # complains about returning None when the return type is optional
30
36
 
31
- [BASIC]
32
-
33
37
  bad-names=
34
38
  _,
35
39
  bar,
@@ -52,8 +56,6 @@ attr-rgx=[a-z_][a-z0-9_]{1,40}$
52
56
  method-rgx=[a-z_][a-z0-9_]{1,40}$
53
57
  function-rgx=[a-z_][a-z0-9_]{1,40}$
54
58
 
55
- [IMPORTS]
56
-
57
59
  preferred-modules =
58
60
  distutils.version:ansible.module_utils.compat.version,
59
61
 
@@ -1,6 +1,12 @@
1
- [MESSAGES CONTROL]
1
+ [pylint]
2
+
3
+ max-line-length=160
4
+
5
+ load-plugins=
6
+ pylint.extensions.docstyle,
2
7
 
3
8
  disable=
9
+ docstring-first-line-empty,
4
10
  consider-using-f-string, # many occurrences
5
11
  cyclic-import, # consistent results require running with --jobs 1 and testing all files
6
12
  deprecated-argument, # results vary by Python version
@@ -27,8 +33,6 @@ disable=
27
33
  unspecified-encoding, # always run with UTF-8 encoding enforced
28
34
  useless-return, # complains about returning None when the return type is optional
29
35
 
30
- [BASIC]
31
-
32
36
  bad-names=
33
37
  _,
34
38
  bar,
@@ -55,8 +59,6 @@ function-rgx=[a-z_][a-z0-9_]{1,40}$
55
59
  # See: https://github.com/PyCQA/pylint/pull/7322
56
60
  typevar-rgx=^_{0,2}(?:[^\W\da-z_]+|(?:[^\W\da-z_]+[^\WA-Z_]+)+T?(?<!Type))(?:_co(?:ntra)?)?$
57
61
 
58
- [IMPORTS]
59
-
60
62
  preferred-modules =
61
63
  distutils.version:ansible.module_utils.compat.version,
62
64
 
@@ -1,6 +1,12 @@
1
- [MESSAGES CONTROL]
1
+ [pylint]
2
+
3
+ max-line-length=160
4
+
5
+ load-plugins=
6
+ pylint.extensions.docstyle,
2
7
 
3
8
  disable=
9
+ docstring-first-line-empty,
4
10
  consider-using-f-string, # many occurrences
5
11
  cyclic-import, # consistent results require running with --jobs 1 and testing all files
6
12
  deprecated-argument, # results vary by Python version
@@ -26,8 +32,6 @@ disable=
26
32
  unspecified-encoding, # always run with UTF-8 encoding enforced
27
33
  useless-return, # complains about returning None when the return type is optional
28
34
 
29
- [BASIC]
30
-
31
35
  bad-names=
32
36
  _,
33
37
  bar,
@@ -51,8 +55,6 @@ method-rgx=[a-z_][a-z0-9_]{1,40}$
51
55
  function-rgx=[a-z_][a-z0-9_]{1,40}$
52
56
  module-rgx=[a-z_][a-z0-9_-]{2,40}$
53
57
 
54
- [IMPORTS]
55
-
56
58
  preferred-modules =
57
59
  distutils.version:ansible.module_utils.compat.version,
58
60
 
@@ -1,4 +1,6 @@
1
- [MESSAGES CONTROL]
1
+ [pylint]
2
+
3
+ max-line-length=160
2
4
 
3
5
  disable=
4
6
  abstract-method,
@@ -127,8 +129,6 @@ disable=
127
129
  wrong-import-order,
128
130
  wrong-import-position,
129
131
 
130
- [BASIC]
131
-
132
132
  bad-names=
133
133
  _,
134
134
  bar,
@@ -145,7 +145,5 @@ good-names=
145
145
  k,
146
146
  Run,
147
147
 
148
- [TYPECHECK]
149
-
150
148
  ignored-modules=
151
149
  _MovedItems,
@@ -1,6 +1,12 @@
1
- [MESSAGES CONTROL]
1
+ [pylint]
2
+
3
+ max-line-length=160
4
+
5
+ load-plugins=
6
+ pylint.extensions.docstyle,
2
7
 
3
8
  disable=
9
+ docstring-first-line-empty,
4
10
  import-outside-toplevel, # common pattern in ansible related code
5
11
  abstract-method,
6
12
  access-member-before-definition,
@@ -118,8 +124,6 @@ disable=
118
124
  wrong-import-order,
119
125
  wrong-import-position,
120
126
 
121
- [BASIC]
122
-
123
127
  bad-names=
124
128
  _,
125
129
  bar,
@@ -136,12 +140,8 @@ good-names=
136
140
  k,
137
141
  Run,
138
142
 
139
- [TYPECHECK]
140
-
141
143
  ignored-modules=
142
144
  _MovedItems,
143
145
 
144
- [IMPORTS]
145
-
146
146
  preferred-modules =
147
147
  distutils.version:ansible.module_utils.compat.version,
@@ -1,4 +1,5 @@
1
1
  """Ansible specific plyint plugin for checking deprecations."""
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 -*-
@@ -12,16 +13,6 @@ from tokenize import COMMENT, TokenInfo
12
13
 
13
14
  import astroid
14
15
 
15
- # support pylint 2.x and 3.x -- remove when supporting only 3.x
16
- try:
17
- from pylint.interfaces import IAstroidChecker, ITokenChecker
18
- except ImportError:
19
- class IAstroidChecker:
20
- """Backwards compatibility for 2.x / 3.x support."""
21
-
22
- class ITokenChecker:
23
- """Backwards compatibility for 2.x / 3.x support."""
24
-
25
16
  try:
26
17
  from pylint.checkers.utils import check_messages
27
18
  except ImportError:
@@ -151,7 +142,6 @@ class AnsibleDeprecatedChecker(BaseChecker):
151
142
  has not passed or met the time for removal
152
143
  """
153
144
 
154
- __implements__ = (IAstroidChecker,)
155
145
  name = 'deprecated'
156
146
  msgs = MSGS
157
147
 
@@ -296,8 +286,6 @@ class AnsibleDeprecatedCommentChecker(BaseTokenChecker):
296
286
  has not passed or met the time for removal
297
287
  """
298
288
 
299
- __implements__ = (ITokenChecker,)
300
-
301
289
  name = 'deprecated-comment'
302
290
  msgs = {
303
291
  'E9601': ("Deprecated core version (%r) found: %s",
@@ -1,4 +1,5 @@
1
1
  """Temporary plugin to prevent stdout noise pollution from finalization of abandoned generators."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import sys
@@ -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:'
@@ -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