pyinfra 3.5.1__tar.gz → 3.6.1__tar.gz
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.
- pyinfra-3.6.1/.claude/settings.local.json +16 -0
- pyinfra-3.6.1/.claude/skills/generatechangelog/SKILL.md +10 -0
- pyinfra-3.6.1/.github/workflows/test.yml +125 -0
- pyinfra-3.6.1/.issues/1019.md +199 -0
- pyinfra-3.6.1/.issues/1026.md +299 -0
- pyinfra-3.6.1/.issues/1061.md +275 -0
- pyinfra-3.6.1/.issues/1125.md +247 -0
- pyinfra-3.6.1/.issues/1154.md +336 -0
- pyinfra-3.6.1/.issues/1280.md +273 -0
- pyinfra-3.6.1/.issues/1292.md +261 -0
- pyinfra-3.6.1/.issues/1303.md +140 -0
- pyinfra-3.6.1/.issues/1339.md +235 -0
- pyinfra-3.6.1/.issues/1370.md +351 -0
- pyinfra-3.6.1/.issues/1389.md +281 -0
- pyinfra-3.6.1/.issues/1394.md +208 -0
- pyinfra-3.6.1/.issues/1400.md +277 -0
- pyinfra-3.6.1/.issues/1426.md +265 -0
- pyinfra-3.6.1/.issues/1440.md +297 -0
- pyinfra-3.6.1/.issues/1445.md +229 -0
- pyinfra-3.6.1/.issues/1496.md +222 -0
- pyinfra-3.6.1/.issues/533.md +344 -0
- pyinfra-3.6.1/.issues/546.md +242 -0
- pyinfra-3.6.1/.issues/615.md +233 -0
- pyinfra-3.6.1/.issues/736.md +275 -0
- pyinfra-3.6.1/.issues/791.md +279 -0
- pyinfra-3.6.1/.issues/807.md +343 -0
- pyinfra-3.6.1/.issues/936.md +287 -0
- pyinfra-3.6.1/.issues/940.md +274 -0
- pyinfra-3.6.1/.issues/945.md +263 -0
- pyinfra-3.6.1/.issues/979.md +168 -0
- pyinfra-3.6.1/.issues/994.md +230 -0
- pyinfra-3.6.1/AGENTS.md +6 -0
- pyinfra-3.6.1/CHANGELOG.md +406 -0
- pyinfra-3.6.1/CLAUDE.md +1 -0
- pyinfra-3.6.1/PKG-INFO +142 -0
- pyinfra-3.6.1/docs/api/connectors.md +262 -0
- pyinfra-3.6.1/docs/api/index.rst +66 -0
- pyinfra-3.6.1/docs/arguments.rst +11 -0
- pyinfra-3.6.1/docs/cli.md +180 -0
- pyinfra-3.6.1/docs/compatibility.md +103 -0
- pyinfra-3.6.1/docs/conf.py +113 -0
- pyinfra-3.6.1/docs/connectors.rst +56 -0
- pyinfra-3.6.1/docs/contributing.md +104 -0
- pyinfra-3.6.1/docs/examples/data_multiple_environments.md +38 -0
- pyinfra-3.6.1/docs/examples/dynamic_execution_deploy.md +41 -0
- pyinfra-3.6.1/docs/facts.rst +102 -0
- pyinfra-3.6.1/docs/faq.rst +84 -0
- pyinfra-3.6.1/docs/getting-started.rst +113 -0
- pyinfra-3.6.1/docs/inventory-data.rst +160 -0
- pyinfra-3.6.1/docs/operations.rst +73 -0
- pyinfra-3.6.1/docs/support.md +20 -0
- pyinfra-3.6.1/docs/using-operations.rst +376 -0
- pyinfra-3.6.1/docs/utils.py +13 -0
- pyinfra-3.6.1/pyinfra-metadata-schema-1.0.0.json +57 -0
- pyinfra-3.6.1/pyinfra-metadata.toml +550 -0
- pyinfra-3.6.1/pyproject.toml +141 -0
- pyinfra-3.6.1/scripts/build-public-docs.sh +61 -0
- pyinfra-3.6.1/scripts/dev-format.sh +6 -0
- pyinfra-3.6.1/scripts/dev-lint.sh +14 -0
- pyinfra-3.6.1/scripts/generate_arguments_doc.py +92 -0
- pyinfra-3.6.1/scripts/generate_facts_docs.py +146 -0
- pyinfra-3.6.1/scripts/generate_operations_docs.py +222 -0
- pyinfra-3.6.1/scripts/lint_arguments_sync.py +208 -0
- pyinfra-3.6.1/scripts/make_github_release.py +46 -0
- pyinfra-3.6.1/src/pyinfra/api/__init__.py +27 -0
- pyinfra-3.6.1/src/pyinfra/api/arguments.py +413 -0
- pyinfra-3.6.1/src/pyinfra/api/arguments_typed.py +74 -0
- pyinfra-3.6.1/src/pyinfra/api/command.py +280 -0
- pyinfra-3.6.1/src/pyinfra/api/deploy.py +97 -0
- pyinfra-3.6.1/src/pyinfra/api/exceptions.py +102 -0
- pyinfra-3.6.1/src/pyinfra/api/facts.py +326 -0
- pyinfra-3.6.1/src/pyinfra/api/host.py +463 -0
- pyinfra-3.6.1/src/pyinfra/api/inventory.py +252 -0
- pyinfra-3.6.1/src/pyinfra/api/metadata.py +69 -0
- pyinfra-3.6.1/src/pyinfra/api/operation.py +501 -0
- pyinfra-3.6.1/src/pyinfra/api/operations.py +399 -0
- pyinfra-3.6.1/src/pyinfra/api/util.py +470 -0
- pyinfra-3.6.1/src/pyinfra/connectors/docker.py +405 -0
- pyinfra-3.6.1/src/pyinfra/connectors/ssh.py +727 -0
- pyinfra-3.6.1/src/pyinfra/connectors/sshuserclient/client.py +328 -0
- pyinfra-3.6.1/src/pyinfra/connectors/util.py +417 -0
- pyinfra-3.6.1/src/pyinfra/facts/crontab.py +197 -0
- pyinfra-3.6.1/src/pyinfra/facts/files.py +686 -0
- pyinfra-3.6.1/src/pyinfra/facts/flatpak.py +77 -0
- pyinfra-3.6.1/src/pyinfra/facts/npm.py +38 -0
- pyinfra-3.6.1/src/pyinfra/facts/server.py +970 -0
- pyinfra-3.6.1/src/pyinfra/operations/apk.py +99 -0
- pyinfra-3.6.1/src/pyinfra/operations/apt.py +496 -0
- pyinfra-3.6.1/src/pyinfra/operations/brew.py +232 -0
- pyinfra-3.6.1/src/pyinfra/operations/crontab.py +194 -0
- pyinfra-3.6.1/src/pyinfra/operations/dnf.py +213 -0
- pyinfra-3.6.1/src/pyinfra/operations/docker.py +500 -0
- pyinfra-3.6.1/src/pyinfra/operations/files.py +2014 -0
- pyinfra-3.6.1/src/pyinfra/operations/flatpak.py +95 -0
- pyinfra-3.6.1/src/pyinfra/operations/gem.py +48 -0
- pyinfra-3.6.1/src/pyinfra/operations/git.py +420 -0
- pyinfra-3.6.1/src/pyinfra/operations/iptables.py +312 -0
- pyinfra-3.6.1/src/pyinfra/operations/lxd.py +69 -0
- pyinfra-3.6.1/src/pyinfra/operations/mysql.py +610 -0
- pyinfra-3.6.1/src/pyinfra/operations/opkg.py +89 -0
- pyinfra-3.6.1/src/pyinfra/operations/pacman.py +82 -0
- pyinfra-3.6.1/src/pyinfra/operations/pip.py +206 -0
- pyinfra-3.6.1/src/pyinfra/operations/pipx.py +103 -0
- pyinfra-3.6.1/src/pyinfra/operations/pkg.py +71 -0
- pyinfra-3.6.1/src/pyinfra/operations/pkgin.py +92 -0
- pyinfra-3.6.1/src/pyinfra/operations/postgres.py +442 -0
- pyinfra-3.6.1/src/pyinfra/operations/puppet.py +41 -0
- pyinfra-3.6.1/src/pyinfra/operations/python.py +73 -0
- pyinfra-3.6.1/src/pyinfra/operations/selinux.py +190 -0
- pyinfra-3.6.1/src/pyinfra/operations/server.py +1100 -0
- pyinfra-3.6.1/src/pyinfra/operations/snap.py +118 -0
- pyinfra-3.6.1/src/pyinfra/operations/ssh.py +217 -0
- pyinfra-3.6.1/src/pyinfra/operations/systemd.py +150 -0
- pyinfra-3.6.1/src/pyinfra/operations/sysvinit.py +142 -0
- pyinfra-3.6.1/src/pyinfra/operations/util/docker.py +415 -0
- pyinfra-3.6.1/src/pyinfra/operations/util/packaging.py +338 -0
- pyinfra-3.6.1/src/pyinfra/operations/xbps.py +78 -0
- pyinfra-3.6.1/src/pyinfra/operations/yum.py +213 -0
- pyinfra-3.6.1/src/pyinfra/operations/zfs.py +176 -0
- pyinfra-3.6.1/src/pyinfra/operations/zypper.py +193 -0
- pyinfra-3.6.1/src/pyinfra_cli/cli.py +796 -0
- pyinfra-3.6.1/src/pyinfra_cli/inventory.py +368 -0
- pyinfra-3.6.1/src/pyinfra_cli/util.py +239 -0
- pyinfra-3.6.1/tests/facts/files.FileContents/empty_file.json +6 -0
- pyinfra-3.6.1/tests/facts/files.FileContents/file.json +6 -0
- pyinfra-3.6.1/tests/facts/files.FileContents/no_file.json +6 -0
- pyinfra-3.6.1/tests/facts/files.FindFiles/files_with_args.json +14 -0
- pyinfra-3.6.1/tests/facts/flatpak.FlatpakPackages/packages_no_header.json +16 -0
- pyinfra-3.6.1/tests/facts/npm.NpmPackages/local_packages.json +13 -0
- pyinfra-3.6.1/tests/facts/server.TmpDir/default_fallback.json +5 -0
- pyinfra-3.6.1/tests/facts/server.TmpDir/temp_set.json +5 -0
- pyinfra-3.6.1/tests/facts/server.TmpDir/tmp_set.json +5 -0
- pyinfra-3.6.1/tests/facts/server.TmpDir/tmpdir_set.json +5 -0
- pyinfra-3.6.1/tests/operations/apt.packages/update_cached_tz.json +17 -0
- pyinfra-3.6.1/tests/operations/docker.container/add_container_with_labels.json +19 -0
- pyinfra-3.6.1/tests/operations/docker.image/force_pull_image.json +27 -0
- pyinfra-3.6.1/tests/operations/docker.image/image_from_github_registry_exists.json +26 -0
- pyinfra-3.6.1/tests/operations/docker.image/image_with_digest_exists.json +24 -0
- pyinfra-3.6.1/tests/operations/docker.image/image_with_digest_not_exists.json +15 -0
- pyinfra-3.6.1/tests/operations/docker.image/image_with_latest_tag_always_pull.json +27 -0
- pyinfra-3.6.1/tests/operations/docker.image/image_with_specific_tag_exists.json +26 -0
- pyinfra-3.6.1/tests/operations/docker.image/image_with_specific_tag_not_exists.json +15 -0
- pyinfra-3.6.1/tests/operations/docker.image/image_with_tag_and_digest.json +16 -0
- pyinfra-3.6.1/tests/operations/docker.image/image_with_tag_and_digest_different_digest.json +15 -0
- pyinfra-3.6.1/tests/operations/docker.image/image_with_tag_and_digest_different_tag.json +26 -0
- pyinfra-3.6.1/tests/operations/docker.image/image_without_tag_always_pull.json +27 -0
- pyinfra-3.6.1/tests/operations/docker.image/pull_image_from_private_registry.json +15 -0
- pyinfra-3.6.1/tests/operations/docker.image/remove_existing_image.json +26 -0
- pyinfra-3.6.1/tests/operations/docker.image/remove_nonexistent_image.json +13 -0
- pyinfra-3.6.1/tests/operations/files.block/add_existing_block_different_content.json +24 -0
- pyinfra-3.6.1/tests/operations/files.block/add_existing_block_different_content_and_backup.json +25 -0
- pyinfra-3.6.1/tests/operations/files.block/add_existing_block_different_content_multiple_lines.json +28 -0
- pyinfra-3.6.1/tests/operations/files.block/add_no_existing_block_and_no_line.json +22 -0
- pyinfra-3.6.1/tests/operations/files.block/add_no_existing_block_line_provided.json +22 -0
- pyinfra-3.6.1/tests/operations/files.block/add_no_existing_block_line_provided_escape_regex.json +23 -0
- pyinfra-3.6.1/tests/operations/files.block/add_no_existing_file.json +22 -0
- pyinfra-3.6.1/tests/operations/files.block/remove_but_content_not_none.json +23 -0
- pyinfra-3.6.1/tests/operations/files.block/remove_existing_block.json +22 -0
- pyinfra-3.6.1/tests/operations/files.copy/copies_directory.json +22 -0
- pyinfra-3.6.1/tests/operations/files.copy/copies_directory_overwriting.json +21 -0
- pyinfra-3.6.1/tests/operations/files.copy/copies_file.json +19 -0
- pyinfra-3.6.1/tests/operations/files.copy/copies_file_overwriting.json +19 -0
- pyinfra-3.6.1/tests/operations/files.copy/invalid_dest.json +21 -0
- pyinfra-3.6.1/tests/operations/files.copy/invalid_overwrite.json +26 -0
- pyinfra-3.6.1/tests/operations/files.copy/invalid_src.json +21 -0
- pyinfra-3.6.1/tests/operations/files.copy/noop_dest_file_exists.json +24 -0
- pyinfra-3.6.1/tests/operations/files.link/edit_trailing_slash.json +19 -0
- pyinfra-3.6.1/tests/test_api/test_api_operations.py +1124 -0
- pyinfra-3.6.1/tests/test_cli/test_cli.py +196 -0
- pyinfra-3.6.1/tests/test_connectors/test_docker.py +284 -0
- pyinfra-3.6.1/tests/test_connectors/test_ssh.py +1335 -0
- pyinfra-3.6.1/tests/test_connectors/test_sshuserclient.py +310 -0
- pyinfra-3.6.1/tests/test_facts.py +130 -0
- pyinfra-3.6.1/tests/test_operations_utils.py +297 -0
- pyinfra-3.6.1/tests/util.py +482 -0
- pyinfra-3.6.1/uv.lock +1931 -0
- pyinfra-3.5.1/.github/workflows/test.yml +0 -117
- pyinfra-3.5.1/CHANGELOG.md +0 -314
- pyinfra-3.5.1/PKG-INFO +0 -141
- pyinfra-3.5.1/docs/api/connectors.md +0 -206
- pyinfra-3.5.1/docs/api/index.rst +0 -66
- pyinfra-3.5.1/docs/arguments.rst +0 -9
- pyinfra-3.5.1/docs/cli.md +0 -180
- pyinfra-3.5.1/docs/compatibility.md +0 -104
- pyinfra-3.5.1/docs/conf.py +0 -79
- pyinfra-3.5.1/docs/connectors.rst +0 -48
- pyinfra-3.5.1/docs/contributing.md +0 -100
- pyinfra-3.5.1/docs/examples/data_multiple_environments.md +0 -38
- pyinfra-3.5.1/docs/examples/dynamic_execution_deploy.md +0 -41
- pyinfra-3.5.1/docs/facts.rst +0 -60
- pyinfra-3.5.1/docs/faq.rst +0 -80
- pyinfra-3.5.1/docs/getting-started.rst +0 -99
- pyinfra-3.5.1/docs/inventory-data.rst +0 -160
- pyinfra-3.5.1/docs/operations.rst +0 -56
- pyinfra-3.5.1/docs/support.md +0 -20
- pyinfra-3.5.1/docs/using-operations.rst +0 -345
- pyinfra-3.5.1/docs/utils.py +0 -13
- pyinfra-3.5.1/pyproject.toml +0 -140
- pyinfra-3.5.1/scripts/build-public-docs.sh +0 -37
- pyinfra-3.5.1/scripts/dev-lint.sh +0 -14
- pyinfra-3.5.1/scripts/generate_arguments_doc.py +0 -91
- pyinfra-3.5.1/scripts/generate_facts_docs.py +0 -146
- pyinfra-3.5.1/scripts/generate_operations_docs.py +0 -222
- pyinfra-3.5.1/scripts/make_github_release.py +0 -46
- pyinfra-3.5.1/src/pyinfra/api/__init__.py +0 -26
- pyinfra-3.5.1/src/pyinfra/api/arguments.py +0 -406
- pyinfra-3.5.1/src/pyinfra/api/arguments_typed.py +0 -79
- pyinfra-3.5.1/src/pyinfra/api/command.py +0 -274
- pyinfra-3.5.1/src/pyinfra/api/deploy.py +0 -97
- pyinfra-3.5.1/src/pyinfra/api/exceptions.py +0 -90
- pyinfra-3.5.1/src/pyinfra/api/facts.py +0 -310
- pyinfra-3.5.1/src/pyinfra/api/host.py +0 -460
- pyinfra-3.5.1/src/pyinfra/api/inventory.py +0 -252
- pyinfra-3.5.1/src/pyinfra/api/operation.py +0 -496
- pyinfra-3.5.1/src/pyinfra/api/operations.py +0 -397
- pyinfra-3.5.1/src/pyinfra/api/util.py +0 -453
- pyinfra-3.5.1/src/pyinfra/connectors/docker.py +0 -381
- pyinfra-3.5.1/src/pyinfra/connectors/ssh.py +0 -670
- pyinfra-3.5.1/src/pyinfra/connectors/sshuserclient/client.py +0 -309
- pyinfra-3.5.1/src/pyinfra/connectors/util.py +0 -410
- pyinfra-3.5.1/src/pyinfra/facts/crontab.py +0 -195
- pyinfra-3.5.1/src/pyinfra/facts/files.py +0 -677
- pyinfra-3.5.1/src/pyinfra/facts/flatpak.py +0 -77
- pyinfra-3.5.1/src/pyinfra/facts/npm.py +0 -38
- pyinfra-3.5.1/src/pyinfra/facts/server.py +0 -954
- pyinfra-3.5.1/src/pyinfra/operations/apk.py +0 -98
- pyinfra-3.5.1/src/pyinfra/operations/apt.py +0 -488
- pyinfra-3.5.1/src/pyinfra/operations/brew.py +0 -231
- pyinfra-3.5.1/src/pyinfra/operations/crontab.py +0 -191
- pyinfra-3.5.1/src/pyinfra/operations/dnf.py +0 -210
- pyinfra-3.5.1/src/pyinfra/operations/docker.py +0 -446
- pyinfra-3.5.1/src/pyinfra/operations/files.py +0 -1939
- pyinfra-3.5.1/src/pyinfra/operations/flatpak.py +0 -94
- pyinfra-3.5.1/src/pyinfra/operations/gem.py +0 -47
- pyinfra-3.5.1/src/pyinfra/operations/git.py +0 -419
- pyinfra-3.5.1/src/pyinfra/operations/iptables.py +0 -311
- pyinfra-3.5.1/src/pyinfra/operations/lxd.py +0 -68
- pyinfra-3.5.1/src/pyinfra/operations/mysql.py +0 -609
- pyinfra-3.5.1/src/pyinfra/operations/opkg.py +0 -88
- pyinfra-3.5.1/src/pyinfra/operations/pacman.py +0 -81
- pyinfra-3.5.1/src/pyinfra/operations/pip.py +0 -205
- pyinfra-3.5.1/src/pyinfra/operations/pipx.py +0 -102
- pyinfra-3.5.1/src/pyinfra/operations/pkg.py +0 -70
- pyinfra-3.5.1/src/pyinfra/operations/pkgin.py +0 -91
- pyinfra-3.5.1/src/pyinfra/operations/postgres.py +0 -436
- pyinfra-3.5.1/src/pyinfra/operations/puppet.py +0 -40
- pyinfra-3.5.1/src/pyinfra/operations/python.py +0 -72
- pyinfra-3.5.1/src/pyinfra/operations/selinux.py +0 -189
- pyinfra-3.5.1/src/pyinfra/operations/server.py +0 -1099
- pyinfra-3.5.1/src/pyinfra/operations/snap.py +0 -117
- pyinfra-3.5.1/src/pyinfra/operations/ssh.py +0 -216
- pyinfra-3.5.1/src/pyinfra/operations/systemd.py +0 -149
- pyinfra-3.5.1/src/pyinfra/operations/sysvinit.py +0 -141
- pyinfra-3.5.1/src/pyinfra/operations/util/docker.py +0 -251
- pyinfra-3.5.1/src/pyinfra/operations/util/packaging.py +0 -336
- pyinfra-3.5.1/src/pyinfra/operations/xbps.py +0 -77
- pyinfra-3.5.1/src/pyinfra/operations/yum.py +0 -210
- pyinfra-3.5.1/src/pyinfra/operations/zfs.py +0 -175
- pyinfra-3.5.1/src/pyinfra/operations/zypper.py +0 -192
- pyinfra-3.5.1/src/pyinfra_cli/cli.py +0 -780
- pyinfra-3.5.1/src/pyinfra_cli/inventory.py +0 -343
- pyinfra-3.5.1/src/pyinfra_cli/util.py +0 -239
- pyinfra-3.5.1/tests/facts/files.FileContents/file.json +0 -6
- pyinfra-3.5.1/tests/facts/files.FileContents/no_file.json +0 -6
- pyinfra-3.5.1/tests/facts/npm.NpmPackages/local_packages.json +0 -13
- pyinfra-3.5.1/tests/operations/crontab.crontab/edit_existing_with_newline.json +0 -26
- pyinfra-3.5.1/tests/operations/docker.image/pull_image.json +0 -12
- pyinfra-3.5.1/tests/operations/docker.image/remove_image.json +0 -12
- pyinfra-3.5.1/tests/operations/files.block/add_existing_block_different_content.json +0 -17
- pyinfra-3.5.1/tests/operations/files.block/add_existing_block_different_content_and_backup.json +0 -18
- pyinfra-3.5.1/tests/operations/files.block/add_existing_block_different_content_multiple_lines.json +0 -17
- pyinfra-3.5.1/tests/operations/files.block/add_no_existing_block_and_no_line.json +0 -17
- pyinfra-3.5.1/tests/operations/files.block/add_no_existing_block_line_provided.json +0 -17
- pyinfra-3.5.1/tests/operations/files.block/add_no_existing_block_line_provided_escape_regex.json +0 -18
- pyinfra-3.5.1/tests/operations/files.block/add_no_existing_file.json +0 -17
- pyinfra-3.5.1/tests/operations/files.block/remove_but_content_not_none.json +0 -16
- pyinfra-3.5.1/tests/operations/files.block/remove_existing_block.json +0 -15
- pyinfra-3.5.1/tests/test_api/test_api_operations.py +0 -949
- pyinfra-3.5.1/tests/test_cli/test_cli.py +0 -195
- pyinfra-3.5.1/tests/test_connectors/test_docker.py +0 -234
- pyinfra-3.5.1/tests/test_connectors/test_ssh.py +0 -1246
- pyinfra-3.5.1/tests/test_connectors/test_sshuserclient.py +0 -273
- pyinfra-3.5.1/tests/test_facts.py +0 -128
- pyinfra-3.5.1/tests/test_operations_utils.py +0 -17
- pyinfra-3.5.1/tests/util.py +0 -479
- pyinfra-3.5.1/uv.lock +0 -1683
- {pyinfra-3.5.1 → pyinfra-3.6.1}/.editorconfig +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/.git-blame-ignore-revs +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/.github/FUNDING.yml +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/.github/workflows/docs.yml +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/.gitignore +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/.typos.toml +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/CONTRIBUTING.md +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/LICENSE.md +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/README.md +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/codecov.yml +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/__init__.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/api/deploys.md +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/api/facts.md +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/api/operations.md +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/api/reference.rst +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/changes.rst +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/deploy-process.rst +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/examples/client_side_assets.md +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/examples/dynamic_inventories_data.md +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/examples/groups_roles.md +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/examples/secret_storage.md +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/examples.rst +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/index.rst +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/install.md +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/performance.rst +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/static/logo_small.png +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/static/performance.png +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/examples/README.md +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/scripts/__init__.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/scripts/cleanup_words.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/scripts/dev-test-e2e.sh +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/scripts/dev-test.sh +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/scripts/generate_api_docs.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/scripts/generate_connectors_docs.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/scripts/generate_next_version.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/scripts/generate_redirect_pages.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/scripts/pyinfra-complete.sh +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/scripts/pyinfra-complete.zsh +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/scripts/release.sh +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/scripts/spellcheck.sh +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/__init__.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/__main__.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/api/config.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/api/connect.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/api/connectors.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/api/state.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/connectors/__init__.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/connectors/base.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/connectors/chroot.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/connectors/dockerssh.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/connectors/local.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/connectors/scp/__init__.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/connectors/scp/client.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/connectors/ssh_util.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/connectors/sshuserclient/__init__.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/connectors/sshuserclient/config.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/connectors/terraform.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/connectors/vagrant.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/context.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/__init__.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/apk.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/apt.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/brew.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/bsdinit.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/cargo.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/choco.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/deb.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/dnf.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/docker.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/efibootmgr.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/freebsd.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/gem.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/git.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/gpg.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/hardware.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/iptables.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/launchd.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/lxd.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/mysql.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/openrc.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/opkg.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/pacman.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/pip.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/pipx.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/pkg.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/pkgin.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/podman.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/postgres.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/postgresql.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/rpm.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/runit.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/selinux.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/snap.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/systemd.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/sysvinit.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/upstart.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/util/__init__.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/util/databases.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/util/packaging.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/util/units.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/util/win_files.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/vzctl.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/xbps.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/yum.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/zfs.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/zypper.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/local.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/__init__.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/bsdinit.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/cargo.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/choco.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/freebsd/__init__.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/freebsd/freebsd_update.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/freebsd/pkg.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/freebsd/service.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/freebsd/sysrc.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/launchd.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/npm.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/openrc.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/postgresql.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/runit.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/upstart.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/util/__init__.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/util/files.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/util/service.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/vzctl.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/progress.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/py.typed +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/version.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra_cli/__init__.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra_cli/commands.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra_cli/exceptions.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra_cli/log.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra_cli/main.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra_cli/prints.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra_cli/virtualenv.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/__init__.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/end-to-end/conftest.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/end-to-end/test_e2e_docker.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/end-to-end/test_e2e_local.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/end-to-end/test_e2e_podman.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/end-to-end/test_e2e_ssh.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/apk.ApkPackages/packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/apk.ApkPackages/packages_2.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/apt.AptKeys/keys.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/apt.AptSources/component_with_number.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/apt.AptSources/sources.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/apt.SimulateOperationWillChange/upgrade-nochanges.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/apt.SimulateOperationWillChange/upgrade.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/brew.BrewCasks/casks.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/brew.BrewPackages/packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/brew.BrewTaps/taps.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/brew.BrewVersion/bad_output.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/brew.BrewVersion/version.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/cargo.CargoPackages/packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/choco.ChocoPackages/packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/choco.ChocoVersion/version.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/crontab.Crontab/comments.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/crontab.Crontab/simple.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/crontab.Crontab/simple_user.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/deb.DebPackage/package.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/deb.DebPackage/whitespace.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/deb.DebPackages/hold_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/deb.DebPackages/packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/dnf.DnfRepositories/repos-with-spaces.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/dnf.DnfRepositories/repos.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/docker.DockerContainer/container.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/docker.DockerContainers/container.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/docker.DockerImages/images.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/docker.DockerPlugin/plugin.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/docker.DockerPlugins/plugins.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/efibootmgr.EFIBootMgr/boot_entries.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/efibootmgr.EFIBootMgr/boot_entries2.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/efibootmgr.EFIBootMgr/boot_entries_complex.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/efibootmgr.EFIBootMgr/not_uefi.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Block/defaults.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Block/no_markers_found.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Block/not_found.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Directory/file.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Directory/link.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Directory/ls_fallback.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Directory/ls_fallback_freebsd.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Directory/ls_fallback_macos.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Directory/valid.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.File/directory.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.File/invalid_output.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.File/link.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.File/ls_fallback.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.File/ls_fallback_selinux.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.File/ls_fallback_time.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.File/mode_setgid_setuid.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.File/mode_sticky.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.File/tilde.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.File/tilde_with_space.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.File/valid.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.File/valid_needs_quotes.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.File/valid_with_space.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.FindDirectories/directories.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.FindFiles/files.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.FindFiles/files_with_name.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.FindFiles/files_with_name_wildcard.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.FindInFile/lines.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.FindInFile/lines_interpolate.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.FindInFile/lines_no_interpolate.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.FindInFile/lines_quote.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.FindInFile/no_file.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.FindInFile/no_matches.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.FindLinks/links.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Flags/bad_output.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Flags/no_flags_set.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Flags/no_output.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Flags/one_flag_set.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Flags/too_much_output.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Flags/two_flags_set.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Link/directory.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Link/file.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Link/ls_fallback.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Link/valid.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Link/valid_centos6.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Md5File/file.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Md5File/file_bsd_style.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Md5File/file_needs_quotes.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Sha1File/file.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Sha1File/file_bsd_style.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Sha1File/file_needs_quotes.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Sha256File/file.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Sha256File/file_bsd_style.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Sha256File/file_needs_quotes.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Sha384File/file.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Sha384File/file_bsd_style.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Sha384File/file_needs_quotes.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/flatpak.FlatpakPackage/kodi.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/flatpak.FlatpakPackage/not_found.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/flatpak.FlatpakPackage/vlc.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/flatpak.FlatpakPackages/packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/freebsd.PkgPackage/package-with-jail.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/freebsd.PkgPackage/package.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/freebsd.ServiceScript/found.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/freebsd.ServiceScript/not-found.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/freebsd.ServiceStatus/not-running.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/freebsd.ServiceStatus/running.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/freebsd.Sysrc/found.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/freebsd.Sysrc/not-found.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/gem.GemPackages/packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/git.GitBranch/branch.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/git.GitConfig/global.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/git.GitConfig/multi_value.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/git.GitConfig/repo.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/git.GitTag/tag.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/git.GitTrackingBranch/branch.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/git.GitTrackingBranch/branch_behind.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/git.GitTrackingBranch/no_branch.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/gpg.GpgKey/key_from_file.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/gpg.GpgKey/key_from_url.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/gpg.GpgKeys/keys.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/gpg.GpgKeys/keys_keyring.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/gpg.GpgSecretKeys/keys.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/gpg.GpgSecretKeys/keys_keyring.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.BlockDevices/devices.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.Cpus/invalid.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.Cpus/valid.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.Ipv4Addresses/linux_ip.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.Ipv4Addrs/linux_ip_multiple.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.Ipv6Addresses/linux_ip.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.Ipv6Addrs/linux_ip_multiple.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.Memory/vmstat_bsd.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.Memory/vmstat_linux.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.NetworkDevices/linux_ifconfig.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.NetworkDevices/linux_ifconfig_multiple.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.NetworkDevices/linux_ip.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.NetworkDevices/linux_ip_multiple_addrs.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.NetworkDevices/linux_ip_multiple_ifaces.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.NetworkDevices/macos_ifconfig.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/iptables.Ip6tablesChains/chains.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/iptables.Ip6tablesRules/rules.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/iptables.IptablesChains/chains.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/iptables.IptablesRules/rules.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/launchd.LaunchdStatus/services.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/lxd.LxdContainers/stripped.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/mysql.MysqlDatabases/multiple.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/mysql.MysqlDatabases/multiple_custom_connection.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/mysql.MysqlUserGrants/multiple.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/mysql.MysqlUsers/multiple.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/npm.NpmPackages/packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/openrc.OpenrcEnabled/services.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/openrc.OpenrcEnabled/services_runlevel.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/openrc.OpenrcStatus/services.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/openrc.OpenrcStatus/services_runlevel.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/opkg.OpkgConf/opkg_conf.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/opkg.OpkgFeeds/opkg_feeds.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/opkg.OpkgInstallableArchitectures/opkg_installable_architectures.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/opkg.OpkgPackages/opkg_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/opkg.OpkgUpgradeablePackages/opkg_upgradeable_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/pacman.PacmanPackages/packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/pip.Pip3Packages/packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/pip.PipPackages/packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/pip.PipPackages/packages_pip3.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/pipx.PipxEnvironment/environment.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/pipx.PipxPackages/packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/pkg.PkgPackages/packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/pkgin.PkginPackages/packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/podman.PodmanPs/empty.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/podman.PodmanPs/onecontainer.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/podman.PodmanSystemInfo/info1.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/postgresql.PostgresqlDatabases/multiple.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/postgresql.PostgresqlRoles/multiple.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/postgresql.PostgresqlRoles/multiple_custom_connection.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/rpm.RpmPackage/package.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/rpm.RpmPackageProvides/package.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/rpm.RpmPackages/packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/runit.RunitManaged/single.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/runit.RunitManaged/status.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/runit.RunitStatus/single.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/runit.RunitStatus/status.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/selinux.FileContext/file_context.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/selinux.FileContextMapping/found.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/selinux.FileContextMapping/not_found.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/selinux.SEBoolean/get.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/selinux.SEPort/generic_and_specific.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/selinux.SEPort/get_bad_port.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/selinux.SEPort/only_generic.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/selinux.SEPorts/line_noise_input.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/selinux.SEPorts/multiple_single_ports.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/selinux.SEPorts/only_single_port.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/selinux.SEPorts/port_range.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/selinux.SEPorts/single_and_range.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Arch/arch.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Command/command.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Date/date.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Groups/groups.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.HasGui/gui_absent.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.HasGui/gui_present.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Home/home.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Home/root.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Home/some_user.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Hostname/hostname.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.KernelModules/modules.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.LinuxDistribution/archlinux.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.LinuxDistribution/centos-6.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.LinuxDistribution/centos-7.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.LinuxDistribution/no_match.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.LinuxDistribution/ubuntu.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.LinuxGui/gnome_present.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.LinuxName/ubuntu.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Locales +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.LsbRelease/release.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Mounts/mounts.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Os/os.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.OsVersion/os_version.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Port/empty.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Port/one-process.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Port/two-processes.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.RebootRequired/alpine_reboot_required.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.RebootRequired/freebsd_reboot_required.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.RebootRequired/linux_no_reboot.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.RebootRequired/linux_reboot_required.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.SecurityLimits/security_limits.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Selinux/no-output.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Selinux/selinux.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Sysctl/sysctl_linux.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Sysctl/sysctl_macos.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Users/mixed.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Which/which.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/snap.SnapPackage/lxd.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/snap.SnapPackage/not_found.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/snap.SnapPackage/snapd.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/snap.SnapPackage/vlc.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/snap.SnapPackages/packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/systemd.SystemdEnabled/machine_services.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/systemd.SystemdEnabled/root_machine_services.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/systemd.SystemdEnabled/services.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/systemd.SystemdEnabled/user_machine_services.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/systemd.SystemdEnabled/user_services.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/systemd.SystemdStatus/machine_services.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/systemd.SystemdStatus/root_machine_services.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/systemd.SystemdStatus/services.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/systemd.SystemdStatus/services_invalid_output.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/systemd.SystemdStatus/user_machine_services.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/systemd.SystemdStatus/user_services.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/sysvinit.InitdStatus/services.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/upstart.UpstartStatus/services.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/vzctl.OpenvzContainers/containers.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/xbps.XbpsPackages/dot-in-package-name.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/xbps.XbpsPackages/packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/yum.YumRepositories/repos.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/zfs.Datasets/datasets.yaml +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/zfs.Filesystems/filesystems.yaml +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/zfs.Pools/pools.yaml +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/zfs.Snapshots/snapshots.yaml +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/zfs.Volumes/volumes.yaml +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/zypper.ZypperRepositories/repos.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apk.packages/add_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apk.packages/remove_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apk.packages/upgrade_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apk.packages/upgrade_update.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apk.upgrade/upgrade_available.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.deb/add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.deb/add_existing.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.deb/download_add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.deb/remove_existing.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.deb/remove_no_exist.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.dist_upgrade/dist_upgrade.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.dist_upgrade/dist_upgrade_autoremove.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.key/add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.key/add_exists.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.key/add_keyserver.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.key/add_keyserver_exists.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.key/add_keyserver_multiple.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.key/add_keyserver_multiple_partial.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.key/add_keyserver_no_keyid.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.key/add_no_gpg.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.key/add_url.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.packages/add_package.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.packages/add_package_allow_downgrades.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.packages/add_package_force.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.packages/add_package_no_recommends.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.packages/add_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.packages/install_with_args.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.packages/remove_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.packages/remove_packages_with_args.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.packages/update_cache_old.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.packages/update_cached.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.packages/update_nocache.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.packages/update_upgrade.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.packages/upgrade_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.ppa/add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.ppa/remove.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.repo/add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.repo/add_existing.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.repo/add_filename.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.repo/remove.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.upgrade/upgrade.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.upgrade/upgrade_autoremove.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.cask_upgrade/new_cli_upgrade.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.cask_upgrade/old_cli_upgrade.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.casks/add_casks_upgrade.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.casks/new_cli_add_casks.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.casks/old_cli_add_casks.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.packages/add_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.packages/remove_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.packages/upgrade_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.packages/upgrade_update.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.tap/add_exists.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.tap/add_tap.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.tap/add_tap_bad_url.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.tap/add_tap_no_args.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.tap/add_tap_url.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.tap/add_tap_url_exists.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.tap/add_tap_url_no_src.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.tap/remove_no_exists.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.tap/remove_tap.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.upgrade/upgrade.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/bsdinit.service/disabled.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/bsdinit.service/enabled.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/bsdinit.service/reload.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/bsdinit.service/skip_started.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/bsdinit.service/start.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/bsdinit.service/stop.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/cargo.packages/add_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/cargo.packages/remove_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/choco.install/install.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/choco.packages/add_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/choco.packages/remove_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/crontab.crontab/add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/crontab.crontab/add_another.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/crontab.crontab/add_existing.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/crontab.crontab/add_existing_int.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/crontab.crontab/add_named.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/crontab.crontab/add_special_time.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/crontab.crontab/add_user.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/crontab.crontab/edit.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/crontab.crontab/edit_named.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/crontab.crontab/edit_special_time.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/crontab.crontab/remove.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.key/add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.packages/add_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.packages/install_with_args.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.packages/install_with_nobest.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.packages/noop_add_package_alias.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.packages/remove_package.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.packages/uninstall_with_args.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.packages/update_clean.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.repo/add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.repo/remove.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.rpm/add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.rpm/add_existing.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.rpm/add_existing_upgrade.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.rpm/add_url.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.rpm/remove.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.container/add_and_start_no_existent_container.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.container/add_existent_container.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.container/add_no_existent_container.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.container/remove_container.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.container/start_container.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.container/stop_container.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.network/add_network.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.network/add_network_macvlan_with_aux_addresses.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.network/add_network_with_gateway.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.network/add_network_with_ip_range.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.network/add_network_with_opts.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.network/remove_network.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.plugin/disable_plugin.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.plugin/enable_plugin.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.plugin/install_plugin.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.plugin/install_plugin_disabled.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.plugin/install_plugin_with_alias_and_options.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.plugin/remove_plugin.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.plugin/set_plugin_options.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.plugin/set_plugin_options_disabled_plugin.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.volume/add_volume.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.volume/add_volume_with_driver.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.volume/add_volume_with_labels.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.block/add_existing_block_same_content.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.block/add_line_given_but_before_eq_after.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.block/add_no_content_provided.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.block/add_no_existing_block_and_non_str_line_given.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.block/add_no_line_given_but_before_ne_after.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.block/remove_no_existing_block.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.block/remove_no_file.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.directory/add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.directory/add_force.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.directory/add_force_backup_dir.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.directory/add_force_no_backup.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.directory/add_with_spaces.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.directory/delete.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.directory/edit.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.directory/edit_with_spaces.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.directory/ignore_link_type.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.directory/invalid.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.directory/invalid_type.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_cache_time.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_cache_time_needs_refresh.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_directory.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_existing_checksum.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_extra_args_curl.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_extra_args_wget.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_headers_curl.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_headers_wget.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_insecure_curl.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_insecure_wget.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_needs_quotes.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_no_curl_no_wget.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_proxy_curl.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_proxy_wget.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_wget.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_with_checksums.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_with_checksums_needs_quotes.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/pathlib_download.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/skip_existing.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/add_force.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/add_force_backup_dir.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/add_force_backup_dir_nested.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/add_force_no_backup.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/add_special_chars.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/add_with_spaces.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/create_directory.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/delete.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/delete_with_spaces.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/edit.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/edit_nothing.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/invalid.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/invalid_type.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/touch.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/clear_no_flags.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/clear_one_flag_already_clear.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/clear_one_flag_was_set.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/clear_two_flags.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/clear_two_flags_already_clear.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/clear_two_flags_first_already_clear.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/clear_two_flags_second_already_clear.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/set_no_flags.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/set_one_flag_already_set.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/set_one_flag_not_yet_set.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/set_two_flags.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/set_two_flags_already_set.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/set_two_flags_first_already_set.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/set_two_flags_second_already_set.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.get/create_directory.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.get/different_remote.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.get/fallback_md5.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.get/fallback_sha256.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.get/no_change_md5.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.get/no_change_sha256.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.get/no_local.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.get/no_remote.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.get/path_with_spaces.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.get/path_with_spaces_already_escaped.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.get/pathlib_path_with_spaces.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.line/add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.line/add_backup.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.line/add_existing.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.line/add_replace.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.line/add_replace_noop.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.line/add_with_quote.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.line/edit.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.line/edit_backup.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.line/pathlib_edit.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.link/add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.link/add_force.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.link/add_force_backup_dir.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.link/add_force_no_backup.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.link/add_no_target.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.link/add_with_spaces.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.link/create_directory.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.link/delete.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.link/edit.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.link/edit_nothing.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.link/invalid.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.link/invalid_type.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.link/pathlib_edit.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.move/directory.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.move/invalid_dest.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.move/invalid_src.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.move/link.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.move/no_conflict.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.move/no_overwrite.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.move/overwrite.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/atime_mtime_sub_second.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/change_atime_eq_mtime_ref_remote.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/change_mode_owner.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/change_mode_owner_with_spaces.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/change_mtime_arg_no_tz.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/change_mtime_atime_ref_local file.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/copy_local_permissions.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/create_directory.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/different_remote.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/fallback_md5.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/fallback_sha256.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/no_change.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/no_change_atime_mtime.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/no_change_md5.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/no_change_same_mode_as_local.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/no_change_sha256.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/no_local.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/no_remote.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/path_with_spaces.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/path_with_spaces_already_escaped.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/pathlib_with_spaces.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/upload_to_directory.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.replace/no_match.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.replace/replace_double_quotes_interpolate.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.replace/replace_double_quotes_no_interpolate.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.replace/replace_single_quotes_interpolate.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.replace/replace_single_quotes_no_interpolate.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.replace/simple_interpolate.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.replace/simple_no_interpolate.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.sync/sync_delete_posix.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.sync/sync_delete_windows.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.sync/sync_destination_link.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.sync/sync_exclude_multiple.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.sync/sync_no_destination_exist.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.sync/sync_no_local_exist_posix.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.sync/sync_no_local_exist_windows.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.sync/sync_partial_exists.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.sync/sync_special_chars.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.template/invalid_template_syntax.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.template/no_remote.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.template/undefined_template_variable.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/flatpak.packages/install_package.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/flatpak.packages/install_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/flatpak.packages/remove_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.freebsd_update.update/update.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.autoremove/autoremove-with-jail.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.autoremove/autoremove.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.clean/clean-all-with-jail.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.clean/clean-all.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.clean/clean-with-jail.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.clean/clean.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.install/install-with-custom-repo.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.install/install-with-jail-and-custom-repo.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.install/install-with-jail.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.install/install.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.remove/remove-with-jail.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.remove/remove.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.update/update.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.upgrade/upgrade.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.service.service/custom.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.service.service/reload.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.service.service/restart.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.service.service/start.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.service.service/stop.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.sysrc.sysrc/add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.sysrc.sysrc/del.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.sysrc.sysrc/set.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.sysrc.sysrc/sub.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/gem.packages/add_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/gem.packages/remove_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.bare_repo/chmod.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.bare_repo/delete.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.bare_repo/init.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.config/add_existing_multi_value.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.config/add_first_multi_value.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.config/add_second_multi_value.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.config/edit_global.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.config/edit_system.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.config/set_existing_global.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.config/set_existing_system.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.config/set_global.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.config/set_repo.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.config/set_system.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.repo/branch_pull.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.repo/clone.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.repo/clone_keyscan.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.repo/clone_keyscan_invalid.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.repo/rebase.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.repo/recursive_submodules.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.repo/update_submodules.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/create.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/create_detached.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/create_detached_from_commitish.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/create_existing_branch.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/create_force.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/create_from_commitish.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/create_new_branch.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/create_new_branch_from_commitish.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/pull.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/pull_disable.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/pull_from_bad_remote_branch.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/pull_from_remote_branch.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/pull_rebase from_remote_branch.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/pull_rebase.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/remove.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/remove_force.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.chain/add_chain.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.chain/delete_chain.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.chain/delete_chain_noop.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.chain/edit_chain.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.rule/add_log_rule.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.rule/add_rule.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.rule/add_to_ports.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.rule/add_to_source.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.rule/add_v6_rule.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.rule/already_absent.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.rule/already_present.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.rule/delete_rule.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.rule/invalid_destination_port.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.rule/invalid_log_prefix.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.rule/invalid_source_destination.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.rule/invalid_to_destination.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.rule/invalid_to_ports.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/launchd.service/restart.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/launchd.service/restart_stopped.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/launchd.service/start.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/launchd.service/start_running.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/launchd.service/stop.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/lxd.container/add_container.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/lxd.container/already_absent.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/lxd.container/already_present.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/lxd.container/delete_container.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/lxd.container/delete_running_container.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.database/add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.database/add_noop.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.database/add_privileges.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.database/delete.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.database/delete_noop.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.dump/dump.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.load/load.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.load/load_space.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/add_all_with_grant_option.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/add_database.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/add_delete.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/add_delete_usage.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/add_existing.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/add_table.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/add_table_invalid.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/add_with_grant_option.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/delete.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/delete_all.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/delete_all_with_grant_option.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/delete_with_grant_option.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/remove_noop.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/remove_usage.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.sql/execute.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.sql/execute_mysql_kwargs.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/add_noop.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/add_password.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/add_privileges.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/add_resources.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/add_ssl.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/add_x509.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/add_x509_specified.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/delete.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/invalid_require_cipher.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/invalid_require_issuer.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/invalid_require_subject.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/invalid_require_type.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/remove_noop.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/update_resources.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/update_resources_partial.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/update_ssl.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/update_x509.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/update_x509_specified.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/update_x509_specified_partial.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/npm.packages/add_local_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/npm.packages/add_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/npm.packages/remove_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/openrc.service/disable.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/openrc.service/disable_noop.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/openrc.service/disable_runlevel.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/openrc.service/enable.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/openrc.service/enable_noop.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/openrc.service/enable_runlevel.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/openrc.service/running_noop.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/openrc.service/start.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/openrc.service/stop.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/openrc.service/stopped_noop.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/opkg.packages/add_existing_package.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/opkg.packages/add_multiple_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/opkg.packages/add_one_package.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/opkg.packages/add_with_unallowed_pinning.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/opkg.packages/list_of_nulls_package_list.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/opkg.packages/null_package_list.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/opkg.packages/remove_existing_package.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/opkg.packages/remove_existing_package_and_require_update.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/opkg.packages/remove_not_existing_package.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/opkg.packages/update_then_add_one.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/opkg.update/first_update.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pacman.packages/add_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pacman.packages/add_packages_group_expand.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pacman.packages/remove_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pacman.packages/remove_packages_expand.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pacman.packages/upgrade_update.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.packages/add_existing_package_with_url.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.packages/add_new_virtualenv_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.packages/add_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.packages/add_packages_case_insensitive.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.packages/add_virtualenv_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.packages/install_extra_args.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.packages/install_latest_requirements.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.packages/install_requirements.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.packages/install_virtualenv_requirements.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.packages/remove_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.packages/uninstall_requirements.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.packages/use_pip3.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.packages/use_pip3_virtualenv.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.venv/add_virtualenv.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.virtualenv/add_virtualenv.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.virtualenv/add_virtualenv_py3.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.virtualenv/add_with_options.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.virtualenv/already_absent.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.virtualenv/already_present.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.virtualenv/delete_virtualenv.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.virtualenv/present_empty_directory.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.virtualenv/use_stdlib_venv.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.virtualenv/use_stdlib_venv_py3.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pipx.ensure_path/ensure_path.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pipx.packages/add_existing_package_with_url.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pipx.packages/add_nothing.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pipx.packages/add_package.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pipx.packages/add_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pipx.packages/install_extra_args.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pipx.packages/remove_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pipx.upgrade_all/upgrade_all.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pkg.packages/pkg_add_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pkg.packages/pkg_add_packages_with_installurl.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pkg.packages/pkg_delete_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pkg.packages/pkg_install_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pkg.packages/pkg_remove_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pkgin.packages/add_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pkgin.packages/remove_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pkgin.packages/upgrade_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pkgin.packages/upgrade_update.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.database/add_database.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.database/add_database_locales.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.database/add_database_owner.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.database/remove_database.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.database/remove_database_noop.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.database/update_database.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.database/update_database_noop.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.dump/dump.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.load/load.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.role/role_remove_noop.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.role/role_update.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.role/role_update_noop.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.role/user_add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.role/user_add_no_login.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.role/user_add_privileges.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.role/user_add_replication.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.role/user_add_super.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.role/user_remove.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.sql/execute.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/puppet.agent/run_agent.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/python.call/call_func.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/python.raise_exception/call_func.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/runit.manage/manage.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/runit.manage/unmanage.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/runit.service/disable.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/runit.service/enable.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.boolean/bad_value.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.boolean/change_not_persistent.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.boolean/change_persistent.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.boolean/no_change.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.file_context/change.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.file_context/no_change.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.file_context_mapping/add_None.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.file_context_mapping/add_different.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.file_context_mapping/add_no_change.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.file_context_mapping/add_none_existeing.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.file_context_mapping/delete_existing.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.file_context_mapping/delete_none_existing.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.port/add_None.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.port/add_different.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.port/add_different_direct.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.port/add_not_existing.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.port/add_not_existing_direct.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.port/add_not_existing_protocol.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.port/add_same.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.port/add_same_direct.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.port/remove_existing.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.port/remove_existing_direct.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.port/remove_not_existing.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.port/remove_not_existing_direct.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.group/add.freebsd.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.group/add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.group/delete.freebsd.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.group/delete.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.hostname/hostname_noop.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.hostname/hostnamectl_noop.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.hostname/set_hostname_bsd.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.hostname/set_hostname_linux.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.hostname/set_hostnamectl_linux.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.locale/add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.locale/remove.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.modprobe/add-list.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.modprobe/add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.modprobe/add_exists.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.modprobe/add_force.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.modprobe/add_multiple_exists.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.modprobe/remove-list.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.modprobe/remove.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.mount/mount.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.mount/mount_device.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.mount/mount_device_fstype.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.mount/mount_exists.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.mount/mount_options.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.mount/remount_options.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.mount/unmount.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.packages/add_apk_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.packages/add_dnf_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.packages/add_yum_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.reboot/reboot.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.script/upload_run.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.script_template/script.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.security_limit/set.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.service/invalid.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.service/start_initd.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.service/start_initd_service.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.service/start_openrc.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.service/start_rcd.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.service/start_runit.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.service/start_systemd.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.service/start_upstart.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.shell/shell.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.shell/single_shell.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.sysctl/set.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.sysctl/set_list.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.sysctl/set_noop.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.sysctl/set_noop_string_value.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.sysctl/set_noop_zero_int.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.sysctl/set_persist.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/add.freebsd.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/add_group_exists.freebsd.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/add_group_exists.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/add_home_is_link.freebsd.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/add_home_is_link.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/add_invalid_home_is_file.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/add_non_unique.freebsd.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/add_non_unique.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/append_secondary_existing_groups.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/append_secondary_groups.freebsd.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/append_secondary_groups.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/delete.freebsd.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/delete.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/edit.freebsd.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/edit.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/exists_noop.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/key_files.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/keys.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/keys_delete.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/keys_nohome.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/keys_single.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.wait/port.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/snap.package/install_package.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/snap.package/install_package_classic.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/snap.package/install_package_with_channel.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/snap.package/install_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/snap.package/install_refresh_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/snap.package/refresh_package.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/snap.package/remove_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/ssh.command/command.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/ssh.command/command_quotes.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/ssh.command/command_user_port.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/ssh.download/download.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/ssh.download/download_exists.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/ssh.download/download_exists_force.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/ssh.download/download_not_file.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/ssh.keyscan/scan_not_present.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/ssh.keyscan/scan_present.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/ssh.keyscan/scan_present_force.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/ssh.upload/upload.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/ssh.upload/upload_remote_sudo.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/ssh.upload/upload_remote_sudo_user.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/daemon_reload.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/disabled.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/enabled.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/machine_daemon_reload.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/machine_disabled.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/machine_enabled.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/machine_start.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/running_ambiguous_unit.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/running_noop.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/running_timer.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/start.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/stopped_noop.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/timer.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/user_daemon_reload.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/user_disabled.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/user_enabled.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/user_machine_daemon_reload.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/user_machine_disabled.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/user_machine_enabled.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/user_machine_start.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/user_start.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/sysvinit.enable/create.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/sysvinit.service/command.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/sysvinit.service/disabled.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/sysvinit.service/enabled_chkconfig.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/sysvinit.service/enabled_rc-update.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/sysvinit.service/enabled_update-rc.d.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/sysvinit.service/reload.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/sysvinit.service/restart.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/sysvinit.service/restart_down.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/sysvinit.service/skip_started.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/sysvinit.service/start.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/sysvinit.service/stop.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/upstart.service/disabled.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/upstart.service/enabled.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/upstart.service/running.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/vzctl.create/add_template.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/vzctl.create/already_existing.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/vzctl.delete/delete.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/vzctl.mount/mount.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/vzctl.restart/restart.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/vzctl.restart/restart_force.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/vzctl.set/set.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/vzctl.set/set_multiple.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/vzctl.set/set_no_save.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/vzctl.start/start.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/vzctl.start/start_force.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/vzctl.stop/stop.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/vzctl.unmount/unmount.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/xbps.packages/add_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/xbps.packages/remove_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/xbps.packages/upgrade_update.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.key/add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.packages/add_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.packages/add_packages_alias.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.packages/add_packages_alias_different_version.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.packages/add_packages_alias_multiple_version.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.packages/install_with_args.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.packages/install_with_nobest.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.packages/noop_add_packages_alias.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.packages/noop_add_packages_alias_multiple_version.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.packages/remove_package.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.packages/remove_packages_alias_multiple_version.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.packages/uninstall_with_args.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.packages/update_clean.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.repo/add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.repo/add_url.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.repo/remove.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.rpm/add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.rpm/add_existing.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.rpm/add_existing_upgrade.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.rpm/add_url.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.rpm/remove.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zfs.dataset/create.yaml +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zfs.dataset/create_noop.yaml +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zfs.dataset/create_recursive.yaml +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zfs.dataset/create_sparse.yaml +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zfs.dataset/create_volume.yaml +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zfs.dataset/delete.yaml +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zfs.dataset/delete_noop.yaml +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zfs.dataset/delete_recursive.yaml +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zfs.dataset/set_props.yaml +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zfs.filesystem/create.yaml +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zfs.filesystem/delete.yaml +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zfs.snapshot/create.yaml +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zfs.volume/create.yaml +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.key/add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.packages/add_packages.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.packages/install_with_args.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.packages/install_with_global_args.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.packages/uninstall_with_args.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.packages/uninstall_with_global_args.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.packages/update_clean.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.repo/add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.repo/add_url.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.repo/remove.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.rpm/add.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.rpm/add_existing.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.rpm/add_existing_upgrade.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.rpm/add_url.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.rpm/remove.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/paramiko_util.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_api/__init__.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_api/test_api.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_api/test_api_arguments.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_api/test_api_command.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_api/test_api_config.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_api/test_api_deploys.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_api/test_api_facts.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_api/test_api_host.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_api/test_api_inventory.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_api/test_api_util.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/__init__.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/deploy.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/deploy_random.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/files/a_file +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/group_data/all.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/group_data/invalid.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/group_data/leftover_data.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/inventories/inventory.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/inventories/inventory_all.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/inventories/inventory_ansible +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/inventories/inventory_ansible.json +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/inventories/inventory_ansible.yml +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/tasks/a_task.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/tasks/another_task.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/tasks/b_task.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/tasks/nested/empty_task.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/templates/a_template.j2 +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/utils.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy_fails/invalid_argument_type.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy_fails/invalid_operation_arg.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy_fails/operation_error.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/inventories/invalid.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/test_cli_deploy.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/test_cli_exceptions.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/test_cli_inventory.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/test_cli_util.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/test_context_objects.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/user/test_ops.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/util.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_connectors/__init__.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_connectors/test_chroot.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_connectors/test_dockerssh.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_connectors/test_local.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_connectors/test_terraform.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_connectors/test_util.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_connectors/test_vagrant.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_global_arguments.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_operations.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_units.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/typing/invalid/operation_kwarg.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/typing/invalid/operation_kwarg_value.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/typing/valid/operation.py +0 -0
- {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/words.txt +0 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"permissions": {
|
|
3
|
+
"allow": [
|
|
4
|
+
"mcp__github__pull_request_read",
|
|
5
|
+
"Bash(python -m pytest:*)",
|
|
6
|
+
"Bash(uv run pytest:*)",
|
|
7
|
+
"Bash(python scripts/lint_arguments_sync.py:*)",
|
|
8
|
+
"mcp__github__issue_read",
|
|
9
|
+
"mcp__github__list_issues",
|
|
10
|
+
"Bash(grep:*)",
|
|
11
|
+
"mcp__github__list_tags",
|
|
12
|
+
"mcp__github__list_commits",
|
|
13
|
+
"mcp__github__search_users"
|
|
14
|
+
]
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: generatechangelog
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Generate pyinfra changelog for release:
|
|
6
|
+
|
|
7
|
+
- get previous v3.x tag
|
|
8
|
+
- use github mcp to pull commit messages, and github usernames
|
|
9
|
+
- generate changelog in a similar format to CHANGELOG.md (grab the first ~100 lines to get an idea)
|
|
10
|
+
- ask human overlord to confirm then prepend it to CHANGELOG.md
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
name: Lint & Test
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- 3.x
|
|
7
|
+
- 2.x
|
|
8
|
+
- 1.x
|
|
9
|
+
- 0.x
|
|
10
|
+
pull_request:
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
# Linting
|
|
14
|
+
#
|
|
15
|
+
|
|
16
|
+
lint:
|
|
17
|
+
runs-on: ubuntu-24.04
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v5
|
|
20
|
+
- uses: actions/setup-python@v5
|
|
21
|
+
with:
|
|
22
|
+
python-version: "3.13"
|
|
23
|
+
- name: Install uv
|
|
24
|
+
uses: astral-sh/setup-uv@v6
|
|
25
|
+
- uses: astral-sh/ruff-action@v3
|
|
26
|
+
- uses: astral-sh/ruff-action@v3
|
|
27
|
+
with:
|
|
28
|
+
args: "format --check"
|
|
29
|
+
|
|
30
|
+
type-check:
|
|
31
|
+
runs-on: ubuntu-24.04
|
|
32
|
+
steps:
|
|
33
|
+
- uses: actions/checkout@v5
|
|
34
|
+
- uses: actions/setup-python@v5
|
|
35
|
+
with:
|
|
36
|
+
python-version: "3.13"
|
|
37
|
+
- name: Install uv
|
|
38
|
+
uses: astral-sh/setup-uv@v6
|
|
39
|
+
- run: uv sync --group test --no-default-groups
|
|
40
|
+
- run: uv run mypy
|
|
41
|
+
- run: uv run python scripts/lint_arguments_sync.py
|
|
42
|
+
|
|
43
|
+
spell-check:
|
|
44
|
+
runs-on: ubuntu-24.04
|
|
45
|
+
steps:
|
|
46
|
+
- uses: actions/checkout@v5
|
|
47
|
+
- name: Check spelling
|
|
48
|
+
uses: crate-ci/typos@v1.30.3
|
|
49
|
+
|
|
50
|
+
unit-test:
|
|
51
|
+
needs:
|
|
52
|
+
- lint
|
|
53
|
+
- type-check
|
|
54
|
+
- spell-check
|
|
55
|
+
strategy:
|
|
56
|
+
matrix:
|
|
57
|
+
os: [macos-26, macos-15, macos-14, windows-2025, windows-2022, ubuntu-24.04, ubuntu-22.04]
|
|
58
|
+
# Test every OS vs. Python 3.13, and only one for 3.1[012]
|
|
59
|
+
python-version: ["3.13"]
|
|
60
|
+
include:
|
|
61
|
+
- os: ubuntu-24.04
|
|
62
|
+
python-version: "3.12"
|
|
63
|
+
- os: ubuntu-24.04
|
|
64
|
+
python-version: "3.11"
|
|
65
|
+
- os: ubuntu-24.04
|
|
66
|
+
python-version: "3.10"
|
|
67
|
+
runs-on: ${{ matrix.os }}
|
|
68
|
+
steps:
|
|
69
|
+
- uses: actions/checkout@v5
|
|
70
|
+
- uses: actions/setup-python@v5
|
|
71
|
+
with:
|
|
72
|
+
python-version: ${{ matrix.python-version }}
|
|
73
|
+
- name: Install uv
|
|
74
|
+
uses: astral-sh/setup-uv@v6
|
|
75
|
+
- run: uv sync --group test --no-default-groups --python=${{ matrix.python-version }}
|
|
76
|
+
- run: uv run pytest --cov --disable-warnings
|
|
77
|
+
- name: Upload coverage report to codecov
|
|
78
|
+
if: ${{ matrix.os == 'ubuntu-24.04' && matrix.python-version == '3.13' }}
|
|
79
|
+
uses: codecov/codecov-action@v5
|
|
80
|
+
|
|
81
|
+
# End-to-end tests
|
|
82
|
+
#
|
|
83
|
+
|
|
84
|
+
end-to-end-test:
|
|
85
|
+
needs:
|
|
86
|
+
- lint
|
|
87
|
+
- type-check
|
|
88
|
+
- spell-check
|
|
89
|
+
strategy:
|
|
90
|
+
matrix:
|
|
91
|
+
os: [ubuntu-22.04, ubuntu-24.04]
|
|
92
|
+
test-name: [local, ssh, docker, podman]
|
|
93
|
+
include:
|
|
94
|
+
- os: macos-14
|
|
95
|
+
test-name: local
|
|
96
|
+
- os: macos-15
|
|
97
|
+
test-name: local
|
|
98
|
+
- os: macos-26
|
|
99
|
+
test-name: local
|
|
100
|
+
runs-on: ${{ matrix.os }}
|
|
101
|
+
steps:
|
|
102
|
+
- uses: actions/checkout@v5
|
|
103
|
+
- uses: actions/setup-python@v5
|
|
104
|
+
with:
|
|
105
|
+
python-version: "3.13"
|
|
106
|
+
- name: Install uv
|
|
107
|
+
uses: astral-sh/setup-uv@v6
|
|
108
|
+
- run: uv sync --group test --no-default-groups --python=${{ matrix.python-version }}
|
|
109
|
+
- run: uv run pytest -m end_to_end_${{ matrix.test-name }}
|
|
110
|
+
|
|
111
|
+
# Finally, single jon to check if all completed, for use in protected branch
|
|
112
|
+
|
|
113
|
+
tests-done:
|
|
114
|
+
if: ${{ always() }}
|
|
115
|
+
needs:
|
|
116
|
+
- lint
|
|
117
|
+
- type-check
|
|
118
|
+
- spell-check
|
|
119
|
+
- unit-test
|
|
120
|
+
- end-to-end-test
|
|
121
|
+
runs-on: ubuntu-latest
|
|
122
|
+
steps:
|
|
123
|
+
- uses: matrix-org/done-action@v3
|
|
124
|
+
with:
|
|
125
|
+
needs: ${{ toJSON(needs) }}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
# GitHub Issue #1019: files.line grep inserts wrong regex
|
|
2
|
+
|
|
3
|
+
## Issue Summary
|
|
4
|
+
|
|
5
|
+
**Reported by:** JustScreaMy (October 4, 2023)
|
|
6
|
+
**Status:** Open (bug label)
|
|
7
|
+
**Assignee:** Fizzadar
|
|
8
|
+
|
|
9
|
+
### Problem Description
|
|
10
|
+
|
|
11
|
+
When using `files.line` to replace a single line, the operation produces an incorrect grep regex pattern, causing the line to never be matched and therefore automatically inserted at the end of the file instead of replacing the existing line.
|
|
12
|
+
|
|
13
|
+
### Reproduction Code
|
|
14
|
+
|
|
15
|
+
```python
|
|
16
|
+
from pyinfra.operations import files
|
|
17
|
+
|
|
18
|
+
files.line(
|
|
19
|
+
name="Disable password login",
|
|
20
|
+
path="/etc/ssh/sshd_config",
|
|
21
|
+
line="PasswordAuthentication .+",
|
|
22
|
+
replace="PasswordAuthentication no"
|
|
23
|
+
)
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Expected Behavior
|
|
27
|
+
|
|
28
|
+
The code should match a line containing `PasswordAuthentication yes` and replace it with `PasswordAuthentication no`.
|
|
29
|
+
|
|
30
|
+
### Actual Behavior (at time of report)
|
|
31
|
+
|
|
32
|
+
The grep command generated was:
|
|
33
|
+
```bash
|
|
34
|
+
sh -c 'grep -e '\"'\"'^.*.+PasswordAuthentication.+.*$'\"'\"' /etc/ssh/sshd_config
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
The problem was that the original regex `PasswordAuthentication .+` was being transformed into `^.*.+PasswordAuthentication.+.*$` which places the `.+` from the original pattern **before** the literal text instead of after it.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Root Cause Analysis
|
|
42
|
+
|
|
43
|
+
### Investigation Findings
|
|
44
|
+
|
|
45
|
+
Based on the comments on the issue and analysis of the current codebase:
|
|
46
|
+
|
|
47
|
+
1. **Issue Comment from "bad" (June 19, 2025):** States that the `.+` insertion issue appears to be fixed on 3.x HEAD, with the example grep now showing:
|
|
48
|
+
```
|
|
49
|
+
sh -c 'grep -e '\"'\"'^.*10.0.2.2[ ]\\{1,\\}host.*$'\"'\"' /etc/hosts [...]
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
2. **Current Code Path:**
|
|
53
|
+
|
|
54
|
+
The `files.line` operation (in `/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/operations/files.py`, line 278-475) calls `adjust_regex()` (line 372) to transform the user-provided line pattern.
|
|
55
|
+
|
|
56
|
+
The `adjust_regex()` function (in `/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/operations/util/files.py`, lines 200-216):
|
|
57
|
+
```python
|
|
58
|
+
def adjust_regex(line: str, escape_regex_characters: bool) -> str:
|
|
59
|
+
"""
|
|
60
|
+
Ensure the regex starts with '^' and ends with '$' and escape regex characters if requested
|
|
61
|
+
"""
|
|
62
|
+
match_line = line
|
|
63
|
+
|
|
64
|
+
if escape_regex_characters:
|
|
65
|
+
match_line = re.sub(r"([\.\\\+\*\?\[\^\]\$\(\)\{\}\-])", r"\\\1", match_line)
|
|
66
|
+
|
|
67
|
+
# Ensure we're matching a whole line, note: match may be a partial line so we
|
|
68
|
+
# put any matches on either side.
|
|
69
|
+
if not match_line.startswith("^"):
|
|
70
|
+
match_line = "^.*{0}".format(match_line)
|
|
71
|
+
if not match_line.endswith("$"):
|
|
72
|
+
match_line = "{0}.*$".format(match_line)
|
|
73
|
+
|
|
74
|
+
return match_line
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
3. **Historical Bug Context:**
|
|
78
|
+
|
|
79
|
+
Based on the original report's grep output `^.*.+PasswordAuthentication.+.*$`, it appears the old code was incorrectly inserting `^.*.+` at the beginning regardless of the pattern contents. This has been fixed in the current implementation which simply prepends `^.*` (without `.+`).
|
|
80
|
+
|
|
81
|
+
### Current Behavior Analysis
|
|
82
|
+
|
|
83
|
+
For the input `line="PasswordAuthentication .+"`:
|
|
84
|
+
- Current code produces: `^.*PasswordAuthentication .+.*$`
|
|
85
|
+
- This regex will match any line containing "PasswordAuthentication " followed by one or more characters
|
|
86
|
+
|
|
87
|
+
The current implementation **appears correct** for the reported issue.
|
|
88
|
+
|
|
89
|
+
### Remaining Concerns
|
|
90
|
+
|
|
91
|
+
As noted in the second comment by "bad", there are still potential optimization issues:
|
|
92
|
+
|
|
93
|
+
1. **Unnecessary `^.*` prefix:** Adding `^.*` serves no purpose in grep matching and causes excessive backtracking, slowing down pattern matching on large files.
|
|
94
|
+
|
|
95
|
+
2. **Unnecessary `.*$` suffix:** This is also redundant since grep already matches partial lines by default.
|
|
96
|
+
|
|
97
|
+
These are performance concerns rather than correctness issues.
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Current Status Assessment
|
|
102
|
+
|
|
103
|
+
Based on the investigation, **the original bug appears to have been fixed** in the current 3.x codebase. The `adjust_regex()` function now correctly prepends `^.*` (without the erroneous `.+`) and appends `.*$`.
|
|
104
|
+
|
|
105
|
+
However, there are two perspectives on whether the issue should be closed:
|
|
106
|
+
|
|
107
|
+
### Option 1: Close as Fixed
|
|
108
|
+
The original reported behavior (`.+` being incorrectly inserted) is no longer present.
|
|
109
|
+
|
|
110
|
+
### Option 2: Address Performance Concerns
|
|
111
|
+
While functionally correct, the regex transformation adds unnecessary overhead:
|
|
112
|
+
- `^.*` causes backtracking in grep
|
|
113
|
+
- `.*$` is redundant
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Proposed Fix (Performance Optimization)
|
|
118
|
+
|
|
119
|
+
If the decision is to address the performance concerns raised in the comments, the `adjust_regex()` function could be simplified:
|
|
120
|
+
|
|
121
|
+
### Current Code (`/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/operations/util/files.py`):
|
|
122
|
+
```python
|
|
123
|
+
def adjust_regex(line: str, escape_regex_characters: bool) -> str:
|
|
124
|
+
"""
|
|
125
|
+
Ensure the regex starts with '^' and ends with '$' and escape regex characters if requested
|
|
126
|
+
"""
|
|
127
|
+
match_line = line
|
|
128
|
+
|
|
129
|
+
if escape_regex_characters:
|
|
130
|
+
match_line = re.sub(r"([\.\\\+\*\?\[\^\]\$\(\)\{\}\-])", r"\\\1", match_line)
|
|
131
|
+
|
|
132
|
+
# Ensure we're matching a whole line, note: match may be a partial line so we
|
|
133
|
+
# put any matches on either side.
|
|
134
|
+
if not match_line.startswith("^"):
|
|
135
|
+
match_line = "^.*{0}".format(match_line)
|
|
136
|
+
if not match_line.endswith("$"):
|
|
137
|
+
match_line = "{0}.*$".format(match_line)
|
|
138
|
+
|
|
139
|
+
return match_line
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Proposed Optimized Code:
|
|
143
|
+
```python
|
|
144
|
+
def adjust_regex(line: str, escape_regex_characters: bool) -> str:
|
|
145
|
+
"""
|
|
146
|
+
Ensure the regex matches a whole line and escape regex characters if requested.
|
|
147
|
+
|
|
148
|
+
The pattern is wrapped to ensure it matches complete lines, not partial matches
|
|
149
|
+
within a line.
|
|
150
|
+
"""
|
|
151
|
+
match_line = line
|
|
152
|
+
|
|
153
|
+
if escape_regex_characters:
|
|
154
|
+
match_line = re.sub(r"([\.\\\+\*\?\[\^\]\$\(\)\{\}\-])", r"\\\1", match_line)
|
|
155
|
+
|
|
156
|
+
# Ensure we're matching a whole line by anchoring at start and end.
|
|
157
|
+
# Note: We only add anchors, not wildcards, since grep already matches
|
|
158
|
+
# partial lines and adding ^.* causes unnecessary backtracking.
|
|
159
|
+
if not match_line.startswith("^"):
|
|
160
|
+
match_line = "^{0}".format(match_line)
|
|
161
|
+
if not match_line.endswith("$"):
|
|
162
|
+
match_line = "{0}$".format(match_line)
|
|
163
|
+
|
|
164
|
+
return match_line
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**IMPORTANT:** This change would alter the matching behavior:
|
|
168
|
+
- Current: `PasswordAuthentication .+` becomes `^.*PasswordAuthentication .+.*$` (matches line containing the pattern anywhere)
|
|
169
|
+
- Proposed: `PasswordAuthentication .+` becomes `^PasswordAuthentication .+$` (matches line starting with the pattern)
|
|
170
|
+
|
|
171
|
+
This is a **breaking change** and may not be desirable. The docstring for `files.line` states:
|
|
172
|
+
> "Unless line matches a line (starts with ^, ends $), pyinfra will wrap it such that it does, like: `^.*LINE.*$`. This means we don't swap parts of lines out."
|
|
173
|
+
|
|
174
|
+
So the current behavior is **intentional** to support matching partial lines. The performance cost is a documented trade-off for flexibility.
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Related Files
|
|
179
|
+
|
|
180
|
+
1. **Operation definition:** `/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/operations/files.py` (lines 278-475)
|
|
181
|
+
2. **Regex adjustment utility:** `/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/operations/util/files.py` (lines 200-216)
|
|
182
|
+
3. **FindInFile fact (grep execution):** `/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/facts/files.py` (lines 423-456)
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## Recommendations
|
|
187
|
+
|
|
188
|
+
1. **Confirm the original bug is fixed:** The core issue (`.+` being inserted incorrectly) appears resolved.
|
|
189
|
+
|
|
190
|
+
2. **Decision needed on performance optimization:**
|
|
191
|
+
- If keeping current behavior (partial line matching with `^.*...*$`), document that this is intentional
|
|
192
|
+
- If changing to strict anchoring (`^...$`), this is a breaking change requiring a major version bump or deprecation period
|
|
193
|
+
|
|
194
|
+
3. **Consider closing the issue** with a note that:
|
|
195
|
+
- The original regex insertion bug is fixed
|
|
196
|
+
- The `^.*` and `.*$` wrapping is intentional per the documented behavior
|
|
197
|
+
- Users who want exact line matching should use explicit `^` and `$` anchors in their patterns
|
|
198
|
+
|
|
199
|
+
4. **Update documentation** to clarify the performance implications of the default partial-line matching behavior and recommend explicit anchors for performance-critical use cases.
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
# GitHub Issue #1026: operations.apt.packages shows "SUCCESS/Changed" for packages that are already installed in some cases
|
|
2
|
+
|
|
3
|
+
**Issue URL:** https://github.com/pyinfra-dev/pyinfra/issues/1026
|
|
4
|
+
**Status:** Open
|
|
5
|
+
**Reporter:** @stone-w4tch3r
|
|
6
|
+
**Labels:** bug
|
|
7
|
+
**Created:** November 6, 2023
|
|
8
|
+
|
|
9
|
+
## Issue Summary
|
|
10
|
+
|
|
11
|
+
When using `apt.packages` with package names that are "aliases" (i.e., virtual packages or packages that resolve to different actual package names), pyinfra incorrectly reports "SUCCESS/Changed" on every run, even when the package is already installed.
|
|
12
|
+
|
|
13
|
+
### Reproduction Steps
|
|
14
|
+
|
|
15
|
+
1. Run Ubuntu/Debian VM
|
|
16
|
+
2. Run pyinfra with:
|
|
17
|
+
```python
|
|
18
|
+
from pyinfra.operations import apt
|
|
19
|
+
|
|
20
|
+
apt.update(_sudo=True, cache_time=86400)
|
|
21
|
+
apt.packages(_sudo=True, packages=['fortune'])
|
|
22
|
+
```
|
|
23
|
+
3. Run again - pyinfra reports "Changed: 1" even though the package was already installed
|
|
24
|
+
|
|
25
|
+
### The Problem
|
|
26
|
+
|
|
27
|
+
APT has a concept of package aliases/virtual packages. When you request `fortune`, APT resolves it to `fortune-mod`:
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
sudo apt install fortune -y
|
|
31
|
+
Reading package lists... Done
|
|
32
|
+
Building dependency tree
|
|
33
|
+
Reading state information... Done
|
|
34
|
+
Note, selecting 'fortune-mod' instead of 'fortune' # <-- THIS
|
|
35
|
+
fortune-mod is already the newest version (1:1.99.1-7build1).
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
pyinfra's `DebPackages` fact uses `dpkg -l` to list installed packages, which only shows the real package name (`fortune-mod`), not the alias (`fortune`). When the operation checks if `fortune` is installed, it doesn't find it because only `fortune-mod` is in the installed packages list.
|
|
39
|
+
|
|
40
|
+
## Root Cause Analysis
|
|
41
|
+
|
|
42
|
+
### Current Code Flow
|
|
43
|
+
|
|
44
|
+
1. **`apt.packages` operation** (`/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/operations/apt.py`, lines 398-496):
|
|
45
|
+
- Calls `ensure_packages()` with the list of packages and current installed packages from `DebPackages` fact
|
|
46
|
+
|
|
47
|
+
2. **`DebPackages` fact** (`/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/facts/deb.py`, lines 30-58):
|
|
48
|
+
- Uses `dpkg -l` command to get installed packages
|
|
49
|
+
- Returns dict of `{package_name: [versions]}`
|
|
50
|
+
- Only knows about **actual** package names, not aliases
|
|
51
|
+
|
|
52
|
+
3. **`ensure_packages` utility** (`/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/operations/util/packaging.py`, lines 136-231):
|
|
53
|
+
- Takes an `expand_package_fact` parameter that can resolve package names to their actual counterparts
|
|
54
|
+
- Uses `_has_package()` function to check if a package is installed
|
|
55
|
+
- **APT operations do NOT use `expand_package_fact`** - this is the root cause
|
|
56
|
+
|
|
57
|
+
### How Pacman Solved This
|
|
58
|
+
|
|
59
|
+
The pacman package manager has the same problem with groups and virtual packages. pyinfra solves it with:
|
|
60
|
+
|
|
61
|
+
1. **`PacmanUnpackGroup` fact** (`/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/facts/pacman.py`, lines 14-39):
|
|
62
|
+
```python
|
|
63
|
+
class PacmanUnpackGroup(FactBase):
|
|
64
|
+
def command(self, package):
|
|
65
|
+
return 'pacman -S --print-format "%n" {0} || true'.format(shlex.quote(package))
|
|
66
|
+
```
|
|
67
|
+
This resolves package aliases/groups to their actual package names.
|
|
68
|
+
|
|
69
|
+
2. **pacman.packages operation** (`/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/operations/pacman.py`, lines 74-82):
|
|
70
|
+
```python
|
|
71
|
+
yield from ensure_packages(
|
|
72
|
+
host,
|
|
73
|
+
packages,
|
|
74
|
+
host.get_fact(PacmanPackages),
|
|
75
|
+
present,
|
|
76
|
+
install_command="pacman --noconfirm -S",
|
|
77
|
+
uninstall_command="pacman --noconfirm -R",
|
|
78
|
+
expand_package_fact=lambda package: host.get_fact(PacmanUnpackGroup, package=package),
|
|
79
|
+
)
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### The Missing Piece for APT
|
|
83
|
+
|
|
84
|
+
The `apt.packages` operation does NOT pass an `expand_package_fact` parameter:
|
|
85
|
+
|
|
86
|
+
```python
|
|
87
|
+
# Current code in apt.py (line 486-496)
|
|
88
|
+
yield from ensure_packages(
|
|
89
|
+
host,
|
|
90
|
+
packages,
|
|
91
|
+
host.get_fact(DebPackages),
|
|
92
|
+
present,
|
|
93
|
+
install_command=noninteractive_apt(install_command, force=force),
|
|
94
|
+
uninstall_command=noninteractive_apt(uninstall_command, force=force),
|
|
95
|
+
upgrade_command=noninteractive_apt(upgrade_command, force=force),
|
|
96
|
+
version_join="=",
|
|
97
|
+
latest=latest,
|
|
98
|
+
)
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Proposed Fix
|
|
102
|
+
|
|
103
|
+
### 1. Create a new `DebResolvePackage` fact
|
|
104
|
+
|
|
105
|
+
Add to `/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/facts/deb.py`:
|
|
106
|
+
|
|
107
|
+
```python
|
|
108
|
+
class DebResolvePackage(FactBase):
|
|
109
|
+
"""
|
|
110
|
+
Resolves a package name (which may be an alias/virtual package) to the actual
|
|
111
|
+
package name(s) that would be installed by apt.
|
|
112
|
+
|
|
113
|
+
Returns a list of package names, or the original package if resolution fails.
|
|
114
|
+
"""
|
|
115
|
+
|
|
116
|
+
@override
|
|
117
|
+
def requires_command(self, package) -> str:
|
|
118
|
+
return "apt-cache"
|
|
119
|
+
|
|
120
|
+
default = list
|
|
121
|
+
|
|
122
|
+
@override
|
|
123
|
+
def command(self, package):
|
|
124
|
+
# apt-cache show will show the resolved package info
|
|
125
|
+
# Use apt-get --simulate install to see what would actually be installed
|
|
126
|
+
# The -qq flag minimizes output, and we parse the "Inst" lines
|
|
127
|
+
return (
|
|
128
|
+
"apt-get -qq --simulate install {0} 2>/dev/null | "
|
|
129
|
+
"grep -oP '^Inst \\K[^ ]+' || echo {0}"
|
|
130
|
+
).format(shlex.quote(package))
|
|
131
|
+
|
|
132
|
+
@override
|
|
133
|
+
def process(self, output):
|
|
134
|
+
# Return list of package names that would be installed
|
|
135
|
+
# Filter out empty lines
|
|
136
|
+
packages = [line.strip() for line in output if line.strip()]
|
|
137
|
+
return packages if packages else []
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
**Alternative approach using `apt-cache`:**
|
|
141
|
+
|
|
142
|
+
```python
|
|
143
|
+
class DebResolvePackage(FactBase):
|
|
144
|
+
"""
|
|
145
|
+
Resolves a package name (which may be an alias/virtual package) to the actual
|
|
146
|
+
package name(s) that would be installed by apt.
|
|
147
|
+
"""
|
|
148
|
+
|
|
149
|
+
@override
|
|
150
|
+
def requires_command(self, package) -> str:
|
|
151
|
+
return "apt-cache"
|
|
152
|
+
|
|
153
|
+
default = list
|
|
154
|
+
|
|
155
|
+
@override
|
|
156
|
+
def command(self, package):
|
|
157
|
+
# apt-cache policy shows the resolved package name
|
|
158
|
+
# For virtual packages, it shows what provides them
|
|
159
|
+
return "apt-cache policy {0} 2>/dev/null | head -1 | cut -d: -f1".format(
|
|
160
|
+
shlex.quote(package)
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
@override
|
|
164
|
+
def process(self, output):
|
|
165
|
+
result = []
|
|
166
|
+
for line in output:
|
|
167
|
+
line = line.strip()
|
|
168
|
+
if line:
|
|
169
|
+
result.append(line)
|
|
170
|
+
return result
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**Recommended approach using `apt-cache showpkg`** (as suggested in GitHub comment):
|
|
174
|
+
|
|
175
|
+
```python
|
|
176
|
+
class DebResolvePackage(FactBase):
|
|
177
|
+
"""
|
|
178
|
+
Resolves a package name (which may be an alias/virtual package) to the actual
|
|
179
|
+
package name(s) that would be installed by apt.
|
|
180
|
+
|
|
181
|
+
For virtual packages like 'fortune', this returns the real package name(s)
|
|
182
|
+
that provide the virtual package (e.g., 'fortune-mod').
|
|
183
|
+
"""
|
|
184
|
+
|
|
185
|
+
@override
|
|
186
|
+
def requires_command(self, package) -> str:
|
|
187
|
+
return "apt-cache"
|
|
188
|
+
|
|
189
|
+
default = list
|
|
190
|
+
|
|
191
|
+
@override
|
|
192
|
+
def command(self, package):
|
|
193
|
+
# apt-cache showpkg shows reverse provides which tells us what packages
|
|
194
|
+
# provide a virtual package. We check if it's a real package first,
|
|
195
|
+
# and if not, look for providers.
|
|
196
|
+
return (
|
|
197
|
+
"if apt-cache show {0} >/dev/null 2>&1; then "
|
|
198
|
+
"echo {0}; "
|
|
199
|
+
"else "
|
|
200
|
+
"apt-cache showpkg {0} 2>/dev/null | "
|
|
201
|
+
"awk '/^Reverse Provides:/{{flag=1; next}} flag && NF{{print $1}}'; "
|
|
202
|
+
"fi"
|
|
203
|
+
).format(shlex.quote(package))
|
|
204
|
+
|
|
205
|
+
@override
|
|
206
|
+
def process(self, output):
|
|
207
|
+
packages = [line.strip() for line in output if line.strip()]
|
|
208
|
+
return packages if packages else []
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### 2. Update apt.packages to use the new fact
|
|
212
|
+
|
|
213
|
+
Modify `/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/operations/apt.py`:
|
|
214
|
+
|
|
215
|
+
```python
|
|
216
|
+
# Add import at top
|
|
217
|
+
from pyinfra.facts.deb import DebPackage, DebPackages, DebResolvePackage
|
|
218
|
+
|
|
219
|
+
# Update ensure_packages call (around line 486)
|
|
220
|
+
yield from ensure_packages(
|
|
221
|
+
host,
|
|
222
|
+
packages,
|
|
223
|
+
host.get_fact(DebPackages),
|
|
224
|
+
present,
|
|
225
|
+
install_command=noninteractive_apt(install_command, force=force),
|
|
226
|
+
uninstall_command=noninteractive_apt(uninstall_command, force=force),
|
|
227
|
+
upgrade_command=noninteractive_apt(upgrade_command, force=force),
|
|
228
|
+
version_join="=",
|
|
229
|
+
latest=latest,
|
|
230
|
+
expand_package_fact=lambda package: host.get_fact(DebResolvePackage, package=package),
|
|
231
|
+
)
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### 3. Add tests
|
|
235
|
+
|
|
236
|
+
Create test cases in `/Users/nick/Dev/Webroot/pyinfra/src/tests/`:
|
|
237
|
+
|
|
238
|
+
```python
|
|
239
|
+
# Test for the new fact
|
|
240
|
+
def test_deb_resolve_package_virtual():
|
|
241
|
+
"""Test that virtual packages are resolved to their providers."""
|
|
242
|
+
# Test with a known virtual package like 'fortune' -> 'fortune-mod'
|
|
243
|
+
pass
|
|
244
|
+
|
|
245
|
+
def test_deb_resolve_package_real():
|
|
246
|
+
"""Test that real packages resolve to themselves."""
|
|
247
|
+
pass
|
|
248
|
+
|
|
249
|
+
# Test for the operation
|
|
250
|
+
def test_apt_packages_virtual_package_already_installed():
|
|
251
|
+
"""Test that apt.packages doesn't report changes for already-installed virtual packages."""
|
|
252
|
+
pass
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
## Implementation Notes
|
|
256
|
+
|
|
257
|
+
### Choice of apt command
|
|
258
|
+
|
|
259
|
+
Several options were discussed in the GitHub comments:
|
|
260
|
+
|
|
261
|
+
1. **`apt-cache showpkg`** - Shows package information including "Reverse Provides" which lists what packages provide a virtual package
|
|
262
|
+
2. **`apt-file`** - Can find which package provides a file (overkill for this use case)
|
|
263
|
+
3. **`apt-get --simulate install`** - Shows exactly what would be installed
|
|
264
|
+
|
|
265
|
+
The recommended approach is `apt-cache showpkg` because:
|
|
266
|
+
- It's available on all Debian/Ubuntu systems with apt
|
|
267
|
+
- It directly shows the "Reverse Provides" relationship
|
|
268
|
+
- It doesn't require simulating an install (faster)
|
|
269
|
+
|
|
270
|
+
### Edge Cases to Consider
|
|
271
|
+
|
|
272
|
+
1. **Multiple providers**: A virtual package might have multiple providers. The current implementation would need to check if ANY of them is installed.
|
|
273
|
+
2. **Version-specific aliases**: Some package aliases might be version-specific.
|
|
274
|
+
3. **Architecture-specific packages**: Packages like `libc6:amd64` need proper handling.
|
|
275
|
+
4. **Transitional packages**: Packages that exist but recommend/depend on their successor.
|
|
276
|
+
|
|
277
|
+
### Performance Considerations
|
|
278
|
+
|
|
279
|
+
Using `expand_package_fact` will result in additional fact-gathering for each package. This is the same approach used by pacman and is acceptable. The facts are memoized, so repeated calls for the same package don't result in extra commands.
|
|
280
|
+
|
|
281
|
+
## Related Files
|
|
282
|
+
|
|
283
|
+
| File Path | Purpose |
|
|
284
|
+
|-----------|---------|
|
|
285
|
+
| `/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/operations/apt.py` | APT operations including `apt.packages` |
|
|
286
|
+
| `/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/facts/deb.py` | DEB package facts - needs new `DebResolvePackage` fact |
|
|
287
|
+
| `/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/operations/util/packaging.py` | `ensure_packages` utility that supports `expand_package_fact` |
|
|
288
|
+
| `/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/operations/pacman.py` | Reference implementation using `expand_package_fact` |
|
|
289
|
+
| `/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/facts/pacman.py` | Reference `PacmanUnpackGroup` fact |
|
|
290
|
+
|
|
291
|
+
## Conclusion
|
|
292
|
+
|
|
293
|
+
The issue occurs because pyinfra's APT package management doesn't resolve package aliases/virtual packages to their actual names before checking if they're installed. The fix requires:
|
|
294
|
+
|
|
295
|
+
1. Creating a new `DebResolvePackage` fact that uses `apt-cache showpkg` to resolve package names
|
|
296
|
+
2. Updating `apt.packages` to pass the new fact as `expand_package_fact` to `ensure_packages`
|
|
297
|
+
3. Adding appropriate tests
|
|
298
|
+
|
|
299
|
+
This mirrors the existing solution for pacman packages and leverages the already-implemented `expand_package_fact` parameter in `ensure_packages()`.
|