python-bsblan 6.1.7__tar.gz → 6.1.8__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.
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/workflows/codeql.yaml +3 -3
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/workflows/dependency-review.yaml +1 -1
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/workflows/docs.yaml +2 -2
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/workflows/labels.yaml +1 -1
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/workflows/linting.yaml +5 -5
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/workflows/release-drafter.yaml +1 -1
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/workflows/release.yaml +3 -3
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/workflows/scorecard.yml +3 -3
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/workflows/stale.yaml +1 -1
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/workflows/tests.yaml +4 -4
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/workflows/typing.yaml +2 -2
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/PKG-INFO +1 -1
- python_bsblan-6.1.8/openspec/changes/archive/2026-07-16-fix-partial-validation-state/.openspec.yaml +3 -0
- python_bsblan-6.1.8/openspec/changes/archive/2026-07-16-fix-partial-validation-state/design.md +86 -0
- python_bsblan-6.1.8/openspec/changes/archive/2026-07-16-fix-partial-validation-state/proposal.md +38 -0
- python_bsblan-6.1.8/openspec/changes/archive/2026-07-16-fix-partial-validation-state/specs/lazy-validation-completeness/spec.md +63 -0
- python_bsblan-6.1.8/openspec/changes/archive/2026-07-16-fix-partial-validation-state/tasks.md +29 -0
- python_bsblan-6.1.8/openspec/specs/lazy-validation-completeness/spec.md +71 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/package-lock.json +4 -4
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/package.json +1 -1
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/pyproject.toml +2 -2
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/src/bsblan/_validation.py +104 -51
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/src/bsblan/models.py +7 -2
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/src/bsblan/utility.py +31 -6
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_api_validation.py +130 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_entity_info.py +2 -1
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_hot_water_additional.py +183 -8
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_include_parameter.py +3 -2
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_reset_validation.py +12 -0
- python_bsblan-6.1.7/.github/hooks/run-validation-after-edits.json +0 -11
- python_bsblan-6.1.7/.github/hooks/run_validation_after_edits.sh +0 -92
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.editorconfig +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.gitattributes +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/CODE_OF_CONDUCT.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/CONTRIBUTING.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/ISSUE_TEMPLATE/PULL_REQUEST_TEMPLATE.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/SECURITY.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/agents/pr-review.agent.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/agents/security-reviewer.agent.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/agents/tdd-refactor.agent.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/copilot-instructions.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/labels.yml +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/prompts/add-parameter.prompt.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/prompts/code-review.prompt.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/prompts/opsx-apply.prompt.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/prompts/opsx-archive.prompt.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/prompts/opsx-explore.prompt.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/prompts/opsx-propose.prompt.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/prompts/opsx-sync.prompt.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/release-drafter.yml +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/renovate.json +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/skills/bsblan-parameters/SKILL.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/skills/bsblan-testing/SKILL.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/skills/feature-doc-updates/SKILL.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/skills/openspec-apply-change/SKILL.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/skills/openspec-archive-change/SKILL.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/skills/openspec-explore/SKILL.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/skills/openspec-propose/SKILL.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/skills/openspec-sync-specs/SKILL.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/workflows/auto-approve-renovate.yml +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/workflows/lock.yaml +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/workflows/pr-labels.yaml +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.github/zizmor.yml +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.gitignore +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.nvmrc +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.pre-commit-config.yaml +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.prettierignore +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/.yamllint +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/AGENTS.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/CLAUDE.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/LICENSE.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/Makefile +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/README.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/docs/api/client.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/docs/api/constants.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/docs/api/exceptions.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/docs/api/models.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/docs/getting-started.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/docs/index.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/examples/control.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/examples/discovery.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/examples/fetch_param.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/examples/profile_init.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/examples/ruff.toml +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/examples/speed_test.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/mkdocs.yml +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/openspec/changes/archive/2026-07-03-add-cooling-operating-mode/.openspec.yaml +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/openspec/changes/archive/2026-07-03-add-cooling-operating-mode/design.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/openspec/changes/archive/2026-07-03-add-cooling-operating-mode/proposal.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/openspec/changes/archive/2026-07-03-add-cooling-operating-mode/specs/cooling-operating-mode/spec.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/openspec/changes/archive/2026-07-03-add-cooling-operating-mode/tasks.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/openspec/changes/archive/2026-07-04-harden-circuit-discovery-consistency/.openspec.yaml +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/openspec/changes/archive/2026-07-04-harden-circuit-discovery-consistency/design.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/openspec/changes/archive/2026-07-04-harden-circuit-discovery-consistency/proposal.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/openspec/changes/archive/2026-07-04-harden-circuit-discovery-consistency/specs/circuit-discovery/spec.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/openspec/changes/archive/2026-07-04-harden-circuit-discovery-consistency/tasks.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/openspec/changes/archive/2026-07-04-improve-client-readability-domain-slices/.openspec.yaml +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/openspec/changes/archive/2026-07-04-improve-client-readability-domain-slices/design.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/openspec/changes/archive/2026-07-04-improve-client-readability-domain-slices/proposal.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/openspec/changes/archive/2026-07-04-improve-client-readability-domain-slices/specs/client-retry-policy/spec.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/openspec/changes/archive/2026-07-04-improve-client-readability-domain-slices/tasks.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/openspec/changes/archive/2026-07-12-distinguish-schedule-error-types/.openspec.yaml +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/openspec/changes/archive/2026-07-12-distinguish-schedule-error-types/design.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/openspec/changes/archive/2026-07-12-distinguish-schedule-error-types/proposal.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/openspec/changes/archive/2026-07-12-distinguish-schedule-error-types/specs/error-classification/spec.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/openspec/changes/archive/2026-07-12-distinguish-schedule-error-types/tasks.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/openspec/config.yaml +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/openspec/specs/circuit-discovery/spec.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/openspec/specs/client-retry-policy/spec.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/openspec/specs/cooling-operating-mode/spec.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/openspec/specs/error-classification/spec.md +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/sonar-project.properties +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/src/bsblan/__init__.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/src/bsblan/_hot_water.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/src/bsblan/_parameters.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/src/bsblan/_schedules.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/src/bsblan/_temperature.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/src/bsblan/_thermostat.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/src/bsblan/_transport.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/src/bsblan/_version.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/src/bsblan/bsblan.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/src/bsblan/constants.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/src/bsblan/exceptions.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/src/bsblan/py.typed +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/__init__.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/conftest.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/fixtures/device.json +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/fixtures/dict_version.json +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/fixtures/hot_water_state.json +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/fixtures/info.json +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/fixtures/password.txt +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/fixtures/pps_device.json +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/fixtures/pps_state.json +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/fixtures/pps_static_values.json +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/fixtures/sensor.json +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/fixtures/state.json +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/fixtures/state_circuit2.json +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/fixtures/static_state.json +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/fixtures/static_state_circuit2.json +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/fixtures/thermostat_hvac.json +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/fixtures/thermostat_temp.json +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/fixtures/time.json +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/ruff.toml +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_api_initialization.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_auth.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_backoff_retry.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_bsblan.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_bsblan_edge_cases.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_circuit.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_configuration.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_constants.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_context_manager.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_device.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_dhw_time_switch.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_entity_info_ha.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_heating_schedule.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_hotwater_state.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_info.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_initialization.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_pps.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_read_parameters.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_response_encoding.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_schedule_models.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_sensor.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_set_heating_schedule.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_set_hot_water_schedule.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_set_hotwater.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_state.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_static_state.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_temperature_unit.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_temperature_validation.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_thermostat.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_time.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_utility.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_utility_additional.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_utility_edge_cases.py +0 -0
- {python_bsblan-6.1.7 → python_bsblan-6.1.8}/tests/test_version_errors.py +0 -0
|
@@ -23,10 +23,10 @@ jobs:
|
|
|
23
23
|
security-events: write
|
|
24
24
|
steps:
|
|
25
25
|
- name: ⤵️ Check out code from GitHub
|
|
26
|
-
uses: actions/checkout@
|
|
26
|
+
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
|
|
27
27
|
with:
|
|
28
28
|
persist-credentials: false
|
|
29
29
|
- name: 🏗 Initialize CodeQL
|
|
30
|
-
uses: github/codeql-action/init@
|
|
30
|
+
uses: github/codeql-action/init@e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81 # v4.37.3
|
|
31
31
|
- name: 🚀 Perform CodeQL Analysis
|
|
32
|
-
uses: github/codeql-action/analyze@
|
|
32
|
+
uses: github/codeql-action/analyze@e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81 # v4.37.3
|
|
@@ -13,7 +13,7 @@ jobs:
|
|
|
13
13
|
steps:
|
|
14
14
|
- name: ⤵️ Check out code from GitHub
|
|
15
15
|
# yamllint disable-line rule:line-length
|
|
16
|
-
uses: actions/checkout@
|
|
16
|
+
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
|
|
17
17
|
with:
|
|
18
18
|
persist-credentials: false
|
|
19
19
|
- name: 👀 Dependency review
|
|
@@ -23,11 +23,11 @@ jobs:
|
|
|
23
23
|
runs-on: ubuntu-latest
|
|
24
24
|
steps:
|
|
25
25
|
- name: ⤵️ Check out code from GitHub
|
|
26
|
-
uses: actions/checkout@
|
|
26
|
+
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
|
|
27
27
|
with:
|
|
28
28
|
persist-credentials: false
|
|
29
29
|
- name: 🏗 Set up uv
|
|
30
|
-
uses: astral-sh/setup-uv@
|
|
30
|
+
uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2
|
|
31
31
|
with:
|
|
32
32
|
enable-cache: true
|
|
33
33
|
- name: 🏗 Set up Python ${{ env.DEFAULT_PYTHON }}
|
|
@@ -21,7 +21,7 @@ jobs:
|
|
|
21
21
|
issues: write
|
|
22
22
|
steps:
|
|
23
23
|
- name: ⤵️ Check out code from GitHub
|
|
24
|
-
uses: actions/checkout@
|
|
24
|
+
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
|
|
25
25
|
with:
|
|
26
26
|
persist-credentials: false
|
|
27
27
|
- name: 🚀 Run Label Syncer
|
|
@@ -21,11 +21,11 @@ jobs:
|
|
|
21
21
|
runs-on: ubuntu-latest
|
|
22
22
|
steps:
|
|
23
23
|
- name: ⤵️ Check out code from GitHub
|
|
24
|
-
uses: actions/checkout@
|
|
24
|
+
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
|
|
25
25
|
with:
|
|
26
26
|
persist-credentials: false
|
|
27
27
|
- name: 🏗 Set up uv
|
|
28
|
-
uses: astral-sh/setup-uv@
|
|
28
|
+
uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2
|
|
29
29
|
with:
|
|
30
30
|
enable-cache: true
|
|
31
31
|
- name: 🏗 Set up Python ${{ env.DEFAULT_PYTHON }}
|
|
@@ -45,11 +45,11 @@ jobs:
|
|
|
45
45
|
runs-on: ubuntu-latest
|
|
46
46
|
steps:
|
|
47
47
|
- name: ⤵️ Check out code from GitHub
|
|
48
|
-
uses: actions/checkout@
|
|
48
|
+
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
|
|
49
49
|
with:
|
|
50
50
|
persist-credentials: false
|
|
51
51
|
- name: 🏗 Set up uv
|
|
52
|
-
uses: astral-sh/setup-uv@
|
|
52
|
+
uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2
|
|
53
53
|
with:
|
|
54
54
|
enable-cache: true
|
|
55
55
|
- name: 🏗 Set up Python ${{ env.DEFAULT_PYTHON }}
|
|
@@ -60,7 +60,7 @@ jobs:
|
|
|
60
60
|
- name: 🏗 Install Python dependencies
|
|
61
61
|
run: uv sync --dev
|
|
62
62
|
- name: 🏗 Set up Node.js
|
|
63
|
-
uses: actions/setup-node@
|
|
63
|
+
uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6.5.0
|
|
64
64
|
with:
|
|
65
65
|
node-version-file: ".nvmrc"
|
|
66
66
|
cache: "npm"
|
|
@@ -36,7 +36,7 @@ jobs:
|
|
|
36
36
|
steps:
|
|
37
37
|
- name: 🚀 Run Release Drafter
|
|
38
38
|
# yamllint disable-line rule:line-length
|
|
39
|
-
uses: release-drafter/release-drafter@
|
|
39
|
+
uses: release-drafter/release-drafter@eada3c96a64734dd381cfbda23511034e328ddb0 # v7.6.0
|
|
40
40
|
with:
|
|
41
41
|
prerelease: ${{ github.event.inputs.prerelease == 'true' }}
|
|
42
42
|
prerelease-identifier: ${{ github.event.inputs.prerelease_identifier }}
|
|
@@ -25,11 +25,11 @@ jobs:
|
|
|
25
25
|
id-token: write
|
|
26
26
|
steps:
|
|
27
27
|
- name: ⤵️ Check out code from GitHub
|
|
28
|
-
uses: actions/checkout@
|
|
28
|
+
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
|
|
29
29
|
with:
|
|
30
30
|
persist-credentials: false
|
|
31
31
|
- name: 🏗 Set up uv
|
|
32
|
-
uses: astral-sh/setup-uv@
|
|
32
|
+
uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2
|
|
33
33
|
with:
|
|
34
34
|
enable-cache: false
|
|
35
35
|
- name: 🏗 Set up Python ${{ env.DEFAULT_PYTHON }}
|
|
@@ -54,7 +54,7 @@ jobs:
|
|
|
54
54
|
with:
|
|
55
55
|
subject-path: ./dist/*
|
|
56
56
|
- name: 🚀 Publish to PyPi
|
|
57
|
-
uses: pypa/gh-action-pypi-publish@
|
|
57
|
+
uses: pypa/gh-action-pypi-publish@ba38be9e461d3875417946c167d0b5f3d385a247 # v1.14.1
|
|
58
58
|
with:
|
|
59
59
|
verbose: true
|
|
60
60
|
print-hash: true
|
|
@@ -34,13 +34,13 @@ jobs:
|
|
|
34
34
|
steps:
|
|
35
35
|
- name: "Checkout code"
|
|
36
36
|
# yamllint disable-line rule:line-length
|
|
37
|
-
uses: actions/checkout@
|
|
37
|
+
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
|
|
38
38
|
with:
|
|
39
39
|
persist-credentials: false
|
|
40
40
|
|
|
41
41
|
- name: "Run analysis"
|
|
42
42
|
# yamllint disable-line rule:line-length
|
|
43
|
-
uses: ossf/scorecard-action@
|
|
43
|
+
uses: ossf/scorecard-action@2d1146689b8cda280b9bc96326124645441f03bc # v2.4.4
|
|
44
44
|
with:
|
|
45
45
|
results_file: results.sarif
|
|
46
46
|
results_format: sarif
|
|
@@ -66,6 +66,6 @@ jobs:
|
|
|
66
66
|
# Upload the results to GitHub's code scanning dashboard (optional).
|
|
67
67
|
- name: "Upload to code-scanning"
|
|
68
68
|
# yamllint disable-line rule:line-length
|
|
69
|
-
uses: github/codeql-action/upload-sarif@
|
|
69
|
+
uses: github/codeql-action/upload-sarif@e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81 # v4.37.3
|
|
70
70
|
with:
|
|
71
71
|
sarif_file: results.sarif
|
|
@@ -18,7 +18,7 @@ jobs:
|
|
|
18
18
|
pull-requests: write
|
|
19
19
|
steps:
|
|
20
20
|
- name: 🚀 Run stale
|
|
21
|
-
uses: actions/stale@
|
|
21
|
+
uses: actions/stale@1e223db275d687790206a7acac4d1a11bd6fe629 # v10.4.0
|
|
22
22
|
with:
|
|
23
23
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
|
24
24
|
days-before-stale: 30
|
|
@@ -29,11 +29,11 @@ jobs:
|
|
|
29
29
|
python: ["3.12", "3.13", "3.14"]
|
|
30
30
|
steps:
|
|
31
31
|
- name: ⤵️ Check out code from GitHub
|
|
32
|
-
uses: actions/checkout@
|
|
32
|
+
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
|
|
33
33
|
with:
|
|
34
34
|
persist-credentials: false
|
|
35
35
|
- name: 🏗 Set up uv
|
|
36
|
-
uses: astral-sh/setup-uv@
|
|
36
|
+
uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2
|
|
37
37
|
with:
|
|
38
38
|
enable-cache: true
|
|
39
39
|
- name: 🏗 Set up Python ${{ matrix.python }}
|
|
@@ -61,14 +61,14 @@ jobs:
|
|
|
61
61
|
pull-requests: read
|
|
62
62
|
steps:
|
|
63
63
|
- name: ⤵️ Check out code from GitHub
|
|
64
|
-
uses: actions/checkout@
|
|
64
|
+
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
|
|
65
65
|
with:
|
|
66
66
|
fetch-depth: 0
|
|
67
67
|
persist-credentials: false
|
|
68
68
|
- name: ⬇️ Download coverage data
|
|
69
69
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
70
70
|
- name: 🏗 Set up uv
|
|
71
|
-
uses: astral-sh/setup-uv@
|
|
71
|
+
uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2
|
|
72
72
|
with:
|
|
73
73
|
enable-cache: true
|
|
74
74
|
- name: 🏗 Set up Python ${{ env.DEFAULT_PYTHON }}
|
|
@@ -22,12 +22,12 @@ jobs:
|
|
|
22
22
|
steps:
|
|
23
23
|
- name: ⤵️ Check out code from GitHub
|
|
24
24
|
# yamllint disable-line rule:line-length
|
|
25
|
-
uses: actions/checkout@
|
|
25
|
+
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
|
|
26
26
|
with:
|
|
27
27
|
persist-credentials: false
|
|
28
28
|
- name: 🏗 Set up uv
|
|
29
29
|
# yamllint disable-line rule:line-length
|
|
30
|
-
uses: astral-sh/setup-uv@
|
|
30
|
+
uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2
|
|
31
31
|
with:
|
|
32
32
|
enable-cache: true
|
|
33
33
|
- name: 🏗 Set up Python ${{ env.DEFAULT_PYTHON }}
|
python_bsblan-6.1.8/openspec/changes/archive/2026-07-16-fix-partial-validation-state/design.md
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
## Context
|
|
2
|
+
|
|
3
|
+
`SectionValidator` lazily validates device parameter support before a section or
|
|
4
|
+
hot-water group is read. It currently stores completion as a section-wide set in
|
|
5
|
+
`APIValidator` and a group-wide set in `SectionValidator`. An `include` request
|
|
6
|
+
validates only a subset but records that coarse completion state, so a later
|
|
7
|
+
request for different names or all names can skip validation.
|
|
8
|
+
|
|
9
|
+
The resulting configuration has not established whether every requested
|
|
10
|
+
parameter is supported. For normal sections, an unvalidated parameter can remain
|
|
11
|
+
in the configuration and later produce a strict response-mapping failure. For
|
|
12
|
+
hot water, the cache contains only the first subset and later reads silently use
|
|
13
|
+
that incomplete cache.
|
|
14
|
+
|
|
15
|
+
## Goals / Non-Goals
|
|
16
|
+
|
|
17
|
+
**Goals:**
|
|
18
|
+
|
|
19
|
+
- Record lazy-validation coverage by parameter ID for sections and hot-water
|
|
20
|
+
groups.
|
|
21
|
+
- Revalidate only the parameter IDs required by a later request when they have
|
|
22
|
+
not already been covered.
|
|
23
|
+
- Retain the existing public method signatures, include-filter validation, and
|
|
24
|
+
per-section/group locking model.
|
|
25
|
+
- Add regression tests for sequential filtered and unfiltered access.
|
|
26
|
+
|
|
27
|
+
**Non-Goals:**
|
|
28
|
+
|
|
29
|
+
- Change the public `include` API or make it accept parameter IDs.
|
|
30
|
+
- Alter device-response parsing, model serialization, or unsupported-parameter
|
|
31
|
+
rules.
|
|
32
|
+
- Retry or cache failed validation requests.
|
|
33
|
+
|
|
34
|
+
## Decisions
|
|
35
|
+
|
|
36
|
+
### Track covered parameter IDs per validation owner
|
|
37
|
+
|
|
38
|
+
`APIValidator` will maintain a mapping from section name to the set of parameter
|
|
39
|
+
IDs whose support was checked. `SectionValidator` will maintain the equivalent
|
|
40
|
+
mapping for hot-water group names. Completion for a request is determined by
|
|
41
|
+
whether its requested IDs are a subset of that owner’s covered IDs.
|
|
42
|
+
|
|
43
|
+
Parameter IDs are chosen over parameter names because they are the identifiers
|
|
44
|
+
sent to BSB-LAN and remain unambiguous if a configuration ever aliases a name.
|
|
45
|
+
When a response establishes an ID is unsupported, it is removed from the active
|
|
46
|
+
configuration/cache but remains covered, preventing needless repeated probes.
|
|
47
|
+
|
|
48
|
+
Alternative considered: avoid persisting any completion after an `include`
|
|
49
|
+
request. This avoids the defect but discards useful knowledge and repeatedly
|
|
50
|
+
validates already checked parameters. Parameter-level coverage keeps lazy
|
|
51
|
+
loading efficient while remaining correct.
|
|
52
|
+
|
|
53
|
+
### Derive requested IDs before the one-time gate
|
|
54
|
+
|
|
55
|
+
Each ensure method will first resolve the configured IDs for its section or
|
|
56
|
+
group, applying `include` when present. Its lock’s fast and post-lock checks will
|
|
57
|
+
compare that specific requested-ID set to coverage rather than use a coarse
|
|
58
|
+
section/group marker. A full request resolves all currently configured IDs and
|
|
59
|
+
therefore completes only after each is covered.
|
|
60
|
+
|
|
61
|
+
An include filter that matches no IDs will not add coverage or mark a group or
|
|
62
|
+
section complete. Existing downstream include validation remains responsible for
|
|
63
|
+
returning the appropriate invalid-include error.
|
|
64
|
+
|
|
65
|
+
Alternative considered: retain a boolean for full validation plus a separate
|
|
66
|
+
partial set. This duplicates state and makes configuration changes harder to
|
|
67
|
+
reason about; one coverage mapping expresses both cases.
|
|
68
|
+
|
|
69
|
+
### Preserve locks and recheck coverage after waiting
|
|
70
|
+
|
|
71
|
+
The existing per-section and per-group locks remain in place. The completion
|
|
72
|
+
predicate will calculate coverage for the current requested IDs both before and
|
|
73
|
+
after lock acquisition. Concurrent calls requesting different subsets therefore
|
|
74
|
+
serialize safely, and the second call still validates its uncovered IDs.
|
|
75
|
+
|
|
76
|
+
## Risks / Trade-offs
|
|
77
|
+
|
|
78
|
+
- [Configuration mutation during validation] → Derive the requested IDs from
|
|
79
|
+
the current configuration at each completion check; removed unsupported IDs
|
|
80
|
+
no longer need validation.
|
|
81
|
+
- [Stale internal tests inspect completion sets] → Update tests to assert
|
|
82
|
+
parameter coverage and externally observable request/cache behavior instead
|
|
83
|
+
of obsolete whole-group completion.
|
|
84
|
+
- [Additional first-read requests] → A later request for previously unrequested
|
|
85
|
+
parameters necessarily makes one validation request; already covered IDs are
|
|
86
|
+
not re-requested.
|
python_bsblan-6.1.8/openspec/changes/archive/2026-07-16-fix-partial-validation-state/proposal.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
## Why
|
|
2
|
+
|
|
3
|
+
Lazy validation currently records a section or hot-water group as fully
|
|
4
|
+
validated after a request filtered with `include`. This can leave unsupported
|
|
5
|
+
parameters in a section or leave the hot-water cache incomplete, causing later
|
|
6
|
+
unfiltered reads to skip necessary validation and return incomplete data or fail
|
|
7
|
+
while mapping a device response.
|
|
8
|
+
|
|
9
|
+
## What Changes
|
|
10
|
+
|
|
11
|
+
- Track validation coverage at the parameter level for sections and hot-water
|
|
12
|
+
groups instead of treating any successful filtered request as complete.
|
|
13
|
+
- Ensure a later request validates parameter names that an earlier `include`
|
|
14
|
+
request did not cover.
|
|
15
|
+
- Keep validation completion correct when an include filter has no matching
|
|
16
|
+
parameters.
|
|
17
|
+
- Add focused regression coverage for filtered-then-unfiltered and
|
|
18
|
+
differently-filtered reads.
|
|
19
|
+
|
|
20
|
+
## Capabilities
|
|
21
|
+
|
|
22
|
+
### New Capabilities
|
|
23
|
+
|
|
24
|
+
- `lazy-validation-completeness`: Lazy section and hot-water validation covers
|
|
25
|
+
every parameter required by each request before that request uses the cached
|
|
26
|
+
configuration.
|
|
27
|
+
|
|
28
|
+
### Modified Capabilities
|
|
29
|
+
|
|
30
|
+
- None.
|
|
31
|
+
|
|
32
|
+
## Impact
|
|
33
|
+
|
|
34
|
+
- Affected code: `src/bsblan/_validation.py`, `src/bsblan/utility.py`, and the
|
|
35
|
+
lazy section and hot-water read paths that use their validation state.
|
|
36
|
+
- Affected tests: validation, include-filter, and hot-water regression tests.
|
|
37
|
+
- Public API: no signature changes; `include` calls may perform an additional
|
|
38
|
+
validation request when they need parameters not checked by a prior call.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
## ADDED Requirements
|
|
2
|
+
|
|
3
|
+
### Requirement: Section validation covers every requested parameter
|
|
4
|
+
|
|
5
|
+
Before a lazy section read uses its configured parameters, the client SHALL
|
|
6
|
+
validate support for every parameter ID required by that read. A prior validation
|
|
7
|
+
of a different included subset SHALL NOT make unvalidated parameter IDs appear
|
|
8
|
+
validated. The client SHALL not repeat validation for IDs already covered unless
|
|
9
|
+
validation state is explicitly reset.
|
|
10
|
+
|
|
11
|
+
#### Scenario: Filtered section read followed by unfiltered read
|
|
12
|
+
|
|
13
|
+
- **WHEN** a section is first read with `include` selecting one parameter and a
|
|
14
|
+
later read requests the complete section
|
|
15
|
+
- **THEN** the later read validates every configured parameter ID not checked by
|
|
16
|
+
the first read before fetching the complete section
|
|
17
|
+
|
|
18
|
+
#### Scenario: Differently filtered section read
|
|
19
|
+
|
|
20
|
+
- **WHEN** a section is read with one included parameter and later read with a
|
|
21
|
+
different included parameter
|
|
22
|
+
- **THEN** the second read validates the newly requested parameter ID
|
|
23
|
+
- **AND** it does not revalidate the parameter ID already covered by the first
|
|
24
|
+
read
|
|
25
|
+
|
|
26
|
+
#### Scenario: Unsupported parameter discovered by a later read
|
|
27
|
+
|
|
28
|
+
- **WHEN** a later section read validates a previously uncovered parameter ID
|
|
29
|
+
that the device does not support
|
|
30
|
+
- **THEN** the client removes that parameter from the active configuration
|
|
31
|
+
- **AND** subsequent reads do not request that unsupported parameter
|
|
32
|
+
|
|
33
|
+
### Requirement: Hot-water group validation covers every requested parameter
|
|
34
|
+
|
|
35
|
+
Before a hot-water group read uses its cached parameters, the client SHALL
|
|
36
|
+
validate and cache every parameter ID required by that read. A prior validation
|
|
37
|
+
of an included subset SHALL NOT make the group complete for other parameter IDs.
|
|
38
|
+
|
|
39
|
+
#### Scenario: Filtered hot-water read followed by complete group read
|
|
40
|
+
|
|
41
|
+
- **WHEN** a hot-water group is first read with `include` selecting a subset and
|
|
42
|
+
later read without `include`
|
|
43
|
+
- **THEN** the later read validates and caches every remaining supported
|
|
44
|
+
parameter ID in that group before it fetches group data
|
|
45
|
+
|
|
46
|
+
#### Scenario: Differently filtered hot-water read
|
|
47
|
+
|
|
48
|
+
- **WHEN** a hot-water group is read with one included parameter and later read
|
|
49
|
+
with a different included parameter
|
|
50
|
+
- **THEN** the second read validates and caches the newly requested parameter ID
|
|
51
|
+
- **AND** it does not revalidate the parameter ID already covered by the first
|
|
52
|
+
read
|
|
53
|
+
|
|
54
|
+
### Requirement: Empty include results do not complete validation
|
|
55
|
+
|
|
56
|
+
When an include filter selects no parameter IDs in a section or hot-water group,
|
|
57
|
+
the client SHALL NOT record that owner as complete or add parameter coverage.
|
|
58
|
+
|
|
59
|
+
#### Scenario: Later valid read after no-match include
|
|
60
|
+
|
|
61
|
+
- **WHEN** an include filter matches no parameters and a later request selects
|
|
62
|
+
one or more valid parameters from the same section or hot-water group
|
|
63
|
+
- **THEN** the later request validates its selected parameter IDs normally
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
## 1. Parameter-Level Validation Coverage
|
|
2
|
+
|
|
3
|
+
- [x] 1.1 Replace coarse section completion tracking in `APIValidator` with
|
|
4
|
+
per-section parameter-ID coverage, including reset behavior.
|
|
5
|
+
- [x] 1.2 Update lazy section validation to derive the current requested IDs,
|
|
6
|
+
gate on their coverage, and retain unsupported-ID removal behavior.
|
|
7
|
+
- [x] 1.3 Replace coarse hot-water group completion tracking with per-group
|
|
8
|
+
parameter-ID coverage and keep the cache synchronized with validated IDs.
|
|
9
|
+
- [x] 1.4 Ensure empty include-filter results add no coverage and do not mark a
|
|
10
|
+
section or hot-water group complete.
|
|
11
|
+
|
|
12
|
+
## 2. Regression Coverage
|
|
13
|
+
|
|
14
|
+
- [x] 2.1 Add section tests for filtered-then-unfiltered and
|
|
15
|
+
differently-filtered reads, asserting uncovered IDs are validated once.
|
|
16
|
+
- [x] 2.2 Add a section test showing a later-discovered unsupported ID is
|
|
17
|
+
removed before the complete read is mapped.
|
|
18
|
+
- [x] 2.3 Update hot-water include tests to assert a partial request does not
|
|
19
|
+
complete the group, then add filtered-then-unfiltered and
|
|
20
|
+
differently-filtered regression cases.
|
|
21
|
+
- [x] 2.4 Update the empty include-filter test to assert no completion state is
|
|
22
|
+
recorded and a later valid request performs validation.
|
|
23
|
+
- [x] 2.5 Retain or extend locking coverage to prove sequentially serialized
|
|
24
|
+
requests recheck their own parameter coverage.
|
|
25
|
+
|
|
26
|
+
## 3. Validation
|
|
27
|
+
|
|
28
|
+
- [x] 3.1 Run focused validation and include-filter tests with `--no-cov`.
|
|
29
|
+
- [x] 3.2 Run `uv run prek run --all-files` and resolve all reported failures.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# lazy-validation-completeness
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
Lazy section and hot-water validation must record the parameter IDs it has
|
|
6
|
+
actually checked so filtered reads cannot suppress validation required by later
|
|
7
|
+
requests.
|
|
8
|
+
|
|
9
|
+
## Requirements
|
|
10
|
+
|
|
11
|
+
### Requirement: Section validation covers every requested parameter
|
|
12
|
+
|
|
13
|
+
Before a lazy section read uses its configured parameters, the client SHALL
|
|
14
|
+
validate support for every parameter ID required by that read. A prior validation
|
|
15
|
+
of a different included subset SHALL NOT make unvalidated parameter IDs appear
|
|
16
|
+
validated. The client SHALL not repeat validation for IDs already covered unless
|
|
17
|
+
validation state is explicitly reset.
|
|
18
|
+
|
|
19
|
+
#### Scenario: Filtered section read followed by unfiltered read
|
|
20
|
+
|
|
21
|
+
- **WHEN** a section is first read with `include` selecting one parameter and a
|
|
22
|
+
later read requests the complete section
|
|
23
|
+
- **THEN** the later read validates every configured parameter ID not checked by
|
|
24
|
+
the first read before fetching the complete section
|
|
25
|
+
|
|
26
|
+
#### Scenario: Differently filtered section read
|
|
27
|
+
|
|
28
|
+
- **WHEN** a section is read with one included parameter and later read with a
|
|
29
|
+
different included parameter
|
|
30
|
+
- **THEN** the second read validates the newly requested parameter ID
|
|
31
|
+
- **AND** it does not revalidate the parameter ID already covered by the first
|
|
32
|
+
read
|
|
33
|
+
|
|
34
|
+
#### Scenario: Unsupported parameter discovered by a later read
|
|
35
|
+
|
|
36
|
+
- **WHEN** a later section read validates a previously uncovered parameter ID
|
|
37
|
+
that the device does not support
|
|
38
|
+
- **THEN** the client removes that parameter from the active configuration
|
|
39
|
+
- **AND** subsequent reads do not request that unsupported parameter
|
|
40
|
+
|
|
41
|
+
### Requirement: Hot-water group validation covers every requested parameter
|
|
42
|
+
|
|
43
|
+
Before a hot-water group read uses its cached parameters, the client SHALL
|
|
44
|
+
validate and cache every parameter ID required by that read. A prior validation
|
|
45
|
+
of an included subset SHALL NOT make the group complete for other parameter IDs.
|
|
46
|
+
|
|
47
|
+
#### Scenario: Filtered hot-water read followed by complete group read
|
|
48
|
+
|
|
49
|
+
- **WHEN** a hot-water group is first read with `include` selecting a subset and
|
|
50
|
+
later read without `include`
|
|
51
|
+
- **THEN** the later read validates and caches every remaining supported
|
|
52
|
+
parameter ID in that group before it fetches group data
|
|
53
|
+
|
|
54
|
+
#### Scenario: Differently filtered hot-water read
|
|
55
|
+
|
|
56
|
+
- **WHEN** a hot-water group is read with one included parameter and later read
|
|
57
|
+
with a different included parameter
|
|
58
|
+
- **THEN** the second read validates and caches the newly requested parameter ID
|
|
59
|
+
- **AND** it does not revalidate the parameter ID already covered by the first
|
|
60
|
+
read
|
|
61
|
+
|
|
62
|
+
### Requirement: Empty include results do not complete validation
|
|
63
|
+
|
|
64
|
+
When an include filter selects no parameter IDs in a section or hot-water group,
|
|
65
|
+
the client SHALL NOT record that owner as complete or add parameter coverage.
|
|
66
|
+
|
|
67
|
+
#### Scenario: Later valid read after no-match include
|
|
68
|
+
|
|
69
|
+
- **WHEN** an include filter matches no parameters and a later request selects
|
|
70
|
+
one or more valid parameters from the same section or hot-water group
|
|
71
|
+
- **THEN** the later request validates its selected parameter IDs normally
|
|
@@ -12,13 +12,13 @@
|
|
|
12
12
|
"url-parse": "1.5.10"
|
|
13
13
|
},
|
|
14
14
|
"devDependencies": {
|
|
15
|
-
"prettier": "3.9.
|
|
15
|
+
"prettier": "3.9.6"
|
|
16
16
|
}
|
|
17
17
|
},
|
|
18
18
|
"node_modules/prettier": {
|
|
19
|
-
"version": "3.9.
|
|
20
|
-
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.
|
|
21
|
-
"integrity": "sha512
|
|
19
|
+
"version": "3.9.6",
|
|
20
|
+
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz",
|
|
21
|
+
"integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==",
|
|
22
22
|
"dev": true,
|
|
23
23
|
"license": "MIT",
|
|
24
24
|
"bin": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "python-bsblan"
|
|
3
|
-
version = "6.1.
|
|
3
|
+
version = "6.1.8"
|
|
4
4
|
description = "Asynchronous Python client for BSBLAN API"
|
|
5
5
|
authors = [
|
|
6
6
|
{name = "Willem-Jan van Rootselaar", email = "liudgervr@gmail.com"}
|
|
@@ -196,7 +196,7 @@ dev = [
|
|
|
196
196
|
# hatch is required to support type hinting and proper packaging of the py.typed file.
|
|
197
197
|
"hatch>=1.14.1",
|
|
198
198
|
"isort==8.0.1",
|
|
199
|
-
"ty==0.0.
|
|
199
|
+
"ty==0.0.59",
|
|
200
200
|
"prek>=0.3.3",
|
|
201
201
|
"pre-commit-hooks==6.0.0",
|
|
202
202
|
"pylint==4.0.5",
|