pyinfra 3.5.1__tar.gz → 3.6__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.
Files changed (1321) hide show
  1. {pyinfra-3.5.1 → pyinfra-3.6}/.github/workflows/test.yml +16 -9
  2. {pyinfra-3.5.1 → pyinfra-3.6}/CHANGELOG.md +50 -0
  3. {pyinfra-3.5.1 → pyinfra-3.6}/PKG-INFO +2 -1
  4. {pyinfra-3.5.1 → pyinfra-3.6}/docs/api/connectors.md +55 -1
  5. {pyinfra-3.5.1 → pyinfra-3.6}/docs/api/index.rst +1 -1
  6. {pyinfra-3.5.1 → pyinfra-3.6}/docs/cli.md +2 -2
  7. {pyinfra-3.5.1 → pyinfra-3.6}/docs/compatibility.md +2 -3
  8. {pyinfra-3.5.1 → pyinfra-3.6}/docs/conf.py +34 -0
  9. {pyinfra-3.5.1 → pyinfra-3.6}/docs/connectors.rst +8 -0
  10. {pyinfra-3.5.1 → pyinfra-3.6}/docs/contributing.md +2 -2
  11. pyinfra-3.6/docs/facts.rst +102 -0
  12. {pyinfra-3.5.1 → pyinfra-3.6}/docs/faq.rst +4 -0
  13. {pyinfra-3.5.1 → pyinfra-3.6}/docs/getting-started.rst +18 -4
  14. pyinfra-3.6/docs/operations.rst +73 -0
  15. {pyinfra-3.5.1 → pyinfra-3.6}/docs/using-operations.rst +38 -10
  16. {pyinfra-3.5.1 → pyinfra-3.6}/docs/utils.py +2 -2
  17. pyinfra-3.6/pyinfra-metadata-schema-1.0.0.json +57 -0
  18. pyinfra-3.6/pyinfra-metadata.toml +550 -0
  19. {pyinfra-3.5.1 → pyinfra-3.6}/pyproject.toml +3 -2
  20. pyinfra-3.6/scripts/build-public-docs.sh +61 -0
  21. {pyinfra-3.5.1 → pyinfra-3.6}/scripts/generate_arguments_doc.py +1 -0
  22. {pyinfra-3.5.1 → pyinfra-3.6}/scripts/generate_facts_docs.py +1 -1
  23. {pyinfra-3.5.1 → pyinfra-3.6}/scripts/generate_operations_docs.py +1 -1
  24. {pyinfra-3.5.1 → pyinfra-3.6}/scripts/make_github_release.py +1 -1
  25. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/api/__init__.py +1 -0
  26. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/api/arguments.py +7 -0
  27. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/api/exceptions.py +6 -0
  28. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/api/facts.py +17 -1
  29. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/api/host.py +3 -0
  30. pyinfra-3.6/src/pyinfra/api/metadata.py +69 -0
  31. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/api/operations.py +3 -3
  32. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/api/util.py +22 -5
  33. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/connectors/docker.py +25 -1
  34. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/connectors/ssh.py +57 -0
  35. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/connectors/util.py +16 -9
  36. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/crontab.py +7 -7
  37. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/files.py +1 -2
  38. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/npm.py +1 -1
  39. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/server.py +18 -2
  40. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/apk.py +2 -1
  41. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/apt.py +15 -7
  42. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/brew.py +1 -0
  43. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/crontab.py +4 -1
  44. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/dnf.py +4 -1
  45. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/docker.py +62 -16
  46. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/files.py +87 -12
  47. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/flatpak.py +1 -0
  48. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/gem.py +1 -0
  49. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/git.py +1 -0
  50. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/iptables.py +1 -0
  51. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/lxd.py +1 -0
  52. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/mysql.py +1 -0
  53. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/opkg.py +2 -1
  54. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/pacman.py +1 -0
  55. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/pip.py +1 -0
  56. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/pipx.py +1 -0
  57. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/pkg.py +1 -0
  58. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/pkgin.py +1 -0
  59. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/postgres.py +1 -0
  60. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/puppet.py +1 -0
  61. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/python.py +1 -0
  62. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/selinux.py +1 -0
  63. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/server.py +1 -0
  64. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/snap.py +2 -1
  65. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/ssh.py +1 -0
  66. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/systemd.py +1 -0
  67. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/sysvinit.py +2 -1
  68. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/util/docker.py +164 -8
  69. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/util/packaging.py +2 -0
  70. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/xbps.py +1 -0
  71. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/yum.py +4 -1
  72. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/zfs.py +1 -0
  73. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/zypper.py +1 -0
  74. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra_cli/cli.py +13 -0
  75. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/npm.NpmPackages/local_packages.json +1 -1
  76. pyinfra-3.6/tests/facts/server.TmpDir/default_fallback.json +5 -0
  77. pyinfra-3.6/tests/facts/server.TmpDir/temp_set.json +5 -0
  78. pyinfra-3.6/tests/facts/server.TmpDir/tmp_set.json +5 -0
  79. pyinfra-3.6/tests/facts/server.TmpDir/tmpdir_set.json +5 -0
  80. pyinfra-3.6/tests/operations/apt.packages/update_cached_tz.json +17 -0
  81. pyinfra-3.6/tests/operations/docker.container/add_container_with_labels.json +19 -0
  82. pyinfra-3.6/tests/operations/docker.image/force_pull_image.json +27 -0
  83. pyinfra-3.6/tests/operations/docker.image/image_from_github_registry_exists.json +26 -0
  84. pyinfra-3.6/tests/operations/docker.image/image_with_digest_exists.json +24 -0
  85. pyinfra-3.6/tests/operations/docker.image/image_with_digest_not_exists.json +15 -0
  86. pyinfra-3.6/tests/operations/docker.image/image_with_latest_tag_always_pull.json +27 -0
  87. pyinfra-3.6/tests/operations/docker.image/image_with_specific_tag_exists.json +26 -0
  88. pyinfra-3.6/tests/operations/docker.image/image_with_specific_tag_not_exists.json +15 -0
  89. pyinfra-3.6/tests/operations/docker.image/image_with_tag_and_digest.json +16 -0
  90. pyinfra-3.6/tests/operations/docker.image/image_with_tag_and_digest_different_digest.json +15 -0
  91. pyinfra-3.6/tests/operations/docker.image/image_with_tag_and_digest_different_tag.json +26 -0
  92. pyinfra-3.6/tests/operations/docker.image/image_without_tag_always_pull.json +27 -0
  93. pyinfra-3.6/tests/operations/docker.image/pull_image_from_private_registry.json +15 -0
  94. pyinfra-3.6/tests/operations/docker.image/remove_existing_image.json +26 -0
  95. pyinfra-3.6/tests/operations/docker.image/remove_nonexistent_image.json +13 -0
  96. pyinfra-3.6/tests/operations/files.block/add_existing_block_different_content.json +24 -0
  97. pyinfra-3.6/tests/operations/files.block/add_existing_block_different_content_and_backup.json +25 -0
  98. pyinfra-3.6/tests/operations/files.block/add_existing_block_different_content_multiple_lines.json +28 -0
  99. pyinfra-3.6/tests/operations/files.block/add_no_existing_block_and_no_line.json +22 -0
  100. pyinfra-3.6/tests/operations/files.block/add_no_existing_block_line_provided.json +22 -0
  101. pyinfra-3.6/tests/operations/files.block/add_no_existing_block_line_provided_escape_regex.json +23 -0
  102. pyinfra-3.6/tests/operations/files.block/add_no_existing_file.json +22 -0
  103. pyinfra-3.6/tests/operations/files.block/remove_but_content_not_none.json +23 -0
  104. pyinfra-3.6/tests/operations/files.block/remove_existing_block.json +22 -0
  105. pyinfra-3.6/tests/operations/files.copy/copies_directory.json +22 -0
  106. pyinfra-3.6/tests/operations/files.copy/copies_directory_overwriting.json +21 -0
  107. pyinfra-3.6/tests/operations/files.copy/copies_file.json +19 -0
  108. pyinfra-3.6/tests/operations/files.copy/copies_file_overwriting.json +19 -0
  109. pyinfra-3.6/tests/operations/files.copy/invalid_dest.json +21 -0
  110. pyinfra-3.6/tests/operations/files.copy/invalid_overwrite.json +26 -0
  111. pyinfra-3.6/tests/operations/files.copy/invalid_src.json +21 -0
  112. pyinfra-3.6/tests/operations/files.copy/noop_dest_file_exists.json +24 -0
  113. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/test_cli.py +1 -0
  114. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_connectors/test_docker.py +50 -0
  115. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_connectors/test_ssh.py +89 -0
  116. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_facts.py +3 -1
  117. pyinfra-3.6/tests/test_operations_utils.py +297 -0
  118. {pyinfra-3.5.1 → pyinfra-3.6}/tests/util.py +3 -0
  119. pyinfra-3.6/uv.lock +1931 -0
  120. pyinfra-3.5.1/docs/facts.rst +0 -60
  121. pyinfra-3.5.1/docs/operations.rst +0 -56
  122. pyinfra-3.5.1/scripts/build-public-docs.sh +0 -37
  123. pyinfra-3.5.1/tests/operations/crontab.crontab/edit_existing_with_newline.json +0 -26
  124. pyinfra-3.5.1/tests/operations/docker.image/pull_image.json +0 -12
  125. pyinfra-3.5.1/tests/operations/docker.image/remove_image.json +0 -12
  126. pyinfra-3.5.1/tests/operations/files.block/add_existing_block_different_content.json +0 -17
  127. pyinfra-3.5.1/tests/operations/files.block/add_existing_block_different_content_and_backup.json +0 -18
  128. pyinfra-3.5.1/tests/operations/files.block/add_existing_block_different_content_multiple_lines.json +0 -17
  129. pyinfra-3.5.1/tests/operations/files.block/add_no_existing_block_and_no_line.json +0 -17
  130. pyinfra-3.5.1/tests/operations/files.block/add_no_existing_block_line_provided.json +0 -17
  131. pyinfra-3.5.1/tests/operations/files.block/add_no_existing_block_line_provided_escape_regex.json +0 -18
  132. pyinfra-3.5.1/tests/operations/files.block/add_no_existing_file.json +0 -17
  133. pyinfra-3.5.1/tests/operations/files.block/remove_but_content_not_none.json +0 -16
  134. pyinfra-3.5.1/tests/operations/files.block/remove_existing_block.json +0 -15
  135. pyinfra-3.5.1/tests/test_operations_utils.py +0 -17
  136. pyinfra-3.5.1/uv.lock +0 -1683
  137. {pyinfra-3.5.1 → pyinfra-3.6}/.editorconfig +0 -0
  138. {pyinfra-3.5.1 → pyinfra-3.6}/.git-blame-ignore-revs +0 -0
  139. {pyinfra-3.5.1 → pyinfra-3.6}/.github/FUNDING.yml +0 -0
  140. {pyinfra-3.5.1 → pyinfra-3.6}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  141. {pyinfra-3.5.1 → pyinfra-3.6}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  142. {pyinfra-3.5.1 → pyinfra-3.6}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  143. {pyinfra-3.5.1 → pyinfra-3.6}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  144. {pyinfra-3.5.1 → pyinfra-3.6}/.github/workflows/docs.yml +0 -0
  145. {pyinfra-3.5.1 → pyinfra-3.6}/.gitignore +0 -0
  146. {pyinfra-3.5.1 → pyinfra-3.6}/.typos.toml +0 -0
  147. {pyinfra-3.5.1 → pyinfra-3.6}/CONTRIBUTING.md +0 -0
  148. {pyinfra-3.5.1 → pyinfra-3.6}/LICENSE.md +0 -0
  149. {pyinfra-3.5.1 → pyinfra-3.6}/README.md +0 -0
  150. {pyinfra-3.5.1 → pyinfra-3.6}/codecov.yml +0 -0
  151. {pyinfra-3.5.1 → pyinfra-3.6}/docs/__init__.py +0 -0
  152. {pyinfra-3.5.1 → pyinfra-3.6}/docs/api/deploys.md +0 -0
  153. {pyinfra-3.5.1 → pyinfra-3.6}/docs/api/facts.md +0 -0
  154. {pyinfra-3.5.1 → pyinfra-3.6}/docs/api/operations.md +0 -0
  155. {pyinfra-3.5.1 → pyinfra-3.6}/docs/api/reference.rst +0 -0
  156. {pyinfra-3.5.1 → pyinfra-3.6}/docs/arguments.rst +0 -0
  157. {pyinfra-3.5.1 → pyinfra-3.6}/docs/changes.rst +0 -0
  158. {pyinfra-3.5.1 → pyinfra-3.6}/docs/deploy-process.rst +0 -0
  159. {pyinfra-3.5.1 → pyinfra-3.6}/docs/examples/client_side_assets.md +0 -0
  160. {pyinfra-3.5.1 → pyinfra-3.6}/docs/examples/data_multiple_environments.md +0 -0
  161. {pyinfra-3.5.1 → pyinfra-3.6}/docs/examples/dynamic_execution_deploy.md +0 -0
  162. {pyinfra-3.5.1 → pyinfra-3.6}/docs/examples/dynamic_inventories_data.md +0 -0
  163. {pyinfra-3.5.1 → pyinfra-3.6}/docs/examples/groups_roles.md +0 -0
  164. {pyinfra-3.5.1 → pyinfra-3.6}/docs/examples/secret_storage.md +0 -0
  165. {pyinfra-3.5.1 → pyinfra-3.6}/docs/examples.rst +0 -0
  166. {pyinfra-3.5.1 → pyinfra-3.6}/docs/index.rst +0 -0
  167. {pyinfra-3.5.1 → pyinfra-3.6}/docs/install.md +0 -0
  168. {pyinfra-3.5.1 → pyinfra-3.6}/docs/inventory-data.rst +0 -0
  169. {pyinfra-3.5.1 → pyinfra-3.6}/docs/performance.rst +0 -0
  170. {pyinfra-3.5.1 → pyinfra-3.6}/docs/static/logo_small.png +0 -0
  171. {pyinfra-3.5.1 → pyinfra-3.6}/docs/static/performance.png +0 -0
  172. {pyinfra-3.5.1 → pyinfra-3.6}/docs/support.md +0 -0
  173. {pyinfra-3.5.1 → pyinfra-3.6}/examples/README.md +0 -0
  174. {pyinfra-3.5.1 → pyinfra-3.6}/scripts/__init__.py +0 -0
  175. {pyinfra-3.5.1 → pyinfra-3.6}/scripts/cleanup_words.py +0 -0
  176. {pyinfra-3.5.1 → pyinfra-3.6}/scripts/dev-lint.sh +0 -0
  177. {pyinfra-3.5.1 → pyinfra-3.6}/scripts/dev-test-e2e.sh +0 -0
  178. {pyinfra-3.5.1 → pyinfra-3.6}/scripts/dev-test.sh +0 -0
  179. {pyinfra-3.5.1 → pyinfra-3.6}/scripts/generate_api_docs.py +0 -0
  180. {pyinfra-3.5.1 → pyinfra-3.6}/scripts/generate_connectors_docs.py +0 -0
  181. {pyinfra-3.5.1 → pyinfra-3.6}/scripts/generate_next_version.py +0 -0
  182. {pyinfra-3.5.1 → pyinfra-3.6}/scripts/generate_redirect_pages.py +0 -0
  183. {pyinfra-3.5.1 → pyinfra-3.6}/scripts/pyinfra-complete.sh +0 -0
  184. {pyinfra-3.5.1 → pyinfra-3.6}/scripts/pyinfra-complete.zsh +0 -0
  185. {pyinfra-3.5.1 → pyinfra-3.6}/scripts/release.sh +0 -0
  186. {pyinfra-3.5.1 → pyinfra-3.6}/scripts/spellcheck.sh +0 -0
  187. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/__init__.py +0 -0
  188. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/__main__.py +0 -0
  189. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/api/arguments_typed.py +0 -0
  190. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/api/command.py +0 -0
  191. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/api/config.py +0 -0
  192. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/api/connect.py +0 -0
  193. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/api/connectors.py +0 -0
  194. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/api/deploy.py +0 -0
  195. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/api/inventory.py +0 -0
  196. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/api/operation.py +0 -0
  197. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/api/state.py +0 -0
  198. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/connectors/__init__.py +0 -0
  199. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/connectors/base.py +0 -0
  200. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/connectors/chroot.py +0 -0
  201. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/connectors/dockerssh.py +0 -0
  202. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/connectors/local.py +0 -0
  203. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/connectors/scp/__init__.py +0 -0
  204. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/connectors/scp/client.py +0 -0
  205. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/connectors/ssh_util.py +0 -0
  206. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/connectors/sshuserclient/__init__.py +0 -0
  207. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/connectors/sshuserclient/client.py +0 -0
  208. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/connectors/sshuserclient/config.py +0 -0
  209. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/connectors/terraform.py +0 -0
  210. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/connectors/vagrant.py +0 -0
  211. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/context.py +0 -0
  212. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/__init__.py +0 -0
  213. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/apk.py +0 -0
  214. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/apt.py +0 -0
  215. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/brew.py +0 -0
  216. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/bsdinit.py +0 -0
  217. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/cargo.py +0 -0
  218. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/choco.py +0 -0
  219. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/deb.py +0 -0
  220. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/dnf.py +0 -0
  221. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/docker.py +0 -0
  222. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/efibootmgr.py +0 -0
  223. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/flatpak.py +0 -0
  224. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/freebsd.py +0 -0
  225. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/gem.py +0 -0
  226. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/git.py +0 -0
  227. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/gpg.py +0 -0
  228. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/hardware.py +0 -0
  229. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/iptables.py +0 -0
  230. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/launchd.py +0 -0
  231. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/lxd.py +0 -0
  232. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/mysql.py +0 -0
  233. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/openrc.py +0 -0
  234. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/opkg.py +0 -0
  235. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/pacman.py +0 -0
  236. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/pip.py +0 -0
  237. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/pipx.py +0 -0
  238. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/pkg.py +0 -0
  239. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/pkgin.py +0 -0
  240. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/podman.py +0 -0
  241. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/postgres.py +0 -0
  242. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/postgresql.py +0 -0
  243. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/rpm.py +0 -0
  244. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/runit.py +0 -0
  245. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/selinux.py +0 -0
  246. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/snap.py +0 -0
  247. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/systemd.py +0 -0
  248. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/sysvinit.py +0 -0
  249. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/upstart.py +0 -0
  250. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/util/__init__.py +0 -0
  251. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/util/databases.py +0 -0
  252. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/util/packaging.py +0 -0
  253. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/util/units.py +0 -0
  254. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/util/win_files.py +0 -0
  255. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/vzctl.py +0 -0
  256. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/xbps.py +0 -0
  257. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/yum.py +0 -0
  258. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/zfs.py +0 -0
  259. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/facts/zypper.py +0 -0
  260. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/local.py +0 -0
  261. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/__init__.py +0 -0
  262. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/bsdinit.py +0 -0
  263. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/cargo.py +0 -0
  264. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/choco.py +0 -0
  265. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/freebsd/__init__.py +0 -0
  266. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/freebsd/freebsd_update.py +0 -0
  267. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/freebsd/pkg.py +0 -0
  268. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/freebsd/service.py +0 -0
  269. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/freebsd/sysrc.py +0 -0
  270. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/launchd.py +0 -0
  271. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/npm.py +0 -0
  272. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/openrc.py +0 -0
  273. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/postgresql.py +0 -0
  274. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/runit.py +0 -0
  275. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/upstart.py +0 -0
  276. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/util/__init__.py +0 -0
  277. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/util/files.py +0 -0
  278. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/util/service.py +0 -0
  279. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/operations/vzctl.py +0 -0
  280. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/progress.py +0 -0
  281. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/py.typed +0 -0
  282. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra/version.py +0 -0
  283. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra_cli/__init__.py +0 -0
  284. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra_cli/commands.py +0 -0
  285. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra_cli/exceptions.py +0 -0
  286. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra_cli/inventory.py +0 -0
  287. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra_cli/log.py +0 -0
  288. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra_cli/main.py +0 -0
  289. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra_cli/prints.py +0 -0
  290. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra_cli/util.py +0 -0
  291. {pyinfra-3.5.1 → pyinfra-3.6}/src/pyinfra_cli/virtualenv.py +0 -0
  292. {pyinfra-3.5.1 → pyinfra-3.6}/tests/__init__.py +0 -0
  293. {pyinfra-3.5.1 → pyinfra-3.6}/tests/end-to-end/conftest.py +0 -0
  294. {pyinfra-3.5.1 → pyinfra-3.6}/tests/end-to-end/test_e2e_docker.py +0 -0
  295. {pyinfra-3.5.1 → pyinfra-3.6}/tests/end-to-end/test_e2e_local.py +0 -0
  296. {pyinfra-3.5.1 → pyinfra-3.6}/tests/end-to-end/test_e2e_podman.py +0 -0
  297. {pyinfra-3.5.1 → pyinfra-3.6}/tests/end-to-end/test_e2e_ssh.py +0 -0
  298. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/apk.ApkPackages/packages.json +0 -0
  299. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/apk.ApkPackages/packages_2.json +0 -0
  300. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/apt.AptKeys/keys.json +0 -0
  301. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/apt.AptSources/component_with_number.json +0 -0
  302. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/apt.AptSources/sources.json +0 -0
  303. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/apt.SimulateOperationWillChange/upgrade-nochanges.json +0 -0
  304. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/apt.SimulateOperationWillChange/upgrade.json +0 -0
  305. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/brew.BrewCasks/casks.json +0 -0
  306. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/brew.BrewPackages/packages.json +0 -0
  307. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/brew.BrewTaps/taps.json +0 -0
  308. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/brew.BrewVersion/bad_output.json +0 -0
  309. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/brew.BrewVersion/version.json +0 -0
  310. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/cargo.CargoPackages/packages.json +0 -0
  311. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/choco.ChocoPackages/packages.json +0 -0
  312. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/choco.ChocoVersion/version.json +0 -0
  313. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/crontab.Crontab/comments.json +0 -0
  314. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/crontab.Crontab/simple.json +0 -0
  315. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/crontab.Crontab/simple_user.json +0 -0
  316. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/deb.DebPackage/package.json +0 -0
  317. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/deb.DebPackage/whitespace.json +0 -0
  318. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/deb.DebPackages/hold_packages.json +0 -0
  319. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/deb.DebPackages/packages.json +0 -0
  320. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/dnf.DnfRepositories/repos-with-spaces.json +0 -0
  321. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/dnf.DnfRepositories/repos.json +0 -0
  322. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/docker.DockerContainer/container.json +0 -0
  323. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/docker.DockerContainers/container.json +0 -0
  324. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/docker.DockerImages/images.json +0 -0
  325. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/docker.DockerPlugin/plugin.json +0 -0
  326. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/docker.DockerPlugins/plugins.json +0 -0
  327. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/efibootmgr.EFIBootMgr/boot_entries.json +0 -0
  328. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/efibootmgr.EFIBootMgr/boot_entries2.json +0 -0
  329. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/efibootmgr.EFIBootMgr/boot_entries_complex.json +0 -0
  330. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/efibootmgr.EFIBootMgr/not_uefi.json +0 -0
  331. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Block/defaults.json +0 -0
  332. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Block/no_markers_found.json +0 -0
  333. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Block/not_found.json +0 -0
  334. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Directory/file.json +0 -0
  335. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Directory/link.json +0 -0
  336. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Directory/ls_fallback.json +0 -0
  337. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Directory/ls_fallback_freebsd.json +0 -0
  338. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Directory/ls_fallback_macos.json +0 -0
  339. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Directory/valid.json +0 -0
  340. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.File/directory.json +0 -0
  341. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.File/invalid_output.json +0 -0
  342. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.File/link.json +0 -0
  343. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.File/ls_fallback.json +0 -0
  344. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.File/ls_fallback_selinux.json +0 -0
  345. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.File/ls_fallback_time.json +0 -0
  346. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.File/mode_setgid_setuid.json +0 -0
  347. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.File/mode_sticky.json +0 -0
  348. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.File/tilde.json +0 -0
  349. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.File/tilde_with_space.json +0 -0
  350. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.File/valid.json +0 -0
  351. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.File/valid_needs_quotes.json +0 -0
  352. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.File/valid_with_space.json +0 -0
  353. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.FileContents/file.json +0 -0
  354. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.FileContents/no_file.json +0 -0
  355. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.FindDirectories/directories.json +0 -0
  356. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.FindFiles/files.json +0 -0
  357. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.FindFiles/files_with_name.json +0 -0
  358. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.FindFiles/files_with_name_wildcard.json +0 -0
  359. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.FindInFile/lines.json +0 -0
  360. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.FindInFile/lines_interpolate.json +0 -0
  361. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.FindInFile/lines_no_interpolate.json +0 -0
  362. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.FindInFile/lines_quote.json +0 -0
  363. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.FindInFile/no_file.json +0 -0
  364. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.FindInFile/no_matches.json +0 -0
  365. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.FindLinks/links.json +0 -0
  366. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Flags/bad_output.json +0 -0
  367. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Flags/no_flags_set.json +0 -0
  368. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Flags/no_output.json +0 -0
  369. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Flags/one_flag_set.json +0 -0
  370. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Flags/too_much_output.json +0 -0
  371. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Flags/two_flags_set.json +0 -0
  372. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Link/directory.json +0 -0
  373. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Link/file.json +0 -0
  374. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Link/ls_fallback.json +0 -0
  375. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Link/valid.json +0 -0
  376. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Link/valid_centos6.json +0 -0
  377. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Md5File/file.json +0 -0
  378. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Md5File/file_bsd_style.json +0 -0
  379. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Md5File/file_needs_quotes.json +0 -0
  380. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Sha1File/file.json +0 -0
  381. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Sha1File/file_bsd_style.json +0 -0
  382. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Sha1File/file_needs_quotes.json +0 -0
  383. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Sha256File/file.json +0 -0
  384. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Sha256File/file_bsd_style.json +0 -0
  385. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Sha256File/file_needs_quotes.json +0 -0
  386. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Sha384File/file.json +0 -0
  387. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Sha384File/file_bsd_style.json +0 -0
  388. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/files.Sha384File/file_needs_quotes.json +0 -0
  389. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/flatpak.FlatpakPackage/kodi.json +0 -0
  390. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/flatpak.FlatpakPackage/not_found.json +0 -0
  391. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/flatpak.FlatpakPackage/vlc.json +0 -0
  392. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/flatpak.FlatpakPackages/packages.json +0 -0
  393. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/freebsd.PkgPackage/package-with-jail.json +0 -0
  394. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/freebsd.PkgPackage/package.json +0 -0
  395. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/freebsd.ServiceScript/found.json +0 -0
  396. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/freebsd.ServiceScript/not-found.json +0 -0
  397. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/freebsd.ServiceStatus/not-running.json +0 -0
  398. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/freebsd.ServiceStatus/running.json +0 -0
  399. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/freebsd.Sysrc/found.json +0 -0
  400. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/freebsd.Sysrc/not-found.json +0 -0
  401. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/gem.GemPackages/packages.json +0 -0
  402. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/git.GitBranch/branch.json +0 -0
  403. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/git.GitConfig/global.json +0 -0
  404. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/git.GitConfig/multi_value.json +0 -0
  405. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/git.GitConfig/repo.json +0 -0
  406. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/git.GitTag/tag.json +0 -0
  407. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/git.GitTrackingBranch/branch.json +0 -0
  408. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/git.GitTrackingBranch/branch_behind.json +0 -0
  409. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/git.GitTrackingBranch/no_branch.json +0 -0
  410. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/gpg.GpgKey/key_from_file.json +0 -0
  411. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/gpg.GpgKey/key_from_url.json +0 -0
  412. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/gpg.GpgKeys/keys.json +0 -0
  413. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/gpg.GpgKeys/keys_keyring.json +0 -0
  414. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/gpg.GpgSecretKeys/keys.json +0 -0
  415. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/gpg.GpgSecretKeys/keys_keyring.json +0 -0
  416. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/hardware.BlockDevices/devices.json +0 -0
  417. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/hardware.Cpus/invalid.json +0 -0
  418. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/hardware.Cpus/valid.json +0 -0
  419. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/hardware.Ipv4Addresses/linux_ip.json +0 -0
  420. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/hardware.Ipv4Addrs/linux_ip_multiple.json +0 -0
  421. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/hardware.Ipv6Addresses/linux_ip.json +0 -0
  422. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/hardware.Ipv6Addrs/linux_ip_multiple.json +0 -0
  423. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/hardware.Memory/vmstat_bsd.json +0 -0
  424. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/hardware.Memory/vmstat_linux.json +0 -0
  425. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/hardware.NetworkDevices/linux_ifconfig.json +0 -0
  426. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/hardware.NetworkDevices/linux_ifconfig_multiple.json +0 -0
  427. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/hardware.NetworkDevices/linux_ip.json +0 -0
  428. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/hardware.NetworkDevices/linux_ip_multiple_addrs.json +0 -0
  429. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/hardware.NetworkDevices/linux_ip_multiple_ifaces.json +0 -0
  430. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/hardware.NetworkDevices/macos_ifconfig.json +0 -0
  431. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/iptables.Ip6tablesChains/chains.json +0 -0
  432. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/iptables.Ip6tablesRules/rules.json +0 -0
  433. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/iptables.IptablesChains/chains.json +0 -0
  434. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/iptables.IptablesRules/rules.json +0 -0
  435. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/launchd.LaunchdStatus/services.json +0 -0
  436. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/lxd.LxdContainers/stripped.json +0 -0
  437. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/mysql.MysqlDatabases/multiple.json +0 -0
  438. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/mysql.MysqlDatabases/multiple_custom_connection.json +0 -0
  439. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/mysql.MysqlUserGrants/multiple.json +0 -0
  440. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/mysql.MysqlUsers/multiple.json +0 -0
  441. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/npm.NpmPackages/packages.json +0 -0
  442. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/openrc.OpenrcEnabled/services.json +0 -0
  443. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/openrc.OpenrcEnabled/services_runlevel.json +0 -0
  444. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/openrc.OpenrcStatus/services.json +0 -0
  445. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/openrc.OpenrcStatus/services_runlevel.json +0 -0
  446. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/opkg.OpkgConf/opkg_conf.json +0 -0
  447. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/opkg.OpkgFeeds/opkg_feeds.json +0 -0
  448. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/opkg.OpkgInstallableArchitectures/opkg_installable_architectures.json +0 -0
  449. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/opkg.OpkgPackages/opkg_packages.json +0 -0
  450. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/opkg.OpkgUpgradeablePackages/opkg_upgradeable_packages.json +0 -0
  451. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/pacman.PacmanPackages/packages.json +0 -0
  452. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/pip.Pip3Packages/packages.json +0 -0
  453. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/pip.PipPackages/packages.json +0 -0
  454. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/pip.PipPackages/packages_pip3.json +0 -0
  455. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/pipx.PipxEnvironment/environment.json +0 -0
  456. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/pipx.PipxPackages/packages.json +0 -0
  457. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/pkg.PkgPackages/packages.json +0 -0
  458. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/pkgin.PkginPackages/packages.json +0 -0
  459. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/podman.PodmanPs/empty.json +0 -0
  460. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/podman.PodmanPs/onecontainer.json +0 -0
  461. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/podman.PodmanSystemInfo/info1.json +0 -0
  462. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/postgresql.PostgresqlDatabases/multiple.json +0 -0
  463. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/postgresql.PostgresqlRoles/multiple.json +0 -0
  464. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/postgresql.PostgresqlRoles/multiple_custom_connection.json +0 -0
  465. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/rpm.RpmPackage/package.json +0 -0
  466. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/rpm.RpmPackageProvides/package.json +0 -0
  467. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/rpm.RpmPackages/packages.json +0 -0
  468. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/runit.RunitManaged/single.json +0 -0
  469. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/runit.RunitManaged/status.json +0 -0
  470. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/runit.RunitStatus/single.json +0 -0
  471. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/runit.RunitStatus/status.json +0 -0
  472. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/selinux.FileContext/file_context.json +0 -0
  473. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/selinux.FileContextMapping/found.json +0 -0
  474. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/selinux.FileContextMapping/not_found.json +0 -0
  475. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/selinux.SEBoolean/get.json +0 -0
  476. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/selinux.SEPort/generic_and_specific.json +0 -0
  477. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/selinux.SEPort/get_bad_port.json +0 -0
  478. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/selinux.SEPort/only_generic.json +0 -0
  479. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/selinux.SEPorts/line_noise_input.json +0 -0
  480. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/selinux.SEPorts/multiple_single_ports.json +0 -0
  481. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/selinux.SEPorts/only_single_port.json +0 -0
  482. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/selinux.SEPorts/port_range.json +0 -0
  483. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/selinux.SEPorts/single_and_range.json +0 -0
  484. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.Arch/arch.json +0 -0
  485. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.Command/command.json +0 -0
  486. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.Date/date.json +0 -0
  487. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.Groups/groups.json +0 -0
  488. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.HasGui/gui_absent.json +0 -0
  489. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.HasGui/gui_present.json +0 -0
  490. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.Home/home.json +0 -0
  491. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.Home/root.json +0 -0
  492. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.Home/some_user.json +0 -0
  493. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.Hostname/hostname.json +0 -0
  494. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.KernelModules/modules.json +0 -0
  495. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.LinuxDistribution/archlinux.json +0 -0
  496. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.LinuxDistribution/centos-6.json +0 -0
  497. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.LinuxDistribution/centos-7.json +0 -0
  498. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.LinuxDistribution/no_match.json +0 -0
  499. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.LinuxDistribution/ubuntu.json +0 -0
  500. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.LinuxGui/gnome_present.json +0 -0
  501. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.LinuxName/ubuntu.json +0 -0
  502. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.Locales +0 -0
  503. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.LsbRelease/release.json +0 -0
  504. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.Mounts/mounts.json +0 -0
  505. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.Os/os.json +0 -0
  506. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.OsVersion/os_version.json +0 -0
  507. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.Port/empty.json +0 -0
  508. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.Port/one-process.json +0 -0
  509. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.Port/two-processes.json +0 -0
  510. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.RebootRequired/alpine_reboot_required.json +0 -0
  511. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.RebootRequired/freebsd_reboot_required.json +0 -0
  512. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.RebootRequired/linux_no_reboot.json +0 -0
  513. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.RebootRequired/linux_reboot_required.json +0 -0
  514. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.SecurityLimits/security_limits.json +0 -0
  515. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.Selinux/no-output.json +0 -0
  516. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.Selinux/selinux.json +0 -0
  517. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.Sysctl/sysctl_linux.json +0 -0
  518. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.Sysctl/sysctl_macos.json +0 -0
  519. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.Users/mixed.json +0 -0
  520. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/server.Which/which.json +0 -0
  521. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/snap.SnapPackage/lxd.json +0 -0
  522. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/snap.SnapPackage/not_found.json +0 -0
  523. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/snap.SnapPackage/snapd.json +0 -0
  524. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/snap.SnapPackage/vlc.json +0 -0
  525. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/snap.SnapPackages/packages.json +0 -0
  526. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/systemd.SystemdEnabled/machine_services.json +0 -0
  527. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/systemd.SystemdEnabled/root_machine_services.json +0 -0
  528. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/systemd.SystemdEnabled/services.json +0 -0
  529. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/systemd.SystemdEnabled/user_machine_services.json +0 -0
  530. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/systemd.SystemdEnabled/user_services.json +0 -0
  531. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/systemd.SystemdStatus/machine_services.json +0 -0
  532. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/systemd.SystemdStatus/root_machine_services.json +0 -0
  533. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/systemd.SystemdStatus/services.json +0 -0
  534. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/systemd.SystemdStatus/services_invalid_output.json +0 -0
  535. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/systemd.SystemdStatus/user_machine_services.json +0 -0
  536. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/systemd.SystemdStatus/user_services.json +0 -0
  537. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/sysvinit.InitdStatus/services.json +0 -0
  538. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/upstart.UpstartStatus/services.json +0 -0
  539. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/vzctl.OpenvzContainers/containers.json +0 -0
  540. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/xbps.XbpsPackages/dot-in-package-name.json +0 -0
  541. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/xbps.XbpsPackages/packages.json +0 -0
  542. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/yum.YumRepositories/repos.json +0 -0
  543. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/zfs.Datasets/datasets.yaml +0 -0
  544. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/zfs.Filesystems/filesystems.yaml +0 -0
  545. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/zfs.Pools/pools.yaml +0 -0
  546. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/zfs.Snapshots/snapshots.yaml +0 -0
  547. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/zfs.Volumes/volumes.yaml +0 -0
  548. {pyinfra-3.5.1 → pyinfra-3.6}/tests/facts/zypper.ZypperRepositories/repos.json +0 -0
  549. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apk.packages/add_packages.json +0 -0
  550. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apk.packages/remove_packages.json +0 -0
  551. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apk.packages/upgrade_packages.json +0 -0
  552. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apk.packages/upgrade_update.json +0 -0
  553. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apk.upgrade/upgrade_available.json +0 -0
  554. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.deb/add.json +0 -0
  555. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.deb/add_existing.json +0 -0
  556. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.deb/download_add.json +0 -0
  557. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.deb/remove_existing.json +0 -0
  558. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.deb/remove_no_exist.json +0 -0
  559. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.dist_upgrade/dist_upgrade.json +0 -0
  560. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.dist_upgrade/dist_upgrade_autoremove.json +0 -0
  561. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.key/add.json +0 -0
  562. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.key/add_exists.json +0 -0
  563. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.key/add_keyserver.json +0 -0
  564. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.key/add_keyserver_exists.json +0 -0
  565. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.key/add_keyserver_multiple.json +0 -0
  566. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.key/add_keyserver_multiple_partial.json +0 -0
  567. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.key/add_keyserver_no_keyid.json +0 -0
  568. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.key/add_no_gpg.json +0 -0
  569. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.key/add_url.json +0 -0
  570. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.packages/add_package.json +0 -0
  571. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.packages/add_package_allow_downgrades.json +0 -0
  572. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.packages/add_package_force.json +0 -0
  573. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.packages/add_package_no_recommends.json +0 -0
  574. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.packages/add_packages.json +0 -0
  575. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.packages/install_with_args.json +0 -0
  576. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.packages/remove_packages.json +0 -0
  577. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.packages/remove_packages_with_args.json +0 -0
  578. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.packages/update_cache_old.json +0 -0
  579. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.packages/update_cached.json +0 -0
  580. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.packages/update_nocache.json +0 -0
  581. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.packages/update_upgrade.json +0 -0
  582. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.packages/upgrade_packages.json +0 -0
  583. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.ppa/add.json +0 -0
  584. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.ppa/remove.json +0 -0
  585. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.repo/add.json +0 -0
  586. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.repo/add_existing.json +0 -0
  587. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.repo/add_filename.json +0 -0
  588. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.repo/remove.json +0 -0
  589. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.upgrade/upgrade.json +0 -0
  590. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/apt.upgrade/upgrade_autoremove.json +0 -0
  591. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/brew.cask_upgrade/new_cli_upgrade.json +0 -0
  592. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/brew.cask_upgrade/old_cli_upgrade.json +0 -0
  593. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/brew.casks/add_casks_upgrade.json +0 -0
  594. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/brew.casks/new_cli_add_casks.json +0 -0
  595. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/brew.casks/old_cli_add_casks.json +0 -0
  596. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/brew.packages/add_packages.json +0 -0
  597. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/brew.packages/remove_packages.json +0 -0
  598. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/brew.packages/upgrade_packages.json +0 -0
  599. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/brew.packages/upgrade_update.json +0 -0
  600. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/brew.tap/add_exists.json +0 -0
  601. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/brew.tap/add_tap.json +0 -0
  602. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/brew.tap/add_tap_bad_url.json +0 -0
  603. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/brew.tap/add_tap_no_args.json +0 -0
  604. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/brew.tap/add_tap_url.json +0 -0
  605. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/brew.tap/add_tap_url_exists.json +0 -0
  606. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/brew.tap/add_tap_url_no_src.json +0 -0
  607. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/brew.tap/remove_no_exists.json +0 -0
  608. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/brew.tap/remove_tap.json +0 -0
  609. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/brew.upgrade/upgrade.json +0 -0
  610. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/bsdinit.service/disabled.json +0 -0
  611. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/bsdinit.service/enabled.json +0 -0
  612. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/bsdinit.service/reload.json +0 -0
  613. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/bsdinit.service/skip_started.json +0 -0
  614. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/bsdinit.service/start.json +0 -0
  615. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/bsdinit.service/stop.json +0 -0
  616. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/cargo.packages/add_packages.json +0 -0
  617. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/cargo.packages/remove_packages.json +0 -0
  618. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/choco.install/install.json +0 -0
  619. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/choco.packages/add_packages.json +0 -0
  620. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/choco.packages/remove_packages.json +0 -0
  621. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/crontab.crontab/add.json +0 -0
  622. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/crontab.crontab/add_another.json +0 -0
  623. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/crontab.crontab/add_existing.json +0 -0
  624. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/crontab.crontab/add_existing_int.json +0 -0
  625. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/crontab.crontab/add_named.json +0 -0
  626. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/crontab.crontab/add_special_time.json +0 -0
  627. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/crontab.crontab/add_user.json +0 -0
  628. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/crontab.crontab/edit.json +0 -0
  629. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/crontab.crontab/edit_named.json +0 -0
  630. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/crontab.crontab/edit_special_time.json +0 -0
  631. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/crontab.crontab/remove.json +0 -0
  632. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/dnf.key/add.json +0 -0
  633. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/dnf.packages/add_packages.json +0 -0
  634. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/dnf.packages/install_with_args.json +0 -0
  635. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/dnf.packages/install_with_nobest.json +0 -0
  636. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/dnf.packages/noop_add_package_alias.json +0 -0
  637. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/dnf.packages/remove_package.json +0 -0
  638. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/dnf.packages/uninstall_with_args.json +0 -0
  639. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/dnf.packages/update_clean.json +0 -0
  640. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/dnf.repo/add.json +0 -0
  641. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/dnf.repo/remove.json +0 -0
  642. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/dnf.rpm/add.json +0 -0
  643. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/dnf.rpm/add_existing.json +0 -0
  644. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/dnf.rpm/add_existing_upgrade.json +0 -0
  645. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/dnf.rpm/add_url.json +0 -0
  646. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/dnf.rpm/remove.json +0 -0
  647. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/docker.container/add_and_start_no_existent_container.json +0 -0
  648. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/docker.container/add_existent_container.json +0 -0
  649. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/docker.container/add_no_existent_container.json +0 -0
  650. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/docker.container/remove_container.json +0 -0
  651. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/docker.container/start_container.json +0 -0
  652. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/docker.container/stop_container.json +0 -0
  653. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/docker.network/add_network.json +0 -0
  654. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/docker.network/add_network_macvlan_with_aux_addresses.json +0 -0
  655. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/docker.network/add_network_with_gateway.json +0 -0
  656. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/docker.network/add_network_with_ip_range.json +0 -0
  657. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/docker.network/add_network_with_opts.json +0 -0
  658. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/docker.network/remove_network.json +0 -0
  659. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/docker.plugin/disable_plugin.json +0 -0
  660. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/docker.plugin/enable_plugin.json +0 -0
  661. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/docker.plugin/install_plugin.json +0 -0
  662. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/docker.plugin/install_plugin_disabled.json +0 -0
  663. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/docker.plugin/install_plugin_with_alias_and_options.json +0 -0
  664. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/docker.plugin/remove_plugin.json +0 -0
  665. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/docker.plugin/set_plugin_options.json +0 -0
  666. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/docker.plugin/set_plugin_options_disabled_plugin.json +0 -0
  667. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/docker.volume/add_volume.json +0 -0
  668. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/docker.volume/add_volume_with_driver.json +0 -0
  669. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/docker.volume/add_volume_with_labels.json +0 -0
  670. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.block/add_existing_block_same_content.json +0 -0
  671. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.block/add_line_given_but_before_eq_after.json +0 -0
  672. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.block/add_no_content_provided.json +0 -0
  673. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.block/add_no_existing_block_and_non_str_line_given.json +0 -0
  674. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.block/add_no_line_given_but_before_ne_after.json +0 -0
  675. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.block/remove_no_existing_block.json +0 -0
  676. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.block/remove_no_file.json +0 -0
  677. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.directory/add.json +0 -0
  678. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.directory/add_force.json +0 -0
  679. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.directory/add_force_backup_dir.json +0 -0
  680. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.directory/add_force_no_backup.json +0 -0
  681. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.directory/add_with_spaces.json +0 -0
  682. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.directory/delete.json +0 -0
  683. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.directory/edit.json +0 -0
  684. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.directory/edit_with_spaces.json +0 -0
  685. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.directory/ignore_link_type.json +0 -0
  686. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.directory/invalid.json +0 -0
  687. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.directory/invalid_type.json +0 -0
  688. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.download/download.json +0 -0
  689. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.download/download_cache_time.json +0 -0
  690. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.download/download_cache_time_needs_refresh.json +0 -0
  691. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.download/download_directory.json +0 -0
  692. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.download/download_existing_checksum.json +0 -0
  693. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.download/download_extra_args_curl.json +0 -0
  694. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.download/download_extra_args_wget.json +0 -0
  695. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.download/download_headers_curl.json +0 -0
  696. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.download/download_headers_wget.json +0 -0
  697. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.download/download_insecure_curl.json +0 -0
  698. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.download/download_insecure_wget.json +0 -0
  699. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.download/download_needs_quotes.json +0 -0
  700. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.download/download_no_curl_no_wget.json +0 -0
  701. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.download/download_proxy_curl.json +0 -0
  702. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.download/download_proxy_wget.json +0 -0
  703. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.download/download_wget.json +0 -0
  704. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.download/download_with_checksums.json +0 -0
  705. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.download/download_with_checksums_needs_quotes.json +0 -0
  706. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.download/pathlib_download.json +0 -0
  707. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.download/skip_existing.json +0 -0
  708. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.file/add.json +0 -0
  709. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.file/add_force.json +0 -0
  710. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.file/add_force_backup_dir.json +0 -0
  711. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.file/add_force_backup_dir_nested.json +0 -0
  712. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.file/add_force_no_backup.json +0 -0
  713. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.file/add_special_chars.json +0 -0
  714. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.file/add_with_spaces.json +0 -0
  715. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.file/create_directory.json +0 -0
  716. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.file/delete.json +0 -0
  717. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.file/delete_with_spaces.json +0 -0
  718. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.file/edit.json +0 -0
  719. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.file/edit_nothing.json +0 -0
  720. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.file/invalid.json +0 -0
  721. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.file/invalid_type.json +0 -0
  722. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.file/touch.json +0 -0
  723. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.flags/clear_no_flags.json +0 -0
  724. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.flags/clear_one_flag_already_clear.json +0 -0
  725. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.flags/clear_one_flag_was_set.json +0 -0
  726. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.flags/clear_two_flags.json +0 -0
  727. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.flags/clear_two_flags_already_clear.json +0 -0
  728. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.flags/clear_two_flags_first_already_clear.json +0 -0
  729. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.flags/clear_two_flags_second_already_clear.json +0 -0
  730. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.flags/set_no_flags.json +0 -0
  731. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.flags/set_one_flag_already_set.json +0 -0
  732. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.flags/set_one_flag_not_yet_set.json +0 -0
  733. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.flags/set_two_flags.json +0 -0
  734. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.flags/set_two_flags_already_set.json +0 -0
  735. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.flags/set_two_flags_first_already_set.json +0 -0
  736. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.flags/set_two_flags_second_already_set.json +0 -0
  737. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.get/create_directory.json +0 -0
  738. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.get/different_remote.json +0 -0
  739. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.get/fallback_md5.json +0 -0
  740. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.get/fallback_sha256.json +0 -0
  741. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.get/no_change_md5.json +0 -0
  742. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.get/no_change_sha256.json +0 -0
  743. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.get/no_local.json +0 -0
  744. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.get/no_remote.json +0 -0
  745. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.get/path_with_spaces.json +0 -0
  746. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.get/path_with_spaces_already_escaped.json +0 -0
  747. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.get/pathlib_path_with_spaces.json +0 -0
  748. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.line/add.json +0 -0
  749. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.line/add_backup.json +0 -0
  750. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.line/add_existing.json +0 -0
  751. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.line/add_replace.json +0 -0
  752. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.line/add_replace_noop.json +0 -0
  753. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.line/add_with_quote.json +0 -0
  754. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.line/edit.json +0 -0
  755. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.line/edit_backup.json +0 -0
  756. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.line/pathlib_edit.json +0 -0
  757. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.link/add.json +0 -0
  758. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.link/add_force.json +0 -0
  759. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.link/add_force_backup_dir.json +0 -0
  760. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.link/add_force_no_backup.json +0 -0
  761. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.link/add_no_target.json +0 -0
  762. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.link/add_with_spaces.json +0 -0
  763. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.link/create_directory.json +0 -0
  764. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.link/delete.json +0 -0
  765. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.link/edit.json +0 -0
  766. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.link/edit_nothing.json +0 -0
  767. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.link/invalid.json +0 -0
  768. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.link/invalid_type.json +0 -0
  769. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.link/pathlib_edit.json +0 -0
  770. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.move/directory.json +0 -0
  771. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.move/invalid_dest.json +0 -0
  772. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.move/invalid_src.json +0 -0
  773. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.move/link.json +0 -0
  774. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.move/no_conflict.json +0 -0
  775. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.move/no_overwrite.json +0 -0
  776. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.move/overwrite.json +0 -0
  777. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.put/atime_mtime_sub_second.json +0 -0
  778. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.put/change_atime_eq_mtime_ref_remote.json +0 -0
  779. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.put/change_mode_owner.json +0 -0
  780. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.put/change_mode_owner_with_spaces.json +0 -0
  781. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.put/change_mtime_arg_no_tz.json +0 -0
  782. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.put/change_mtime_atime_ref_local file.json +0 -0
  783. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.put/copy_local_permissions.json +0 -0
  784. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.put/create_directory.json +0 -0
  785. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.put/different_remote.json +0 -0
  786. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.put/fallback_md5.json +0 -0
  787. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.put/fallback_sha256.json +0 -0
  788. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.put/no_change.json +0 -0
  789. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.put/no_change_atime_mtime.json +0 -0
  790. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.put/no_change_md5.json +0 -0
  791. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.put/no_change_same_mode_as_local.json +0 -0
  792. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.put/no_change_sha256.json +0 -0
  793. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.put/no_local.json +0 -0
  794. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.put/no_remote.json +0 -0
  795. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.put/path_with_spaces.json +0 -0
  796. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.put/path_with_spaces_already_escaped.json +0 -0
  797. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.put/pathlib_with_spaces.json +0 -0
  798. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.put/upload_to_directory.json +0 -0
  799. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.replace/no_match.json +0 -0
  800. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.replace/replace_double_quotes_interpolate.json +0 -0
  801. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.replace/replace_double_quotes_no_interpolate.json +0 -0
  802. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.replace/replace_single_quotes_interpolate.json +0 -0
  803. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.replace/replace_single_quotes_no_interpolate.json +0 -0
  804. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.replace/simple_interpolate.json +0 -0
  805. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.replace/simple_no_interpolate.json +0 -0
  806. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.sync/sync_delete_posix.json +0 -0
  807. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.sync/sync_delete_windows.json +0 -0
  808. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.sync/sync_destination_link.json +0 -0
  809. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.sync/sync_exclude_multiple.json +0 -0
  810. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.sync/sync_no_destination_exist.json +0 -0
  811. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.sync/sync_no_local_exist_posix.json +0 -0
  812. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.sync/sync_no_local_exist_windows.json +0 -0
  813. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.sync/sync_partial_exists.json +0 -0
  814. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.sync/sync_special_chars.json +0 -0
  815. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.template/invalid_template_syntax.json +0 -0
  816. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.template/no_remote.json +0 -0
  817. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/files.template/undefined_template_variable.json +0 -0
  818. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/flatpak.packages/install_package.json +0 -0
  819. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/flatpak.packages/install_packages.json +0 -0
  820. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/flatpak.packages/remove_packages.json +0 -0
  821. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/freebsd.freebsd_update.update/update.json +0 -0
  822. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/freebsd.pkg.autoremove/autoremove-with-jail.json +0 -0
  823. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/freebsd.pkg.autoremove/autoremove.json +0 -0
  824. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/freebsd.pkg.clean/clean-all-with-jail.json +0 -0
  825. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/freebsd.pkg.clean/clean-all.json +0 -0
  826. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/freebsd.pkg.clean/clean-with-jail.json +0 -0
  827. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/freebsd.pkg.clean/clean.json +0 -0
  828. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/freebsd.pkg.install/install-with-custom-repo.json +0 -0
  829. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/freebsd.pkg.install/install-with-jail-and-custom-repo.json +0 -0
  830. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/freebsd.pkg.install/install-with-jail.json +0 -0
  831. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/freebsd.pkg.install/install.json +0 -0
  832. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/freebsd.pkg.remove/remove-with-jail.json +0 -0
  833. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/freebsd.pkg.remove/remove.json +0 -0
  834. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/freebsd.pkg.update/update.json +0 -0
  835. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/freebsd.pkg.upgrade/upgrade.json +0 -0
  836. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/freebsd.service.service/custom.json +0 -0
  837. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/freebsd.service.service/reload.json +0 -0
  838. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/freebsd.service.service/restart.json +0 -0
  839. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/freebsd.service.service/start.json +0 -0
  840. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/freebsd.service.service/stop.json +0 -0
  841. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/freebsd.sysrc.sysrc/add.json +0 -0
  842. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/freebsd.sysrc.sysrc/del.json +0 -0
  843. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/freebsd.sysrc.sysrc/set.json +0 -0
  844. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/freebsd.sysrc.sysrc/sub.json +0 -0
  845. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/gem.packages/add_packages.json +0 -0
  846. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/gem.packages/remove_packages.json +0 -0
  847. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.bare_repo/chmod.json +0 -0
  848. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.bare_repo/delete.json +0 -0
  849. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.bare_repo/init.json +0 -0
  850. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.config/add_existing_multi_value.json +0 -0
  851. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.config/add_first_multi_value.json +0 -0
  852. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.config/add_second_multi_value.json +0 -0
  853. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.config/edit_global.json +0 -0
  854. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.config/edit_system.json +0 -0
  855. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.config/set_existing_global.json +0 -0
  856. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.config/set_existing_system.json +0 -0
  857. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.config/set_global.json +0 -0
  858. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.config/set_repo.json +0 -0
  859. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.config/set_system.json +0 -0
  860. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.repo/branch_pull.json +0 -0
  861. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.repo/clone.json +0 -0
  862. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.repo/clone_keyscan.json +0 -0
  863. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.repo/clone_keyscan_invalid.json +0 -0
  864. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.repo/rebase.json +0 -0
  865. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.repo/recursive_submodules.json +0 -0
  866. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.repo/update_submodules.json +0 -0
  867. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.worktree/create.json +0 -0
  868. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.worktree/create_detached.json +0 -0
  869. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.worktree/create_detached_from_commitish.json +0 -0
  870. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.worktree/create_existing_branch.json +0 -0
  871. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.worktree/create_force.json +0 -0
  872. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.worktree/create_from_commitish.json +0 -0
  873. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.worktree/create_new_branch.json +0 -0
  874. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.worktree/create_new_branch_from_commitish.json +0 -0
  875. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.worktree/pull.json +0 -0
  876. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.worktree/pull_disable.json +0 -0
  877. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.worktree/pull_from_bad_remote_branch.json +0 -0
  878. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.worktree/pull_from_remote_branch.json +0 -0
  879. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.worktree/pull_rebase from_remote_branch.json +0 -0
  880. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.worktree/pull_rebase.json +0 -0
  881. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.worktree/remove.json +0 -0
  882. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/git.worktree/remove_force.json +0 -0
  883. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/iptables.chain/add_chain.json +0 -0
  884. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/iptables.chain/delete_chain.json +0 -0
  885. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/iptables.chain/delete_chain_noop.json +0 -0
  886. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/iptables.chain/edit_chain.json +0 -0
  887. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/iptables.rule/add_log_rule.json +0 -0
  888. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/iptables.rule/add_rule.json +0 -0
  889. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/iptables.rule/add_to_ports.json +0 -0
  890. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/iptables.rule/add_to_source.json +0 -0
  891. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/iptables.rule/add_v6_rule.json +0 -0
  892. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/iptables.rule/already_absent.json +0 -0
  893. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/iptables.rule/already_present.json +0 -0
  894. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/iptables.rule/delete_rule.json +0 -0
  895. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/iptables.rule/invalid_destination_port.json +0 -0
  896. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/iptables.rule/invalid_log_prefix.json +0 -0
  897. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/iptables.rule/invalid_source_destination.json +0 -0
  898. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/iptables.rule/invalid_to_destination.json +0 -0
  899. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/iptables.rule/invalid_to_ports.json +0 -0
  900. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/launchd.service/restart.json +0 -0
  901. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/launchd.service/restart_stopped.json +0 -0
  902. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/launchd.service/start.json +0 -0
  903. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/launchd.service/start_running.json +0 -0
  904. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/launchd.service/stop.json +0 -0
  905. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/lxd.container/add_container.json +0 -0
  906. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/lxd.container/already_absent.json +0 -0
  907. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/lxd.container/already_present.json +0 -0
  908. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/lxd.container/delete_container.json +0 -0
  909. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/lxd.container/delete_running_container.json +0 -0
  910. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.database/add.json +0 -0
  911. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.database/add_noop.json +0 -0
  912. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.database/add_privileges.json +0 -0
  913. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.database/delete.json +0 -0
  914. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.database/delete_noop.json +0 -0
  915. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.dump/dump.json +0 -0
  916. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.load/load.json +0 -0
  917. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.load/load_space.json +0 -0
  918. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.privileges/add.json +0 -0
  919. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.privileges/add_all_with_grant_option.json +0 -0
  920. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.privileges/add_database.json +0 -0
  921. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.privileges/add_delete.json +0 -0
  922. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.privileges/add_delete_usage.json +0 -0
  923. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.privileges/add_existing.json +0 -0
  924. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.privileges/add_table.json +0 -0
  925. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.privileges/add_table_invalid.json +0 -0
  926. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.privileges/add_with_grant_option.json +0 -0
  927. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.privileges/delete.json +0 -0
  928. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.privileges/delete_all.json +0 -0
  929. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.privileges/delete_all_with_grant_option.json +0 -0
  930. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.privileges/delete_with_grant_option.json +0 -0
  931. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.privileges/remove_noop.json +0 -0
  932. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.privileges/remove_usage.json +0 -0
  933. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.sql/execute.json +0 -0
  934. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.sql/execute_mysql_kwargs.json +0 -0
  935. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.user/add.json +0 -0
  936. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.user/add_noop.json +0 -0
  937. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.user/add_password.json +0 -0
  938. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.user/add_privileges.json +0 -0
  939. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.user/add_resources.json +0 -0
  940. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.user/add_ssl.json +0 -0
  941. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.user/add_x509.json +0 -0
  942. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.user/add_x509_specified.json +0 -0
  943. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.user/delete.json +0 -0
  944. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.user/invalid_require_cipher.json +0 -0
  945. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.user/invalid_require_issuer.json +0 -0
  946. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.user/invalid_require_subject.json +0 -0
  947. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.user/invalid_require_type.json +0 -0
  948. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.user/remove_noop.json +0 -0
  949. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.user/update_resources.json +0 -0
  950. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.user/update_resources_partial.json +0 -0
  951. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.user/update_ssl.json +0 -0
  952. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.user/update_x509.json +0 -0
  953. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.user/update_x509_specified.json +0 -0
  954. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/mysql.user/update_x509_specified_partial.json +0 -0
  955. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/npm.packages/add_local_packages.json +0 -0
  956. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/npm.packages/add_packages.json +0 -0
  957. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/npm.packages/remove_packages.json +0 -0
  958. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/openrc.service/disable.json +0 -0
  959. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/openrc.service/disable_noop.json +0 -0
  960. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/openrc.service/disable_runlevel.json +0 -0
  961. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/openrc.service/enable.json +0 -0
  962. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/openrc.service/enable_noop.json +0 -0
  963. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/openrc.service/enable_runlevel.json +0 -0
  964. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/openrc.service/running_noop.json +0 -0
  965. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/openrc.service/start.json +0 -0
  966. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/openrc.service/stop.json +0 -0
  967. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/openrc.service/stopped_noop.json +0 -0
  968. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/opkg.packages/add_existing_package.json +0 -0
  969. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/opkg.packages/add_multiple_packages.json +0 -0
  970. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/opkg.packages/add_one_package.json +0 -0
  971. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/opkg.packages/add_with_unallowed_pinning.json +0 -0
  972. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/opkg.packages/list_of_nulls_package_list.json +0 -0
  973. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/opkg.packages/null_package_list.json +0 -0
  974. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/opkg.packages/remove_existing_package.json +0 -0
  975. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/opkg.packages/remove_existing_package_and_require_update.json +0 -0
  976. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/opkg.packages/remove_not_existing_package.json +0 -0
  977. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/opkg.packages/update_then_add_one.json +0 -0
  978. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/opkg.update/first_update.json +0 -0
  979. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pacman.packages/add_packages.json +0 -0
  980. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pacman.packages/add_packages_group_expand.json +0 -0
  981. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pacman.packages/remove_packages.json +0 -0
  982. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pacman.packages/remove_packages_expand.json +0 -0
  983. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pacman.packages/upgrade_update.json +0 -0
  984. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pip.packages/add_existing_package_with_url.json +0 -0
  985. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pip.packages/add_new_virtualenv_packages.json +0 -0
  986. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pip.packages/add_packages.json +0 -0
  987. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pip.packages/add_packages_case_insensitive.json +0 -0
  988. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pip.packages/add_virtualenv_packages.json +0 -0
  989. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pip.packages/install_extra_args.json +0 -0
  990. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pip.packages/install_latest_requirements.json +0 -0
  991. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pip.packages/install_requirements.json +0 -0
  992. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pip.packages/install_virtualenv_requirements.json +0 -0
  993. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pip.packages/remove_packages.json +0 -0
  994. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pip.packages/uninstall_requirements.json +0 -0
  995. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pip.packages/use_pip3.json +0 -0
  996. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pip.packages/use_pip3_virtualenv.json +0 -0
  997. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pip.venv/add_virtualenv.json +0 -0
  998. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pip.virtualenv/add_virtualenv.json +0 -0
  999. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pip.virtualenv/add_virtualenv_py3.json +0 -0
  1000. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pip.virtualenv/add_with_options.json +0 -0
  1001. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pip.virtualenv/already_absent.json +0 -0
  1002. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pip.virtualenv/already_present.json +0 -0
  1003. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pip.virtualenv/delete_virtualenv.json +0 -0
  1004. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pip.virtualenv/present_empty_directory.json +0 -0
  1005. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pip.virtualenv/use_stdlib_venv.json +0 -0
  1006. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pip.virtualenv/use_stdlib_venv_py3.json +0 -0
  1007. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pipx.ensure_path/ensure_path.json +0 -0
  1008. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pipx.packages/add_existing_package_with_url.json +0 -0
  1009. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pipx.packages/add_nothing.json +0 -0
  1010. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pipx.packages/add_package.json +0 -0
  1011. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pipx.packages/add_packages.json +0 -0
  1012. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pipx.packages/install_extra_args.json +0 -0
  1013. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pipx.packages/remove_packages.json +0 -0
  1014. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pipx.upgrade_all/upgrade_all.json +0 -0
  1015. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pkg.packages/pkg_add_packages.json +0 -0
  1016. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pkg.packages/pkg_add_packages_with_installurl.json +0 -0
  1017. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pkg.packages/pkg_delete_packages.json +0 -0
  1018. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pkg.packages/pkg_install_packages.json +0 -0
  1019. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pkg.packages/pkg_remove_packages.json +0 -0
  1020. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pkgin.packages/add_packages.json +0 -0
  1021. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pkgin.packages/remove_packages.json +0 -0
  1022. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pkgin.packages/upgrade_packages.json +0 -0
  1023. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/pkgin.packages/upgrade_update.json +0 -0
  1024. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/postgresql.database/add_database.json +0 -0
  1025. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/postgresql.database/add_database_locales.json +0 -0
  1026. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/postgresql.database/add_database_owner.json +0 -0
  1027. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/postgresql.database/remove_database.json +0 -0
  1028. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/postgresql.database/remove_database_noop.json +0 -0
  1029. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/postgresql.database/update_database.json +0 -0
  1030. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/postgresql.database/update_database_noop.json +0 -0
  1031. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/postgresql.dump/dump.json +0 -0
  1032. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/postgresql.load/load.json +0 -0
  1033. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/postgresql.role/role_remove_noop.json +0 -0
  1034. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/postgresql.role/role_update.json +0 -0
  1035. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/postgresql.role/role_update_noop.json +0 -0
  1036. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/postgresql.role/user_add.json +0 -0
  1037. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/postgresql.role/user_add_no_login.json +0 -0
  1038. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/postgresql.role/user_add_privileges.json +0 -0
  1039. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/postgresql.role/user_add_replication.json +0 -0
  1040. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/postgresql.role/user_add_super.json +0 -0
  1041. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/postgresql.role/user_remove.json +0 -0
  1042. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/postgresql.sql/execute.json +0 -0
  1043. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/puppet.agent/run_agent.json +0 -0
  1044. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/python.call/call_func.json +0 -0
  1045. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/python.raise_exception/call_func.json +0 -0
  1046. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/runit.manage/manage.json +0 -0
  1047. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/runit.manage/unmanage.json +0 -0
  1048. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/runit.service/disable.json +0 -0
  1049. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/runit.service/enable.json +0 -0
  1050. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/selinux.boolean/bad_value.json +0 -0
  1051. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/selinux.boolean/change_not_persistent.json +0 -0
  1052. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/selinux.boolean/change_persistent.json +0 -0
  1053. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/selinux.boolean/no_change.json +0 -0
  1054. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/selinux.file_context/change.json +0 -0
  1055. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/selinux.file_context/no_change.json +0 -0
  1056. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/selinux.file_context_mapping/add_None.json +0 -0
  1057. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/selinux.file_context_mapping/add_different.json +0 -0
  1058. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/selinux.file_context_mapping/add_no_change.json +0 -0
  1059. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/selinux.file_context_mapping/add_none_existeing.json +0 -0
  1060. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/selinux.file_context_mapping/delete_existing.json +0 -0
  1061. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/selinux.file_context_mapping/delete_none_existing.json +0 -0
  1062. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/selinux.port/add_None.json +0 -0
  1063. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/selinux.port/add_different.json +0 -0
  1064. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/selinux.port/add_different_direct.json +0 -0
  1065. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/selinux.port/add_not_existing.json +0 -0
  1066. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/selinux.port/add_not_existing_direct.json +0 -0
  1067. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/selinux.port/add_not_existing_protocol.json +0 -0
  1068. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/selinux.port/add_same.json +0 -0
  1069. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/selinux.port/add_same_direct.json +0 -0
  1070. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/selinux.port/remove_existing.json +0 -0
  1071. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/selinux.port/remove_existing_direct.json +0 -0
  1072. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/selinux.port/remove_not_existing.json +0 -0
  1073. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/selinux.port/remove_not_existing_direct.json +0 -0
  1074. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.group/add.freebsd.json +0 -0
  1075. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.group/add.json +0 -0
  1076. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.group/delete.freebsd.json +0 -0
  1077. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.group/delete.json +0 -0
  1078. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.hostname/hostname_noop.json +0 -0
  1079. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.hostname/hostnamectl_noop.json +0 -0
  1080. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.hostname/set_hostname_bsd.json +0 -0
  1081. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.hostname/set_hostname_linux.json +0 -0
  1082. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.hostname/set_hostnamectl_linux.json +0 -0
  1083. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.locale/add.json +0 -0
  1084. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.locale/remove.json +0 -0
  1085. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.modprobe/add-list.json +0 -0
  1086. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.modprobe/add.json +0 -0
  1087. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.modprobe/add_exists.json +0 -0
  1088. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.modprobe/add_force.json +0 -0
  1089. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.modprobe/add_multiple_exists.json +0 -0
  1090. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.modprobe/remove-list.json +0 -0
  1091. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.modprobe/remove.json +0 -0
  1092. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.mount/mount.json +0 -0
  1093. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.mount/mount_device.json +0 -0
  1094. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.mount/mount_device_fstype.json +0 -0
  1095. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.mount/mount_exists.json +0 -0
  1096. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.mount/mount_options.json +0 -0
  1097. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.mount/remount_options.json +0 -0
  1098. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.mount/unmount.json +0 -0
  1099. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.packages/add_apk_packages.json +0 -0
  1100. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.packages/add_dnf_packages.json +0 -0
  1101. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.packages/add_yum_packages.json +0 -0
  1102. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.reboot/reboot.json +0 -0
  1103. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.script/upload_run.json +0 -0
  1104. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.script_template/script.json +0 -0
  1105. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.security_limit/set.json +0 -0
  1106. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.service/invalid.json +0 -0
  1107. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.service/start_initd.json +0 -0
  1108. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.service/start_initd_service.json +0 -0
  1109. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.service/start_openrc.json +0 -0
  1110. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.service/start_rcd.json +0 -0
  1111. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.service/start_runit.json +0 -0
  1112. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.service/start_systemd.json +0 -0
  1113. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.service/start_upstart.json +0 -0
  1114. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.shell/shell.json +0 -0
  1115. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.shell/single_shell.json +0 -0
  1116. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.sysctl/set.json +0 -0
  1117. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.sysctl/set_list.json +0 -0
  1118. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.sysctl/set_noop.json +0 -0
  1119. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.sysctl/set_noop_string_value.json +0 -0
  1120. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.sysctl/set_noop_zero_int.json +0 -0
  1121. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.sysctl/set_persist.json +0 -0
  1122. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.user/add.freebsd.json +0 -0
  1123. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.user/add.json +0 -0
  1124. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.user/add_group_exists.freebsd.json +0 -0
  1125. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.user/add_group_exists.json +0 -0
  1126. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.user/add_home_is_link.freebsd.json +0 -0
  1127. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.user/add_home_is_link.json +0 -0
  1128. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.user/add_invalid_home_is_file.json +0 -0
  1129. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.user/add_non_unique.freebsd.json +0 -0
  1130. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.user/add_non_unique.json +0 -0
  1131. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.user/append_secondary_existing_groups.json +0 -0
  1132. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.user/append_secondary_groups.freebsd.json +0 -0
  1133. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.user/append_secondary_groups.json +0 -0
  1134. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.user/delete.freebsd.json +0 -0
  1135. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.user/delete.json +0 -0
  1136. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.user/edit.freebsd.json +0 -0
  1137. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.user/edit.json +0 -0
  1138. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.user/exists_noop.json +0 -0
  1139. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.user/key_files.json +0 -0
  1140. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.user/keys.json +0 -0
  1141. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.user/keys_delete.json +0 -0
  1142. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.user/keys_nohome.json +0 -0
  1143. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.user/keys_single.json +0 -0
  1144. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/server.wait/port.json +0 -0
  1145. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/snap.package/install_package.json +0 -0
  1146. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/snap.package/install_package_classic.json +0 -0
  1147. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/snap.package/install_package_with_channel.json +0 -0
  1148. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/snap.package/install_packages.json +0 -0
  1149. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/snap.package/install_refresh_packages.json +0 -0
  1150. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/snap.package/refresh_package.json +0 -0
  1151. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/snap.package/remove_packages.json +0 -0
  1152. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/ssh.command/command.json +0 -0
  1153. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/ssh.command/command_quotes.json +0 -0
  1154. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/ssh.command/command_user_port.json +0 -0
  1155. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/ssh.download/download.json +0 -0
  1156. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/ssh.download/download_exists.json +0 -0
  1157. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/ssh.download/download_exists_force.json +0 -0
  1158. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/ssh.download/download_not_file.json +0 -0
  1159. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/ssh.keyscan/scan_not_present.json +0 -0
  1160. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/ssh.keyscan/scan_present.json +0 -0
  1161. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/ssh.keyscan/scan_present_force.json +0 -0
  1162. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/ssh.upload/upload.json +0 -0
  1163. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/ssh.upload/upload_remote_sudo.json +0 -0
  1164. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/ssh.upload/upload_remote_sudo_user.json +0 -0
  1165. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/systemd.service/daemon_reload.json +0 -0
  1166. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/systemd.service/disabled.json +0 -0
  1167. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/systemd.service/enabled.json +0 -0
  1168. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/systemd.service/machine_daemon_reload.json +0 -0
  1169. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/systemd.service/machine_disabled.json +0 -0
  1170. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/systemd.service/machine_enabled.json +0 -0
  1171. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/systemd.service/machine_start.json +0 -0
  1172. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/systemd.service/running_ambiguous_unit.json +0 -0
  1173. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/systemd.service/running_noop.json +0 -0
  1174. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/systemd.service/running_timer.json +0 -0
  1175. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/systemd.service/start.json +0 -0
  1176. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/systemd.service/stopped_noop.json +0 -0
  1177. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/systemd.service/timer.json +0 -0
  1178. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/systemd.service/user_daemon_reload.json +0 -0
  1179. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/systemd.service/user_disabled.json +0 -0
  1180. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/systemd.service/user_enabled.json +0 -0
  1181. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/systemd.service/user_machine_daemon_reload.json +0 -0
  1182. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/systemd.service/user_machine_disabled.json +0 -0
  1183. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/systemd.service/user_machine_enabled.json +0 -0
  1184. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/systemd.service/user_machine_start.json +0 -0
  1185. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/systemd.service/user_start.json +0 -0
  1186. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/sysvinit.enable/create.json +0 -0
  1187. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/sysvinit.service/command.json +0 -0
  1188. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/sysvinit.service/disabled.json +0 -0
  1189. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/sysvinit.service/enabled_chkconfig.json +0 -0
  1190. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/sysvinit.service/enabled_rc-update.json +0 -0
  1191. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/sysvinit.service/enabled_update-rc.d.json +0 -0
  1192. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/sysvinit.service/reload.json +0 -0
  1193. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/sysvinit.service/restart.json +0 -0
  1194. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/sysvinit.service/restart_down.json +0 -0
  1195. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/sysvinit.service/skip_started.json +0 -0
  1196. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/sysvinit.service/start.json +0 -0
  1197. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/sysvinit.service/stop.json +0 -0
  1198. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/upstart.service/disabled.json +0 -0
  1199. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/upstart.service/enabled.json +0 -0
  1200. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/upstart.service/running.json +0 -0
  1201. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/vzctl.create/add_template.json +0 -0
  1202. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/vzctl.create/already_existing.json +0 -0
  1203. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/vzctl.delete/delete.json +0 -0
  1204. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/vzctl.mount/mount.json +0 -0
  1205. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/vzctl.restart/restart.json +0 -0
  1206. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/vzctl.restart/restart_force.json +0 -0
  1207. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/vzctl.set/set.json +0 -0
  1208. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/vzctl.set/set_multiple.json +0 -0
  1209. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/vzctl.set/set_no_save.json +0 -0
  1210. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/vzctl.start/start.json +0 -0
  1211. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/vzctl.start/start_force.json +0 -0
  1212. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/vzctl.stop/stop.json +0 -0
  1213. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/vzctl.unmount/unmount.json +0 -0
  1214. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/xbps.packages/add_packages.json +0 -0
  1215. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/xbps.packages/remove_packages.json +0 -0
  1216. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/xbps.packages/upgrade_update.json +0 -0
  1217. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/yum.key/add.json +0 -0
  1218. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/yum.packages/add_packages.json +0 -0
  1219. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/yum.packages/add_packages_alias.json +0 -0
  1220. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/yum.packages/add_packages_alias_different_version.json +0 -0
  1221. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/yum.packages/add_packages_alias_multiple_version.json +0 -0
  1222. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/yum.packages/install_with_args.json +0 -0
  1223. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/yum.packages/install_with_nobest.json +0 -0
  1224. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/yum.packages/noop_add_packages_alias.json +0 -0
  1225. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/yum.packages/noop_add_packages_alias_multiple_version.json +0 -0
  1226. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/yum.packages/remove_package.json +0 -0
  1227. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/yum.packages/remove_packages_alias_multiple_version.json +0 -0
  1228. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/yum.packages/uninstall_with_args.json +0 -0
  1229. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/yum.packages/update_clean.json +0 -0
  1230. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/yum.repo/add.json +0 -0
  1231. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/yum.repo/add_url.json +0 -0
  1232. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/yum.repo/remove.json +0 -0
  1233. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/yum.rpm/add.json +0 -0
  1234. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/yum.rpm/add_existing.json +0 -0
  1235. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/yum.rpm/add_existing_upgrade.json +0 -0
  1236. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/yum.rpm/add_url.json +0 -0
  1237. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/yum.rpm/remove.json +0 -0
  1238. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zfs.dataset/create.yaml +0 -0
  1239. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zfs.dataset/create_noop.yaml +0 -0
  1240. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zfs.dataset/create_recursive.yaml +0 -0
  1241. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zfs.dataset/create_sparse.yaml +0 -0
  1242. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zfs.dataset/create_volume.yaml +0 -0
  1243. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zfs.dataset/delete.yaml +0 -0
  1244. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zfs.dataset/delete_noop.yaml +0 -0
  1245. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zfs.dataset/delete_recursive.yaml +0 -0
  1246. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zfs.dataset/set_props.yaml +0 -0
  1247. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zfs.filesystem/create.yaml +0 -0
  1248. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zfs.filesystem/delete.yaml +0 -0
  1249. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zfs.snapshot/create.yaml +0 -0
  1250. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zfs.volume/create.yaml +0 -0
  1251. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zypper.key/add.json +0 -0
  1252. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zypper.packages/add_packages.json +0 -0
  1253. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zypper.packages/install_with_args.json +0 -0
  1254. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zypper.packages/install_with_global_args.json +0 -0
  1255. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zypper.packages/uninstall_with_args.json +0 -0
  1256. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zypper.packages/uninstall_with_global_args.json +0 -0
  1257. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zypper.packages/update_clean.json +0 -0
  1258. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zypper.repo/add.json +0 -0
  1259. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zypper.repo/add_url.json +0 -0
  1260. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zypper.repo/remove.json +0 -0
  1261. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zypper.rpm/add.json +0 -0
  1262. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zypper.rpm/add_existing.json +0 -0
  1263. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zypper.rpm/add_existing_upgrade.json +0 -0
  1264. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zypper.rpm/add_url.json +0 -0
  1265. {pyinfra-3.5.1 → pyinfra-3.6}/tests/operations/zypper.rpm/remove.json +0 -0
  1266. {pyinfra-3.5.1 → pyinfra-3.6}/tests/paramiko_util.py +0 -0
  1267. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_api/__init__.py +0 -0
  1268. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_api/test_api.py +0 -0
  1269. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_api/test_api_arguments.py +0 -0
  1270. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_api/test_api_command.py +0 -0
  1271. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_api/test_api_config.py +0 -0
  1272. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_api/test_api_deploys.py +0 -0
  1273. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_api/test_api_facts.py +0 -0
  1274. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_api/test_api_host.py +0 -0
  1275. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_api/test_api_inventory.py +0 -0
  1276. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_api/test_api_operations.py +0 -0
  1277. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_api/test_api_util.py +0 -0
  1278. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/__init__.py +0 -0
  1279. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/deploy/deploy.py +0 -0
  1280. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/deploy/deploy_random.py +0 -0
  1281. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/deploy/files/a_file +0 -0
  1282. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/deploy/group_data/all.py +0 -0
  1283. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/deploy/group_data/invalid.json +0 -0
  1284. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/deploy/group_data/leftover_data.py +0 -0
  1285. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/deploy/inventories/inventory.py +0 -0
  1286. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/deploy/inventories/inventory_all.py +0 -0
  1287. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/deploy/inventories/inventory_ansible +0 -0
  1288. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/deploy/inventories/inventory_ansible.json +0 -0
  1289. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/deploy/inventories/inventory_ansible.yml +0 -0
  1290. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/deploy/tasks/a_task.py +0 -0
  1291. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/deploy/tasks/another_task.py +0 -0
  1292. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/deploy/tasks/b_task.py +0 -0
  1293. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/deploy/tasks/nested/empty_task.py +0 -0
  1294. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/deploy/templates/a_template.j2 +0 -0
  1295. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/deploy/utils.py +0 -0
  1296. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/deploy_fails/invalid_argument_type.py +0 -0
  1297. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/deploy_fails/invalid_operation_arg.py +0 -0
  1298. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/deploy_fails/operation_error.py +0 -0
  1299. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/inventories/invalid.py +0 -0
  1300. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/test_cli_deploy.py +0 -0
  1301. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/test_cli_exceptions.py +0 -0
  1302. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/test_cli_inventory.py +0 -0
  1303. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/test_cli_util.py +0 -0
  1304. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/test_context_objects.py +0 -0
  1305. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/user/test_ops.py +0 -0
  1306. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_cli/util.py +0 -0
  1307. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_connectors/__init__.py +0 -0
  1308. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_connectors/test_chroot.py +0 -0
  1309. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_connectors/test_dockerssh.py +0 -0
  1310. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_connectors/test_local.py +0 -0
  1311. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_connectors/test_sshuserclient.py +0 -0
  1312. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_connectors/test_terraform.py +0 -0
  1313. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_connectors/test_util.py +0 -0
  1314. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_connectors/test_vagrant.py +0 -0
  1315. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_global_arguments.py +0 -0
  1316. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_operations.py +0 -0
  1317. {pyinfra-3.5.1 → pyinfra-3.6}/tests/test_units.py +0 -0
  1318. {pyinfra-3.5.1 → pyinfra-3.6}/tests/typing/invalid/operation_kwarg.py +0 -0
  1319. {pyinfra-3.5.1 → pyinfra-3.6}/tests/typing/invalid/operation_kwarg_value.py +0 -0
  1320. {pyinfra-3.5.1 → pyinfra-3.6}/tests/typing/valid/operation.py +0 -0
  1321. {pyinfra-3.5.1 → pyinfra-3.6}/tests/words.txt +0 -0
@@ -50,10 +50,19 @@ jobs:
50
50
  needs:
51
51
  - lint
52
52
  - type-check
53
+ - spell-check
53
54
  strategy:
54
55
  matrix:
55
- os: [ubuntu-22.04, ubuntu-24.04, macos-13, macos-14, macos-15,windows-2022, windows-2025]
56
- python-version: ["3.10", "3.11", "3.12", "3.13"]
56
+ os: [macos-26, macos-15, macos-14, windows-2025, windows-2022, ubuntu-24.04, ubuntu-22.04]
57
+ # Test every OS vs. Python 3.13, and only one for 3.1[012]
58
+ python-version: ["3.13"]
59
+ include:
60
+ - os: ubuntu-24.04
61
+ python-version: "3.12"
62
+ - os: ubuntu-24.04
63
+ python-version: "3.11"
64
+ - os: ubuntu-24.04
65
+ python-version: "3.10"
57
66
  runs-on: ${{ matrix.os }}
58
67
  steps:
59
68
  - uses: actions/checkout@v5
@@ -75,27 +84,24 @@ jobs:
75
84
  needs:
76
85
  - lint
77
86
  - type-check
87
+ - spell-check
78
88
  strategy:
79
89
  matrix:
80
90
  os: [ubuntu-22.04, ubuntu-24.04]
