ansible-core 2.15.4rc1__py3-none-any.whl → 2.16.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.

Potentially problematic release.


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

Files changed (427) hide show
  1. ansible/cli/__init__.py +3 -3
  2. ansible/cli/adhoc.py +1 -1
  3. ansible/cli/arguments/option_helpers.py +15 -5
  4. ansible/cli/config.py +2 -2
  5. ansible/cli/console.py +21 -17
  6. ansible/cli/doc.py +8 -9
  7. ansible/cli/galaxy.py +60 -27
  8. ansible/cli/inventory.py +1 -1
  9. ansible/cli/playbook.py +1 -1
  10. ansible/cli/pull.py +2 -2
  11. ansible/cli/scripts/ansible_connection_cli_stub.py +1 -1
  12. ansible/cli/vault.py +11 -6
  13. ansible/collections/__init__.py +0 -29
  14. ansible/collections/list.py +23 -44
  15. ansible/config/ansible_builtin_runtime.yml +8 -4
  16. ansible/config/base.yml +34 -22
  17. ansible/config/manager.py +1 -1
  18. ansible/constants.py +3 -5
  19. ansible/errors/__init__.py +1 -1
  20. ansible/executor/interpreter_discovery.py +1 -1
  21. ansible/executor/module_common.py +39 -32
  22. ansible/executor/play_iterator.py +0 -15
  23. ansible/executor/playbook_executor.py +3 -3
  24. ansible/executor/powershell/module_manifest.py +1 -1
  25. ansible/executor/powershell/module_wrapper.ps1 +4 -1
  26. ansible/executor/process/worker.py +22 -7
  27. ansible/executor/task_executor.py +39 -40
  28. ansible/executor/task_queue_manager.py +8 -11
  29. ansible/galaxy/__init__.py +1 -1
  30. ansible/galaxy/api.py +8 -11
  31. ansible/galaxy/collection/__init__.py +17 -4
  32. ansible/galaxy/collection/concrete_artifact_manager.py +7 -2
  33. ansible/galaxy/collection/galaxy_api_proxy.py +1 -1
  34. ansible/galaxy/data/container/README.md +3 -5
  35. ansible/galaxy/dependency_resolution/__init__.py +1 -6
  36. ansible/galaxy/dependency_resolution/dataclasses.py +22 -1
  37. ansible/galaxy/dependency_resolution/providers.py +61 -69
  38. ansible/galaxy/role.py +31 -13
  39. ansible/galaxy/token.py +2 -2
  40. ansible/inventory/group.py +1 -1
  41. ansible/inventory/manager.py +1 -1
  42. ansible/module_utils/ansible_release.py +2 -2
  43. ansible/module_utils/basic.py +11 -41
  44. ansible/module_utils/common/file.py +0 -100
  45. ansible/module_utils/common/json.py +1 -1
  46. ansible/module_utils/common/locale.py +1 -1
  47. ansible/module_utils/common/text/converters.py +2 -2
  48. ansible/module_utils/common/validation.py +1 -1
  49. ansible/module_utils/compat/_selectors2.py +4 -4
  50. ansible/module_utils/compat/datetime.py +40 -0
  51. ansible/module_utils/compat/selinux.py +1 -1
  52. ansible/module_utils/compat/typing.py +1 -1
  53. ansible/module_utils/connection.py +1 -1
  54. ansible/module_utils/facts/hardware/linux.py +2 -2
  55. ansible/module_utils/facts/hardware/openbsd.py +1 -1
  56. ansible/module_utils/facts/network/linux.py +3 -3
  57. ansible/module_utils/facts/other/facter.py +8 -15
  58. ansible/module_utils/facts/sysctl.py +1 -1
  59. ansible/module_utils/facts/system/date_time.py +2 -2
  60. ansible/module_utils/facts/system/distribution.py +1 -1
  61. ansible/module_utils/facts/system/local.py +6 -2
  62. ansible/module_utils/facts/system/pkg_mgr.py +6 -1
  63. ansible/module_utils/facts/system/service_mgr.py +4 -2
  64. ansible/module_utils/parsing/convert_bool.py +1 -1
  65. ansible/module_utils/service.py +9 -6
  66. ansible/module_utils/urls.py +40 -22
  67. ansible/modules/add_host.py +2 -2
  68. ansible/modules/apt.py +48 -31
  69. ansible/modules/apt_key.py +4 -4
  70. ansible/modules/apt_repository.py +5 -5
  71. ansible/modules/assemble.py +7 -7
  72. ansible/modules/assert.py +1 -1
  73. ansible/modules/async_status.py +11 -7
  74. ansible/modules/async_wrapper.py +1 -1
  75. ansible/modules/blockinfile.py +60 -17
  76. ansible/modules/command.py +37 -15
  77. ansible/modules/copy.py +35 -30
  78. ansible/modules/cron.py +14 -14
  79. ansible/modules/deb822_repository.py +4 -3
  80. ansible/modules/debconf.py +35 -14
  81. ansible/modules/debug.py +1 -1
  82. ansible/modules/dnf.py +29 -27
  83. ansible/modules/dnf5.py +22 -22
  84. ansible/modules/dpkg_selections.py +9 -2
  85. ansible/modules/expect.py +4 -4
  86. ansible/modules/fetch.py +7 -7
  87. ansible/modules/file.py +30 -30
  88. ansible/modules/find.py +82 -22
  89. ansible/modules/gather_facts.py +6 -2
  90. ansible/modules/get_url.py +29 -29
  91. ansible/modules/getent.py +4 -4
  92. ansible/modules/git.py +27 -27
  93. ansible/modules/group.py +5 -12
  94. ansible/modules/hostname.py +21 -2
  95. ansible/modules/include_role.py +5 -5
  96. ansible/modules/include_tasks.py +2 -2
  97. ansible/modules/include_vars.py +5 -5
  98. ansible/modules/iptables.py +70 -65
  99. ansible/modules/known_hosts.py +7 -7
  100. ansible/modules/lineinfile.py +33 -33
  101. ansible/modules/meta.py +13 -13
  102. ansible/modules/package.py +8 -8
  103. ansible/modules/package_facts.py +3 -3
  104. ansible/modules/pause.py +2 -2
  105. ansible/modules/ping.py +5 -5
  106. ansible/modules/pip.py +80 -46
  107. ansible/modules/reboot.py +8 -4
  108. ansible/modules/replace.py +20 -15
  109. ansible/modules/rpm_key.py +2 -2
  110. ansible/modules/script.py +16 -10
  111. ansible/modules/service.py +26 -98
  112. ansible/modules/service_facts.py +36 -12
  113. ansible/modules/set_fact.py +2 -2
  114. ansible/modules/set_stats.py +2 -2
  115. ansible/modules/setup.py +18 -18
  116. ansible/modules/shell.py +3 -3
  117. ansible/modules/stat.py +9 -30
  118. ansible/modules/subversion.py +9 -9
  119. ansible/modules/systemd.py +20 -19
  120. ansible/modules/systemd_service.py +20 -19
  121. ansible/modules/sysvinit.py +26 -21
  122. ansible/modules/tempfile.py +5 -4
  123. ansible/modules/template.py +60 -6
  124. ansible/modules/unarchive.py +21 -18
  125. ansible/modules/uri.py +39 -39
  126. ansible/modules/user.py +81 -53
  127. ansible/modules/wait_for.py +22 -21
  128. ansible/modules/wait_for_connection.py +4 -4
  129. ansible/modules/yum.py +38 -38
  130. ansible/modules/yum_repository.py +58 -80
  131. ansible/parsing/dataloader.py +27 -27
  132. ansible/parsing/mod_args.py +1 -1
  133. ansible/parsing/plugin_docs.py +3 -3
  134. ansible/parsing/splitter.py +14 -16
  135. ansible/parsing/utils/yaml.py +1 -1
  136. ansible/parsing/vault/__init__.py +8 -6
  137. ansible/parsing/yaml/constructor.py +1 -1
  138. ansible/parsing/yaml/objects.py +1 -1
  139. ansible/playbook/__init__.py +1 -1
  140. ansible/playbook/base.py +2 -2
  141. ansible/playbook/block.py +0 -1
  142. ansible/playbook/conditional.py +40 -114
  143. ansible/playbook/helpers.py +5 -28
  144. ansible/playbook/included_file.py +8 -7
  145. ansible/playbook/play.py +1 -1
  146. ansible/playbook/play_context.py +2 -2
  147. ansible/playbook/playbook_include.py +2 -2
  148. ansible/playbook/role/__init__.py +1 -1
  149. ansible/playbook/role/include.py +1 -1
  150. ansible/playbook/role/metadata.py +1 -1
  151. ansible/playbook/role_include.py +1 -1
  152. ansible/playbook/task.py +2 -2
  153. ansible/playbook/task_include.py +1 -24
  154. ansible/plugins/__init__.py +13 -5
  155. ansible/plugins/action/__init__.py +17 -43
  156. ansible/plugins/action/add_host.py +2 -3
  157. ansible/plugins/action/assemble.py +1 -1
  158. ansible/plugins/action/assert.py +2 -1
  159. ansible/plugins/action/copy.py +2 -2
  160. ansible/plugins/action/debug.py +2 -1
  161. ansible/plugins/action/fail.py +1 -0
  162. ansible/plugins/action/fetch.py +3 -1
  163. ansible/plugins/action/gather_facts.py +37 -13
  164. ansible/plugins/action/group_by.py +1 -0
  165. ansible/plugins/action/include_vars.py +3 -2
  166. ansible/plugins/action/normal.py +3 -3
  167. ansible/plugins/action/pause.py +1 -1
  168. ansible/plugins/action/reboot.py +21 -16
  169. ansible/plugins/action/script.py +23 -8
  170. ansible/plugins/action/set_fact.py +1 -0
  171. ansible/plugins/action/set_stats.py +1 -0
  172. ansible/plugins/action/shell.py +6 -0
  173. ansible/plugins/action/template.py +1 -1
  174. ansible/plugins/action/unarchive.py +1 -1
  175. ansible/plugins/action/uri.py +1 -1
  176. ansible/plugins/action/validate_argument_spec.py +1 -0
  177. ansible/plugins/action/wait_for_connection.py +4 -4
  178. ansible/plugins/become/__init__.py +1 -1
  179. ansible/plugins/become/su.py +1 -1
  180. ansible/plugins/cache/__init__.py +1 -1
  181. ansible/plugins/callback/junit.py +1 -1
  182. ansible/plugins/callback/oneline.py +1 -1
  183. ansible/plugins/callback/tree.py +1 -1
  184. ansible/plugins/cliconf/__init__.py +2 -2
  185. ansible/plugins/connection/__init__.py +65 -37
  186. ansible/plugins/connection/local.py +9 -8
  187. ansible/plugins/connection/paramiko_ssh.py +34 -28
  188. ansible/plugins/connection/psrp.py +56 -43
  189. ansible/plugins/connection/ssh.py +67 -43
  190. ansible/plugins/connection/winrm.py +77 -30
  191. ansible/plugins/doc_fragments/constructed.py +4 -4
  192. ansible/plugins/doc_fragments/files.py +12 -12
  193. ansible/plugins/doc_fragments/inventory_cache.py +0 -6
  194. ansible/plugins/doc_fragments/result_format_callback.py +5 -5
  195. ansible/plugins/doc_fragments/shell_common.py +2 -2
  196. ansible/plugins/doc_fragments/shell_windows.py +1 -1
  197. ansible/plugins/doc_fragments/template_common.py +6 -6
  198. ansible/plugins/doc_fragments/url.py +10 -10
  199. ansible/plugins/doc_fragments/url_windows.py +15 -15
  200. ansible/plugins/doc_fragments/vars_plugin_staging.py +4 -4
  201. ansible/plugins/filter/b64decode.yml +1 -1
  202. ansible/plugins/filter/b64encode.yml +2 -2
  203. ansible/plugins/filter/bool.yml +5 -5
  204. ansible/plugins/filter/combine.yml +1 -1
  205. ansible/plugins/filter/commonpath.yml +2 -1
  206. ansible/plugins/filter/core.py +6 -8
  207. ansible/plugins/filter/dict2items.yml +11 -1
  208. ansible/plugins/filter/difference.yml +1 -0
  209. ansible/plugins/filter/encryption.py +1 -1
  210. ansible/plugins/filter/extract.yml +1 -1
  211. ansible/plugins/filter/flatten.yml +1 -1
  212. ansible/plugins/filter/from_yaml.yml +1 -1
  213. ansible/plugins/filter/from_yaml_all.yml +2 -2
  214. ansible/plugins/filter/hash.yml +1 -1
  215. ansible/plugins/filter/human_readable.yml +1 -1
  216. ansible/plugins/filter/human_to_bytes.yml +2 -2
  217. ansible/plugins/filter/intersect.yml +1 -0
  218. ansible/plugins/filter/mandatory.yml +7 -0
  219. ansible/plugins/filter/mathstuff.py +15 -17
  220. ansible/plugins/filter/normpath.yml +1 -1
  221. ansible/plugins/filter/path_join.yml +8 -1
  222. ansible/plugins/filter/realpath.yml +3 -2
  223. ansible/plugins/filter/regex_findall.yml +8 -2
  224. ansible/plugins/filter/regex_replace.yml +9 -3
  225. ansible/plugins/filter/regex_search.yml +8 -2
  226. ansible/plugins/filter/relpath.yml +2 -2
  227. ansible/plugins/filter/root.yml +1 -1
  228. ansible/plugins/filter/splitext.yml +1 -1
  229. ansible/plugins/filter/subelements.yml +2 -2
  230. ansible/plugins/filter/symmetric_difference.yml +1 -0
  231. ansible/plugins/filter/ternary.yml +5 -5
  232. ansible/plugins/filter/to_json.yml +7 -7
  233. ansible/plugins/filter/to_nice_json.yml +5 -5
  234. ansible/plugins/filter/to_yaml.yml +2 -2
  235. ansible/plugins/filter/type_debug.yml +1 -1
  236. ansible/plugins/filter/union.yml +1 -0
  237. ansible/plugins/filter/unvault.yml +2 -2
  238. ansible/plugins/filter/urldecode.yml +13 -32
  239. ansible/plugins/filter/urlsplit.py +1 -1
  240. ansible/plugins/filter/vault.yml +1 -1
  241. ansible/plugins/filter/zip.yml +1 -1
  242. ansible/plugins/filter/zip_longest.yml +1 -1
  243. ansible/plugins/inventory/__init__.py +1 -1
  244. ansible/plugins/inventory/advanced_host_list.py +1 -1
  245. ansible/plugins/inventory/constructed.py +2 -2
  246. ansible/plugins/inventory/host_list.py +1 -1
  247. ansible/plugins/inventory/ini.py +6 -3
  248. ansible/plugins/inventory/script.py +8 -2
  249. ansible/plugins/inventory/toml.py +1 -1
  250. ansible/plugins/inventory/yaml.py +1 -1
  251. ansible/plugins/list.py +21 -17
  252. ansible/plugins/loader.py +66 -88
  253. ansible/plugins/lookup/__init__.py +1 -1
  254. ansible/plugins/lookup/config.py +16 -6
  255. ansible/plugins/lookup/csvfile.py +7 -4
  256. ansible/plugins/lookup/env.py +1 -1
  257. ansible/plugins/lookup/file.py +5 -2
  258. ansible/plugins/lookup/fileglob.py +5 -2
  259. ansible/plugins/lookup/first_found.py +20 -14
  260. ansible/plugins/lookup/ini.py +6 -3
  261. ansible/plugins/lookup/lines.py +2 -1
  262. ansible/plugins/lookup/password.py +7 -7
  263. ansible/plugins/lookup/pipe.py +1 -0
  264. ansible/plugins/lookup/random_choice.py +2 -2
  265. ansible/plugins/lookup/sequence.py +1 -1
  266. ansible/plugins/lookup/subelements.py +2 -2
  267. ansible/plugins/lookup/template.py +4 -1
  268. ansible/plugins/lookup/unvault.py +4 -1
  269. ansible/plugins/lookup/url.py +6 -6
  270. ansible/plugins/lookup/varnames.py +1 -1
  271. ansible/plugins/netconf/__init__.py +3 -3
  272. ansible/plugins/shell/__init__.py +1 -1
  273. ansible/plugins/shell/cmd.py +7 -7
  274. ansible/plugins/shell/powershell.py +1 -1
  275. ansible/plugins/strategy/__init__.py +8 -10
  276. ansible/plugins/strategy/free.py +1 -1
  277. ansible/plugins/strategy/linear.py +3 -3
  278. ansible/plugins/terminal/__init__.py +2 -2
  279. ansible/plugins/test/abs.yml +1 -1
  280. ansible/plugins/test/all.yml +1 -1
  281. ansible/plugins/test/any.yml +1 -1
  282. ansible/plugins/test/change.yml +2 -2
  283. ansible/plugins/test/changed.yml +2 -2
  284. ansible/plugins/test/contains.yml +1 -1
  285. ansible/plugins/test/core.py +1 -1
  286. ansible/plugins/test/directory.yml +1 -1
  287. ansible/plugins/test/exists.yml +3 -2
  288. ansible/plugins/test/failed.yml +2 -2
  289. ansible/plugins/test/failure.yml +2 -2
  290. ansible/plugins/test/falsy.yml +2 -2
  291. ansible/plugins/test/file.yml +1 -1
  292. ansible/plugins/test/finished.yml +2 -2
  293. ansible/plugins/test/is_abs.yml +1 -1
  294. ansible/plugins/test/is_dir.yml +1 -1
  295. ansible/plugins/test/is_file.yml +1 -1
  296. ansible/plugins/test/is_link.yml +1 -1
  297. ansible/plugins/test/is_mount.yml +1 -1
  298. ansible/plugins/test/is_same_file.yml +1 -1
  299. ansible/plugins/test/isnan.yml +1 -1
  300. ansible/plugins/test/issubset.yml +1 -2
  301. ansible/plugins/test/issuperset.yml +1 -2
  302. ansible/plugins/test/link.yml +1 -1
  303. ansible/plugins/test/link_exists.yml +1 -1
  304. ansible/plugins/test/match.yml +2 -2
  305. ansible/plugins/test/mount.yml +1 -1
  306. ansible/plugins/test/nan.yml +1 -1
  307. ansible/plugins/test/reachable.yml +2 -2
  308. ansible/plugins/test/regex.yml +1 -1
  309. ansible/plugins/test/same_file.yml +1 -1
  310. ansible/plugins/test/search.yml +2 -2
  311. ansible/plugins/test/skip.yml +3 -3
  312. ansible/plugins/test/skipped.yml +3 -3
  313. ansible/plugins/test/started.yml +2 -2
  314. ansible/plugins/test/subset.yml +1 -2
  315. ansible/plugins/test/succeeded.yml +2 -2
  316. ansible/plugins/test/success.yml +2 -2
  317. ansible/plugins/test/successful.yml +2 -2
  318. ansible/plugins/test/superset.yml +1 -2
  319. ansible/plugins/test/truthy.yml +3 -3
  320. ansible/plugins/test/unreachable.yml +2 -2
  321. ansible/plugins/test/uri.yml +1 -1
  322. ansible/plugins/test/url.yml +1 -1
  323. ansible/plugins/test/urn.yml +1 -1
  324. ansible/plugins/test/vault_encrypted.yml +1 -1
  325. ansible/plugins/test/version.yml +7 -7
  326. ansible/plugins/test/version_compare.yml +7 -7
  327. ansible/plugins/vars/host_group_vars.py +1 -1
  328. ansible/release.py +2 -2
  329. ansible/template/__init__.py +24 -26
  330. ansible/template/native_helpers.py +1 -1
  331. ansible/template/vars.py +1 -1
  332. ansible/utils/_junit_xml.py +1 -1
  333. ansible/utils/cmd_functions.py +1 -1
  334. ansible/utils/collection_loader/_collection_finder.py +12 -1
  335. ansible/utils/display.py +113 -62
  336. ansible/utils/encrypt.py +11 -14
  337. ansible/utils/hashing.py +1 -1
  338. ansible/utils/jsonrpc.py +1 -1
  339. ansible/utils/path.py +1 -1
  340. ansible/utils/plugin_docs.py +1 -1
  341. ansible/utils/py3compat.py +1 -1
  342. ansible/utils/shlex.py +2 -10
  343. ansible/utils/ssh_functions.py +5 -4
  344. ansible/utils/unicode.py +1 -1
  345. ansible/utils/unsafe_proxy.py +1 -1
  346. ansible/utils/vars.py +4 -29
  347. ansible/vars/hostvars.py +1 -2
  348. ansible/vars/manager.py +13 -9
  349. ansible/vars/plugins.py +2 -2
  350. {ansible_core-2.15.4rc1.dist-info → ansible_core-2.16.0b2.dist-info}/COPYING +4 -5
  351. {ansible_core-2.15.4rc1.dist-info → ansible_core-2.16.0b2.dist-info}/METADATA +2 -4
  352. {ansible_core-2.15.4rc1.dist-info → ansible_core-2.16.0b2.dist-info}/RECORD +424 -425
  353. ansible_test/_data/completion/docker.txt +9 -9
  354. ansible_test/_data/completion/remote.txt +4 -7
  355. ansible_test/_data/completion/windows.txt +0 -2
  356. ansible_test/_data/requirements/ansible-test.txt +2 -1
  357. ansible_test/_data/requirements/ansible.txt +0 -3
  358. ansible_test/_data/requirements/constraints.txt +0 -2
  359. ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -5
  360. ansible_test/_data/requirements/sanity.changelog.in +1 -2
  361. ansible_test/_data/requirements/sanity.changelog.txt +4 -6
  362. ansible_test/_data/requirements/sanity.import.plugin.txt +2 -4
  363. ansible_test/_data/requirements/sanity.import.txt +1 -3
  364. ansible_test/_data/requirements/sanity.integration-aliases.txt +1 -3
  365. ansible_test/_data/requirements/sanity.mypy.txt +12 -12
  366. ansible_test/_data/requirements/sanity.pep8.txt +1 -1
  367. ansible_test/_data/requirements/sanity.pylint.txt +6 -12
  368. ansible_test/_data/requirements/sanity.runtime-metadata.txt +1 -3
  369. ansible_test/_data/requirements/sanity.validate-modules.in +1 -1
  370. ansible_test/_data/requirements/sanity.validate-modules.txt +3 -5
  371. ansible_test/_data/requirements/sanity.yamllint.txt +3 -5
  372. ansible_test/_data/requirements/units.txt +0 -1
  373. ansible_test/_internal/ci/azp.py +4 -4
  374. ansible_test/_internal/cli/environments.py +0 -13
  375. ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +4 -4
  376. ansible_test/_internal/commands/coverage/combine.py +1 -1
  377. ansible_test/_internal/commands/integration/cloud/acme.py +6 -8
  378. ansible_test/_internal/commands/integration/cloud/cs.py +4 -9
  379. ansible_test/_internal/commands/integration/cloud/galaxy.py +103 -96
  380. ansible_test/_internal/commands/integration/cloud/httptester.py +0 -3
  381. ansible_test/_internal/commands/integration/cloud/nios.py +7 -9
  382. ansible_test/_internal/commands/integration/cloud/openshift.py +2 -7
  383. ansible_test/_internal/commands/integration/cloud/vcenter.py +11 -95
  384. ansible_test/_internal/commands/sanity/__init__.py +10 -0
  385. ansible_test/_internal/commands/sanity/import.py +8 -2
  386. ansible_test/_internal/commands/sanity/pylint.py +27 -1
  387. ansible_test/_internal/commands/units/__init__.py +2 -1
  388. ansible_test/_internal/config.py +0 -7
  389. ansible_test/_internal/containers.py +11 -56
  390. ansible_test/_internal/core_ci.py +0 -7
  391. ansible_test/_internal/coverage_util.py +8 -3
  392. ansible_test/_internal/delegation.py +0 -1
  393. ansible_test/_internal/diff.py +1 -1
  394. ansible_test/_internal/docker_util.py +9 -2
  395. ansible_test/_internal/host_profiles.py +6 -6
  396. ansible_test/_internal/http.py +1 -1
  397. ansible_test/_internal/junit_xml.py +1 -1
  398. ansible_test/_internal/pypi_proxy.py +1 -1
  399. ansible_test/_internal/python_requirements.py +3 -8
  400. ansible_test/_internal/util.py +1 -6
  401. ansible_test/_util/controller/sanity/code-smell/no-get-exception.json +4 -0
  402. ansible_test/_util/controller/sanity/code-smell/replace-urlopen.json +4 -0
  403. ansible_test/_util/controller/sanity/code-smell/use-compat-six.json +4 -0
  404. ansible_test/_util/controller/sanity/mypy/ansible-core.ini +3 -0
  405. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +2 -0
  406. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +0 -1
  407. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +1 -0
  408. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +172 -10
  409. ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +13 -2
  410. ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +7 -1
  411. ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +6 -6
  412. ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +1 -1
  413. ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -1
  414. ansible_test/_util/controller/sanity/yamllint/yamllinter.py +3 -3
  415. ansible_test/_util/controller/tools/collection_detail.py +2 -2
  416. ansible_test/_util/target/common/constants.py +2 -2
  417. ansible_test/_util/target/pytest/plugins/ansible_forked.py +103 -0
  418. ansible_test/_util/target/sanity/import/importer.py +0 -8
  419. ansible_test/_util/target/setup/bootstrap.sh +36 -16
  420. ansible_test/_util/target/setup/quiet_pip.py +0 -4
  421. ansible/modules/_include.py +0 -80
  422. ansible_test/_internal/commands/integration/cloud/foreman.py +0 -102
  423. ansible_test/_util/target/setup/ConfigureRemotingForAnsible.ps1 +0 -435
  424. {ansible_core-2.15.4rc1.data → ansible_core-2.16.0b2.data}/scripts/ansible-test +0 -0
  425. {ansible_core-2.15.4rc1.dist-info → ansible_core-2.16.0b2.dist-info}/WHEEL +0 -0
  426. {ansible_core-2.15.4rc1.dist-info → ansible_core-2.16.0b2.dist-info}/entry_points.txt +0 -0
  427. {ansible_core-2.15.4rc1.dist-info → ansible_core-2.16.0b2.dist-info}/top_level.txt +0 -0
