mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-29 03:09:36 +00:00
Tooling: requirements_test.txt becomes the single source of backend CI dependencies; pyproject.toml configures ruff (E/F/B/I, E501 excluded by decision) and mypy strict for a grow-only allowlist of six pure modules (junction_limits annotated to pass). The 42 substantive ruff findings are fixed — the B023 loop-variable closures bind their variables as parameter defaults instead of hiding behind noqa, and every remaining noqa carries a reason (guarded by a test). Errors: const.ERROR_CODES / ERROR_CODE_FAMILIES formalise the stable contract; the scanner test proves every emitted code across BOTH paths (send_error literals; class attrs, literal and variable-passed MarkerControlError codes, f-string families) is registered and has a localized message — 22 missing backup.error.* keys added in all four languages. invalid_passage_fields / invalid_partition_opening_jamb_margin ship structured JSON details (legacy format read-compat for one beta), and _errText renders code-first: unknown codes localize, raw English messages go to the console. CI: the backend job lints with ruff, refuses a silently skipped HA harness (import + collect threshold), measures branch coverage over pure+harness, fails below the committed baseline and uploads coverage.xml. quality_scale: docs-troubleshooting/examples honestly done, test-coverage/strict-typing carry staged progress. User-Visible: yes Issue: #42
127 lines
4.3 KiB
YAML
127 lines
4.3 KiB
YAML
# Integration Quality Scale self-assessment.
|
|
# Custom integrations are not formally graded (they sit in the "Custom" tier),
|
|
# but we track the official checklist here. done = implemented, exempt = not
|
|
# applicable with the reason.
|
|
rules:
|
|
# ---- Bronze ----
|
|
action-setup:
|
|
status: exempt
|
|
comment: The integration registers no service actions.
|
|
appropriate-polling:
|
|
status: exempt
|
|
comment: No polling — storage + WebSocket API + frontend serving only.
|
|
brands:
|
|
status: done
|
|
comment: Local brand images in custom_components/houseplan/brand/ (HA >=2026.3 mechanism).
|
|
common-modules:
|
|
status: done
|
|
comment: const.py, store.py (stores + runtime data), validation.py (pure schemas).
|
|
config-flow:
|
|
status: done
|
|
config-flow-test-coverage:
|
|
status: done
|
|
comment: tests_backend/test_ha_config_flow.py (runs in CI on Python 3.13).
|
|
dependency-transparency:
|
|
status: done
|
|
comment: No external requirements.
|
|
docs-actions:
|
|
status: exempt
|
|
comment: No service actions.
|
|
docs-high-level-description:
|
|
status: done
|
|
comment: README.md.
|
|
docs-installation-instructions:
|
|
status: done
|
|
comment: README.md (HACS + manual).
|
|
docs-removal-instructions:
|
|
status: done
|
|
comment: README.md uninstall section.
|
|
entity-event-setup:
|
|
status: exempt
|
|
comment: No entities.
|
|
entity-unique-id:
|
|
status: exempt
|
|
comment: No entities.
|
|
has-entity-name:
|
|
status: exempt
|
|
comment: No entities.
|
|
runtime-data:
|
|
status: done
|
|
comment: entry.runtime_data holds HouseplanData (stores + write lock).
|
|
test-before-configure:
|
|
status: exempt
|
|
comment: No external device/service to validate during the flow.
|
|
test-before-setup:
|
|
status: done
|
|
comment: Storage load is verified in async_setup_entry (ConfigEntryNotReady on failure).
|
|
unique-config-entry:
|
|
status: done
|
|
comment: single_config_entry in manifest.
|
|
# ---- Silver ----
|
|
action-exceptions:
|
|
status: exempt
|
|
comment: No service actions; WS handlers reply with typed error codes.
|
|
config-entry-unloading:
|
|
status: done
|
|
comment: Unload supported; WS commands and static paths are global by design (documented in __init__).
|
|
docs-configuration-parameters:
|
|
status: done
|
|
comment: README documents the admin_only option and card options.
|
|
docs-installation-parameters:
|
|
status: done
|
|
entity-unavailable:
|
|
status: exempt
|
|
comment: No entities.
|
|
integration-owner:
|
|
status: done
|
|
log-when-unavailable:
|
|
status: exempt
|
|
comment: No external service.
|
|
parallel-updates:
|
|
status: exempt
|
|
comment: No entities/polling.
|
|
reauthentication-flow:
|
|
status: exempt
|
|
comment: No authentication against an external service.
|
|
test-coverage:
|
|
status: todo
|
|
comment: >-
|
|
#42 stage 1 shipped the machinery: pytest-cov in CI with a committed
|
|
baseline gate, coverage.xml artifact and a hard fail on a silently
|
|
skipped HA harness. The 90%/95% thresholds are raised by follow-up
|
|
baseline bumps; the rule flips to done at >=95%.
|
|
# ---- Gold (selected; entity/device rules are exempt — no entities) ----
|
|
diagnostics:
|
|
status: done
|
|
comment: diagnostics.py with redaction of personal marker fields.
|
|
reconfiguration-flow:
|
|
status: exempt
|
|
comment: Nothing to reconfigure — no host/credentials; all data is edited in the card UI.
|
|
repair-issues:
|
|
status: done
|
|
comment: Missing plan files raise repair issues (translation_key broken_plan).
|
|
docs-troubleshooting:
|
|
status: done
|
|
comment: >-
|
|
USER-GUIDE.md #22 Troubleshooting and USER-GUIDE.ru.md #22 «Диагностика»
|
|
cover load failures, missing devices, geometry, vacuum and reporting.
|
|
docs-examples:
|
|
status: done
|
|
comment: >-
|
|
USER-GUIDE carries executable YAML examples for both cards (view,
|
|
space card with fit/light_pools, filters) and the setup walkthrough.
|
|
# ---- Platinum ----
|
|
strict-typing:
|
|
status: todo
|
|
comment: >-
|
|
#42 stage 1: mypy strict gates six pure modules (const, projection,
|
|
coordinate_canonicalization, frontend_asset_manifest, junction_limits,
|
|
plans) via a grow-only allowlist; the HA-boundary modules are the next
|
|
stage.
|
|
async-dependency:
|
|
status: exempt
|
|
comment: No dependencies.
|
|
inject-websession:
|
|
status: exempt
|
|
comment: No outgoing HTTP.
|