Rename entity filter to entity domain filter (#24587)

This commit is contained in:
Paul Bottein 2025-03-10 18:34:15 +01:00 committed by GitHub
parent e8805be561
commit 616c1fda81
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 60 additions and 47 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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`
<ha-card outlined>

View File

@ -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`
<ha-card outlined>

View File

@ -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;

View File

@ -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
);

View File

@ -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"));