rustuya-local 0.1.0.dev10__tar.gz → 0.1.0.dev11__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 (105) hide show
  1. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/CHANGELOG.md +6 -0
  2. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/PKG-INFO +2 -2
  3. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/custom_components/rustuya/manifest.json +3 -3
  4. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/docs/REVIEW.md +2 -1
  5. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/docs/ROADMAP.md +1 -1
  6. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/docs/STATUS.md +3 -3
  7. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/pyproject.toml +2 -2
  8. rustuya_local-0.1.0.dev11/release-notes.md +3 -0
  9. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/src/rustuya_local/host/hub.py +1 -10
  10. rustuya_local-0.1.0.dev10/release-notes.md +0 -9
  11. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/.github/dependabot.yml +0 -0
  12. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/.github/workflows/_test.yml +0 -0
  13. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/.github/workflows/ci.yml +0 -0
  14. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/.github/workflows/hacs.yml +0 -0
  15. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/.github/workflows/hassfest.yml +0 -0
  16. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/.github/workflows/release.yml +0 -0
  17. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/.gitignore +0 -0
  18. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/LICENSE +0 -0
  19. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/README.md +0 -0
  20. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/custom_components/rustuya/__init__.py +0 -0
  21. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/custom_components/rustuya/brand/icon.png +0 -0
  22. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/custom_components/rustuya/brand/icon.svg +0 -0
  23. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/custom_components/rustuya/brand/icon@2x.png +0 -0
  24. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/custom_components/rustuya/brand/logo.png +0 -0
  25. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/custom_components/rustuya/brand/logo.svg +0 -0
  26. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/custom_components/rustuya/brand/logo@2x.png +0 -0
  27. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/custom_components/rustuya/bridge_supervisor.py +0 -0
  28. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/custom_components/rustuya/bridge_sync.py +0 -0
  29. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/custom_components/rustuya/broker.py +0 -0
  30. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/custom_components/rustuya/config_flow.py +0 -0
  31. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/custom_components/rustuya/const.py +0 -0
  32. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/custom_components/rustuya/manager_session.py +0 -0
  33. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/custom_components/rustuya/panel.py +0 -0
  34. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/custom_components/rustuya/panel_bridge.py +0 -0
  35. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/custom_components/rustuya/services.yaml +0 -0
  36. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/custom_components/rustuya/strings.json +0 -0
  37. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/custom_components/rustuya/translations/en.json +0 -0
  38. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/custom_components/rustuya/translations/ko.json +0 -0
  39. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/custom_components/rustuya/www/rustuya-panel.js +0 -0
  40. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/docs/ARCHITECTURE.md +0 -0
  41. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/docs/MIGRATING.md +0 -0
  42. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/docs/REDESIGN.md +0 -0
  43. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/docs/history/ROADMAP-2026-10-12.md +0 -0
  44. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/hacs.json +0 -0
  45. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/scripts/build_dropin.py +0 -0
  46. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/scripts/release_notes.py +0 -0
  47. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/src/rustuya_local/__init__.py +0 -0
  48. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/src/rustuya_local/__main__.py +0 -0
  49. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/src/rustuya_local/async_tools.py +0 -0
  50. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/src/rustuya_local/bridge_client.py +0 -0
  51. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/src/rustuya_local/cli.py +0 -0
  52. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/src/rustuya_local/config.py +0 -0
  53. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/src/rustuya_local/files.py +0 -0
  54. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/src/rustuya_local/host/__init__.py +0 -0
  55. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/src/rustuya_local/host/devices.py +0 -0
  56. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/src/rustuya_local/host/il.py +0 -0
  57. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/src/rustuya_local/host/memory.py +0 -0
  58. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/src/rustuya_local/host/mqtt.py +0 -0
  59. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/src/rustuya_local/host/overrides.py +0 -0
  60. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/src/rustuya_local/host/pack.py +0 -0
  61. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/src/rustuya_local/host/rules.py +0 -0
  62. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/src/rustuya_local/host/runner.py +0 -0
  63. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/src/rustuya_local/host/transport.py +0 -0
  64. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/src/rustuya_local/manager_plugin/__init__.py +0 -0
  65. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/src/rustuya_local/manager_plugin/api.py +0 -0
  66. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/src/rustuya_local/manager_plugin/static/index.js +0 -0
  67. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/src/rustuya_local/service.py +0 -0
  68. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/src/rustuya_local/validation.py +0 -0
  69. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/e2e/conftest.py +0 -0
  70. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/e2e/devices.py +0 -0
  71. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/e2e/test_bridge_registration.py +0 -0
  72. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/e2e/test_chain_in_process.py +0 -0
  73. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/e2e/test_chain_mqtt.py +0 -0
  74. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/e2e/test_daemon.py +0 -0
  75. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/e2e/test_full_stack.py +0 -0
  76. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/e2e/test_full_stack_custom_templates.py +0 -0
  77. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/e2e/test_full_stack_devices.py +0 -0
  78. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/e2e/test_manager_plugin.py +0 -0
  79. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/e2e/test_purge.py +0 -0
  80. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/e2e/test_service.py +0 -0
  81. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/ha/conftest.py +0 -0
  82. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/ha/fake_manager.py +0 -0
  83. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/ha/test_bridge_probe.py +0 -0
  84. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/ha/test_bridge_supervisor.py +0 -0
  85. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/ha/test_config_flow.py +0 -0
  86. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/ha/test_init.py +0 -0
  87. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/ha/test_manager_session.py +0 -0
  88. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/ha/test_migrate.py +0 -0
  89. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/ha/test_panel.py +0 -0
  90. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/unit/test_config.py +0 -0
  91. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/unit/test_cover_settings.py +0 -0
  92. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/unit/test_dropin.py +0 -0
  93. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/unit/test_files.py +0 -0
  94. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/unit/test_hazardous.py +0 -0
  95. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/unit/test_host.py +0 -0
  96. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/unit/test_hub.py +0 -0
  97. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/unit/test_il_vectors.py +0 -0
  98. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/unit/test_link_watcher.py +0 -0
  99. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/unit/test_mqtt_lifecycle.py +0 -0
  100. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/unit/test_pack.py +0 -0
  101. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/unit/test_panel_js.py +0 -0
  102. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/unit/test_plugin_api.py +0 -0
  103. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/unit/test_release_notes.py +0 -0
  104. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/unit/test_rule_files.py +0 -0
  105. {rustuya_local-0.1.0.dev10 → rustuya_local-0.1.0.dev11}/tests/unit/tuya_samples.py +0 -0
