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.
- ansible/_internal/__init__.py +53 -0
- ansible/_internal/_ansiballz.py +265 -0
- ansible/_internal/_collection_proxy.py +47 -0
- ansible/_internal/_datatag/__init__.py +0 -0
- ansible/_internal/_datatag/_tags.py +130 -0
- ansible/_internal/_datatag/_utils.py +19 -0
- ansible/_internal/_datatag/_wrappers.py +33 -0
- ansible/_internal/_errors/__init__.py +0 -0
- ansible/_internal/_errors/_captured.py +128 -0
- ansible/_internal/_errors/_handler.py +91 -0
- ansible/_internal/_errors/_utils.py +310 -0
- ansible/_internal/_json/__init__.py +203 -0
- ansible/_internal/_json/_legacy_encoder.py +34 -0
- ansible/_internal/_json/_profiles/__init__.py +0 -0
- ansible/_internal/_json/_profiles/_cache_persistence.py +55 -0
- ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
- ansible/_internal/_json/_profiles/_legacy.py +197 -0
- ansible/_internal/_locking.py +21 -0
- ansible/_internal/_plugins/__init__.py +0 -0
- ansible/_internal/_plugins/_cache.py +57 -0
- ansible/_internal/_task.py +78 -0
- ansible/_internal/_templating/__init__.py +10 -0
- ansible/_internal/_templating/_access.py +86 -0
- ansible/_internal/_templating/_chain_templar.py +63 -0
- ansible/_internal/_templating/_datatag.py +95 -0
- ansible/_internal/_templating/_engine.py +588 -0
- ansible/_internal/_templating/_errors.py +28 -0
- ansible/_internal/_templating/_jinja_bits.py +1066 -0
- ansible/_internal/_templating/_jinja_common.py +332 -0
- ansible/_internal/_templating/_jinja_patches.py +44 -0
- ansible/_internal/_templating/_jinja_plugins.py +345 -0
- ansible/_internal/_templating/_lazy_containers.py +633 -0
- ansible/_internal/_templating/_marker_behaviors.py +103 -0
- ansible/_internal/_templating/_transform.py +63 -0
- ansible/_internal/_templating/_utils.py +107 -0
- ansible/_internal/_wrapt.py +1052 -0
- ansible/_internal/_yaml/__init__.py +0 -0
- ansible/_internal/_yaml/_constructor.py +240 -0
- ansible/_internal/_yaml/_dumper.py +62 -0
- ansible/_internal/_yaml/_errors.py +166 -0
- ansible/_internal/_yaml/_loader.py +66 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/README.md +11 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/action/debug.py +36 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/apply_trust.py +19 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/dump_object.py +18 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/finalize.py +16 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/origin.py +18 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.py +24 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.yml +33 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/tag_names.py +16 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +17 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +49 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.py +21 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.yml +2 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.py +15 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.yml +19 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.py +18 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.yml +19 -0
- ansible/cli/__init__.py +159 -89
- ansible/cli/_ssh_askpass.py +47 -0
- ansible/cli/adhoc.py +14 -7
- ansible/cli/arguments/option_helpers.py +154 -7
- ansible/cli/config.py +43 -68
- ansible/cli/console.py +10 -8
- ansible/cli/doc.py +62 -53
- ansible/cli/galaxy.py +27 -20
- ansible/cli/inventory.py +28 -26
- ansible/cli/playbook.py +4 -12
- ansible/cli/pull.py +51 -11
- ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
- ansible/cli/vault.py +12 -11
- ansible/compat/__init__.py +2 -2
- ansible/config/base.yml +166 -112
- ansible/config/manager.py +52 -49
- ansible/constants.py +3 -4
- ansible/errors/__init__.py +277 -235
- ansible/executor/interpreter_discovery.py +28 -149
- ansible/executor/module_common.py +426 -493
- ansible/executor/play_iterator.py +22 -27
- ansible/executor/playbook_executor.py +11 -11
- ansible/executor/powershell/async_watchdog.ps1 +97 -102
- ansible/executor/powershell/async_wrapper.ps1 +202 -151
- ansible/executor/powershell/become_wrapper.ps1 +89 -144
- ansible/executor/powershell/bootstrap_wrapper.ps1 +24 -9
- ansible/executor/powershell/coverage_wrapper.ps1 +82 -135
- ansible/executor/powershell/exec_wrapper.ps1 +462 -196
- ansible/executor/powershell/module_manifest.py +417 -265
- ansible/executor/powershell/module_wrapper.ps1 +169 -186
- ansible/executor/powershell/psrp_fetch_file.ps1 +41 -0
- ansible/executor/powershell/psrp_put_file.ps1 +122 -0
- ansible/executor/powershell/winrm_fetch_file.ps1 +46 -0
- ansible/executor/powershell/winrm_put_file.ps1 +36 -0
- ansible/executor/process/worker.py +161 -96
- ansible/executor/stats.py +5 -5
- ansible/executor/task_executor.py +268 -258
- ansible/executor/task_queue_manager.py +124 -90
- ansible/executor/task_result.py +183 -78
- ansible/galaxy/__init__.py +2 -2
- ansible/galaxy/api.py +22 -18
- ansible/galaxy/collection/__init__.py +1 -1
- ansible/galaxy/collection/concrete_artifact_manager.py +8 -11
- ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
- ansible/galaxy/dependency_resolution/providers.py +1 -1
- ansible/galaxy/dependency_resolution/reporters.py +81 -0
- ansible/galaxy/role.py +4 -8
- ansible/galaxy/token.py +28 -21
- ansible/inventory/data.py +47 -57
- ansible/inventory/group.py +44 -72
- ansible/inventory/helpers.py +9 -0
- ansible/inventory/host.py +32 -54
- ansible/inventory/manager.py +78 -34
- ansible/keyword_desc.yml +1 -1
- ansible/module_utils/_internal/__init__.py +55 -0
- ansible/module_utils/_internal/_ambient_context.py +58 -0
- ansible/module_utils/_internal/_ansiballz.py +133 -0
- ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
- ansible/module_utils/_internal/_dataclass_annotation_patch.py +64 -0
- ansible/module_utils/_internal/_dataclass_validation.py +217 -0
- ansible/module_utils/_internal/_datatag/__init__.py +928 -0
- ansible/module_utils/_internal/_datatag/_tags.py +38 -0
- ansible/module_utils/_internal/_debugging.py +31 -0
- ansible/module_utils/_internal/_errors.py +30 -0
- ansible/module_utils/_internal/_json/__init__.py +63 -0
- ansible/module_utils/_internal/_json/_legacy_encoder.py +26 -0
- ansible/module_utils/_internal/_json/_profiles/__init__.py +410 -0
- ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
- ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +31 -0
- ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +35 -0
- ansible/module_utils/_internal/_json/_profiles/_module_modern_c2m.py +35 -0
- ansible/module_utils/_internal/_json/_profiles/_module_modern_m2c.py +33 -0
- ansible/module_utils/_internal/_json/_profiles/_tagless.py +50 -0
- ansible/module_utils/_internal/_patches/__init__.py +66 -0
- ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +55 -0
- ansible/module_utils/_internal/_patches/_socket_patch.py +34 -0
- ansible/module_utils/_internal/_patches/_sys_intern_patch.py +34 -0
- ansible/module_utils/_internal/_plugin_exec_context.py +49 -0
- ansible/module_utils/_internal/_testing.py +0 -0
- ansible/module_utils/_internal/_traceback.py +89 -0
- ansible/module_utils/ansible_release.py +2 -2
- ansible/module_utils/api.py +1 -2
- ansible/module_utils/basic.py +152 -120
- ansible/module_utils/common/_utils.py +24 -28
- ansible/module_utils/common/collections.py +1 -2
- ansible/module_utils/common/dict_transformations.py +2 -2
- ansible/module_utils/common/file.py +2 -2
- ansible/module_utils/common/json.py +90 -84
- ansible/module_utils/common/locale.py +2 -2
- ansible/module_utils/common/messages.py +108 -0
- ansible/module_utils/common/parameters.py +27 -24
- ansible/module_utils/common/process.py +2 -2
- ansible/module_utils/common/respawn.py +41 -19
- ansible/module_utils/common/sentinel.py +66 -0
- ansible/module_utils/common/sys_info.py +8 -8
- ansible/module_utils/common/text/converters.py +16 -37
- ansible/module_utils/common/validation.py +35 -24
- ansible/module_utils/common/warnings.py +86 -25
- ansible/module_utils/common/yaml.py +29 -3
- ansible/module_utils/compat/datetime.py +33 -21
- ansible/module_utils/compat/paramiko.py +21 -10
- ansible/module_utils/compat/typing.py +6 -5
- ansible/module_utils/connection.py +2 -2
- ansible/module_utils/csharp/Ansible.Basic.cs +14 -11
- ansible/module_utils/csharp/Ansible.Become.cs +1 -0
- ansible/module_utils/csharp/Ansible._Async.cs +517 -0
- ansible/module_utils/datatag.py +46 -0
- ansible/module_utils/distro/__init__.py +2 -2
- ansible/module_utils/facts/ansible_collector.py +4 -5
- ansible/module_utils/facts/collector.py +13 -14
- ansible/module_utils/facts/compat.py +4 -4
- ansible/module_utils/facts/default_collectors.py +1 -1
- ansible/module_utils/facts/hardware/aix.py +34 -0
- ansible/module_utils/facts/hardware/base.py +1 -1
- ansible/module_utils/facts/hardware/darwin.py +1 -3
- ansible/module_utils/facts/hardware/freebsd.py +2 -2
- ansible/module_utils/facts/hardware/linux.py +4 -4
- ansible/module_utils/facts/namespace.py +1 -1
- ansible/module_utils/facts/network/base.py +1 -1
- ansible/module_utils/facts/network/fc_wwn.py +1 -2
- ansible/module_utils/facts/network/iscsi.py +1 -2
- ansible/module_utils/facts/network/nvme.py +1 -2
- ansible/module_utils/facts/other/facter.py +1 -2
- ansible/module_utils/facts/other/ohai.py +2 -3
- ansible/module_utils/facts/system/apparmor.py +1 -2
- ansible/module_utils/facts/system/caps.py +1 -1
- ansible/module_utils/facts/system/chroot.py +1 -2
- ansible/module_utils/facts/system/cmdline.py +1 -2
- ansible/module_utils/facts/system/date_time.py +5 -3
- ansible/module_utils/facts/system/distribution.py +9 -8
- ansible/module_utils/facts/system/dns.py +1 -1
- ansible/module_utils/facts/system/env.py +1 -2
- ansible/module_utils/facts/system/fips.py +7 -20
- ansible/module_utils/facts/system/loadavg.py +1 -2
- ansible/module_utils/facts/system/local.py +1 -2
- ansible/module_utils/facts/system/lsb.py +1 -2
- ansible/module_utils/facts/system/pkg_mgr.py +1 -2
- ansible/module_utils/facts/system/platform.py +1 -2
- ansible/module_utils/facts/system/python.py +1 -2
- ansible/module_utils/facts/system/selinux.py +1 -1
- ansible/module_utils/facts/system/service_mgr.py +1 -2
- ansible/module_utils/facts/system/ssh_pub_keys.py +1 -1
- ansible/module_utils/facts/system/systemd.py +1 -1
- ansible/module_utils/facts/system/user.py +1 -2
- ansible/module_utils/facts/utils.py +3 -3
- ansible/module_utils/facts/virtual/base.py +1 -1
- ansible/module_utils/facts/virtual/sunos.py +3 -15
- ansible/module_utils/facts/virtual/sysctl.py +3 -16
- ansible/module_utils/json_utils.py +2 -2
- ansible/module_utils/parsing/convert_bool.py +1 -1
- ansible/module_utils/service.py +18 -21
- ansible/module_utils/splitter.py +7 -7
- ansible/module_utils/testing.py +31 -0
- ansible/module_utils/urls.py +60 -31
- ansible/modules/add_host.py +4 -4
- ansible/modules/apt.py +60 -46
- ansible/modules/apt_key.py +19 -12
- ansible/modules/apt_repository.py +19 -16
- ansible/modules/assemble.py +6 -6
- ansible/modules/assert.py +4 -4
- ansible/modules/async_status.py +10 -12
- ansible/modules/async_wrapper.py +8 -3
- ansible/modules/blockinfile.py +6 -7
- ansible/modules/command.py +10 -17
- ansible/modules/copy.py +57 -144
- ansible/modules/cron.py +20 -15
- ansible/modules/deb822_repository.py +8 -9
- ansible/modules/debconf.py +5 -5
- ansible/modules/debug.py +4 -4
- ansible/modules/dnf.py +8 -8
- ansible/modules/dnf5.py +39 -13
- ansible/modules/dpkg_selections.py +4 -4
- ansible/modules/expect.py +8 -10
- ansible/modules/fail.py +4 -4
- ansible/modules/fetch.py +4 -4
- ansible/modules/file.py +174 -133
- ansible/modules/find.py +19 -17
- ansible/modules/gather_facts.py +3 -3
- ansible/modules/get_url.py +59 -53
- ansible/modules/getent.py +7 -9
- ansible/modules/git.py +28 -25
- ansible/modules/group.py +6 -6
- ansible/modules/group_by.py +4 -4
- ansible/modules/hostname.py +13 -29
- ansible/modules/import_playbook.py +6 -6
- ansible/modules/import_role.py +6 -6
- ansible/modules/import_tasks.py +6 -6
- ansible/modules/include_role.py +6 -6
- ansible/modules/include_tasks.py +6 -6
- ansible/modules/include_vars.py +6 -6
- ansible/modules/iptables.py +86 -73
- ansible/modules/known_hosts.py +10 -10
- ansible/modules/lineinfile.py +5 -5
- ansible/modules/meta.py +4 -4
- ansible/modules/mount_facts.py +2 -2
- ansible/modules/package.py +4 -4
- ansible/modules/package_facts.py +22 -10
- ansible/modules/pause.py +6 -6
- ansible/modules/ping.py +6 -6
- ansible/modules/pip.py +10 -11
- ansible/modules/raw.py +4 -4
- ansible/modules/reboot.py +6 -6
- ansible/modules/replace.py +9 -13
- ansible/modules/rpm_key.py +7 -8
- ansible/modules/script.py +4 -4
- ansible/modules/service.py +7 -8
- ansible/modules/service_facts.py +87 -10
- ansible/modules/set_fact.py +5 -5
- ansible/modules/set_stats.py +4 -4
- ansible/modules/setup.py +2 -2
- ansible/modules/shell.py +6 -6
- ansible/modules/slurp.py +6 -6
- ansible/modules/stat.py +9 -23
- ansible/modules/subversion.py +15 -15
- ansible/modules/systemd.py +6 -6
- ansible/modules/systemd_service.py +6 -6
- ansible/modules/sysvinit.py +6 -6
- ansible/modules/tempfile.py +5 -6
- ansible/modules/template.py +6 -6
- ansible/modules/unarchive.py +32 -11
- ansible/modules/uri.py +33 -26
- ansible/modules/user.py +53 -34
- ansible/modules/validate_argument_spec.py +10 -7
- ansible/modules/wait_for.py +32 -27
- ansible/modules/wait_for_connection.py +6 -6
- ansible/modules/yum_repository.py +6 -6
- ansible/parsing/ajson.py +14 -32
- ansible/parsing/dataloader.py +99 -54
- ansible/parsing/mod_args.py +28 -44
- ansible/parsing/plugin_docs.py +21 -86
- ansible/parsing/quoting.py +1 -1
- ansible/parsing/splitter.py +27 -12
- ansible/parsing/utils/addresses.py +24 -24
- ansible/parsing/utils/jsonify.py +5 -1
- ansible/parsing/utils/yaml.py +32 -61
- ansible/parsing/vault/__init__.py +319 -87
- ansible/parsing/yaml/__init__.py +0 -18
- ansible/parsing/yaml/dumper.py +6 -120
- ansible/parsing/yaml/loader.py +6 -39
- ansible/parsing/yaml/objects.py +43 -335
- ansible/playbook/__init__.py +1 -1
- ansible/playbook/attribute.py +8 -3
- ansible/playbook/base.py +182 -132
- ansible/playbook/block.py +26 -24
- ansible/playbook/collectionsearch.py +1 -15
- ansible/playbook/conditional.py +3 -77
- ansible/playbook/handler.py +8 -2
- ansible/playbook/helpers.py +41 -53
- ansible/playbook/included_file.py +31 -27
- ansible/playbook/loop_control.py +2 -2
- ansible/playbook/play.py +85 -44
- ansible/playbook/play_context.py +12 -17
- ansible/playbook/playbook_include.py +14 -15
- ansible/playbook/role/__init__.py +24 -26
- ansible/playbook/role/definition.py +15 -17
- ansible/playbook/role/include.py +2 -4
- ansible/playbook/role/metadata.py +10 -11
- ansible/playbook/role_include.py +3 -3
- ansible/playbook/taggable.py +13 -8
- ansible/playbook/task.py +188 -118
- ansible/playbook/task_include.py +5 -5
- ansible/plugins/__init__.py +68 -21
- ansible/plugins/action/__init__.py +209 -176
- ansible/plugins/action/add_host.py +1 -1
- ansible/plugins/action/assemble.py +1 -1
- ansible/plugins/action/assert.py +54 -66
- ansible/plugins/action/copy.py +7 -11
- ansible/plugins/action/debug.py +37 -31
- ansible/plugins/action/dnf.py +3 -4
- ansible/plugins/action/fail.py +1 -1
- ansible/plugins/action/fetch.py +4 -5
- ansible/plugins/action/gather_facts.py +7 -6
- ansible/plugins/action/group_by.py +1 -1
- ansible/plugins/action/include_vars.py +10 -11
- ansible/plugins/action/package.py +3 -6
- ansible/plugins/action/pause.py +2 -2
- ansible/plugins/action/script.py +15 -8
- ansible/plugins/action/service.py +6 -11
- ansible/plugins/action/set_fact.py +3 -12
- ansible/plugins/action/set_stats.py +3 -8
- ansible/plugins/action/template.py +35 -59
- ansible/plugins/action/unarchive.py +1 -1
- ansible/plugins/action/validate_argument_spec.py +5 -5
- ansible/plugins/action/wait_for_connection.py +1 -1
- ansible/plugins/become/__init__.py +31 -8
- ansible/plugins/become/runas.py +71 -0
- ansible/plugins/become/su.py +13 -8
- ansible/plugins/become/sudo.py +19 -0
- ansible/plugins/cache/__init__.py +35 -44
- ansible/plugins/cache/base.py +8 -0
- ansible/plugins/cache/jsonfile.py +10 -16
- ansible/plugins/cache/memory.py +6 -12
- ansible/plugins/callback/__init__.py +284 -179
- ansible/plugins/callback/default.py +99 -92
- ansible/plugins/callback/junit.py +44 -39
- ansible/plugins/callback/minimal.py +28 -25
- ansible/plugins/callback/oneline.py +28 -21
- ansible/plugins/callback/tree.py +16 -11
- ansible/plugins/connection/__init__.py +47 -34
- ansible/plugins/connection/local.py +150 -54
- ansible/plugins/connection/paramiko_ssh.py +21 -18
- ansible/plugins/connection/psrp.py +76 -165
- ansible/plugins/connection/ssh.py +301 -78
- ansible/plugins/connection/winrm.py +58 -140
- ansible/plugins/doc_fragments/action_common_attributes.py +14 -14
- ansible/plugins/doc_fragments/action_core.py +6 -6
- ansible/plugins/doc_fragments/backup.py +2 -2
- ansible/plugins/doc_fragments/checksum_common.py +27 -0
- ansible/plugins/doc_fragments/constructed.py +6 -2
- ansible/plugins/doc_fragments/decrypt.py +2 -2
- ansible/plugins/doc_fragments/default_callback.py +2 -2
- ansible/plugins/doc_fragments/files.py +2 -2
- ansible/plugins/doc_fragments/inventory_cache.py +2 -2
- ansible/plugins/doc_fragments/result_format_callback.py +2 -2
- ansible/plugins/doc_fragments/return_common.py +2 -2
- ansible/plugins/doc_fragments/template_common.py +4 -4
- ansible/plugins/doc_fragments/url.py +17 -1
- ansible/plugins/doc_fragments/url_windows.py +2 -2
- ansible/plugins/doc_fragments/validate.py +2 -2
- ansible/plugins/doc_fragments/vars_plugin_staging.py +2 -2
- ansible/plugins/filter/__init__.py +6 -2
- ansible/plugins/filter/b64decode.yml +22 -0
- ansible/plugins/filter/b64encode.yml +22 -0
- ansible/plugins/filter/bool.yml +11 -4
- ansible/plugins/filter/core.py +225 -108
- ansible/plugins/filter/encryption.py +32 -32
- ansible/plugins/filter/flatten.yml +3 -2
- ansible/plugins/filter/human_to_bytes.yml +1 -1
- ansible/plugins/filter/mathstuff.py +30 -37
- ansible/plugins/filter/password_hash.yml +8 -0
- ansible/plugins/filter/regex_search.yml +1 -4
- ansible/plugins/filter/split.yml +1 -1
- ansible/plugins/filter/to_nice_yaml.yml +0 -4
- ansible/plugins/filter/to_yaml.yml +0 -4
- ansible/plugins/filter/unvault.yml +1 -1
- ansible/plugins/filter/urls.py +1 -1
- ansible/plugins/filter/urlsplit.py +8 -9
- ansible/plugins/filter/vault.yml +14 -9
- ansible/plugins/filter/win_basename.yml +6 -1
- ansible/plugins/filter/win_dirname.yml +5 -0
- ansible/plugins/inventory/__init__.py +97 -77
- ansible/plugins/inventory/advanced_host_list.py +7 -5
- ansible/plugins/inventory/auto.py +11 -4
- ansible/plugins/inventory/constructed.py +21 -24
- ansible/plugins/inventory/generator.py +16 -11
- ansible/plugins/inventory/host_list.py +7 -5
- ansible/plugins/inventory/ini.py +78 -44
- ansible/plugins/inventory/script.py +189 -119
- ansible/plugins/inventory/toml.py +16 -126
- ansible/plugins/inventory/yaml.py +10 -8
- ansible/plugins/list.py +3 -3
- ansible/plugins/loader.py +197 -82
- ansible/plugins/lookup/__init__.py +21 -4
- ansible/plugins/lookup/config.py +21 -35
- ansible/plugins/lookup/csvfile.py +3 -2
- ansible/plugins/lookup/dict.py +1 -6
- ansible/plugins/lookup/env.py +12 -9
- ansible/plugins/lookup/file.py +5 -8
- ansible/plugins/lookup/first_found.py +86 -55
- ansible/plugins/lookup/indexed_items.py +1 -10
- ansible/plugins/lookup/ini.py +14 -13
- ansible/plugins/lookup/items.py +1 -1
- ansible/plugins/lookup/lines.py +8 -1
- ansible/plugins/lookup/list.py +1 -1
- ansible/plugins/lookup/nested.py +2 -18
- ansible/plugins/lookup/password.py +5 -5
- ansible/plugins/lookup/pipe.py +5 -7
- ansible/plugins/lookup/sequence.py +18 -8
- ansible/plugins/lookup/subelements.py +1 -4
- ansible/plugins/lookup/template.py +42 -36
- ansible/plugins/lookup/together.py +0 -12
- ansible/plugins/lookup/unvault.py +1 -5
- ansible/plugins/lookup/url.py +2 -8
- ansible/plugins/lookup/vars.py +16 -24
- ansible/plugins/shell/__init__.py +2 -2
- ansible/plugins/shell/cmd.py +2 -2
- ansible/plugins/shell/powershell.py +39 -22
- ansible/plugins/shell/sh.py +3 -2
- ansible/plugins/strategy/__init__.py +159 -184
- ansible/plugins/strategy/debug.py +2 -2
- ansible/plugins/strategy/free.py +16 -31
- ansible/plugins/strategy/host_pinned.py +2 -2
- ansible/plugins/strategy/linear.py +41 -41
- ansible/plugins/terminal/__init__.py +4 -4
- ansible/plugins/test/__init__.py +7 -2
- ansible/plugins/test/core.py +55 -21
- ansible/plugins/test/files.py +1 -1
- ansible/plugins/test/mathstuff.py +3 -3
- ansible/plugins/test/uri.py +3 -3
- ansible/plugins/vars/host_group_vars.py +7 -14
- ansible/release.py +2 -2
- ansible/template/__init__.py +370 -944
- ansible/utils/__init__.py +0 -18
- ansible/utils/_ssh_agent.py +657 -0
- ansible/utils/collection_loader/__init__.py +52 -5
- ansible/utils/collection_loader/_collection_config.py +5 -6
- ansible/utils/collection_loader/_collection_finder.py +79 -93
- ansible/utils/collection_loader/_collection_meta.py +13 -8
- ansible/utils/display.py +433 -63
- ansible/utils/encrypt.py +27 -19
- ansible/utils/fqcn.py +2 -2
- ansible/utils/hashing.py +2 -2
- ansible/utils/helpers.py +2 -2
- ansible/utils/listify.py +8 -8
- ansible/utils/lock.py +2 -2
- ansible/utils/path.py +4 -4
- ansible/utils/plugin_docs.py +14 -13
- ansible/utils/sentinel.py +4 -62
- ansible/utils/singleton.py +2 -0
- ansible/utils/ssh_functions.py +1 -1
- ansible/utils/unsafe_proxy.py +23 -332
- ansible/utils/vars.py +51 -8
- ansible/utils/version.py +2 -2
- ansible/vars/clean.py +5 -5
- ansible/vars/hostvars.py +60 -90
- ansible/vars/manager.py +206 -282
- ansible/vars/reserved.py +8 -9
- ansible_core-2.19.0b2.dist-info/BSD-3-Clause.txt +28 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/METADATA +5 -4
- ansible_core-2.19.0b2.dist-info/RECORD +1072 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/WHEEL +1 -1
- ansible_test/_data/completion/docker.txt +7 -7
- ansible_test/_data/completion/remote.txt +6 -6
- ansible_test/_data/completion/windows.txt +1 -0
- ansible_test/_data/requirements/ansible.txt +2 -2
- ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
- ansible_test/_data/requirements/sanity.changelog.txt +1 -1
- ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
- ansible_test/_data/requirements/sanity.pylint.txt +4 -4
- ansible_test/_data/requirements/sanity.validate-modules.txt +2 -2
- ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
- ansible_test/_data/requirements/units.txt +1 -0
- ansible_test/_internal/__init__.py +1 -0
- ansible_test/_internal/ansible_util.py +2 -0
- ansible_test/_internal/become.py +1 -0
- ansible_test/_internal/bootstrap.py +1 -0
- ansible_test/_internal/cache.py +1 -0
- ansible_test/_internal/cgroup.py +1 -0
- ansible_test/_internal/ci/__init__.py +1 -0
- ansible_test/_internal/ci/azp.py +1 -0
- ansible_test/_internal/ci/local.py +1 -0
- ansible_test/_internal/classification/__init__.py +1 -0
- ansible_test/_internal/classification/common.py +1 -0
- ansible_test/_internal/classification/csharp.py +1 -0
- ansible_test/_internal/classification/powershell.py +1 -0
- ansible_test/_internal/classification/python.py +1 -0
- ansible_test/_internal/cli/__init__.py +1 -0
- ansible_test/_internal/cli/actions.py +1 -0
- ansible_test/_internal/cli/argparsing/__init__.py +1 -0
- ansible_test/_internal/cli/argparsing/actions.py +1 -0
- ansible_test/_internal/cli/argparsing/argcompletion.py +1 -0
- ansible_test/_internal/cli/argparsing/parsers.py +1 -0
- ansible_test/_internal/cli/commands/__init__.py +11 -0
- ansible_test/_internal/cli/commands/coverage/__init__.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/__init__.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/__init__.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/combine.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/expand.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/filter.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/generate.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/missing.py +1 -0
- ansible_test/_internal/cli/commands/coverage/combine.py +1 -0
- ansible_test/_internal/cli/commands/coverage/erase.py +1 -0
- ansible_test/_internal/cli/commands/coverage/html.py +1 -0
- ansible_test/_internal/cli/commands/coverage/report.py +1 -0
- ansible_test/_internal/cli/commands/coverage/xml.py +1 -0
- ansible_test/_internal/cli/commands/env.py +1 -0
- ansible_test/_internal/cli/commands/integration/__init__.py +1 -0
- ansible_test/_internal/cli/commands/integration/network.py +1 -0
- ansible_test/_internal/cli/commands/integration/posix.py +1 -0
- ansible_test/_internal/cli/commands/integration/windows.py +1 -0
- ansible_test/_internal/cli/commands/sanity.py +9 -0
- ansible_test/_internal/cli/commands/shell.py +1 -0
- ansible_test/_internal/cli/commands/units.py +1 -0
- ansible_test/_internal/cli/compat.py +1 -0
- ansible_test/_internal/cli/completers.py +1 -0
- ansible_test/_internal/cli/converters.py +1 -0
- ansible_test/_internal/cli/environments.py +1 -0
- ansible_test/_internal/cli/epilog.py +1 -0
- ansible_test/_internal/cli/parsers/__init__.py +1 -0
- ansible_test/_internal/cli/parsers/base_argument_parsers.py +1 -0
- ansible_test/_internal/cli/parsers/helpers.py +1 -0
- ansible_test/_internal/cli/parsers/host_config_parsers.py +1 -0
- ansible_test/_internal/cli/parsers/key_value_parsers.py +1 -0
- ansible_test/_internal/cli/parsers/value_parsers.py +1 -0
- ansible_test/_internal/commands/__init__.py +1 -0
- ansible_test/_internal/commands/coverage/__init__.py +2 -1
- ansible_test/_internal/commands/coverage/analyze/__init__.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/combine.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/expand.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/filter.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/generate.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/missing.py +1 -0
- ansible_test/_internal/commands/coverage/combine.py +2 -1
- ansible_test/_internal/commands/coverage/erase.py +1 -0
- ansible_test/_internal/commands/coverage/html.py +1 -0
- ansible_test/_internal/commands/coverage/report.py +1 -0
- ansible_test/_internal/commands/coverage/xml.py +1 -0
- ansible_test/_internal/commands/env/__init__.py +2 -0
- ansible_test/_internal/commands/integration/__init__.py +4 -0
- ansible_test/_internal/commands/integration/cloud/__init__.py +1 -0
- ansible_test/_internal/commands/integration/cloud/acme.py +2 -1
- ansible_test/_internal/commands/integration/cloud/aws.py +1 -0
- ansible_test/_internal/commands/integration/cloud/azure.py +1 -0
- ansible_test/_internal/commands/integration/cloud/cs.py +1 -0
- ansible_test/_internal/commands/integration/cloud/digitalocean.py +1 -0
- ansible_test/_internal/commands/integration/cloud/galaxy.py +3 -2
- ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -0
- ansible_test/_internal/commands/integration/cloud/httptester.py +2 -1
- ansible_test/_internal/commands/integration/cloud/nios.py +2 -1
- ansible_test/_internal/commands/integration/cloud/opennebula.py +1 -0
- ansible_test/_internal/commands/integration/cloud/openshift.py +1 -0
- ansible_test/_internal/commands/integration/cloud/scaleway.py +1 -0
- ansible_test/_internal/commands/integration/cloud/vcenter.py +1 -0
- ansible_test/_internal/commands/integration/cloud/vultr.py +1 -0
- ansible_test/_internal/commands/integration/coverage.py +1 -0
- ansible_test/_internal/commands/integration/filters.py +1 -0
- ansible_test/_internal/commands/integration/network.py +1 -0
- ansible_test/_internal/commands/integration/posix.py +1 -0
- ansible_test/_internal/commands/integration/windows.py +1 -0
- ansible_test/_internal/commands/sanity/__init__.py +16 -1
- ansible_test/_internal/commands/sanity/ansible_doc.py +1 -0
- ansible_test/_internal/commands/sanity/bin_symlinks.py +1 -0
- ansible_test/_internal/commands/sanity/compile.py +1 -0
- ansible_test/_internal/commands/sanity/ignores.py +1 -0
- ansible_test/_internal/commands/sanity/import.py +1 -0
- ansible_test/_internal/commands/sanity/integration_aliases.py +1 -0
- ansible_test/_internal/commands/sanity/pep8.py +1 -0
- ansible_test/_internal/commands/sanity/pslint.py +1 -0
- ansible_test/_internal/commands/sanity/pylint.py +24 -26
- ansible_test/_internal/commands/sanity/shellcheck.py +1 -0
- ansible_test/_internal/commands/sanity/validate_modules.py +1 -0
- ansible_test/_internal/commands/sanity/yamllint.py +1 -0
- ansible_test/_internal/commands/shell/__init__.py +1 -0
- ansible_test/_internal/commands/units/__init__.py +1 -0
- ansible_test/_internal/compat/__init__.py +1 -0
- ansible_test/_internal/compat/packaging.py +1 -0
- ansible_test/_internal/compat/yaml.py +1 -0
- ansible_test/_internal/completion.py +1 -0
- ansible_test/_internal/config.py +2 -0
- ansible_test/_internal/connections.py +1 -0
- ansible_test/_internal/constants.py +1 -0
- ansible_test/_internal/containers.py +1 -0
- ansible_test/_internal/content_config.py +1 -0
- ansible_test/_internal/core_ci.py +1 -0
- ansible_test/_internal/coverage_util.py +11 -10
- ansible_test/_internal/data.py +1 -0
- ansible_test/_internal/delegation.py +1 -0
- ansible_test/_internal/dev/__init__.py +1 -0
- ansible_test/_internal/dev/container_probe.py +1 -0
- ansible_test/_internal/diff.py +3 -2
- ansible_test/_internal/docker_util.py +2 -1
- ansible_test/_internal/encoding.py +1 -0
- ansible_test/_internal/executor.py +1 -0
- ansible_test/_internal/git.py +1 -0
- ansible_test/_internal/host_configs.py +1 -0
- ansible_test/_internal/host_profiles.py +1 -0
- ansible_test/_internal/http.py +1 -0
- ansible_test/_internal/init.py +1 -0
- ansible_test/_internal/inventory.py +35 -3
- ansible_test/_internal/io.py +1 -0
- ansible_test/_internal/metadata.py +1 -0
- ansible_test/_internal/payload.py +1 -0
- ansible_test/_internal/provider/__init__.py +1 -0
- ansible_test/_internal/provider/layout/__init__.py +1 -0
- ansible_test/_internal/provider/layout/ansible.py +1 -0
- ansible_test/_internal/provider/layout/collection.py +1 -0
- ansible_test/_internal/provider/layout/unsupported.py +1 -0
- ansible_test/_internal/provider/source/__init__.py +1 -0
- ansible_test/_internal/provider/source/git.py +1 -0
- ansible_test/_internal/provider/source/installed.py +1 -0
- ansible_test/_internal/provider/source/unsupported.py +1 -0
- ansible_test/_internal/provider/source/unversioned.py +1 -0
- ansible_test/_internal/provisioning.py +1 -0
- ansible_test/_internal/pypi_proxy.py +6 -5
- ansible_test/_internal/python_requirements.py +1 -0
- ansible_test/_internal/ssh.py +1 -0
- ansible_test/_internal/target.py +1 -0
- ansible_test/_internal/test.py +3 -2
- ansible_test/_internal/thread.py +1 -0
- ansible_test/_internal/timeout.py +1 -0
- ansible_test/_internal/util.py +1 -0
- ansible_test/_internal/util_common.py +5 -2
- ansible_test/_internal/venv.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/changelog/sphinx.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/changelog.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/empty-init.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/line-endings.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-assert.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-get-exception.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-illegal-filenames.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-smart-quotes.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +28 -1
- ansible_test/_util/controller/sanity/code-smell/shebang.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/symlinks.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/use-argspec-type-path.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/use-compat-six.py +1 -0
- ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py +2 -1
- ansible_test/_util/controller/sanity/pep8/current-ignore.txt +4 -0
- ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +7 -5
- ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +7 -5
- ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +7 -5
- ansible_test/_util/controller/sanity/pylint/config/collection.cfg +3 -5
- ansible_test/_util/controller/sanity/pylint/config/default.cfg +7 -7
- ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +1 -13
- ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +1 -0
- ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +1 -8
- ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +1 -8
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +55 -28
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +12 -5
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +13 -2
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -0
- ansible_test/_util/controller/sanity/yamllint/yamllinter.py +35 -17
- ansible_test/_util/controller/tools/collection_detail.py +1 -0
- ansible_test/_util/controller/tools/yaml_to_json.py +2 -1
- ansible_test/_util/target/pytest/plugins/ansible_forked.py +6 -1
- ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +2 -1
- ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -0
- ansible_test/_util/target/sanity/compile/compile.py +1 -0
- ansible_test/_util/target/sanity/import/importer.py +15 -16
- ansible_test/_util/target/setup/bootstrap.sh +9 -20
- ansible_test/_util/target/setup/probe_cgroups.py +1 -0
- ansible_test/_util/target/setup/quiet_pip.py +1 -0
- ansible_test/_util/target/setup/requirements.py +35 -27
- ansible_test/_util/target/tools/virtualenvcheck.py +2 -1
- ansible_test/_util/target/tools/yamlcheck.py +2 -1
- ansible/compat/selectors.py +0 -32
- ansible/errors/yaml_strings.py +0 -138
- ansible/executor/action_write_locks.py +0 -44
- ansible/executor/discovery/python_target.py +0 -47
- ansible/executor/powershell/module_powershell_wrapper.ps1 +0 -86
- ansible/executor/powershell/module_script_wrapper.ps1 +0 -22
- ansible/module_utils/compat/importlib.py +0 -26
- ansible/module_utils/compat/selectors.py +0 -32
- ansible/module_utils/pycompat24.py +0 -73
- ansible/parsing/yaml/constructor.py +0 -178
- ansible/template/native_helpers.py +0 -251
- ansible/template/template.py +0 -43
- ansible/template/vars.py +0 -77
- ansible/utils/native_jinja.py +0 -11
- ansible/vars/fact_cache.py +0 -71
- ansible_core-2.18.5rc1.dist-info/RECORD +0 -992
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/Apache-License.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/COPYING +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/MIT-license.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/PSF-license.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/entry_points.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/simplified_bsd.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/top_level.txt +0 -0
@@ -3,11 +3,14 @@
|
|
3
3
|
|
4
4
|
from __future__ import annotations
|
5
5
|
|
6
|
+
import dataclasses
|
6
7
|
import os
|
7
8
|
import pathlib
|
8
9
|
import subprocess
|
9
10
|
import sys
|
11
|
+
import typing as t
|
10
12
|
|
13
|
+
from ansible.module_utils._internal import _plugin_exec_context
|
11
14
|
from ansible.module_utils.common.text.converters import to_bytes
|
12
15
|
|
13
16
|
_ANSIBLE_PARENT_PATH = pathlib.Path(__file__).parents[3]
|
@@ -17,7 +20,7 @@ def has_respawned():
|
|
17
20
|
return hasattr(sys.modules['__main__'], '_respawned')
|
18
21
|
|
19
22
|
|
20
|
-
def respawn_module(interpreter_path):
|
23
|
+
def respawn_module(interpreter_path) -> t.NoReturn:
|
21
24
|
"""
|
22
25
|
Respawn the currently-running Ansible Python module under the specified Python interpreter.
|
23
26
|
|
@@ -55,10 +58,13 @@ def probe_interpreters_for_module(interpreter_paths, module_name):
|
|
55
58
|
:arg interpreter_paths: iterable of paths to Python interpreters. The paths will be probed
|
56
59
|
in order, and the first path that exists and can successfully import the named module will
|
57
60
|
be returned (or ``None`` if probing fails for all supplied paths).
|
58
|
-
:arg module_name: fully-qualified Python module name to probe for (
|
61
|
+
:arg module_name: fully-qualified Python module name to probe for (for example, ``selinux``)
|
59
62
|
"""
|
60
63
|
PYTHONPATH = os.getenv('PYTHONPATH', '')
|
61
|
-
env = os.environ
|
64
|
+
env = os.environ.copy()
|
65
|
+
env.update({
|
66
|
+
'PYTHONPATH': f'{_ANSIBLE_PARENT_PATH}:{PYTHONPATH}'.rstrip(': ')
|
67
|
+
})
|
62
68
|
for interpreter_path in interpreter_paths:
|
63
69
|
if not os.path.exists(interpreter_path):
|
64
70
|
continue
|
@@ -80,29 +86,45 @@ def probe_interpreters_for_module(interpreter_paths, module_name):
|
|
80
86
|
|
81
87
|
|
82
88
|
def _create_payload():
|
89
|
+
# FIXME: move this into _ansiballz and skip the template
|
83
90
|
from ansible.module_utils import basic
|
84
|
-
|
85
|
-
if not smuggled_args:
|
86
|
-
raise Exception('unable to access ansible.module_utils.basic._ANSIBLE_ARGS (not launched by AnsiballZ?)')
|
91
|
+
|
87
92
|
module_fqn = sys.modules['__main__']._module_fqn
|
88
93
|
modlib_path = sys.modules['__main__']._modlib_path
|
89
|
-
respawn_code_template = '''
|
90
|
-
import runpy
|
91
|
-
import sys
|
92
|
-
|
93
|
-
module_fqn = {module_fqn!r}
|
94
|
-
modlib_path = {modlib_path!r}
|
95
|
-
smuggled_args = {smuggled_args!r}
|
96
94
|
|
95
|
+
respawn_code_template = """
|
97
96
|
if __name__ == '__main__':
|
98
|
-
|
97
|
+
import runpy
|
98
|
+
import sys
|
99
99
|
|
100
|
-
|
101
|
-
|
100
|
+
json_params = {json_params!r}
|
101
|
+
profile = {profile!r}
|
102
|
+
plugin_info_dict = {plugin_info_dict!r}
|
103
|
+
module_fqn = {module_fqn!r}
|
104
|
+
modlib_path = {modlib_path!r}
|
102
105
|
|
103
|
-
|
104
|
-
'''
|
106
|
+
sys.path.insert(0, modlib_path)
|
105
107
|
|
106
|
-
|
108
|
+
from ansible.module_utils._internal import _ansiballz
|
109
|
+
|
110
|
+
_ansiballz.run_module(
|
111
|
+
json_params=json_params,
|
112
|
+
profile=profile,
|
113
|
+
plugin_info_dict=plugin_info_dict,
|
114
|
+
module_fqn=module_fqn,
|
115
|
+
modlib_path=modlib_path,
|
116
|
+
init_globals=dict(_respawned=True),
|
117
|
+
)
|
118
|
+
"""
|
119
|
+
|
120
|
+
plugin_info = _plugin_exec_context.PluginExecContext.get_current_plugin_info()
|
121
|
+
|
122
|
+
respawn_code = respawn_code_template.format(
|
123
|
+
json_params=basic._ANSIBLE_ARGS,
|
124
|
+
profile=basic._ANSIBLE_PROFILE,
|
125
|
+
plugin_info_dict=dataclasses.asdict(plugin_info),
|
126
|
+
module_fqn=module_fqn,
|
127
|
+
modlib_path=modlib_path,
|
128
|
+
)
|
107
129
|
|
108
130
|
return respawn_code
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# Copyright (c) 2019 Ansible Project
|
2
|
+
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
3
|
+
|
4
|
+
from __future__ import annotations
|
5
|
+
|
6
|
+
|
7
|
+
class Sentinel:
|
8
|
+
"""
|
9
|
+
Object which can be used to mark whether an entry as being special
|
10
|
+
|
11
|
+
A sentinel value demarcates a value or marks an entry as having a special meaning. In C, the
|
12
|
+
Null byte is used as a sentinel for the end of a string. In Python, None is often used as
|
13
|
+
a Sentinel in optional parameters to mean that the parameter was not set by the user.
|
14
|
+
|
15
|
+
You should use None as a Sentinel value any Python code where None is not a valid entry. If
|
16
|
+
None is a valid entry, though, then you need to create a different value, which is the purpose
|
17
|
+
of this class.
|
18
|
+
|
19
|
+
Example of using Sentinel as a default parameter value::
|
20
|
+
|
21
|
+
def confirm_big_red_button(tristate=Sentinel):
|
22
|
+
if tristate is Sentinel:
|
23
|
+
print('You must explicitly press the big red button to blow up the base')
|
24
|
+
elif tristate is True:
|
25
|
+
print('Countdown to destruction activated')
|
26
|
+
elif tristate is False:
|
27
|
+
print('Countdown stopped')
|
28
|
+
elif tristate is None:
|
29
|
+
print('Waiting for more input')
|
30
|
+
|
31
|
+
Example of using Sentinel to tell whether a dict which has a default value has been changed::
|
32
|
+
|
33
|
+
values = {'one': Sentinel, 'two': Sentinel}
|
34
|
+
defaults = {'one': 1, 'two': 2}
|
35
|
+
|
36
|
+
# [.. Other code which does things including setting a new value for 'one' ..]
|
37
|
+
values['one'] = None
|
38
|
+
# [..]
|
39
|
+
|
40
|
+
print('You made changes to:')
|
41
|
+
for key, value in values.items():
|
42
|
+
if value is Sentinel:
|
43
|
+
continue
|
44
|
+
print('%s: %s' % (key, value)
|
45
|
+
"""
|
46
|
+
|
47
|
+
def __new__(cls):
|
48
|
+
"""
|
49
|
+
Return the cls itself. This makes both equality and identity True for comparing the class
|
50
|
+
to an instance of the class, preventing common usage errors.
|
51
|
+
|
52
|
+
Preferred usage::
|
53
|
+
|
54
|
+
a = Sentinel
|
55
|
+
if a is Sentinel:
|
56
|
+
print('Sentinel value')
|
57
|
+
|
58
|
+
However, these are True as well, eliminating common usage errors::
|
59
|
+
|
60
|
+
if Sentinel is Sentinel():
|
61
|
+
print('Sentinel value')
|
62
|
+
|
63
|
+
if Sentinel == Sentinel():
|
64
|
+
print('Sentinel value')
|
65
|
+
"""
|
66
|
+
return cls
|
@@ -14,7 +14,7 @@ __all__ = ('get_distribution', 'get_distribution_version', 'get_platform_subclas
|
|
14
14
|
|
15
15
|
|
16
16
|
def get_distribution():
|
17
|
-
|
17
|
+
"""
|
18
18
|
Return the name of the distribution the module is running on.
|
19
19
|
|
20
20
|
:rtype: NativeString or None
|
@@ -23,7 +23,7 @@ def get_distribution():
|
|
23
23
|
This function attempts to determine what distribution the code is running
|
24
24
|
on and return a string representing that value. If the platform is Linux
|
25
25
|
and the distribution cannot be determined, it returns ``OtherLinux``.
|
26
|
-
|
26
|
+
"""
|
27
27
|
distribution = distro.id().capitalize()
|
28
28
|
|
29
29
|
if platform.system() == 'Linux':
|
@@ -38,14 +38,14 @@ def get_distribution():
|
|
38
38
|
|
39
39
|
|
40
40
|
def get_distribution_version():
|
41
|
-
|
41
|
+
"""
|
42
42
|
Get the version of the distribution the code is running on
|
43
43
|
|
44
44
|
:rtype: NativeString or None
|
45
45
|
:returns: A string representation of the version of the distribution. If it
|
46
46
|
cannot determine the version, it returns an empty string. If this is not run on
|
47
47
|
a Linux machine it returns None.
|
48
|
-
|
48
|
+
"""
|
49
49
|
version = None
|
50
50
|
|
51
51
|
needs_best_version = frozenset((
|
@@ -79,12 +79,12 @@ def get_distribution_version():
|
|
79
79
|
|
80
80
|
|
81
81
|
def get_distribution_codename():
|
82
|
-
|
82
|
+
"""
|
83
83
|
Return the code name for this Linux Distribution
|
84
84
|
|
85
85
|
:rtype: NativeString or None
|
86
86
|
:returns: A string representation of the distribution's codename or None if not a Linux distro
|
87
|
-
|
87
|
+
"""
|
88
88
|
codename = None
|
89
89
|
if platform.system() == 'Linux':
|
90
90
|
# Until this gets merged and we update our bundled copy of distro:
|
@@ -109,7 +109,7 @@ def get_distribution_codename():
|
|
109
109
|
|
110
110
|
|
111
111
|
def get_platform_subclass(cls):
|
112
|
-
|
112
|
+
"""
|
113
113
|
Finds a subclass implementing desired functionality on the platform the code is running on
|
114
114
|
|
115
115
|
:arg cls: Class to find an appropriate subclass for
|
@@ -135,7 +135,7 @@ def get_platform_subclass(cls):
|
|
135
135
|
def __new__(cls, *args, **kwargs):
|
136
136
|
new_cls = get_platform_subclass(User)
|
137
137
|
return super(cls, new_cls).__new__(new_cls)
|
138
|
-
|
138
|
+
"""
|
139
139
|
this_platform = platform.system()
|
140
140
|
distribution = get_distribution()
|
141
141
|
|
@@ -6,12 +6,9 @@
|
|
6
6
|
from __future__ import annotations
|
7
7
|
|
8
8
|
import codecs
|
9
|
-
import datetime
|
10
9
|
import json
|
11
10
|
|
12
|
-
from ansible.module_utils.six.moves.collections_abc import Set
|
13
11
|
from ansible.module_utils.six import (
|
14
|
-
PY3,
|
15
12
|
binary_type,
|
16
13
|
iteritems,
|
17
14
|
text_type,
|
@@ -237,49 +234,30 @@ def to_text(obj, encoding='utf-8', errors=None, nonstring='simplerepr'):
|
|
237
234
|
return to_text(value, encoding, errors)
|
238
235
|
|
239
236
|
|
240
|
-
|
241
|
-
#: Transform a variable into the native str type for the python version
|
242
|
-
#:
|
243
|
-
#: On Python2, this is an alias for
|
244
|
-
#: :func:`~ansible.module_utils.to_bytes`. On Python3 it is an alias for
|
245
|
-
#: :func:`~ansible.module_utils.to_text`. It makes it easier to
|
246
|
-
#: transform a variable into the native str type for the python version
|
247
|
-
#: the code is running on. Use this when constructing the message to
|
248
|
-
#: send to exceptions or when dealing with an API that needs to take
|
249
|
-
#: a native string. Example::
|
250
|
-
#:
|
251
|
-
#: try:
|
252
|
-
#: 1//0
|
253
|
-
#: except ZeroDivisionError as e:
|
254
|
-
#: raise MyException('Encountered and error: %s' % to_native(e))
|
255
|
-
if PY3:
|
256
|
-
to_native = to_text
|
257
|
-
else:
|
258
|
-
to_native = to_bytes
|
259
|
-
|
260
|
-
|
261
|
-
def _json_encode_fallback(obj):
|
262
|
-
if isinstance(obj, Set):
|
263
|
-
return list(obj)
|
264
|
-
elif isinstance(obj, datetime.datetime):
|
265
|
-
return obj.isoformat()
|
266
|
-
raise TypeError("Cannot json serialize %s" % to_native(obj))
|
237
|
+
to_native = to_text
|
267
238
|
|
268
239
|
|
269
240
|
def jsonify(data, **kwargs):
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
241
|
+
from ansible.module_utils.common import json as _common_json
|
242
|
+
# from ansible.module_utils.common.warnings import deprecate
|
243
|
+
|
244
|
+
# deprecated: description='deprecate jsonify()' core_version='2.23'
|
245
|
+
# deprecate(
|
246
|
+
# msg="The `jsonify` function is deprecated.",
|
247
|
+
# version="2.27",
|
248
|
+
# # help_text="", # DTFIX-RELEASE: fill in this help text
|
249
|
+
# )
|
250
|
+
|
251
|
+
return json.dumps(data, cls=_common_json._get_legacy_encoder(), _decode_bytes=True, **kwargs)
|
275
252
|
|
276
253
|
|
277
254
|
def container_to_bytes(d, encoding='utf-8', errors='surrogate_or_strict'):
|
278
|
-
|
255
|
+
""" Recursively convert dict keys and values to byte str
|
279
256
|
|
280
257
|
Specialized for json return because this only handles, lists, tuples,
|
281
258
|
and dict container types (the containers that the json module returns)
|
282
|
-
|
259
|
+
"""
|
260
|
+
# DTFIX-RELEASE: deprecate
|
283
261
|
|
284
262
|
if isinstance(d, text_type):
|
285
263
|
return to_bytes(d, encoding=encoding, errors=errors)
|
@@ -299,6 +277,7 @@ def container_to_text(d, encoding='utf-8', errors='surrogate_or_strict'):
|
|
299
277
|
Specialized for json return because this only handles, lists, tuples,
|
300
278
|
and dict container types (the containers that the json module returns)
|
301
279
|
"""
|
280
|
+
# DTFIX-RELEASE: deprecate
|
302
281
|
|
303
282
|
if isinstance(d, binary_type):
|
304
283
|
# Warning, can traceback
|
@@ -10,16 +10,14 @@ import os
|
|
10
10
|
import re
|
11
11
|
|
12
12
|
from ast import literal_eval
|
13
|
+
from ansible.module_utils.common import json as _common_json
|
13
14
|
from ansible.module_utils.common.text.converters import to_native
|
14
15
|
from ansible.module_utils.common.collections import is_iterable
|
15
|
-
from ansible.module_utils.common.text.converters import jsonify
|
16
16
|
from ansible.module_utils.common.text.formatters import human_to_bytes
|
17
17
|
from ansible.module_utils.common.warnings import deprecate
|
18
18
|
from ansible.module_utils.parsing.convert_bool import boolean
|
19
19
|
from ansible.module_utils.six import (
|
20
|
-
binary_type,
|
21
20
|
string_types,
|
22
|
-
text_type,
|
23
21
|
)
|
24
22
|
|
25
23
|
|
@@ -185,7 +183,7 @@ def check_required_by(requirements, parameters, options_context=None):
|
|
185
183
|
:kwarg options_context: List of strings of parent key names if ``requirements`` are
|
186
184
|
in a sub spec.
|
187
185
|
|
188
|
-
:returns: Empty dictionary or raises :class:`TypeError` if the
|
186
|
+
:returns: Empty dictionary or raises :class:`TypeError` if the check fails.
|
189
187
|
"""
|
190
188
|
|
191
189
|
result = {}
|
@@ -195,22 +193,15 @@ def check_required_by(requirements, parameters, options_context=None):
|
|
195
193
|
for (key, value) in requirements.items():
|
196
194
|
if key not in parameters or parameters[key] is None:
|
197
195
|
continue
|
198
|
-
result[key] = []
|
199
196
|
# Support strings (single-item lists)
|
200
197
|
if isinstance(value, string_types):
|
201
198
|
value = [value]
|
202
|
-
for required in value:
|
203
|
-
if required not in parameters or parameters[required] is None:
|
204
|
-
result[key].append(required)
|
205
|
-
|
206
|
-
if result:
|
207
|
-
for key, missing in result.items():
|
208
|
-
if len(missing) > 0:
|
209
|
-
msg = "missing parameter(s) required by '%s': %s" % (key, ', '.join(missing))
|
210
|
-
if options_context:
|
211
|
-
msg = "{0} found in {1}".format(msg, " -> ".join(options_context))
|
212
|
-
raise TypeError(to_native(msg))
|
213
199
|
|
200
|
+
if missing := [required for required in value if required not in parameters or parameters[required] is None]:
|
201
|
+
msg = f"missing parameter(s) required by '{key}': {', '.join(missing)}"
|
202
|
+
if options_context:
|
203
|
+
msg = f"{msg} found in {' -> '.join(options_context)}"
|
204
|
+
raise TypeError(to_native(msg))
|
214
205
|
return result
|
215
206
|
|
216
207
|
|
@@ -392,6 +383,10 @@ def check_type_str(value, allow_conversion=True, param=None, prefix=''):
|
|
392
383
|
raise TypeError(to_native(msg))
|
393
384
|
|
394
385
|
|
386
|
+
def _check_type_str_no_conversion(value) -> str:
|
387
|
+
return check_type_str(value, allow_conversion=False)
|
388
|
+
|
389
|
+
|
395
390
|
def check_type_list(value):
|
396
391
|
"""Verify that the value is a list or convert to a list
|
397
392
|
|
@@ -407,6 +402,7 @@ def check_type_list(value):
|
|
407
402
|
if isinstance(value, list):
|
408
403
|
return value
|
409
404
|
|
405
|
+
# DTFIX-RELEASE: deprecate legacy comma split functionality, eventually replace with `_check_type_list_strict`
|
410
406
|
if isinstance(value, string_types):
|
411
407
|
return value.split(",")
|
412
408
|
elif isinstance(value, int) or isinstance(value, float):
|
@@ -415,6 +411,14 @@ def check_type_list(value):
|
|
415
411
|
raise TypeError('%s cannot be converted to a list' % type(value))
|
416
412
|
|
417
413
|
|
414
|
+
def _check_type_list_strict(value):
|
415
|
+
# FUTURE: this impl should replace `check_type_list`
|
416
|
+
if isinstance(value, list):
|
417
|
+
return value
|
418
|
+
|
419
|
+
return [value]
|
420
|
+
|
421
|
+
|
418
422
|
def check_type_dict(value):
|
419
423
|
"""Verify that value is a dict or convert it to a dict and return it.
|
420
424
|
|
@@ -572,14 +576,21 @@ def check_type_bits(value):
|
|
572
576
|
|
573
577
|
|
574
578
|
def check_type_jsonarg(value):
|
575
|
-
"""Return a jsonified string. Sometimes the controller turns a json string
|
576
|
-
into a dict/list so transform it back into json here
|
577
|
-
|
578
|
-
Raises :class:`TypeError` if unable to convert the value
|
579
|
-
|
580
579
|
"""
|
581
|
-
|
580
|
+
JSON serialize dict/list/tuple, strip str and bytes.
|
581
|
+
Previously required for cases where Ansible/Jinja classic-mode literal eval pass could inadvertently deserialize objects.
|
582
|
+
"""
|
583
|
+
# deprecated: description='deprecate jsonarg type support' core_version='2.23'
|
584
|
+
# deprecate(
|
585
|
+
# msg="The `jsonarg` type is deprecated.",
|
586
|
+
# version="2.27",
|
587
|
+
# help_text="JSON string arguments should use `str`; structures can be explicitly serialized as JSON with the `to_json` filter.",
|
588
|
+
# )
|
589
|
+
|
590
|
+
if isinstance(value, (str, bytes)):
|
582
591
|
return value.strip()
|
583
|
-
|
584
|
-
|
592
|
+
|
593
|
+
if isinstance(value, (list, tuple, dict)):
|
594
|
+
return json.dumps(value, cls=_common_json._get_legacy_encoder(), _decode_bytes=True)
|
595
|
+
|
585
596
|
raise TypeError('%s cannot be converted to a json string' % type(value))
|
@@ -2,38 +2,99 @@
|
|
2
2
|
# Copyright (c) 2019 Ansible Project
|
3
3
|
# Simplified BSD License (see licenses/simplified_bsd.txt or https://opensource.org/licenses/BSD-2-Clause)
|
4
4
|
|
5
|
-
from __future__ import annotations
|
5
|
+
from __future__ import annotations as _annotations
|
6
6
|
|
7
|
-
|
7
|
+
import datetime as _datetime
|
8
|
+
import typing as _t
|
8
9
|
|
9
|
-
|
10
|
-
|
10
|
+
from ansible.module_utils._internal import _traceback, _plugin_exec_context
|
11
|
+
from ansible.module_utils.common import messages as _messages
|
12
|
+
from ansible.module_utils import _internal
|
11
13
|
|
14
|
+
_UNSET = _t.cast(_t.Any, object())
|
12
15
|
|
13
|
-
def warn(warning):
|
14
|
-
if isinstance(warning, string_types):
|
15
|
-
_global_warnings.append(warning)
|
16
|
-
else:
|
17
|
-
raise TypeError("warn requires a string not a %s" % type(warning))
|
18
16
|
|
17
|
+
def warn(warning: str) -> None:
|
18
|
+
"""Record a warning to be returned with the module result."""
|
19
|
+
# DTFIX-RELEASE: shim to controller display warning like `deprecate`
|
20
|
+
_global_warnings[_messages.WarningSummary(
|
21
|
+
details=(
|
22
|
+
_messages.Detail(msg=warning),
|
23
|
+
),
|
24
|
+
formatted_traceback=_traceback.maybe_capture_traceback(_traceback.TracebackEvent.WARNING),
|
25
|
+
)] = None
|
19
26
|
|
20
|
-
def deprecate(msg, version=None, date=None, collection_name=None):
|
21
|
-
if isinstance(msg, string_types):
|
22
|
-
# For compatibility, we accept that neither version nor date is set,
|
23
|
-
# and treat that the same as if version would haven been set
|
24
|
-
if date is not None:
|
25
|
-
_global_deprecations.append({'msg': msg, 'date': date, 'collection_name': collection_name})
|
26
|
-
else:
|
27
|
-
_global_deprecations.append({'msg': msg, 'version': version, 'collection_name': collection_name})
|
28
|
-
else:
|
29
|
-
raise TypeError("deprecate requires a string not a %s" % type(msg))
|
30
27
|
|
28
|
+
def deprecate(
|
29
|
+
msg: str,
|
30
|
+
version: str | None = None,
|
31
|
+
date: str | _datetime.date | None = None,
|
32
|
+
collection_name: str | None = _UNSET,
|
33
|
+
*,
|
34
|
+
help_text: str | None = None,
|
35
|
+
obj: object | None = None,
|
36
|
+
) -> None:
|
37
|
+
"""
|
38
|
+
Record a deprecation warning to be returned with the module result.
|
39
|
+
The `obj` argument is only useful in a controller context; it is ignored for target-side callers.
|
40
|
+
"""
|
41
|
+
if isinstance(date, _datetime.date):
|
42
|
+
date = str(date)
|
31
43
|
|
32
|
-
|
33
|
-
|
34
|
-
|
44
|
+
# deprecated: description='enable the deprecation message for collection_name' core_version='2.23'
|
45
|
+
# if collection_name is not _UNSET:
|
46
|
+
# deprecate('The `collection_name` argument to `deprecate` is deprecated.', version='2.27')
|
35
47
|
|
48
|
+
if _internal.is_controller:
|
49
|
+
_display = _internal.import_controller_module('ansible.utils.display').Display()
|
50
|
+
_display.deprecated(
|
51
|
+
msg=msg,
|
52
|
+
version=version,
|
53
|
+
date=date,
|
54
|
+
help_text=help_text,
|
55
|
+
obj=obj,
|
56
|
+
)
|
36
57
|
|
37
|
-
|
38
|
-
|
39
|
-
|
58
|
+
return
|
59
|
+
|
60
|
+
_global_deprecations[_messages.DeprecationSummary(
|
61
|
+
details=(
|
62
|
+
_messages.Detail(msg=msg, help_text=help_text),
|
63
|
+
),
|
64
|
+
formatted_traceback=_traceback.maybe_capture_traceback(_traceback.TracebackEvent.DEPRECATED),
|
65
|
+
version=version,
|
66
|
+
date=date,
|
67
|
+
plugin=_plugin_exec_context.PluginExecContext.get_current_plugin_info(),
|
68
|
+
)] = None
|
69
|
+
|
70
|
+
|
71
|
+
def get_warning_messages() -> tuple[str, ...]:
|
72
|
+
"""Return a tuple of warning messages accumulated over this run."""
|
73
|
+
# DTFIX-RELEASE: add future deprecation comment
|
74
|
+
return tuple(item._format() for item in _global_warnings)
|
75
|
+
|
76
|
+
|
77
|
+
_DEPRECATION_MESSAGE_KEYS = frozenset({'msg', 'date', 'version', 'collection_name'})
|
78
|
+
|
79
|
+
|
80
|
+
def get_deprecation_messages() -> tuple[dict[str, _t.Any], ...]:
|
81
|
+
"""Return a tuple of deprecation warning messages accumulated over this run."""
|
82
|
+
# DTFIX-RELEASE: add future deprecation comment
|
83
|
+
return tuple({key: value for key, value in item._as_simple_dict().items() if key in _DEPRECATION_MESSAGE_KEYS} for item in _global_deprecations)
|
84
|
+
|
85
|
+
|
86
|
+
def get_warnings() -> list[_messages.WarningSummary]:
|
87
|
+
"""Return a list of warning messages accumulated over this run."""
|
88
|
+
return list(_global_warnings)
|
89
|
+
|
90
|
+
|
91
|
+
def get_deprecations() -> list[_messages.DeprecationSummary]:
|
92
|
+
"""Return a list of deprecations accumulated over this run."""
|
93
|
+
return list(_global_deprecations)
|
94
|
+
|
95
|
+
|
96
|
+
_global_warnings: dict[_messages.WarningSummary, object] = {}
|
97
|
+
"""Global, ordered, de-deplicated storage of acculumated warnings for the current module run."""
|
98
|
+
|
99
|
+
_global_deprecations: dict[_messages.DeprecationSummary, object] = {}
|
100
|
+
"""Global, ordered, de-deplicated storage of acculumated deprecations for the current module run."""
|
@@ -6,10 +6,15 @@ This file provides ease of use shortcuts for loading and dumping YAML,
|
|
6
6
|
preferring the YAML compiled C extensions to reduce duplicated code.
|
7
7
|
"""
|
8
8
|
|
9
|
-
from __future__ import annotations
|
9
|
+
from __future__ import annotations as _annotations
|
10
|
+
|
11
|
+
import collections.abc as _c
|
12
|
+
import typing as _t
|
10
13
|
|
11
14
|
from functools import partial as _partial
|
12
15
|
|
16
|
+
from .._internal import _datatag
|
17
|
+
|
13
18
|
HAS_LIBYAML = False
|
14
19
|
|
15
20
|
try:
|
@@ -19,23 +24,44 @@ except ImportError:
|
|
19
24
|
else:
|
20
25
|
HAS_YAML = True
|
21
26
|
|
27
|
+
# DTFIX-RELEASE: refactor this to share the implementation with the controller version
|
28
|
+
# use an abstract base class, with __init_subclass__ for representer registration, and instance methods for overridable representers
|
29
|
+
# then tests can be consolidated intead of having two nearly identical copies
|
30
|
+
|
22
31
|
if HAS_YAML:
|
23
32
|
try:
|
24
33
|
from yaml import CSafeLoader as SafeLoader
|
25
34
|
from yaml import CSafeDumper as SafeDumper
|
35
|
+
from yaml.representer import SafeRepresenter
|
26
36
|
from yaml.cyaml import CParser as Parser # type: ignore[attr-defined] # pylint: disable=unused-import
|
27
37
|
|
28
38
|
HAS_LIBYAML = True
|
29
39
|
except (ImportError, AttributeError):
|
30
40
|
from yaml import SafeLoader # type: ignore[assignment]
|
31
41
|
from yaml import SafeDumper # type: ignore[assignment]
|
42
|
+
from yaml.representer import SafeRepresenter # type: ignore[assignment]
|
32
43
|
from yaml.parser import Parser # type: ignore[assignment] # pylint: disable=unused-import
|
33
44
|
|
45
|
+
class _AnsibleDumper(SafeDumper):
|
46
|
+
pass
|
47
|
+
|
48
|
+
def _represent_ansible_tagged_object(self, data: _datatag.AnsibleTaggedObject) -> _t.Any:
|
49
|
+
return self.represent_data(_datatag.AnsibleTagHelper.as_native_type(data))
|
50
|
+
|
51
|
+
def _represent_tripwire(self, data: _datatag.Tripwire) -> _t.NoReturn:
|
52
|
+
data.trip()
|
53
|
+
|
54
|
+
_AnsibleDumper.add_multi_representer(_datatag.AnsibleTaggedObject, _represent_ansible_tagged_object)
|
55
|
+
|
56
|
+
_AnsibleDumper.add_multi_representer(_datatag.Tripwire, _represent_tripwire)
|
57
|
+
_AnsibleDumper.add_multi_representer(_c.Mapping, SafeRepresenter.represent_dict)
|
58
|
+
_AnsibleDumper.add_multi_representer(_c.Sequence, SafeRepresenter.represent_list)
|
59
|
+
|
34
60
|
yaml_load = _partial(_yaml.load, Loader=SafeLoader)
|
35
61
|
yaml_load_all = _partial(_yaml.load_all, Loader=SafeLoader)
|
36
62
|
|
37
|
-
yaml_dump = _partial(_yaml.dump, Dumper=
|
38
|
-
yaml_dump_all = _partial(_yaml.dump_all, Dumper=
|
63
|
+
yaml_dump = _partial(_yaml.dump, Dumper=_AnsibleDumper)
|
64
|
+
yaml_dump_all = _partial(_yaml.dump_all, Dumper=_AnsibleDumper)
|
39
65
|
else:
|
40
66
|
SafeLoader = object # type: ignore[assignment,misc]
|
41
67
|
SafeDumper = object # type: ignore[assignment,misc]
|