81
91
  test-name: [local, ssh, docker, podman]
82
- python-version: ["3.10", "3.11", "3.12", "3.13"]
83
92
  include:
84
- - os: macos-13
85
- test-name: local
86
- python-version: "3.13"
87
93
  - os: macos-14
88
94
  test-name: local
89
- python-version: "3.13"
90
95
  - os: macos-15
91
96
  test-name: local
92
- python-version: "3.13"
97
+ - os: macos-26
98
+ test-name: local
93
99
  runs-on: ${{ matrix.os }}
94
100
  steps:
95
101
  - uses: actions/checkout@v5
96
102
  - uses: actions/setup-python@v5
97
103
  with:
98
- python-version: ${{ matrix.python-version }}
104
+ python-version: "3.13"
99
105
  - name: Install uv
100
106
  uses: astral-sh/setup-uv@v6
101
107
  - run: uv sync --group test --no-default-groups --python=${{ matrix.python-version }}
@@ -108,6 +114,7 @@ jobs:
108
114
  needs:
109
115
  - lint
110
116
  - type-check
117
+ - spell-check
111
118
  - unit-test
112
119
  - end-to-end-test
113
120
  runs-on: ubuntu-latest
@@ -1,3 +1,52 @@
1
+ # v3.6
2
+
3
+ First 2026 release - Happy New Year all! Thank you to all contributors. One big highlight is new metadata spec for plugins, this is the start of better discovery and documentation generation for third party facts and operations:
4
+
5
+ - add metadata spec for pyinfra plugins (@rod7760)
6
+
7
+ New and updated operations/facts:
8
+
9
+ - operations: add `_temp_dir` global argument for configuring temp directory (@wowi42)
10
+ - operations: add `files.copy` operation (@EricDriussi)
11
+ - operations.crontab: fix modification not properly relying on the `cron_name` parameter (@information-redacted)
12
+ - operations.docker.container: add support for setting labels (@spookyvision)
13
+ - operations: add import statements on at least one example of every operation (@mkinney)
14
+ - operations.docker.image: make operation idempotent (@DonDebonair)
15
+ - operations.files.template: allow custom jinja2 template loaders (@DaRasch)
16
+ - operations.files.block/connectors.util: use correct temporary directory (@morrison12)
17
+ - operations.util.packaging: allow empty package list in `ensure_packages` (@schenker)
18
+ - operations: fix tmpdir to properly use all the POSIX environment variables (@wowi42)
19
+ - facts.files.FileContents: improve docstring (@adonm)
20
+ - facts.apt.update: fix computation of cache_time when host is not UTC (@philippemilink)
21
+ - facts: add `FactProcessError` to log, not explode, issues processing facts (@NichtJens)
22
+ - facts.npm: check directory exists before cd-ing (wowi42)
23
+
24
+ Connectors:
25
+
26
+ - connectors.docker: add platform and architecture option via connector data (@JP-Ellis)
27
+ - connectors: close stdin after writing any input
28
+ - connectors.ssh: add workaround for paramiko no session error (@dfaerch)
29
+
30
+ CLI:
31
+
32
+ - cli: change color of "No changes" to cyan
33
+ - cli: add option `--same-sudo-password` (@philippemilink)
34
+
35
+ Docs/meta:
36
+
37
+ - docs: replace `python -m` with `uv run -m` (@JP-Ellis)
38
+ - docs: fix URLs in API documentation (@kelno)
39
+ - docs/connectors: document command wrapping and parameter filtering best practices (@elazar)
40
+ - tests: freeze date for fact tests
41
+
42
+ # v3.5.3
43
+
44
+ - another release to fix different doc generation issues 🫠
45
+
46
+ # v3.5.2
47
+
48
+ - fix operation & fact docs generation
49
+
1
50
  # v3.5.1