@@ -8,6 +8,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
8
8
 
9
9
  ## [Unreleased]
10
10
 
11
+ ## [0.1.0.dev11] — 2026-10-18
12
+
13
+ ### Changed
14
+ - Decide which drivers a reload replaces with tuya-interpreter's public `TuyaDriver.same_config` instead of
15
+ comparing its version-specific state snapshot; require tuya-interpreter 0.1.0rc2.
16
+
11
17
  ## [0.1.0.dev10] — 2026-10-18
12
18
 
13
19
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: rustuya-local
3
- Version: 0.1.0.dev10
3
+ Version: 0.1.0.dev11
4
4
  Summary: Local Tuya control: rustuya-bridge -> tuya-interpreter -> IL (ildevice). HA-independent core.
5
5
  Project-URL: Homepage, https://github.com/3735943886/rustuya-local
6
6
  Project-URL: Repository, https://github.com/3735943886/rustuya-local
@@ -10,7 +10,7 @@ License-File: LICENSE
10
10
  Requires-Python: >=3.13
11
11
  Requires-Dist: paho-mqtt>=2.0
12
12
  Requires-Dist: pyrustuyabridge>=0.4
13
- Requires-Dist: tuya-interpreter>=0.1.0a2
13
+ Requires-Dist: tuya-interpreter>=0.1.0rc2
14
14
  Provides-Extra: fullstack
15
15
  Requires-Dist: tuyamock; extra == 'fullstack'
16
16
  Provides-Extra: manager
@@ -9,12 +9,12 @@
9
9
  "iot_class": "local_push",
10
10
  "issue_tracker": "https://github.com/3735943886/rustuya-local/issues",
11
11
  "requirements": [
12
- "tuya-interpreter>=0.1.0a2",
12
+ "tuya-interpreter>=0.1.0rc2",
13
13
  "paho-mqtt>=2.0",
14
14
  "rustuya-manager>=0.2.3",
15
15
  "pyrustuyabridge>=0.4",
16
- "rustuya-local>=0.1.0.dev10"
16
+ "rustuya-local>=0.1.0.dev11"
17
17
  ],
18
18
  "single_config_entry": true,
19
- "version": "0.1.0.dev10"
19
+ "version": "0.1.0.dev11"
20
20
  }
@@ -71,7 +71,8 @@ reproduction. README, architecture and migration notes now explain actual preced
71
71
 
72
72
  ## Remaining maintenance considerations
73
73
 
74
- - `Hub._same` depends on driver state keys `block`, `delta` and `covers`; check compatibility when dependencies change.
74
+ - ~~`Hub._same` depends on driver state keys `block`, `delta` and `covers`.~~ Resolved: the reload comparison uses
75
+ tuya-interpreter's public `TuyaDriver.same_config`.
75
76
  - `manager_registry.ready_registry` patches private manager methods/fields; a public registry contract would reduce coupling.
76
77
  - Producer probing is a startup check, not atomic exclusion of two simultaneously starting producers.
77
78
  - Bridge status has no request ID; contiguous-page validation cannot perfectly distinguish all other-client responses.
