pyinfra 3.5.1__tar.gz → 3.6.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1452) hide show
  1. pyinfra-3.6.1/.claude/settings.local.json +16 -0
  2. pyinfra-3.6.1/.claude/skills/generatechangelog/SKILL.md +10 -0
  3. pyinfra-3.6.1/.github/workflows/test.yml +125 -0
  4. pyinfra-3.6.1/.issues/1019.md +199 -0
  5. pyinfra-3.6.1/.issues/1026.md +299 -0
  6. pyinfra-3.6.1/.issues/1061.md +275 -0
  7. pyinfra-3.6.1/.issues/1125.md +247 -0
  8. pyinfra-3.6.1/.issues/1154.md +336 -0
  9. pyinfra-3.6.1/.issues/1280.md +273 -0
  10. pyinfra-3.6.1/.issues/1292.md +261 -0
  11. pyinfra-3.6.1/.issues/1303.md +140 -0
  12. pyinfra-3.6.1/.issues/1339.md +235 -0
  13. pyinfra-3.6.1/.issues/1370.md +351 -0
  14. pyinfra-3.6.1/.issues/1389.md +281 -0
  15. pyinfra-3.6.1/.issues/1394.md +208 -0
  16. pyinfra-3.6.1/.issues/1400.md +277 -0
  17. pyinfra-3.6.1/.issues/1426.md +265 -0
  18. pyinfra-3.6.1/.issues/1440.md +297 -0
  19. pyinfra-3.6.1/.issues/1445.md +229 -0
  20. pyinfra-3.6.1/.issues/1496.md +222 -0
  21. pyinfra-3.6.1/.issues/533.md +344 -0
  22. pyinfra-3.6.1/.issues/546.md +242 -0
  23. pyinfra-3.6.1/.issues/615.md +233 -0
  24. pyinfra-3.6.1/.issues/736.md +275 -0
  25. pyinfra-3.6.1/.issues/791.md +279 -0
  26. pyinfra-3.6.1/.issues/807.md +343 -0
  27. pyinfra-3.6.1/.issues/936.md +287 -0
  28. pyinfra-3.6.1/.issues/940.md +274 -0
  29. pyinfra-3.6.1/.issues/945.md +263 -0
  30. pyinfra-3.6.1/.issues/979.md +168 -0
  31. pyinfra-3.6.1/.issues/994.md +230 -0
  32. pyinfra-3.6.1/AGENTS.md +6 -0
  33. pyinfra-3.6.1/CHANGELOG.md +406 -0
  34. pyinfra-3.6.1/CLAUDE.md +1 -0
  35. pyinfra-3.6.1/PKG-INFO +142 -0
  36. pyinfra-3.6.1/docs/api/connectors.md +262 -0
  37. pyinfra-3.6.1/docs/api/index.rst +66 -0
  38. pyinfra-3.6.1/docs/arguments.rst +11 -0
  39. pyinfra-3.6.1/docs/cli.md +180 -0
  40. pyinfra-3.6.1/docs/compatibility.md +103 -0
  41. pyinfra-3.6.1/docs/conf.py +113 -0
  42. pyinfra-3.6.1/docs/connectors.rst +56 -0
  43. pyinfra-3.6.1/docs/contributing.md +104 -0
  44. pyinfra-3.6.1/docs/examples/data_multiple_environments.md +38 -0
  45. pyinfra-3.6.1/docs/examples/dynamic_execution_deploy.md +41 -0
  46. pyinfra-3.6.1/docs/facts.rst +102 -0
  47. pyinfra-3.6.1/docs/faq.rst +84 -0
  48. pyinfra-3.6.1/docs/getting-started.rst +113 -0
  49. pyinfra-3.6.1/docs/inventory-data.rst +160 -0
  50. pyinfra-3.6.1/docs/operations.rst +73 -0
  51. pyinfra-3.6.1/docs/support.md +20 -0
  52. pyinfra-3.6.1/docs/using-operations.rst +376 -0
  53. pyinfra-3.6.1/docs/utils.py +13 -0
  54. pyinfra-3.6.1/pyinfra-metadata-schema-1.0.0.json +57 -0
  55. pyinfra-3.6.1/pyinfra-metadata.toml +550 -0
  56. pyinfra-3.6.1/pyproject.toml +141 -0
  57. pyinfra-3.6.1/scripts/build-public-docs.sh +61 -0
  58. pyinfra-3.6.1/scripts/dev-format.sh +6 -0
  59. pyinfra-3.6.1/scripts/dev-lint.sh +14 -0
  60. pyinfra-3.6.1/scripts/generate_arguments_doc.py +92 -0
  61. pyinfra-3.6.1/scripts/generate_facts_docs.py +146 -0
  62. pyinfra-3.6.1/scripts/generate_operations_docs.py +222 -0
  63. pyinfra-3.6.1/scripts/lint_arguments_sync.py +208 -0
  64. pyinfra-3.6.1/scripts/make_github_release.py +46 -0
  65. pyinfra-3.6.1/src/pyinfra/api/__init__.py +27 -0
  66. pyinfra-3.6.1/src/pyinfra/api/arguments.py +413 -0
  67. pyinfra-3.6.1/src/pyinfra/api/arguments_typed.py +74 -0
  68. pyinfra-3.6.1/src/pyinfra/api/command.py +280 -0
  69. pyinfra-3.6.1/src/pyinfra/api/deploy.py +97 -0
  70. pyinfra-3.6.1/src/pyinfra/api/exceptions.py +102 -0
  71. pyinfra-3.6.1/src/pyinfra/api/facts.py +326 -0
  72. pyinfra-3.6.1/src/pyinfra/api/host.py +463 -0
  73. pyinfra-3.6.1/src/pyinfra/api/inventory.py +252 -0
  74. pyinfra-3.6.1/src/pyinfra/api/metadata.py +69 -0
  75. pyinfra-3.6.1/src/pyinfra/api/operation.py +501 -0
  76. pyinfra-3.6.1/src/pyinfra/api/operations.py +399 -0
  77. pyinfra-3.6.1/src/pyinfra/api/util.py +470 -0
  78. pyinfra-3.6.1/src/pyinfra/connectors/docker.py +405 -0
  79. pyinfra-3.6.1/src/pyinfra/connectors/ssh.py +727 -0
  80. pyinfra-3.6.1/src/pyinfra/connectors/sshuserclient/client.py +328 -0
  81. pyinfra-3.6.1/src/pyinfra/connectors/util.py +417 -0
  82. pyinfra-3.6.1/src/pyinfra/facts/crontab.py +197 -0
  83. pyinfra-3.6.1/src/pyinfra/facts/files.py +686 -0
  84. pyinfra-3.6.1/src/pyinfra/facts/flatpak.py +77 -0
  85. pyinfra-3.6.1/src/pyinfra/facts/npm.py +38 -0
  86. pyinfra-3.6.1/src/pyinfra/facts/server.py +970 -0
  87. pyinfra-3.6.1/src/pyinfra/operations/apk.py +99 -0
  88. pyinfra-3.6.1/src/pyinfra/operations/apt.py +496 -0
  89. pyinfra-3.6.1/src/pyinfra/operations/brew.py +232 -0
  90. pyinfra-3.6.1/src/pyinfra/operations/crontab.py +194 -0
  91. pyinfra-3.6.1/src/pyinfra/operations/dnf.py +213 -0
  92. pyinfra-3.6.1/src/pyinfra/operations/docker.py +500 -0
  93. pyinfra-3.6.1/src/pyinfra/operations/files.py +2014 -0
  94. pyinfra-3.6.1/src/pyinfra/operations/flatpak.py +95 -0
  95. pyinfra-3.6.1/src/pyinfra/operations/gem.py +48 -0
  96. pyinfra-3.6.1/src/pyinfra/operations/git.py +420 -0
  97. pyinfra-3.6.1/src/pyinfra/operations/iptables.py +312 -0
  98. pyinfra-3.6.1/src/pyinfra/operations/lxd.py +69 -0
  99. pyinfra-3.6.1/src/pyinfra/operations/mysql.py +610 -0
  100. pyinfra-3.6.1/src/pyinfra/operations/opkg.py +89 -0
  101. pyinfra-3.6.1/src/pyinfra/operations/pacman.py +82 -0
  102. pyinfra-3.6.1/src/pyinfra/operations/pip.py +206 -0
  103. pyinfra-3.6.1/src/pyinfra/operations/pipx.py +103 -0
  104. pyinfra-3.6.1/src/pyinfra/operations/pkg.py +71 -0
  105. pyinfra-3.6.1/src/pyinfra/operations/pkgin.py +92 -0
  106. pyinfra-3.6.1/src/pyinfra/operations/postgres.py +442 -0
  107. pyinfra-3.6.1/src/pyinfra/operations/puppet.py +41 -0
  108. pyinfra-3.6.1/src/pyinfra/operations/python.py +73 -0
  109. pyinfra-3.6.1/src/pyinfra/operations/selinux.py +190 -0
  110. pyinfra-3.6.1/src/pyinfra/operations/server.py +1100 -0
  111. pyinfra-3.6.1/src/pyinfra/operations/snap.py +118 -0
  112. pyinfra-3.6.1/src/pyinfra/operations/ssh.py +217 -0
  113. pyinfra-3.6.1/src/pyinfra/operations/systemd.py +150 -0
  114. pyinfra-3.6.1/src/pyinfra/operations/sysvinit.py +142 -0
  115. pyinfra-3.6.1/src/pyinfra/operations/util/docker.py +415 -0
  116. pyinfra-3.6.1/src/pyinfra/operations/util/packaging.py +338 -0
  117. pyinfra-3.6.1/src/pyinfra/operations/xbps.py +78 -0
  118. pyinfra-3.6.1/src/pyinfra/operations/yum.py +213 -0
  119. pyinfra-3.6.1/src/pyinfra/operations/zfs.py +176 -0
  120. pyinfra-3.6.1/src/pyinfra/operations/zypper.py +193 -0
  121. pyinfra-3.6.1/src/pyinfra_cli/cli.py +796 -0
  122. pyinfra-3.6.1/src/pyinfra_cli/inventory.py +368 -0
  123. pyinfra-3.6.1/src/pyinfra_cli/util.py +239 -0
  124. pyinfra-3.6.1/tests/facts/files.FileContents/empty_file.json +6 -0
  125. pyinfra-3.6.1/tests/facts/files.FileContents/file.json +6 -0
  126. pyinfra-3.6.1/tests/facts/files.FileContents/no_file.json +6 -0
  127. pyinfra-3.6.1/tests/facts/files.FindFiles/files_with_args.json +14 -0
  128. pyinfra-3.6.1/tests/facts/flatpak.FlatpakPackages/packages_no_header.json +16 -0
  129. pyinfra-3.6.1/tests/facts/npm.NpmPackages/local_packages.json +13 -0
  130. pyinfra-3.6.1/tests/facts/server.TmpDir/default_fallback.json +5 -0
  131. pyinfra-3.6.1/tests/facts/server.TmpDir/temp_set.json +5 -0
  132. pyinfra-3.6.1/tests/facts/server.TmpDir/tmp_set.json +5 -0
  133. pyinfra-3.6.1/tests/facts/server.TmpDir/tmpdir_set.json +5 -0
  134. pyinfra-3.6.1/tests/operations/apt.packages/update_cached_tz.json +17 -0
  135. pyinfra-3.6.1/tests/operations/docker.container/add_container_with_labels.json +19 -0
  136. pyinfra-3.6.1/tests/operations/docker.image/force_pull_image.json +27 -0
  137. pyinfra-3.6.1/tests/operations/docker.image/image_from_github_registry_exists.json +26 -0
  138. pyinfra-3.6.1/tests/operations/docker.image/image_with_digest_exists.json +24 -0
  139. pyinfra-3.6.1/tests/operations/docker.image/image_with_digest_not_exists.json +15 -0
  140. pyinfra-3.6.1/tests/operations/docker.image/image_with_latest_tag_always_pull.json +27 -0
  141. pyinfra-3.6.1/tests/operations/docker.image/image_with_specific_tag_exists.json +26 -0
  142. pyinfra-3.6.1/tests/operations/docker.image/image_with_specific_tag_not_exists.json +15 -0
  143. pyinfra-3.6.1/tests/operations/docker.image/image_with_tag_and_digest.json +16 -0
  144. pyinfra-3.6.1/tests/operations/docker.image/image_with_tag_and_digest_different_digest.json +15 -0
  145. pyinfra-3.6.1/tests/operations/docker.image/image_with_tag_and_digest_different_tag.json +26 -0
  146. pyinfra-3.6.1/tests/operations/docker.image/image_without_tag_always_pull.json +27 -0
  147. pyinfra-3.6.1/tests/operations/docker.image/pull_image_from_private_registry.json +15 -0
  148. pyinfra-3.6.1/tests/operations/docker.image/remove_existing_image.json +26 -0
  149. pyinfra-3.6.1/tests/operations/docker.image/remove_nonexistent_image.json +13 -0
  150. pyinfra-3.6.1/tests/operations/files.block/add_existing_block_different_content.json +24 -0
  151. pyinfra-3.6.1/tests/operations/files.block/add_existing_block_different_content_and_backup.json +25 -0
  152. pyinfra-3.6.1/tests/operations/files.block/add_existing_block_different_content_multiple_lines.json +28 -0
  153. pyinfra-3.6.1/tests/operations/files.block/add_no_existing_block_and_no_line.json +22 -0
  154. pyinfra-3.6.1/tests/operations/files.block/add_no_existing_block_line_provided.json +22 -0
  155. pyinfra-3.6.1/tests/operations/files.block/add_no_existing_block_line_provided_escape_regex.json +23 -0
  156. pyinfra-3.6.1/tests/operations/files.block/add_no_existing_file.json +22 -0
  157. pyinfra-3.6.1/tests/operations/files.block/remove_but_content_not_none.json +23 -0
  158. pyinfra-3.6.1/tests/operations/files.block/remove_existing_block.json +22 -0
  159. pyinfra-3.6.1/tests/operations/files.copy/copies_directory.json +22 -0
  160. pyinfra-3.6.1/tests/operations/files.copy/copies_directory_overwriting.json +21 -0
  161. pyinfra-3.6.1/tests/operations/files.copy/copies_file.json +19 -0
  162. pyinfra-3.6.1/tests/operations/files.copy/copies_file_overwriting.json +19 -0
  163. pyinfra-3.6.1/tests/operations/files.copy/invalid_dest.json +21 -0
  164. pyinfra-3.6.1/tests/operations/files.copy/invalid_overwrite.json +26 -0
  165. pyinfra-3.6.1/tests/operations/files.copy/invalid_src.json +21 -0
  166. pyinfra-3.6.1/tests/operations/files.copy/noop_dest_file_exists.json +24 -0
  167. pyinfra-3.6.1/tests/operations/files.link/edit_trailing_slash.json +19 -0
  168. pyinfra-3.6.1/tests/test_api/test_api_operations.py +1124 -0
  169. pyinfra-3.6.1/tests/test_cli/test_cli.py +196 -0
  170. pyinfra-3.6.1/tests/test_connectors/test_docker.py +284 -0
  171. pyinfra-3.6.1/tests/test_connectors/test_ssh.py +1335 -0
  172. pyinfra-3.6.1/tests/test_connectors/test_sshuserclient.py +310 -0
  173. pyinfra-3.6.1/tests/test_facts.py +130 -0
  174. pyinfra-3.6.1/tests/test_operations_utils.py +297 -0
  175. pyinfra-3.6.1/tests/util.py +482 -0
  176. pyinfra-3.6.1/uv.lock +1931 -0
  177. pyinfra-3.5.1/.github/workflows/test.yml +0 -117
  178. pyinfra-3.5.1/CHANGELOG.md +0 -314
  179. pyinfra-3.5.1/PKG-INFO +0 -141
  180. pyinfra-3.5.1/docs/api/connectors.md +0 -206
  181. pyinfra-3.5.1/docs/api/index.rst +0 -66
  182. pyinfra-3.5.1/docs/arguments.rst +0 -9
  183. pyinfra-3.5.1/docs/cli.md +0 -180
  184. pyinfra-3.5.1/docs/compatibility.md +0 -104
  185. pyinfra-3.5.1/docs/conf.py +0 -79
  186. pyinfra-3.5.1/docs/connectors.rst +0 -48
  187. pyinfra-3.5.1/docs/contributing.md +0 -100
  188. pyinfra-3.5.1/docs/examples/data_multiple_environments.md +0 -38
  189. pyinfra-3.5.1/docs/examples/dynamic_execution_deploy.md +0 -41
  190. pyinfra-3.5.1/docs/facts.rst +0 -60
  191. pyinfra-3.5.1/docs/faq.rst +0 -80
  192. pyinfra-3.5.1/docs/getting-started.rst +0 -99
  193. pyinfra-3.5.1/docs/inventory-data.rst +0 -160
  194. pyinfra-3.5.1/docs/operations.rst +0 -56
  195. pyinfra-3.5.1/docs/support.md +0 -20
  196. pyinfra-3.5.1/docs/using-operations.rst +0 -345
  197. pyinfra-3.5.1/docs/utils.py +0 -13
  198. pyinfra-3.5.1/pyproject.toml +0 -140
  199. pyinfra-3.5.1/scripts/build-public-docs.sh +0 -37
  200. pyinfra-3.5.1/scripts/dev-lint.sh +0 -14
  201. pyinfra-3.5.1/scripts/generate_arguments_doc.py +0 -91
  202. pyinfra-3.5.1/scripts/generate_facts_docs.py +0 -146
  203. pyinfra-3.5.1/scripts/generate_operations_docs.py +0 -222
  204. pyinfra-3.5.1/scripts/make_github_release.py +0 -46
  205. pyinfra-3.5.1/src/pyinfra/api/__init__.py +0 -26
  206. pyinfra-3.5.1/src/pyinfra/api/arguments.py +0 -406
  207. pyinfra-3.5.1/src/pyinfra/api/arguments_typed.py +0 -79
  208. pyinfra-3.5.1/src/pyinfra/api/command.py +0 -274
  209. pyinfra-3.5.1/src/pyinfra/api/deploy.py +0 -97
  210. pyinfra-3.5.1/src/pyinfra/api/exceptions.py +0 -90
  211. pyinfra-3.5.1/src/pyinfra/api/facts.py +0 -310
  212. pyinfra-3.5.1/src/pyinfra/api/host.py +0 -460
  213. pyinfra-3.5.1/src/pyinfra/api/inventory.py +0 -252
  214. pyinfra-3.5.1/src/pyinfra/api/operation.py +0 -496
  215. pyinfra-3.5.1/src/pyinfra/api/operations.py +0 -397
  216. pyinfra-3.5.1/src/pyinfra/api/util.py +0 -453
  217. pyinfra-3.5.1/src/pyinfra/connectors/docker.py +0 -381
  218. pyinfra-3.5.1/src/pyinfra/connectors/ssh.py +0 -670
  219. pyinfra-3.5.1/src/pyinfra/connectors/sshuserclient/client.py +0 -309
  220. pyinfra-3.5.1/src/pyinfra/connectors/util.py +0 -410
  221. pyinfra-3.5.1/src/pyinfra/facts/crontab.py +0 -195
  222. pyinfra-3.5.1/src/pyinfra/facts/files.py +0 -677
  223. pyinfra-3.5.1/src/pyinfra/facts/flatpak.py +0 -77
  224. pyinfra-3.5.1/src/pyinfra/facts/npm.py +0 -38
  225. pyinfra-3.5.1/src/pyinfra/facts/server.py +0 -954
  226. pyinfra-3.5.1/src/pyinfra/operations/apk.py +0 -98
  227. pyinfra-3.5.1/src/pyinfra/operations/apt.py +0 -488
  228. pyinfra-3.5.1/src/pyinfra/operations/brew.py +0 -231
  229. pyinfra-3.5.1/src/pyinfra/operations/crontab.py +0 -191
  230. pyinfra-3.5.1/src/pyinfra/operations/dnf.py +0 -210
  231. pyinfra-3.5.1/src/pyinfra/operations/docker.py +0 -446
  232. pyinfra-3.5.1/src/pyinfra/operations/files.py +0 -1939
  233. pyinfra-3.5.1/src/pyinfra/operations/flatpak.py +0 -94
  234. pyinfra-3.5.1/src/pyinfra/operations/gem.py +0 -47
  235. pyinfra-3.5.1/src/pyinfra/operations/git.py +0 -419
  236. pyinfra-3.5.1/src/pyinfra/operations/iptables.py +0 -311
  237. pyinfra-3.5.1/src/pyinfra/operations/lxd.py +0 -68
  238. pyinfra-3.5.1/src/pyinfra/operations/mysql.py +0 -609
  239. pyinfra-3.5.1/src/pyinfra/operations/opkg.py +0 -88
  240. pyinfra-3.5.1/src/pyinfra/operations/pacman.py +0 -81
  241. pyinfra-3.5.1/src/pyinfra/operations/pip.py +0 -205
  242. pyinfra-3.5.1/src/pyinfra/operations/pipx.py +0 -102
  243. pyinfra-3.5.1/src/pyinfra/operations/pkg.py +0 -70
  244. pyinfra-3.5.1/src/pyinfra/operations/pkgin.py +0 -91
  245. pyinfra-3.5.1/src/pyinfra/operations/postgres.py +0 -436
  246. pyinfra-3.5.1/src/pyinfra/operations/puppet.py +0 -40
  247. pyinfra-3.5.1/src/pyinfra/operations/python.py +0 -72
  248. pyinfra-3.5.1/src/pyinfra/operations/selinux.py +0 -189
  249. pyinfra-3.5.1/src/pyinfra/operations/server.py +0 -1099
  250. pyinfra-3.5.1/src/pyinfra/operations/snap.py +0 -117
  251. pyinfra-3.5.1/src/pyinfra/operations/ssh.py +0 -216
  252. pyinfra-3.5.1/src/pyinfra/operations/systemd.py +0 -149
  253. pyinfra-3.5.1/src/pyinfra/operations/sysvinit.py +0 -141
  254. pyinfra-3.5.1/src/pyinfra/operations/util/docker.py +0 -251
  255. pyinfra-3.5.1/src/pyinfra/operations/util/packaging.py +0 -336
  256. pyinfra-3.5.1/src/pyinfra/operations/xbps.py +0 -77
  257. pyinfra-3.5.1/src/pyinfra/operations/yum.py +0 -210
  258. pyinfra-3.5.1/src/pyinfra/operations/zfs.py +0 -175
  259. pyinfra-3.5.1/src/pyinfra/operations/zypper.py +0 -192
  260. pyinfra-3.5.1/src/pyinfra_cli/cli.py +0 -780
  261. pyinfra-3.5.1/src/pyinfra_cli/inventory.py +0 -343
  262. pyinfra-3.5.1/src/pyinfra_cli/util.py +0 -239
  263. pyinfra-3.5.1/tests/facts/files.FileContents/file.json +0 -6
  264. pyinfra-3.5.1/tests/facts/files.FileContents/no_file.json +0 -6
  265. pyinfra-3.5.1/tests/facts/npm.NpmPackages/local_packages.json +0 -13
  266. pyinfra-3.5.1/tests/operations/crontab.crontab/edit_existing_with_newline.json +0 -26
  267. pyinfra-3.5.1/tests/operations/docker.image/pull_image.json +0 -12
  268. pyinfra-3.5.1/tests/operations/docker.image/remove_image.json +0 -12
  269. pyinfra-3.5.1/tests/operations/files.block/add_existing_block_different_content.json +0 -17
  270. pyinfra-3.5.1/tests/operations/files.block/add_existing_block_different_content_and_backup.json +0 -18
  271. pyinfra-3.5.1/tests/operations/files.block/add_existing_block_different_content_multiple_lines.json +0 -17
  272. pyinfra-3.5.1/tests/operations/files.block/add_no_existing_block_and_no_line.json +0 -17
  273. pyinfra-3.5.1/tests/operations/files.block/add_no_existing_block_line_provided.json +0 -17
  274. pyinfra-3.5.1/tests/operations/files.block/add_no_existing_block_line_provided_escape_regex.json +0 -18
  275. pyinfra-3.5.1/tests/operations/files.block/add_no_existing_file.json +0 -17
  276. pyinfra-3.5.1/tests/operations/files.block/remove_but_content_not_none.json +0 -16
  277. pyinfra-3.5.1/tests/operations/files.block/remove_existing_block.json +0 -15
  278. pyinfra-3.5.1/tests/test_api/test_api_operations.py +0 -949
  279. pyinfra-3.5.1/tests/test_cli/test_cli.py +0 -195
  280. pyinfra-3.5.1/tests/test_connectors/test_docker.py +0 -234
  281. pyinfra-3.5.1/tests/test_connectors/test_ssh.py +0 -1246
  282. pyinfra-3.5.1/tests/test_connectors/test_sshuserclient.py +0 -273
  283. pyinfra-3.5.1/tests/test_facts.py +0 -128
  284. pyinfra-3.5.1/tests/test_operations_utils.py +0 -17
  285. pyinfra-3.5.1/tests/util.py +0 -479
  286. pyinfra-3.5.1/uv.lock +0 -1683
  287. {pyinfra-3.5.1 → pyinfra-3.6.1}/.editorconfig +0 -0
  288. {pyinfra-3.5.1 → pyinfra-3.6.1}/.git-blame-ignore-revs +0 -0
  289. {pyinfra-3.5.1 → pyinfra-3.6.1}/.github/FUNDING.yml +0 -0
  290. {pyinfra-3.5.1 → pyinfra-3.6.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  291. {pyinfra-3.5.1 → pyinfra-3.6.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  292. {pyinfra-3.5.1 → pyinfra-3.6.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  293. {pyinfra-3.5.1 → pyinfra-3.6.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  294. {pyinfra-3.5.1 → pyinfra-3.6.1}/.github/workflows/docs.yml +0 -0
  295. {pyinfra-3.5.1 → pyinfra-3.6.1}/.gitignore +0 -0
  296. {pyinfra-3.5.1 → pyinfra-3.6.1}/.typos.toml +0 -0
  297. {pyinfra-3.5.1 → pyinfra-3.6.1}/CONTRIBUTING.md +0 -0
  298. {pyinfra-3.5.1 → pyinfra-3.6.1}/LICENSE.md +0 -0
  299. {pyinfra-3.5.1 → pyinfra-3.6.1}/README.md +0 -0
  300. {pyinfra-3.5.1 → pyinfra-3.6.1}/codecov.yml +0 -0
  301. {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/__init__.py +0 -0
  302. {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/api/deploys.md +0 -0
  303. {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/api/facts.md +0 -0
  304. {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/api/operations.md +0 -0
  305. {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/api/reference.rst +0 -0
  306. {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/changes.rst +0 -0
  307. {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/deploy-process.rst +0 -0
  308. {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/examples/client_side_assets.md +0 -0
  309. {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/examples/dynamic_inventories_data.md +0 -0
  310. {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/examples/groups_roles.md +0 -0
  311. {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/examples/secret_storage.md +0 -0
  312. {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/examples.rst +0 -0
  313. {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/index.rst +0 -0
  314. {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/install.md +0 -0
  315. {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/performance.rst +0 -0
  316. {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/static/logo_small.png +0 -0
  317. {pyinfra-3.5.1 → pyinfra-3.6.1}/docs/static/performance.png +0 -0
  318. {pyinfra-3.5.1 → pyinfra-3.6.1}/examples/README.md +0 -0
  319. {pyinfra-3.5.1 → pyinfra-3.6.1}/scripts/__init__.py +0 -0
  320. {pyinfra-3.5.1 → pyinfra-3.6.1}/scripts/cleanup_words.py +0 -0
  321. {pyinfra-3.5.1 → pyinfra-3.6.1}/scripts/dev-test-e2e.sh +0 -0
  322. {pyinfra-3.5.1 → pyinfra-3.6.1}/scripts/dev-test.sh +0 -0
  323. {pyinfra-3.5.1 → pyinfra-3.6.1}/scripts/generate_api_docs.py +0 -0
  324. {pyinfra-3.5.1 → pyinfra-3.6.1}/scripts/generate_connectors_docs.py +0 -0
  325. {pyinfra-3.5.1 → pyinfra-3.6.1}/scripts/generate_next_version.py +0 -0
  326. {pyinfra-3.5.1 → pyinfra-3.6.1}/scripts/generate_redirect_pages.py +0 -0
  327. {pyinfra-3.5.1 → pyinfra-3.6.1}/scripts/pyinfra-complete.sh +0 -0
  328. {pyinfra-3.5.1 → pyinfra-3.6.1}/scripts/pyinfra-complete.zsh +0 -0
  329. {pyinfra-3.5.1 → pyinfra-3.6.1}/scripts/release.sh +0 -0
  330. {pyinfra-3.5.1 → pyinfra-3.6.1}/scripts/spellcheck.sh +0 -0
  331. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/__init__.py +0 -0
  332. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/__main__.py +0 -0
  333. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/api/config.py +0 -0
  334. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/api/connect.py +0 -0
  335. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/api/connectors.py +0 -0
  336. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/api/state.py +0 -0
  337. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/connectors/__init__.py +0 -0
  338. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/connectors/base.py +0 -0
  339. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/connectors/chroot.py +0 -0
  340. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/connectors/dockerssh.py +0 -0
  341. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/connectors/local.py +0 -0
  342. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/connectors/scp/__init__.py +0 -0
  343. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/connectors/scp/client.py +0 -0
  344. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/connectors/ssh_util.py +0 -0
  345. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/connectors/sshuserclient/__init__.py +0 -0
  346. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/connectors/sshuserclient/config.py +0 -0
  347. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/connectors/terraform.py +0 -0
  348. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/connectors/vagrant.py +0 -0
  349. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/context.py +0 -0
  350. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/__init__.py +0 -0
  351. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/apk.py +0 -0
  352. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/apt.py +0 -0
  353. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/brew.py +0 -0
  354. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/bsdinit.py +0 -0
  355. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/cargo.py +0 -0
  356. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/choco.py +0 -0
  357. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/deb.py +0 -0
  358. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/dnf.py +0 -0
  359. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/docker.py +0 -0
  360. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/efibootmgr.py +0 -0
  361. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/freebsd.py +0 -0
  362. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/gem.py +0 -0
  363. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/git.py +0 -0
  364. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/gpg.py +0 -0
  365. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/hardware.py +0 -0
  366. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/iptables.py +0 -0
  367. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/launchd.py +0 -0
  368. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/lxd.py +0 -0
  369. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/mysql.py +0 -0
  370. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/openrc.py +0 -0
  371. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/opkg.py +0 -0
  372. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/pacman.py +0 -0
  373. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/pip.py +0 -0
  374. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/pipx.py +0 -0
  375. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/pkg.py +0 -0
  376. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/pkgin.py +0 -0
  377. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/podman.py +0 -0
  378. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/postgres.py +0 -0
  379. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/postgresql.py +0 -0
  380. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/rpm.py +0 -0
  381. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/runit.py +0 -0
  382. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/selinux.py +0 -0
  383. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/snap.py +0 -0
  384. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/systemd.py +0 -0
  385. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/sysvinit.py +0 -0
  386. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/upstart.py +0 -0
  387. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/util/__init__.py +0 -0
  388. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/util/databases.py +0 -0
  389. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/util/packaging.py +0 -0
  390. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/util/units.py +0 -0
  391. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/util/win_files.py +0 -0
  392. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/vzctl.py +0 -0
  393. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/xbps.py +0 -0
  394. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/yum.py +0 -0
  395. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/zfs.py +0 -0
  396. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/facts/zypper.py +0 -0
  397. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/local.py +0 -0
  398. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/__init__.py +0 -0
  399. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/bsdinit.py +0 -0
  400. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/cargo.py +0 -0
  401. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/choco.py +0 -0
  402. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/freebsd/__init__.py +0 -0
  403. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/freebsd/freebsd_update.py +0 -0
  404. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/freebsd/pkg.py +0 -0
  405. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/freebsd/service.py +0 -0
  406. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/freebsd/sysrc.py +0 -0
  407. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/launchd.py +0 -0
  408. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/npm.py +0 -0
  409. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/openrc.py +0 -0
  410. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/postgresql.py +0 -0
  411. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/runit.py +0 -0
  412. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/upstart.py +0 -0
  413. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/util/__init__.py +0 -0
  414. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/util/files.py +0 -0
  415. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/util/service.py +0 -0
  416. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/operations/vzctl.py +0 -0
  417. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/progress.py +0 -0
  418. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/py.typed +0 -0
  419. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra/version.py +0 -0
  420. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra_cli/__init__.py +0 -0
  421. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra_cli/commands.py +0 -0
  422. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra_cli/exceptions.py +0 -0
  423. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra_cli/log.py +0 -0
  424. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra_cli/main.py +0 -0
  425. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra_cli/prints.py +0 -0
  426. {pyinfra-3.5.1 → pyinfra-3.6.1}/src/pyinfra_cli/virtualenv.py +0 -0
  427. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/__init__.py +0 -0
  428. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/end-to-end/conftest.py +0 -0
  429. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/end-to-end/test_e2e_docker.py +0 -0
  430. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/end-to-end/test_e2e_local.py +0 -0
  431. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/end-to-end/test_e2e_podman.py +0 -0
  432. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/end-to-end/test_e2e_ssh.py +0 -0
  433. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/apk.ApkPackages/packages.json +0 -0
  434. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/apk.ApkPackages/packages_2.json +0 -0
  435. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/apt.AptKeys/keys.json +0 -0
  436. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/apt.AptSources/component_with_number.json +0 -0
  437. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/apt.AptSources/sources.json +0 -0
  438. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/apt.SimulateOperationWillChange/upgrade-nochanges.json +0 -0
  439. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/apt.SimulateOperationWillChange/upgrade.json +0 -0
  440. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/brew.BrewCasks/casks.json +0 -0
  441. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/brew.BrewPackages/packages.json +0 -0
  442. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/brew.BrewTaps/taps.json +0 -0
  443. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/brew.BrewVersion/bad_output.json +0 -0
  444. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/brew.BrewVersion/version.json +0 -0
  445. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/cargo.CargoPackages/packages.json +0 -0
  446. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/choco.ChocoPackages/packages.json +0 -0
  447. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/choco.ChocoVersion/version.json +0 -0
  448. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/crontab.Crontab/comments.json +0 -0
  449. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/crontab.Crontab/simple.json +0 -0
  450. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/crontab.Crontab/simple_user.json +0 -0
  451. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/deb.DebPackage/package.json +0 -0
  452. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/deb.DebPackage/whitespace.json +0 -0
  453. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/deb.DebPackages/hold_packages.json +0 -0
  454. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/deb.DebPackages/packages.json +0 -0
  455. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/dnf.DnfRepositories/repos-with-spaces.json +0 -0
  456. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/dnf.DnfRepositories/repos.json +0 -0
  457. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/docker.DockerContainer/container.json +0 -0
  458. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/docker.DockerContainers/container.json +0 -0
  459. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/docker.DockerImages/images.json +0 -0
  460. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/docker.DockerPlugin/plugin.json +0 -0
  461. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/docker.DockerPlugins/plugins.json +0 -0
  462. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/efibootmgr.EFIBootMgr/boot_entries.json +0 -0
  463. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/efibootmgr.EFIBootMgr/boot_entries2.json +0 -0
  464. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/efibootmgr.EFIBootMgr/boot_entries_complex.json +0 -0
  465. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/efibootmgr.EFIBootMgr/not_uefi.json +0 -0
  466. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Block/defaults.json +0 -0
  467. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Block/no_markers_found.json +0 -0
  468. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Block/not_found.json +0 -0
  469. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Directory/file.json +0 -0
  470. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Directory/link.json +0 -0
  471. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Directory/ls_fallback.json +0 -0
  472. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Directory/ls_fallback_freebsd.json +0 -0
  473. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Directory/ls_fallback_macos.json +0 -0
  474. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Directory/valid.json +0 -0
  475. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.File/directory.json +0 -0
  476. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.File/invalid_output.json +0 -0
  477. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.File/link.json +0 -0
  478. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.File/ls_fallback.json +0 -0
  479. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.File/ls_fallback_selinux.json +0 -0
  480. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.File/ls_fallback_time.json +0 -0
  481. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.File/mode_setgid_setuid.json +0 -0
  482. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.File/mode_sticky.json +0 -0
  483. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.File/tilde.json +0 -0
  484. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.File/tilde_with_space.json +0 -0
  485. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.File/valid.json +0 -0
  486. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.File/valid_needs_quotes.json +0 -0
  487. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.File/valid_with_space.json +0 -0
  488. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.FindDirectories/directories.json +0 -0
  489. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.FindFiles/files.json +0 -0
  490. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.FindFiles/files_with_name.json +0 -0
  491. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.FindFiles/files_with_name_wildcard.json +0 -0
  492. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.FindInFile/lines.json +0 -0
  493. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.FindInFile/lines_interpolate.json +0 -0
  494. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.FindInFile/lines_no_interpolate.json +0 -0
  495. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.FindInFile/lines_quote.json +0 -0
  496. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.FindInFile/no_file.json +0 -0
  497. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.FindInFile/no_matches.json +0 -0
  498. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.FindLinks/links.json +0 -0
  499. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Flags/bad_output.json +0 -0
  500. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Flags/no_flags_set.json +0 -0
  501. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Flags/no_output.json +0 -0
  502. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Flags/one_flag_set.json +0 -0
  503. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Flags/too_much_output.json +0 -0
  504. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Flags/two_flags_set.json +0 -0
  505. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Link/directory.json +0 -0
  506. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Link/file.json +0 -0
  507. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Link/ls_fallback.json +0 -0
  508. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Link/valid.json +0 -0
  509. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Link/valid_centos6.json +0 -0
  510. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Md5File/file.json +0 -0
  511. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Md5File/file_bsd_style.json +0 -0
  512. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Md5File/file_needs_quotes.json +0 -0
  513. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Sha1File/file.json +0 -0
  514. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Sha1File/file_bsd_style.json +0 -0
  515. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Sha1File/file_needs_quotes.json +0 -0
  516. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Sha256File/file.json +0 -0
  517. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Sha256File/file_bsd_style.json +0 -0
  518. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Sha256File/file_needs_quotes.json +0 -0
  519. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Sha384File/file.json +0 -0
  520. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Sha384File/file_bsd_style.json +0 -0
  521. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/files.Sha384File/file_needs_quotes.json +0 -0
  522. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/flatpak.FlatpakPackage/kodi.json +0 -0
  523. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/flatpak.FlatpakPackage/not_found.json +0 -0
  524. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/flatpak.FlatpakPackage/vlc.json +0 -0
  525. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/flatpak.FlatpakPackages/packages.json +0 -0
  526. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/freebsd.PkgPackage/package-with-jail.json +0 -0
  527. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/freebsd.PkgPackage/package.json +0 -0
  528. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/freebsd.ServiceScript/found.json +0 -0
  529. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/freebsd.ServiceScript/not-found.json +0 -0
  530. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/freebsd.ServiceStatus/not-running.json +0 -0
  531. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/freebsd.ServiceStatus/running.json +0 -0
  532. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/freebsd.Sysrc/found.json +0 -0
  533. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/freebsd.Sysrc/not-found.json +0 -0
  534. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/gem.GemPackages/packages.json +0 -0
  535. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/git.GitBranch/branch.json +0 -0
  536. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/git.GitConfig/global.json +0 -0
  537. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/git.GitConfig/multi_value.json +0 -0
  538. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/git.GitConfig/repo.json +0 -0
  539. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/git.GitTag/tag.json +0 -0
  540. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/git.GitTrackingBranch/branch.json +0 -0
  541. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/git.GitTrackingBranch/branch_behind.json +0 -0
  542. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/git.GitTrackingBranch/no_branch.json +0 -0
  543. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/gpg.GpgKey/key_from_file.json +0 -0
  544. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/gpg.GpgKey/key_from_url.json +0 -0
  545. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/gpg.GpgKeys/keys.json +0 -0
  546. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/gpg.GpgKeys/keys_keyring.json +0 -0
  547. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/gpg.GpgSecretKeys/keys.json +0 -0
  548. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/gpg.GpgSecretKeys/keys_keyring.json +0 -0
  549. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.BlockDevices/devices.json +0 -0
  550. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.Cpus/invalid.json +0 -0
  551. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.Cpus/valid.json +0 -0
  552. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.Ipv4Addresses/linux_ip.json +0 -0
  553. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.Ipv4Addrs/linux_ip_multiple.json +0 -0
  554. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.Ipv6Addresses/linux_ip.json +0 -0
  555. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.Ipv6Addrs/linux_ip_multiple.json +0 -0
  556. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.Memory/vmstat_bsd.json +0 -0
  557. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.Memory/vmstat_linux.json +0 -0
  558. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.NetworkDevices/linux_ifconfig.json +0 -0
  559. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.NetworkDevices/linux_ifconfig_multiple.json +0 -0
  560. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.NetworkDevices/linux_ip.json +0 -0
  561. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.NetworkDevices/linux_ip_multiple_addrs.json +0 -0
  562. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.NetworkDevices/linux_ip_multiple_ifaces.json +0 -0
  563. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/hardware.NetworkDevices/macos_ifconfig.json +0 -0
  564. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/iptables.Ip6tablesChains/chains.json +0 -0
  565. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/iptables.Ip6tablesRules/rules.json +0 -0
  566. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/iptables.IptablesChains/chains.json +0 -0
  567. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/iptables.IptablesRules/rules.json +0 -0
  568. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/launchd.LaunchdStatus/services.json +0 -0
  569. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/lxd.LxdContainers/stripped.json +0 -0
  570. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/mysql.MysqlDatabases/multiple.json +0 -0
  571. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/mysql.MysqlDatabases/multiple_custom_connection.json +0 -0
  572. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/mysql.MysqlUserGrants/multiple.json +0 -0
  573. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/mysql.MysqlUsers/multiple.json +0 -0
  574. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/npm.NpmPackages/packages.json +0 -0
  575. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/openrc.OpenrcEnabled/services.json +0 -0
  576. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/openrc.OpenrcEnabled/services_runlevel.json +0 -0
  577. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/openrc.OpenrcStatus/services.json +0 -0
  578. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/openrc.OpenrcStatus/services_runlevel.json +0 -0
  579. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/opkg.OpkgConf/opkg_conf.json +0 -0
  580. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/opkg.OpkgFeeds/opkg_feeds.json +0 -0
  581. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/opkg.OpkgInstallableArchitectures/opkg_installable_architectures.json +0 -0
  582. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/opkg.OpkgPackages/opkg_packages.json +0 -0
  583. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/opkg.OpkgUpgradeablePackages/opkg_upgradeable_packages.json +0 -0
  584. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/pacman.PacmanPackages/packages.json +0 -0
  585. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/pip.Pip3Packages/packages.json +0 -0
  586. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/pip.PipPackages/packages.json +0 -0
  587. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/pip.PipPackages/packages_pip3.json +0 -0
  588. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/pipx.PipxEnvironment/environment.json +0 -0
  589. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/pipx.PipxPackages/packages.json +0 -0
  590. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/pkg.PkgPackages/packages.json +0 -0
  591. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/pkgin.PkginPackages/packages.json +0 -0
  592. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/podman.PodmanPs/empty.json +0 -0
  593. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/podman.PodmanPs/onecontainer.json +0 -0
  594. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/podman.PodmanSystemInfo/info1.json +0 -0
  595. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/postgresql.PostgresqlDatabases/multiple.json +0 -0
  596. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/postgresql.PostgresqlRoles/multiple.json +0 -0
  597. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/postgresql.PostgresqlRoles/multiple_custom_connection.json +0 -0
  598. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/rpm.RpmPackage/package.json +0 -0
  599. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/rpm.RpmPackageProvides/package.json +0 -0
  600. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/rpm.RpmPackages/packages.json +0 -0
  601. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/runit.RunitManaged/single.json +0 -0
  602. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/runit.RunitManaged/status.json +0 -0
  603. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/runit.RunitStatus/single.json +0 -0
  604. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/runit.RunitStatus/status.json +0 -0
  605. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/selinux.FileContext/file_context.json +0 -0
  606. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/selinux.FileContextMapping/found.json +0 -0
  607. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/selinux.FileContextMapping/not_found.json +0 -0
  608. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/selinux.SEBoolean/get.json +0 -0
  609. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/selinux.SEPort/generic_and_specific.json +0 -0
  610. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/selinux.SEPort/get_bad_port.json +0 -0
  611. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/selinux.SEPort/only_generic.json +0 -0
  612. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/selinux.SEPorts/line_noise_input.json +0 -0
  613. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/selinux.SEPorts/multiple_single_ports.json +0 -0
  614. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/selinux.SEPorts/only_single_port.json +0 -0
  615. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/selinux.SEPorts/port_range.json +0 -0
  616. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/selinux.SEPorts/single_and_range.json +0 -0
  617. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Arch/arch.json +0 -0
  618. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Command/command.json +0 -0
  619. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Date/date.json +0 -0
  620. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Groups/groups.json +0 -0
  621. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.HasGui/gui_absent.json +0 -0
  622. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.HasGui/gui_present.json +0 -0
  623. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Home/home.json +0 -0
  624. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Home/root.json +0 -0
  625. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Home/some_user.json +0 -0
  626. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Hostname/hostname.json +0 -0
  627. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.KernelModules/modules.json +0 -0
  628. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.LinuxDistribution/archlinux.json +0 -0
  629. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.LinuxDistribution/centos-6.json +0 -0
  630. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.LinuxDistribution/centos-7.json +0 -0
  631. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.LinuxDistribution/no_match.json +0 -0
  632. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.LinuxDistribution/ubuntu.json +0 -0
  633. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.LinuxGui/gnome_present.json +0 -0
  634. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.LinuxName/ubuntu.json +0 -0
  635. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Locales +0 -0
  636. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.LsbRelease/release.json +0 -0
  637. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Mounts/mounts.json +0 -0
  638. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Os/os.json +0 -0
  639. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.OsVersion/os_version.json +0 -0
  640. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Port/empty.json +0 -0
  641. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Port/one-process.json +0 -0
  642. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Port/two-processes.json +0 -0
  643. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.RebootRequired/alpine_reboot_required.json +0 -0
  644. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.RebootRequired/freebsd_reboot_required.json +0 -0
  645. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.RebootRequired/linux_no_reboot.json +0 -0
  646. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.RebootRequired/linux_reboot_required.json +0 -0
  647. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.SecurityLimits/security_limits.json +0 -0
  648. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Selinux/no-output.json +0 -0
  649. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Selinux/selinux.json +0 -0
  650. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Sysctl/sysctl_linux.json +0 -0
  651. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Sysctl/sysctl_macos.json +0 -0
  652. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Users/mixed.json +0 -0
  653. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/server.Which/which.json +0 -0
  654. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/snap.SnapPackage/lxd.json +0 -0
  655. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/snap.SnapPackage/not_found.json +0 -0
  656. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/snap.SnapPackage/snapd.json +0 -0
  657. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/snap.SnapPackage/vlc.json +0 -0
  658. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/snap.SnapPackages/packages.json +0 -0
  659. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/systemd.SystemdEnabled/machine_services.json +0 -0
  660. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/systemd.SystemdEnabled/root_machine_services.json +0 -0
  661. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/systemd.SystemdEnabled/services.json +0 -0
  662. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/systemd.SystemdEnabled/user_machine_services.json +0 -0
  663. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/systemd.SystemdEnabled/user_services.json +0 -0
  664. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/systemd.SystemdStatus/machine_services.json +0 -0
  665. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/systemd.SystemdStatus/root_machine_services.json +0 -0
  666. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/systemd.SystemdStatus/services.json +0 -0
  667. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/systemd.SystemdStatus/services_invalid_output.json +0 -0
  668. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/systemd.SystemdStatus/user_machine_services.json +0 -0
  669. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/systemd.SystemdStatus/user_services.json +0 -0
  670. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/sysvinit.InitdStatus/services.json +0 -0
  671. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/upstart.UpstartStatus/services.json +0 -0
  672. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/vzctl.OpenvzContainers/containers.json +0 -0
  673. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/xbps.XbpsPackages/dot-in-package-name.json +0 -0
  674. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/xbps.XbpsPackages/packages.json +0 -0
  675. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/yum.YumRepositories/repos.json +0 -0
  676. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/zfs.Datasets/datasets.yaml +0 -0
  677. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/zfs.Filesystems/filesystems.yaml +0 -0
  678. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/zfs.Pools/pools.yaml +0 -0
  679. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/zfs.Snapshots/snapshots.yaml +0 -0
  680. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/zfs.Volumes/volumes.yaml +0 -0
  681. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/facts/zypper.ZypperRepositories/repos.json +0 -0
  682. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apk.packages/add_packages.json +0 -0
  683. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apk.packages/remove_packages.json +0 -0
  684. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apk.packages/upgrade_packages.json +0 -0
  685. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apk.packages/upgrade_update.json +0 -0
  686. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apk.upgrade/upgrade_available.json +0 -0
  687. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.deb/add.json +0 -0
  688. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.deb/add_existing.json +0 -0
  689. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.deb/download_add.json +0 -0
  690. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.deb/remove_existing.json +0 -0
  691. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.deb/remove_no_exist.json +0 -0
  692. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.dist_upgrade/dist_upgrade.json +0 -0
  693. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.dist_upgrade/dist_upgrade_autoremove.json +0 -0
  694. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.key/add.json +0 -0
  695. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.key/add_exists.json +0 -0
  696. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.key/add_keyserver.json +0 -0
  697. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.key/add_keyserver_exists.json +0 -0
  698. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.key/add_keyserver_multiple.json +0 -0
  699. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.key/add_keyserver_multiple_partial.json +0 -0
  700. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.key/add_keyserver_no_keyid.json +0 -0
  701. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.key/add_no_gpg.json +0 -0
  702. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.key/add_url.json +0 -0
  703. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.packages/add_package.json +0 -0
  704. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.packages/add_package_allow_downgrades.json +0 -0
  705. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.packages/add_package_force.json +0 -0
  706. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.packages/add_package_no_recommends.json +0 -0
  707. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.packages/add_packages.json +0 -0
  708. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.packages/install_with_args.json +0 -0
  709. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.packages/remove_packages.json +0 -0
  710. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.packages/remove_packages_with_args.json +0 -0
  711. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.packages/update_cache_old.json +0 -0
  712. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.packages/update_cached.json +0 -0
  713. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.packages/update_nocache.json +0 -0
  714. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.packages/update_upgrade.json +0 -0
  715. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.packages/upgrade_packages.json +0 -0
  716. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.ppa/add.json +0 -0
  717. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.ppa/remove.json +0 -0
  718. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.repo/add.json +0 -0
  719. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.repo/add_existing.json +0 -0
  720. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.repo/add_filename.json +0 -0
  721. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.repo/remove.json +0 -0
  722. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.upgrade/upgrade.json +0 -0
  723. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/apt.upgrade/upgrade_autoremove.json +0 -0
  724. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.cask_upgrade/new_cli_upgrade.json +0 -0
  725. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.cask_upgrade/old_cli_upgrade.json +0 -0
  726. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.casks/add_casks_upgrade.json +0 -0
  727. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.casks/new_cli_add_casks.json +0 -0
  728. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.casks/old_cli_add_casks.json +0 -0
  729. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.packages/add_packages.json +0 -0
  730. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.packages/remove_packages.json +0 -0
  731. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.packages/upgrade_packages.json +0 -0
  732. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.packages/upgrade_update.json +0 -0
  733. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.tap/add_exists.json +0 -0
  734. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.tap/add_tap.json +0 -0
  735. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.tap/add_tap_bad_url.json +0 -0
  736. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.tap/add_tap_no_args.json +0 -0
  737. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.tap/add_tap_url.json +0 -0
  738. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.tap/add_tap_url_exists.json +0 -0
  739. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.tap/add_tap_url_no_src.json +0 -0
  740. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.tap/remove_no_exists.json +0 -0
  741. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.tap/remove_tap.json +0 -0
  742. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/brew.upgrade/upgrade.json +0 -0
  743. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/bsdinit.service/disabled.json +0 -0
  744. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/bsdinit.service/enabled.json +0 -0
  745. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/bsdinit.service/reload.json +0 -0
  746. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/bsdinit.service/skip_started.json +0 -0
  747. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/bsdinit.service/start.json +0 -0
  748. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/bsdinit.service/stop.json +0 -0
  749. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/cargo.packages/add_packages.json +0 -0
  750. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/cargo.packages/remove_packages.json +0 -0
  751. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/choco.install/install.json +0 -0
  752. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/choco.packages/add_packages.json +0 -0
  753. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/choco.packages/remove_packages.json +0 -0
  754. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/crontab.crontab/add.json +0 -0
  755. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/crontab.crontab/add_another.json +0 -0
  756. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/crontab.crontab/add_existing.json +0 -0
  757. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/crontab.crontab/add_existing_int.json +0 -0
  758. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/crontab.crontab/add_named.json +0 -0
  759. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/crontab.crontab/add_special_time.json +0 -0
  760. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/crontab.crontab/add_user.json +0 -0
  761. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/crontab.crontab/edit.json +0 -0
  762. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/crontab.crontab/edit_named.json +0 -0
  763. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/crontab.crontab/edit_special_time.json +0 -0
  764. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/crontab.crontab/remove.json +0 -0
  765. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.key/add.json +0 -0
  766. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.packages/add_packages.json +0 -0
  767. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.packages/install_with_args.json +0 -0
  768. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.packages/install_with_nobest.json +0 -0
  769. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.packages/noop_add_package_alias.json +0 -0
  770. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.packages/remove_package.json +0 -0
  771. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.packages/uninstall_with_args.json +0 -0
  772. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.packages/update_clean.json +0 -0
  773. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.repo/add.json +0 -0
  774. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.repo/remove.json +0 -0
  775. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.rpm/add.json +0 -0
  776. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.rpm/add_existing.json +0 -0
  777. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.rpm/add_existing_upgrade.json +0 -0
  778. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.rpm/add_url.json +0 -0
  779. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/dnf.rpm/remove.json +0 -0
  780. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.container/add_and_start_no_existent_container.json +0 -0
  781. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.container/add_existent_container.json +0 -0
  782. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.container/add_no_existent_container.json +0 -0
  783. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.container/remove_container.json +0 -0
  784. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.container/start_container.json +0 -0
  785. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.container/stop_container.json +0 -0
  786. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.network/add_network.json +0 -0
  787. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.network/add_network_macvlan_with_aux_addresses.json +0 -0
  788. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.network/add_network_with_gateway.json +0 -0
  789. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.network/add_network_with_ip_range.json +0 -0
  790. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.network/add_network_with_opts.json +0 -0
  791. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.network/remove_network.json +0 -0
  792. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.plugin/disable_plugin.json +0 -0
  793. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.plugin/enable_plugin.json +0 -0
  794. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.plugin/install_plugin.json +0 -0
  795. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.plugin/install_plugin_disabled.json +0 -0
  796. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.plugin/install_plugin_with_alias_and_options.json +0 -0
  797. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.plugin/remove_plugin.json +0 -0
  798. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.plugin/set_plugin_options.json +0 -0
  799. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.plugin/set_plugin_options_disabled_plugin.json +0 -0
  800. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.volume/add_volume.json +0 -0
  801. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.volume/add_volume_with_driver.json +0 -0
  802. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/docker.volume/add_volume_with_labels.json +0 -0
  803. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.block/add_existing_block_same_content.json +0 -0
  804. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.block/add_line_given_but_before_eq_after.json +0 -0
  805. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.block/add_no_content_provided.json +0 -0
  806. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.block/add_no_existing_block_and_non_str_line_given.json +0 -0
  807. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.block/add_no_line_given_but_before_ne_after.json +0 -0
  808. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.block/remove_no_existing_block.json +0 -0
  809. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.block/remove_no_file.json +0 -0
  810. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.directory/add.json +0 -0
  811. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.directory/add_force.json +0 -0
  812. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.directory/add_force_backup_dir.json +0 -0
  813. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.directory/add_force_no_backup.json +0 -0
  814. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.directory/add_with_spaces.json +0 -0
  815. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.directory/delete.json +0 -0
  816. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.directory/edit.json +0 -0
  817. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.directory/edit_with_spaces.json +0 -0
  818. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.directory/ignore_link_type.json +0 -0
  819. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.directory/invalid.json +0 -0
  820. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.directory/invalid_type.json +0 -0
  821. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download.json +0 -0
  822. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_cache_time.json +0 -0
  823. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_cache_time_needs_refresh.json +0 -0
  824. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_directory.json +0 -0
  825. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_existing_checksum.json +0 -0
  826. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_extra_args_curl.json +0 -0
  827. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_extra_args_wget.json +0 -0
  828. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_headers_curl.json +0 -0
  829. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_headers_wget.json +0 -0
  830. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_insecure_curl.json +0 -0
  831. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_insecure_wget.json +0 -0
  832. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_needs_quotes.json +0 -0
  833. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_no_curl_no_wget.json +0 -0
  834. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_proxy_curl.json +0 -0
  835. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_proxy_wget.json +0 -0
  836. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_wget.json +0 -0
  837. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_with_checksums.json +0 -0
  838. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/download_with_checksums_needs_quotes.json +0 -0
  839. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/pathlib_download.json +0 -0
  840. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.download/skip_existing.json +0 -0
  841. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/add.json +0 -0
  842. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/add_force.json +0 -0
  843. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/add_force_backup_dir.json +0 -0
  844. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/add_force_backup_dir_nested.json +0 -0
  845. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/add_force_no_backup.json +0 -0
  846. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/add_special_chars.json +0 -0
  847. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/add_with_spaces.json +0 -0
  848. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/create_directory.json +0 -0
  849. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/delete.json +0 -0
  850. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/delete_with_spaces.json +0 -0
  851. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/edit.json +0 -0
  852. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/edit_nothing.json +0 -0
  853. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/invalid.json +0 -0
  854. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/invalid_type.json +0 -0
  855. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.file/touch.json +0 -0
  856. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/clear_no_flags.json +0 -0
  857. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/clear_one_flag_already_clear.json +0 -0
  858. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/clear_one_flag_was_set.json +0 -0
  859. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/clear_two_flags.json +0 -0
  860. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/clear_two_flags_already_clear.json +0 -0
  861. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/clear_two_flags_first_already_clear.json +0 -0
  862. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/clear_two_flags_second_already_clear.json +0 -0
  863. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/set_no_flags.json +0 -0
  864. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/set_one_flag_already_set.json +0 -0
  865. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/set_one_flag_not_yet_set.json +0 -0
  866. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/set_two_flags.json +0 -0
  867. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/set_two_flags_already_set.json +0 -0
  868. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/set_two_flags_first_already_set.json +0 -0
  869. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.flags/set_two_flags_second_already_set.json +0 -0
  870. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.get/create_directory.json +0 -0
  871. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.get/different_remote.json +0 -0
  872. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.get/fallback_md5.json +0 -0
  873. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.get/fallback_sha256.json +0 -0
  874. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.get/no_change_md5.json +0 -0
  875. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.get/no_change_sha256.json +0 -0
  876. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.get/no_local.json +0 -0
  877. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.get/no_remote.json +0 -0
  878. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.get/path_with_spaces.json +0 -0
  879. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.get/path_with_spaces_already_escaped.json +0 -0
  880. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.get/pathlib_path_with_spaces.json +0 -0
  881. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.line/add.json +0 -0
  882. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.line/add_backup.json +0 -0
  883. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.line/add_existing.json +0 -0
  884. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.line/add_replace.json +0 -0
  885. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.line/add_replace_noop.json +0 -0
  886. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.line/add_with_quote.json +0 -0
  887. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.line/edit.json +0 -0
  888. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.line/edit_backup.json +0 -0
  889. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.line/pathlib_edit.json +0 -0
  890. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.link/add.json +0 -0
  891. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.link/add_force.json +0 -0
  892. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.link/add_force_backup_dir.json +0 -0
  893. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.link/add_force_no_backup.json +0 -0
  894. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.link/add_no_target.json +0 -0
  895. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.link/add_with_spaces.json +0 -0
  896. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.link/create_directory.json +0 -0
  897. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.link/delete.json +0 -0
  898. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.link/edit.json +0 -0
  899. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.link/edit_nothing.json +0 -0
  900. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.link/invalid.json +0 -0
  901. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.link/invalid_type.json +0 -0
  902. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.link/pathlib_edit.json +0 -0
  903. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.move/directory.json +0 -0
  904. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.move/invalid_dest.json +0 -0
  905. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.move/invalid_src.json +0 -0
  906. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.move/link.json +0 -0
  907. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.move/no_conflict.json +0 -0
  908. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.move/no_overwrite.json +0 -0
  909. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.move/overwrite.json +0 -0
  910. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/atime_mtime_sub_second.json +0 -0
  911. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/change_atime_eq_mtime_ref_remote.json +0 -0
  912. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/change_mode_owner.json +0 -0
  913. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/change_mode_owner_with_spaces.json +0 -0
  914. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/change_mtime_arg_no_tz.json +0 -0
  915. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/change_mtime_atime_ref_local file.json +0 -0
  916. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/copy_local_permissions.json +0 -0
  917. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/create_directory.json +0 -0
  918. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/different_remote.json +0 -0
  919. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/fallback_md5.json +0 -0
  920. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/fallback_sha256.json +0 -0
  921. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/no_change.json +0 -0
  922. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/no_change_atime_mtime.json +0 -0
  923. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/no_change_md5.json +0 -0
  924. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/no_change_same_mode_as_local.json +0 -0
  925. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/no_change_sha256.json +0 -0
  926. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/no_local.json +0 -0
  927. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/no_remote.json +0 -0
  928. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/path_with_spaces.json +0 -0
  929. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/path_with_spaces_already_escaped.json +0 -0
  930. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/pathlib_with_spaces.json +0 -0
  931. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.put/upload_to_directory.json +0 -0
  932. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.replace/no_match.json +0 -0
  933. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.replace/replace_double_quotes_interpolate.json +0 -0
  934. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.replace/replace_double_quotes_no_interpolate.json +0 -0
  935. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.replace/replace_single_quotes_interpolate.json +0 -0
  936. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.replace/replace_single_quotes_no_interpolate.json +0 -0
  937. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.replace/simple_interpolate.json +0 -0
  938. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.replace/simple_no_interpolate.json +0 -0
  939. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.sync/sync_delete_posix.json +0 -0
  940. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.sync/sync_delete_windows.json +0 -0
  941. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.sync/sync_destination_link.json +0 -0
  942. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.sync/sync_exclude_multiple.json +0 -0
  943. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.sync/sync_no_destination_exist.json +0 -0
  944. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.sync/sync_no_local_exist_posix.json +0 -0
  945. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.sync/sync_no_local_exist_windows.json +0 -0
  946. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.sync/sync_partial_exists.json +0 -0
  947. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.sync/sync_special_chars.json +0 -0
  948. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.template/invalid_template_syntax.json +0 -0
  949. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.template/no_remote.json +0 -0
  950. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/files.template/undefined_template_variable.json +0 -0
  951. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/flatpak.packages/install_package.json +0 -0
  952. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/flatpak.packages/install_packages.json +0 -0
  953. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/flatpak.packages/remove_packages.json +0 -0
  954. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.freebsd_update.update/update.json +0 -0
  955. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.autoremove/autoremove-with-jail.json +0 -0
  956. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.autoremove/autoremove.json +0 -0
  957. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.clean/clean-all-with-jail.json +0 -0
  958. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.clean/clean-all.json +0 -0
  959. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.clean/clean-with-jail.json +0 -0
  960. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.clean/clean.json +0 -0
  961. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.install/install-with-custom-repo.json +0 -0
  962. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.install/install-with-jail-and-custom-repo.json +0 -0
  963. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.install/install-with-jail.json +0 -0
  964. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.install/install.json +0 -0
  965. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.remove/remove-with-jail.json +0 -0
  966. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.remove/remove.json +0 -0
  967. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.update/update.json +0 -0
  968. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.pkg.upgrade/upgrade.json +0 -0
  969. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.service.service/custom.json +0 -0
  970. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.service.service/reload.json +0 -0
  971. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.service.service/restart.json +0 -0
  972. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.service.service/start.json +0 -0
  973. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.service.service/stop.json +0 -0
  974. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.sysrc.sysrc/add.json +0 -0
  975. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.sysrc.sysrc/del.json +0 -0
  976. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.sysrc.sysrc/set.json +0 -0
  977. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/freebsd.sysrc.sysrc/sub.json +0 -0
  978. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/gem.packages/add_packages.json +0 -0
  979. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/gem.packages/remove_packages.json +0 -0
  980. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.bare_repo/chmod.json +0 -0
  981. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.bare_repo/delete.json +0 -0
  982. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.bare_repo/init.json +0 -0
  983. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.config/add_existing_multi_value.json +0 -0
  984. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.config/add_first_multi_value.json +0 -0
  985. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.config/add_second_multi_value.json +0 -0
  986. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.config/edit_global.json +0 -0
  987. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.config/edit_system.json +0 -0
  988. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.config/set_existing_global.json +0 -0
  989. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.config/set_existing_system.json +0 -0
  990. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.config/set_global.json +0 -0
  991. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.config/set_repo.json +0 -0
  992. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.config/set_system.json +0 -0
  993. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.repo/branch_pull.json +0 -0
  994. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.repo/clone.json +0 -0
  995. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.repo/clone_keyscan.json +0 -0
  996. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.repo/clone_keyscan_invalid.json +0 -0
  997. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.repo/rebase.json +0 -0
  998. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.repo/recursive_submodules.json +0 -0
  999. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.repo/update_submodules.json +0 -0
  1000. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/create.json +0 -0
  1001. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/create_detached.json +0 -0
  1002. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/create_detached_from_commitish.json +0 -0
  1003. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/create_existing_branch.json +0 -0
  1004. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/create_force.json +0 -0
  1005. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/create_from_commitish.json +0 -0
  1006. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/create_new_branch.json +0 -0
  1007. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/create_new_branch_from_commitish.json +0 -0
  1008. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/pull.json +0 -0
  1009. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/pull_disable.json +0 -0
  1010. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/pull_from_bad_remote_branch.json +0 -0
  1011. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/pull_from_remote_branch.json +0 -0
  1012. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/pull_rebase from_remote_branch.json +0 -0
  1013. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/pull_rebase.json +0 -0
  1014. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/remove.json +0 -0
  1015. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/git.worktree/remove_force.json +0 -0
  1016. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.chain/add_chain.json +0 -0
  1017. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.chain/delete_chain.json +0 -0
  1018. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.chain/delete_chain_noop.json +0 -0
  1019. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.chain/edit_chain.json +0 -0
  1020. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.rule/add_log_rule.json +0 -0
  1021. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.rule/add_rule.json +0 -0
  1022. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.rule/add_to_ports.json +0 -0
  1023. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.rule/add_to_source.json +0 -0
  1024. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.rule/add_v6_rule.json +0 -0
  1025. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.rule/already_absent.json +0 -0
  1026. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.rule/already_present.json +0 -0
  1027. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.rule/delete_rule.json +0 -0
  1028. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.rule/invalid_destination_port.json +0 -0
  1029. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.rule/invalid_log_prefix.json +0 -0
  1030. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.rule/invalid_source_destination.json +0 -0
  1031. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.rule/invalid_to_destination.json +0 -0
  1032. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/iptables.rule/invalid_to_ports.json +0 -0
  1033. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/launchd.service/restart.json +0 -0
  1034. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/launchd.service/restart_stopped.json +0 -0
  1035. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/launchd.service/start.json +0 -0
  1036. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/launchd.service/start_running.json +0 -0
  1037. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/launchd.service/stop.json +0 -0
  1038. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/lxd.container/add_container.json +0 -0
  1039. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/lxd.container/already_absent.json +0 -0
  1040. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/lxd.container/already_present.json +0 -0
  1041. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/lxd.container/delete_container.json +0 -0
  1042. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/lxd.container/delete_running_container.json +0 -0
  1043. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.database/add.json +0 -0
  1044. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.database/add_noop.json +0 -0
  1045. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.database/add_privileges.json +0 -0
  1046. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.database/delete.json +0 -0
  1047. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.database/delete_noop.json +0 -0
  1048. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.dump/dump.json +0 -0
  1049. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.load/load.json +0 -0
  1050. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.load/load_space.json +0 -0
  1051. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/add.json +0 -0
  1052. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/add_all_with_grant_option.json +0 -0
  1053. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/add_database.json +0 -0
  1054. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/add_delete.json +0 -0
  1055. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/add_delete_usage.json +0 -0
  1056. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/add_existing.json +0 -0
  1057. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/add_table.json +0 -0
  1058. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/add_table_invalid.json +0 -0
  1059. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/add_with_grant_option.json +0 -0
  1060. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/delete.json +0 -0
  1061. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/delete_all.json +0 -0
  1062. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/delete_all_with_grant_option.json +0 -0
  1063. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/delete_with_grant_option.json +0 -0
  1064. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/remove_noop.json +0 -0
  1065. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.privileges/remove_usage.json +0 -0
  1066. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.sql/execute.json +0 -0
  1067. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.sql/execute_mysql_kwargs.json +0 -0
  1068. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/add.json +0 -0
  1069. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/add_noop.json +0 -0
  1070. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/add_password.json +0 -0
  1071. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/add_privileges.json +0 -0
  1072. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/add_resources.json +0 -0
  1073. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/add_ssl.json +0 -0
  1074. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/add_x509.json +0 -0
  1075. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/add_x509_specified.json +0 -0
  1076. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/delete.json +0 -0
  1077. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/invalid_require_cipher.json +0 -0
  1078. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/invalid_require_issuer.json +0 -0
  1079. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/invalid_require_subject.json +0 -0
  1080. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/invalid_require_type.json +0 -0
  1081. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/remove_noop.json +0 -0
  1082. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/update_resources.json +0 -0
  1083. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/update_resources_partial.json +0 -0
  1084. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/update_ssl.json +0 -0
  1085. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/update_x509.json +0 -0
  1086. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/update_x509_specified.json +0 -0
  1087. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/mysql.user/update_x509_specified_partial.json +0 -0
  1088. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/npm.packages/add_local_packages.json +0 -0
  1089. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/npm.packages/add_packages.json +0 -0
  1090. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/npm.packages/remove_packages.json +0 -0
  1091. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/openrc.service/disable.json +0 -0
  1092. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/openrc.service/disable_noop.json +0 -0
  1093. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/openrc.service/disable_runlevel.json +0 -0
  1094. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/openrc.service/enable.json +0 -0
  1095. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/openrc.service/enable_noop.json +0 -0
  1096. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/openrc.service/enable_runlevel.json +0 -0
  1097. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/openrc.service/running_noop.json +0 -0
  1098. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/openrc.service/start.json +0 -0
  1099. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/openrc.service/stop.json +0 -0
  1100. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/openrc.service/stopped_noop.json +0 -0
  1101. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/opkg.packages/add_existing_package.json +0 -0
  1102. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/opkg.packages/add_multiple_packages.json +0 -0
  1103. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/opkg.packages/add_one_package.json +0 -0
  1104. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/opkg.packages/add_with_unallowed_pinning.json +0 -0
  1105. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/opkg.packages/list_of_nulls_package_list.json +0 -0
  1106. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/opkg.packages/null_package_list.json +0 -0
  1107. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/opkg.packages/remove_existing_package.json +0 -0
  1108. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/opkg.packages/remove_existing_package_and_require_update.json +0 -0
  1109. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/opkg.packages/remove_not_existing_package.json +0 -0
  1110. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/opkg.packages/update_then_add_one.json +0 -0
  1111. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/opkg.update/first_update.json +0 -0
  1112. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pacman.packages/add_packages.json +0 -0
  1113. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pacman.packages/add_packages_group_expand.json +0 -0
  1114. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pacman.packages/remove_packages.json +0 -0
  1115. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pacman.packages/remove_packages_expand.json +0 -0
  1116. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pacman.packages/upgrade_update.json +0 -0
  1117. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.packages/add_existing_package_with_url.json +0 -0
  1118. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.packages/add_new_virtualenv_packages.json +0 -0
  1119. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.packages/add_packages.json +0 -0
  1120. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.packages/add_packages_case_insensitive.json +0 -0
  1121. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.packages/add_virtualenv_packages.json +0 -0
  1122. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.packages/install_extra_args.json +0 -0
  1123. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.packages/install_latest_requirements.json +0 -0
  1124. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.packages/install_requirements.json +0 -0
  1125. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.packages/install_virtualenv_requirements.json +0 -0
  1126. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.packages/remove_packages.json +0 -0
  1127. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.packages/uninstall_requirements.json +0 -0
  1128. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.packages/use_pip3.json +0 -0
  1129. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.packages/use_pip3_virtualenv.json +0 -0
  1130. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.venv/add_virtualenv.json +0 -0
  1131. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.virtualenv/add_virtualenv.json +0 -0
  1132. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.virtualenv/add_virtualenv_py3.json +0 -0
  1133. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.virtualenv/add_with_options.json +0 -0
  1134. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.virtualenv/already_absent.json +0 -0
  1135. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.virtualenv/already_present.json +0 -0
  1136. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.virtualenv/delete_virtualenv.json +0 -0
  1137. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.virtualenv/present_empty_directory.json +0 -0
  1138. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.virtualenv/use_stdlib_venv.json +0 -0
  1139. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pip.virtualenv/use_stdlib_venv_py3.json +0 -0
  1140. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pipx.ensure_path/ensure_path.json +0 -0
  1141. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pipx.packages/add_existing_package_with_url.json +0 -0
  1142. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pipx.packages/add_nothing.json +0 -0
  1143. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pipx.packages/add_package.json +0 -0
  1144. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pipx.packages/add_packages.json +0 -0
  1145. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pipx.packages/install_extra_args.json +0 -0
  1146. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pipx.packages/remove_packages.json +0 -0
  1147. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pipx.upgrade_all/upgrade_all.json +0 -0
  1148. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pkg.packages/pkg_add_packages.json +0 -0
  1149. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pkg.packages/pkg_add_packages_with_installurl.json +0 -0
  1150. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pkg.packages/pkg_delete_packages.json +0 -0
  1151. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pkg.packages/pkg_install_packages.json +0 -0
  1152. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pkg.packages/pkg_remove_packages.json +0 -0
  1153. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pkgin.packages/add_packages.json +0 -0
  1154. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pkgin.packages/remove_packages.json +0 -0
  1155. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pkgin.packages/upgrade_packages.json +0 -0
  1156. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/pkgin.packages/upgrade_update.json +0 -0
  1157. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.database/add_database.json +0 -0
  1158. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.database/add_database_locales.json +0 -0
  1159. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.database/add_database_owner.json +0 -0
  1160. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.database/remove_database.json +0 -0
  1161. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.database/remove_database_noop.json +0 -0
  1162. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.database/update_database.json +0 -0
  1163. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.database/update_database_noop.json +0 -0
  1164. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.dump/dump.json +0 -0
  1165. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.load/load.json +0 -0
  1166. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.role/role_remove_noop.json +0 -0
  1167. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.role/role_update.json +0 -0
  1168. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.role/role_update_noop.json +0 -0
  1169. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.role/user_add.json +0 -0
  1170. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.role/user_add_no_login.json +0 -0
  1171. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.role/user_add_privileges.json +0 -0
  1172. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.role/user_add_replication.json +0 -0
  1173. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.role/user_add_super.json +0 -0
  1174. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.role/user_remove.json +0 -0
  1175. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/postgresql.sql/execute.json +0 -0
  1176. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/puppet.agent/run_agent.json +0 -0
  1177. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/python.call/call_func.json +0 -0
  1178. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/python.raise_exception/call_func.json +0 -0
  1179. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/runit.manage/manage.json +0 -0
  1180. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/runit.manage/unmanage.json +0 -0
  1181. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/runit.service/disable.json +0 -0
  1182. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/runit.service/enable.json +0 -0
  1183. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.boolean/bad_value.json +0 -0
  1184. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.boolean/change_not_persistent.json +0 -0
  1185. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.boolean/change_persistent.json +0 -0
  1186. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.boolean/no_change.json +0 -0
  1187. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.file_context/change.json +0 -0
  1188. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.file_context/no_change.json +0 -0
  1189. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.file_context_mapping/add_None.json +0 -0
  1190. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.file_context_mapping/add_different.json +0 -0
  1191. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.file_context_mapping/add_no_change.json +0 -0
  1192. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.file_context_mapping/add_none_existeing.json +0 -0
  1193. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.file_context_mapping/delete_existing.json +0 -0
  1194. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.file_context_mapping/delete_none_existing.json +0 -0
  1195. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.port/add_None.json +0 -0
  1196. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.port/add_different.json +0 -0
  1197. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.port/add_different_direct.json +0 -0
  1198. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.port/add_not_existing.json +0 -0
  1199. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.port/add_not_existing_direct.json +0 -0
  1200. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.port/add_not_existing_protocol.json +0 -0
  1201. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.port/add_same.json +0 -0
  1202. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.port/add_same_direct.json +0 -0
  1203. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.port/remove_existing.json +0 -0
  1204. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.port/remove_existing_direct.json +0 -0
  1205. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.port/remove_not_existing.json +0 -0
  1206. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/selinux.port/remove_not_existing_direct.json +0 -0
  1207. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.group/add.freebsd.json +0 -0
  1208. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.group/add.json +0 -0
  1209. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.group/delete.freebsd.json +0 -0
  1210. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.group/delete.json +0 -0
  1211. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.hostname/hostname_noop.json +0 -0
  1212. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.hostname/hostnamectl_noop.json +0 -0
  1213. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.hostname/set_hostname_bsd.json +0 -0
  1214. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.hostname/set_hostname_linux.json +0 -0
  1215. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.hostname/set_hostnamectl_linux.json +0 -0
  1216. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.locale/add.json +0 -0
  1217. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.locale/remove.json +0 -0
  1218. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.modprobe/add-list.json +0 -0
  1219. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.modprobe/add.json +0 -0
  1220. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.modprobe/add_exists.json +0 -0
  1221. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.modprobe/add_force.json +0 -0
  1222. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.modprobe/add_multiple_exists.json +0 -0
  1223. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.modprobe/remove-list.json +0 -0
  1224. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.modprobe/remove.json +0 -0
  1225. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.mount/mount.json +0 -0
  1226. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.mount/mount_device.json +0 -0
  1227. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.mount/mount_device_fstype.json +0 -0
  1228. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.mount/mount_exists.json +0 -0
  1229. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.mount/mount_options.json +0 -0
  1230. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.mount/remount_options.json +0 -0
  1231. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.mount/unmount.json +0 -0
  1232. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.packages/add_apk_packages.json +0 -0
  1233. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.packages/add_dnf_packages.json +0 -0
  1234. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.packages/add_yum_packages.json +0 -0
  1235. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.reboot/reboot.json +0 -0
  1236. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.script/upload_run.json +0 -0
  1237. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.script_template/script.json +0 -0
  1238. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.security_limit/set.json +0 -0
  1239. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.service/invalid.json +0 -0
  1240. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.service/start_initd.json +0 -0
  1241. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.service/start_initd_service.json +0 -0
  1242. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.service/start_openrc.json +0 -0
  1243. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.service/start_rcd.json +0 -0
  1244. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.service/start_runit.json +0 -0
  1245. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.service/start_systemd.json +0 -0
  1246. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.service/start_upstart.json +0 -0
  1247. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.shell/shell.json +0 -0
  1248. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.shell/single_shell.json +0 -0
  1249. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.sysctl/set.json +0 -0
  1250. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.sysctl/set_list.json +0 -0
  1251. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.sysctl/set_noop.json +0 -0
  1252. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.sysctl/set_noop_string_value.json +0 -0
  1253. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.sysctl/set_noop_zero_int.json +0 -0
  1254. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.sysctl/set_persist.json +0 -0
  1255. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/add.freebsd.json +0 -0
  1256. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/add.json +0 -0
  1257. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/add_group_exists.freebsd.json +0 -0
  1258. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/add_group_exists.json +0 -0
  1259. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/add_home_is_link.freebsd.json +0 -0
  1260. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/add_home_is_link.json +0 -0
  1261. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/add_invalid_home_is_file.json +0 -0
  1262. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/add_non_unique.freebsd.json +0 -0
  1263. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/add_non_unique.json +0 -0
  1264. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/append_secondary_existing_groups.json +0 -0
  1265. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/append_secondary_groups.freebsd.json +0 -0
  1266. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/append_secondary_groups.json +0 -0
  1267. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/delete.freebsd.json +0 -0
  1268. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/delete.json +0 -0
  1269. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/edit.freebsd.json +0 -0
  1270. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/edit.json +0 -0
  1271. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/exists_noop.json +0 -0
  1272. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/key_files.json +0 -0
  1273. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/keys.json +0 -0
  1274. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/keys_delete.json +0 -0
  1275. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/keys_nohome.json +0 -0
  1276. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.user/keys_single.json +0 -0
  1277. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/server.wait/port.json +0 -0
  1278. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/snap.package/install_package.json +0 -0
  1279. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/snap.package/install_package_classic.json +0 -0
  1280. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/snap.package/install_package_with_channel.json +0 -0
  1281. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/snap.package/install_packages.json +0 -0
  1282. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/snap.package/install_refresh_packages.json +0 -0
  1283. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/snap.package/refresh_package.json +0 -0
  1284. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/snap.package/remove_packages.json +0 -0
  1285. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/ssh.command/command.json +0 -0
  1286. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/ssh.command/command_quotes.json +0 -0
  1287. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/ssh.command/command_user_port.json +0 -0
  1288. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/ssh.download/download.json +0 -0
  1289. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/ssh.download/download_exists.json +0 -0
  1290. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/ssh.download/download_exists_force.json +0 -0
  1291. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/ssh.download/download_not_file.json +0 -0
  1292. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/ssh.keyscan/scan_not_present.json +0 -0
  1293. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/ssh.keyscan/scan_present.json +0 -0
  1294. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/ssh.keyscan/scan_present_force.json +0 -0
  1295. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/ssh.upload/upload.json +0 -0
  1296. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/ssh.upload/upload_remote_sudo.json +0 -0
  1297. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/ssh.upload/upload_remote_sudo_user.json +0 -0
  1298. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/daemon_reload.json +0 -0
  1299. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/disabled.json +0 -0
  1300. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/enabled.json +0 -0
  1301. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/machine_daemon_reload.json +0 -0
  1302. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/machine_disabled.json +0 -0
  1303. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/machine_enabled.json +0 -0
  1304. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/machine_start.json +0 -0
  1305. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/running_ambiguous_unit.json +0 -0
  1306. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/running_noop.json +0 -0
  1307. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/running_timer.json +0 -0
  1308. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/start.json +0 -0
  1309. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/stopped_noop.json +0 -0
  1310. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/timer.json +0 -0
  1311. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/user_daemon_reload.json +0 -0
  1312. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/user_disabled.json +0 -0
  1313. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/user_enabled.json +0 -0
  1314. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/user_machine_daemon_reload.json +0 -0
  1315. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/user_machine_disabled.json +0 -0
  1316. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/user_machine_enabled.json +0 -0
  1317. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/user_machine_start.json +0 -0
  1318. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/systemd.service/user_start.json +0 -0
  1319. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/sysvinit.enable/create.json +0 -0
  1320. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/sysvinit.service/command.json +0 -0
  1321. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/sysvinit.service/disabled.json +0 -0
  1322. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/sysvinit.service/enabled_chkconfig.json +0 -0
  1323. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/sysvinit.service/enabled_rc-update.json +0 -0
  1324. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/sysvinit.service/enabled_update-rc.d.json +0 -0
  1325. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/sysvinit.service/reload.json +0 -0
  1326. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/sysvinit.service/restart.json +0 -0
  1327. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/sysvinit.service/restart_down.json +0 -0
  1328. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/sysvinit.service/skip_started.json +0 -0
  1329. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/sysvinit.service/start.json +0 -0
  1330. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/sysvinit.service/stop.json +0 -0
  1331. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/upstart.service/disabled.json +0 -0
  1332. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/upstart.service/enabled.json +0 -0
  1333. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/upstart.service/running.json +0 -0
  1334. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/vzctl.create/add_template.json +0 -0
  1335. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/vzctl.create/already_existing.json +0 -0
  1336. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/vzctl.delete/delete.json +0 -0
  1337. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/vzctl.mount/mount.json +0 -0
  1338. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/vzctl.restart/restart.json +0 -0
  1339. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/vzctl.restart/restart_force.json +0 -0
  1340. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/vzctl.set/set.json +0 -0
  1341. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/vzctl.set/set_multiple.json +0 -0
  1342. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/vzctl.set/set_no_save.json +0 -0
  1343. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/vzctl.start/start.json +0 -0
  1344. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/vzctl.start/start_force.json +0 -0
  1345. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/vzctl.stop/stop.json +0 -0
  1346. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/vzctl.unmount/unmount.json +0 -0
  1347. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/xbps.packages/add_packages.json +0 -0
  1348. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/xbps.packages/remove_packages.json +0 -0
  1349. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/xbps.packages/upgrade_update.json +0 -0
  1350. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.key/add.json +0 -0
  1351. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.packages/add_packages.json +0 -0
  1352. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.packages/add_packages_alias.json +0 -0
  1353. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.packages/add_packages_alias_different_version.json +0 -0
  1354. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.packages/add_packages_alias_multiple_version.json +0 -0
  1355. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.packages/install_with_args.json +0 -0
  1356. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.packages/install_with_nobest.json +0 -0
  1357. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.packages/noop_add_packages_alias.json +0 -0
  1358. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.packages/noop_add_packages_alias_multiple_version.json +0 -0
  1359. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.packages/remove_package.json +0 -0
  1360. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.packages/remove_packages_alias_multiple_version.json +0 -0
  1361. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.packages/uninstall_with_args.json +0 -0
  1362. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.packages/update_clean.json +0 -0
  1363. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.repo/add.json +0 -0
  1364. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.repo/add_url.json +0 -0
  1365. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.repo/remove.json +0 -0
  1366. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.rpm/add.json +0 -0
  1367. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.rpm/add_existing.json +0 -0
  1368. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.rpm/add_existing_upgrade.json +0 -0
  1369. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.rpm/add_url.json +0 -0
  1370. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/yum.rpm/remove.json +0 -0
  1371. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zfs.dataset/create.yaml +0 -0
  1372. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zfs.dataset/create_noop.yaml +0 -0
  1373. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zfs.dataset/create_recursive.yaml +0 -0
  1374. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zfs.dataset/create_sparse.yaml +0 -0
  1375. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zfs.dataset/create_volume.yaml +0 -0
  1376. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zfs.dataset/delete.yaml +0 -0
  1377. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zfs.dataset/delete_noop.yaml +0 -0
  1378. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zfs.dataset/delete_recursive.yaml +0 -0
  1379. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zfs.dataset/set_props.yaml +0 -0
  1380. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zfs.filesystem/create.yaml +0 -0
  1381. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zfs.filesystem/delete.yaml +0 -0
  1382. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zfs.snapshot/create.yaml +0 -0
  1383. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zfs.volume/create.yaml +0 -0
  1384. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.key/add.json +0 -0
  1385. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.packages/add_packages.json +0 -0
  1386. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.packages/install_with_args.json +0 -0
  1387. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.packages/install_with_global_args.json +0 -0
  1388. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.packages/uninstall_with_args.json +0 -0
  1389. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.packages/uninstall_with_global_args.json +0 -0
  1390. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.packages/update_clean.json +0 -0
  1391. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.repo/add.json +0 -0
  1392. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.repo/add_url.json +0 -0
  1393. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.repo/remove.json +0 -0
  1394. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.rpm/add.json +0 -0
  1395. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.rpm/add_existing.json +0 -0
  1396. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.rpm/add_existing_upgrade.json +0 -0
  1397. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.rpm/add_url.json +0 -0
  1398. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/operations/zypper.rpm/remove.json +0 -0
  1399. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/paramiko_util.py +0 -0
  1400. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_api/__init__.py +0 -0
  1401. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_api/test_api.py +0 -0
  1402. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_api/test_api_arguments.py +0 -0
  1403. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_api/test_api_command.py +0 -0
  1404. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_api/test_api_config.py +0 -0
  1405. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_api/test_api_deploys.py +0 -0
  1406. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_api/test_api_facts.py +0 -0
  1407. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_api/test_api_host.py +0 -0
  1408. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_api/test_api_inventory.py +0 -0
  1409. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_api/test_api_util.py +0 -0
  1410. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/__init__.py +0 -0
  1411. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/deploy.py +0 -0
  1412. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/deploy_random.py +0 -0
  1413. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/files/a_file +0 -0
  1414. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/group_data/all.py +0 -0
  1415. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/group_data/invalid.json +0 -0
  1416. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/group_data/leftover_data.py +0 -0
  1417. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/inventories/inventory.py +0 -0
  1418. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/inventories/inventory_all.py +0 -0
  1419. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/inventories/inventory_ansible +0 -0
  1420. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/inventories/inventory_ansible.json +0 -0
  1421. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/inventories/inventory_ansible.yml +0 -0
  1422. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/tasks/a_task.py +0 -0
  1423. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/tasks/another_task.py +0 -0
  1424. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/tasks/b_task.py +0 -0
  1425. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/tasks/nested/empty_task.py +0 -0
  1426. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/templates/a_template.j2 +0 -0
  1427. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy/utils.py +0 -0
  1428. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy_fails/invalid_argument_type.py +0 -0
  1429. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy_fails/invalid_operation_arg.py +0 -0
  1430. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/deploy_fails/operation_error.py +0 -0
  1431. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/inventories/invalid.py +0 -0
  1432. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/test_cli_deploy.py +0 -0
  1433. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/test_cli_exceptions.py +0 -0
  1434. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/test_cli_inventory.py +0 -0
  1435. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/test_cli_util.py +0 -0
  1436. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/test_context_objects.py +0 -0
  1437. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/user/test_ops.py +0 -0
  1438. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_cli/util.py +0 -0
  1439. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_connectors/__init__.py +0 -0
  1440. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_connectors/test_chroot.py +0 -0
  1441. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_connectors/test_dockerssh.py +0 -0
  1442. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_connectors/test_local.py +0 -0
  1443. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_connectors/test_terraform.py +0 -0
  1444. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_connectors/test_util.py +0 -0
  1445. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_connectors/test_vagrant.py +0 -0
  1446. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_global_arguments.py +0 -0
  1447. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_operations.py +0 -0
  1448. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/test_units.py +0 -0
  1449. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/typing/invalid/operation_kwarg.py +0 -0
  1450. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/typing/invalid/operation_kwarg_value.py +0 -0
  1451. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/typing/valid/operation.py +0 -0
  1452. {pyinfra-3.5.1 → pyinfra-3.6.1}/tests/words.txt +0 -0
@@ -0,0 +1,16 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "mcp__github__pull_request_read",
5
+ "Bash(python -m pytest:*)",
6
+ "Bash(uv run pytest:*)",
7
+ "Bash(python scripts/lint_arguments_sync.py:*)",
8
+ "mcp__github__issue_read",
9
+ "mcp__github__list_issues",
10
+ "Bash(grep:*)",
11
+ "mcp__github__list_tags",
12
+ "mcp__github__list_commits",
13
+ "mcp__github__search_users"
14
+ ]
15
+ }
16
+ }
@@ -0,0 +1,10 @@
1
+ ---
2
+ name: generatechangelog
3
+ ---
4
+
5
+ Generate pyinfra changelog for release:
6
+
7
+ - get previous v3.x tag
8
+ - use github mcp to pull commit messages, and github usernames
9
+ - generate changelog in a similar format to CHANGELOG.md (grab the first ~100 lines to get an idea)
10
+ - ask human overlord to confirm then prepend it to CHANGELOG.md
@@ -0,0 +1,125 @@
1
+ name: Lint & Test
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - 3.x
7
+ - 2.x
8
+ - 1.x
9
+ - 0.x
10
+ pull_request:
11
+
12
+ jobs:
13
+ # Linting
14
+ #
15
+
16
+ lint:
17
+ runs-on: ubuntu-24.04
18
+ steps:
19
+ - uses: actions/checkout@v5
20
+ - uses: actions/setup-python@v5
21
+ with:
22
+ python-version: "3.13"
23
+ - name: Install uv
24
+ uses: astral-sh/setup-uv@v6
25
+ - uses: astral-sh/ruff-action@v3
26
+ - uses: astral-sh/ruff-action@v3
27
+ with:
28
+ args: "format --check"
29
+
30
+ type-check:
31
+ runs-on: ubuntu-24.04
32
+ steps:
33
+ - uses: actions/checkout@v5
34
+ - uses: actions/setup-python@v5
35
+ with:
36
+ python-version: "3.13"
37
+ - name: Install uv
38
+ uses: astral-sh/setup-uv@v6
39
+ - run: uv sync --group test --no-default-groups
40
+ - run: uv run mypy
41
+ - run: uv run python scripts/lint_arguments_sync.py
42
+
43
+ spell-check:
44
+ runs-on: ubuntu-24.04
45
+ steps:
46
+ - uses: actions/checkout@v5
47
+ - name: Check spelling
48
+ uses: crate-ci/typos@v1.30.3
49
+
50
+ unit-test:
51
+ needs:
52
+ - lint
53
+ - type-check
54
+ - spell-check
55
+ strategy:
56
+ matrix:
57
+ os: [macos-26, macos-15, macos-14, windows-2025, windows-2022, ubuntu-24.04, ubuntu-22.04]
58
+ # Test every OS vs. Python 3.13, and only one for 3.1[012]
59
+ python-version: ["3.13"]
60
+ include:
61
+ - os: ubuntu-24.04
62
+ python-version: "3.12"
63
+ - os: ubuntu-24.04
64
+ python-version: "3.11"
65
+ - os: ubuntu-24.04
66
+ python-version: "3.10"
67
+ runs-on: ${{ matrix.os }}
68
+ steps:
69
+ - uses: actions/checkout@v5
70
+ - uses: actions/setup-python@v5
71
+ with:
72
+ python-version: ${{ matrix.python-version }}
73
+ - name: Install uv
74
+ uses: astral-sh/setup-uv@v6
75
+ - run: uv sync --group test --no-default-groups --python=${{ matrix.python-version }}
76
+ - run: uv run pytest --cov --disable-warnings
77
+ - name: Upload coverage report to codecov
78
+ if: ${{ matrix.os == 'ubuntu-24.04' && matrix.python-version == '3.13' }}
79
+ uses: codecov/codecov-action@v5
80
+
81
+ # End-to-end tests
82
+ #
83
+
84
+ end-to-end-test:
85
+ needs:
86
+ - lint
87
+ - type-check
88
+ - spell-check
89
+ strategy:
90
+ matrix:
91
+ os: [ubuntu-22.04, ubuntu-24.04]
92
+ test-name: [local, ssh, docker, podman]
93
+ include:
94
+ - os: macos-14
95
+ test-name: local
96
+ - os: macos-15
97
+ test-name: local
98
+ - os: macos-26
99
+ test-name: local
100
+ runs-on: ${{ matrix.os }}
101
+ steps:
102
+ - uses: actions/checkout@v5
103
+ - uses: actions/setup-python@v5
104
+ with:
105
+ python-version: "3.13"
106
+ - name: Install uv
107
+ uses: astral-sh/setup-uv@v6
108
+ - run: uv sync --group test --no-default-groups --python=${{ matrix.python-version }}
109
+ - run: uv run pytest -m end_to_end_${{ matrix.test-name }}
110
+
111
+ # Finally, single jon to check if all completed, for use in protected branch
112
+
113
+ tests-done:
114
+ if: ${{ always() }}
115
+ needs:
116
+ - lint
117
+ - type-check
118
+ - spell-check
119
+ - unit-test
120
+ - end-to-end-test
121
+ runs-on: ubuntu-latest
122
+ steps:
123
+ - uses: matrix-org/done-action@v3
124
+ with:
125
+ needs: ${{ toJSON(needs) }}
@@ -0,0 +1,199 @@
1
+ # GitHub Issue #1019: files.line grep inserts wrong regex
2
+
3
+ ## Issue Summary
4
+
5
+ **Reported by:** JustScreaMy (October 4, 2023)
6
+ **Status:** Open (bug label)
7
+ **Assignee:** Fizzadar
8
+
9
+ ### Problem Description
10
+
11
+ When using `files.line` to replace a single line, the operation produces an incorrect grep regex pattern, causing the line to never be matched and therefore automatically inserted at the end of the file instead of replacing the existing line.
12
+
13
+ ### Reproduction Code
14
+
15
+ ```python
16
+ from pyinfra.operations import files
17
+
18
+ files.line(
19
+ name="Disable password login",
20
+ path="/etc/ssh/sshd_config",
21
+ line="PasswordAuthentication .+",
22
+ replace="PasswordAuthentication no"
23
+ )
24
+ ```
25
+
26
+ ### Expected Behavior
27
+
28
+ The code should match a line containing `PasswordAuthentication yes` and replace it with `PasswordAuthentication no`.
29
+
30
+ ### Actual Behavior (at time of report)
31
+
32
+ The grep command generated was:
33
+ ```bash
34
+ sh -c 'grep -e '\"'\"'^.*.+PasswordAuthentication.+.*$'\"'\"' /etc/ssh/sshd_config
35
+ ```
36
+
37
+ The problem was that the original regex `PasswordAuthentication .+` was being transformed into `^.*.+PasswordAuthentication.+.*$` which places the `.+` from the original pattern **before** the literal text instead of after it.
38
+
39
+ ---
40
+
41
+ ## Root Cause Analysis
42
+
43
+ ### Investigation Findings
44
+
45
+ Based on the comments on the issue and analysis of the current codebase:
46
+
47
+ 1. **Issue Comment from "bad" (June 19, 2025):** States that the `.+` insertion issue appears to be fixed on 3.x HEAD, with the example grep now showing:
48
+ ```
49
+ sh -c 'grep -e '\"'\"'^.*10.0.2.2[ ]\\{1,\\}host.*$'\"'\"' /etc/hosts [...]
50
+ ```
51
+
52
+ 2. **Current Code Path:**
53
+
54
+ The `files.line` operation (in `/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/operations/files.py`, line 278-475) calls `adjust_regex()` (line 372) to transform the user-provided line pattern.
55
+
56
+ The `adjust_regex()` function (in `/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/operations/util/files.py`, lines 200-216):
57
+ ```python
58
+ def adjust_regex(line: str, escape_regex_characters: bool) -> str:
59
+ """
60
+ Ensure the regex starts with '^' and ends with '$' and escape regex characters if requested
61
+ """
62
+ match_line = line
63
+
64
+ if escape_regex_characters:
65
+ match_line = re.sub(r"([\.\\\+\*\?\[\^\]\$\(\)\{\}\-])", r"\\\1", match_line)
66
+
67
+ # Ensure we're matching a whole line, note: match may be a partial line so we
68
+ # put any matches on either side.
69
+ if not match_line.startswith("^"):
70
+ match_line = "^.*{0}".format(match_line)
71
+ if not match_line.endswith("$"):
72
+ match_line = "{0}.*$".format(match_line)
73
+
74
+ return match_line
75
+ ```
76
+
77
+ 3. **Historical Bug Context:**
78
+
79
+ Based on the original report's grep output `^.*.+PasswordAuthentication.+.*$`, it appears the old code was incorrectly inserting `^.*.+` at the beginning regardless of the pattern contents. This has been fixed in the current implementation which simply prepends `^.*` (without `.+`).
80
+
81
+ ### Current Behavior Analysis
82
+
83
+ For the input `line="PasswordAuthentication .+"`:
84
+ - Current code produces: `^.*PasswordAuthentication .+.*$`
85
+ - This regex will match any line containing "PasswordAuthentication " followed by one or more characters
86
+
87
+ The current implementation **appears correct** for the reported issue.
88
+
89
+ ### Remaining Concerns
90
+
91
+ As noted in the second comment by "bad", there are still potential optimization issues:
92
+
93
+ 1. **Unnecessary `^.*` prefix:** Adding `^.*` serves no purpose in grep matching and causes excessive backtracking, slowing down pattern matching on large files.
94
+
95
+ 2. **Unnecessary `.*$` suffix:** This is also redundant since grep already matches partial lines by default.
96
+
97
+ These are performance concerns rather than correctness issues.
98
+
99
+ ---
100
+
101
+ ## Current Status Assessment
102
+
103
+ Based on the investigation, **the original bug appears to have been fixed** in the current 3.x codebase. The `adjust_regex()` function now correctly prepends `^.*` (without the erroneous `.+`) and appends `.*$`.
104
+
105
+ However, there are two perspectives on whether the issue should be closed:
106
+
107
+ ### Option 1: Close as Fixed
108
+ The original reported behavior (`.+` being incorrectly inserted) is no longer present.
109
+
110
+ ### Option 2: Address Performance Concerns
111
+ While functionally correct, the regex transformation adds unnecessary overhead:
112
+ - `^.*` causes backtracking in grep
113
+ - `.*$` is redundant
114
+
115
+ ---
116
+
117
+ ## Proposed Fix (Performance Optimization)
118
+
119
+ If the decision is to address the performance concerns raised in the comments, the `adjust_regex()` function could be simplified:
120
+
121
+ ### Current Code (`/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/operations/util/files.py`):
122
+ ```python
123
+ def adjust_regex(line: str, escape_regex_characters: bool) -> str:
124
+ """
125
+ Ensure the regex starts with '^' and ends with '$' and escape regex characters if requested
126
+ """
127
+ match_line = line
128
+
129
+ if escape_regex_characters:
130
+ match_line = re.sub(r"([\.\\\+\*\?\[\^\]\$\(\)\{\}\-])", r"\\\1", match_line)
131
+
132
+ # Ensure we're matching a whole line, note: match may be a partial line so we
133
+ # put any matches on either side.
134
+ if not match_line.startswith("^"):
135
+ match_line = "^.*{0}".format(match_line)
136
+ if not match_line.endswith("$"):
137
+ match_line = "{0}.*$".format(match_line)
138
+
139
+ return match_line
140
+ ```
141
+
142
+ ### Proposed Optimized Code:
143
+ ```python
144
+ def adjust_regex(line: str, escape_regex_characters: bool) -> str:
145
+ """
146
+ Ensure the regex matches a whole line and escape regex characters if requested.
147
+
148
+ The pattern is wrapped to ensure it matches complete lines, not partial matches
149
+ within a line.
150
+ """
151
+ match_line = line
152
+
153
+ if escape_regex_characters:
154
+ match_line = re.sub(r"([\.\\\+\*\?\[\^\]\$\(\)\{\}\-])", r"\\\1", match_line)
155
+
156
+ # Ensure we're matching a whole line by anchoring at start and end.
157
+ # Note: We only add anchors, not wildcards, since grep already matches
158
+ # partial lines and adding ^.* causes unnecessary backtracking.
159
+ if not match_line.startswith("^"):
160
+ match_line = "^{0}".format(match_line)
161
+ if not match_line.endswith("$"):
162
+ match_line = "{0}$".format(match_line)
163
+
164
+ return match_line
165
+ ```
166
+
167
+ **IMPORTANT:** This change would alter the matching behavior:
168
+ - Current: `PasswordAuthentication .+` becomes `^.*PasswordAuthentication .+.*$` (matches line containing the pattern anywhere)
169
+ - Proposed: `PasswordAuthentication .+` becomes `^PasswordAuthentication .+$` (matches line starting with the pattern)
170
+
171
+ This is a **breaking change** and may not be desirable. The docstring for `files.line` states:
172
+ > "Unless line matches a line (starts with ^, ends $), pyinfra will wrap it such that it does, like: `^.*LINE.*$`. This means we don't swap parts of lines out."
173
+
174
+ So the current behavior is **intentional** to support matching partial lines. The performance cost is a documented trade-off for flexibility.
175
+
176
+ ---
177
+
178
+ ## Related Files
179
+
180
+ 1. **Operation definition:** `/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/operations/files.py` (lines 278-475)
181
+ 2. **Regex adjustment utility:** `/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/operations/util/files.py` (lines 200-216)
182
+ 3. **FindInFile fact (grep execution):** `/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/facts/files.py` (lines 423-456)
183
+
184
+ ---
185
+
186
+ ## Recommendations
187
+
188
+ 1. **Confirm the original bug is fixed:** The core issue (`.+` being inserted incorrectly) appears resolved.
189
+
190
+ 2. **Decision needed on performance optimization:**
191
+ - If keeping current behavior (partial line matching with `^.*...*$`), document that this is intentional
192
+ - If changing to strict anchoring (`^...$`), this is a breaking change requiring a major version bump or deprecation period
193
+
194
+ 3. **Consider closing the issue** with a note that:
195
+ - The original regex insertion bug is fixed
196
+ - The `^.*` and `.*$` wrapping is intentional per the documented behavior
197
+ - Users who want exact line matching should use explicit `^` and `$` anchors in their patterns
198
+
199
+ 4. **Update documentation** to clarify the performance implications of the default partial-line matching behavior and recommend explicit anchors for performance-critical use cases.
@@ -0,0 +1,299 @@
1
+ # GitHub Issue #1026: operations.apt.packages shows "SUCCESS/Changed" for packages that are already installed in some cases
2
+
3
+ **Issue URL:** https://github.com/pyinfra-dev/pyinfra/issues/1026
4
+ **Status:** Open
5
+ **Reporter:** @stone-w4tch3r
6
+ **Labels:** bug
7
+ **Created:** November 6, 2023
8
+
9
+ ## Issue Summary
10
+
11
+ When using `apt.packages` with package names that are "aliases" (i.e., virtual packages or packages that resolve to different actual package names), pyinfra incorrectly reports "SUCCESS/Changed" on every run, even when the package is already installed.
12
+
13
+ ### Reproduction Steps
14
+
15
+ 1. Run Ubuntu/Debian VM
16
+ 2. Run pyinfra with:
17
+ ```python
18
+ from pyinfra.operations import apt
19
+
20
+ apt.update(_sudo=True, cache_time=86400)
21
+ apt.packages(_sudo=True, packages=['fortune'])
22
+ ```
23
+ 3. Run again - pyinfra reports "Changed: 1" even though the package was already installed
24
+
25
+ ### The Problem
26
+
27
+ APT has a concept of package aliases/virtual packages. When you request `fortune`, APT resolves it to `fortune-mod`:
28
+
29
+ ```
30
+ sudo apt install fortune -y
31
+ Reading package lists... Done
32
+ Building dependency tree
33
+ Reading state information... Done
34
+ Note, selecting 'fortune-mod' instead of 'fortune' # <-- THIS
35
+ fortune-mod is already the newest version (1:1.99.1-7build1).
36
+ ```
37
+
38
+ pyinfra's `DebPackages` fact uses `dpkg -l` to list installed packages, which only shows the real package name (`fortune-mod`), not the alias (`fortune`). When the operation checks if `fortune` is installed, it doesn't find it because only `fortune-mod` is in the installed packages list.
39
+
40
+ ## Root Cause Analysis
41
+
42
+ ### Current Code Flow
43
+
44
+ 1. **`apt.packages` operation** (`/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/operations/apt.py`, lines 398-496):
45
+ - Calls `ensure_packages()` with the list of packages and current installed packages from `DebPackages` fact
46
+
47
+ 2. **`DebPackages` fact** (`/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/facts/deb.py`, lines 30-58):
48
+ - Uses `dpkg -l` command to get installed packages
49
+ - Returns dict of `{package_name: [versions]}`
50
+ - Only knows about **actual** package names, not aliases
51
+
52
+ 3. **`ensure_packages` utility** (`/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/operations/util/packaging.py`, lines 136-231):
53
+ - Takes an `expand_package_fact` parameter that can resolve package names to their actual counterparts
54
+ - Uses `_has_package()` function to check if a package is installed
55
+ - **APT operations do NOT use `expand_package_fact`** - this is the root cause
56
+
57
+ ### How Pacman Solved This
58
+
59
+ The pacman package manager has the same problem with groups and virtual packages. pyinfra solves it with:
60
+
61
+ 1. **`PacmanUnpackGroup` fact** (`/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/facts/pacman.py`, lines 14-39):
62
+ ```python
63
+ class PacmanUnpackGroup(FactBase):
64
+ def command(self, package):
65
+ return 'pacman -S --print-format "%n" {0} || true'.format(shlex.quote(package))
66
+ ```
67
+ This resolves package aliases/groups to their actual package names.
68
+
69
+ 2. **pacman.packages operation** (`/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/operations/pacman.py`, lines 74-82):
70
+ ```python
71
+ yield from ensure_packages(
72
+ host,
73
+ packages,
74
+ host.get_fact(PacmanPackages),
75
+ present,
76
+ install_command="pacman --noconfirm -S",
77
+ uninstall_command="pacman --noconfirm -R",
78
+ expand_package_fact=lambda package: host.get_fact(PacmanUnpackGroup, package=package),
79
+ )
80
+ ```
81
+
82
+ ### The Missing Piece for APT
83
+
84
+ The `apt.packages` operation does NOT pass an `expand_package_fact` parameter:
85
+
86
+ ```python
87
+ # Current code in apt.py (line 486-496)
88
+ yield from ensure_packages(
89
+ host,
90
+ packages,
91
+ host.get_fact(DebPackages),
92
+ present,
93
+ install_command=noninteractive_apt(install_command, force=force),
94
+ uninstall_command=noninteractive_apt(uninstall_command, force=force),
95
+ upgrade_command=noninteractive_apt(upgrade_command, force=force),
96
+ version_join="=",
97
+ latest=latest,
98
+ )
99
+ ```
100
+
101
+ ## Proposed Fix
102
+
103
+ ### 1. Create a new `DebResolvePackage` fact
104
+
105
+ Add to `/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/facts/deb.py`:
106
+
107
+ ```python
108
+ class DebResolvePackage(FactBase):
109
+ """
110
+ Resolves a package name (which may be an alias/virtual package) to the actual
111
+ package name(s) that would be installed by apt.
112
+
113
+ Returns a list of package names, or the original package if resolution fails.
114
+ """
115
+
116
+ @override
117
+ def requires_command(self, package) -> str:
118
+ return "apt-cache"
119
+
120
+ default = list
121
+
122
+ @override
123
+ def command(self, package):
124
+ # apt-cache show will show the resolved package info
125
+ # Use apt-get --simulate install to see what would actually be installed
126
+ # The -qq flag minimizes output, and we parse the "Inst" lines
127
+ return (
128
+ "apt-get -qq --simulate install {0} 2>/dev/null | "
129
+ "grep -oP '^Inst \\K[^ ]+' || echo {0}"
130
+ ).format(shlex.quote(package))
131
+
132
+ @override
133
+ def process(self, output):
134
+ # Return list of package names that would be installed
135
+ # Filter out empty lines
136
+ packages = [line.strip() for line in output if line.strip()]
137
+ return packages if packages else []
138
+ ```
139
+
140
+ **Alternative approach using `apt-cache`:**
141
+
142
+ ```python
143
+ class DebResolvePackage(FactBase):
144
+ """
145
+ Resolves a package name (which may be an alias/virtual package) to the actual
146
+ package name(s) that would be installed by apt.
147
+ """
148
+
149
+ @override
150
+ def requires_command(self, package) -> str:
151
+ return "apt-cache"
152
+
153
+ default = list
154
+
155
+ @override
156
+ def command(self, package):
157
+ # apt-cache policy shows the resolved package name
158
+ # For virtual packages, it shows what provides them
159
+ return "apt-cache policy {0} 2>/dev/null | head -1 | cut -d: -f1".format(
160
+ shlex.quote(package)
161
+ )
162
+
163
+ @override
164
+ def process(self, output):
165
+ result = []
166
+ for line in output:
167
+ line = line.strip()
168
+ if line:
169
+ result.append(line)
170
+ return result
171
+ ```
172
+
173
+ **Recommended approach using `apt-cache showpkg`** (as suggested in GitHub comment):
174
+
175
+ ```python
176
+ class DebResolvePackage(FactBase):
177
+ """
178
+ Resolves a package name (which may be an alias/virtual package) to the actual
179
+ package name(s) that would be installed by apt.
180
+
181
+ For virtual packages like 'fortune', this returns the real package name(s)
182
+ that provide the virtual package (e.g., 'fortune-mod').
183
+ """
184
+
185
+ @override
186
+ def requires_command(self, package) -> str:
187
+ return "apt-cache"
188
+
189
+ default = list
190
+
191
+ @override
192
+ def command(self, package):
193
+ # apt-cache showpkg shows reverse provides which tells us what packages
194
+ # provide a virtual package. We check if it's a real package first,
195
+ # and if not, look for providers.
196
+ return (
197
+ "if apt-cache show {0} >/dev/null 2>&1; then "
198
+ "echo {0}; "
199
+ "else "
200
+ "apt-cache showpkg {0} 2>/dev/null | "
201
+ "awk '/^Reverse Provides:/{{flag=1; next}} flag && NF{{print $1}}'; "
202
+ "fi"
203
+ ).format(shlex.quote(package))
204
+
205
+ @override
206
+ def process(self, output):
207
+ packages = [line.strip() for line in output if line.strip()]
208
+ return packages if packages else []
209
+ ```
210
+
211
+ ### 2. Update apt.packages to use the new fact
212
+
213
+ Modify `/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/operations/apt.py`:
214
+
215
+ ```python
216
+ # Add import at top
217
+ from pyinfra.facts.deb import DebPackage, DebPackages, DebResolvePackage
218
+
219
+ # Update ensure_packages call (around line 486)
220
+ yield from ensure_packages(
221
+ host,
222
+ packages,
223
+ host.get_fact(DebPackages),
224
+ present,
225
+ install_command=noninteractive_apt(install_command, force=force),
226
+ uninstall_command=noninteractive_apt(uninstall_command, force=force),
227
+ upgrade_command=noninteractive_apt(upgrade_command, force=force),
228
+ version_join="=",
229
+ latest=latest,
230
+ expand_package_fact=lambda package: host.get_fact(DebResolvePackage, package=package),
231
+ )
232
+ ```
233
+
234
+ ### 3. Add tests
235
+
236
+ Create test cases in `/Users/nick/Dev/Webroot/pyinfra/src/tests/`:
237
+
238
+ ```python
239
+ # Test for the new fact
240
+ def test_deb_resolve_package_virtual():
241
+ """Test that virtual packages are resolved to their providers."""
242
+ # Test with a known virtual package like 'fortune' -> 'fortune-mod'
243
+ pass
244
+
245
+ def test_deb_resolve_package_real():
246
+ """Test that real packages resolve to themselves."""
247
+ pass
248
+
249
+ # Test for the operation
250
+ def test_apt_packages_virtual_package_already_installed():
251
+ """Test that apt.packages doesn't report changes for already-installed virtual packages."""
252
+ pass
253
+ ```
254
+
255
+ ## Implementation Notes
256
+
257
+ ### Choice of apt command
258
+
259
+ Several options were discussed in the GitHub comments:
260
+
261
+ 1. **`apt-cache showpkg`** - Shows package information including "Reverse Provides" which lists what packages provide a virtual package
262
+ 2. **`apt-file`** - Can find which package provides a file (overkill for this use case)
263
+ 3. **`apt-get --simulate install`** - Shows exactly what would be installed
264
+
265
+ The recommended approach is `apt-cache showpkg` because:
266
+ - It's available on all Debian/Ubuntu systems with apt
267
+ - It directly shows the "Reverse Provides" relationship
268
+ - It doesn't require simulating an install (faster)
269
+
270
+ ### Edge Cases to Consider
271
+
272
+ 1. **Multiple providers**: A virtual package might have multiple providers. The current implementation would need to check if ANY of them is installed.
273
+ 2. **Version-specific aliases**: Some package aliases might be version-specific.
274
+ 3. **Architecture-specific packages**: Packages like `libc6:amd64` need proper handling.
275
+ 4. **Transitional packages**: Packages that exist but recommend/depend on their successor.
276
+
277
+ ### Performance Considerations
278
+
279
+ Using `expand_package_fact` will result in additional fact-gathering for each package. This is the same approach used by pacman and is acceptable. The facts are memoized, so repeated calls for the same package don't result in extra commands.
280
+
281
+ ## Related Files
282
+
283
+ | File Path | Purpose |
284
+ |-----------|---------|
285
+ | `/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/operations/apt.py` | APT operations including `apt.packages` |
286
+ | `/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/facts/deb.py` | DEB package facts - needs new `DebResolvePackage` fact |
287
+ | `/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/operations/util/packaging.py` | `ensure_packages` utility that supports `expand_package_fact` |
288
+ | `/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/operations/pacman.py` | Reference implementation using `expand_package_fact` |
289
+ | `/Users/nick/Dev/Webroot/pyinfra/src/src/pyinfra/facts/pacman.py` | Reference `PacmanUnpackGroup` fact |
290
+
291
+ ## Conclusion
292
+
293
+ The issue occurs because pyinfra's APT package management doesn't resolve package aliases/virtual packages to their actual names before checking if they're installed. The fix requires:
294
+
295
+ 1. Creating a new `DebResolvePackage` fact that uses `apt-cache showpkg` to resolve package names
296
+ 2. Updating `apt.packages` to pass the new fact as `expand_package_fact` to `ensure_packages`
297
+ 3. Adding appropriate tests
298
+
299
+ This mirrors the existing solution for pacman packages and leverages the already-implemented `expand_package_fact` parameter in `ensure_packages()`.