quilt-hp-python 0.3.0__tar.gz → 0.3.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 (120) hide show
  1. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/CHANGELOG.md +7 -0
  2. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/PKG-INFO +3 -3
  3. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/README.md +2 -2
  4. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/docs/reference/client.md +1 -1
  5. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/pyproject.toml +1 -1
  6. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/__init__.py +1 -1
  7. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/services/streaming.py +20 -3
  8. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/tests/test_cli_surfaces_extra.py +1 -1
  9. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/.github/copilot-instructions.md +0 -0
  10. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/.github/workflows/ci.yml +0 -0
  11. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/.github/workflows/docs-deploy.yml +0 -0
  12. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/.github/workflows/release.yml +0 -0
  13. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/.gitignore +0 -0
  14. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/LICENSE +0 -0
  15. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/docs/explanation/architecture.md +0 -0
  16. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/docs/explanation/authentication.md +0 -0
  17. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/docs/explanation/grpc-and-protobuf.md +0 -0
  18. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/docs/explanation/snapshot-and-stream.md +0 -0
  19. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/docs/explanation/streaming-protocol.md +0 -0
  20. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/docs/how-to/authenticate.md +0 -0
  21. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/docs/how-to/automation-daemon.md +0 -0
  22. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/docs/how-to/cli-scripting.md +0 -0
  23. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/docs/how-to/configure-comfort-settings.md +0 -0
  24. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/docs/how-to/configure-schedules.md +0 -0
  25. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/docs/how-to/contribute.md +0 -0
  26. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/docs/how-to/control-spaces.md +0 -0
  27. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/docs/how-to/home-assistant.md +0 -0
  28. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/docs/how-to/regenerate-protos.md +0 -0
  29. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/docs/how-to/stream-updates.md +0 -0
  30. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/docs/how-to/tui-app.md +0 -0
  31. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/docs/index.md +0 -0
  32. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/docs/reference/api-reference.md +0 -0
  33. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/docs/reference/documentation-standards.md +0 -0
  34. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/docs/reference/grpc-services-matrix.md +0 -0
  35. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/docs/reference/hds-entities.md +0 -0
  36. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/docs/reference/models.md +0 -0
  37. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/docs/reference/token-management.md +0 -0
  38. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/docs/tutorial/get-started.md +0 -0
  39. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/mkdocs.yml +0 -0
  40. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/proto/cleaned/quilt_device_pairing.proto +0 -0
  41. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/proto/cleaned/quilt_hds.proto +0 -0
  42. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/proto/cleaned/quilt_notifier.proto +0 -0
  43. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/proto/cleaned/quilt_services.proto +0 -0
  44. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/proto/cleaned/quilt_system.proto +0 -0
  45. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/scripts/bump_version.py +0 -0
  46. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/scripts/check_docs_nav.py +0 -0
  47. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/scripts/generate_public_api_reference.py +0 -0
  48. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/scripts/regen_protos.sh +0 -0
  49. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/_paths.py +0 -0
  50. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/_proto/__init__.py +0 -0
  51. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/_proto/quilt_device_pairing_pb2.py +0 -0
  52. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/_proto/quilt_device_pairing_pb2.pyi +0 -0
  53. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/_proto/quilt_device_pairing_pb2_grpc.py +0 -0
  54. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/_proto/quilt_hds_pb2.py +0 -0
  55. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/_proto/quilt_hds_pb2.pyi +0 -0
  56. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/_proto/quilt_hds_pb2_grpc.py +0 -0
  57. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/_proto/quilt_notifier_pb2.py +0 -0
  58. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/_proto/quilt_notifier_pb2.pyi +0 -0
  59. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/_proto/quilt_notifier_pb2_grpc.py +0 -0
  60. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/_proto/quilt_services_pb2.py +0 -0
  61. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/_proto/quilt_services_pb2.pyi +0 -0
  62. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/_proto/quilt_services_pb2_grpc.py +0 -0
  63. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/_proto/quilt_system_pb2.py +0 -0
  64. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/_proto/quilt_system_pb2.pyi +0 -0
  65. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/_proto/quilt_system_pb2_grpc.py +0 -0
  66. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/auth.py +0 -0
  67. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/cli/__init__.py +0 -0
  68. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/cli/main.py +0 -0
  69. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/cli/settings.py +0 -0
  70. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/cli/store.py +0 -0
  71. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/cli/tui.py +0 -0
  72. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/client.py +0 -0
  73. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/const.py +0 -0
  74. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/exceptions.py +0 -0
  75. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/models/__init__.py +0 -0
  76. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/models/_helpers.py +0 -0
  77. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/models/comfort.py +0 -0
  78. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/models/controller.py +0 -0
  79. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/models/energy.py +0 -0
  80. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/models/enums.py +0 -0
  81. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/models/indoor_unit.py +0 -0
  82. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/models/outdoor_unit.py +0 -0
  83. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/models/qsm.py +0 -0
  84. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/models/schedule.py +0 -0
  85. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/models/sensor.py +0 -0
  86. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/models/software_update.py +0 -0
  87. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/models/space.py +0 -0
  88. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/models/system.py +0 -0
  89. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/py.typed +0 -0
  90. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/services/__init__.py +0 -0
  91. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/services/hds.py +0 -0
  92. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/services/system.py +0 -0
  93. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/services/user.py +0 -0
  94. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/tokens.py +0 -0
  95. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/src/quilt_hp/transport.py +0 -0
  96. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/tests/__init__.py +0 -0
  97. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/tests/conftest.py +0 -0
  98. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/tests/test_auth.py +0 -0
  99. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/tests/test_auth_store_settings_edges.py +0 -0
  100. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/tests/test_cli_feature_completion.py +0 -0
  101. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/tests/test_cli_login.py +0 -0
  102. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/tests/test_client_cache.py +0 -0
  103. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/tests/test_client_service_error_paths.py +0 -0
  104. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/tests/test_grpc_retry.py +0 -0
  105. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/tests/test_hds_payloads.py +0 -0
  106. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/tests/test_hds_schedule_mapping.py +0 -0
  107. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/tests/test_hds_service_branches.py +0 -0
  108. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/tests/test_models.py +0 -0
  109. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/tests/test_models_extra.py +0 -0
  110. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/tests/test_models_from_proto.py +0 -0
  111. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/tests/test_settings_store.py +0 -0
  112. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/tests/test_streaming.py +0 -0
  113. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/tests/test_streaming_concurrency.py +0 -0
  114. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/tests/test_streaming_debounce.py +0 -0
  115. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/tests/test_streaming_health.py +0 -0
  116. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/tests/test_streaming_reconnect_dispatch_extra.py +0 -0
  117. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/tests/test_tokens.py +0 -0
  118. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/tests/test_transport.py +0 -0
  119. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/tests/test_transport_interceptor_extra.py +0 -0
  120. {quilt_hp_python-0.3.0 → quilt_hp_python-0.3.1}/tests/test_tui_bindings.py +0 -0
@@ -2,6 +2,13 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.3.1] - 2026-05-14
6
+
7
+ ### Fixed
8
+ - `RST_STREAM with error code 0` (HTTP/2 `NO_ERROR`, a normal server-side graceful reset) is now logged at `DEBUG` instead of `WARNING` to reduce log noise
9
+ - `CANCELLED` (server closed the stream normally, e.g. keepalive timeout or server rotation) is now logged at `INFO` instead of `WARNING`
10
+ - `UNAUTHENTICATED` reconnects handled by the automatic token refresh are now logged at `INFO` instead of `WARNING`
11
+
5
12
  ## [0.3.0] - 2026-05-12
6
13
 
7
14
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: quilt-hp-python
3
- Version: 0.3.0
3
+ Version: 0.3.1
4
4
  Summary: Async Python client for Quilt mini-split HVAC systems
5
5
  Project-URL: Repository, https://github.com/eman/quilt-hp-python
6
6
  Project-URL: Issues, https://github.com/eman/quilt-hp-python/issues
@@ -63,9 +63,9 @@ Requires-Dist: mkdocs>=1.6; extra == 'docs'
63
63
  Requires-Dist: mkdocstrings[python]>=0.29; extra == 'docs'
64
64
  Description-Content-Type: text/markdown
65
65
 
66
- # quilt-hp-python
66
+ # Quilt Python Client
67
67
 
68
- Async Python client library for [Quilt](https://www.quilt.com/) mini-split HVAC systems.
68
+ Python client library for [Quilt](https://www.quilt.com/) mini-split HVAC systems.
69
69
 
70
70
  Communicates with the Quilt cloud API via gRPC to control spaces (rooms), indoor units,
71
71
  comfort presets, schedules, and stream real-time updates.
@@ -1,6 +1,6 @@
1
- # quilt-hp-python
1
+ # Quilt Python Client
2
2
 
3
- Async Python client library for [Quilt](https://www.quilt.com/) mini-split HVAC systems.
3
+ Python client library for [Quilt](https://www.quilt.com/) mini-split HVAC systems.
4
4
 
5
5
  Communicates with the Quilt cloud API via gRPC to control spaces (rooms), indoor units,
6
6
  comfort presets, schedules, and stream real-time updates.
@@ -69,7 +69,7 @@ Raised when a requested resource does not exist (gRPC `NOT_FOUND`).
69
69
  ### `__version__`
70
70
 
71
71
  ```python
72
- __version__: str # e.g. "0.3.0"
72
+ __version__: str # e.g. "0.3.1"
73
73
  ```
74
74
 
75
75
  ---
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "quilt-hp-python"
7
- version = "0.3.0"
7
+ version = "0.3.1"
8
8
  description = "Async Python client for Quilt mini-split HVAC systems"
9
9
  readme = "README.md"
10
10
  license = { file = "LICENSE" }
@@ -10,7 +10,7 @@ from quilt_hp.exceptions import (
10
10
  QuiltStreamError,
11
11
  )
12
12
 
13
- __version__ = "0.3.0"
13
+ __version__ = "0.3.1"
14
14
 
15
15
  __all__ = [
16
16
  "Environment",
@@ -612,7 +612,9 @@ class NotifierStream:
612
612
 
613
613
  if is_unauth and self._authenticate is not None and can_retry:
614
614
  self._stream_state = "reconnecting"
615
- logger.warning(
615
+ # Token expiry is handled automatically — INFO to confirm it
616
+ # happened without alarming the user.
617
+ logger.info(
616
618
  "Stream got UNAUTHENTICATED; refreshing token (attempt %d)",
617
619
  attempt + 1,
618
620
  )
@@ -630,10 +632,25 @@ class NotifierStream:
630
632
  break
631
633
  elif can_retry:
632
634
  self._stream_state = "reconnecting"
633
- logger.warning(
635
+ details = exc.details() or ""
636
+ # Classify the error to pick the right log level:
637
+ # DEBUG — HTTP/2 NO_ERROR RST_STREAM: server gracefully
638
+ # recycled the connection (load balancer, keepalive).
639
+ # INFO — CANCELLED: server closed the stream normally
640
+ # (keepalive timeout, server rotation, etc.).
641
+ # WARNING — anything else is unexpected.
642
+ is_graceful_reset = "RST_STREAM with error code 0" in details
643
+ is_server_cancel = exc.code() == grpc.StatusCode.CANCELLED
644
+ if is_graceful_reset:
645
+ log = logger.debug
646
+ elif is_server_cancel:
647
+ log = logger.info
648
+ else:
649
+ log = logger.warning
650
+ log(
634
651
  "Stream error %s: %s; reconnecting in %.1fs (attempt %d)",
635
652
  exc.code(),
636
- exc.details(),
653
+ details,
637
654
  delay,
638
655
  attempt + 1,
639
656
  )
@@ -16,7 +16,7 @@ runner = CliRunner()
16
16
  def test_version_option_outputs_package_version() -> None:
17
17
  result = runner.invoke(cli_main.app, ["--version"])
18
18
  assert result.exit_code == 0
19
- assert result.stdout.strip() == "0.3.0"
19
+ assert result.stdout.strip() == "0.3.1"
20
20
 
21
21
 
22
22
  class _FakeClient:
File without changes