@@ -15,7 +15,7 @@ Completed milestones and earlier deployment records are preserved in the [previo
15
15
  ## Maintenance
16
16
 
17
17
  - [x] Replace private manager registry patches and wizard state polling with public async contracts.
18
- - [ ] Reduce dependence on driver state internals in `Hub._same` through a public contract.
18
+ - [x] Reduce dependence on driver state internals in `Hub._same` through a public contract (`TuyaDriver.same_config`).
19
19
  - [ ] Verify Python 3.13 with minimum supported dependency versions. The full CI suite uses 3.14; wheel import/CLI smoke tests pass on 3.13.
20
20
  - [ ] Define the supported drop-in OS/architectures and provide platform assets as needed. Each archive includes its build host's native library.
21
21
  - [ ] Verify ownership/conflict policy when manual file editing, IL settings saves and automatic pack updates overlap.
@@ -1,6 +1,6 @@
1
1
  # Current status
2
2
 
3
- Updated: 2026-10-18. Baseline: `0.1.0.dev10`.
3
+ Updated: 2026-10-18. Baseline: `0.1.0.dev11`.
4
4
  The state of deployed servers has not been checked.
5
5
 
6
6
  ## Implementation
@@ -12,9 +12,9 @@ rule files and settings persistence. It does not create HA entities or publish M
12
12
 
13
13
  | Component | Declared requirement |
14
14
  |---|---|
15
- | rustuya-local | `0.1.0.dev10` |
15
+ | rustuya-local | `0.1.0.dev11` |
16
16
  | Python | Base package `>=3.13`; full tests use 3.14 |
17
- | tuya-interpreter | `>=0.1.0a2` |
17
+ | tuya-interpreter | `>=0.1.0rc2` |
18
18
  | pyrustuyabridge | `>=0.4` |
19
19
  | paho-mqtt | `>=2.0` |
20
20
  | rustuya-manager | `>=0.2.3` in the manager test extra and HA manifest |
@@ -4,12 +4,12 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "rustuya-local"
7
- version = "0.1.0.dev10"
7
+ version = "0.1.0.dev11"
8
8
  description = "Local Tuya control: rustuya-bridge -> tuya-interpreter -> IL (ildevice). HA-independent core."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
11
11
  license = "MIT"
12
- dependencies = ["tuya-interpreter>=0.1.0a2", "pyrustuyabridge>=0.4", "paho-mqtt>=2.0"]
12
+ dependencies = ["tuya-interpreter>=0.1.0rc2", "pyrustuyabridge>=0.4", "paho-mqtt>=2.0"]
13
13
  # rustuya-manager (custom_components/rustuya's config flow) is optional at the package level (the HA manifest
14
14
  # pulls it in); declared here too so the venv used for this repo's tests has it. pyrustuyabridge is a base dependency
15
15
  # now (not just for the embedded bridge): rustuya-local's own bridge_client uses it to interpret rustuya-bridge's
@@ -0,0 +1,3 @@
1
+ ### Changed
2
+ - Decide which drivers a reload replaces with tuya-interpreter's public `TuyaDriver.same_config` instead of
3
+ comparing its version-specific state snapshot; require tuya-interpreter 0.1.0rc2.
@@ -87,15 +87,6 @@ class Hub:
87
87
  if not usable_id(device_id):
88
88
  raise ValueError(f'device id {device_id!r} is not usable as an il-mqtt topic level (M-2)')
89
89
 
90
- @staticmethod
91
- def _same(old: TuyaDriver, new: TuyaDriver) -> bool:
92
- # Version-specific driver configuration metadata, compared without interpreting Tuya DPs.
93
- return (old.rules_id == new.rules_id
94
- and old.state['block'] == new.state['block']
95
- and old.state['delta'] == new.state['delta']
96
- and old.descriptor == new.descriptor
97
- and [c['settings'] for c in old.state['covers']] == [c['settings'] for c in new.state['covers']])
98
-
99
90
  def _adopt(self, old: TuyaDriver | None, new: TuyaDriver, seed: Sequence, now: float,
100
91
  *, rules: dict) -> list:
101
92
  device_id = new.descriptor['id']
@@ -160,7 +151,7 @@ class Hub:
160
151
  replacements = {}
161
152
  for device_id, new in fresh.items():
162
153
  old = self.drivers[device_id]
163
- if self._same(old, new):
154
+ if old.same_config(new):
164
155
  continue
165
156
  seed = [Connected()] if old.linked else []
166
157
  if old.synced:
@@ -1,9 +0,0 @@
1
- ### Changed
2
- - Wait for live bridge acknowledgements and the panel's registry refresh instead of sleeping after device commands.
3
- - Verify embedded bridge startup through a live MQTT config publication, supervise its native async task, and
4
- retain ownership when shutdown times out.
5
- - Wait for producer presence with an event and an explicit timeout instead of repeated short sleeps.
6
- - Use manager state-change notifications for wizard progress and cloud-fetch completion; remove status polling.
7
- - Use manager registry readiness instead of patching its private methods; require rustuya-manager 0.2.3.
8
- - Create session directories with a regular loop instead of a discarded list comprehension.
9
- - Wait for daemon readiness events in the subprocess test, allowing both startup timeout stages to finish.