2
51
 
3
52
  Patch release with a bunch of great fixes. But notably want to call out two major changes for anyone working on the pyinfra code itself (huge thank you Daan for implementing these):
@@ -40,6 +89,7 @@ New release with some really awesome new features, brought to you by the fantast
40
89
  - enable using SCP instead of SFTP for SSH file transfers (@DonDebonair)
41
90
 
42
91
  New and updated operations/facts:
92
+
43
93
  - facts/server: add `RebootRequired` fact (@wowi42)
44
94
  - operations/pip: support PEP-508 package versions (@morrison12)
45
95
  - operations+facts/docker: add Docker plugin support (@DonDebonair)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyinfra
3
- Version: 3.5.1
3
+ Version: 3.6
4
4
  Summary: pyinfra automates/provisions/manages/deploys infrastructure.
5
5
  Project-URL: homepage, https://pyinfra.com
6
6
  Project-URL: documentation, https://docs.pyinfra.com
@@ -29,6 +29,7 @@ Requires-Dist: gevent>=1.5
29
29
  Requires-Dist: jinja2<4,>3
30
30
  Requires-Dist: packaging>=16.1
31
31
  Requires-Dist: paramiko<4,>=2.7
32
+ Requires-Dist: pydantic<3,>=2.11
32
33
  Requires-Dist: python-dateutil<3,>2
