hostctl 0.2.6__tar.gz → 0.2.7__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 (115) hide show
  1. {hostctl-0.2.6 → hostctl-0.2.7}/CHANGELOG.md +21 -2
  2. {hostctl-0.2.6 → hostctl-0.2.7}/PKG-INFO +4 -4
  3. {hostctl-0.2.6 → hostctl-0.2.7}/pyproject.toml +13 -9
  4. {hostctl-0.2.6 → hostctl-0.2.7}/.gitignore +0 -0
  5. {hostctl-0.2.6 → hostctl-0.2.7}/LICENSE +0 -0
  6. {hostctl-0.2.6 → hostctl-0.2.7}/README.md +0 -0
  7. {hostctl-0.2.6 → hostctl-0.2.7}/docs/api/reference.md +0 -0
  8. {hostctl-0.2.6 → hostctl-0.2.7}/docs/changelog.md +0 -0
  9. {hostctl-0.2.6 → hostctl-0.2.7}/docs/guide/cli.md +0 -0
  10. {hostctl-0.2.6 → hostctl-0.2.7}/docs/guide/contracts.md +0 -0
  11. {hostctl-0.2.6 → hostctl-0.2.7}/docs/guide/extending.md +0 -0
  12. {hostctl-0.2.6 → hostctl-0.2.7}/docs/guide/path.md +0 -0
  13. {hostctl-0.2.6 → hostctl-0.2.7}/docs/guide/providers.md +0 -0
  14. {hostctl-0.2.6 → hostctl-0.2.7}/docs/guide/run.md +0 -0
  15. {hostctl-0.2.6 → hostctl-0.2.7}/docs/guide/transfer.md +0 -0
  16. {hostctl-0.2.6 → hostctl-0.2.7}/docs/index.md +0 -0
  17. {hostctl-0.2.6 → hostctl-0.2.7}/examples/application_provider.py +0 -0
  18. {hostctl-0.2.6 → hostctl-0.2.7}/examples/copy_between_hosts.py +0 -0
  19. {hostctl-0.2.6 → hostctl-0.2.7}/examples/local_run.py +0 -0
  20. {hostctl-0.2.6 → hostctl-0.2.7}/examples/remote_run.py +0 -0
  21. {hostctl-0.2.6 → hostctl-0.2.7}/mkdocs.yml +0 -0
  22. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/AGENTS.md +0 -0
  23. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/__init__.py +0 -0
  24. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/__main__.py +0 -0
  25. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/_async.py +0 -0
  26. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/_cli.py +0 -0
  27. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/executor/__init__.py +0 -0
  28. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/executor/_common.py +0 -0
  29. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/executor/_qga.py +0 -0
  30. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/executor/container.py +0 -0
  31. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/executor/local.py +0 -0
  32. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/executor/psrp.py +0 -0
  33. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/executor/qemu.py +0 -0
  34. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/executor/serial.py +0 -0
  35. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/executor/ssh.py +0 -0
  36. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/executor/winrm.py +0 -0
  37. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/host/__init__.py +0 -0
  38. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/host/_common.py +0 -0
  39. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/host/_connection.py +0 -0
  40. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/host/_local.py +0 -0
  41. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/host/_ssh.py +0 -0
  42. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/host/_staged_io.py +0 -0
  43. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/host/_winrm.py +0 -0
  44. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/host/composite_path.py +0 -0
  45. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/host/container.py +0 -0
  46. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/host/container_path.py +0 -0
  47. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/host/qemu.py +0 -0
  48. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/host/serial.py +0 -0
  49. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/host/system.py +0 -0
  50. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/process/__init__.py +0 -0
  51. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/process/_common.py +0 -0
  52. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/process/container.py +0 -0
  53. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/process/psrp.py +0 -0
  54. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/process/qemu_serial.py +0 -0
  55. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/process/serial.py +0 -0
  56. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/process/ssh.py +0 -0
  57. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/provider/__init__.py +0 -0
  58. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/provider/_common.py +0 -0
  59. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/provider/transports.py +0 -0
  60. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/py.typed +0 -0
  61. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/serial/__init__.py +0 -0
  62. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/shell/__init__.py +0 -0
  63. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/shell/_common.py +0 -0
  64. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/shell/cmd.py +0 -0
  65. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/shell/fish.py +0 -0
  66. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/shell/posix.py +0 -0
  67. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/shell/powershell.py +0 -0
  68. {hostctl-0.2.6 → hostctl-0.2.7}/src/hostctl/sync.py +0 -0
  69. {hostctl-0.2.6 → hostctl-0.2.7}/tests/conformance/__init__.py +0 -0
  70. {hostctl-0.2.6 → hostctl-0.2.7}/tests/conformance/path_fakes.py +0 -0
  71. {hostctl-0.2.6 → hostctl-0.2.7}/tests/conformance/providers.py +0 -0
  72. {hostctl-0.2.6 → hostctl-0.2.7}/tests/conformance/test_composite_path_routing.py +0 -0
  73. {hostctl-0.2.6 → hostctl-0.2.7}/tests/conformance/test_live.py +0 -0
  74. {hostctl-0.2.6 → hostctl-0.2.7}/tests/conformance/test_path_contract.py +0 -0
  75. {hostctl-0.2.6 → hostctl-0.2.7}/tests/conformance/test_process_contract.py +0 -0
  76. {hostctl-0.2.6 → hostctl-0.2.7}/tests/conformance/test_run_contract.py +0 -0
  77. {hostctl-0.2.6 → hostctl-0.2.7}/tests/conformance/test_sync_contract.py +0 -0
  78. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_application_provider.py +0 -0
  79. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_asyncssh_errors.py +0 -0
  80. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_cli.py +0 -0
  81. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_composite_path_backend_kwargs.py +0 -0
  82. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_composite_path_inherited_operations.py +0 -0
  83. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_composite_path_propagation.py +0 -0
  84. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_connection_string.py +0 -0
  85. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_container_path.py +0 -0
  86. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_container_process.py +0 -0
  87. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_exec_command.py +0 -0
  88. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_executor_exports.py +0 -0
  89. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_host_api.py +0 -0
  90. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_host_container.py +0 -0
  91. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_host_local.py +0 -0
  92. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_host_module_layout.py +0 -0
  93. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_host_qemu.py +0 -0
  94. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_host_remote.py +0 -0
  95. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_host_winrm.py +0 -0
  96. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_observability.py +0 -0
  97. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_process.py +0 -0
  98. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_provider_fault_injection.py +0 -0
  99. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_psrp.py +0 -0
  100. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_qemu_executor.py +0 -0
  101. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_qemu_path.py +0 -0
  102. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_qemu_serial.py +0 -0
  103. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_qemu_serial_process.py +0 -0
  104. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_qga_ssh_transport.py +0 -0
  105. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_qga_transport.py +0 -0
  106. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_serial_executor.py +0 -0
  107. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_serial_host.py +0 -0
  108. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_serial_live.py +0 -0
  109. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_shell.py +0 -0
  110. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_ssh_process.py +0 -0
  111. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_staged_io.py +0 -0
  112. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_sync_helpers.py +0 -0
  113. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_system_host_fidelity.py +0 -0
  114. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_system_hosts.py +0 -0
  115. {hostctl-0.2.6 → hostctl-0.2.7}/tests/test_winrm_path.py +0 -0
