From 616c1fda8194840d9bc4c7e350d0de24b911f97e Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Mon, 10 Mar 2025 18:34:15 +0100 Subject: [PATCH] Rename entity filter to entity domain filter (#24587) --- ...tity_filter.ts => entity_domain_filter.ts} | 10 +++--- src/data/cloud.ts | 6 ++-- .../voice-assistants/cloud-alexa-pref.ts | 6 ++-- .../voice-assistants/cloud-google-pref.ts | 6 ++-- .../voice-assistants/entity-voice-settings.ts | 28 ++++++++-------- .../ha-config-voice-assistants-expose.ts | 18 +++++----- ...r.test.ts => entity_domain_filter.test.ts} | 33 +++++++++++-------- 7 files changed, 60 insertions(+), 47 deletions(-) rename src/common/entity/{entity_filter.ts => entity_domain_filter.ts} (90%) rename test/common/entity/{entity_filter.test.ts => entity_domain_filter.test.ts} (67%) diff --git a/src/common/entity/entity_filter.ts b/src/common/entity/entity_domain_filter.ts similarity index 90% rename from src/common/entity/entity_filter.ts rename to src/common/entity/entity_domain_filter.ts index cd1309510b..66c2462e24 100644 --- a/src/common/entity/entity_filter.ts +++ b/src/common/entity/entity_domain_filter.ts @@ -1,27 +1,27 @@ import { computeDomain } from "./compute_domain"; -export type FilterFunc = (entityId: string) => boolean; +export type EntityDomainFilterFunc = (entityId: string) => boolean; -export interface EntityFilter { +export interface EntityDomainFilter { include_domains: string[]; include_entities: string[]; exclude_domains: string[]; exclude_entities: string[]; } -export const isEmptyFilter = (filter: EntityFilter) => +export const isEmptyEntityDomainFilter = (filter: EntityDomainFilter) => filter.include_domains.length + filter.include_entities.length + filter.exclude_domains.length + filter.exclude_entities.length === 0; -export const generateFilter = ( +export const generateEntityDomainFilter = ( includeDomains?: string[], includeEntities?: string[], excludeDomains?: string[], excludeEntities?: string[] -): FilterFunc => { +): EntityDomainFilterFunc => { const includeDomainsSet = new Set(includeDomains); const includeEntitiesSet = new Set(includeEntities); const excludeDomainsSet = new Set(excludeDomains); diff --git a/src/data/cloud.ts b/src/data/cloud.ts index 59882cae75..e92101d7a0 100644 --- a/src/data/cloud.ts +++ b/src/data/cloud.ts @@ -1,4 +1,4 @@ -import type { EntityFilter } from "../common/entity/entity_filter"; +import type { EntityDomainFilter } from "../common/entity/entity_domain_filter"; import type { HomeAssistant } from "../types"; type StrictConnectionMode = "disabled" | "guard_page" | "drop_connection"; @@ -36,10 +36,10 @@ export interface CloudStatusLoggedIn { cloud_last_disconnect_reason: { clean: boolean; reason: string } | null; email: string; google_registered: boolean; - google_entities: EntityFilter; + google_entities: EntityDomainFilter; google_domains: string[]; alexa_registered: boolean; - alexa_entities: EntityFilter; + alexa_entities: EntityDomainFilter; prefs: CloudPreferences; remote_domain: string | undefined; remote_connected: boolean; diff --git a/src/panels/config/voice-assistants/cloud-alexa-pref.ts b/src/panels/config/voice-assistants/cloud-alexa-pref.ts index daf86c8ed4..0eb9fd5ae0 100644 --- a/src/panels/config/voice-assistants/cloud-alexa-pref.ts +++ b/src/panels/config/voice-assistants/cloud-alexa-pref.ts @@ -4,7 +4,7 @@ import { css, html, LitElement, nothing } from "lit"; import { property, state } from "lit/decorators"; import memoizeOne from "memoize-one"; import { fireEvent } from "../../../common/dom/fire_event"; -import { isEmptyFilter } from "../../../common/entity/entity_filter"; +import { isEmptyEntityDomainFilter } from "../../../common/entity/entity_domain_filter"; import "../../../components/ha-alert"; import "../../../components/ha-card"; import "../../../components/ha-settings-row"; @@ -56,7 +56,9 @@ export class CloudAlexaPref extends LitElement { const alexa_registered = this.cloudStatus.alexa_registered; const { alexa_enabled, alexa_report_state } = this.cloudStatus!.prefs; - const manualConfig = !isEmptyFilter(this.cloudStatus.alexa_entities); + const manualConfig = !isEmptyEntityDomainFilter( + this.cloudStatus.alexa_entities + ); return html` diff --git a/src/panels/config/voice-assistants/cloud-google-pref.ts b/src/panels/config/voice-assistants/cloud-google-pref.ts index cae962e1ac..3c66c9eccb 100644 --- a/src/panels/config/voice-assistants/cloud-google-pref.ts +++ b/src/panels/config/voice-assistants/cloud-google-pref.ts @@ -4,7 +4,7 @@ import { css, html, LitElement, nothing } from "lit"; import { property, state } from "lit/decorators"; import memoizeOne from "memoize-one"; import { fireEvent } from "../../../common/dom/fire_event"; -import { isEmptyFilter } from "../../../common/entity/entity_filter"; +import { isEmptyEntityDomainFilter } from "../../../common/entity/entity_domain_filter"; import "../../../components/ha-alert"; import "../../../components/ha-card"; import "../../../components/ha-settings-row"; @@ -62,7 +62,9 @@ export class CloudGooglePref extends LitElement { const { google_enabled, google_report_state, google_secure_devices_pin } = this.cloudStatus.prefs; - const manualConfig = !isEmptyFilter(this.cloudStatus.google_entities); + const manualConfig = !isEmptyEntityDomainFilter( + this.cloudStatus.google_entities + ); return html` diff --git a/src/panels/config/voice-assistants/entity-voice-settings.ts b/src/panels/config/voice-assistants/entity-voice-settings.ts index dbb6b3aed1..dc166d04df 100644 --- a/src/panels/config/voice-assistants/entity-voice-settings.ts +++ b/src/panels/config/voice-assistants/entity-voice-settings.ts @@ -6,13 +6,13 @@ import memoizeOne from "memoize-one"; import { isComponentLoaded } from "../../../common/config/is_component_loaded"; import { fireEvent } from "../../../common/dom/fire_event"; import type { - EntityFilter, - FilterFunc, -} from "../../../common/entity/entity_filter"; + EntityDomainFilter, + EntityDomainFilterFunc, +} from "../../../common/entity/entity_domain_filter"; import { - generateFilter, - isEmptyFilter, -} from "../../../common/entity/entity_filter"; + generateEntityDomainFilter, + isEmptyEntityDomainFilter, +} from "../../../common/entity/entity_domain_filter"; import "../../../components/ha-aliases-editor"; import "../../../components/ha-settings-row"; import "../../../components/ha-switch"; @@ -101,14 +101,14 @@ export class EntityVoiceSettings extends SubscribeMixin(LitElement) { } private _getEntityFilterFuncs = memoizeOne( - (googleFilter: EntityFilter, alexaFilter: EntityFilter) => ({ - google: generateFilter( + (googleFilter: EntityDomainFilter, alexaFilter: EntityDomainFilter) => ({ + google: generateEntityDomainFilter( googleFilter.include_domains, googleFilter.include_entities, googleFilter.exclude_domains, googleFilter.exclude_entities ), - alexa: generateFilter( + alexa: generateEntityDomainFilter( alexaFilter.include_domains, alexaFilter.include_entities, alexaFilter.exclude_domains, @@ -131,10 +131,12 @@ export class EntityVoiceSettings extends SubscribeMixin(LitElement) { const alexaManual = alexaEnabled && - !isEmptyFilter((this._cloudStatus as CloudStatusLoggedIn).alexa_entities); + !isEmptyEntityDomainFilter( + (this._cloudStatus as CloudStatusLoggedIn).alexa_entities + ); const googleManual = googleEnabled && - !isEmptyFilter( + !isEmptyEntityDomainFilter( (this._cloudStatus as CloudStatusLoggedIn).google_entities ); @@ -159,8 +161,8 @@ export class EntityVoiceSettings extends SubscribeMixin(LitElement) { let manFilterFuncs: | { - google: FilterFunc; - alexa: FilterFunc; + google: EntityDomainFilterFunc; + alexa: EntityDomainFilterFunc; } | undefined; diff --git a/src/panels/config/voice-assistants/ha-config-voice-assistants-expose.ts b/src/panels/config/voice-assistants/ha-config-voice-assistants-expose.ts index 79e853718d..7b4ff58907 100644 --- a/src/panels/config/voice-assistants/ha-config-voice-assistants-expose.ts +++ b/src/panels/config/voice-assistants/ha-config-voice-assistants-expose.ts @@ -13,11 +13,11 @@ import memoize from "memoize-one"; import type { HASSDomEvent } from "../../../common/dom/fire_event"; import { fireEvent } from "../../../common/dom/fire_event"; import { computeStateName } from "../../../common/entity/compute_state_name"; -import type { EntityFilter } from "../../../common/entity/entity_filter"; +import type { EntityDomainFilter } from "../../../common/entity/entity_domain_filter"; import { - generateFilter, - isEmptyFilter, -} from "../../../common/entity/entity_filter"; + generateEntityDomainFilter, + isEmptyEntityDomainFilter, +} from "../../../common/entity/entity_domain_filter"; import { navigate } from "../../../common/navigate"; import type { DataTableColumnContainer, @@ -257,14 +257,14 @@ export class VoiceAssistantsExpose extends LitElement { ); private _getEntityFilterFuncs = memoize( - (googleFilter: EntityFilter, alexaFilter: EntityFilter) => ({ - google: generateFilter( + (googleFilter: EntityDomainFilter, alexaFilter: EntityDomainFilter) => ({ + google: generateEntityDomainFilter( googleFilter.include_domains, googleFilter.include_entities, googleFilter.exclude_domains, googleFilter.exclude_entities ), - amazon: generateFilter( + amazon: generateEntityDomainFilter( alexaFilter.include_domains, alexaFilter.include_entities, alexaFilter.exclude_domains, @@ -320,12 +320,12 @@ export class VoiceAssistantsExpose extends LitElement { const alexaManual = alexaEnabled && - !isEmptyFilter( + !isEmptyEntityDomainFilter( (this.cloudStatus as CloudStatusLoggedIn).alexa_entities ); const googleManual = googleEnabled && - !isEmptyFilter( + !isEmptyEntityDomainFilter( (this.cloudStatus as CloudStatusLoggedIn).google_entities ); diff --git a/test/common/entity/entity_filter.test.ts b/test/common/entity/entity_domain_filter.test.ts similarity index 67% rename from test/common/entity/entity_filter.test.ts rename to test/common/entity/entity_domain_filter.test.ts index 0c2f74c937..ef117ad0a9 100644 --- a/test/common/entity/entity_filter.test.ts +++ b/test/common/entity/entity_domain_filter.test.ts @@ -1,11 +1,11 @@ import { assert, describe, it } from "vitest"; -import { generateFilter } from "../../../src/common/entity/entity_filter"; +import { generateEntityDomainFilter } from "../../../src/common/entity/entity_domain_filter"; describe("EntityFilter", () => { // case 1 it("passes all when no filters passed in", () => { - const filter = generateFilter(); + const filter = generateEntityDomainFilter(); assert(filter("sensor.test")); assert(filter("sun.sun")); @@ -14,14 +14,14 @@ describe("EntityFilter", () => { // case 2 it("allows entities by entity id", () => { - const filter = generateFilter(undefined, ["light.kitchen"]); + const filter = generateEntityDomainFilter(undefined, ["light.kitchen"]); assert(filter("light.kitchen")); assert(!filter("light.living_room")); }); it("allows entities by domain", () => { - const filter = generateFilter(["switch"]); + const filter = generateEntityDomainFilter(["switch"]); assert(filter("switch.bla")); assert(!filter("light.kitchen")); @@ -29,7 +29,7 @@ describe("EntityFilter", () => { // case 3 it("excluding entities by entity id", () => { - const filter = generateFilter(undefined, undefined, undefined, [ + const filter = generateEntityDomainFilter(undefined, undefined, undefined, [ "light.kitchen", ]); @@ -38,7 +38,7 @@ describe("EntityFilter", () => { }); it("excluding entities by domain", () => { - const filter = generateFilter(undefined, undefined, ["switch"]); + const filter = generateEntityDomainFilter(undefined, undefined, ["switch"]); assert(!filter("switch.bla")); assert(filter("light.kitchen")); @@ -46,9 +46,12 @@ describe("EntityFilter", () => { // case 4a it("allows domain and excluding entity", () => { - const filter = generateFilter(["switch"], undefined, undefined, [ - "switch.kitchen", - ]); + const filter = generateEntityDomainFilter( + ["switch"], + undefined, + undefined, + ["switch.kitchen"] + ); assert(filter("switch.living_room")); assert(!filter("switch.kitchen")); @@ -56,7 +59,7 @@ describe("EntityFilter", () => { }); it("allows entity while other domains", () => { - const filter = generateFilter(["switch"], ["light.kitchen"]); + const filter = generateEntityDomainFilter(["switch"], ["light.kitchen"]); assert(filter("switch.living_room")); assert(filter("light.kitchen")); @@ -65,7 +68,11 @@ describe("EntityFilter", () => { // case 4b it("excluding domain and entity", () => { - const filter = generateFilter(undefined, ["switch.kitchen"], ["switch"]); + const filter = generateEntityDomainFilter( + undefined, + ["switch.kitchen"], + ["switch"] + ); assert(filter("switch.kitchen")); assert(!filter("switch.living_room")); @@ -73,7 +80,7 @@ describe("EntityFilter", () => { }); it("excluding domain and excluding entities", () => { - const filter = generateFilter( + const filter = generateEntityDomainFilter( undefined, undefined, ["switch"], @@ -87,7 +94,7 @@ describe("EntityFilter", () => { // case 4c it("allows entities", () => { - const filter = generateFilter(undefined, ["light.kitchen"]); + const filter = generateEntityDomainFilter(undefined, ["light.kitchen"]); assert(filter("light.kitchen")); assert(!filter("switch.living_room"));