@@ -18,5 +18,5 @@ EXAMPLES: |
18
18
 
19
19
  RETURN:
20
20
  _value:
21
- description: Returns C(True) if the path corresponds to a mount point on the controller, C(False) if otherwise.
21
+ description: Returns V(True) if the path corresponds to a mount point on the controller, V(False) if otherwise.
22
22
  type: boolean
@@ -20,5 +20,5 @@ EXAMPLES: |
20
20
 
21
21
  RETURN:
22
22
  _value:
23
- description: Returns C(True) if the paths correspond to the same location on the filesystem on the controller, C(False) if otherwise.
23
+ description: Returns V(True) if the paths correspond to the same location on the filesystem on the controller, V(False) if otherwise.
24
24
  type: boolean
@@ -16,5 +16,5 @@ EXAMPLES: |
16
16
 
17
17
  RETURN:
18
18
  _value:
19
- description: Returns C(True) if the input is NaN, C(False) if otherwise.
19
+ description: Returns V(True) if the input is NaN, V(False) if otherwise.
20
20
  type: boolean
@@ -6,7 +6,6 @@ DOCUMENTATION:
6
6
  short_description: is the list a subset of this other list
7
7
  description:
8
8
  - Validate if the first list is a sub set (is included) of the second list.
9
- - Same as the C(all) Python function.
10
9
  options:
11
10
  _input:
12
11
  description: List.
@@ -24,5 +23,5 @@ EXAMPLES: |
24
23
  issmallinbig: '{{ small is subset(big) }}'
25
24
  RETURN:
26
25
  _value:
27
- description: Returns C(True) if the specified list is a subset of the provided list, C(False) otherwise.
26
+ description: Returns V(True) if the specified list is a subset of the provided list, V(False) otherwise.
28
27
  type: boolean
@@ -6,7 +6,6 @@ DOCUMENTATION:
6
6
  aliases: [issuperset]
7
7
  description:
8
8
  - Validate if the first list is a super set (includes) the second list.
9
- - Same as the C(all) Python function.
10
9
  options:
11
10
  _input:
12
11
  description: List.
@@ -24,5 +23,5 @@ EXAMPLES: |
24
23
  issmallinbig: '{{ big is superset(small) }}'
25
24
  RETURN:
26
25
  _value:
27
- description: Returns C(True) if the specified list is a superset of the provided list, C(False) otherwise.
26
+ description: Returns V(True) if the specified list is a superset of the provided list, V(False) otherwise.
28
27
  type: boolean
@@ -17,5 +17,5 @@ EXAMPLES: |
17
17
 
18
18
  RETURN:
19
19
  _value:
20
- description: Returns C(True) if the path corresponds to an existing symlink on the filesystem on the controller, C(False) if otherwise.
20
+ description: Returns V(True) if the path corresponds to an existing symlink on the filesystem on the controller, V(False) if otherwise.
21
21
  type: boolean
