ansible-core 2.18.7__py3-none-any.whl → 2.19.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of ansible-core might be problematic. Click here for more details.
- ansible/_internal/__init__.py +53 -0
- ansible/_internal/_ansiballz/__init__.py +0 -0
- ansible/_internal/_ansiballz/_builder.py +101 -0
- ansible/_internal/_ansiballz/_wrapper.py +262 -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/_alarm_timeout.py +66 -0
- ansible/_internal/_errors/_captured.py +123 -0
- ansible/_internal/_errors/_error_factory.py +89 -0
- ansible/_internal/_errors/_error_utils.py +240 -0
- ansible/_internal/_errors/_handler.py +91 -0
- ansible/_internal/_errors/_task_timeout.py +28 -0
- ansible/_internal/_event_formatting.py +127 -0
- ansible/_internal/_json/__init__.py +214 -0
- ansible/_internal/_json/_legacy_encoder.py +34 -0
- ansible/_internal/_json/_profiles/__init__.py +0 -0
- ansible/_internal/_json/_profiles/_cache_persistence.py +57 -0
- ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
- ansible/_internal/_json/_profiles/_legacy.py +189 -0
- ansible/_internal/_locking.py +21 -0
- ansible/_internal/_plugins/__init__.py +0 -0
- ansible/_internal/_plugins/_cache.py +57 -0
- ansible/_internal/_ssh/__init__.py +0 -0
- ansible/_internal/_ssh/_agent_launch.py +91 -0
- ansible/_internal/_ssh/_ssh_agent.py +619 -0
- ansible/_internal/_task.py +78 -0
- ansible/_internal/_templating/__init__.py +12 -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 +592 -0
- ansible/_internal/_templating/_errors.py +28 -0
- ansible/_internal/_templating/_jinja_bits.py +1106 -0
- ansible/_internal/_templating/_jinja_common.py +323 -0
- ansible/_internal/_templating/_jinja_patches.py +44 -0
- ansible/_internal/_templating/_jinja_plugins.py +375 -0
- ansible/_internal/_templating/_lazy_containers.py +633 -0
- ansible/_internal/_templating/_marker_behaviors.py +103 -0
- ansible/_internal/_templating/_template_vars.py +72 -0
- ansible/_internal/_templating/_transform.py +70 -0
- ansible/_internal/_templating/_utils.py +108 -0
- ansible/_internal/_testing.py +26 -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 +70 -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 +27 -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 +93 -104
- ansible/cli/_ssh_askpass.py +54 -0
- ansible/cli/adhoc.py +20 -10
- ansible/cli/arguments/option_helpers.py +163 -10
- ansible/cli/config.py +43 -68
- ansible/cli/console.py +13 -11
- ansible/cli/doc.py +134 -77
- ansible/cli/galaxy.py +27 -20
- ansible/cli/inventory.py +28 -28
- ansible/cli/playbook.py +4 -12
- ansible/cli/pull.py +6 -3
- ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
- ansible/cli/vault.py +12 -11
- ansible/compat/__init__.py +2 -2
- ansible/compat/importlib_resources.py +9 -12
- ansible/config/base.yml +218 -133
- ansible/config/manager.py +220 -159
- ansible/constants.py +2 -65
- ansible/errors/__init__.py +350 -256
- ansible/executor/interpreter_discovery.py +28 -149
- ansible/executor/module_common.py +480 -514
- 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 +204 -153
- ansible/executor/powershell/become_wrapper.ps1 +107 -144
- ansible/executor/powershell/bootstrap_wrapper.ps1 +46 -9
- ansible/executor/powershell/coverage_wrapper.ps1 +91 -135
- ansible/executor/powershell/exec_wrapper.ps1 +675 -196
- ansible/executor/powershell/module_manifest.py +469 -265
- ansible/executor/powershell/module_wrapper.ps1 +195 -186
- ansible/executor/powershell/powershell_expand_user.ps1 +20 -0
- ansible/executor/powershell/powershell_mkdtemp.ps1 +17 -0
- 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 +139 -149
- ansible/executor/stats.py +5 -5
- ansible/executor/task_executor.py +270 -297
- ansible/executor/task_queue_manager.py +135 -137
- ansible/executor/task_result.py +182 -79
- ansible/galaxy/__init__.py +2 -2
- ansible/galaxy/api.py +26 -25
- ansible/galaxy/collection/__init__.py +6 -14
- ansible/galaxy/collection/concrete_artifact_manager.py +12 -21
- ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
- ansible/galaxy/dependency_resolution/providers.py +4 -4
- ansible/galaxy/dependency_resolution/reporters.py +81 -0
- ansible/galaxy/role.py +6 -10
- ansible/galaxy/token.py +28 -21
- ansible/inventory/data.py +47 -57
- ansible/inventory/group.py +50 -73
- ansible/inventory/helpers.py +9 -0
- ansible/inventory/host.py +37 -54
- ansible/inventory/manager.py +79 -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/__init__.py +0 -0
- ansible/module_utils/_internal/_ansiballz/_extensions/__init__.py +0 -0
- ansible/module_utils/_internal/_ansiballz/_extensions/_coverage.py +45 -0
- ansible/module_utils/_internal/_ansiballz/_extensions/_pydevd.py +62 -0
- ansible/module_utils/_internal/_ansiballz/_loader.py +81 -0
- ansible/module_utils/_internal/_ansiballz/_respawn.py +32 -0
- ansible/module_utils/_internal/_ansiballz/_respawn_wrapper.py +23 -0
- ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
- ansible/module_utils/_internal/_dataclass_validation.py +217 -0
- ansible/module_utils/_internal/_datatag/__init__.py +961 -0
- ansible/module_utils/_internal/_datatag/_tags.py +16 -0
- ansible/module_utils/_internal/_debugging.py +31 -0
- ansible/module_utils/_internal/_deprecator.py +157 -0
- ansible/module_utils/_internal/_errors.py +101 -0
- ansible/module_utils/_internal/_event_utils.py +61 -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 +428 -0
- ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
- ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +33 -0
- ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +37 -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 +52 -0
- ansible/module_utils/_internal/_messages.py +130 -0
- ansible/module_utils/_internal/_patches/__init__.py +66 -0
- ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +53 -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_info.py +38 -0
- ansible/module_utils/_internal/_stack.py +22 -0
- ansible/module_utils/_internal/_testing.py +0 -0
- ansible/module_utils/_internal/_text_utils.py +6 -0
- ansible/module_utils/_internal/_traceback.py +92 -0
- ansible/module_utils/_internal/_validation.py +14 -0
- ansible/module_utils/ansible_release.py +2 -2
- ansible/module_utils/api.py +1 -2
- ansible/module_utils/basic.py +303 -202
- ansible/module_utils/common/_utils.py +24 -28
- ansible/module_utils/common/arg_spec.py +8 -3
- ansible/module_utils/common/collections.py +7 -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/parameters.py +27 -24
- ansible/module_utils/common/process.py +2 -3
- ansible/module_utils/common/respawn.py +11 -33
- 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 +143 -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 +10 -13
- ansible/module_utils/csharp/Ansible.Basic.cs +15 -12
- ansible/module_utils/csharp/Ansible.Become.cs +1 -0
- ansible/module_utils/csharp/Ansible.Privilege.cs +2 -2
- ansible/module_utils/csharp/Ansible._Async.cs +517 -0
- ansible/module_utils/datatag.py +49 -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 +2 -2
- 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 +5 -5
- 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 +2 -3
- ansible/module_utils/facts/other/ohai.py +2 -3
- ansible/module_utils/facts/sysctl.py +4 -6
- ansible/module_utils/facts/system/apparmor.py +1 -2
- ansible/module_utils/facts/system/caps.py +3 -3
- 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 +27 -13
- 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 +2 -3
- 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/linux.py +3 -3
- 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 +7 -1
- ansible/module_utils/powershell/Ansible.ModuleUtils.AddType.psm1 +1 -1
- ansible/module_utils/powershell/Ansible.ModuleUtils.CamelConversion.psm1 +1 -1
- ansible/module_utils/powershell/Ansible.ModuleUtils.CommandUtil.psm1 +1 -1
- ansible/module_utils/powershell/Ansible.ModuleUtils.WebRequest.psm1 +1 -1
- ansible/module_utils/service.py +21 -31
- ansible/module_utils/splitter.py +7 -7
- ansible/module_utils/testing.py +31 -0
- ansible/module_utils/urls.py +64 -35
- ansible/modules/add_host.py +4 -4
- ansible/modules/apt.py +69 -49
- ansible/modules/apt_key.py +19 -12
- ansible/modules/apt_repository.py +32 -51
- ansible/modules/assemble.py +16 -14
- ansible/modules/assert.py +4 -4
- ansible/modules/async_status.py +24 -24
- ansible/modules/async_wrapper.py +20 -25
- ansible/modules/blockinfile.py +6 -7
- ansible/modules/command.py +13 -20
- ansible/modules/copy.py +60 -147
- ansible/modules/cron.py +24 -21
- 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 +13 -15
- ansible/modules/fail.py +4 -4
- ansible/modules/fetch.py +4 -4
- ansible/modules/file.py +184 -144
- ansible/modules/find.py +22 -20
- ansible/modules/gather_facts.py +3 -3
- ansible/modules/get_url.py +77 -54
- ansible/modules/getent.py +7 -9
- ansible/modules/git.py +38 -38
- ansible/modules/group.py +6 -6
- ansible/modules/group_by.py +4 -4
- ansible/modules/hostname.py +15 -32
- 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 +22 -24
- ansible/modules/lineinfile.py +5 -5
- ansible/modules/meta.py +4 -4
- ansible/modules/mount_facts.py +2 -2
- ansible/modules/package.py +10 -4
- ansible/modules/package_facts.py +22 -10
- ansible/modules/pause.py +6 -6
- ansible/modules/ping.py +6 -6
- ansible/modules/pip.py +21 -26
- ansible/modules/raw.py +6 -6
- ansible/modules/reboot.py +6 -6
- ansible/modules/replace.py +10 -14
- ansible/modules/rpm_key.py +7 -8
- ansible/modules/script.py +4 -4
- ansible/modules/service.py +10 -17
- 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 +16 -19
- ansible/modules/stat.py +15 -31
- ansible/modules/subversion.py +15 -15
- ansible/modules/systemd.py +7 -7
- ansible/modules/systemd_service.py +7 -7
- ansible/modules/sysvinit.py +9 -9
- ansible/modules/tempfile.py +5 -6
- ansible/modules/template.py +6 -6
- ansible/modules/unarchive.py +38 -17
- ansible/modules/uri.py +33 -26
- ansible/modules/user.py +45 -32
- ansible/modules/validate_argument_spec.py +10 -7
- ansible/modules/wait_for.py +70 -60
- ansible/modules/wait_for_connection.py +6 -6
- ansible/modules/yum_repository.py +10 -9
- ansible/parsing/ajson.py +17 -37
- ansible/parsing/dataloader.py +99 -54
- ansible/parsing/mod_args.py +62 -60
- 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 +327 -99
- 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 +187 -134
- 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 +32 -26
- ansible/playbook/loop_control.py +2 -2
- ansible/playbook/play.py +85 -44
- ansible/playbook/play_context.py +14 -17
- ansible/playbook/playbook_include.py +27 -62
- ansible/playbook/role/__init__.py +64 -49
- 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 +28 -12
- ansible/playbook/task.py +192 -121
- ansible/playbook/task_include.py +5 -5
- ansible/plugins/__init__.py +58 -26
- ansible/plugins/action/__init__.py +188 -186
- ansible/plugins/action/add_host.py +2 -2
- ansible/plugins/action/assemble.py +11 -18
- ansible/plugins/action/assert.py +55 -67
- ansible/plugins/action/async_status.py +7 -2
- ansible/plugins/action/copy.py +14 -17
- 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 +7 -8
- ansible/plugins/action/gather_facts.py +13 -14
- ansible/plugins/action/group_by.py +1 -1
- ansible/plugins/action/include_vars.py +10 -11
- ansible/plugins/action/package.py +8 -14
- ansible/plugins/action/pause.py +2 -2
- ansible/plugins/action/script.py +27 -38
- ansible/plugins/action/service.py +9 -18
- ansible/plugins/action/set_fact.py +3 -12
- ansible/plugins/action/set_stats.py +3 -8
- ansible/plugins/action/template.py +47 -67
- ansible/plugins/action/unarchive.py +6 -16
- ansible/plugins/action/uri.py +9 -20
- 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 +52 -63
- 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 +294 -201
- ansible/plugins/callback/default.py +99 -95
- ansible/plugins/callback/junit.py +44 -43
- ansible/plugins/callback/minimal.py +28 -25
- ansible/plugins/callback/oneline.py +34 -21
- ansible/plugins/callback/tree.py +27 -16
- ansible/plugins/connection/__init__.py +47 -34
- ansible/plugins/connection/local.py +156 -60
- ansible/plugins/connection/paramiko_ssh.py +34 -24
- ansible/plugins/connection/psrp.py +76 -165
- ansible/plugins/connection/ssh.py +326 -86
- ansible/plugins/connection/winrm.py +62 -141
- 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 +8 -4
- 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 +245 -120
- ansible/plugins/filter/encryption.py +42 -34
- 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/pow.yml +1 -1
- ansible/plugins/filter/regex_search.yml +1 -4
- ansible/plugins/filter/root.yml +1 -1
- ansible/plugins/filter/split.yml +1 -1
- ansible/plugins/filter/strftime.yml +3 -3
- ansible/plugins/filter/to_nice_yaml.yml +0 -4
- ansible/plugins/filter/to_uuid.yml +1 -1
- 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 +107 -86
- 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 +190 -120
- ansible/plugins/inventory/toml.py +16 -126
- ansible/plugins/inventory/yaml.py +10 -8
- ansible/plugins/list.py +72 -19
- ansible/plugins/loader.py +383 -198
- ansible/plugins/lookup/__init__.py +21 -4
- ansible/plugins/lookup/config.py +21 -35
- ansible/plugins/lookup/csvfile.py +19 -73
- 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 +87 -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 +47 -36
- ansible/plugins/lookup/together.py +0 -12
- ansible/plugins/lookup/unvault.py +1 -5
- ansible/plugins/lookup/url.py +4 -10
- ansible/plugins/lookup/vars.py +16 -24
- ansible/plugins/shell/__init__.py +58 -4
- ansible/plugins/shell/cmd.py +2 -2
- ansible/plugins/shell/powershell.py +106 -31
- ansible/plugins/shell/sh.py +13 -7
- ansible/plugins/strategy/__init__.py +168 -193
- 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 +75 -35
- ansible/plugins/test/files.py +1 -1
- ansible/plugins/test/finished.yml +1 -1
- ansible/plugins/test/mathstuff.py +3 -3
- ansible/plugins/test/uri.py +5 -8
- ansible/plugins/vars/host_group_vars.py +7 -14
- ansible/release.py +2 -2
- ansible/template/__init__.py +353 -943
- ansible/utils/__init__.py +0 -18
- ansible/utils/collection_loader/__init__.py +54 -5
- ansible/utils/collection_loader/_collection_config.py +5 -6
- ansible/utils/collection_loader/_collection_finder.py +82 -96
- ansible/utils/collection_loader/_collection_meta.py +15 -8
- ansible/utils/display.py +485 -73
- ansible/utils/encrypt.py +27 -19
- ansible/utils/fqcn.py +2 -2
- ansible/utils/galaxy.py +2 -2
- ansible/utils/hashing.py +8 -10
- ansible/utils/helpers.py +2 -2
- ansible/utils/listify.py +10 -8
- ansible/utils/lock.py +2 -2
- ansible/utils/path.py +10 -12
- ansible/utils/plugin_docs.py +16 -14
- ansible/utils/py3compat.py +2 -7
- ansible/utils/sentinel.py +4 -62
- ansible/utils/singleton.py +2 -0
- ansible/utils/ssh_functions.py +6 -2
- ansible/utils/unsafe_proxy.py +23 -332
- ansible/utils/vars.py +55 -8
- ansible/utils/version.py +2 -2
- ansible/vars/clean.py +5 -5
- ansible/vars/hostvars.py +60 -90
- ansible/vars/manager.py +220 -285
- ansible/vars/plugins.py +4 -4
- ansible/vars/reserved.py +13 -12
- {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/METADATA +4 -3
- ansible_core-2.19.0.dist-info/RECORD +1097 -0
- ansible_core-2.19.0.dist-info/licenses/licenses/BSD-3-Clause.txt +28 -0
- 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 +2 -2
- ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
- ansible_test/_data/requirements/sanity.pep8.txt +1 -1
- ansible_test/_data/requirements/sanity.pylint.txt +5 -5
- 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 +6 -0
- ansible_test/_internal/ansible_util.py +3 -1
- 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 -5
- 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 +52 -5
- 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 +3 -2
- 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 +22 -5
- 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 +3 -2
- 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 +8 -2
- 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 +19 -2
- 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 +12 -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 +25 -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 +44 -4
- ansible_test/_internal/commands/units/__init__.py +5 -1
- 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 +23 -13
- 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/debugging.py +166 -0
- ansible_test/_internal/delegation.py +22 -13
- 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 +260 -16
- ansible_test/_internal/http.py +1 -0
- ansible_test/_internal/init.py +1 -0
- ansible_test/_internal/inventory.py +39 -3
- ansible_test/_internal/io.py +1 -0
- ansible_test/_internal/metadata.py +95 -4
- ansible_test/_internal/payload.py +1 -0
- ansible_test/_internal/processes.py +80 -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 +11 -4
- ansible_test/_internal/pypi_proxy.py +6 -5
- ansible_test/_internal/python_requirements.py +28 -0
- ansible_test/_internal/ssh.py +2 -5
- ansible_test/_internal/target.py +9 -0
- ansible_test/_internal/test.py +3 -2
- ansible_test/_internal/thread.py +3 -1
- ansible_test/_internal/timeout.py +2 -1
- ansible_test/_internal/util.py +41 -12
- ansible_test/_internal/util_common.py +18 -5
- 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 +8 -5
- ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +8 -5
- ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +8 -5
- ansible_test/_util/controller/sanity/pylint/config/collection.cfg +4 -5
- ansible_test/_util/controller/sanity/pylint/config/default.cfg +8 -7
- ansible_test/_util/controller/sanity/pylint/plugins/deprecated_calls.py +541 -0
- ansible_test/_util/controller/sanity/pylint/plugins/deprecated_comment.py +137 -0
- 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/injector/python.py +8 -0
- 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 +38 -36
- 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.7.dist-info/RECORD +0 -992
- ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +0 -411
- {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/WHEEL +0 -0
- {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/entry_points.txt +0 -0
- {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/licenses/COPYING +0 -0
- {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/Apache-License.txt +0 -0
- {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/MIT-license.txt +0 -0
- {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/PSF-license.txt +0 -0
- {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/simplified_bsd.txt +0 -0
- {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/top_level.txt +0 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"""Ansible specific pylint plugin for checking format string usage."""
|
|
2
|
+
|
|
2
3
|
# (c) 2018, Matt Martz <matt@sivel.net>
|
|
3
4
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
4
5
|
# -*- coding: utf-8 -*-
|
|
@@ -6,13 +7,6 @@ from __future__ import annotations
|
|
|
6
7
|
|
|
7
8
|
import astroid
|
|
8
9
|
|
|
9
|
-
# support pylint 2.x and 3.x -- remove when supporting only 3.x
|
|
10
|
-
try:
|
|
11
|
-
from pylint.interfaces import IAstroidChecker
|
|
12
|
-
except ImportError:
|
|
13
|
-
class IAstroidChecker:
|
|
14
|
-
"""Backwards compatibility for 2.x / 3.x support."""
|
|
15
|
-
|
|
16
10
|
try:
|
|
17
11
|
from pylint.checkers.utils import check_messages
|
|
18
12
|
except ImportError:
|
|
@@ -38,7 +32,6 @@ class AnsibleStringFormatChecker(BaseChecker):
|
|
|
38
32
|
is valid and the arguments match the format string.
|
|
39
33
|
"""
|
|
40
34
|
|
|
41
|
-
__implements__ = (IAstroidChecker,)
|
|
42
35
|
name = 'string'
|
|
43
36
|
msgs = MSGS
|
|
44
37
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"""A plugin for pylint to identify imports and functions which should not be used."""
|
|
2
|
+
|
|
2
3
|
from __future__ import annotations
|
|
3
4
|
|
|
4
5
|
import os
|
|
@@ -6,13 +7,6 @@ import typing as t
|
|
|
6
7
|
|
|
7
8
|
import astroid
|
|
8
9
|
|
|
9
|
-
# support pylint 2.x and 3.x -- remove when supporting only 3.x
|
|
10
|
-
try:
|
|
11
|
-
from pylint.interfaces import IAstroidChecker
|
|
12
|
-
except ImportError:
|
|
13
|
-
class IAstroidChecker:
|
|
14
|
-
"""Backwards compatibility for 2.x / 3.x support."""
|
|
15
|
-
|
|
16
10
|
from pylint.checkers import BaseChecker
|
|
17
11
|
|
|
18
12
|
ANSIBLE_TEST_MODULES_PATH = os.environ['ANSIBLE_TEST_MODULES_PATH']
|
|
@@ -63,7 +57,6 @@ def is_module_path(path): # type: (str) -> bool
|
|
|
63
57
|
|
|
64
58
|
class AnsibleUnwantedChecker(BaseChecker):
|
|
65
59
|
"""Checker for unwanted imports and functions."""
|
|
66
|
-
__implements__ = (IAstroidChecker,)
|
|
67
60
|
|
|
68
61
|
name = 'unwanted'
|
|
69
62
|
|
|
@@ -65,7 +65,7 @@ def setup_collection_loader():
|
|
|
65
65
|
setup_collection_loader()
|
|
66
66
|
|
|
67
67
|
from ansible import __version__ as ansible_version
|
|
68
|
-
from ansible.executor.module_common import REPLACER_WINDOWS, NEW_STYLE_PYTHON_MODULE_RE
|
|
68
|
+
from ansible.executor.module_common import REPLACER_WINDOWS as _REPLACER_WINDOWS, NEW_STYLE_PYTHON_MODULE_RE
|
|
69
69
|
from ansible.module_utils.common.collections import is_iterable
|
|
70
70
|
from ansible.module_utils.common.parameters import DEFAULT_TYPE_VALIDATORS
|
|
71
71
|
from ansible.module_utils.compat.version import StrictVersion, LooseVersion
|
|
@@ -90,7 +90,7 @@ from .utils import CaptureStd, NoArgsAnsibleModule, compare_unordered_lists, par
|
|
|
90
90
|
TRY_EXCEPT = ast.Try
|
|
91
91
|
# REPLACER_WINDOWS from ansible.executor.module_common is byte
|
|
92
92
|
# string but we need unicode for Python 3
|
|
93
|
-
REPLACER_WINDOWS =
|
|
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:'
|
|
@@ -15,6 +15,7 @@ def main():
|
|
|
15
15
|
args = [sys.executable]
|
|
16
16
|
|
|
17
17
|
ansible_lib_root = os.environ.get('ANSIBLE_TEST_ANSIBLE_LIB_ROOT')
|
|
18
|
+
debugger_config = os.environ.get('ANSIBLE_TEST_DEBUGGER_CONFIG')
|
|
18
19
|
coverage_config = os.environ.get('COVERAGE_CONF')
|
|
19
20
|
coverage_output = os.environ.get('COVERAGE_FILE')
|
|
20
21
|
|
|
@@ -28,6 +29,13 @@ def main():
|
|
|
28
29
|
sys.exit('ERROR: Could not find `coverage` module. '
|
|
29
30
|
'Did you use a virtualenv created without --system-site-packages or with the wrong interpreter?')
|
|
30
31
|
|
|
32
|
+
if debugger_config:
|
|
33
|
+
import json
|
|
34
|
+
|
|
35
|
+
debugger_options = json.loads(debugger_config)
|
|
36
|
+
os.environ.update(debugger_options['env'])
|
|
37
|
+
args += debugger_options['args']
|
|
38
|
+
|
|
31
39
|
if name == 'python.py':
|
|
32
40
|
if sys.argv[1] == '-c':
|
|
33
41
|
# prevent simple misuse of python.py with -c which does not work with coverage
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"""Run each test in its own fork. PYTEST_DONT_REWRITE"""
|
|
2
|
+
|
|
2
3
|
# MIT License (see licenses/MIT-license.txt or https://opensource.org/licenses/MIT)
|
|
3
4
|
# Based on code originally from:
|
|
4
5
|
# https://github.com/pytest-dev/pytest-forked
|
|
@@ -63,6 +64,8 @@ def run_parent(item, pid, result_path): # type: (Item, int, str) -> list[TestRe
|
|
|
63
64
|
"""Wait for the child process to exit and return the test reports. Called in the parent process."""
|
|
64
65
|
exit_code = waitstatus_to_exitcode(os.waitpid(pid, 0)[1])
|
|
65
66
|
|
|
67
|
+
reports: list[TestReport]
|
|
68
|
+
|
|
66
69
|
if exit_code:
|
|
67
70
|
reason = "Test CRASHED with exit code {}.".format(exit_code)
|
|
68
71
|
report = TestReport(item.nodeid, item.location, {x: 1 for x in item.keywords}, "failed", reason, "call", user_properties=item.user_properties)
|
|
@@ -73,8 +76,10 @@ def run_parent(item, pid, result_path): # type: (Item, int, str) -> list[TestRe
|
|
|
73
76
|
|
|
74
77
|
reports = [report]
|
|
75
78
|
else:
|
|
79
|
+
captured_warnings: list[warnings.WarningMessage]
|
|
80
|
+
|
|
76
81
|
with open(result_path, "rb") as result_file:
|
|
77
|
-
reports, captured_warnings = pickle.load(result_file)
|
|
82
|
+
reports, captured_warnings = pickle.load(result_file)
|
|
78
83
|
|
|
79
84
|
for warning in captured_warnings:
|
|
80
85
|
warnings.warn_explicit(warning.message, warning.category, warning.filename, warning.lineno)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"""Enable unit testing of Ansible collections. PYTEST_DONT_REWRITE"""
|
|
2
|
+
|
|
2
3
|
from __future__ import annotations
|
|
3
4
|
|
|
4
5
|
import os
|
|
@@ -69,7 +70,7 @@ def enable_assertion_rewriting_hook(): # type: () -> None
|
|
|
69
70
|
# noinspection PyProtectedMember
|
|
70
71
|
from ansible.utils.collection_loader._collection_finder import _AnsibleCollectionPkgLoaderBase
|
|
71
72
|
|
|
72
|
-
_AnsibleCollectionPkgLoaderBase.exec_module = exec_module
|
|
73
|
+
_AnsibleCollectionPkgLoaderBase.exec_module = exec_module # type: ignore[method-assign]
|
|
73
74
|
|
|
74
75
|
|
|
75
76
|
def pytest_configure():
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"""Import the given python module(s) and report error(s) encountered."""
|
|
2
|
+
|
|
2
3
|
from __future__ import annotations
|
|
3
4
|
|
|
4
5
|
|
|
@@ -43,6 +44,7 @@ def main():
|
|
|
43
44
|
# noinspection PyCompatibility
|
|
44
45
|
from importlib import import_module
|
|
45
46
|
except ImportError:
|
|
47
|
+
|
|
46
48
|
def import_module(name, package=None): # type: (str, str | None) -> types.ModuleType
|
|
47
49
|
assert package is None
|
|
48
50
|
__import__(name)
|
|
@@ -60,11 +62,10 @@ def main():
|
|
|
60
62
|
|
|
61
63
|
if collection_full_name:
|
|
62
64
|
# allow importing code from collections when testing a collection
|
|
63
|
-
from ansible.module_utils.common.text.converters import to_bytes, to_text, to_native, text_type
|
|
64
65
|
|
|
65
66
|
# noinspection PyProtectedMember
|
|
66
67
|
from ansible.utils.collection_loader._collection_finder import _AnsibleCollectionFinder
|
|
67
|
-
from ansible.utils.collection_loader import _collection_finder
|
|
68
|
+
from ansible.utils.collection_loader import _collection_finder, _to_text
|
|
68
69
|
|
|
69
70
|
yaml_to_dict_cache = {}
|
|
70
71
|
|
|
@@ -74,7 +75,7 @@ def main():
|
|
|
74
75
|
|
|
75
76
|
def parse_value(value):
|
|
76
77
|
"""Custom value parser for JSON deserialization that recognizes our internal ISO date format."""
|
|
77
|
-
if isinstance(value,
|
|
78
|
+
if isinstance(value, str):
|
|
78
79
|
match = iso_date_re.search(value)
|
|
79
80
|
|
|
80
81
|
if match:
|
|
@@ -86,7 +87,7 @@ def main():
|
|
|
86
87
|
"""Object hook for custom ISO date deserialization from JSON."""
|
|
87
88
|
return dict((key, parse_value(value)) for key, value in data.items())
|
|
88
89
|
|
|
89
|
-
def yaml_to_dict(yaml, content_id):
|
|
90
|
+
def yaml_to_dict(yaml: str | bytes, content_id):
|
|
90
91
|
"""
|
|
91
92
|
Return a Python dict version of the provided YAML.
|
|
92
93
|
Conversion is done in a subprocess since the current Python interpreter does not have access to PyYAML.
|
|
@@ -96,18 +97,18 @@ def main():
|
|
|
96
97
|
|
|
97
98
|
try:
|
|
98
99
|
cmd = [external_python, yaml_to_json_path]
|
|
99
|
-
proc = subprocess.Popen(
|
|
100
|
-
stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
101
|
-
|
|
100
|
+
proc = subprocess.Popen(cmd, # pylint: disable=consider-using-with
|
|
101
|
+
stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
|
|
102
|
+
stdout, stderr = proc.communicate(_to_text(yaml))
|
|
102
103
|
|
|
103
104
|
if proc.returncode != 0:
|
|
104
|
-
raise Exception('command %s failed with return code %d: %s' % (
|
|
105
|
+
raise Exception('command %s failed with return code %d: %s' % (cmd, proc.returncode, stderr))
|
|
105
106
|
|
|
106
|
-
data = yaml_to_dict_cache[content_id] = json.loads(
|
|
107
|
+
data = yaml_to_dict_cache[content_id] = json.loads(stdout, object_hook=object_hook)
|
|
107
108
|
|
|
108
109
|
return data
|
|
109
110
|
except Exception as ex:
|
|
110
|
-
raise Exception('internal importer error - failed to parse yaml:
|
|
111
|
+
raise Exception(f'internal importer error - failed to parse yaml: {ex}')
|
|
111
112
|
|
|
112
113
|
_collection_finder._meta_yml_to_dict = yaml_to_dict # pylint: disable=protected-access
|
|
113
114
|
|
|
@@ -142,11 +143,13 @@ def main():
|
|
|
142
143
|
|
|
143
144
|
class ImporterAnsibleModule:
|
|
144
145
|
"""Replacement for AnsibleModule to support import testing."""
|
|
146
|
+
|
|
145
147
|
def __init__(self, *args, **kwargs):
|
|
146
148
|
raise ImporterAnsibleModuleException()
|
|
147
149
|
|
|
148
150
|
class RestrictedModuleLoader:
|
|
149
151
|
"""Python module loader that restricts inappropriate imports."""
|
|
152
|
+
|
|
150
153
|
def __init__(self, path, name, restrict_to_module_paths):
|
|
151
154
|
self.path = path
|
|
152
155
|
self.name = name
|
|
@@ -431,6 +434,7 @@ def main():
|
|
|
431
434
|
|
|
432
435
|
class Capture:
|
|
433
436
|
"""Captured output and/or exception."""
|
|
437
|
+
|
|
434
438
|
def __init__(self):
|
|
435
439
|
# use buffered IO to simulate StringIO; allows Ansible's stream patching to behave without warnings
|
|
436
440
|
self.stdout = TextIOWrapper(BytesIO())
|
|
@@ -489,6 +493,7 @@ def main():
|
|
|
489
493
|
finally:
|
|
490
494
|
if import_type == 'plugin' and not collection_loader:
|
|
491
495
|
from ansible.utils.collection_loader._collection_finder import _AnsibleCollectionFinder
|
|
496
|
+
|
|
492
497
|
_AnsibleCollectionFinder._remove() # pylint: disable=protected-access
|
|
493
498
|
|
|
494
499
|
if sys.meta_path[0] != restricted_loader:
|
|
@@ -541,12 +546,6 @@ def main():
|
|
|
541
546
|
"ignore",
|
|
542
547
|
"AnsibleCollectionFinder has already been configured")
|
|
543
548
|
|
|
544
|
-
# ansible.utils.unsafe_proxy attempts patching sys.intern generating a warning if it was already patched
|
|
545
|
-
warnings.filterwarnings(
|
|
546
|
-
"ignore",
|
|
547
|
-
"skipped sys.intern patch; appears to have already been patched"
|
|
548
|
-
)
|
|
549
|
-
|
|
550
549
|
try:
|
|
551
550
|
yield
|
|
552
551
|
finally:
|