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
ansible/cli/console.py
CHANGED
|
@@ -29,13 +29,14 @@ from ansible.plugins.list import list_plugins
|
|
|
29
29
|
from ansible.plugins.loader import module_loader, fragment_loader
|
|
30
30
|
from ansible.utils import plugin_docs
|
|
31
31
|
from ansible.utils.color import stringc
|
|
32
|
+
from ansible._internal._datatag._tags import TrustedAsTemplate
|
|
32
33
|
from ansible.utils.display import Display
|
|
33
34
|
|
|
34
35
|
display = Display()
|
|
35
36
|
|
|
36
37
|
|
|
37
38
|
class ConsoleCLI(CLI, cmd.Cmd):
|
|
38
|
-
|
|
39
|
+
"""
|
|
39
40
|
A REPL that allows for running ad-hoc tasks against a chosen inventory
|
|
40
41
|
from a nice shell with built-in tab completion (based on dominis'
|
|
41
42
|
``ansible-shell``).
|
|
@@ -62,7 +63,7 @@ class ConsoleCLI(CLI, cmd.Cmd):
|
|
|
62
63
|
- ``help [command/module]``: display documentation for
|
|
63
64
|
the command or module
|
|
64
65
|
- ``exit``: exit ``ansible-console``
|
|
65
|
-
|
|
66
|
+
"""
|
|
66
67
|
|
|
67
68
|
name = 'ansible-console'
|
|
68
69
|
modules = [] # type: list[str] | None
|
|
@@ -72,6 +73,8 @@ class ConsoleCLI(CLI, cmd.Cmd):
|
|
|
72
73
|
# use specific to console, but fallback to highlight for backwards compatibility
|
|
73
74
|
NORMAL_PROMPT = C.COLOR_CONSOLE_PROMPT or C.COLOR_HIGHLIGHT
|
|
74
75
|
|
|
76
|
+
USES_CONNECTION = True
|
|
77
|
+
|
|
75
78
|
def __init__(self, args):
|
|
76
79
|
|
|
77
80
|
super(ConsoleCLI, self).__init__(args)
|
|
@@ -179,6 +182,8 @@ class ConsoleCLI(CLI, cmd.Cmd):
|
|
|
179
182
|
else:
|
|
180
183
|
module_args = ''
|
|
181
184
|
|
|
185
|
+
module_args = TrustedAsTemplate().tag(module_args)
|
|
186
|
+
|
|
182
187
|
if self.callback:
|
|
183
188
|
cb = self.callback
|
|
184
189
|
elif C.DEFAULT_LOAD_CALLBACK_PLUGINS and C.DEFAULT_STDOUT_CALLBACK != 'default':
|
|
@@ -189,7 +194,7 @@ class ConsoleCLI(CLI, cmd.Cmd):
|
|
|
189
194
|
result = None
|
|
190
195
|
try:
|
|
191
196
|
check_raw = module in C._ACTION_ALLOWS_RAW_ARGS
|
|
192
|
-
task = dict(action=
|
|
197
|
+
task = dict(action=module, args=parse_kv(module_args, check_raw=check_raw), timeout=self.task_timeout)
|
|
193
198
|
play_ds = dict(
|
|
194
199
|
name="Ansible Shell",
|
|
195
200
|
hosts=self.cwd,
|
|
@@ -217,7 +222,7 @@ class ConsoleCLI(CLI, cmd.Cmd):
|
|
|
217
222
|
variable_manager=self.variable_manager,
|
|
218
223
|
loader=self.loader,
|
|
219
224
|
passwords=self.passwords,
|
|
220
|
-
|
|
225
|
+
stdout_callback_name=cb,
|
|
221
226
|
run_additional_callbacks=C.DEFAULT_LOAD_CALLBACK_PLUGINS,
|
|
222
227
|
run_tree=False,
|
|
223
228
|
forks=self.forks,
|
|
@@ -237,11 +242,8 @@ class ConsoleCLI(CLI, cmd.Cmd):
|
|
|
237
242
|
except KeyboardInterrupt:
|
|
238
243
|
display.error('User interrupted execution')
|
|
239
244
|
return False
|
|
240
|
-
except Exception as
|
|
241
|
-
|
|
242
|
-
import traceback
|
|
243
|
-
display.v(traceback.format_exc())
|
|
244
|
-
display.error(to_text(e))
|
|
245
|
+
except Exception as ex:
|
|
246
|
+
display.error(ex)
|
|
245
247
|
return False
|
|
246
248
|
|
|
247
249
|
def emptyline(self):
|
|
@@ -571,7 +573,7 @@ class ConsoleCLI(CLI, cmd.Cmd):
|
|
|
571
573
|
histfile = os.path.join(os.path.expanduser("~"), ".ansible-console_history")
|
|
572
574
|
try:
|
|
573
575
|
readline.read_history_file(histfile)
|
|
574
|
-
except
|
|
576
|
+
except OSError:
|
|
575
577
|
pass
|
|
576
578
|
|
|
577
579
|
atexit.register(readline.write_history_file, histfile)
|
|
@@ -579,7 +581,7 @@ class ConsoleCLI(CLI, cmd.Cmd):
|
|
|
579
581
|
self.cmdloop()
|
|
580
582
|
|
|
581
583
|
def __getattr__(self, name):
|
|
582
|
-
|
|
584
|
+
""" handle not found to populate dynamically a module function if module matching name exists """
|
|
583
585
|
attr = None
|
|
584
586
|
|
|
585
587
|
if name.startswith('do_'):
|
ansible/cli/doc.py
CHANGED
|
@@ -9,13 +9,16 @@ from __future__ import annotations
|
|
|
9
9
|
# ansible.cli needs to be imported first, to ensure the source bin/* scripts run that code first
|
|
10
10
|
from ansible.cli import CLI
|
|
11
11
|
|
|
12
|
+
import collections.abc
|
|
12
13
|
import importlib
|
|
13
14
|
import pkgutil
|
|
14
15
|
import os
|
|
15
16
|
import os.path
|
|
16
17
|
import re
|
|
17
18
|
import textwrap
|
|
18
|
-
import
|
|
19
|
+
import typing as t
|
|
20
|
+
|
|
21
|
+
import yaml
|
|
19
22
|
|
|
20
23
|
import ansible.plugins.loader as plugin_loader
|
|
21
24
|
|
|
@@ -28,19 +31,22 @@ from ansible.collections.list import list_collection_dirs
|
|
|
28
31
|
from ansible.errors import AnsibleError, AnsibleOptionsError, AnsibleParserError, AnsiblePluginNotFound
|
|
29
32
|
from ansible.module_utils.common.text.converters import to_native, to_text
|
|
30
33
|
from ansible.module_utils.common.collections import is_sequence
|
|
31
|
-
from ansible.module_utils.common.json import json_dump
|
|
32
34
|
from ansible.module_utils.common.yaml import yaml_dump
|
|
33
35
|
from ansible.module_utils.six import string_types
|
|
34
36
|
from ansible.parsing.plugin_docs import read_docstub
|
|
35
|
-
from ansible.parsing.utils.yaml import from_yaml
|
|
36
37
|
from ansible.parsing.yaml.dumper import AnsibleDumper
|
|
37
|
-
from ansible.
|
|
38
|
+
from ansible.parsing.yaml.loader import AnsibleLoader
|
|
39
|
+
from ansible._internal._yaml._loader import AnsibleInstrumentedLoader
|
|
40
|
+
from ansible.plugins.list import _list_plugins_with_info, _PluginDocMetadata
|
|
38
41
|
from ansible.plugins.loader import action_loader, fragment_loader
|
|
39
42
|
from ansible.utils.collection_loader import AnsibleCollectionConfig, AnsibleCollectionRef
|
|
40
43
|
from ansible.utils.collection_loader._collection_finder import _get_collection_name_from_path
|
|
41
44
|
from ansible.utils.color import stringc
|
|
42
45
|
from ansible.utils.display import Display
|
|
43
46
|
from ansible.utils.plugin_docs import get_plugin_docs, get_docstring, get_versioned_doclink
|
|
47
|
+
from ansible.template import trust_as_template
|
|
48
|
+
from ansible._internal import _json
|
|
49
|
+
from ansible._internal._templating import _jinja_plugins
|
|
44
50
|
|
|
45
51
|
display = Display()
|
|
46
52
|
|
|
@@ -83,10 +89,9 @@ ref_style = {
|
|
|
83
89
|
|
|
84
90
|
def jdump(text):
|
|
85
91
|
try:
|
|
86
|
-
display.display(
|
|
87
|
-
except TypeError as
|
|
88
|
-
|
|
89
|
-
raise AnsibleError('We could not convert all the documentation into JSON as there was a conversion issue: %s' % to_native(e))
|
|
92
|
+
display.display(_json.json_dumps_formatted(text))
|
|
93
|
+
except TypeError as ex:
|
|
94
|
+
raise AnsibleError('We could not convert all the documentation into JSON as there was a conversion issue.') from ex
|
|
90
95
|
|
|
91
96
|
|
|
92
97
|
class RoleMixin(object):
|
|
@@ -104,7 +109,7 @@ class RoleMixin(object):
|
|
|
104
109
|
""" Load and process the YAML for the first found of a set of role files
|
|
105
110
|
|
|
106
111
|
:param str root: The root path to get the files from
|
|
107
|
-
:param
|
|
112
|
+
:param list files: List of candidate file names in order of precedence
|
|
108
113
|
:param str role_name: The name of the role for which we want the argspec data.
|
|
109
114
|
:param str collection: collection name or None in case of stand alone roles
|
|
110
115
|
|
|
@@ -117,6 +122,7 @@ class RoleMixin(object):
|
|
|
117
122
|
meta_path = os.path.join(root, 'meta')
|
|
118
123
|
|
|
119
124
|
# Check all potential spec files
|
|
125
|
+
path = None
|
|
120
126
|
for specfile in files:
|
|
121
127
|
full_path = os.path.join(meta_path, specfile)
|
|
122
128
|
if os.path.exists(full_path):
|
|
@@ -128,11 +134,11 @@ class RoleMixin(object):
|
|
|
128
134
|
|
|
129
135
|
try:
|
|
130
136
|
with open(path, 'r') as f:
|
|
131
|
-
data =
|
|
137
|
+
data = yaml.load(trust_as_template(f), Loader=AnsibleLoader)
|
|
132
138
|
if data is None:
|
|
133
139
|
data = {}
|
|
134
|
-
except
|
|
135
|
-
raise AnsibleParserError("Could not read the role
|
|
140
|
+
except OSError as ex:
|
|
141
|
+
raise AnsibleParserError(f"Could not read the role {role_name!r} at {path!r}.") from ex
|
|
136
142
|
|
|
137
143
|
return data
|
|
138
144
|
|
|
@@ -409,7 +415,7 @@ def _doclink(url):
|
|
|
409
415
|
|
|
410
416
|
def _format(string, *args):
|
|
411
417
|
|
|
412
|
-
|
|
418
|
+
""" add ascii formatting or delimiters """
|
|
413
419
|
|
|
414
420
|
for style in args:
|
|
415
421
|
|
|
@@ -433,10 +439,10 @@ def _format(string, *args):
|
|
|
433
439
|
|
|
434
440
|
|
|
435
441
|
class DocCLI(CLI, RoleMixin):
|
|
436
|
-
|
|
442
|
+
""" displays information on modules installed in Ansible libraries.
|
|
437
443
|
It displays a terse listing of plugins and their short descriptions,
|
|
438
444
|
provides a printout of their DOCUMENTATION strings,
|
|
439
|
-
and it can create a short "snippet" which can be pasted into a playbook.
|
|
445
|
+
and it can create a short "snippet" which can be pasted into a playbook. """
|
|
440
446
|
|
|
441
447
|
name = 'ansible-doc'
|
|
442
448
|
|
|
@@ -696,16 +702,16 @@ class DocCLI(CLI, RoleMixin):
|
|
|
696
702
|
display.warning("Skipping role '%s' due to: %s" % (role, role_json[role]['error']), True)
|
|
697
703
|
continue
|
|
698
704
|
text += self.get_role_man_text(role, role_json[role])
|
|
699
|
-
except
|
|
705
|
+
except AnsibleError as ex:
|
|
700
706
|
# TODO: warn and skip role?
|
|
701
|
-
raise AnsibleParserError("
|
|
707
|
+
raise AnsibleParserError(f"Error extracting role docs from {role!r}.") from ex
|
|
702
708
|
|
|
703
709
|
# display results
|
|
704
710
|
DocCLI.pager("\n".join(text))
|
|
705
711
|
|
|
706
712
|
@staticmethod
|
|
707
713
|
def _list_keywords():
|
|
708
|
-
return
|
|
714
|
+
return yaml.load(pkgutil.get_data('ansible', 'keyword_desc.yml'), Loader=AnsibleInstrumentedLoader)
|
|
709
715
|
|
|
710
716
|
@staticmethod
|
|
711
717
|
def _get_keywords_docs(keys):
|
|
@@ -768,10 +774,8 @@ class DocCLI(CLI, RoleMixin):
|
|
|
768
774
|
|
|
769
775
|
data[key] = kdata
|
|
770
776
|
|
|
771
|
-
except (AttributeError, KeyError) as
|
|
772
|
-
display.
|
|
773
|
-
if display.verbosity >= 3:
|
|
774
|
-
display.verbose(traceback.format_exc())
|
|
777
|
+
except (AttributeError, KeyError) as ex:
|
|
778
|
+
display.error_as_warning(f'Skipping invalid keyword {key!r}.', ex)
|
|
775
779
|
|
|
776
780
|
return data
|
|
777
781
|
|
|
@@ -787,48 +791,63 @@ class DocCLI(CLI, RoleMixin):
|
|
|
787
791
|
return coll_filter
|
|
788
792
|
|
|
789
793
|
def _list_plugins(self, plugin_type, content):
|
|
790
|
-
|
|
791
|
-
results = {}
|
|
792
|
-
self.plugins = {}
|
|
793
|
-
loader = DocCLI._prep_loader(plugin_type)
|
|
794
|
+
DocCLI._prep_loader(plugin_type)
|
|
794
795
|
|
|
795
796
|
coll_filter = self._get_collection_filter()
|
|
796
|
-
|
|
797
|
+
plugins = _list_plugins_with_info(plugin_type, coll_filter)
|
|
798
|
+
|
|
799
|
+
# Remove the internal ansible._protomatter plugins if getting all plugins
|
|
800
|
+
if not coll_filter:
|
|
801
|
+
plugins = {k: v for k, v in plugins.items() if not k.startswith('ansible._protomatter.')}
|
|
797
802
|
|
|
798
803
|
# get appropriate content depending on option
|
|
799
804
|
if content == 'dir':
|
|
800
|
-
results = self._get_plugin_list_descriptions(
|
|
805
|
+
results = self._get_plugin_list_descriptions(plugins)
|
|
801
806
|
elif content == 'files':
|
|
802
|
-
results = {k:
|
|
807
|
+
results = {k: v.path for k, v in plugins.items()}
|
|
803
808
|
else:
|
|
804
|
-
results = {k: {} for k in
|
|
809
|
+
results = {k: {} for k in plugins.keys()}
|
|
805
810
|
self.plugin_list = set() # reset for next iteration
|
|
806
811
|
|
|
807
812
|
return results
|
|
808
813
|
|
|
809
|
-
def _get_plugins_docs(self, plugin_type, names, fail_ok=False, fail_on_errors=True):
|
|
810
|
-
|
|
814
|
+
def _get_plugins_docs(self, plugin_type: str, names: collections.abc.Iterable[str], fail_ok: bool = False, fail_on_errors: bool = True) -> dict[str, dict]:
|
|
811
815
|
loader = DocCLI._prep_loader(plugin_type)
|
|
812
816
|
|
|
817
|
+
if plugin_type in ('filter', 'test'):
|
|
818
|
+
jinja2_builtins = _jinja_plugins.get_jinja_builtin_plugin_descriptions(plugin_type)
|
|
819
|
+
jinja2_builtins.update({name.split('.')[-1]: value for name, value in jinja2_builtins.items()}) # add short-named versions for lookup
|
|
820
|
+
else:
|
|
821
|
+
jinja2_builtins = {}
|
|
822
|
+
|
|
813
823
|
# get the docs for plugins in the command line list
|
|
814
824
|
plugin_docs = {}
|
|
815
825
|
for plugin in names:
|
|
816
|
-
doc = {}
|
|
826
|
+
doc: dict[str, t.Any] = {}
|
|
817
827
|
try:
|
|
818
|
-
doc, plainexamples, returndocs, metadata =
|
|
828
|
+
doc, plainexamples, returndocs, metadata = self._get_plugin_docs_with_jinja2_builtins(
|
|
829
|
+
plugin,
|
|
830
|
+
plugin_type,
|
|
831
|
+
loader,
|
|
832
|
+
fragment_loader,
|
|
833
|
+
jinja2_builtins,
|
|
834
|
+
)
|
|
819
835
|
except AnsiblePluginNotFound as e:
|
|
820
836
|
display.warning(to_native(e))
|
|
821
837
|
continue
|
|
822
|
-
except Exception as
|
|
838
|
+
except Exception as ex:
|
|
839
|
+
msg = "Missing documentation (or could not parse documentation)"
|
|
840
|
+
|
|
823
841
|
if not fail_on_errors:
|
|
824
|
-
plugin_docs[plugin] = {'error': '
|
|
842
|
+
plugin_docs[plugin] = {'error': f'{msg}: {ex}.'}
|
|
825
843
|
continue
|
|
826
|
-
|
|
827
|
-
msg = "
|
|
844
|
+
|
|
845
|
+
msg = f"{plugin_type} {plugin} {msg}"
|
|
846
|
+
|
|
828
847
|
if fail_ok:
|
|
829
|
-
display.warning(msg)
|
|
848
|
+
display.warning(f'{msg}: {ex}')
|
|
830
849
|
else:
|
|
831
|
-
raise AnsibleError(msg)
|
|
850
|
+
raise AnsibleError(f'{msg}.') from ex
|
|
832
851
|
|
|
833
852
|
if not doc:
|
|
834
853
|
# The doc section existed but was empty
|
|
@@ -840,24 +859,57 @@ class DocCLI(CLI, RoleMixin):
|
|
|
840
859
|
if not fail_on_errors:
|
|
841
860
|
# Check whether JSON serialization would break
|
|
842
861
|
try:
|
|
843
|
-
|
|
844
|
-
except Exception as
|
|
845
|
-
plugin_docs[plugin] = {'error': 'Cannot serialize documentation as JSON:
|
|
862
|
+
_json.json_dumps_formatted(docs)
|
|
863
|
+
except Exception as ex: # pylint:disable=broad-except
|
|
864
|
+
plugin_docs[plugin] = {'error': f'Cannot serialize documentation as JSON: {ex}'}
|
|
846
865
|
continue
|
|
847
866
|
|
|
848
867
|
plugin_docs[plugin] = docs
|
|
849
868
|
|
|
850
869
|
return plugin_docs
|
|
851
870
|
|
|
871
|
+
def _get_plugin_docs_with_jinja2_builtins(
|
|
872
|
+
self,
|
|
873
|
+
plugin_name: str,
|
|
874
|
+
plugin_type: str,
|
|
875
|
+
loader: t.Any,
|
|
876
|
+
fragment_loader: t.Any,
|
|
877
|
+
jinja_builtins: dict[str, str],
|
|
878
|
+
) -> tuple[dict, str | None, dict | None, dict | None]:
|
|
879
|
+
try:
|
|
880
|
+
return get_plugin_docs(plugin_name, plugin_type, loader, fragment_loader, (context.CLIARGS['verbosity'] > 0))
|
|
881
|
+
except Exception:
|
|
882
|
+
if (desc := jinja_builtins.get(plugin_name, ...)) is not ...:
|
|
883
|
+
short_name = plugin_name.split('.')[-1]
|
|
884
|
+
long_name = f'ansible.builtin.{short_name}'
|
|
885
|
+
# Dynamically build a doc stub for any Jinja2 builtin plugin we haven't
|
|
886
|
+
# explicitly documented.
|
|
887
|
+
doc = dict(
|
|
888
|
+
collection='ansible.builtin',
|
|
889
|
+
plugin_name=long_name,
|
|
890
|
+
filename='',
|
|
891
|
+
short_description=desc,
|
|
892
|
+
description=[
|
|
893
|
+
desc,
|
|
894
|
+
'',
|
|
895
|
+
f"This is the Jinja builtin {plugin_type} plugin {short_name!r}.",
|
|
896
|
+
f"See: U(https://jinja.palletsprojects.com/en/stable/templates/#jinja-{plugin_type}s.{short_name})",
|
|
897
|
+
],
|
|
898
|
+
)
|
|
899
|
+
|
|
900
|
+
return doc, None, None, None
|
|
901
|
+
|
|
902
|
+
raise
|
|
903
|
+
|
|
852
904
|
def _get_roles_path(self):
|
|
853
|
-
|
|
905
|
+
"""
|
|
854
906
|
Add any 'roles' subdir in playbook dir to the roles search path.
|
|
855
907
|
And as a last resort, add the playbook dir itself. Order being:
|
|
856
908
|
- 'roles' subdir of playbook dir
|
|
857
909
|
- DEFAULT_ROLES_PATH (default in cliargs)
|
|
858
910
|
- playbook dir (basedir)
|
|
859
911
|
NOTE: This matches logic in RoleDefinition._load_role_path() method.
|
|
860
|
-
|
|
912
|
+
"""
|
|
861
913
|
roles_path = context.CLIARGS['roles_path']
|
|
862
914
|
if context.CLIARGS['basedir'] is not None:
|
|
863
915
|
subdir = os.path.join(context.CLIARGS['basedir'], "roles")
|
|
@@ -868,7 +920,7 @@ class DocCLI(CLI, RoleMixin):
|
|
|
868
920
|
|
|
869
921
|
@staticmethod
|
|
870
922
|
def _prep_loader(plugin_type):
|
|
871
|
-
|
|
923
|
+
""" return a plugint type specific loader """
|
|
872
924
|
loader = getattr(plugin_loader, '%s_loader' % plugin_type)
|
|
873
925
|
|
|
874
926
|
# add to plugin paths from command line
|
|
@@ -997,10 +1049,10 @@ class DocCLI(CLI, RoleMixin):
|
|
|
997
1049
|
def get_all_plugins_of_type(plugin_type):
|
|
998
1050
|
loader = getattr(plugin_loader, '%s_loader' % plugin_type)
|
|
999
1051
|
paths = loader._get_paths_with_context()
|
|
1000
|
-
plugins =
|
|
1052
|
+
plugins = []
|
|
1001
1053
|
for path_context in paths:
|
|
1002
|
-
plugins
|
|
1003
|
-
return sorted(plugins
|
|
1054
|
+
plugins += _list_plugins_with_info(plugin_type).keys()
|
|
1055
|
+
return sorted(plugins)
|
|
1004
1056
|
|
|
1005
1057
|
@staticmethod
|
|
1006
1058
|
def get_plugin_metadata(plugin_type, plugin_name):
|
|
@@ -1015,9 +1067,8 @@ class DocCLI(CLI, RoleMixin):
|
|
|
1015
1067
|
try:
|
|
1016
1068
|
doc, __, __, __ = get_docstring(filename, fragment_loader, verbose=(context.CLIARGS['verbosity'] > 0),
|
|
1017
1069
|
collection_name=collection_name, plugin_type=plugin_type)
|
|
1018
|
-
except Exception:
|
|
1019
|
-
|
|
1020
|
-
raise AnsibleError("%s %s at %s has a documentation formatting error or is missing documentation." % (plugin_type, plugin_name, filename))
|
|
1070
|
+
except Exception as ex:
|
|
1071
|
+
raise AnsibleError(f"{plugin_type} {plugin_name} at {filename!r} has a documentation formatting error or is missing documentation.") from ex
|
|
1021
1072
|
|
|
1022
1073
|
if doc is None:
|
|
1023
1074
|
# Removed plugins don't have any documentation
|
|
@@ -1058,7 +1109,7 @@ class DocCLI(CLI, RoleMixin):
|
|
|
1058
1109
|
|
|
1059
1110
|
@staticmethod
|
|
1060
1111
|
def format_snippet(plugin, plugin_type, doc):
|
|
1061
|
-
|
|
1112
|
+
""" return heavily commented plugin use to insert into play """
|
|
1062
1113
|
if plugin_type == 'inventory' and doc.get('options', {}).get('plugin'):
|
|
1063
1114
|
# these do not take a yaml config that we can write a snippet for
|
|
1064
1115
|
raise ValueError('The {0} inventory plugin does not take YAML type config source'
|
|
@@ -1093,24 +1144,25 @@ class DocCLI(CLI, RoleMixin):
|
|
|
1093
1144
|
|
|
1094
1145
|
try:
|
|
1095
1146
|
text = DocCLI.get_man_text(doc, collection_name, plugin_type)
|
|
1096
|
-
except Exception as
|
|
1097
|
-
|
|
1098
|
-
raise AnsibleError("Unable to retrieve documentation from '%s'" % (plugin), orig_exc=e)
|
|
1147
|
+
except Exception as ex:
|
|
1148
|
+
raise AnsibleError(f"Unable to retrieve documentation from {plugin!r}.") from ex
|
|
1099
1149
|
|
|
1100
1150
|
return text
|
|
1101
1151
|
|
|
1102
|
-
def _get_plugin_list_descriptions(self,
|
|
1152
|
+
def _get_plugin_list_descriptions(self, plugins: dict[str, _PluginDocMetadata]) -> dict[str, str]:
|
|
1103
1153
|
|
|
1104
1154
|
descs = {}
|
|
1105
|
-
for plugin in
|
|
1155
|
+
for plugin, plugin_info in plugins.items():
|
|
1106
1156
|
# TODO: move to plugin itself i.e: plugin.get_desc()
|
|
1107
1157
|
doc = None
|
|
1108
|
-
|
|
1158
|
+
|
|
1109
1159
|
docerror = None
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1160
|
+
if plugin_info.path:
|
|
1161
|
+
filename = Path(to_native(plugin_info.path))
|
|
1162
|
+
try:
|
|
1163
|
+
doc = read_docstub(filename)
|
|
1164
|
+
except Exception as e:
|
|
1165
|
+
docerror = e
|
|
1114
1166
|
|
|
1115
1167
|
# plugin file was empty or had error, lets try other options
|
|
1116
1168
|
if doc is None:
|
|
@@ -1125,9 +1177,15 @@ class DocCLI(CLI, RoleMixin):
|
|
|
1125
1177
|
except Exception as e:
|
|
1126
1178
|
docerror = e
|
|
1127
1179
|
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1180
|
+
# Do a final fallback to see if the plugin is a shadowed Jinja2 plugin
|
|
1181
|
+
# without any explicit documentation.
|
|
1182
|
+
if doc is None and plugin_info.jinja_builtin_short_description:
|
|
1183
|
+
descs[plugin] = plugin_info.jinja_builtin_short_description
|
|
1184
|
+
continue
|
|
1185
|
+
|
|
1186
|
+
if docerror:
|
|
1187
|
+
display.error_as_warning(f"{plugin} has a documentation formatting error.", exception=docerror)
|
|
1188
|
+
continue
|
|
1131
1189
|
|
|
1132
1190
|
if not doc or not isinstance(doc, dict):
|
|
1133
1191
|
desc = 'UNDOCUMENTED'
|
|
@@ -1140,7 +1198,7 @@ class DocCLI(CLI, RoleMixin):
|
|
|
1140
1198
|
|
|
1141
1199
|
@staticmethod
|
|
1142
1200
|
def print_paths(finder):
|
|
1143
|
-
|
|
1201
|
+
""" Returns a string suitable for printing of the search path """
|
|
1144
1202
|
|
|
1145
1203
|
# Uses a list to get the order right
|
|
1146
1204
|
ret = []
|
|
@@ -1251,7 +1309,7 @@ class DocCLI(CLI, RoleMixin):
|
|
|
1251
1309
|
if ignore in item:
|
|
1252
1310
|
del item[ignore]
|
|
1253
1311
|
|
|
1254
|
-
# reformat cli
|
|
1312
|
+
# reformat cli options
|
|
1255
1313
|
if 'cli' in opt and opt['cli']:
|
|
1256
1314
|
conf['cli'] = []
|
|
1257
1315
|
for cli in opt['cli']:
|
|
@@ -1287,7 +1345,7 @@ class DocCLI(CLI, RoleMixin):
|
|
|
1287
1345
|
DocCLI.add_fields(text, subdata, limit, opt_indent + ' ', return_values, opt_indent)
|
|
1288
1346
|
|
|
1289
1347
|
def get_role_man_text(self, role, role_json):
|
|
1290
|
-
|
|
1348
|
+
"""Generate text for the supplied role suitable for display.
|
|
1291
1349
|
|
|
1292
1350
|
This is similar to get_man_text(), but roles are different enough that we have
|
|
1293
1351
|
a separate method for formatting their display.
|
|
@@ -1296,7 +1354,7 @@ class DocCLI(CLI, RoleMixin):
|
|
|
1296
1354
|
:param role_json: The JSON for the given role as returned from _create_role_doc().
|
|
1297
1355
|
|
|
1298
1356
|
:returns: A array of text suitable for displaying to screen.
|
|
1299
|
-
|
|
1357
|
+
"""
|
|
1300
1358
|
text = []
|
|
1301
1359
|
opt_indent = " "
|
|
1302
1360
|
pad = display.columns * 0.20
|
|
@@ -1333,7 +1391,6 @@ class DocCLI(CLI, RoleMixin):
|
|
|
1333
1391
|
'This was unintentionally allowed when plugin attributes were added, '
|
|
1334
1392
|
'but the feature does not map well to role argument specs.',
|
|
1335
1393
|
version='2.20',
|
|
1336
|
-
collection_name='ansible.builtin',
|
|
1337
1394
|
)
|
|
1338
1395
|
text.append("")
|
|
1339
1396
|
text.append(_format("ATTRIBUTES:", 'bold'))
|
|
@@ -1367,7 +1424,7 @@ class DocCLI(CLI, RoleMixin):
|
|
|
1367
1424
|
try:
|
|
1368
1425
|
text.append(yaml_dump(doc.pop('examples'), indent=2, default_flow_style=False))
|
|
1369
1426
|
except Exception as e:
|
|
1370
|
-
raise AnsibleParserError("Unable to parse examples section"
|
|
1427
|
+
raise AnsibleParserError("Unable to parse examples section.") from e
|
|
1371
1428
|
|
|
1372
1429
|
return text
|
|
1373
1430
|
|
|
@@ -1383,7 +1440,7 @@ class DocCLI(CLI, RoleMixin):
|
|
|
1383
1440
|
pad = display.columns * 0.20
|
|
1384
1441
|
limit = max(display.columns - int(pad), 70)
|
|
1385
1442
|
|
|
1386
|
-
text.append("> %s %s (%s)" % (plugin_type.upper(), _format(doc.pop('plugin_name'), 'bold'), doc.pop('filename')))
|
|
1443
|
+
text.append("> %s %s (%s)" % (plugin_type.upper(), _format(doc.pop('plugin_name'), 'bold'), doc.pop('filename') or 'Jinja2'))
|
|
1387
1444
|
|
|
1388
1445
|
if isinstance(doc['description'], list):
|
|
1389
1446
|
descs = doc.pop('description')
|
|
@@ -1403,9 +1460,9 @@ class DocCLI(CLI, RoleMixin):
|
|
|
1403
1460
|
if 'removed_at_date' not in doc['deprecated'] and 'version' in doc['deprecated'] and 'removed_in' not in doc['deprecated']:
|
|
1404
1461
|
doc['deprecated']['removed_in'] = doc['deprecated']['version']
|
|
1405
1462
|
try:
|
|
1406
|
-
text.append('\t' + C.config.get_deprecated_msg_from_config(doc['deprecated'], True))
|
|
1463
|
+
text.append('\t' + C.config.get_deprecated_msg_from_config(doc['deprecated'], True, collection_name=collection_name))
|
|
1407
1464
|
except KeyError as e:
|
|
1408
|
-
raise AnsibleError("Invalid deprecation documentation structure"
|
|
1465
|
+
raise AnsibleError("Invalid deprecation documentation structure.") from e
|
|
1409
1466
|
else:
|
|
1410
1467
|
text.append("%s" % doc['deprecated'])
|
|
1411
1468
|
del doc['deprecated']
|
|
@@ -1514,8 +1571,8 @@ class DocCLI(CLI, RoleMixin):
|
|
|
1514
1571
|
else:
|
|
1515
1572
|
try:
|
|
1516
1573
|
text.append(yaml_dump(doc.pop('plainexamples'), indent=2, default_flow_style=False))
|
|
1517
|
-
except Exception as
|
|
1518
|
-
raise AnsibleParserError("Unable to parse examples section"
|
|
1574
|
+
except Exception as ex:
|
|
1575
|
+
raise AnsibleParserError("Unable to parse examples section.") from ex
|
|
1519
1576
|
|
|
1520
1577
|
if doc.get('returndocs', False):
|
|
1521
1578
|
text.append('')
|