@@ -7,7 +7,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
- ## [0.2.6] - 2026-08-16
10
+ ## [0.2.7] - 2026-08-16
11
+
12
+ ### Changed
13
+
14
+ - Dependency floors now name versions hostctl is actually tested against.
15
+ `pathlib_next` moves to `>=0.9.1,<0.10` and `netimps` to `>=0.2.0,<0.3`
16
+ (the `ssh` extra's `pathlib_next[sftp-async]` moves from `>=0.8.4` to the
17
+ same `>=0.9.1`). Both ceilings are unchanged, and no API hostctl calls has
18
+ moved — this only stops resolvers from choosing an install that does not
19
+ work.
20
+
21
+ The `pathlib_next` floor is above the start of its minor series for one
22
+ measured reason: `Path.symlink_to()` — and with it the `force=` keyword —
23
+ first exists in **0.9.1**. The composite path forwards `symlink_to` to
24
+ whichever backend path it was handed, so against a stock 0.9.0 `Path` the
25
+ whole chain raises `AttributeError` rather than linking anything. The
26
+ previous `>=0.8.6` floor therefore advertised support for installs where
27
+ composite `symlink_to` could never work. `netimps` needs nothing past
28
+ `0.2.0` and floors at the series start.
11
29
 
12
30
  ### Added
13
31
 
@@ -511,7 +529,8 @@ test suite on Python 3.9 through 3.14.
511
529
  assigned to it; a config-less host now builds its own family configuration
512
530
  instead.
513
531
 
514
- [Unreleased]: https://github.com/jose-pr/hostctl/compare/v0.2.6...HEAD
532
+ [Unreleased]: https://github.com/jose-pr/hostctl/compare/v0.2.7...HEAD
533
+ [0.2.7]: https://github.com/jose-pr/hostctl/compare/v0.2.6...v0.2.7
515
534
  [0.2.6]: https://github.com/jose-pr/hostctl/compare/v0.2.5...v0.2.6