@@ -17,5 +17,5 @@ EXAMPLES: |
17
17
 
18
18
  RETURN:
19
19
  _value:
20
- description: Returns C(True) if the path corresponds to an existing filesystem object on the controller, C(False) if otherwise.
20
+ description: Returns V(True) if the path corresponds to an existing filesystem object on the controller, V(False) if otherwise.
21
21
  type: boolean
@@ -19,7 +19,7 @@ DOCUMENTATION:
19
19
  type: boolean
20
20
  default: False
21
21
  multiline:
22
- description: Match against mulitple lines in string.
22
+ description: Match against multiple lines in string.
23
23
  type: boolean
24
24
  default: False
25
25
  EXAMPLES: |
@@ -28,5 +28,5 @@ EXAMPLES: |
28
28
  nomatch: url is match("/users/.*/resources")
29
29
  RETURN:
30
30
  _value:
31
- description: Returns C(True) if there is a match, C(False) otherwise.
31
+ description: Returns V(True) if there is a match, V(False) otherwise.
32
32
  type: boolean
@@ -18,5 +18,5 @@ EXAMPLES: |
18
18
 
19
19
  RETURN:
20
20
  _value:
21
- description: Returns C(True) if the path corresponds to a mount point on the controller, C(False) if otherwise.
21
+ description: Returns V(True) if the path corresponds to a mount point on the controller, V(False) if otherwise.
22
22
  type: boolean
@@ -16,5 +16,5 @@ EXAMPLES: |
16
16
 
17
17
  RETURN:
18
18
  _value:
19
- description: Returns C(True) if the input is NaN, C(False) if otherwise.
19
+ description: Returns V(True) if the input is NaN, V(False) if otherwise.
20
20
  type: boolean
@@ -5,7 +5,7 @@ DOCUMENTATION:
5
5
  short_description: Task did not end due to unreachable host
6
6
  description:
7
7
  - Tests if task was able to reach the host for execution
8
- - This test checks for the existance of a C(unreachable) key in the input dictionary and that it is C(False) if present
8
+ - This test checks for the existance of a C(unreachable) key in the input dictionary and that it is V(False) if present
9
9
  options:
10
10
  _input:
11
11
  description: registered result from an Ansible task
@@ -17,5 +17,5 @@ EXAMPLES: |
17
17
 
18
18
  RETURN:
19
19
  _value:
20
- description: Returns C(True) if the task did not flag the host as unreachable, C(False) otherwise.
20
+ description: Returns V(True) if the task did not flag the host as unreachable, V(False) otherwise.
21
21
  type: boolean
@@ -33,5 +33,5 @@ EXAMPLES: |
33
33
 
34
34
  RETURN:
35
35
  _value:
36
- description: Returns C(True) if there is a match, C(False) otherwise.
36
+ description: Returns V(True) if there is a match, V(False) otherwise.
37
37
  type: boolean
@@ -20,5 +20,5 @@ EXAMPLES: |
20
20
 
21
21
  RETURN:
22
22
  _value:
23
- description: Returns C(True) if the paths correspond to the same location on the filesystem on the controller, C(False) if otherwise.
23
+ description: Returns V(True) if the paths correspond to the same location on the filesystem on the controller, V(False) if otherwise.
24
24
  type: boolean
@@ -18,7 +18,7 @@ DOCUMENTATION:
18
18
  type: boolean
19
19
  default: False
20
20
  multiline:
21
- description: Match against mulitple lines in string.
21
+ description: Match against multiple lines in string.
22
22
  type: boolean
23
23
  default: False
24
24
 
@@ -29,5 +29,5 @@ EXAMPLES: |
29
29
 
30
30
  RETURN:
31
31
  _value:
32
- description: Returns C(True) if there is a match, C(False) otherwise.
32
+ description: Returns V(True) if there is a match, V(False) otherwise.
33
33
  type: boolean
@@ -6,7 +6,7 @@ DOCUMENTATION:
6
6
  aliases: [skip]
7
7
  description:
8
8
  - Tests if task was skipped
9
- - This test checks for the existance of a C(skipped) key in the input dictionary and that it is C(True) if present
9
+ - This test checks for the existance of a C(skipped) key in the input dictionary and that it is V(True) if present
10
10
  options:
11
11
  _input:
12
12
  description: registered result from an Ansible task
@@ -14,9 +14,9 @@ DOCUMENTATION:
14
14
  required: True
15
15
  EXAMPLES: |
16
16
  # test 'status' to know how to respond
