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
@@ -1,6 +1,12 @@
|
|
1
|
-
[
|
1
|
+
[pylint]
|
2
|
+
|
3
|
+
max-line-length=160
|
4
|
+
|
5
|
+
load-plugins=
|
6
|
+
pylint.extensions.docstyle,
|
2
7
|
|
3
8
|
disable=
|
9
|
+
docstring-first-line-empty,
|
4
10
|
consider-using-f-string, # Python 2.x support still required
|
5
11
|
cyclic-import, # consistent results require running with --jobs 1 and testing all files
|
6
12
|
deprecated-argument, # results vary by Python version
|
@@ -28,8 +34,6 @@ disable=
|
|
28
34
|
use-dict-literal, # ignoring as a common style issue
|
29
35
|
useless-return, # complains about returning None when the return type is optional
|
30
36
|
|
31
|
-
[BASIC]
|
32
|
-
|
33
37
|
bad-names=
|
34
38
|
_,
|
35
39
|
bar,
|
@@ -52,8 +56,6 @@ attr-rgx=[a-z_][a-z0-9_]{1,40}$
|
|
52
56
|
method-rgx=[a-z_][a-z0-9_]{1,40}$
|
53
57
|
function-rgx=[a-z_][a-z0-9_]{1,40}$
|
54
58
|
|
55
|
-
[IMPORTS]
|
56
|
-
|
57
59
|
preferred-modules =
|
58
60
|
distutils.version:ansible.module_utils.compat.version,
|
59
61
|
|
@@ -1,6 +1,12 @@
|
|
1
|
-
[
|
1
|
+
[pylint]
|
2
|
+
|
3
|
+
max-line-length=160
|
4
|
+
|
5
|
+
load-plugins=
|
6
|
+
pylint.extensions.docstyle,
|
2
7
|
|
3
8
|
disable=
|
9
|
+
docstring-first-line-empty,
|
4
10
|
consider-using-f-string, # many occurrences
|
5
11
|
cyclic-import, # consistent results require running with --jobs 1 and testing all files
|
6
12
|
deprecated-argument, # results vary by Python version
|
@@ -27,8 +33,6 @@ disable=
|
|
27
33
|
unspecified-encoding, # always run with UTF-8 encoding enforced
|
28
34
|
useless-return, # complains about returning None when the return type is optional
|
29
35
|
|
30
|
-
[BASIC]
|
31
|
-
|
32
36
|
bad-names=
|
33
37
|
_,
|
34
38
|
bar,
|
@@ -55,8 +59,6 @@ function-rgx=[a-z_][a-z0-9_]{1,40}$
|
|
55
59
|
# See: https://github.com/PyCQA/pylint/pull/7322
|
56
60
|
typevar-rgx=^_{0,2}(?:[^\W\da-z_]+|(?:[^\W\da-z_]+[^\WA-Z_]+)+T?(?<!Type))(?:_co(?:ntra)?)?$
|
57
61
|
|
58
|
-
[IMPORTS]
|
59
|
-
|
60
62
|
preferred-modules =
|
61
63
|
distutils.version:ansible.module_utils.compat.version,
|
62
64
|
|
@@ -1,6 +1,12 @@
|
|
1
|
-
[
|
1
|
+
[pylint]
|
2
|
+
|
3
|
+
max-line-length=160
|
4
|
+
|
5
|
+
load-plugins=
|
6
|
+
pylint.extensions.docstyle,
|
2
7
|
|
3
8
|
disable=
|
9
|
+
docstring-first-line-empty,
|
4
10
|
consider-using-f-string, # many occurrences
|
5
11
|
cyclic-import, # consistent results require running with --jobs 1 and testing all files
|
6
12
|
deprecated-argument, # results vary by Python version
|
@@ -26,8 +32,6 @@ disable=
|
|
26
32
|
unspecified-encoding, # always run with UTF-8 encoding enforced
|
27
33
|
useless-return, # complains about returning None when the return type is optional
|
28
34
|
|
29
|
-
[BASIC]
|
30
|
-
|
31
35
|
bad-names=
|
32
36
|
_,
|
33
37
|
bar,
|
@@ -51,8 +55,6 @@ method-rgx=[a-z_][a-z0-9_]{1,40}$
|
|
51
55
|
function-rgx=[a-z_][a-z0-9_]{1,40}$
|
52
56
|
module-rgx=[a-z_][a-z0-9_-]{2,40}$
|
53
57
|
|
54
|
-
[IMPORTS]
|
55
|
-
|
56
58
|
preferred-modules =
|
57
59
|
distutils.version:ansible.module_utils.compat.version,
|
58
60
|
|
@@ -1,4 +1,6 @@
|
|
1
|
-
[
|
1
|
+
[pylint]
|
2
|
+
|
3
|
+
max-line-length=160
|
2
4
|
|
3
5
|
disable=
|
4
6
|
abstract-method,
|
@@ -127,8 +129,6 @@ disable=
|
|
127
129
|
wrong-import-order,
|
128
130
|
wrong-import-position,
|
129
131
|
|
130
|
-
[BASIC]
|
131
|
-
|
132
132
|
bad-names=
|
133
133
|
_,
|
134
134
|
bar,
|
@@ -145,7 +145,5 @@ good-names=
|
|
145
145
|
k,
|
146
146
|
Run,
|
147
147
|
|
148
|
-
[TYPECHECK]
|
149
|
-
|
150
148
|
ignored-modules=
|
151
149
|
_MovedItems,
|
@@ -1,6 +1,12 @@
|
|
1
|
-
[
|
1
|
+
[pylint]
|
2
|
+
|
3
|
+
max-line-length=160
|
4
|
+
|
5
|
+
load-plugins=
|
6
|
+
pylint.extensions.docstyle,
|
2
7
|
|
3
8
|
disable=
|
9
|
+
docstring-first-line-empty,
|
4
10
|
import-outside-toplevel, # common pattern in ansible related code
|
5
11
|
abstract-method,
|
6
12
|
access-member-before-definition,
|
@@ -118,8 +124,6 @@ disable=
|
|
118
124
|
wrong-import-order,
|
119
125
|
wrong-import-position,
|
120
126
|
|
121
|
-
[BASIC]
|
122
|
-
|
123
127
|
bad-names=
|
124
128
|
_,
|
125
129
|
bar,
|
@@ -136,12 +140,8 @@ good-names=
|
|
136
140
|
k,
|
137
141
|
Run,
|
138
142
|
|
139
|
-
[TYPECHECK]
|
140
|
-
|
141
143
|
ignored-modules=
|
142
144
|
_MovedItems,
|
143
145
|
|
144
|
-
[IMPORTS]
|
145
|
-
|
146
146
|
preferred-modules =
|
147
147
|
distutils.version:ansible.module_utils.compat.version,
|
@@ -1,4 +1,5 @@
|
|
1
1
|
"""Ansible specific plyint plugin for checking deprecations."""
|
2
|
+
|
2
3
|
# (c) 2018, Matt Martz <matt@sivel.net>
|
3
4
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
4
5
|
# -*- coding: utf-8 -*-
|
@@ -12,16 +13,6 @@ from tokenize import COMMENT, TokenInfo
|
|
12
13
|
|
13
14
|
import astroid
|
14
15
|
|
15
|
-
# support pylint 2.x and 3.x -- remove when supporting only 3.x
|
16
|
-
try:
|
17
|
-
from pylint.interfaces import IAstroidChecker, ITokenChecker
|
18
|
-
except ImportError:
|
19
|
-
class IAstroidChecker:
|
20
|
-
"""Backwards compatibility for 2.x / 3.x support."""
|
21
|
-
|
22
|
-
class ITokenChecker:
|
23
|
-
"""Backwards compatibility for 2.x / 3.x support."""
|
24
|
-
|
25
16
|
try:
|
26
17
|
from pylint.checkers.utils import check_messages
|
27
18
|
except ImportError:
|
@@ -151,7 +142,6 @@ class AnsibleDeprecatedChecker(BaseChecker):
|
|
151
142
|
has not passed or met the time for removal
|
152
143
|
"""
|
153
144
|
|
154
|
-
__implements__ = (IAstroidChecker,)
|
155
145
|
name = 'deprecated'
|
156
146
|
msgs = MSGS
|
157
147
|
|
@@ -296,8 +286,6 @@ class AnsibleDeprecatedCommentChecker(BaseTokenChecker):
|
|
296
286
|
has not passed or met the time for removal
|
297
287
|
"""
|
298
288
|
|
299
|
-
__implements__ = (ITokenChecker,)
|
300
|
-
|
301
289
|
name = 'deprecated-comment'
|
302
290
|
msgs = {
|
303
291
|
'E9601': ("Deprecated core version (%r) found: %s",
|
@@ -1,4 +1,5 @@
|
|
1
1
|
"""Ansible specific pylint plugin for checking format string usage."""
|
2
|
+
|
2
3
|
# (c) 2018, Matt Martz <matt@sivel.net>
|
3
4
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
4
5
|
# -*- coding: utf-8 -*-
|
@@ -6,13 +7,6 @@ from __future__ import annotations
|
|
6
7
|
|
7
8
|
import astroid
|
8
9
|
|
9
|
-
# support pylint 2.x and 3.x -- remove when supporting only 3.x
|
10
|
-
try:
|
11
|
-
from pylint.interfaces import IAstroidChecker
|
12
|
-
except ImportError:
|
13
|
-
class IAstroidChecker:
|
14
|
-
"""Backwards compatibility for 2.x / 3.x support."""
|
15
|
-
|
16
10
|
try:
|
17
11
|
from pylint.checkers.utils import check_messages
|
18
12
|
except ImportError:
|
@@ -38,7 +32,6 @@ class AnsibleStringFormatChecker(BaseChecker):
|
|
38
32
|
is valid and the arguments match the format string.
|
39
33
|
"""
|
40
34
|
|
41
|
-
__implements__ = (IAstroidChecker,)
|
42
35
|
name = 'string'
|
43
36
|
msgs = MSGS
|
44
37
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
"""A plugin for pylint to identify imports and functions which should not be used."""
|
2
|
+
|
2
3
|
from __future__ import annotations
|
3
4
|
|
4
5
|
import os
|
@@ -6,13 +7,6 @@ import typing as t
|
|
6
7
|
|
7
8
|
import astroid
|
8
9
|
|
9
|
-
# support pylint 2.x and 3.x -- remove when supporting only 3.x
|
10
|
-
try:
|
11
|
-
from pylint.interfaces import IAstroidChecker
|
12
|
-
except ImportError:
|
13
|
-
class IAstroidChecker:
|
14
|
-
"""Backwards compatibility for 2.x / 3.x support."""
|
15
|
-
|
16
10
|
from pylint.checkers import BaseChecker
|
17
11
|
|
18
12
|
ANSIBLE_TEST_MODULES_PATH = os.environ['ANSIBLE_TEST_MODULES_PATH']
|
@@ -63,7 +57,6 @@ def is_module_path(path): # type: (str) -> bool
|
|
63
57
|
|
64
58
|
class AnsibleUnwantedChecker(BaseChecker):
|
65
59
|
"""Checker for unwanted imports and functions."""
|
66
|
-
__implements__ = (IAstroidChecker,)
|
67
60
|
|
68
61
|
name = 'unwanted'
|
69
62
|
|
@@ -65,7 +65,7 @@ def setup_collection_loader():
|
|
65
65
|
setup_collection_loader()
|
66
66
|
|
67
67
|
from ansible import __version__ as ansible_version
|
68
|
-
from ansible.executor.module_common import REPLACER_WINDOWS, NEW_STYLE_PYTHON_MODULE_RE
|
68
|
+
from ansible.executor.module_common import REPLACER_WINDOWS as _REPLACER_WINDOWS, NEW_STYLE_PYTHON_MODULE_RE
|
69
69
|
from ansible.module_utils.common.collections import is_iterable
|
70
70
|
from ansible.module_utils.common.parameters import DEFAULT_TYPE_VALIDATORS
|
71
71
|
from ansible.module_utils.compat.version import StrictVersion, LooseVersion
|
@@ -90,7 +90,7 @@ from .utils import CaptureStd, NoArgsAnsibleModule, compare_unordered_lists, par
|
|
90
90
|
TRY_EXCEPT = ast.Try
|
91
91
|
# REPLACER_WINDOWS from ansible.executor.module_common is byte
|
92
92
|
# string but we need unicode for Python 3
|
93
|
-
REPLACER_WINDOWS =
|
93
|
+
REPLACER_WINDOWS = _REPLACER_WINDOWS.decode('utf-8')
|
94
94
|
|
95
95
|
REJECTLIST_DIRS = frozenset(('.git', 'test', '.github', '.idea'))
|
96
96
|
INDENT_REGEX = re.compile(r'([\t]*)')
|
@@ -311,8 +311,8 @@ class ModuleValidator(Validator):
|
|
311
311
|
|
312
312
|
self.analyze_arg_spec = analyze_arg_spec and plugin_type == 'module'
|
313
313
|
|
314
|
-
self._Version = LooseVersion
|
315
|
-
self._StrictVersion = StrictVersion
|
314
|
+
self._Version: type[LooseVersion | SemanticVersion] = LooseVersion
|
315
|
+
self._StrictVersion: type[StrictVersion | SemanticVersion] = StrictVersion
|
316
316
|
|
317
317
|
self.collection = collection
|
318
318
|
self.collection_name = 'ansible.builtin'
|
@@ -687,30 +687,57 @@ class ModuleValidator(Validator):
|
|
687
687
|
# get module list for each
|
688
688
|
# check "shape" of each module name
|
689
689
|
|
690
|
-
|
691
|
-
|
690
|
+
legacy_ps_requires = r'(?im)^#\s*Requires\s+\-Module(?:s?)\s+(Ansible\.ModuleUtils\..+)'
|
691
|
+
ps_requires = r"""(?imx)
|
692
|
+
^\#\s*AnsibleRequires\s+-PowerShell\s+
|
693
|
+
(
|
694
|
+
# Builtin PowerShell module
|
695
|
+
(Ansible\.ModuleUtils\.[\w\.]+)
|
696
|
+
|
|
697
|
+
# Fully qualified collection PowerShell module
|
698
|
+
(ansible_collections\.\w+\.\w+\.plugins\.module_utils\.[\w\.]+)
|
699
|
+
|
|
700
|
+
# Relative collection PowerShell module
|
701
|
+
(\.[\w\.]+)
|
702
|
+
)
|
703
|
+
(\s+-Optional)?"""
|
704
|
+
csharp_requires = r"""(?imx)
|
705
|
+
^\#\s*AnsibleRequires\s+-CSharpUtil\s+
|
706
|
+
(
|
707
|
+
# Builtin C# util
|
708
|
+
(Ansible\.[\w\.]+)
|
709
|
+
|
|
710
|
+
# Fully qualified collection C# util
|
711
|
+
(ansible_collections\.\w+\.\w+\.plugins\.module_utils\.[\w\.]+)
|
712
|
+
|
|
713
|
+
# Relative collection C# util
|
714
|
+
(\.[\w\.]+)
|
715
|
+
)
|
716
|
+
(\s+-Optional)?"""
|
717
|
+
|
692
718
|
found_requires = False
|
693
719
|
|
694
|
-
for
|
695
|
-
|
696
|
-
|
697
|
-
|
698
|
-
|
699
|
-
|
700
|
-
|
701
|
-
|
702
|
-
|
703
|
-
|
704
|
-
|
720
|
+
for pattern, required_type in [(legacy_ps_requires, "Requires"), (ps_requires, "AnsibleRequires")]:
|
721
|
+
for req_stmt in re.finditer(pattern, self.text):
|
722
|
+
found_requires = True
|
723
|
+
# this will bomb on dictionary format - "don't do that"
|
724
|
+
module_list = [x.strip() for x in req_stmt.group(1).split(',')]
|
725
|
+
if len(module_list) > 1:
|
726
|
+
self.reporter.error(
|
727
|
+
path=self.object_path,
|
728
|
+
code='multiple-utils-per-requires',
|
729
|
+
msg='Ansible.ModuleUtils requirements do not support multiple modules per statement: "%s"' % req_stmt.group(0)
|
730
|
+
)
|
731
|
+
continue
|
705
732
|
|
706
|
-
|
733
|
+
module_name = module_list[0]
|
707
734
|
|
708
|
-
|
709
|
-
|
710
|
-
|
711
|
-
|
712
|
-
|
713
|
-
|
735
|
+
if module_name.lower().endswith('.psm1'):
|
736
|
+
self.reporter.error(
|
737
|
+
path=self.object_path,
|
738
|
+
code='invalid-requires-extension',
|
739
|
+
msg='Module #%s should not end in .psm1: "%s"' % (required_type, module_name)
|
740
|
+
)
|
714
741
|
|
715
742
|
for req_stmt in re.finditer(csharp_requires, self.text):
|
716
743
|
found_requires = True
|
@@ -979,7 +1006,7 @@ class ModuleValidator(Validator):
|
|
979
1006
|
missing_fragment = False
|
980
1007
|
with CaptureStd():
|
981
1008
|
try:
|
982
|
-
get_docstring(self.path, fragment_loader=fragment_loader,
|
1009
|
+
get_docstring(os.path.abspath(self.path), fragment_loader=fragment_loader,
|
983
1010
|
verbose=True,
|
984
1011
|
collection_name=self.collection_name,
|
985
1012
|
plugin_type=self.plugin_type)
|
@@ -1003,7 +1030,7 @@ class ModuleValidator(Validator):
|
|
1003
1030
|
)
|
1004
1031
|
|
1005
1032
|
if not missing_fragment:
|
1006
|
-
add_fragments(doc, self.object_path, fragment_loader=fragment_loader,
|
1033
|
+
add_fragments(doc, os.path.abspath(self.object_path), fragment_loader=fragment_loader,
|
1007
1034
|
is_module=self.plugin_type == 'module')
|
1008
1035
|
|
1009
1036
|
if 'options' in doc and doc['options'] is None:
|
@@ -1589,7 +1616,7 @@ class ModuleValidator(Validator):
|
|
1589
1616
|
|
1590
1617
|
try:
|
1591
1618
|
if not context:
|
1592
|
-
add_fragments(docs, self.object_path, fragment_loader=fragment_loader,
|
1619
|
+
add_fragments(docs, os.path.abspath(self.object_path), fragment_loader=fragment_loader,
|
1593
1620
|
is_module=self.plugin_type == 'module')
|
1594
1621
|
except Exception:
|
1595
1622
|
# Cannot merge fragments
|
@@ -2186,7 +2213,7 @@ class ModuleValidator(Validator):
|
|
2186
2213
|
with CaptureStd():
|
2187
2214
|
try:
|
2188
2215
|
existing_doc, dummy_examples, dummy_return, existing_metadata = get_docstring(
|
2189
|
-
self.base_module, fragment_loader, verbose=True, collection_name=self.collection_name,
|
2216
|
+
os.path.abspath(self.base_module), fragment_loader, verbose=True, collection_name=self.collection_name,
|
2190
2217
|
is_module=self.plugin_type == 'module')
|
2191
2218
|
existing_options = existing_doc.get('options', {}) or {}
|
2192
2219
|
except AssertionError:
|
@@ -110,15 +110,22 @@ def get_ps_argument_spec(filename, collection):
|
|
110
110
|
b_module_data = module_fd.read()
|
111
111
|
|
112
112
|
ps_dep_finder = PSModuleDepFinder()
|
113
|
-
ps_dep_finder.scan_module(b_module_data, fqn=fqc_name)
|
113
|
+
module_deps = ps_dep_finder.scan_module(b_module_data, fqn=fqc_name)
|
114
|
+
ansible_basic = ''
|
115
|
+
ps_utils = {}
|
116
|
+
for dep in module_deps:
|
117
|
+
dep_info = ps_dep_finder.scripts[dep]
|
114
118
|
|
115
|
-
|
116
|
-
|
119
|
+
if dep == 'Ansible.Basic.cs':
|
120
|
+
ansible_basic = dep_info.path
|
121
|
+
|
122
|
+
elif dep.endswith('.psm1'):
|
123
|
+
ps_utils[dep] = dep_info.path
|
117
124
|
|
118
125
|
util_manifest = json.dumps({
|
119
126
|
'module_path': to_text(module_path, errors='surrogate_or_strict'),
|
120
|
-
'ansible_basic':
|
121
|
-
'ps_utils':
|
127
|
+
'ansible_basic': ansible_basic,
|
128
|
+
'ps_utils': ps_utils,
|
122
129
|
})
|
123
130
|
|
124
131
|
script_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'ps_argspec.ps1')
|
@@ -67,6 +67,17 @@ def collection_name(v, error_code=None):
|
|
67
67
|
return v
|
68
68
|
|
69
69
|
|
70
|
+
def fqcn(v, error_code=None):
|
71
|
+
if not isinstance(v, string_types):
|
72
|
+
raise _add_ansible_error_code(
|
73
|
+
Invalid('Module/plugin name must be a string'), error_code or 'invalid-documentation')
|
74
|
+
m = FULLY_QUALIFIED_COLLECTION_RESOURCE_RE.match(v)
|
75
|
+
if not m:
|
76
|
+
raise _add_ansible_error_code(
|
77
|
+
Invalid('Module/plugin name must be of format `<namespace>.<collection>.<name>(.<subname>)*`'), error_code or 'invalid-documentation')
|
78
|
+
return v
|
79
|
+
|
80
|
+
|
70
81
|
def deprecation_versions():
|
71
82
|
"""Create a list of valid version for deprecation entries, current+4"""
|
72
83
|
major, minor = [int(version) for version in __version__.split('.')[0:2]]
|
@@ -196,11 +207,11 @@ seealso_schema = Schema(
|
|
196
207
|
[
|
197
208
|
Any(
|
198
209
|
{
|
199
|
-
Required('module'):
|
210
|
+
Required('module'): fqcn,
|
200
211
|
'description': doc_string,
|
201
212
|
},
|
202
213
|
{
|
203
|
-
Required('plugin'):
|
214
|
+
Required('plugin'): fqcn,
|
204
215
|
Required('plugin_type'): Any(*DOCUMENTABLE_PLUGINS),
|
205
216
|
'description': doc_string,
|
206
217
|
},
|
@@ -199,6 +199,7 @@ class NoArgsAnsibleModule(AnsibleModule):
|
|
199
199
|
"""AnsibleModule that does not actually load params. This is used to get access to the
|
200
200
|
methods within AnsibleModule without having to fake a bunch of data
|
201
201
|
"""
|
202
|
+
|
202
203
|
def _load_params(self):
|
203
204
|
self.params = {'_ansible_selinux_special_fs': [], '_ansible_remote_tmp': '/tmp', '_ansible_keep_remote_files': False, '_ansible_check_mode': False}
|
204
205
|
|
@@ -1,7 +1,9 @@
|
|
1
1
|
"""Wrapper around yamllint that supports YAML embedded in Ansible modules."""
|
2
|
+
|
2
3
|
from __future__ import annotations
|
3
4
|
|
4
5
|
import ast
|
6
|
+
import copy
|
5
7
|
import json
|
6
8
|
import os
|
7
9
|
import re
|
@@ -9,10 +11,10 @@ import sys
|
|
9
11
|
import typing as t
|
10
12
|
|
11
13
|
import yaml
|
12
|
-
from yaml.resolver import Resolver
|
13
|
-
from yaml.constructor import SafeConstructor
|
14
|
+
from yaml.resolver import Resolver, BaseResolver
|
15
|
+
from yaml.constructor import SafeConstructor, ConstructorError
|
14
16
|
from yaml.error import MarkedYAMLError
|
15
|
-
from yaml.cyaml import CParser
|
17
|
+
from yaml.cyaml import CParser # type: ignore[attr-defined]
|
16
18
|
|
17
19
|
from yamllint import linter
|
18
20
|
from yamllint.config import YamlLintConfig
|
@@ -29,37 +31,49 @@ def main():
|
|
29
31
|
|
30
32
|
class TestConstructor(SafeConstructor):
|
31
33
|
"""Yaml Safe Constructor that knows about Ansible tags."""
|
34
|
+
|
32
35
|
def construct_yaml_unsafe(self, node):
|
33
36
|
"""Construct an unsafe tag."""
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
37
|
+
return self._resolve_and_construct_object(node)
|
38
|
+
|
39
|
+
def construct_yaml_vault(self, node):
|
40
|
+
"""Construct a vault tag."""
|
41
|
+
ciphertext = self._resolve_and_construct_object(node)
|
42
|
+
|
43
|
+
if not isinstance(ciphertext, str):
|
44
|
+
raise ConstructorError(problem=f"the {node.tag!r} tag requires a string value", problem_mark=node.start_mark)
|
40
45
|
|
41
|
-
|
46
|
+
return ciphertext
|
42
47
|
|
43
|
-
|
48
|
+
def _resolve_and_construct_object(self, node):
|
49
|
+
# use a copied node to avoid mutating existing node and tripping the recursion check in construct_object
|
50
|
+
copied_node = copy.copy(node)
|
51
|
+
# repeat implicit resolution process to determine the proper tag for the value in the unsafe node
|
52
|
+
copied_node.tag = t.cast(BaseResolver, self).resolve(type(node), node.value, (True, False)) # pylint: disable=no-member
|
53
|
+
|
54
|
+
# re-entrant call using the correct tag
|
55
|
+
# non-deferred construction of hierarchical nodes so the result is a fully realized object, and so our stateful unsafe propagation behavior works
|
56
|
+
return self.construct_object(copied_node, deep=True)
|
44
57
|
|
45
58
|
|
46
59
|
TestConstructor.add_constructor(
|
47
60
|
'!unsafe',
|
48
|
-
TestConstructor.construct_yaml_unsafe)
|
61
|
+
TestConstructor.construct_yaml_unsafe) # type: ignore[type-var]
|
49
62
|
|
50
63
|
|
51
64
|
TestConstructor.add_constructor(
|
52
65
|
'!vault',
|
53
|
-
TestConstructor.
|
66
|
+
TestConstructor.construct_yaml_vault) # type: ignore[type-var]
|
54
67
|
|
55
68
|
|
56
69
|
TestConstructor.add_constructor(
|
57
70
|
'!vault-encrypted',
|
58
|
-
TestConstructor.
|
71
|
+
TestConstructor.construct_yaml_vault) # type: ignore[type-var]
|
59
72
|
|
60
73
|
|
61
74
|
class TestLoader(CParser, TestConstructor, Resolver):
|
62
75
|
"""Custom YAML loader that recognizes custom Ansible tags."""
|
76
|
+
|
63
77
|
def __init__(self, stream):
|
64
78
|
CParser.__init__(self, stream)
|
65
79
|
TestConstructor.__init__(self)
|
@@ -68,6 +82,7 @@ class TestLoader(CParser, TestConstructor, Resolver):
|
|
68
82
|
|
69
83
|
class YamlChecker:
|
70
84
|
"""Wrapper around yamllint that supports YAML embedded in Ansible modules."""
|
85
|
+
|
71
86
|
def __init__(self):
|
72
87
|
self.messages = []
|
73
88
|
|
@@ -135,11 +150,11 @@ class YamlChecker:
|
|
135
150
|
|
136
151
|
self.messages += [self.result_to_message(r, path, lineno - 1, key) for r in messages]
|
137
152
|
|
138
|
-
def check_parsable(self, path, contents, lineno=1, allow_multiple=False, prefix
|
153
|
+
def check_parsable(self, path: str, contents: str, lineno: int = 1, allow_multiple: bool = False, prefix: str = "") -> None:
|
139
154
|
"""Check the given contents to verify they can be parsed as YAML."""
|
140
155
|
prefix = f"{prefix}: " if prefix else ""
|
141
156
|
try:
|
142
|
-
documents = len(list(yaml.load_all(contents, Loader=TestLoader)))
|
157
|
+
documents = len(list(yaml.load_all(contents, Loader=TestLoader))) # type: ignore[arg-type]
|
143
158
|
if documents > 1 and not allow_multiple:
|
144
159
|
self.messages += [{'code': 'multiple-yaml-documents',
|
145
160
|
'message': f'{prefix}expected a single document in the stream',
|
@@ -149,8 +164,11 @@ class YamlChecker:
|
|
149
164
|
'level': 'error',
|
150
165
|
}]
|
151
166
|
except MarkedYAMLError as ex:
|
167
|
+
message = ' '.join(filter(None, (ex.context, ex.problem, ex.note)))
|
168
|
+
message = message.strip()
|
169
|
+
|
152
170
|
self.messages += [{'code': 'unparsable-with-libyaml',
|
153
|
-
'message': f'{prefix}{
|
171
|
+
'message': f'{prefix}{message}',
|
154
172
|
'path': path,
|
155
173
|
'line': ex.problem_mark.line + lineno,
|
156
174
|
'column': ex.problem_mark.column + 1,
|
@@ -1,4 +1,5 @@
|
|
1
1
|
"""Read YAML from stdin and write JSON to stdout."""
|
2
|
+
|
2
3
|
from __future__ import annotations
|
3
4
|
|
4
5
|
import datetime
|
@@ -10,7 +11,7 @@ from yaml import load
|
|
10
11
|
try:
|
11
12
|
from yaml import CSafeLoader as SafeLoader
|
12
13
|
except ImportError:
|
13
|
-
from yaml import SafeLoader
|
14
|
+
from yaml import SafeLoader # type: ignore[assignment]
|
14
15
|
|
15
16
|
# unique ISO date marker matching the one present in importer.py
|
16
17
|
ISO_DATE_MARKER = 'isodate:f23983df-f3df-453c-9904-bcd08af468cc:'
|
@@ -1,4 +1,5 @@
|
|
1
1
|
"""Run each test in its own fork. PYTEST_DONT_REWRITE"""
|
2
|
+
|
2
3
|
# MIT License (see licenses/MIT-license.txt or https://opensource.org/licenses/MIT)
|
3
4
|
# Based on code originally from:
|
4
5
|
# https://github.com/pytest-dev/pytest-forked
|
@@ -63,6 +64,8 @@ def run_parent(item, pid, result_path): # type: (Item, int, str) -> list[TestRe
|
|
63
64
|
"""Wait for the child process to exit and return the test reports. Called in the parent process."""
|
64
65
|
exit_code = waitstatus_to_exitcode(os.waitpid(pid, 0)[1])
|
65
66
|
|
67
|
+
reports: list[TestReport]
|
68
|
+
|
66
69
|
if exit_code:
|
67
70
|
reason = "Test CRASHED with exit code {}.".format(exit_code)
|
68
71
|
report = TestReport(item.nodeid, item.location, {x: 1 for x in item.keywords}, "failed", reason, "call", user_properties=item.user_properties)
|
@@ -73,8 +76,10 @@ def run_parent(item, pid, result_path): # type: (Item, int, str) -> list[TestRe
|
|
73
76
|
|
74
77
|
reports = [report]
|
75
78
|
else:
|
79
|
+
captured_warnings: list[warnings.WarningMessage]
|
80
|
+
|
76
81
|
with open(result_path, "rb") as result_file:
|
77
|
-
reports, captured_warnings = pickle.load(result_file)
|
82
|
+
reports, captured_warnings = pickle.load(result_file)
|
78
83
|
|
79
84
|
for warning in captured_warnings:
|
80
85
|
warnings.warn_explicit(warning.message, warning.category, warning.filename, warning.lineno)
|
@@ -1,4 +1,5 @@
|
|
1
1
|
"""Enable unit testing of Ansible collections. PYTEST_DONT_REWRITE"""
|
2
|
+
|
2
3
|
from __future__ import annotations
|
3
4
|
|
4
5
|
import os
|
@@ -69,7 +70,7 @@ def enable_assertion_rewriting_hook(): # type: () -> None
|
|
69
70
|
# noinspection PyProtectedMember
|
70
71
|
from ansible.utils.collection_loader._collection_finder import _AnsibleCollectionPkgLoaderBase
|
71
72
|
|
72
|
-
_AnsibleCollectionPkgLoaderBase.exec_module = exec_module
|
73
|
+
_AnsibleCollectionPkgLoaderBase.exec_module = exec_module # type: ignore[method-assign]
|
73
74
|
|
74
75
|
|
75
76
|
def pytest_configure():
|