516
535
  [0.2.5]: https://github.com/jose-pr/hostctl/compare/v0.2.4...v0.2.5
517
536
  [0.2.4]: https://github.com/jose-pr/hostctl/compare/v0.2.3...v0.2.4
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: hostctl
3
- Version: 0.2.6
3
+ Version: 0.2.7
4
4
  Summary: Run commands and access files on a host, local or remote, protocol-agnostic
5
5
  Project-URL: Homepage, https://github.com/jose-pr/hostctl/
6
6
  Project-URL: Documentation, https://jose-pr.github.io/hostctl/
@@ -24,8 +24,8 @@ Classifier: Topic :: System :: Filesystems
24
24
  Classifier: Topic :: System :: Systems Administration
25
25
  Classifier: Typing :: Typed
26
26
  Requires-Python: >=3.9
27
- Requires-Dist: netimps<0.3,>=0.1
28
- Requires-Dist: pathlib-next<0.10,>=0.8.6
27
+ Requires-Dist: netimps<0.3,>=0.2.0
28
+ Requires-Dist: pathlib-next<0.10,>=0.9.1
29
29
  Provides-Extra: container
30
30
  Requires-Dist: docker<8,>=7.1; extra == 'container'
31
31
  Provides-Extra: dev
@@ -44,7 +44,7 @@ Provides-Extra: serial
44
44
  Requires-Dist: pyserial<4,>=3.5; extra == 'serial'
45
45
  Provides-Extra: ssh
46
46
  Requires-Dist: asyncssh; extra == 'ssh'
47
- Requires-Dist: pathlib-next[sftp-async]<0.10,>=0.8.4; extra == 'ssh'
47
+ Requires-Dist: pathlib-next[sftp-async]<0.10,>=0.9.1; extra == 'ssh'
48
48
  Provides-Extra: winrm
49
49
  Requires-Dist: pywinrm<0.6,>=0.5.0; extra == 'winrm'
50
50
  Provides-Extra: winrm-credssp
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "hostctl"
7
- version = "0.2.6"
7
+ version = "0.2.7"
8
8
  authors = [{ name = "Jose A." }]
9
9
  description = "Run commands and access files on a host, local or remote, protocol-agnostic"
10
10
  readme = "README.md"
@@ -34,19 +34,23 @@ classifiers = [
34
34
  # them. Transport implementations remain extras, so importing hostctl never
35
35
  # requires them.
36
36
  #
37
- # Both ranges span two minors deliberately: hostctl uses no API added in
38
- # pathlib_next 0.9 or netimps 0.2, so raising the floor would exclude working
39
- # installs for nothing. The ceilings stay at the next major-ish boundary
37
+ # Each floor is the `.0` of the dependency's current minor series, raised
38
+ # above it only where hostctl needs a later patch. pathlib_next is that
39
+ # exception: `Path.symlink_to()` -- and with it the `force=` keyword -- first
40
+ # exists in 0.9.1, and the composite path forwards `symlink_to` to whichever
41
+ # backend path it was handed, so against a stock 0.9.0 `Path` the call raises
42
+ # `AttributeError` (measured on 3.9 and 3.14). netimps has no such case and
43
+ # floors at the series start. The ceilings stay at the next major-ish boundary
40
44
  # because both projects are pre-1.0, where a minor may break. Composite kwargs
41
- # passthrough does not change this: forwarding is signature-aware, so `force=`
42
- # is forwarded when the installed pathlib_next provides it and rejected at the
43
- # boundary when it does not (verified against 0.9.0 and 0.9.1).
44
- dependencies = ["pathlib_next>=0.8.6,<0.10", "netimps>=0.1,<0.3"]
45
+ # passthrough does not change this: forwarding is signature-aware, so a
46
+ # `force=` the installed pathlib_next does not declare is rejected at the
47
+ # composite boundary rather than inside a transport.
48
+ dependencies = ["pathlib_next>=0.9.1,<0.10", "netimps>=0.2.0,<0.3"]
45
49
 
46
50
  [project.optional-dependencies]
47
51
  # SSH-backed run()/path(): asyncssh for shell exec, pathlib_next's SftpPath
48
52
  # (asyncssh-only since 0.8.2) for the remote path backend.
49
- ssh = ["asyncssh", "pathlib_next[sftp-async]>=0.8.4,<0.10"]
53
+ ssh = ["asyncssh", "pathlib_next[sftp-async]>=0.9.1,<0.10"]
50
54
  # Windows Remote Management command execution.
51
55
  winrm = ["pywinrm>=0.5.0,<0.6"]
52
56
  # PowerShell Remoting Protocol runspaces (Python 3.10+ only). The marker
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes