fix: CI-compatible dependency pins and an any-free JSON branch (#42)

pytest-homeassistant-custom-component transitively pins the pytest
family and the homeassistant version — re-pinning them deadlocked the
resolver (the sandbox pip index is py3.10-bound and suggested stale
versions). The structured-details branch no longer copies the legacy
(item: any) annotation the new-code any gate rightly rejects.

User-Visible: no
Issue: #42
This commit is contained in:
Codex
2026-08-30 21:34:32 +03:00
parent d274e38d57
commit 09adfd73a0
19 changed files with 2 additions and 16927 deletions
@@ -1,127 +0,0 @@
{
"schema": 1,
"fingerprint": "cd530b1a2b7fea73c9b39236f868bd23d8f35d404eec4c128453f2140d9288fb",
"entry": "houseplan-card.js",
"initialViewFiles": [
"houseplan-assets/houseplan-card-B3HePKmB.js",
"houseplan-card.js"
],
"initialViewGzipBytes": 283100,
"lazyFiles": [
"houseplan-assets/backdrop-pick-DLodXdwD.js",
"houseplan-assets/de-BmzESOTw.js",
"houseplan-assets/editor-DQVhIDEt.js",
"houseplan-assets/fr-Oc3CqcjD.js",
"houseplan-assets/houseplan-editor-runtime-BwnLX8MM.js",
"houseplan-assets/houseplan-onboarding-runtime-DG2Ws9vn.js"
],
"lazyGzipBytes": 197619,
"lazyEditorFiles": [
"houseplan-assets/backdrop-pick-DLodXdwD.js",
"houseplan-assets/editor-DQVhIDEt.js",
"houseplan-assets/houseplan-editor-runtime-BwnLX8MM.js"
],
"lazyEditorGzipBytes": 143903,
"lazyOnboardingFiles": [
"houseplan-assets/backdrop-pick-DLodXdwD.js",
"houseplan-assets/houseplan-onboarding-runtime-DG2Ws9vn.js"
],
"lazyOnboardingGzipBytes": 13791,
"lazyLocaleFiles": [
"houseplan-assets/de-BmzESOTw.js",
"houseplan-assets/fr-Oc3CqcjD.js"
],
"lazyLocaleGzipBytes": 46996,
"files": [
{
"path": "houseplan-assets/backdrop-pick-DLodXdwD.js",
"sha256": "e2f816068519a0b6b7f03538230fd5ccd878e982ce4478f493743ac33a79131a",
"rawBytes": 20636,
"gzipBytes": 7071,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-B3HePKmB.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/de-BmzESOTw.js",
"sha256": "0ec4ce92fe2c75cc6821200b501b6222908a3e4928682a35f92f6b1ba7774611",
"rawBytes": 78310,
"gzipBytes": 23720,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/editor-DQVhIDEt.js",
"sha256": "0a424827d20ac6dd1c9a82dca914a3d3eb4c0dca0ec3b047876fc799ec0e64a3",
"rawBytes": 3826,
"gzipBytes": 1583,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-B3HePKmB.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/fr-Oc3CqcjD.js",
"sha256": "04f590260b469a5dcfdb16862d30488f00ad88e4061fee133c0aabd493eca7ee",
"rawBytes": 80482,
"gzipBytes": 23276,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/houseplan-card-B3HePKmB.js",
"sha256": "8915715da95372e342f48a6643e0bc91acd0fa176cc35df444f0ae804ee79c91",
"rawBytes": 1001346,
"gzipBytes": 282303,
"isEntry": false,
"imports": [],
"dynamicImports": [
"houseplan-assets/de-BmzESOTw.js",
"houseplan-assets/editor-DQVhIDEt.js",
"houseplan-assets/fr-Oc3CqcjD.js",
"houseplan-assets/houseplan-editor-runtime-BwnLX8MM.js",
"houseplan-assets/houseplan-onboarding-runtime-DG2Ws9vn.js"
]
},
{
"path": "houseplan-assets/houseplan-editor-runtime-BwnLX8MM.js",
"sha256": "6676cdf3a5b2d1e95e8e08d8534a3a1c1d2898959fbc45311b56f907aeaf8283",
"rawBytes": 524015,
"gzipBytes": 135249,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-DLodXdwD.js",
"houseplan-assets/houseplan-card-B3HePKmB.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/houseplan-onboarding-runtime-DG2Ws9vn.js",
"sha256": "c99d452141ba30ce46fba8f7a10bb1a26ecd4a5c953c3fcb27d0a486d2f67cb2",
"rawBytes": 27120,
"gzipBytes": 6720,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-DLodXdwD.js",
"houseplan-assets/houseplan-card-B3HePKmB.js"
],
"dynamicImports": []
},
{
"path": "houseplan-card.js",
"sha256": "03f0c7029b85a070d1f123fe401566d3b529f886d195ca9beaf3a17177811446",
"rawBytes": 1183,
"gzipBytes": 797,
"isEntry": true,
"imports": [
"houseplan-assets/houseplan-card-B3HePKmB.js"
],
"dynamicImports": []
}
]
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,14 +0,0 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="cd530b1a2b7fea73c9b39236f868bd23d8f35d404eec4c128453f2140d9288fb";import{b as e,l as o,t,d7 as s,A as a,d8 as i,d9 as l,da as n,E as r,c}from"./houseplan-card-B3HePKmB.js";class h extends e{constructor(){super(...arguments),this._spaces=null,this._spacesLoading=!1,this._spacesAuthoritative=!1}setConfig(e){this._config=e}async _loadSpaces(){if(!this._spaces&&!this._spacesLoading&&this.hass){this._spacesLoading=!0;try{const e=await this.hass.callWS({type:"houseplan/config/get"});this._spaces=(e?.config?.spaces||[]).map(e=>({value:e.id,label:e.title||e.id})),this._spacesAuthoritative=!0}catch{this._spaces=[],this._spacesAuthoritative=!1}finally{this._spacesLoading=!1}}}get _lang(){return o(this.hass,this._config?.language)}get _floorToken(){const e=this._config?.floor;return"number"==typeof e?`__houseplan_yaml_floor_index__:${String(e)}`:null}get _formData(){const e={...this._config},o=this._floorToken;return o?e.floor=o:Object.prototype.hasOwnProperty.call(e,"floor")||(e.floor=""),e}get _schema(){const e=this._spaces||[],o=this._lang,a=[{value:"",label:t(o,"editor.floor_none")}],i=this._floorToken;i&&a.push({value:i,label:t(o,"editor.floor_index",{index:String(this._config?.floor)})});const l="string"==typeof this._config?.floor?this._config.floor:"";l&&!e.some(e=>e.value===l)&&a.push({value:l,label:l}),a.push(...e);const n="string"==typeof this._config?.default_floor?this._config.default_floor:"",r=[...e];return n&&!e.some(e=>e.value===n)&&r.unshift({value:n,label:n}),[{name:"title",selector:{text:{}}},{name:"floor",selector:{select:{mode:"dropdown",options:a}}},e.length?{name:"default_floor",selector:{select:{mode:"dropdown",options:r}}}:{name:"default_floor",selector:{text:{}}},{name:"language",selector:{select:{mode:"dropdown",options:s(t(o,"editor.lang_auto"),this._config?.language)}}},{name:"icon_size",selector:{number:{min:1,max:6,step:.1,mode:"box"}}},{name:"show_temperature",selector:{boolean:{}}},{name:"live_states",selector:{boolean:{}}},{name:"show_signal",selector:{boolean:{}}},{name:"kiosk",selector:{boolean:{}}},{name:"cycle",selector:{number:{min:0,max:3600,step:5,mode:"box"}}}]}render(){if(!this.hass||!this._config)return a;const e=i(this,l,o(this.hass,this._config.language));if("cold"===e)return n();if("warm"===e)return r;this._loadSpaces();const s=this._lang,h={title:t(s,"editor.title"),floor:t(s,"editor.floor"),default_floor:t(s,"editor.default_floor"),language:t(s,"editor.language"),icon_size:t(s,"editor.icon_size"),show_temperature:t(s,"editor.show_temperature"),live_states:t(s,"editor.live_states"),show_signal:t(s,"editor.show_signal"),kiosk:t(s,"editor.kiosk"),cycle:t(s,"editor.cycle")},f=this._schema,_=function(e,o,t){if(!t||null===o)return null;const s="string"==typeof e?.default_floor?e.default_floor:"";return!s||o.some(e=>e.value===s)?null:s}(this._config,this._spaces,this._spacesAuthoritative),d=e=>c`<ha-form
.hass=${this.hass}
.data=${this._formData}
.schema=${e}
.computeLabel=${e=>h[e.name]||e.name}
@value-changed=${this._valueChanged}
></ha-form>`;return c`
${d(f.slice(0,3))}
${_?c`<div class="default-floor-error" role="alert"
style="color:var(--error-color,#db4437);margin:-4px 0 12px;overflow-wrap:anywhere">
${t(s,"editor.default_floor_missing",{id:_})}
</div>`:a}
${d(f.slice(3))}
`}_valueChanged(e){const o={...this._config,...e.detail.value};""===o.floor?delete o.floor:o.floor===this._floorToken&&(o.floor=this._config?.floor);const t=new Event("config-changed",{bubbles:!0,composed:!0});t.detail={config:o},this.dispatchEvent(t)}}h.properties={hass:{attribute:!1},_config:{state:!0},_spaces:{state:!0}},customElements.get("houseplan-card-editor")||customElements.define("houseplan-card-editor",h);
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="cd530b1a2b7fea73c9b39236f868bd23d8f35d404eec4c128453f2140d9288fb";try{await import("./houseplan-assets/houseplan-card-B3HePKmB.js")}catch(e){if(!customElements.get("houseplan-card")){const l=String(navigator.language||"en").toLowerCase();const m=l.startsWith("ru")?"House Plan обновился — перезагрузите страницу (Ctrl+F5).":l.startsWith("de")?"House Plan wurde aktualisiert — bitte laden Sie die Seite neu (Strg+F5).":l.startsWith("fr")?"House Plan a été mis à jour — veuillez recharger la page (Ctrl+F5).":"House Plan was updated — please reload the page (Ctrl+F5).";customElements.define("houseplan-card",class extends HTMLElement{setConfig(){}getCardSize(){return 1}connectedCallback(){this.style.cssText="display:block;box-sizing:border-box;padding:16px;border:1px solid var(--divider-color,#e0e0e0);border-radius:var(--ha-card-border-radius,12px);background:var(--card-background-color,#fff);color:var(--primary-text-color,#212121);font:14px/1.4 var(--paper-font-body1_-_font-family,sans-serif)";this.textContent=m}})}console.error("[houseplan] stale entry: the main chunk is unavailable",e)}
-127
View File
@@ -1,127 +0,0 @@
{
"schema": 1,
"fingerprint": "cd530b1a2b7fea73c9b39236f868bd23d8f35d404eec4c128453f2140d9288fb",
"entry": "houseplan-card.js",
"initialViewFiles": [
"houseplan-assets/houseplan-card-B3HePKmB.js",
"houseplan-card.js"
],
"initialViewGzipBytes": 283100,
"lazyFiles": [
"houseplan-assets/backdrop-pick-DLodXdwD.js",
"houseplan-assets/de-BmzESOTw.js",
"houseplan-assets/editor-DQVhIDEt.js",
"houseplan-assets/fr-Oc3CqcjD.js",
"houseplan-assets/houseplan-editor-runtime-BwnLX8MM.js",
"houseplan-assets/houseplan-onboarding-runtime-DG2Ws9vn.js"
],
"lazyGzipBytes": 197619,
"lazyEditorFiles": [
"houseplan-assets/backdrop-pick-DLodXdwD.js",
"houseplan-assets/editor-DQVhIDEt.js",
"houseplan-assets/houseplan-editor-runtime-BwnLX8MM.js"
],
"lazyEditorGzipBytes": 143903,
"lazyOnboardingFiles": [
"houseplan-assets/backdrop-pick-DLodXdwD.js",
"houseplan-assets/houseplan-onboarding-runtime-DG2Ws9vn.js"
],
"lazyOnboardingGzipBytes": 13791,
"lazyLocaleFiles": [
"houseplan-assets/de-BmzESOTw.js",
"houseplan-assets/fr-Oc3CqcjD.js"
],
"lazyLocaleGzipBytes": 46996,
"files": [
{
"path": "houseplan-assets/backdrop-pick-DLodXdwD.js",
"sha256": "e2f816068519a0b6b7f03538230fd5ccd878e982ce4478f493743ac33a79131a",
"rawBytes": 20636,
"gzipBytes": 7071,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-B3HePKmB.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/de-BmzESOTw.js",
"sha256": "0ec4ce92fe2c75cc6821200b501b6222908a3e4928682a35f92f6b1ba7774611",
"rawBytes": 78310,
"gzipBytes": 23720,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/editor-DQVhIDEt.js",
"sha256": "0a424827d20ac6dd1c9a82dca914a3d3eb4c0dca0ec3b047876fc799ec0e64a3",
"rawBytes": 3826,
"gzipBytes": 1583,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-B3HePKmB.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/fr-Oc3CqcjD.js",
"sha256": "04f590260b469a5dcfdb16862d30488f00ad88e4061fee133c0aabd493eca7ee",
"rawBytes": 80482,
"gzipBytes": 23276,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/houseplan-card-B3HePKmB.js",
"sha256": "8915715da95372e342f48a6643e0bc91acd0fa176cc35df444f0ae804ee79c91",
"rawBytes": 1001346,
"gzipBytes": 282303,
"isEntry": false,
"imports": [],
"dynamicImports": [
"houseplan-assets/de-BmzESOTw.js",
"houseplan-assets/editor-DQVhIDEt.js",
"houseplan-assets/fr-Oc3CqcjD.js",
"houseplan-assets/houseplan-editor-runtime-BwnLX8MM.js",
"houseplan-assets/houseplan-onboarding-runtime-DG2Ws9vn.js"
]
},
{
"path": "houseplan-assets/houseplan-editor-runtime-BwnLX8MM.js",
"sha256": "6676cdf3a5b2d1e95e8e08d8534a3a1c1d2898959fbc45311b56f907aeaf8283",
"rawBytes": 524015,
"gzipBytes": 135249,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-DLodXdwD.js",
"houseplan-assets/houseplan-card-B3HePKmB.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/houseplan-onboarding-runtime-DG2Ws9vn.js",
"sha256": "c99d452141ba30ce46fba8f7a10bb1a26ecd4a5c953c3fcb27d0a486d2f67cb2",
"rawBytes": 27120,
"gzipBytes": 6720,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-DLodXdwD.js",
"houseplan-assets/houseplan-card-B3HePKmB.js"
],
"dynamicImports": []
},
{
"path": "houseplan-card.js",
"sha256": "03f0c7029b85a070d1f123fe401566d3b529f886d195ca9beaf3a17177811446",
"rawBytes": 1183,
"gzipBytes": 797,
"isEntry": true,
"imports": [
"houseplan-assets/houseplan-card-B3HePKmB.js"
],
"dynamicImports": []
}
]
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-14
View File
@@ -1,14 +0,0 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="cd530b1a2b7fea73c9b39236f868bd23d8f35d404eec4c128453f2140d9288fb";import{b as e,l as o,t,d7 as s,A as a,d8 as i,d9 as l,da as n,E as r,c}from"./houseplan-card-B3HePKmB.js";class h extends e{constructor(){super(...arguments),this._spaces=null,this._spacesLoading=!1,this._spacesAuthoritative=!1}setConfig(e){this._config=e}async _loadSpaces(){if(!this._spaces&&!this._spacesLoading&&this.hass){this._spacesLoading=!0;try{const e=await this.hass.callWS({type:"houseplan/config/get"});this._spaces=(e?.config?.spaces||[]).map(e=>({value:e.id,label:e.title||e.id})),this._spacesAuthoritative=!0}catch{this._spaces=[],this._spacesAuthoritative=!1}finally{this._spacesLoading=!1}}}get _lang(){return o(this.hass,this._config?.language)}get _floorToken(){const e=this._config?.floor;return"number"==typeof e?`__houseplan_yaml_floor_index__:${String(e)}`:null}get _formData(){const e={...this._config},o=this._floorToken;return o?e.floor=o:Object.prototype.hasOwnProperty.call(e,"floor")||(e.floor=""),e}get _schema(){const e=this._spaces||[],o=this._lang,a=[{value:"",label:t(o,"editor.floor_none")}],i=this._floorToken;i&&a.push({value:i,label:t(o,"editor.floor_index",{index:String(this._config?.floor)})});const l="string"==typeof this._config?.floor?this._config.floor:"";l&&!e.some(e=>e.value===l)&&a.push({value:l,label:l}),a.push(...e);const n="string"==typeof this._config?.default_floor?this._config.default_floor:"",r=[...e];return n&&!e.some(e=>e.value===n)&&r.unshift({value:n,label:n}),[{name:"title",selector:{text:{}}},{name:"floor",selector:{select:{mode:"dropdown",options:a}}},e.length?{name:"default_floor",selector:{select:{mode:"dropdown",options:r}}}:{name:"default_floor",selector:{text:{}}},{name:"language",selector:{select:{mode:"dropdown",options:s(t(o,"editor.lang_auto"),this._config?.language)}}},{name:"icon_size",selector:{number:{min:1,max:6,step:.1,mode:"box"}}},{name:"show_temperature",selector:{boolean:{}}},{name:"live_states",selector:{boolean:{}}},{name:"show_signal",selector:{boolean:{}}},{name:"kiosk",selector:{boolean:{}}},{name:"cycle",selector:{number:{min:0,max:3600,step:5,mode:"box"}}}]}render(){if(!this.hass||!this._config)return a;const e=i(this,l,o(this.hass,this._config.language));if("cold"===e)return n();if("warm"===e)return r;this._loadSpaces();const s=this._lang,h={title:t(s,"editor.title"),floor:t(s,"editor.floor"),default_floor:t(s,"editor.default_floor"),language:t(s,"editor.language"),icon_size:t(s,"editor.icon_size"),show_temperature:t(s,"editor.show_temperature"),live_states:t(s,"editor.live_states"),show_signal:t(s,"editor.show_signal"),kiosk:t(s,"editor.kiosk"),cycle:t(s,"editor.cycle")},f=this._schema,_=function(e,o,t){if(!t||null===o)return null;const s="string"==typeof e?.default_floor?e.default_floor:"";return!s||o.some(e=>e.value===s)?null:s}(this._config,this._spaces,this._spacesAuthoritative),d=e=>c`<ha-form
.hass=${this.hass}
.data=${this._formData}
.schema=${e}
.computeLabel=${e=>h[e.name]||e.name}
@value-changed=${this._valueChanged}
></ha-form>`;return c`
${d(f.slice(0,3))}
${_?c`<div class="default-floor-error" role="alert"
style="color:var(--error-color,#db4437);margin:-4px 0 12px;overflow-wrap:anywhere">
${t(s,"editor.default_floor_missing",{id:_})}
</div>`:a}
${d(f.slice(3))}
`}_valueChanged(e){const o={...this._config,...e.detail.value};""===o.floor?delete o.floor:o.floor===this._floorToken&&(o.floor=this._config?.floor);const t=new Event("config-changed",{bubbles:!0,composed:!0});t.detail={config:o},this.dispatchEvent(t)}}h.properties={hass:{attribute:!1},_config:{state:!0},_spaces:{state:!0}},customElements.get("houseplan-card-editor")||customElements.define("houseplan-card-editor",h);
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-1
View File
@@ -1 +0,0 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="cd530b1a2b7fea73c9b39236f868bd23d8f35d404eec4c128453f2140d9288fb";try{await import("./houseplan-assets/houseplan-card-B3HePKmB.js")}catch(e){if(!customElements.get("houseplan-card")){const l=String(navigator.language||"en").toLowerCase();const m=l.startsWith("ru")?"House Plan обновился — перезагрузите страницу (Ctrl+F5).":l.startsWith("de")?"House Plan wurde aktualisiert — bitte laden Sie die Seite neu (Strg+F5).":l.startsWith("fr")?"House Plan a été mis à jour — veuillez recharger la page (Ctrl+F5).":"House Plan was updated — please reload the page (Ctrl+F5).";customElements.define("houseplan-card",class extends HTMLElement{setConfig(){}getCardSize(){return 1}connectedCallback(){this.style.cssText="display:block;box-sizing:border-box;padding:16px;border:1px solid var(--divider-color,#e0e0e0);border-radius:var(--ha-card-border-radius,12px);background:var(--card-background-color,#fff);color:var(--primary-text-color,#212121);font:14px/1.4 var(--paper-font-body1_-_font-family,sans-serif)";this.textContent=m}})}console.error("[houseplan] stale entry: the main chunk is unavailable",e)}
+2 -1
View File
@@ -9870,7 +9870,8 @@ export class HouseplanCard extends LitElement {
if (match) { spaceId = match[1]; fieldList = match[3].split(',').filter(Boolean); }
}
if (spaceId || fieldList.length) {
const space = this._serverCfg?.spaces?.find((item: any) => String(item.id) === spaceId);
const space = this._serverCfg?.spaces
?.find((item: { id?: unknown }) => String(item.id) === spaceId);
const labels: Record<string, I18nKey> = {
contact: 'opening.contact_label', lock: 'opening.lock_label', invert: 'opening.invert',
flip_h: 'opening.flip_h', flip_v: 'opening.flip_v',