17
- {{ (taskresults is skipped}}
17
+ {{ taskresults is skipped }}
18
18
 
19
19
  RETURN:
20
20
  _value:
21
- description: Returns C(True) if the task was skipped, C(False) otherwise.
21
+ description: Returns V(True) if the task was skipped, V(False) otherwise.
22
22
  type: boolean
@@ -6,7 +6,7 @@ DOCUMENTATION:
6
6
  aliases: [skip]
7
7
  description:
8
8
  - Tests if task was skipped
9
- - This test checks for the existance of a C(skipped) key in the input dictionary and that it is C(True) if present
9
+ - This test checks for the existance of a C(skipped) key in the input dictionary and that it is V(True) if present
10
10
  options:
11
11
  _input:
12
12
  description: registered result from an Ansible task
@@ -14,9 +14,9 @@ DOCUMENTATION:
14
14
  required: True
15
15
  EXAMPLES: |
16
16
  # test 'status' to know how to respond
17
- {{ (taskresults is skipped}}
17
+ {{ taskresults is skipped }}
18
18
 
19
19
  RETURN:
20
20
  _value:
21
- description: Returns C(True) if the task was skipped, C(False) otherwise.
21
+ description: Returns V(True) if the task was skipped, V(False) otherwise.
22
22
  type: boolean
@@ -5,7 +5,7 @@ DOCUMENTATION:
5
5
  short_description: Was async task started
6
6
  description:
7
7
  - Used to check if an async task has started, will also work with non async tasks but will issue a warning.
8
- - This test checks for the existance of a C(started) key in the input dictionary and that it is C(1) if present
8
+ - This test checks for the existance of a C(started) key in the input dictionary and that it is V(1) if present
9
9
  options:
10
10
  _input:
11
11
  description: registered result from an Ansible task
@@ -17,5 +17,5 @@ EXAMPLES: |
17
17
 
18
18
  RETURN:
19
19
  _value:
20
- description: Returns C(True) if the task has started, C(False) otherwise.
20
+ description: Returns V(True) if the task has started, V(False) otherwise.
21
21
  type: boolean
@@ -6,7 +6,6 @@ DOCUMENTATION:
6
6
  short_description: is the list a subset of this other list
7
7
  description:
8
8
  - Validate if the first list is a sub set (is included) of the second list.
9
- - Same as the C(all) Python function.
10
9
  options:
11
10
  _input:
12
11
  description: List.
@@ -24,5 +23,5 @@ EXAMPLES: |
24
23
  issmallinbig: '{{ small is subset(big) }}'
25
24
  RETURN:
26
25
  _value:
27
- description: Returns C(True) if the specified list is a subset of the provided list, C(False) otherwise.
26
+ description: Returns V(True) if the specified list is a subset of the provided list, V(False) otherwise.
28
27
  type: boolean
@@ -6,7 +6,7 @@ DOCUMENTATION:
6
6
  aliases: [succeeded, successful]
7
7
  description:
8
8
  - Tests if task finished successfully, opposite of C(failed).
9
- - This test checks for the existance of a C(failed) key in the input dictionary and that it is C(False) if present
9
+ - This test checks for the existance of a C(failed) key in the input dictionary and that it is V(False) if present
10
10
  options:
11
11
  _input:
12
12
  description: registered result from an Ansible task
@@ -18,5 +18,5 @@ EXAMPLES: |
18
18
 
19
19
  RETURN:
20
20
  _value:
21
- description: Returns C(True) if the task was successfully completed, C(False) otherwise.
21
+ description: Returns V(True) if the task was successfully completed, V(False) otherwise.
22
22
  type: boolean
@@ -6,7 +6,7 @@ DOCUMENTATION:
6
6
  aliases: [succeeded, successful]
7
7
  description:
8
8
  - Tests if task finished successfully, opposite of C(failed).
9
- - This test checks for the existance of a C(failed) key in the input dictionary and that it is C(False) if present
9
+ - This test checks for the existance of a C(failed) key in the input dictionary and that it is V(False) if present
10
10
  options:
11
11
  _input:
12
12
  description: registered result from an Ansible task
@@ -18,5 +18,5 @@ EXAMPLES: |
18
18
 
19
19
  RETURN:
20
20
  _value:
21
- description: Returns C(True) if the task was successfully completed, C(False) otherwise.
21
+ description: Returns V(True) if the task was successfully completed, V(False) otherwise.
22
22
  type: boolean
@@ -6,7 +6,7 @@ DOCUMENTATION:
6
6
  aliases: [succeeded, successful]
7
7
  description:
8
8
  - Tests if task finished successfully, opposite of C(failed).
9
- - This test checks for the existance of a C(failed) key in the input dictionary and that it is C(False) if present
9
+ - This test checks for the existance of a C(failed) key in the input dictionary and that it is V(False) if present
10
10
  options:
11
11
  _input:
12
12
  description: registered result from an Ansible task
@@ -18,5 +18,5 @@ EXAMPLES: |
18
18
 
19
19
  RETURN:
20
20
  _value:
21
- description: Returns C(True) if the task was successfully completed, C(False) otherwise.
21
+ description: Returns V(True) if the task was successfully completed, V(False) otherwise.
22
22
  type: boolean
@@ -6,7 +6,6 @@ DOCUMENTATION:
6
6
  aliases: [issuperset]
7
7
  description:
8
8
  - Validate if the first list is a super set (includes) the second list.
9
- - Same as the C(all) Python function.
10
9
  options:
11
10
  _input:
12
11
  description: List.
@@ -24,5 +23,5 @@ EXAMPLES: |
24
23
  issmallinbig: '{{ big is superset(small) }}'
25
24
  RETURN:
26
25
  _value:
27
- description: Returns C(True) if the specified list is a superset of the provided list, C(False) otherwise.
26
+ description: Returns V(True) if the specified list is a superset of the provided list, V(False) otherwise.
28
27
  type: boolean
@@ -5,14 +5,14 @@ DOCUMENTATION:
5
5
  short_description: Pythonic true
6
6
  description:
7
7
  - This check is a more Python version of what is 'true'.
8
- - It is the opposite of C(falsy).
8
+ - It is the opposite of P(ansible.builtin.falsy#test).
9
9
  options:
10
10
  _input:
11
11
  description: An expression that can be expressed in a boolean context.
12
12
  type: string
13
13
  required: True
14
14
  convert_bool:
15
- description: Attempts to convert to strict python boolean vs normally acceptable values (C(yes)/C(no), C(on)/C(off), C(0)/C(1), etc).
15
+ description: Attempts to convert to strict python boolean vs normally acceptable values (V(yes)/V(no), V(on)/V(off), V(0)/V(1), etc).
16
16
  type: bool
17
17
  default: false
18
18
  EXAMPLES: |
@@ -20,5 +20,5 @@ EXAMPLES: |
20
20
  thisisfalse: '{{ "" is truthy }}'
21
21
  RETURN:
22
22
  _value:
23
- description: Returns C(True) if the condition is not "Python truthy", C(False) otherwise.
23
+ description: Returns V(True) if the condition is not "Python truthy", V(False) otherwise.
24
24
  type: boolean
@@ -5,7 +5,7 @@ DOCUMENTATION:
5
5
  short_description: Did task end due to the host was unreachable
6
6
  description:
7
7
  - Tests if task was not able to reach the host for execution
8
- - This test checks for the existance of a C(unreachable) key in the input dictionary and that it's value is C(True)
8
+ - This test checks for the existance of a C(unreachable) key in the input dictionary and that it's value is V(True)
9
9
  options:
10
10
  _input:
11
11
  description: registered result from an Ansible task
@@ -17,5 +17,5 @@ EXAMPLES: |
17
17
 
18
18
  RETURN:
19
19
  _value:
20
- description: Returns C(True) if the task flagged the host as unreachable, C(False) otherwise.
20
+ description: Returns V(True) if the task flagged the host as unreachable, V(False) otherwise.
21
21
  type: boolean
@@ -26,5 +26,5 @@ EXAMPLES: |
26
26
  {{ 'http://nobody:secret@example.com' is uri(['ftp', 'ftps', 'http', 'https', 'ws', 'wss']) }}
27
27
  RETURN:
28
28
  _value:
29
- description: Returns C(false) if the string is not a URI or the schema extracted does not match the supplied list.
29
+ description: Returns V(false) if the string is not a URI or the schema extracted does not match the supplied list.
30
30
  type: boolean
@@ -25,5 +25,5 @@ EXAMPLES: |
25
25
  {{ 'ftp://admin:secret@example.com/path/to/myfile.yml' is url }}
26
26
  RETURN:
27
27
  _value:
28
- description: Returns C(false) if the string is not a URL, C(true) otherwise.
28
+ description: Returns V(false) if the string is not a URL, V(true) otherwise.
29
29
  type: boolean
@@ -17,5 +17,5 @@ EXAMPLES: |
17
17
  {{ 'mailto://nowone@example.com' is not urn }}
18
18
  RETURN:
19
19
  _value:
20
- description: Returns C(true) if the string is a URN and C(false) if it is not.
20
+ description: Returns V(true) if the string is a URN and V(false) if it is not.
21
21
  type: boolean
@@ -15,5 +15,5 @@ EXAMPLES: |
15
15
  thisistrue: '{{ "$ANSIBLE_VAULT;1.2;AES256;dev...." is ansible_vault }}'
16
16
  RETURN:
17
17
  _value:
18
- description: Returns C(True) if the input is a valid ansible vault, C(False) otherwise.
18
+ description: Returns V(True) if the input is a valid ansible vault, V(False) otherwise.
19
19
  type: boolean
@@ -36,12 +36,12 @@ DOCUMENTATION:
36
36
  - ne
37
37
  default: eq
38
38
  strict:
39
- description: Whether to use strict version scheme. Mutually exclusive with C(version_type)
39
+ description: Whether to use strict version scheme. Mutually exclusive with O(version_type)
40
40
  type: boolean
41
41
  required: False
42
42
  default: False
43
43
  version_type:
44
- description: Version scheme to use for comparison. Mutually exclusive with C(strict). See C(notes) for descriptions on the version types.
44
+ description: Version scheme to use for comparison. Mutually exclusive with O(strict). See C(notes) for descriptions on the version types.
45
45
  type: string
46
46
  required: False
47
47
  choices:
@@ -52,10 +52,10 @@ DOCUMENTATION:
52
52
  - pep440
53
53
  default: loose
54
54
  notes:
55
- - C(loose) - This type corresponds to the Python C(distutils.version.LooseVersion) class. All version formats are valid for this type. The rules for comparison are simple and predictable, but may not always give expected results.
56
- - C(strict) - This type corresponds to the Python C(distutils.version.StrictVersion) class. A version number consists of two or three dot-separated numeric components, with an optional "pre-release" tag on the end. The pre-release tag consists of a single letter C(a) or C(b) followed by a number. If the numeric components of two version numbers are equal, then one with a pre-release tag will always be deemed earlier (lesser) than one without.
57
- - C(semver)/C(semantic) - This type implements the L(Semantic Version,https://semver.org) scheme for version comparison.
58
- - C(pep440) - This type implements the Python L(PEP-440,https://peps.python.org/pep-0440/) versioning rules for version comparison. Added in version 2.14.
55
+ - V(loose) - This type corresponds to the Python C(distutils.version.LooseVersion) class. All version formats are valid for this type. The rules for comparison are simple and predictable, but may not always give expected results.
56
+ - V(strict) - This type corresponds to the Python C(distutils.version.StrictVersion) class. A version number consists of two or three dot-separated numeric components, with an optional "pre-release" tag on the end. The pre-release tag consists of a single letter C(a) or C(b) followed by a number. If the numeric components of two version numbers are equal, then one with a pre-release tag will always be deemed earlier (lesser) than one without.
57
+ - V(semver)/V(semantic) - This type implements the L(Semantic Version,https://semver.org) scheme for version comparison.
58
+ - V(pep440) - This type implements the Python L(PEP-440,https://peps.python.org/pep-0440/) versioning rules for version comparison. Added in version 2.14.
59
59
  EXAMPLES: |
60
60
  - name: version test examples
61
61
  assert:
@@ -78,5 +78,5 @@ EXAMPLES: |
78
78
  - "'2.14.0rc1' is version('2.14.0', 'lt', version_type='pep440')"
79
79
  RETURN:
80
80
  _value:
81
- description: Returns C(True) or C(False) depending on the outcome of the comparison.
81
+ description: Returns V(True) or V(False) depending on the outcome of the comparison.
82
82
  type: boolean
@@ -36,12 +36,12 @@ DOCUMENTATION:
36
36
  - ne
37
37
  default: eq
38
38
  strict:
39
- description: Whether to use strict version scheme. Mutually exclusive with C(version_type)
39
+ description: Whether to use strict version scheme. Mutually exclusive with O(version_type)
40
40
  type: boolean
41
41
  required: False
42
42
  default: False
43
43
  version_type:
44
- description: Version scheme to use for comparison. Mutually exclusive with C(strict). See C(notes) for descriptions on the version types.
44
+ description: Version scheme to use for comparison. Mutually exclusive with O(strict). See C(notes) for descriptions on the version types.
45
45
  type: string
46
46
  required: False
47
47
  choices:
@@ -52,10 +52,10 @@ DOCUMENTATION:
52
52
  - pep440
53
53
  default: loose
54
54
  notes:
55
- - C(loose) - This type corresponds to the Python C(distutils.version.LooseVersion) class. All version formats are valid for this type. The rules for comparison are simple and predictable, but may not always give expected results.
56
- - C(strict) - This type corresponds to the Python C(distutils.version.StrictVersion) class. A version number consists of two or three dot-separated numeric components, with an optional "pre-release" tag on the end. The pre-release tag consists of a single letter C(a) or C(b) followed by a number. If the numeric components of two version numbers are equal, then one with a pre-release tag will always be deemed earlier (lesser) than one without.
57
- - C(semver)/C(semantic) - This type implements the L(Semantic Version,https://semver.org) scheme for version comparison.
58
- - C(pep440) - This type implements the Python L(PEP-440,https://peps.python.org/pep-0440/) versioning rules for version comparison. Added in version 2.14.
55
+ - V(loose) - This type corresponds to the Python C(distutils.version.LooseVersion) class. All version formats are valid for this type. The rules for comparison are simple and predictable, but may not always give expected results.
56
+ - V(strict) - This type corresponds to the Python C(distutils.version.StrictVersion) class. A version number consists of two or three dot-separated numeric components, with an optional "pre-release" tag on the end. The pre-release tag consists of a single letter C(a) or C(b) followed by a number. If the numeric components of two version numbers are equal, then one with a pre-release tag will always be deemed earlier (lesser) than one without.
57
+ - V(semver)/V(semantic) - This type implements the L(Semantic Version,https://semver.org) scheme for version comparison.
58
+ - V(pep440) - This type implements the Python L(PEP-440,https://peps.python.org/pep-0440/) versioning rules for version comparison. Added in version 2.14.
59
59
  EXAMPLES: |
60
60
  - name: version test examples
61
61
  assert:
@@ -78,5 +78,5 @@ EXAMPLES: |
78
78
  - "'2.14.0rc1' is version('2.14.0', 'lt', version_type='pep440')"
79
79
  RETURN:
80
80
  _value:
81
- description: Returns C(True) or C(False) depending on the outcome of the comparison.
81
+ description: Returns V(True) or V(False) depending on the outcome of the comparison.
82
82
  type: boolean
@@ -55,7 +55,7 @@ DOCUMENTATION = '''
55
55
 
56
56
  import os
57
57
  from ansible.errors import AnsibleParserError
58
- from ansible.module_utils._text import to_bytes, to_native, to_text
58
+ from ansible.module_utils.common.text.converters import to_bytes, to_native, to_text
59
59
  from ansible.plugins.vars import BaseVarsPlugin
60
60
  from ansible.inventory.host import Host
61
61
  from ansible.inventory.group import Group
ansible/release.py CHANGED
@@ -19,6 +19,6 @@
19
19
  from __future__ import (absolute_import, division, print_function)
20
20
  __metaclass__ = type
21
21
 
22
- __version__ = '2.15.4rc1'
22
+ __version__ = '2.16.0b2'
23
23
  __author__ = 'Ansible, Inc.'
24
- __codename__ = "Ten Years Gone"
24
+ __codename__ = "All My Love"
@@ -45,8 +45,8 @@ from ansible.errors import (
45
45
  AnsibleOptionsError,
46
46
  AnsibleUndefinedVariable,
47
47
  )
48
- from ansible.module_utils.six import string_types, text_type
49
- from ansible.module_utils._text import to_native, to_text, to_bytes
48
+ from ansible.module_utils.six import string_types
49
+ from ansible.module_utils.common.text.converters import to_native, to_text, to_bytes
50
50
  from ansible.module_utils.common.collections import is_sequence
51
51
  from ansible.plugins.loader import filter_loader, lookup_loader, test_loader
52
52
  from ansible.template.native_helpers import ansible_native_concat, ansible_eval_concat, ansible_concat
@@ -55,7 +55,7 @@ from ansible.template.vars import AnsibleJ2Vars
55
55
  from ansible.utils.display import Display
56
56
  from ansible.utils.listify import listify_lookup_plugin_terms
57
57
  from ansible.utils.native_jinja import NativeJinjaText
58
- from ansible.utils.unsafe_proxy import wrap_var
58
+ from ansible.utils.unsafe_proxy import to_unsafe_text, wrap_var
59
59
 
60
60
  display = Display()
61
61
 
@@ -103,9 +103,9 @@ def generate_ansible_template_vars(path, fullpath=None, dest_path=None):
103
103
  managed_str = managed_default.format(
104
104
  host=temp_vars['template_host'],
105
105
  uid=temp_vars['template_uid'],
106
- file=temp_vars['template_path'],
106
+ file=temp_vars['template_path'].replace('%', '%%'),
107
107
  )
108
- temp_vars['ansible_managed'] = to_text(time.strftime(to_native(managed_str), time.localtime(os.path.getmtime(b_path))))
108
+ temp_vars['ansible_managed'] = to_unsafe_text(time.strftime(to_native(managed_str), time.localtime(os.path.getmtime(b_path))))
109
109
 
110
110
  return temp_vars
111
111
 
@@ -130,7 +130,7 @@ def _escape_backslashes(data, jinja_env):
130
130
  backslashes inside of a jinja2 expression.
131
131
 
132
132
  """
133
- if '\\' in data and '{{' in data:
133
+ if '\\' in data and jinja_env.variable_start_string in data:
134
134
  new_data = []
135
135
  d2 = jinja_env.preprocess(data)
136
136
  in_var = False
@@ -445,11 +445,11 @@ class JinjaPluginIntercept(MutableMapping):
445
445
 
446
446
  self._pluginloader = pluginloader
447
447
 
448
- # cache of resolved plugins
448
+ # Jinja environment's mapping of known names (initially just J2 builtins)
449
449
  self._delegatee = delegatee
450
450
 
451
- # track loaded plugins here as cache above includes 'jinja2' filters but ours should override
452
- self._loaded_builtins = set()
451
+ # our names take precedence over Jinja's, but let things we've tried to resolve skip the pluginloader
452
+ self._seen_it = set()
453
453
 
454
454
  def __getitem__(self, key):
455
455
 
@@ -457,7 +457,10 @@ class JinjaPluginIntercept(MutableMapping):
457
457
  raise ValueError('key must be a string, got %s instead' % type(key))
458
458
 
459
459
  original_exc = None
460
- if key not in self._loaded_builtins:
460
+ if key not in self._seen_it:
461
+ # this looks too early to set this- it isn't. Setting it here keeps requests for Jinja builtins from
462
+ # going through the pluginloader more than once, which is extremely slow for something that won't ever succeed.
463
+ self._seen_it.add(key)
461
464
  plugin = None
462
465
  try:
463
466
  plugin = self._pluginloader.get(key)
@@ -471,12 +474,12 @@ class JinjaPluginIntercept(MutableMapping):
471
474
  if plugin:
472
475
  # set in filter cache and avoid expensive plugin load
473
476
  self._delegatee[key] = plugin.j2_function
474
- self._loaded_builtins.add(key)
475
477
 
476
478
  # raise template syntax error if we could not find ours or jinja2 one
477
479
  try:
478
480
  func = self._delegatee[key]
479
481
  except KeyError as e:
482
+ self._seen_it.remove(key)
480
483
  raise TemplateSyntaxError('Could not load "%s": %s' % (key, to_native(original_exc or e)), 0)
481
484
 
482
485
  # if i do have func and it is a filter, it nees wrapping
@@ -578,14 +581,7 @@ class Templar:
578
581
  The main class for templating, with the main entry-point of template().
579
582
  '''
580
583
 
581
- def __init__(self, loader, shared_loader_obj=None, variables=None):
582
- if shared_loader_obj is not None:
583
- display.deprecated(
584
- "The `shared_loader_obj` option to `Templar` is no longer functional, "
585
- "ansible.plugins.loader is used directly instead.",
586
- version='2.16',
587
- )
588
-
584
+ def __init__(self, loader, variables=None):
589
585
  self._loader = loader
590
586
  self._available_variables = {} if variables is None else variables
591
587
 
@@ -599,9 +595,6 @@ class Templar:
599
595
  )
600
596
  self.environment.template_class.environment_class = environment_class
601
597
 
602
- # jinja2 global is inconsistent across versions, this normalizes them
603
- self.environment.globals['dict'] = dict
604
-
605
598
  # Custom globals
606
599
  self.environment.globals['lookup'] = self._lookup
607
600
  self.environment.globals['query'] = self.environment.globals['q'] = self._query_lookup
@@ -611,11 +604,14 @@ class Templar:
611
604
  # the current rendering context under which the templar class is working
612
605
  self.cur_context = None
613
606
 
614
- # FIXME this regex should be re-compiled each time variable_start_string and variable_end_string are changed
615
- self.SINGLE_VAR = re.compile(r"^%s\s*(\w*)\s*%s$" % (self.environment.variable_start_string, self.environment.variable_end_string))
607
+ # this regex is re-compiled each time variable_start_string and variable_end_string are possibly changed
608
+ self._compile_single_var(self.environment)
616
609
 
617
610
  self.jinja2_native = C.DEFAULT_JINJA2_NATIVE
618
611
 
612
+ def _compile_single_var(self, env):
613
+ self.SINGLE_VAR = re.compile(r"^%s\s*(\w*)\s*%s$" % (env.variable_start_string, env.variable_end_string))
614
+
619
615
  def copy_with_new_env(self, environment_class=AnsibleEnvironment, **kwargs):
620
616
  r"""Creates a new copy of Templar with a new environment.
621
617
 
@@ -763,6 +759,7 @@ class Templar:
763
759
  disable_lookups=disable_lookups,
764
760
  convert_data=convert_data,
765
761
  )
762
+ self._compile_single_var(self.environment)
766
763
 
767
764
  return result
768
765
 
@@ -835,7 +832,7 @@ class Templar:
835
832
  def _now_datetime(self, utc=False, fmt=None):
836
833
  '''jinja2 global function to return current datetime, potentially formatted via strftime'''
837
834
  if utc:
838
- now = datetime.datetime.utcnow()
835
+ now = datetime.datetime.now(datetime.timezone.utc).replace(tzinfo=None)
839
836
  else:
840
837
  now = datetime.datetime.now()
841
838
 
@@ -955,8 +952,9 @@ class Templar:
955
952
  try:
956
953
  # NOTE Creating an overlay that lives only inside do_template means that overrides are not applied
957
954
  # when templating nested variables in AnsibleJ2Vars where Templar.environment is used, not the overlay.
958
- # This is historic behavior that is kept for backwards compatibility.
959
955
  data, myenv = _create_overlay(data, overrides, self.environment)
956
+ # in case delimiters change
957
+ self._compile_single_var(myenv)
960
958
 
961
959
  if escape_backslashes:
962
960
  # Allow users to specify backslashes in playbooks as "\\" instead of as "\\\\".
@@ -10,7 +10,7 @@ import ast
10
10
  from itertools import islice, chain
11
11
  from types import GeneratorType
12
12
 
13
- from ansible.module_utils._text import to_text
13
+ from ansible.module_utils.common.text.converters import to_text
14
14
  from ansible.module_utils.six import string_types
15
15
  from ansible.parsing.yaml.objects import AnsibleVaultEncryptedUnicode
16
16
  from ansible.utils.native_jinja import NativeJinjaText
ansible/template/vars.py CHANGED
@@ -6,7 +6,7 @@ from collections import ChainMap
6
6
  from jinja2.utils import missing
7
7
 
8
8
  from ansible.errors import AnsibleError, AnsibleUndefinedVariable
9
- from ansible.module_utils._text import to_native
9
+ from ansible.module_utils.common.text.converters import to_native
10
10
 
11
11
 
12
12
  __all__ = ['AnsibleJ2Vars']