33
34
  Requires-Dist: typeguard<5,>=4
34
35
  Requires-Dist: typing-extensions; python_version < '3.11'
@@ -56,7 +56,7 @@ class MyConnector(BaseConnector):
56
56
  @staticmethod
57
57
  def make_names_data(_=None):
58
58
  ... # see above
59
-
59
+
60
60
  def run_shell_command(
61
61
  self,
62
62
  command: StringCommand,
@@ -191,6 +191,60 @@ screen.
191
191
  `disconnect` can be used after all operations complete to clean up any connection/s remaining to the hosts being managed.
192
192
 
193
193
 
194
+ ## Implementing `run_shell_command`
195
+
196
+ When implementing `run_shell_command`, connectors should use pyinfra's command wrapping utilities rather than manually constructing commands. The `make_unix_command_for_host()` function from `pyinfra.connectors.util` handles shell wrapping, sudo elevation, environment variables, working directory changes, command retries and shell executable selection.
197
+
198
+ Its worth being aware that when passing `arguments` to `make_unix_command_for_host()`, connector control parameters must be filtered out. These parameters (`_success_exit_codes`, `_timeout`, `_get_pty`, `_stdin`) are defined in `pyinfra.api.arguments.ConnectorArguments` and are meant for the connector's internal logic after command generation, not for command construction itself.
199
+
200
+ The recommended approach is to use `extract_control_arguments()` from `pyinfra.connectors.util` which handles this filtering for you:
201
+
202
+ ```py
203
+ from pyinfra.connectors.util import extract_control_arguments, make_unix_command_for_host
204
+
205
+ class MyConnector(BaseConnector):
206
+ handles_execution = True
207
+
208
+ def run_shell_command(
209
+ self,
210
+ command: StringCommand,
211
+ print_output: bool = False,
212
+ print_input: bool = False,
213
+ **arguments: Unpack["ConnectorArguments"],
214
+ ) -> Tuple[bool, CommandOutput]:
215
+ """Execute a command with proper shell wrapping."""
216
+
217
+ # Extract and remove control parameters from arguments
218
+ # This modifies arguments dict in place and returns the extracted params
219
+ control_args = extract_control_arguments(arguments)
220
+
221
+ # Generate properly wrapped command with sudo, environment, etc
222
+ # arguments now contains only command generation parameters
223
+ wrapped_command = make_unix_command_for_host(
224
+ self.state,
225
+ self.host,
226
+ command,
227
+ **arguments,
228
+ )
229
+
230
+ # Use control parameters for execution
231
+ timeout = control_args.get("_timeout")
232
+ success_exit_codes = control_args.get("_success_exit_codes", [0])
233
+
234
+ # Execute the wrapped command using your connector's method
235
+ exit_code, output = self._execute(wrapped_command, timeout=timeout)
236
+
237
+ # Check success based on exit codes
238
+ success = exit_code in success_exit_codes
239
+
240
+ return success, output
241
+ ```
242
+
243
+ Without proper command wrapping, shell operators and complex commands will fail. For example `timeout 60 bash -c 'command' || true` executed without shell wrapping will result in `bash: ||: command not found`. PyInfra operations and fact gathering rely on shell operators (`&&`, `||`, pipes, redirects) so using `make_unix_command_for_host()` ensures your connector handles these correctly.
244
+
245
+ For complete examples see pyinfra's built-in connectors in `pyinfra/connectors/docker.py`, `pyinfra/connectors/chroot.py`, `pyinfra/connectors/ssh.py` and `pyinfra/connectors/local.py`, as well as the command wrapping utilities in `pyinfra/connectors/util.py`.
246
+
247
+
194
248
  ## pyproject.toml
195
249
 
196
250
  In order for pyinfra to gain knowledge about your connector, you need to add the following snippet to your connector's `pyproject.toml`:
@@ -3,7 +3,7 @@ Using the API
3
3
 
4
4
  In addition to :doc:`the pyinfra CLI <../cli>`, pyinfra provides a full Python API. As of ``v3`` this API can be considered mostly stable. See the :doc:`./reference`.
5
5
 
6
- You can also reference `pyinfra's own main.py <https://github.com/pyinfra-dev/pyinfra/blob/3.x/pyinfra_cli/main.py>`_, and the `pyinfra API source code <https://github.com/pyinfra-dev/pyinfra/tree/3.x/pyinfra/api>`_.
6
+ You can also reference `pyinfra's own main.py <https://github.com/pyinfra-dev/pyinfra/blob/3.x/src/pyinfra_cli/main.py>`_, and the `pyinfra API source code <https://github.com/pyinfra-dev/pyinfra/tree/3.x/src/pyinfra/api>`_.
7
7
 
8
8
  Full Example
9
9
  ------------
@@ -77,7 +77,7 @@ pyinfra @local ...
77
77
  pyinfra my-server.net,@local ...
78
78
 
79
79
  # Execute against a Docker container
80
- pyinfra @docker/centos:8 ...
80
+ pyinfra @docker/fedora:43 ...
81
81
  ```
82
82
 
83
83
  ### Limit
@@ -132,7 +132,7 @@ For example, here we ensure that `nginx` is installed on the remote servers:
132
132
  # Ubuntu example
133
133
  pyinfra inventory.py apt.packages nginx update=true _sudo=true
134
134
 
135
- # Centos example
135
+ # Fedora example
136
136
  pyinfra inventory2.py yum.packages nginx _sudo=true
137
137
  ```
138
138
 
@@ -27,10 +27,9 @@ To debug pyinfra within PyCharm, you need to [explicitly enable support for Geve
27
27
  pyinfra aims to be compatible with all Unix-like operating systems and is currently developed against:
28
28
 
29
29
  + Linux distros:
30
- * Ubuntu 18/20
30
+ * Ubuntu 20/22/24
31
31
  * Debian 9/10
32
- * CentOS 7/8
33
- * Fedora 33
32
+ * Fedora 43
34
33
  * Alpine 3.8
35
34
  + BSD flavours:
36
35
  * OpenBSD 6
@@ -5,6 +5,7 @@ from shutil import rmtree
5
5
  import guzzle_sphinx_theme
6
6
 
7
7
  from pyinfra import __version__, local
8
+ from pyinfra.api import metadata
8
9
 
9
10
  copyright = "Nick Barrett {0} — pyinfra v{1}".format(
10
11
  date.today().year,
@@ -57,9 +58,42 @@ exclude_patterns = [
57
58
  ]
58
59
 
59
60
 
61
+ def rstjinja(app, docname, source):
62
+ """
63
+ Render certain pages as a jinja templates.
64
+ """
65
+ # this should only be run when building html
66
+ if app.builder.format != "html":
67
+ return
68
+ # We currently only render docs/operations.rst
69
+ # and docs/facts.rst as jinja2 templates
70
+ if docname in ["operations", "facts"]:
71
+ src = source[0]
72
+ rendered = app.builder.templates.render_string(src, app.config.html_context)
73
+ source[0] = rendered
74
+
75
+
60
76
  def setup(app):
77
+ app.connect("source-read", rstjinja)
61
78
  this_dir = path.dirname(path.realpath(__file__))
62
79
  scripts_dir = path.abspath(path.join(this_dir, "..", "scripts"))
80
+ metadata_file = path.abspath(path.join(this_dir, "..", "pyinfra-metadata.toml"))
81
+ if not path.exists(metadata_file):
82
+ raise ValueError("No pyinfra-metadata.toml in project root")
83
+ with open(metadata_file, "r") as file:
84
+ metadata_text = file.read()
85
+ plugins = metadata.parse_plugins(metadata_text)
86
+
87
+ operation_plugins = sorted([p for p in plugins if p.type == "operation"], key=lambda p: p.name)
88
+ fact_plugins = sorted([p for p in plugins if p.type == "fact"], key=lambda p: p.name)
89
+ html_context = {
90
+ "operation_plugins": operation_plugins,
91
+ "fact_plugins": fact_plugins,
92
+ "tags": metadata.ALLOWED_TAGS,
93
+ "docs_language": language,
94
+ "docs_version": version,
95
+ }
96
+ app.config.html_context = html_context
63
97
 
64
98
  for auto_docs_name in ("operations", "facts", "apidoc", "connectors"):
65
99
  auto_docs_path = path.join(this_dir, auto_docs_name)
@@ -1,6 +1,14 @@
1
1
  Connectors Index
2
2
  ================
3
3
 
4
+ .. raw:: html
5
+
6
+ <nav class="under-title-tabs">
7
+ See also:
8
+ <a href="operations.html">Operations Index</a>
9
+ <a href="facts.html">Facts Index</a>
10
+ </nav>
11
+
4
12
  Connectors enable pyinfra to integrate with other tools out of the box. Connectors can do one of three things:
5
13
 
6
14
  + Implement how commands are executed (``@ssh``, ``@local``)
@@ -35,7 +35,7 @@ uv sync
35
35
 
36
36
  ### Code Style & Type Checking
37
37
 
38
- Code style is enforced via [ruff](https://docs.astral.sh/ruff/). Types are checked with mypy currently, and pyright is
38
+ Code style is enforced via [ruff](https://docs.astral.sh/ruff/). Types are checked with mypy currently, and pyright is
39
39
  recommended for local development though currently optional. There is a script to run the linting & type-checking:
40
40
 
41
41
  ```sh
@@ -96,5 +96,5 @@ scripts/build-public-docs.sh
96
96
  To view ([localhost:8000](http://localhost:8000)):
97
97
 
98
98
  ```sh
99
- python -m http.server -d docs/public/en/latest/
99
+ uv run -m http.server -d docs/public/en/latest/
100
100
  ```
@@ -0,0 +1,102 @@
1
+ Facts Index
2
+ ===========
3
+
4
+ .. raw:: html
5
+
6
+ <nav class="under-title-tabs">
7
+ See also:
8
+ <a href="operations.html">Operations Index</a>
9
+ <a href="connectors.html">Connectors Index</a>
10
+ </nav>
11
+
12
+ pyinfra uses **facts** to determine the existing state of a remote server. Operations use this information to generate commands which alter the state. Facts are read-only and are populated at the beginning of the deploy.
13
+
14
+ Facts can be executed/tested via the command line:
15
+
16
+ .. code:: sh
17
+
18
+ # Example how to get multiple facts from a server myhost.com
19
+ pyinfra myhost.com fact server.Date server.Hostname ...
20
+
21
+ If you want to pass an argument to a fact, pass it with ``key=value``. For example:
22
+
23
+ .. code:: sh
24
+
25
+ # See if the package 'openssh-server' is installed servers myhost.com and myhost2.com
26
+ pyinfra myhost.com,myhost2.com fact deb.DebPackage name=openssh-server
27
+
28
+ Multiple facts with arguments may be called like so:
29
+
30
+ .. code:: sh
31
+
32
+ pyinfra @local fact files.File path=setup.py files.File path=anotherfile.txt
33
+
34
+ You can leverage facts within :doc:`operations <using-operations>` like this:
35
+
36
+ .. code:: py
37
+
38
+ from pyinfra import host
39
+ from pyinfra.facts.server import LinuxName
40
+
41
+ if host.get_fact(LinuxName) == 'Ubuntu':
42
+ apt.packages(...)
43
+
44
+ **Want a new fact?** Check out :doc:`the writing facts guide <./api/operations>`.
45
+
46
+ .. raw:: html
47
+
48
+ <div class="container my-4">
49
+ <!-- Dropdown Filter -->
50
+ <div class="mb-4">
51
+ <label for="tag-dropdown" class="form-label">Filter by Tag:</label>
52
+ <select class="form-select" id="tag-dropdown">
53
+ <option value="All">All</option>
54
+ {% for tag in tags %}
55
+ <option value="{{ tag.title_case }}">{{ tag.title_case }}</option>
56
+ {% endfor %}
57
+ </select>
58
+ </div>
59
+
60
+ <!-- Cards Grid -->
61
+ <div class="row" id="card-container">
62
+ {% for plugin in fact_plugins %}
63
+ <div class="col-md-4 mb-4 card-item">
64
+ <div class="card h-100">
65
+ <div class="card-body">
66
+ <h5 class="card-title">
67
+ <a href="./facts/{{ plugin.name }}.html">
68
+ {{ plugin.name }}
69
+ </a>
70
+ <p class="card-text">{{ plugin.description }}</p>
71
+ {% for tag in plugin.tags %}
72
+ <span class="badge bg-secondary">{{ tag.title_case }}</span>
73
+ {% endfor %}
74
+ </div>
75
+ </div>
76
+ </div>
77
+ {% endfor %}
78
+ </div>
79
+ </div>
80
+ <script>
81
+ document.getElementById('tag-dropdown').addEventListener('change', function () {
82
+ const selectedTag = this.value;
83
+ const cards = document.querySelectorAll('.card-item');
84
+
85
+ cards.forEach(card => {
86
+ const tags = Array.from(card.querySelectorAll('.badge')).map(badge => badge.textContent.trim());
87
+
88
+ if (selectedTag === 'All' || tags.includes(selectedTag)) {
89
+ card.style.display = 'block';
90
+ } else {
91
+ card.style.display = 'none';
92
+ }
93
+ });
94
+ });
95
+ </script>
96
+
97
+ .. toctree::
98
+ :maxdepth: 2
99
+ :glob:
100
+ :hidden:
101
+
102
+ facts/*
@@ -20,6 +20,7 @@ The currently executing host can be fetched from the ``host`` context variable.
20
20
  # Get the actual current hostname from the host
21
21
  from pyinfra.facts.server import Hostname
22
22
  hostname = host.get_fact(Hostname)
23
+ print(f"hostname:{hostname}")
23
24
 
24
25
  How do I use sudo in an operation?
25
26
  ----------------------------------
@@ -28,6 +29,7 @@ Sudo is controlled by one of the `privilege and user escalation arguments <argum
28
29
 
29
30
  .. code:: python
30
31
 
32
+ from pyinfra.operations import apt
31
33
  apt.packages(
32
34
  packages=["iftop"],
33
35
  _sudo=True,
@@ -43,6 +45,7 @@ Use the LINK ``files.file``, ``files.directory`` or ``files.link`` operations to
43
45
 
44
46
  .. code:: python
45
47
 
48
+ from pyinfra.operations import files
46
49
  files.file(
47
50
  path="/etc/default/elasticsearch",
48
51
  user="pyinfra",
@@ -57,6 +60,7 @@ Use the `retry behavior arguments <arguments.html#retry-behavior>`_ to automatic
57
60
 
58
61
  .. code:: python
59
62
 
63
+ from pyinfra.operations import server
60
64
  # Retry a network operation up to 3 times
61
65
  server.shell(
62
66
  name="Download file with retries",
@@ -29,8 +29,11 @@ You can start pyinfra immediately with some ad-hoc command execution. The CLI al
29
29
  # Execute over SSH
30
30
  pyinfra my-server.net exec -- echo "hello world"
31
31
 
32
+ # Execute over SSH with options
33
+ pyinfra localhost --ssh-port 2222 --ssh-user vagrant exec -- echo "hello world"
34
+
32
35
  # Execute within a new docker container
33
- pyinfra @docker/ubuntu:18.04 exec -- echo "hello world"
36
+ pyinfra @docker/ubuntu:22.04 exec -- echo "hello world"
34
37
 
35
38
  # Execute on the local machine (MacOS/Linux only - for now)
36
39
  pyinfra @local exec -- echo "hello world"
@@ -66,8 +69,19 @@ To get started create an ``inventory.py`` containing our hosts to target:
66
69
 
67
70
  .. code:: python
68
71
 
69
- # Define a group as a list of hosts
70
- my_hosts = ["my-server.net", "@docker/ubuntu:18.04"]
72
+ # Define a group as a list of hosts
73
+ my_hosts = [
74
+ # vagrant instance
75
+ ("ubuntu2204", {
76
+ "ssh_port": 2222,
77
+ "ssh_hostname": "localhost",
78
+ "ssh_user": "vagrant",
79
+ "_sudo": True
80
+ }),
81
+ "my-server.net",
82
+ "@docker/ubuntu:22.04"
83
+ ]
84
+
71
85
 
72
86
  Now create a ``deploy.py`` containing our operations to execute:
73
87
 
@@ -79,7 +93,7 @@ Now create a ``deploy.py`` containing our operations to execute:
79
93
  apt.packages(
80
94
  name="Ensure the vim apt package is installed",
81
95
  packages=["vim"],
82
- _sudo=True, # use sudo when installing the packages
96
+ update=True,
83
97
  )
84
98
 
85
99
  This can now be executed like this:
@@ -0,0 +1,73 @@
1
+ Operations Index
2
+ ================
3
+
4
+ .. raw:: html
5
+
6
+ <nav class="under-title-tabs">
7
+ See also:
8
+ <a href="facts.html">Facts Index</a>
9
+ <a href="connectors.html">Connectors Index</a>
10
+ </nav>
11
+
12
+ Operations are used to describe changes to make to systems in the inventory. Use them to define state and pyinfra will make any necessary changes to reach that state. All operations accept a set of :doc:`global arguments <arguments>` and are grouped as Python modules.
13
+
14
+ **Want a new operation?** Check out :doc:`the writing operations guide <./api/operations>`.
15
+
16
+ .. raw:: html
17
+
18
+ <div class="container my-4">
19
+ <!-- Dropdown Filter -->
20
+ <div class="mb-4">
21
+ <label for="tag-dropdown" class="form-label">Filter by Tag:</label>
22
+ <select class="form-select" id="tag-dropdown">
23
+ <option value="All">All</option>
24
+ {% for tag in tags %}
25
+ <option value="{{ tag.title_case }}">{{ tag.title_case }}</option>
26
+ {% endfor %}
27
+ </select>
28
+ </div>
29
+
30
+ <!-- Cards Grid -->
31
+ <div class="row" id="card-container">
32
+ {% for plugin in operation_plugins %}
33
+ <div class="col-md-4 mb-4 card-item">
34
+ <div class="card h-100">
35
+ <div class="card-body">
36
+ <h5 class="card-title">
37
+ <a href="./operations/{{ plugin.name }}.html">
38
+ {{ plugin.name }}
39
+ </a>
40
+ </h5>
41
+ <p class="card-text">{{ plugin.description }}</p>
42
+ {% for tag in plugin.tags %}
43
+ <span class="badge bg-secondary">{{ tag.title_case }}</span>
44
+ {% endfor %}
45
+ </div>
46
+ </div>
47
+ </div>
48
+ {% endfor %}
49
+ </div>
50
+ </div>
51
+ <script>
52
+ document.getElementById('tag-dropdown').addEventListener('change', function () {
53
+ const selectedTag = this.value;
54
+ const cards = document.querySelectorAll('.card-item');
55
+
56
+ cards.forEach(card => {
57
+ const tags = Array.from(card.querySelectorAll('.badge')).map(badge => badge.textContent.trim());
58
+
59
+ if (selectedTag === 'All' || tags.includes(selectedTag)) {
60
+ card.style.display = 'block';
61
+ } else {
62
+ card.style.display = 'none';
63
+ }
64
+ });
65
+ });
66
+ </script>
67
+
68
+ .. toctree::
69
+ :maxdepth: 2
70
+ :glob:
71
+ :hidden:
72
+
73
+ operations/*