diff --git a/.github/workflows/pylint.yml b/.github/workflows/pylint.yml index ad56987..0d53b49 100644 --- a/.github/workflows/pylint.yml +++ b/.github/workflows/pylint.yml @@ -8,7 +8,7 @@ jobs: strategy: matrix: - python-version: ["3.12", "3.13"] + python-version: ["3.13"] steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7a3a264..1506093 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,7 +8,7 @@ jobs: strategy: matrix: - python-version: ["3.12", "3.13"] + python-version: ["3.13"] steps: - uses: actions/checkout@v4 diff --git a/README.md b/README.md index 99d8fc9..6ab3819 100644 --- a/README.md +++ b/README.md @@ -380,7 +380,7 @@ Currently, all planned features have been implemented! Have a suggestion? [Open If you encounter any problems or have questions: -1. 📖 Check the [documentation](#documentation) above +1. 📖 Check the [documentation](#-documentation) above 2. 🔍 Search [existing issues](https://github.com/gensyn/HomeAssistantPlugin/issues) 3. 🐛 [Open a new issue](https://github.com/gensyn/HomeAssistantPlugin/issues/new) with: - Detailed description of the problem diff --git a/actions/cores/base_core/base_core.py b/actions/cores/base_core/base_core.py index 61c4eb6..df89746 100644 --- a/actions/cores/base_core/base_core.py +++ b/actions/cores/base_core/base_core.py @@ -1,17 +1,30 @@ """The module for the Home Assistant action that is loaded in StreamController.""" -from typing import List - +import gi from GtkHelper.GenerativeUI.ComboRow import ComboRow from HomeAssistantPlugin.actions import const from src.backend.PluginManager.ActionCore import ActionCore +gi.require_version('Gtk', '4.0') +from gi.repository import Gtk + + +def set_substring_search(combo_row: ComboRow) -> None: + """Enable substring search mode on a ComboRow if supported by the installed libadwaita version.""" + try: + widget = combo_row.widget + if hasattr(widget, "set_search_match_mode"): + widget.set_search_match_mode(Gtk.StringFilterMatchMode.SUBSTRING) + except AttributeError: + pass + def requires_initialization(func): def wrapper(self, *args, **kwargs): if not getattr(self, 'initialized', False): return None return func(self, *args, **kwargs) + return wrapper @@ -26,7 +39,9 @@ def __init__(self, settings_implementation, track_entity: bool, *args, **kwargs) self.lm = self.plugin_base.locale_manager self.has_configuration = True self.track_entity = track_entity - self._create_ui_elements() + self.domain_combo = None + self.entity_combo = None + self.create_ui_elements() self._create_event_assigner() def on_ready(self) -> None: @@ -55,34 +70,36 @@ def on_remove(self) -> None: ) self.refresh() - def get_config_rows(self) -> List: + def get_config_rows(self) -> list: """Get the rows to be displayed in the UI.""" raise NotImplementedError("Must be implemented by subclasses.") - def _create_ui_elements(self) -> None: + def create_ui_elements(self) -> None: """Get all entity rows.""" self.domain_combo: ComboRow = ComboRow( self, const.SETTING_ENTITY_DOMAIN, const.EMPTY_STRING, [], const.LABEL_ENTITY_DOMAIN, enable_search=True, - on_change=self._on_change_domain, can_reset=False, + on_change=self.on_change_domain, can_reset=False, complex_var_name=True ) + set_substring_search(self.domain_combo) self.entity_combo: ComboRow = ComboRow( self, const.SETTING_ENTITY_ENTITY, const.EMPTY_STRING, [], const.LABEL_ENTITY_ENTITY, enable_search=True, - on_change=self._on_change_entity, can_reset=False, + on_change=self.on_change_entity, can_reset=False, complex_var_name=True ) + set_substring_search(self.entity_combo) @requires_initialization def _reload(self, *_): """Reload the action.""" - self._set_enabled_disabled() + self.set_enabled_disabled() self.refresh() @requires_initialization - def _on_change_domain(self, _, domain, old_domain): + def on_change_domain(self, _, domain, old_domain): """Execute when the domain is changed.""" domain = str(domain) if domain is not None else None old_domain = str(old_domain) if old_domain is not None else None @@ -97,10 +114,10 @@ def _on_change_domain(self, _, domain, old_domain): if domain: self._load_entities() - self._set_enabled_disabled() + self.set_enabled_disabled() @requires_initialization - def _on_change_entity(self, _, entity, old_entity): + def on_change_entity(self, _, entity, old_entity): """Execute when the entity is changed.""" entity = str(entity) if entity is not None else None old_entity = str(old_entity) if old_entity is not None else None @@ -112,7 +129,7 @@ def _on_change_entity(self, _, entity, old_entity): self.plugin_base.backend.add_tracked_entity(entity, self.refresh) self.refresh() - self._set_enabled_disabled() + self.set_enabled_disabled() @requires_initialization def refresh(self, state: dict = None) -> None: @@ -156,14 +173,14 @@ def _load_entities(self) -> None: if entities != self._get_current_entities(): self.entity_combo.populate(entities, entity, trigger_callback=False) - def _get_current_domains(self) -> List[str]: + def _get_current_domains(self) -> list[str]: """Get the domains currently displayed in the domain combo.""" return [ str(self.domain_combo.get_item_at(i)) for i in range(self.domain_combo.get_item_amount()) ] - def _get_current_entities(self) -> List[str]: + def _get_current_entities(self) -> list[str]: """Get the entities currently displayed in the entity combo.""" return [ str(self.entity_combo.get_item_at(i)) @@ -171,13 +188,13 @@ def _get_current_entities(self) -> List[str]: ] @requires_initialization - def _set_enabled_disabled(self) -> None: + def set_enabled_disabled(self) -> None: """Set the active/inactive state for all rows.""" domain = self.settings.get_domain() is_domain_set = bool(domain) self.entity_combo.set_sensitive(is_domain_set) - def _get_domains(self) -> List[str]: + def _get_domains(self) -> list[str]: """Get the domains available in Home Assistant.""" raise NotImplementedError("Must be implemented by subclasses.") diff --git a/actions/cores/customization_core/customization.py b/actions/cores/customization_core/customization.py index 22cbc87..a3b7536 100644 --- a/actions/cores/customization_core/customization.py +++ b/actions/cores/customization_core/customization.py @@ -2,13 +2,14 @@ Modul to manage customizations. """ -from typing import Dict, Any +from typing import Any class Customization: """ Base class to represent a customization. """ + def __init__(self, attribute: str, operator: str, value: str): self.attribute: str = attribute self.operator: str = operator @@ -35,7 +36,7 @@ def get_value(self) -> str: """ return self.value - def export(self) -> Dict[str, Any]: + def export(self) -> dict[str, Any]: """ Get this customization as a dict. Must be implemented in a subclass. :return: this customization as a dict diff --git a/actions/cores/customization_core/customization_core.py b/actions/cores/customization_core/customization_core.py index bc7ca4f..9219bfe 100644 --- a/actions/cores/customization_core/customization_core.py +++ b/actions/cores/customization_core/customization_core.py @@ -1,10 +1,8 @@ """The module for the Home Assistant action that is loaded in StreamController.""" from copy import deepcopy -from typing import List import gi - gi.require_version("Gtk", "4.0") from gi.repository.Gtk import Button, Align @@ -19,6 +17,8 @@ class CustomizationCore(BaseCore): """Action core for all Home Assistant Actions.""" def __init__(self, window_implementation, customization_implementation, row_implementation, *args, **kwargs): + # Must be set before create_ui_elements in BaseCore is called + self.customization_expander = None super().__init__(*args, **kwargs) self.window_implementation = window_implementation self.customization_implementation = customization_implementation @@ -34,9 +34,9 @@ def on_ready(self) -> None: self._reload() - def _create_ui_elements(self) -> None: + def create_ui_elements(self) -> None: """Get all action rows.""" - super()._create_ui_elements() + super().create_ui_elements() add_customization_button = Button(icon_name="list-add", valign=Align.CENTER) add_customization_button.set_size_request(15, 15) @@ -99,11 +99,11 @@ def _on_move_down(self, _, index: int): self.refresh() @requires_initialization - def _set_enabled_disabled(self) -> None: + def set_enabled_disabled(self) -> None: """ Set the active/inactive state for all rows. """ - super()._set_enabled_disabled() + super().set_enabled_disabled() domain = self.settings.get_domain() is_domain_set = bool(domain) @@ -122,7 +122,7 @@ def _set_enabled_disabled(self) -> None: len(self.settings.get_customizations()) > 0 ) - def _get_attributes(self) -> List[str]: + def _get_attributes(self) -> list[str]: """ Gets the list of attributes for the selected entity. :return: the list of attributes diff --git a/actions/cores/customization_core/customization_helper.py b/actions/cores/customization_core/customization_helper.py index ea1c75f..1301e54 100644 --- a/actions/cores/customization_core/customization_helper.py +++ b/actions/cores/customization_core/customization_helper.py @@ -1,15 +1,13 @@ """ Module for helper functions. """ -from typing import Tuple - import gi + gi.require_version("Gdk", "4.0") from gi.repository.Gdk import RGBA - -def convert_color_list_to_rgba(color: Tuple[int, int, int, int]) -> RGBA: +def convert_color_list_to_rgba(color: tuple[int, int, int, int]) -> RGBA: """ Converts a list with RGB values to an RGBA object. The alpha value is always set to 1. @@ -24,17 +22,17 @@ def convert_color_list_to_rgba(color: Tuple[int, int, int, int]) -> RGBA: return rgba -def convert_rgba_to_color_list(rgba: RGBA) -> Tuple[int, int, int, int]: +def convert_rgba_to_color_list(rgba: RGBA) -> tuple[int, int, int, int]: """ Converts an RGBA object to a list with RGB values. The alpha value is always set to 255. :param rgba: the RGBA value to convert :return: the color list """ - return int(rgba.red*255), int(rgba.green*255), int(rgba.blue*255), 255 + return int(rgba.red * 255), int(rgba.green * 255), int(rgba.blue * 255), 255 -def convert_color_list_to_hex(color: Tuple[int, int, int, int]) -> str: +def convert_color_list_to_hex(color: tuple[int, int, int, int]) -> str: """ Converts a tuple with RGBA values to a hex string representation. :param color: the color to convert diff --git a/actions/cores/customization_core/customization_row.py b/actions/cores/customization_core/customization_row.py index 980d596..2b08b05 100644 --- a/actions/cores/customization_core/customization_row.py +++ b/actions/cores/customization_core/customization_row.py @@ -1,10 +1,9 @@ """ The module for the Home Assistant customization row. """ -from typing import List, Dict, Any +from typing import Any import gi - from HomeAssistantPlugin.actions.cores.customization_core import customization_const from HomeAssistantPlugin.actions.cores.customization_core.customization import Customization from HomeAssistantPlugin.actions.cores.customization_core.customization_settings import CustomizationSettings @@ -20,7 +19,7 @@ class CustomizationRow(ActionRow): Base for customization rows """ - def __init__(self, lm, customization_count: int, index: int, attributes: List, state: Dict, + def __init__(self, lm, customization_count: int, index: int, attributes: list, state: dict, settings: CustomizationSettings): super().__init__() diff --git a/actions/cores/customization_core/customization_settings.py b/actions/cores/customization_core/customization_settings.py index 44ad77a..43afd60 100644 --- a/actions/cores/customization_core/customization_settings.py +++ b/actions/cores/customization_core/customization_settings.py @@ -1,7 +1,5 @@ """Module to manage HomeAssistantPlugin action settings.""" -from typing import List - from HomeAssistantPlugin.actions.cores.base_core.base_settings import BaseSettings from HomeAssistantPlugin.actions.cores.customization_core import customization_const from HomeAssistantPlugin.actions.cores.customization_core.customization import Customization @@ -20,7 +18,8 @@ def __init__(self, action, customization_name, customization_implementation): self.customization_implementation = customization_implementation def get_customizations(self): - return [self.customization_implementation.from_dict(c) for c in self._action.get_settings()[self.customization_name][customization_const.SETTING_CUSTOMIZATIONS]] + return [self.customization_implementation.from_dict(c) for c in + self._action.get_settings()[self.customization_name][customization_const.SETTING_CUSTOMIZATIONS]] def move_customization(self, index: int, offset: int): """ @@ -31,7 +30,8 @@ def move_customization(self, index: int, offset: int): """ settings = self._action.get_settings() customization = settings[self.customization_name][customization_const.SETTING_CUSTOMIZATIONS].pop(index) - settings[self.customization_name][customization_const.SETTING_CUSTOMIZATIONS].insert(index + offset, customization) + settings[self.customization_name][customization_const.SETTING_CUSTOMIZATIONS].insert(index + offset, + customization) self._action.set_settings(settings) def remove_customization(self, index: int) -> None: @@ -62,4 +62,4 @@ def add_customization(self, customization: Customization) -> None: """ settings = self._action.get_settings() settings[self.customization_name][customization_const.SETTING_CUSTOMIZATIONS].append(customization.export()) - self._action.set_settings(settings) \ No newline at end of file + self._action.set_settings(settings) diff --git a/actions/cores/customization_core/customization_window.py b/actions/cores/customization_core/customization_window.py index 43e06e5..1b508e1 100644 --- a/actions/cores/customization_core/customization_window.py +++ b/actions/cores/customization_core/customization_window.py @@ -2,7 +2,7 @@ The module for the Home Assistant customization window. """ from functools import partial -from typing import Callable, List +from typing import Callable import gi from gi.repository import GObject @@ -11,7 +11,8 @@ gi.require_version("Gtk", "4.0") from gi.repository.Gtk import Align, Box, Button, CssProvider, Entry, \ - Grid, Label, Window, CheckButton, Scale, Orientation, Switch, ColorDialog, ColorDialogButton, DropDown, StringObject, PropertyExpression + Grid, Label, Window, CheckButton, Scale, Orientation, Switch, ColorDialog, ColorDialogButton, DropDown, \ + StringObject, PropertyExpression from HomeAssistantPlugin.actions import const as base_const from HomeAssistantPlugin.actions.cores.customization_core import customization_const @@ -42,16 +43,16 @@ class CustomizationWindow(Window): """ callback: Callable - connect_rows: List = [] + connect_rows: list = [] default_margin = 3 - def __init__(self, lm, attributes: List, callback: Callable, + def __init__(self, lm, attributes: list, callback: Callable, current: Customization = None, index: int = None): super().__init__() self.callback = callback self.lm = lm self.index: int = index - self.attributes: List[str] = attributes + self.attributes: list[str] = attributes self.current: Customization = current self.set_modal(True) @@ -110,15 +111,15 @@ def __init__(self, lm, attributes: List, callback: Callable, self.set_child(grid) def _after_init(self) -> None: - self._set_default_values() - self._set_current_values() + self.set_default_values() + self.set_current_values() self._connect_rows() - def _set_default_values(self) -> None: + def set_default_values(self) -> None: self.condition_attribute.set_selected(0) self.operator.set_selected(0) - def _set_current_values(self) -> None: + def set_current_values(self) -> None: if not self.current: return @@ -142,7 +143,7 @@ def _create_button(self, label) -> Button: button.set_margin_end(self.default_margin) return button - def _create_drop_down(self, attributes: List, check: CheckButton = None) -> DropDown: + def _create_drop_down(self, attributes: list, check: CheckButton = None) -> DropDown: drop_down = DropDown() drop_down.set_margin_top(self.default_margin) drop_down.set_margin_bottom(self.default_margin) @@ -156,7 +157,7 @@ def _create_drop_down(self, attributes: List, check: CheckButton = None) -> Drop drop_down.set_model(model) self.connect_rows.append( - partial(drop_down.connect, base_const.CONNECT_NOTIFY_SELECTED_ITEM, self._on_widget_changed)) + partial(drop_down.connect, base_const.CONNECT_NOTIFY_SELECTED_ITEM, self.on_widget_changed)) if check is not None: self.connect_rows.append(partial(drop_down.connect, base_const.CONNECT_NOTIFY_SELECTED_ITEM, @@ -184,7 +185,7 @@ def _create_drop_down_operator(self) -> DropDown: drop_down.set_model(model) self.connect_rows.append( - partial(drop_down.connect, base_const.CONNECT_NOTIFY_SELECTED_ITEM, self._on_widget_changed)) + partial(drop_down.connect, base_const.CONNECT_NOTIFY_SELECTED_ITEM, self.on_widget_changed)) return drop_down @@ -204,7 +205,7 @@ def _create_entry(self, check: CheckButton = None) -> Entry: entry.set_margin_start(self.default_margin) entry.set_margin_end(15) self.connect_rows.append( - partial(entry.connect, base_const.CONNECT_CHANGED, self._on_widget_changed)) + partial(entry.connect, base_const.CONNECT_CHANGED, self.on_widget_changed)) self.connect_rows.append( partial(entry.connect, base_const.CONNECT_ACTIVATE, self.on_add_button)) if check is not None: @@ -263,7 +264,7 @@ def _create_color_button(self, check: CheckButton) -> ColorDialogButton: def _on_cancel_button(self, _): self.destroy() - def on_add_button(self, *args, **kwargs) -> bool: + def on_add_button(self, *_, **__) -> bool: if self.condition_attribute.get_selected() < 0: self.condition_attribute.add_css_class(customization_const.ERROR) return False @@ -285,7 +286,7 @@ def on_add_button(self, *args, **kwargs) -> bool: return True - def _on_widget_changed(self, *args, **kwargs) -> None: + def on_widget_changed(self, *_, **__) -> None: self.condition_attribute.remove_css_class(customization_const.ERROR) self.operator.remove_css_class(customization_const.ERROR) self.entry_value.remove_css_class(customization_const.ERROR) @@ -304,7 +305,7 @@ def _create_check_button(self) -> CheckButton: check.set_margin_start(self.default_margin) check.set_margin_end(self.default_margin) self.connect_rows.append( - partial(check.connect, base_const.CONNECT_TOGGLED, self._on_widget_changed)) + partial(check.connect, base_const.CONNECT_TOGGLED, self.on_widget_changed)) return check def _on_change_scale(self, scale, *args): diff --git a/actions/level_dial/level_customization.py b/actions/level_dial/level_customization.py index 68b103c..bb24125 100644 --- a/actions/level_dial/level_customization.py +++ b/actions/level_dial/level_customization.py @@ -1,6 +1,6 @@ """Module to manage level dial customizations.""" -from typing import Tuple, Dict, Any +from typing import Any from HomeAssistantPlugin.actions.cores.customization_core import customization_const from HomeAssistantPlugin.actions.cores.customization_core.customization import Customization @@ -11,10 +11,10 @@ class LevelDialCustomization(Customization): """Class to represent a level dial customization.""" def __init__(self, attribute: str, operator: str, value: str, icon: str, - color: Tuple[int, int, int, int]): + color: tuple[int, int, int, int]): super().__init__(attribute, operator, value) self.icon: str = icon - self.color: Tuple[int, int, int, int] = color + self.color: tuple[int, int, int, int] = color @classmethod def from_dict(cls, customization: dict): @@ -26,10 +26,10 @@ def from_dict(cls, customization: dict): def get_icon(self) -> str: return self.icon - def get_color(self) -> Tuple[int, int, int, int]: + def get_color(self) -> tuple[int, int, int, int]: return self.color - def export(self) -> Dict[str, Any]: + def export(self) -> dict[str, Any]: return { customization_const.CONDITION: { customization_const.ATTRIBUTE: self.attribute, diff --git a/actions/level_dial/level_dial.py b/actions/level_dial/level_dial.py index b999f92..a46e9ff 100644 --- a/actions/level_dial/level_dial.py +++ b/actions/level_dial/level_dial.py @@ -4,7 +4,6 @@ import os import threading from io import BytesIO -from typing import Dict, List, Tuple # Available in the StreamController flatpak runtime; graceful fallback for unit tests try: @@ -15,6 +14,7 @@ cairosvg = None Image = None import logging + log = logging.getLogger(__name__) from GtkHelper.GenerativeUI.EntryRow import EntryRow @@ -33,10 +33,9 @@ # Load MDI icons once at import time _MDI_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "..", "assets", "mdi-svg.json") with open(_MDI_PATH, "r", encoding="utf-8") as _f: - _MDI_ICONS: Dict[str, str] = json.load(_f) - + _MDI_ICONS: dict[str, str] = json.load(_f) -_ICON_CACHE: Dict = {} +_ICON_CACHE: dict = {} def _get_icon_image(icon_name: str, color_hex: str, opacity: float = 1.0): @@ -74,8 +73,8 @@ def _get_entity_icon(state: dict, fallback: str) -> str: return icon if icon else fallback -def _evaluate_customizations(state: dict, customizations: List[LevelDialCustomization], - default_icon: str, default_color: str) -> Tuple[str, str]: +def _evaluate_customizations(state: dict, customizations: list[LevelDialCustomization], + default_icon: str, default_color: str) -> tuple[str, str]: """Evaluate customization rules against current state, returning (icon_name, color_hex).""" icon_name = default_icon color_hex = default_color @@ -126,6 +125,10 @@ class LevelDial(CustomizationCore): """Dial action that controls Home Assistant entity levels (brightness, fan speed, etc.).""" def __init__(self, *args, **kwargs): + # Must be set before create_ui_elements in BaseCore is called + self.label_entry = None + self.step_scale = None + self.batch_delay_scale = None super().__init__( *args, window_implementation=LevelDialWindow, @@ -208,7 +211,7 @@ def on_ready(self) -> None: super().on_ready() self._reload() - def get_config_rows(self) -> List: + def get_config_rows(self) -> list: return [ self.domain_combo.widget, self.entity_combo.widget, @@ -218,8 +221,8 @@ def get_config_rows(self) -> List: self.customization_expander.widget, ] - def _create_ui_elements(self) -> None: - super()._create_ui_elements() + def create_ui_elements(self) -> None: + super().create_ui_elements() self.label_entry: EntryRow = EntryRow( self, level_const.SETTING_LEVEL_LABEL, level_const.DEFAULT_LABEL, @@ -431,11 +434,11 @@ def refresh(self, state: dict = None) -> None: self.set_media(image=icon_img, size=0.75) self._load_customizations() - self._set_enabled_disabled() + self.set_enabled_disabled() @requires_initialization - def _set_enabled_disabled(self) -> None: - super()._set_enabled_disabled() + def set_enabled_disabled(self) -> None: + super().set_enabled_disabled() domain = self.settings.get_domain() entity = self.settings.get_entity() has_entity = bool(domain) and bool(entity) @@ -458,6 +461,6 @@ def _set_enabled_disabled(self) -> None: self.batch_delay_scale.widget.set_subtitle(level_const.EMPTY_STRING) @requires_initialization - def _get_domains(self) -> List[str]: + def _get_domains(self) -> list[str]: available = set(self.plugin_base.backend.get_domains_for_entities()) return [d for d in level_const.DOMAIN_CONFIGS if d in available] diff --git a/actions/level_dial/level_row.py b/actions/level_dial/level_row.py index 5c0bbed..a68da0e 100644 --- a/actions/level_dial/level_row.py +++ b/actions/level_dial/level_row.py @@ -1,7 +1,5 @@ """The module for the Level Dial customization row.""" -from typing import List, Dict - from HomeAssistantPlugin.actions.cores.customization_core import customization_helper from HomeAssistantPlugin.actions.cores.customization_core.customization_row import CustomizationRow from HomeAssistantPlugin.actions.cores.customization_core.customization_settings import CustomizationSettings @@ -9,7 +7,7 @@ from HomeAssistantPlugin.actions.level_dial.level_customization import LevelDialCustomization -def get_value(state: Dict, customization: LevelDialCustomization): +def get_value(state: dict, customization: LevelDialCustomization): """Gets the current value that the customization references.""" if customization.get_attribute() == "state": return state.get("state") @@ -20,7 +18,7 @@ class LevelDialRow(CustomizationRow): """Row displaying a level dial customization.""" def __init__(self, lm, customization: LevelDialCustomization, customization_count: int, index: int, - attributes: List, state: Dict, settings: CustomizationSettings): + attributes: list, state: dict, settings: CustomizationSettings): super().__init__(lm, customization_count, index, attributes, state, settings) current_value = get_value(state, customization) diff --git a/actions/level_dial/level_window.py b/actions/level_dial/level_window.py index a3d6e90..5047e7b 100644 --- a/actions/level_dial/level_window.py +++ b/actions/level_dial/level_window.py @@ -1,14 +1,13 @@ """The module for the Level Dial customization window.""" from functools import partial -from typing import Callable, List +from typing import Callable from HomeAssistantPlugin.actions import const as base_const from HomeAssistantPlugin.actions.cores.customization_core import customization_helper from HomeAssistantPlugin.actions.cores.customization_core.customization_window import CustomizationWindow from HomeAssistantPlugin.actions.level_dial import level_const from HomeAssistantPlugin.actions.level_dial.level_customization import LevelDialCustomization - # Reuse the MDI icon list from the shared asset from HomeAssistantPlugin.actions.show_icon import icon_helper @@ -16,11 +15,11 @@ class LevelDialWindow(CustomizationWindow): """Window to customize level dial icon and color.""" - def __init__(self, lm, attributes: List, callback: Callable, + def __init__(self, lm, attributes: list, callback: Callable, current: LevelDialCustomization = None, index: int = None): super().__init__(lm, attributes, callback, current, index) - self.icons: List[str] = list(icon_helper.MDI_ICONS) + self.icons: list[str] = list(icon_helper.MDI_ICONS) self.set_title(lm.get(level_const.CUSTOMIZATION_WINDOW_TITLE)) @@ -33,7 +32,7 @@ def __init__(self, lm, attributes: List, callback: Callable, self.icon = self._create_entry(self.check_icon) self.icon.set_margin_end(self.default_margin) self.connect_rows.append( - partial(self.icon.connect, base_const.CONNECT_ACTIVATE, self._on_widget_changed)) + partial(self.icon.connect, base_const.CONNECT_ACTIVATE, self.on_widget_changed)) self.color = self._create_color_button(self.check_color) @@ -47,17 +46,17 @@ def __init__(self, lm, attributes: List, callback: Callable, self._after_init() - def _set_default_values(self) -> None: - super()._set_default_values() + def set_default_values(self) -> None: + super().set_default_values() rgba = customization_helper.convert_color_list_to_rgba(level_const.DEFAULT_ICON_COLOR) self.color.set_rgba(rgba) - def _set_current_values(self) -> None: + def set_current_values(self) -> None: if not self.current: return - super()._set_current_values() + super().set_current_values() self.icon.set_text(self.current.get_icon() or level_const.EMPTY_STRING) self.check_icon.set_active(self.current.get_icon() is not None) @@ -67,7 +66,7 @@ def _set_current_values(self) -> None: self.color.set_rgba(rgba) self.check_color.set_active(self.current.get_color() is not None) - def on_add_button(self, *args, **kwargs) -> None: + def on_add_button(self, *_, **__) -> None: if not super().on_add_button(): return @@ -99,8 +98,8 @@ def on_add_button(self, *args, **kwargs) -> None: self.destroy() - def _on_widget_changed(self, *args, **kwargs) -> None: - super()._on_widget_changed() + def on_widget_changed(self, *_, **__) -> None: + super().on_widget_changed() self.icon.remove_css_class(level_const.ERROR) self.check_icon.remove_css_class(level_const.ERROR) diff --git a/actions/perform_action/__init__.py b/actions/perform_action/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/actions/perform_action/parameters/parameter_combo_row.py b/actions/perform_action/parameters/parameter_combo_row.py index 0bf6aae..c366c95 100644 --- a/actions/perform_action/parameters/parameter_combo_row.py +++ b/actions/perform_action/parameters/parameter_combo_row.py @@ -1,6 +1,4 @@ """Module for the ParameterComboRow.""" -from typing import List - from GtkHelper.ComboRow import BaseComboRowItem from GtkHelper.GenerativeUI.ComboRow import ComboRow from HomeAssistantPlugin.actions.perform_action.parameters.parameter_row import ParameterRow @@ -9,7 +7,7 @@ class ParameterComboRow(ParameterRow, ComboRow): """ComboRow to display action call parameters with a check button.""" - def __init__(self, action_core, var_name: str, field_name: str, default_value: str, items: List, required: bool): + def __init__(self, action_core, var_name: str, field_name: str, default_value: str, items: list, required: bool): ComboRow.__init__(self, action_core, var_name, default_value, items, title=field_name, can_reset=False, complex_var_name=True) ParameterRow.__init__(self, action_core, field_name, required) diff --git a/actions/perform_action/parameters/parameter_row.py b/actions/perform_action/parameters/parameter_row.py index 9f15dac..0cdc2eb 100644 --- a/actions/perform_action/parameters/parameter_row.py +++ b/actions/perform_action/parameters/parameter_row.py @@ -1,7 +1,8 @@ """Module for the ParameterRow.""" -from typing import Any +from typing import Any import gi + gi.require_version('Gtk', '4.0') from gi.repository.Gtk import CheckButton @@ -10,6 +11,7 @@ class ParameterRow: """Row to display action call parameters with a check button.""" + def __init__(self, action_core, field_name: str, required: bool): self.action = action_core self.field_name = field_name @@ -34,7 +36,6 @@ def get_parameter_value(self) -> Any: """ raise NotImplementedError() - def set_value(self, value: Any) -> None: """ Set the value for the row. Must be implemented in a subclass. diff --git a/actions/perform_action/perform_action.py b/actions/perform_action/perform_action.py index b457d00..1945eef 100644 --- a/actions/perform_action/perform_action.py +++ b/actions/perform_action/perform_action.py @@ -4,22 +4,26 @@ import json from json import JSONDecodeError -from typing import List + +from HomeAssistantPlugin.actions.cores.base_core.base_core import BaseCore, requires_initialization, \ + set_substring_search +from HomeAssistantPlugin.actions.perform_action import perform_const +from HomeAssistantPlugin.actions.perform_action.parameters import parameters_helper +from HomeAssistantPlugin.actions.perform_action.perform_settings import PerformActionSettings from GtkHelper.GenerativeUI.ComboRow import ComboRow from GtkHelper.GenerativeUI.ExpanderRow import ExpanderRow from src.backend.DeckManagement.InputIdentifier import Input from src.backend.PluginManager.EventAssigner import EventAssigner -from HomeAssistantPlugin.actions.perform_action import perform_const -from HomeAssistantPlugin.actions.perform_action.parameters import parameters_helper -from HomeAssistantPlugin.actions.perform_action.perform_settings import PerformActionSettings -from HomeAssistantPlugin.actions.cores.base_core.base_core import BaseCore, requires_initialization class PerformAction(BaseCore): """Action to be loaded by StreamController.""" def __init__(self, *args, **kwargs): + # Must be set before create_ui_elements in BaseCore is called + self.action_combo = None + self.parameters_expander = None super().__init__(settings_implementation=PerformActionSettings, track_entity=False, *args, **kwargs) def on_ready(self) -> None: @@ -59,20 +63,21 @@ def _create_event_assigner(self) -> None: callback=self._perform_action )) - def get_config_rows(self) -> List: + def get_config_rows(self) -> list: """Get the rows to be displayed in the UI.""" return [self.domain_combo.widget, self.action_combo.widget, self.entity_combo.widget, self.parameters_expander.widget] - def _create_ui_elements(self) -> None: + def create_ui_elements(self) -> None: """Get all action rows.""" - super()._create_ui_elements() + super().create_ui_elements() self.action_combo: ComboRow = ComboRow( self, perform_const.SETTING_ACTION_ACTION, perform_const.EMPTY_STRING, [], perform_const.LABEL_SERVICE_SERVICE, enable_search=True, on_change=self._on_change_action, can_reset=False, complex_var_name=True ) + set_substring_search(self.action_combo) self.parameters_expander: ExpanderRow = ExpanderRow( self, perform_const.EMPTY_STRING, False, @@ -81,18 +86,18 @@ def _create_ui_elements(self) -> None: ) @requires_initialization - def _on_change_domain(self, _, domain, old_domain): + def on_change_domain(self, _, domain, old_domain): """Execute when the domain is changed.""" - super()._on_change_domain(_, domain, old_domain) + super().on_change_domain(_, domain, old_domain) domain = str(domain) if domain is not None else None if domain: self._load_actions() - self._set_enabled_disabled() + self.set_enabled_disabled() @requires_initialization - def _on_change_entity(self, _, entity, old_entity): + def on_change_entity(self, _, entity, old_entity): """Execute when the entity is changed.""" entity = str(entity) if entity is not None else None old_entity = str(old_entity) if old_entity is not None else None @@ -100,7 +105,7 @@ def _on_change_entity(self, _, entity, old_entity): if old_entity == entity: return - super()._on_change_entity(_, entity, old_entity) + super().on_change_entity(_, entity, old_entity) if entity: parameters_helper.load_parameters(self) @@ -131,7 +136,7 @@ def _load_actions(self) -> None: parameters_helper.load_parameters(self) @requires_initialization - def _set_enabled_disabled(self) -> None: + def set_enabled_disabled(self) -> None: """ Set the active/inactive state for all rows. """ @@ -169,6 +174,6 @@ def _set_enabled_disabled(self) -> None: self.entity_combo.widget.set_sensitive(has_target) @requires_initialization - def _get_domains(self) -> List[str]: + def _get_domains(self) -> list[str]: """This class needs all domains that provide actions in Home Assistant.""" return self.plugin_base.backend.get_domains_for_actions() diff --git a/actions/perform_action/perform_settings.py b/actions/perform_action/perform_settings.py index b1f10e9..a8c24b6 100644 --- a/actions/perform_action/perform_settings.py +++ b/actions/perform_action/perform_settings.py @@ -1,9 +1,7 @@ """Module to manage action settings.""" -from typing import Dict - -from HomeAssistantPlugin.actions.perform_action import perform_const from HomeAssistantPlugin.actions.cores.base_core.base_settings import BaseSettings +from HomeAssistantPlugin.actions.perform_action import perform_const DEFAULT_SETTINGS = { perform_const.SETTING_ACTION: perform_const.EMPTY_STRING, @@ -32,7 +30,7 @@ def get_action(self) -> str: """ return self._action.get_settings()[perform_const.SETTING_ACTION][perform_const.SETTING_ACTION] - def get_parameters(self) -> Dict: + def get_parameters(self) -> dict: """ Retrieve all action parameters. :return: all action parameters diff --git a/actions/show_icon/__init__.py b/actions/show_icon/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/actions/show_icon/icon_action.py b/actions/show_icon/icon_action.py index 2e116bc..3a2fdb6 100644 --- a/actions/show_icon/icon_action.py +++ b/actions/show_icon/icon_action.py @@ -2,35 +2,40 @@ The module for the Home Assistant action that is loaded in StreamController. """ -from typing import List - -from GtkHelper.GenerativeUI.ColorButtonRow import ColorButtonRow -from GtkHelper.GenerativeUI.EntryRow import EntryRow -from GtkHelper.GenerativeUI.ScaleRow import ScaleRow from HomeAssistantPlugin.actions.cores.base_core.base_core import requires_initialization from HomeAssistantPlugin.actions.cores.customization_core.customization_core import CustomizationCore from HomeAssistantPlugin.actions.show_icon import icon_const, icon_helper from HomeAssistantPlugin.actions.show_icon.icon_customization import IconCustomization from HomeAssistantPlugin.actions.show_icon.icon_row import IconRow -from HomeAssistantPlugin.actions.show_icon.icon_window import IconWindow from HomeAssistantPlugin.actions.show_icon.icon_settings import ShowIconSettings +from HomeAssistantPlugin.actions.show_icon.icon_window import IconWindow + +from GtkHelper.GenerativeUI.ColorButtonRow import ColorButtonRow +from GtkHelper.GenerativeUI.EntryRow import EntryRow +from GtkHelper.GenerativeUI.ScaleRow import ScaleRow class ShowIcon(CustomizationCore): """Action to be loaded by StreamController.""" def __init__(self, *args, **kwargs): + # Must be set before create_ui_elements in BaseCore is called + self.icon = None + self.color = None + self.scale = None + self.opacity = None super().__init__(window_implementation=IconWindow, customization_implementation=IconCustomization, - row_implementation=IconRow, settings_implementation=ShowIconSettings, track_entity=True, *args, **kwargs) + row_implementation=IconRow, settings_implementation=ShowIconSettings, track_entity=True, *args, + **kwargs) - def get_config_rows(self) -> List: + def get_config_rows(self) -> list: """Get the rows to be displayed in the UI.""" return [self.domain_combo.widget, self.entity_combo.widget, self.icon.widget, self.color.widget, self.scale.widget, self.opacity.widget, self.customization_expander.widget] - def _create_ui_elements(self) -> None: + def create_ui_elements(self) -> None: """Get all action rows.""" - super()._create_ui_elements() + super().create_ui_elements() self.icon: EntryRow = EntryRow( self, icon_const.SETTING_ICON_ICON, icon_const.EMPTY_STRING, @@ -59,11 +64,11 @@ def _create_ui_elements(self) -> None: ) @requires_initialization - def _set_enabled_disabled(self) -> None: + def set_enabled_disabled(self) -> None: """ Set the active/inactive state for all rows. """ - super()._set_enabled_disabled() + super().set_enabled_disabled() domain = self.settings.get_domain() is_domain_set = bool(domain) @@ -116,8 +121,8 @@ def refresh(self, state: dict = None) -> None: self.set_media(media_path=icon, size=scale) self._load_customizations() - self._set_enabled_disabled() + self.set_enabled_disabled() - def _get_domains(self) -> List[str]: + def _get_domains(self) -> list[str]: """This class needs all domains that provide actions in Home Assistant.""" return self.plugin_base.backend.get_domains_for_entities() diff --git a/actions/show_icon/icon_customization.py b/actions/show_icon/icon_customization.py index e760dc4..93ec74f 100644 --- a/actions/show_icon/icon_customization.py +++ b/actions/show_icon/icon_customization.py @@ -2,7 +2,7 @@ Modul to manage icon customizations. """ -from typing import Tuple, Dict, Any +from typing import Any from HomeAssistantPlugin.actions.cores.customization_core import customization_const from HomeAssistantPlugin.actions.cores.customization_core.customization import Customization @@ -14,11 +14,11 @@ class IconCustomization(Customization): Class to represent an icon customization. """ - def __init__(self, attribute: str, operator: str, value: str, icon: str, color: Tuple[int, int, int, int], + def __init__(self, attribute: str, operator: str, value: str, icon: str, color: tuple[int, int, int, int], scale: int, opacity: int): super().__init__(attribute, operator, value) self.icon: str = icon - self.color: Tuple[int, int, int, int] = color + self.color: tuple[int, int, int, int] = color self.scale: int = scale self.opacity: int = opacity @@ -37,7 +37,7 @@ def get_icon(self) -> str: """ return self.icon - def get_color(self) -> Tuple[int, int, int, int]: + def get_color(self) -> tuple[int, int, int, int]: """ Get the icon color. :return:the icon color @@ -58,7 +58,7 @@ def get_opacity(self) -> int: """ return self.opacity - def export(self) -> Dict[str, Any]: + def export(self) -> dict[str, Any]: """ Get this customization as a dict. :return: this customization as a dict diff --git a/actions/show_icon/icon_helper.py b/actions/show_icon/icon_helper.py index 1f6a6d4..d052add 100644 --- a/actions/show_icon/icon_helper.py +++ b/actions/show_icon/icon_helper.py @@ -5,27 +5,26 @@ import json import logging import os -from typing import Dict, List from HomeAssistantPlugin.actions.cores.customization_core import customization_helper -from HomeAssistantPlugin.actions.show_icon.icon_customization import IconCustomization from HomeAssistantPlugin.actions.show_icon import icon_const +from HomeAssistantPlugin.actions.show_icon.icon_customization import IconCustomization from HomeAssistantPlugin.actions.show_icon.icon_settings import ShowIconSettings MDI_FILENAME = os.path.join(os.path.dirname(os.path.abspath(__file__)), "../..", icon_const.MDI_SVG_JSON) with open(MDI_FILENAME, "r", encoding="utf-8") as f: - MDI_ICONS: Dict[str, str] = json.loads(f.read()) + MDI_ICONS: dict[str, str] = json.loads(f.read()) -def get_icon(state: Dict, settings: ShowIconSettings, is_connected: bool) -> (str, float): +def get_icon(state: dict, settings: ShowIconSettings, is_connected: bool) -> tuple[str, float]: """ Get the item corresponding to the given state. """ if not is_connected: return (_get_icon_svg(icon_const.ICON_NETWORK_OFF).replace("", - icon_const.ICON_COLOR_RED).replace( + icon_const.ICON_COLOR_RED).replace( "", "1.0")), round(icon_const.DEFAULT_ICON_SCALE / 100, 2) name, color, scale, opacity = _get_icon_settings(state, settings) @@ -38,7 +37,7 @@ def get_icon(state: Dict, settings: ShowIconSettings, is_connected: bool) -> (st return (icon.replace("", color).replace("", str(opacity))), scale -def _get_icon_settings(state: Dict, settings: ShowIconSettings) -> (str, str, str, str): +def _get_icon_settings(state: dict, settings: ShowIconSettings) -> tuple[str, str, float, float]: # default value for the icon is the icon set in HA name = state.get(icon_const.ATTRIBUTES, {}).get(icon_const.ATTRIBUTE_ICON, icon_const.EMPTY_STRING) color = settings.get_color() @@ -52,7 +51,7 @@ def _get_icon_settings(state: Dict, settings: ShowIconSettings) -> (str, str, st # Begin custom icon # - customizations: List[IconCustomization] = settings.get_customizations() + customizations: list[IconCustomization] = settings.get_customizations() for customization in customizations: value = get_value(state, customization) @@ -101,7 +100,7 @@ def _get_icon_settings(state: Dict, settings: ShowIconSettings) -> (str, str, st return name, color, scale, opacity -def get_value(state: Dict, customization: IconCustomization): +def get_value(state: dict, customization: IconCustomization): """ Gets the current value that the customization references. """ diff --git a/actions/show_icon/icon_row.py b/actions/show_icon/icon_row.py index ca03f30..3b42b24 100644 --- a/actions/show_icon/icon_row.py +++ b/actions/show_icon/icon_row.py @@ -1,8 +1,6 @@ """ The module for the Home Assistant customization row. """ -from typing import List, Dict - from HomeAssistantPlugin.actions.cores.customization_core import customization_helper from HomeAssistantPlugin.actions.cores.customization_core.customization_row import CustomizationRow from HomeAssistantPlugin.actions.cores.customization_core.customization_settings import CustomizationSettings @@ -15,8 +13,8 @@ class IconRow(CustomizationRow): Base for customization icon rows """ - def __init__(self, lm, customization: IconCustomization, customization_count: int, index: int, attributes: List, - state: Dict, settings: CustomizationSettings): + def __init__(self, lm, customization: IconCustomization, customization_count: int, index: int, attributes: list, + state: dict, settings: CustomizationSettings): super().__init__(lm, customization_count, index, attributes, state, settings) current_value = icon_helper.get_value(state, customization) diff --git a/actions/show_icon/icon_settings.py b/actions/show_icon/icon_settings.py index 622868e..68304d1 100644 --- a/actions/show_icon/icon_settings.py +++ b/actions/show_icon/icon_settings.py @@ -1,7 +1,5 @@ """Module to manage action settings.""" -from typing import Tuple - from HomeAssistantPlugin.actions.cores.customization_core import customization_const from HomeAssistantPlugin.actions.cores.customization_core.customization_settings import CustomizationSettings from HomeAssistantPlugin.actions.show_icon import icon_const @@ -37,7 +35,7 @@ def get_icon(self) -> str: """ return self._action.get_settings()[icon_const.SETTING_ICON][icon_const.SETTING_ICON] - def get_color(self) -> Tuple[int, int, int, int]: + def get_color(self) -> tuple[int, int, int, int]: """ Get the color. :return: the color diff --git a/actions/show_icon/icon_window.py b/actions/show_icon/icon_window.py index 6282abb..c4b8215 100644 --- a/actions/show_icon/icon_window.py +++ b/actions/show_icon/icon_window.py @@ -3,7 +3,7 @@ """ from functools import partial -from typing import Callable, List +from typing import Callable from HomeAssistantPlugin.actions import const as base_const from HomeAssistantPlugin.actions.cores.customization_core import customization_helper @@ -17,11 +17,11 @@ class IconWindow(CustomizationWindow): Window to customize icons. """ - def __init__(self, lm, attributes: List, callback: Callable, + def __init__(self, lm, attributes: list, callback: Callable, current: IconCustomization = None, index: int = None): super().__init__(lm, attributes, callback, current, index) - self.icons: List[str] = list(icon_helper.MDI_ICONS) + self.icons: list[str] = list(icon_helper.MDI_ICONS) self.set_title(lm.get(icon_const.CUSTOMIZATION_WINDOW_TITLE)) @@ -38,7 +38,7 @@ def __init__(self, lm, attributes: List, callback: Callable, self.icon = self._create_entry(self.check_icon) self.icon.set_margin_end(self.default_margin) self.connect_rows.append( - partial(self.icon.connect, base_const.CONNECT_ACTIVATE, self._on_widget_changed)) + partial(self.icon.connect, base_const.CONNECT_ACTIVATE, self.on_widget_changed)) self.color = self._create_color_button(self.check_color) @@ -92,8 +92,8 @@ def __init__(self, lm, attributes: List, callback: Callable, self._after_init() - def _set_default_values(self) -> None: - super()._set_default_values() + def set_default_values(self) -> None: + super().set_default_values() rgba = customization_helper.convert_color_list_to_rgba(icon_const.DEFAULT_ICON_COLOR) self.color.set_rgba(rgba) @@ -104,11 +104,11 @@ def _set_default_values(self) -> None: self.opacity.set_value(icon_const.DEFAULT_ICON_OPACITY) self.opacity_entry.set_text(str(icon_const.DEFAULT_ICON_OPACITY)) - def _set_current_values(self) -> None: + def set_current_values(self) -> None: if not self.current: return - super()._set_current_values() + super().set_current_values() self.icon.set_text(self.current.get_icon() or icon_const.EMPTY_STRING) self.check_icon.set_active(self.current.get_icon() is not None) @@ -130,7 +130,7 @@ def _set_current_values(self) -> None: self.opacity_entry.set_text( str(int(self.current.get_opacity() or icon_const.DEFAULT_ICON_OPACITY))) - def on_add_button(self, *args, **kwargs) -> None: + def on_add_button(self, *_, **__) -> None: if not super().on_add_button(): return @@ -167,8 +167,8 @@ def on_add_button(self, *args, **kwargs) -> None: self.destroy() - def _on_widget_changed(self, *args, **kwargs) -> None: - super()._on_widget_changed() + def on_widget_changed(self, *_, **__) -> None: + super().on_widget_changed() self.icon.remove_css_class(icon_const.ERROR) self.check_icon.remove_css_class(icon_const.ERROR) diff --git a/actions/show_text/__init__.py b/actions/show_text/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/actions/show_text/text_action.py b/actions/show_text/text_action.py index bb8ab4d..b62851b 100644 --- a/actions/show_text/text_action.py +++ b/actions/show_text/text_action.py @@ -2,13 +2,7 @@ The module for the Home Assistant action that is loaded in StreamController. """ from collections import Counter -from typing import List -from GtkHelper.GenerativeUI.ColorButtonRow import ColorButtonRow -from GtkHelper.GenerativeUI.ComboRow import ComboRow -from GtkHelper.GenerativeUI.ExpanderRow import ExpanderRow -from GtkHelper.GenerativeUI.ScaleRow import ScaleRow -from GtkHelper.GenerativeUI.SwitchRow import SwitchRow from HomeAssistantPlugin.actions.cores.base_core.base_core import requires_initialization from HomeAssistantPlugin.actions.cores.customization_core import customization_const from HomeAssistantPlugin.actions.cores.customization_core.customization_core import CustomizationCore @@ -19,24 +13,42 @@ from HomeAssistantPlugin.actions.show_text.text_settings import ShowTextSettings from HomeAssistantPlugin.actions.show_text.text_window import TextWindow +from GtkHelper.GenerativeUI.ColorButtonRow import ColorButtonRow +from GtkHelper.GenerativeUI.ComboRow import ComboRow +from GtkHelper.GenerativeUI.ExpanderRow import ExpanderRow +from GtkHelper.GenerativeUI.ScaleRow import ScaleRow +from GtkHelper.GenerativeUI.SwitchRow import SwitchRow + class ShowText(CustomizationCore): """Action to be loaded by StreamController.""" def __init__(self, *args, **kwargs): + # Must be set before create_ui_elements in BaseCore is called + self.position = None + self.attribute = None + self.round = None + self.round_precision = None + self.text_size = None + self.text_color = None + self.outline_size = None + self.outline_color = None + self.show_unit = None + self.unit_line_break = None super().__init__(window_implementation=TextWindow, customization_implementation=TextCustomization, - row_implementation=TextRow, settings_implementation=ShowTextSettings, track_entity=True, *args, **kwargs) + row_implementation=TextRow, settings_implementation=ShowTextSettings, track_entity=True, *args, + **kwargs) - def get_config_rows(self) -> List: + def get_config_rows(self) -> list: """Get the rows to be displayed in the UI.""" return [self.domain_combo.widget, self.entity_combo.widget, self.position.widget, self.attribute.widget, self.round.widget, self.text_size.widget, self.text_color.widget, self.outline_size.widget, self.outline_color.widget, self.show_unit.widget, self.unit_line_break.widget, self.customization_expander.widget] - def _create_ui_elements(self) -> None: + def create_ui_elements(self) -> None: """Get all action rows.""" - super()._create_ui_elements() + super().create_ui_elements() # Text position text_position_model = [ @@ -118,11 +130,11 @@ def _create_ui_elements(self) -> None: ) @requires_initialization - def _set_enabled_disabled(self) -> None: + def set_enabled_disabled(self) -> None: """ Set the active/inactive state for all rows. """ - super()._set_enabled_disabled() + super().set_enabled_disabled() domain = self.settings.get_domain() is_domain_set = bool(domain) @@ -208,9 +220,9 @@ def _set_enabled_disabled(self) -> None: self.unit_line_break.widget.set_sensitive(False) @requires_initialization - def _on_change_entity(self, _, entity, old_entity): + def on_change_entity(self, _, entity, old_entity): self._load_attributes() - super()._on_change_entity(_, entity, old_entity) + super().on_change_entity(_, entity, old_entity) def _load_attributes(self): attribute = self.settings.get_attribute() @@ -220,7 +232,7 @@ def _load_attributes(self): if Counter(attributes) != Counter(self._get_current_attributes()): self.attribute.populate(attributes, attribute, trigger_callback=False) - def _get_current_attributes(self) -> List[str]: + def _get_current_attributes(self) -> list[str]: """ Gets the list of attributes set on the Combo as strings. :return: the list of attributes set on the Combo as strings @@ -270,8 +282,8 @@ def refresh(self, state: dict = None) -> None: ) self._load_customizations() - self._set_enabled_disabled() + self.set_enabled_disabled() - def _get_domains(self) -> List[str]: + def _get_domains(self) -> list[str]: """This class needs all domains that provide actions in Home Assistant.""" return self.plugin_base.backend.get_domains_for_entities() diff --git a/actions/show_text/text_customization.py b/actions/show_text/text_customization.py index 88ffa51..1f6b92d 100644 --- a/actions/show_text/text_customization.py +++ b/actions/show_text/text_customization.py @@ -2,20 +2,21 @@ Modul to manage text customizations. """ -from typing import Tuple, Dict, Any +from typing import Any -from HomeAssistantPlugin.actions.show_text import text_const from HomeAssistantPlugin.actions.cores.customization_core import customization_const from HomeAssistantPlugin.actions.cores.customization_core.customization import Customization +from HomeAssistantPlugin.actions.show_text import text_const class TextCustomization(Customization): """ Class to represent a text customization. """ + def __init__(self, attribute: str, operator: str, value: str, position: str, text_attribute: str, custom_text: str, - do_round: bool, round_precision: int, text_size: int, text_color: Tuple[int, int, int, int], - outline_size: int, outline_color: Tuple[int, int, int, int], show_unit: bool, line_break: bool): + do_round: bool, round_precision: int, text_size: int, text_color: tuple[int, int, int, int], + outline_size: int, outline_color: tuple[int, int, int, int], show_unit: bool, line_break: bool): super().__init__(attribute, operator, value) self.position: str = position self.text_attribute: str = text_attribute @@ -23,9 +24,9 @@ def __init__(self, attribute: str, operator: str, value: str, position: str, tex self.round: bool = do_round self.round_precision: int = round_precision self.text_size: int = text_size - self.text_color: Tuple[int, int, int, int] = text_color + self.text_color: tuple[int, int, int, int] = text_color self.outline_size: int = outline_size - self.outline_color: Tuple[int, int, int, int] = outline_color + self.outline_color: tuple[int, int, int, int] = outline_color self.show_unit: bool = show_unit self.line_break: bool = line_break @@ -88,7 +89,7 @@ def get_text_size(self) -> int: """ return self.text_size - def get_text_color(self) -> Tuple[int, int, int, int]: + def get_text_color(self) -> tuple[int, int, int, int]: """ Get the text color. :return: the text color @@ -102,7 +103,7 @@ def get_outline_size(self) -> int: """ return self.outline_size - def get_outline_color(self) -> Tuple[int, int, int, int]: + def get_outline_color(self) -> tuple[int, int, int, int]: """ Get the text outline color. :return: the text outline color @@ -123,7 +124,7 @@ def get_line_break(self) -> bool: """ return self.line_break - def export(self) -> Dict[str, Any]: + def export(self) -> dict[str, Any]: """ Get this customization as a dict. :return: this customization as a dict diff --git a/actions/show_text/text_helper.py b/actions/show_text/text_helper.py index 8d9f665..773e337 100644 --- a/actions/show_text/text_helper.py +++ b/actions/show_text/text_helper.py @@ -2,7 +2,7 @@ Module for text related operations. """ import logging as log -from typing import Dict, List, Any +from typing import Any from HomeAssistantPlugin.actions.cores.customization_core import customization_const from HomeAssistantPlugin.actions.show_text import text_const @@ -10,7 +10,7 @@ from HomeAssistantPlugin.actions.show_text.text_settings import ShowTextSettings -def get_text(state: Dict, settings: ShowTextSettings, is_connected: bool) -> (str, str, int, str, int, str): +def get_text(state: dict, settings: ShowTextSettings, is_connected: bool) -> tuple[str, str, int, str, int, str]: """ Determine text, position and font size to show on StreamDeck. """ @@ -35,7 +35,7 @@ def get_text(state: Dict, settings: ShowTextSettings, is_connected: bool) -> (st # Begin custom text # - customizations: List[TextCustomization] = settings.get_customizations() + customizations: list[TextCustomization] = settings.get_customizations() for customization in customizations: value = get_value(state, settings, customization) @@ -67,7 +67,7 @@ def get_text(state: Dict, settings: ShowTextSettings, is_connected: bool) -> (st custom_text_value = float(custom_text_value) except ValueError: log.error("Could not convert custom value to float: %s", - custom_text_value) + custom_text_value) continue if ((operator == "<" and value < custom_text_value) @@ -90,7 +90,7 @@ def get_text(state: Dict, settings: ShowTextSettings, is_connected: bool) -> (st return text, position, text_size, text_color, outline_size, outline_color -def get_value(state: Dict, settings: ShowTextSettings, customization: TextCustomization) -> Any: +def get_value(state: dict, settings: ShowTextSettings, customization: TextCustomization) -> Any: """ Gets the current value that the customization references. """ @@ -113,14 +113,14 @@ def get_value(state: Dict, settings: ShowTextSettings, customization: TextCustom return value -def _get_text(state: Dict, attribute: str, text_round: bool, round_precision: int, show_unit: bool, +def _get_text(state: dict, attribute: str, text_round: bool, round_precision: int, show_unit: bool, line_break: bool) -> str: if attribute == text_const.STATE: text = _round_value(str(state.get(text_const.STATE)), text_round, round_precision) if show_unit: unit = state.get(customization_const.ATTRIBUTES, {}).get(customization_const.UNIT_OF_MEASUREMENT, - text_const.EMPTY_STRING) + text_const.EMPTY_STRING) if line_break: text = f"{text}\n{unit}" @@ -135,8 +135,8 @@ def _get_text(state: Dict, attribute: str, text_round: bool, round_precision: in def _replace_values(text: str, position: str, attribute: str, text_round: bool, round_precision: int, - text_size: int, text_color: List[int], outline_size: int, - outline_color: List[int], show_unit: bool, line_break: bool, + text_size: int, text_color: list[int], outline_size: int, + outline_color: list[int], show_unit: bool, line_break: bool, customization: TextCustomization): ret_text = text ret_position = position diff --git a/actions/show_text/text_row.py b/actions/show_text/text_row.py index 1f2006b..22d6a70 100644 --- a/actions/show_text/text_row.py +++ b/actions/show_text/text_row.py @@ -1,8 +1,6 @@ """ The module for the Home Assistant customization row. """ -from typing import List, Dict - from HomeAssistantPlugin.actions.cores.customization_core import customization_helper from HomeAssistantPlugin.actions.cores.customization_core.customization_row import CustomizationRow from HomeAssistantPlugin.actions.show_text import text_helper, text_const @@ -15,8 +13,8 @@ class TextRow(CustomizationRow): Base for customization icon rows """ - def __init__(self, lm, customization: TextCustomization, customization_count: int, index: int, attributes: List, - state: Dict, settings: ShowTextSettings): + def __init__(self, lm, customization: TextCustomization, customization_count: int, index: int, attributes: list, + state: dict, settings: ShowTextSettings): super().__init__(lm, customization_count, index, attributes, state, settings) current_value = text_helper.get_value(state, settings, customization) diff --git a/actions/show_text/text_settings.py b/actions/show_text/text_settings.py index ed48c00..e35e520 100644 --- a/actions/show_text/text_settings.py +++ b/actions/show_text/text_settings.py @@ -1,11 +1,9 @@ """Module to manage action settings.""" -from typing import Tuple - -from HomeAssistantPlugin.actions.show_text.text_customization import TextCustomization -from HomeAssistantPlugin.actions.show_text import text_const from HomeAssistantPlugin.actions.cores.customization_core import customization_const from HomeAssistantPlugin.actions.cores.customization_core.customization_settings import CustomizationSettings +from HomeAssistantPlugin.actions.show_text import text_const +from HomeAssistantPlugin.actions.show_text.text_customization import TextCustomization DEFAULT_SETTINGS = { text_const.SETTING_POSITION: text_const.DEFAULT_POSITION, @@ -71,7 +69,7 @@ def get_text_size(self) -> int: """ return int(self._action.get_settings()[text_const.SETTING_TEXT][text_const.SETTING_TEXT_SIZE]) - def get_text_color(self) -> Tuple[int, int, int, int]: + def get_text_color(self) -> tuple[int, int, int, int]: """ Get the text color. :return: the text color @@ -85,7 +83,7 @@ def get_outline_size(self) -> int: """ return int(self._action.get_settings()[text_const.SETTING_TEXT][text_const.SETTING_OUTLINE_SIZE]) - def get_outline_color(self) -> Tuple[int, int, int, int]: + def get_outline_color(self) -> tuple[int, int, int, int]: """ Get the outline color. :return: the outline color diff --git a/actions/show_text/text_window.py b/actions/show_text/text_window.py index b0303c5..1a1e6c4 100644 --- a/actions/show_text/text_window.py +++ b/actions/show_text/text_window.py @@ -3,15 +3,14 @@ """ from functools import partial -from typing import Callable, List - -from gi.repository.Gtk import StringObject +from typing import Callable from HomeAssistantPlugin.actions import const as base_const from HomeAssistantPlugin.actions.cores.customization_core import customization_helper from HomeAssistantPlugin.actions.cores.customization_core.customization_window import CustomizationWindow from HomeAssistantPlugin.actions.show_text import text_const from HomeAssistantPlugin.actions.show_text.text_customization import TextCustomization +from gi.repository.Gtk import StringObject class TextWindow(CustomizationWindow): @@ -19,7 +18,7 @@ class TextWindow(CustomizationWindow): Window to customize text. """ - def __init__(self, lm, attributes: List, callback: Callable, + def __init__(self, lm, attributes: list, callback: Callable, current: TextCustomization = None, index: int = None): # add text_length to attributes attributes.insert(0, text_const.CUSTOM_TEXT_LENGTH) @@ -181,12 +180,12 @@ def __init__(self, lm, attributes: List, callback: Callable, self._after_init() - def _on_change_attribute(self, *args, **kwargs) -> None: + def _on_change_attribute(self, *_, **__) -> None: custom_text_visible = self.attribute.get_selected_item().get_string() == text_const.CUSTOM_CUSTOM_TEXT self.custom_text.set_visible(custom_text_visible) - def _set_default_values(self) -> None: - super()._set_default_values() + def set_default_values(self) -> None: + super().set_default_values() for index, entry in enumerate(self.position.get_model()): if entry.get_string() == text_const.DEFAULT_POSITION: @@ -219,11 +218,11 @@ def _set_default_values(self) -> None: self.show_line_break.set_active(text_const.DEFAULT_UNIT_LINE_BREAK) - def _set_current_values(self) -> None: + def set_current_values(self) -> None: if not self.current: return - super()._set_current_values() + super().set_current_values() for index, entry in enumerate(self.position.get_model()): if entry.get_string() == self.current.get_position(): @@ -282,7 +281,7 @@ def _set_current_values(self) -> None: self.current.get_line_break() or text_const.DEFAULT_UNIT_LINE_BREAK) self.check_line_break.set_active(self.current.get_line_break() is not None) - def on_add_button(self, *args, **kwargs) -> None: + def on_add_button(self, *_, **__) -> None: if not super().on_add_button(): return @@ -359,8 +358,8 @@ def on_add_button(self, *args, **kwargs) -> None: self.destroy() - def _on_widget_changed(self, *args, **kwargs): - super()._on_widget_changed() + def on_widget_changed(self, *_, **__): + super().on_widget_changed() self.check_position.remove_css_class(text_const.ERROR) self.position.remove_css_class(text_const.ERROR) diff --git a/backend/home_assistant_backend.py b/backend/home_assistant_backend.py index 2dbfb7a..bae16fb 100644 --- a/backend/home_assistant_backend.py +++ b/backend/home_assistant_backend.py @@ -4,13 +4,13 @@ from threading import Thread from time import sleep -from typing import Dict, Callable, Any, List, Set, Optional +from typing import Callable, Any, Optional +from HomeAssistantPlugin.backend import backend_const +from HomeAssistantPlugin.backend.home_assistant_websocket import HomeAssistantWebsocket from gi.repository import GLib from loguru import logger as log -from HomeAssistantPlugin.backend import backend_const -from HomeAssistantPlugin.backend.home_assistant_websocket import HomeAssistantWebsocket class HomeAssistantBackend: """ @@ -19,12 +19,12 @@ class HomeAssistantBackend: def __init__(self, host: str, port: str, ssl: bool, verify_certificate: bool, token: str): self._websocket: Optional[HomeAssistantWebsocket] = None - self._entities: Dict[str, Dict[str, Any]] = {} - self._actions: Dict[str, Dict[str, Any]] = {} + self._entities: dict[str, dict[str, Any]] = {} + self._actions: dict[str, dict[str, Any]] = {} self._connection_status_callback: Callable = lambda _1, _2=None: None self._keep_alive_thread: Optional[Thread] = None self._retry_connect_thread: Optional[Thread] = None - self._action_ready_callbacks: Set[Callable] = set() + self._action_ready_callbacks: set[Callable] = set() self._host: str = backend_const.EMPTY_STRING self.set_host(host) @@ -119,7 +119,7 @@ def _on_connect(self) -> None: for ready in self._action_ready_callbacks: GLib.idle_add(ready) - def _on_event_message(self, message: Dict) -> None: + def _on_event_message(self, message: dict) -> None: new_state = ( message .get(backend_const.FIELD_EVENT, {}) @@ -180,7 +180,7 @@ def _on_disconnect(self, websocket: HomeAssistantWebsocket) -> None: # the websocket instance is still the same, so we can try to reconnect self.connect() - def get_domains_for_entities(self) -> List[str]: + def get_domains_for_entities(self) -> list[str]: """Get a list of all domains known to Home Assistant.""" if self._entities: return list(self._entities.keys()) @@ -189,7 +189,7 @@ def get_domains_for_entities(self) -> List[str]: self._load_entities() return list(self._entities.keys()) - def get_domains_for_actions(self) -> List[str]: + def get_domains_for_actions(self) -> list[str]: """Get a list of all domains known to Home Assistant.""" if self._actions: return list(self._actions.keys()) @@ -198,7 +198,7 @@ def get_domains_for_actions(self) -> List[str]: self._load_actions() return list(self._actions.keys()) - def get_entity(self, entity_id: str) -> Dict[str, Any]: + def get_entity(self, entity_id: str) -> dict[str, Any]: """Return the entity state with the requested name.""" entity_fallback_dict = { backend_const.STATE: backend_const.NA, @@ -222,9 +222,9 @@ def _load_entities(self) -> None: self._entities = {} return - states: List[Dict] = result + states: list[dict] = result - entities: Dict[str, Dict[str, Any]] = {} + entities: dict[str, dict[str, Any]] = {} for entity in states: entity_id = entity.get(backend_const.ENTITY_ID) @@ -242,14 +242,15 @@ def _load_entities(self) -> None: for domain, domain_entry in self._entities.items(): for entity_id in domain_entry.keys(): if entities.get(domain, {}).get(entity_id): - entities[domain][entity_id][backend_const.ACTIONS] = domain_entry[entity_id].get(backend_const.ACTIONS, set()) + entities[domain][entity_id][backend_const.ACTIONS] = domain_entry[entity_id].get( + backend_const.ACTIONS, set()) entities[domain][entity_id][backend_const.SUBSCRIPTION_ID] = domain_entry[ entity_id ].get(backend_const.SUBSCRIPTION_ID, -1) self._entities = entities - def get_entities(self, domain: str) -> List[str]: + def get_entities(self, domain: str) -> list[str]: """Return a list of all entities known to Home Assistant.""" if not domain: return [] @@ -268,7 +269,7 @@ def _load_actions(self) -> None: self._actions = result - def get_actions(self, domain: str) -> Dict[str, Dict[str, Any]]: + def get_actions(self, domain: str) -> dict[str, dict[str, Any]]: """Return all actions known to Home Assistant for the domain.""" if not self._actions: self._load_actions() @@ -277,7 +278,7 @@ def get_actions(self, domain: str) -> Dict[str, Dict[str, Any]]: return self._actions.get(domain, {}) def perform_action( - self, domain: str, service: str, entity_id: Optional[str], data: Optional[Dict[str, Any]] = None + self, domain: str, service: str, entity_id: Optional[str], data: Optional[dict[str, Any]] = None ) -> None: """Calls a Home Assistant service.""" if not self.is_connected(): @@ -300,7 +301,7 @@ def remove_action_ready_callback(self, on_ready: Callable) -> None: self._action_ready_callbacks.remove(on_ready) def add_tracked_entity( - self, entity_id: str, action_entity_updated: Callable + self, entity_id: str, action_entity_updated: Callable ) -> None: """Register an entity with the Home Assistant websocket to be notified when the entity is updated.""" if not entity_id: @@ -329,7 +330,8 @@ def add_tracked_entity( return message = self._websocket.create_message(backend_const.SUBSCRIBE_TRIGGER) - message[backend_const.TRIGGER] = {backend_const.PLATFORM: backend_const.STATE, backend_const.ENTITY_ID: entity_id} + message[backend_const.TRIGGER] = {backend_const.PLATFORM: backend_const.STATE, + backend_const.ENTITY_ID: entity_id} self._websocket.send(message) entity_settings[backend_const.SUBSCRIPTION_ID] = message[backend_const.ID] diff --git a/backend/home_assistant_websocket.py b/backend/home_assistant_websocket.py index e34ab73..602242e 100644 --- a/backend/home_assistant_websocket.py +++ b/backend/home_assistant_websocket.py @@ -4,7 +4,7 @@ from ssl import CERT_NONE, SSLEOFError from threading import Semaphore from time import sleep -from typing import Any, Callable, Dict, Tuple +from typing import Any, Callable from HomeAssistantPlugin.backend import backend_const from loguru import logger as log @@ -46,7 +46,8 @@ def run_forever(self) -> None: def _auth(self) -> None: """Authenticated with Home Assistant.""" - self.send({backend_const.FIELD_TYPE: backend_const.AUTH, backend_const.ACCESS_TOKEN: self._token}, check_connected=False) + self.send({backend_const.FIELD_TYPE: backend_const.AUTH, backend_const.ACCESS_TOKEN: self._token}, + check_connected=False) auth_ok = json.loads(self.sock.recv()).get(backend_const.FIELD_TYPE) if not auth_ok or auth_ok != backend_const.AUTH_OK: log.error(backend_const.AUTH_ERROR) @@ -85,7 +86,7 @@ def _on_message(self, _, message: str) -> None: self._auth() return - def send(self, message: Dict, check_connected: bool = True) -> None: + def send(self, message: dict, check_connected: bool = True) -> None: """Convert the Dict to a string and send it to Home Assistant.""" if check_connected and not self.connected: return @@ -94,7 +95,7 @@ def send(self, message: Dict, check_connected: bool = True) -> None: def send_and_recv( self, message: str, check_connected: bool = True - ) -> Tuple[bool, Any, Any]: + ) -> tuple[bool, Any, Any]: """Send a websocket message to Home Assistant and return the response.""" if check_connected and not self.connected: return False, backend_const.EMPTY_STRING, backend_const.EMPTY_STRING @@ -106,7 +107,7 @@ def send_and_recv( error = _get_field_from_message(response, backend_const.FIELD_ERROR) return success, result, error - def create_message(self, message_type: str) -> Dict[str, Any]: + def create_message(self, message_type: str) -> dict[str, Any]: """Create a message that can be sent to the Home Assistant websocket.""" self._message_id += 1 return {backend_const.ID: self._message_id, backend_const.FIELD_TYPE: message_type} diff --git a/test/actions/cores/base_core/test_base_core_create_event_assigner.py b/test/actions/cores/base_core/test_base_core_create_event_assigner.py index ebd1b84..af95af7 100644 --- a/test/actions/cores/base_core/test_base_core_create_event_assigner.py +++ b/test/actions/cores/base_core/test_base_core_create_event_assigner.py @@ -14,7 +14,7 @@ class TestBaseCoreCreateEventAssigner(unittest.TestCase): - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") def test_create_event_assigner_success(self, _): # This test checks if the _create_event_assigner method can be called without errors with patch.object(BaseCore, "_create_event_assigner"): diff --git a/test/actions/cores/base_core/test_base_core_create_ui_elements.py b/test/actions/cores/base_core/test_base_core_create_ui_elements.py index c3157ac..0864211 100644 --- a/test/actions/cores/base_core/test_base_core_create_ui_elements.py +++ b/test/actions/cores/base_core/test_base_core_create_ui_elements.py @@ -10,28 +10,58 @@ sys.path.insert(0, absolute_plugin_path) from HomeAssistantPlugin.actions import const -from HomeAssistantPlugin.actions.cores.base_core.base_core import BaseCore +from HomeAssistantPlugin.actions.cores.base_core.base_core import BaseCore, set_substring_search class TestBaseCoreCreateUiElements(unittest.TestCase): @patch.object(BaseCore, "_create_event_assigner") def test_create_ui_elements_success(self, _): - with patch.object(BaseCore, "_create_ui_elements"): - # _create_ui_elements is called in the constructor + with patch.object(BaseCore, "create_ui_elements"): + # create_ui_elements is called in the constructor instance = BaseCore(Mock(), False) - instance._create_ui_elements() + instance.create_ui_elements() self.assertEqual((instance, const.SETTING_ENTITY_DOMAIN, const.EMPTY_STRING, [], const.LABEL_ENTITY_DOMAIN), instance.domain_combo.args) self.assertEqual({"enable_search": True, - "on_change": instance._on_change_domain, "can_reset": False, + "on_change": instance.on_change_domain, "can_reset": False, "complex_var_name": True}, instance.domain_combo.kwargs) self.assertEqual((instance, const.SETTING_ENTITY_ENTITY, const.EMPTY_STRING, [], const.LABEL_ENTITY_ENTITY), instance.entity_combo.args) self.assertEqual({"enable_search": True, - "on_change": instance._on_change_entity, "can_reset": False, + "on_change": instance.on_change_entity, "can_reset": False, "complex_var_name": True}, instance.entity_combo.kwargs) + def test_set_substring_search_calls_set_search_match_mode_when_available(self): + """set_search_match_mode is called on the widget when the method is present.""" + widget_mock = Mock(spec=["set_search_match_mode"]) + combo_mock = Mock() + combo_mock.widget = widget_mock + + with patch("HomeAssistantPlugin.actions.cores.base_core.base_core.Gtk") as gtk_mock: + set_substring_search(combo_mock) + + widget_mock.set_search_match_mode.assert_called_once_with( + gtk_mock.StringFilterMatchMode.SUBSTRING + ) + + def test_set_substring_search_is_noop_when_method_not_available(self): + """No error is raised when set_search_match_mode is absent (older libadwaita).""" + widget_mock = Mock(spec=[]) # no set_search_match_mode + combo_mock = Mock() + combo_mock.widget = widget_mock + + set_substring_search(combo_mock) # must not raise + + self.assertFalse(hasattr(widget_mock, "set_search_match_mode")) + + def test_set_substring_search_is_noop_when_widget_raises(self): + """No error is raised when accessing the widget attribute fails.""" + from unittest.mock import PropertyMock + combo_mock = Mock() + type(combo_mock).widget = PropertyMock(side_effect=AttributeError()) + set_substring_search(combo_mock) # must not raise + diff --git a/test/actions/cores/base_core/test_base_core_get_config_rows.py b/test/actions/cores/base_core/test_base_core_get_config_rows.py index f66da8b..61c61aa 100644 --- a/test/actions/cores/base_core/test_base_core_get_config_rows.py +++ b/test/actions/cores/base_core/test_base_core_get_config_rows.py @@ -14,7 +14,7 @@ class TestBaseCoreGetConfigRows(unittest.TestCase): - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") def test_get_config_rows_success(self, _, __): instance = BaseCore(Mock(), True) diff --git a/test/actions/cores/base_core/test_base_core_get_domains.py b/test/actions/cores/base_core/test_base_core_get_domains.py index a31c97f..69c8ef7 100644 --- a/test/actions/cores/base_core/test_base_core_get_domains.py +++ b/test/actions/cores/base_core/test_base_core_get_domains.py @@ -14,7 +14,7 @@ class TestBaseCoreGetDomains(unittest.TestCase): - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") def test_get_domains_success(self, _, __): instance = BaseCore(Mock(), True) diff --git a/test/actions/cores/base_core/test_base_core_get_generative_ui.py b/test/actions/cores/base_core/test_base_core_get_generative_ui.py index 43e0557..8e71f23 100644 --- a/test/actions/cores/base_core/test_base_core_get_generative_ui.py +++ b/test/actions/cores/base_core/test_base_core_get_generative_ui.py @@ -14,7 +14,7 @@ class TestBaseCoreGetGenerativeUi(unittest.TestCase): - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") def test_get_generative_ui_success(self, _, __): instance = BaseCore(Mock(), True) diff --git a/test/actions/cores/base_core/test_base_core_init.py b/test/actions/cores/base_core/test_base_core_init.py index acb3d0a..5e4bea9 100644 --- a/test/actions/cores/base_core/test_base_core_init.py +++ b/test/actions/cores/base_core/test_base_core_init.py @@ -14,7 +14,7 @@ class TestBaseCoreInit(unittest.TestCase): - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") def test_init_success(self, create_event_assigner_mock, create_ui_elements_mock): track_entity = True diff --git a/test/actions/cores/base_core/test_base_core_load_domains.py b/test/actions/cores/base_core/test_base_core_load_domains.py index 37454ee..e120ed2 100644 --- a/test/actions/cores/base_core/test_base_core_load_domains.py +++ b/test/actions/cores/base_core/test_base_core_load_domains.py @@ -14,7 +14,7 @@ class TestBaseCoreLoadDomains(unittest.TestCase): - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") @patch.object(BaseCore, "_get_domains") def test_load_domains_domain_not_in_domains(self, get_domains_mock, _, __): @@ -42,7 +42,7 @@ def test_load_domains_domain_not_in_domains(self, get_domains_mock, _, __): get_domains_mock.assert_called_once() domain_combo_mock.populate.assert_called_once_with(domains_sorted, domain, trigger_callback=False) - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") @patch.object(BaseCore, "_get_domains") def test_load_domains_success(self, get_domains_mock, _, __): @@ -70,7 +70,7 @@ def test_load_domains_success(self, get_domains_mock, _, __): domain_combo_mock.populate.assert_called_once_with(domains_sorted, domain, trigger_callback=False) - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") @patch.object(BaseCore, "_get_domains") def test_load_domains_with_none_in_domains(self, get_domains_mock, _, __): @@ -95,7 +95,7 @@ def test_load_domains_with_none_in_domains(self, get_domains_mock, _, __): domain_combo_mock.populate.assert_called_once_with(domains_sorted, domain, trigger_callback=False) - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") @patch.object(BaseCore, "_get_domains") def test_load_domains_no_update_needed(self, get_domains_mock, _, __): diff --git a/test/actions/cores/base_core/test_base_core_load_entities.py b/test/actions/cores/base_core/test_base_core_load_entities.py index c202eeb..4656d93 100644 --- a/test/actions/cores/base_core/test_base_core_load_entities.py +++ b/test/actions/cores/base_core/test_base_core_load_entities.py @@ -14,7 +14,7 @@ class TestBaseCoreLoadEntities(unittest.TestCase): - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") def test_load_entities_entity_not_in_entities(self, _, __): domain = "light" @@ -46,7 +46,7 @@ def test_load_entities_entity_not_in_entities(self, _, __): instance.plugin_base.backend.get_entities.assert_called_once_with(domain) entity_combo_mock.populate.assert_called_once_with(entities_sorted, entity, trigger_callback=False) - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") def test_load_entities_success(self, _, __): domain = "light" @@ -78,7 +78,7 @@ def test_load_entities_success(self, _, __): entity_combo_mock.populate.assert_called_once_with(entities_sorted, entity, trigger_callback=False) - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") def test_load_entities_with_none_entity(self, _, __): domain = "light" @@ -106,7 +106,7 @@ def test_load_entities_with_none_entity(self, _, __): entity_combo_mock.populate.assert_called_once_with(entities_sorted, entity, trigger_callback=False) - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") def test_load_entities_no_update_needed(self, _, __): domain = "light" diff --git a/test/actions/cores/base_core/test_base_core_on_change_domain.py b/test/actions/cores/base_core/test_base_core_on_change_domain.py index 49e8d2b..b6d2007 100644 --- a/test/actions/cores/base_core/test_base_core_on_change_domain.py +++ b/test/actions/cores/base_core/test_base_core_on_change_domain.py @@ -14,10 +14,10 @@ class TestBaseCoreOnChangeDomain(unittest.TestCase): - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") @patch.object(BaseCore, "_load_entities") - @patch.object(BaseCore, "_set_enabled_disabled") + @patch.object(BaseCore, "set_enabled_disabled") def test_on_change_domain_old_and_new_equal(self, set_enabled_disabled_mock, load_entities_mock, _, __): entity_id = "light.living_room" @@ -36,7 +36,7 @@ def test_on_change_domain_old_and_new_equal(self, set_enabled_disabled_mock, loa instance.initialized = True instance.settings = settings_mock instance.entity_combo = entity_combo_mock - instance._on_change_domain(None, domain, domain) + instance.on_change_domain(None, domain, domain) settings_mock.get_entity.assert_not_called() instance.plugin_base.backend.remove_tracked_entity.assert_not_called() @@ -45,10 +45,10 @@ def test_on_change_domain_old_and_new_equal(self, set_enabled_disabled_mock, loa load_entities_mock.assert_called_once() set_enabled_disabled_mock.assert_called_once() - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") @patch.object(BaseCore, "_load_entities") - @patch.object(BaseCore, "_set_enabled_disabled") + @patch.object(BaseCore, "set_enabled_disabled") def test_on_change_domain_no_entity(self, set_enabled_disabled_mock, load_entities_mock, _, __): settings_mock = Mock() settings_mock.get_entity = Mock(return_value=None) @@ -65,7 +65,7 @@ def test_on_change_domain_no_entity(self, set_enabled_disabled_mock, load_entiti instance.initialized = True instance.settings = settings_mock instance.entity_combo = entity_combo_mock - instance._on_change_domain(None, domain, None) + instance.on_change_domain(None, domain, None) settings_mock.get_entity.assert_called_once() instance.plugin_base.backend.remove_tracked_entity.assert_not_called() @@ -74,10 +74,10 @@ def test_on_change_domain_no_entity(self, set_enabled_disabled_mock, load_entiti load_entities_mock.assert_called_once() set_enabled_disabled_mock.assert_called_once() - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") @patch.object(BaseCore, "_load_entities") - @patch.object(BaseCore, "_set_enabled_disabled") + @patch.object(BaseCore, "set_enabled_disabled") def test_on_change_domain_enity_not_tracked(self, set_enabled_disabled_mock, load_entities_mock, _, __): entity_id = "light.living_room" @@ -96,7 +96,7 @@ def test_on_change_domain_enity_not_tracked(self, set_enabled_disabled_mock, loa instance.initialized = True instance.settings = settings_mock instance.entity_combo = entity_combo_mock - instance._on_change_domain(None, domain, None) + instance.on_change_domain(None, domain, None) settings_mock.get_entity.assert_called_once() instance.plugin_base.backend.remove_tracked_entity.assert_not_called() @@ -105,10 +105,10 @@ def test_on_change_domain_enity_not_tracked(self, set_enabled_disabled_mock, loa load_entities_mock.assert_called_once() set_enabled_disabled_mock.assert_called_once() - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") @patch.object(BaseCore, "_load_entities") - @patch.object(BaseCore, "_set_enabled_disabled") + @patch.object(BaseCore, "set_enabled_disabled") def test_on_change_domain_no_new_domain(self, set_enabled_disabled_mock, load_entities_mock, _, __): entity_id = "light.living_room" @@ -127,7 +127,7 @@ def test_on_change_domain_no_new_domain(self, set_enabled_disabled_mock, load_en instance.initialized = True instance.settings = settings_mock instance.entity_combo = entity_combo_mock - instance._on_change_domain(None, domain, "light") + instance.on_change_domain(None, domain, "light") settings_mock.get_entity.assert_called_once() instance.plugin_base.backend.remove_tracked_entity.assert_called_once_with(entity_id, instance.refresh) @@ -136,10 +136,10 @@ def test_on_change_domain_no_new_domain(self, set_enabled_disabled_mock, load_en load_entities_mock.assert_not_called() set_enabled_disabled_mock.assert_called_once() - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") @patch.object(BaseCore, "_load_entities") - @patch.object(BaseCore, "_set_enabled_disabled") + @patch.object(BaseCore, "set_enabled_disabled") def test_on_change_domain_success(self, set_enabled_disabled_mock, load_entities_mock, _, __): entity_id = "light.living_room" @@ -158,7 +158,7 @@ def test_on_change_domain_success(self, set_enabled_disabled_mock, load_entities instance.initialized = True instance.settings = settings_mock instance.entity_combo = entity_combo_mock - instance._on_change_domain(None, domain, None) + instance.on_change_domain(None, domain, None) settings_mock.get_entity.assert_called_once() instance.plugin_base.backend.remove_tracked_entity.assert_called_once_with(entity_id, instance.refresh) diff --git a/test/actions/cores/base_core/test_base_core_on_change_entity.py b/test/actions/cores/base_core/test_base_core_on_change_entity.py index 6640670..58f9940 100644 --- a/test/actions/cores/base_core/test_base_core_on_change_entity.py +++ b/test/actions/cores/base_core/test_base_core_on_change_entity.py @@ -14,62 +14,62 @@ class TestBaseCoreOnChangeDomain(unittest.TestCase): - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") - @patch.object(BaseCore, "_set_enabled_disabled") + @patch.object(BaseCore, "set_enabled_disabled") def test_on_change_entity_no_old_entity(self, set_enabled_disabled_mock, _, __): old_entity_id = None new_entity_id = "switch.kitchen" instance = BaseCore(Mock(), True) instance.initialized = True - instance._on_change_entity(None, new_entity_id, old_entity_id) + instance.on_change_entity(None, new_entity_id, old_entity_id) instance.plugin_base.backend.remove_tracked_entity.assert_not_called() instance.plugin_base.backend.add_tracked_entity.assert_called_once_with(new_entity_id, instance.refresh) set_enabled_disabled_mock.assert_called_once() - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") - @patch.object(BaseCore, "_set_enabled_disabled") + @patch.object(BaseCore, "set_enabled_disabled") def test_on_change_entity_no_new_entity(self, set_enabled_disabled_mock, _, __): old_entity_id = "light.living_room" new_entity_id = None instance = BaseCore(Mock(), True) instance.initialized = True - instance._on_change_entity(None, new_entity_id, old_entity_id) + instance.on_change_entity(None, new_entity_id, old_entity_id) instance.plugin_base.backend.remove_tracked_entity.assert_called_once_with(old_entity_id, instance.refresh) instance.plugin_base.backend.add_tracked_entity.assert_not_called() set_enabled_disabled_mock.assert_called_once() - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") - @patch.object(BaseCore, "_set_enabled_disabled") + @patch.object(BaseCore, "set_enabled_disabled") def test_on_change_entity_entity_not_tracked(self, set_enabled_disabled_mock, _, __): old_entity_id = "light.living_room" new_entity_id = "switch.kitchen" instance = BaseCore(Mock(), False) instance.initialized = True - instance._on_change_entity(None, new_entity_id, old_entity_id) + instance.on_change_entity(None, new_entity_id, old_entity_id) instance.plugin_base.backend.remove_tracked_entity.assert_not_called() instance.plugin_base.backend.add_tracked_entity.assert_not_called() set_enabled_disabled_mock.assert_called_once() - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") - @patch.object(BaseCore, "_set_enabled_disabled") + @patch.object(BaseCore, "set_enabled_disabled") def test_on_change_entity_success(self, set_enabled_disabled_mock, _, __): old_entity_id = "light.living_room" new_entity_id = "switch.kitchen" instance = BaseCore(Mock(), True) instance.initialized = True - instance._on_change_entity(None, new_entity_id, old_entity_id) + instance.on_change_entity(None, new_entity_id, old_entity_id) instance.plugin_base.backend.remove_tracked_entity.assert_called_once_with(old_entity_id, instance.refresh) diff --git a/test/actions/cores/base_core/test_base_core_on_ready.py b/test/actions/cores/base_core/test_base_core_on_ready.py index 64f67e1..1dc9076 100644 --- a/test/actions/cores/base_core/test_base_core_on_ready.py +++ b/test/actions/cores/base_core/test_base_core_on_ready.py @@ -14,7 +14,7 @@ class TestBaseCoreOnReady(unittest.TestCase): - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") @patch.object(BaseCore, "_load_domains") @patch.object(BaseCore, "_load_entities") @@ -34,7 +34,7 @@ def test_on_read_no_entity(self, load_entities_mock, load_domains_mock, _, __): load_entities_mock.assert_called_once() load_domains_mock.assert_called_once() - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") @patch.object(BaseCore, "_load_domains") @patch.object(BaseCore, "_load_entities") @@ -54,7 +54,7 @@ def test_on_read_entity_not_tracked(self, load_entities_mock, load_domains_mock, load_entities_mock.assert_called_once() load_domains_mock.assert_called_once() - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") @patch.object(BaseCore, "_load_domains") @patch.object(BaseCore, "_load_entities") diff --git a/test/actions/cores/base_core/test_base_core_on_remove.py b/test/actions/cores/base_core/test_base_core_on_remove.py index 709d659..fd8c0d9 100644 --- a/test/actions/cores/base_core/test_base_core_on_remove.py +++ b/test/actions/cores/base_core/test_base_core_on_remove.py @@ -14,7 +14,7 @@ class TestBaseCoreOnRemove(unittest.TestCase): - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") @patch.object(BaseCore, "refresh") def test_on_read_entity_not_tracked(self, refresh_mock, _, __): @@ -34,7 +34,7 @@ def test_on_read_entity_not_tracked(self, refresh_mock, _, __): instance.plugin_base.backend.remove_tracked_entity.assert_not_called() refresh_mock.assert_called_once() - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") @patch.object(BaseCore, "refresh") def test_on_remove_success(self, refresh_mock, _, __): diff --git a/test/actions/cores/base_core/test_base_core_refresh.py b/test/actions/cores/base_core/test_base_core_refresh.py index 965eeef..bf84870 100644 --- a/test/actions/cores/base_core/test_base_core_refresh.py +++ b/test/actions/cores/base_core/test_base_core_refresh.py @@ -14,7 +14,7 @@ class TestBaseCoreRefresh(unittest.TestCase): - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") def test_refresh_success(self, _, __): # This test checks if the _entity_updated method can be called without errors diff --git a/test/actions/cores/base_core/test_base_core_reload.py b/test/actions/cores/base_core/test_base_core_reload.py index 39f6410..2ae4420 100644 --- a/test/actions/cores/base_core/test_base_core_reload.py +++ b/test/actions/cores/base_core/test_base_core_reload.py @@ -14,9 +14,9 @@ class TestBaseCoreReload(unittest.TestCase): - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") - @patch.object(BaseCore, "_set_enabled_disabled") + @patch.object(BaseCore, "set_enabled_disabled") @patch.object(BaseCore, "refresh") def test_reload_success(self, refresh_mock, set_enabled_disabled_mock, _, __): settings_mock = Mock() diff --git a/test/actions/cores/base_core/test_base_core_set_enabled_disabled.py b/test/actions/cores/base_core/test_base_core_set_enabled_disabled.py index 3ac050b..c5bbfa7 100644 --- a/test/actions/cores/base_core/test_base_core_set_enabled_disabled.py +++ b/test/actions/cores/base_core/test_base_core_set_enabled_disabled.py @@ -14,7 +14,7 @@ class TestBaseCoreSetEnabledDisabled(unittest.TestCase): - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") def test_set_enabled_disabled_not_initialized(self, _, __): settings_mock = Mock() @@ -29,13 +29,13 @@ def test_set_enabled_disabled_not_initialized(self, _, __): instance.settings = settings_mock instance.entity_combo = entity_combo_mock instance.initialized = False - instance._set_enabled_disabled() + instance.set_enabled_disabled() settings_mock.load.assert_not_called() settings_mock.get_domain.assert_not_called() entity_combo_mock.set_sensitive.assert_not_called() - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") def test_set_enabled_disabled_no_domain(self, _, __): settings_mock = Mock() @@ -49,12 +49,12 @@ def test_set_enabled_disabled_no_domain(self, _, __): instance.settings = settings_mock instance.entity_combo = entity_combo_mock instance.initialized = True - instance._set_enabled_disabled() + instance.set_enabled_disabled() settings_mock.get_domain.assert_called_once() entity_combo_mock.set_sensitive.assert_called_once_with(False) - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") def test_set_enabled_enabled_only_one_entity(self, _, __): settings_mock = Mock() @@ -68,12 +68,12 @@ def test_set_enabled_enabled_only_one_entity(self, _, __): instance.settings = settings_mock instance.entity_combo = entity_combo_mock instance.initialized = True - instance._set_enabled_disabled() + instance.set_enabled_disabled() settings_mock.get_domain.assert_called_once() entity_combo_mock.set_sensitive.assert_called_once_with(True) - @patch.object(BaseCore, "_create_ui_elements") + @patch.object(BaseCore, "create_ui_elements") @patch.object(BaseCore, "_create_event_assigner") def test_set_enabled_disabled_success(self, _, __): settings_mock = Mock() @@ -87,7 +87,7 @@ def test_set_enabled_disabled_success(self, _, __): instance.settings = settings_mock instance.entity_combo = entity_combo_mock instance.initialized = True - instance._set_enabled_disabled() + instance.set_enabled_disabled() settings_mock.get_domain.assert_called_once() entity_combo_mock.set_sensitive.assert_called_once_with(True) diff --git a/test/actions/cores/customization_core/test_customization_core.py b/test/actions/cores/customization_core/test_customization_core.py index edeebfe..0969da8 100644 --- a/test/actions/cores/customization_core/test_customization_core.py +++ b/test/actions/cores/customization_core/test_customization_core.py @@ -65,17 +65,17 @@ def test_on_ready_connected(self, super_on_ready_mock): instance._reload.assert_called_once() @patch( - 'HomeAssistantPlugin.actions.cores.customization_core.customization_core.BaseCore._create_ui_elements') + 'HomeAssistantPlugin.actions.cores.customization_core.customization_core.BaseCore.create_ui_elements') @patch( 'HomeAssistantPlugin.actions.cores.customization_core.customization_core.Button') @patch( 'HomeAssistantPlugin.actions.cores.customization_core.customization_core.ExpanderRow') - def test_create_ui_elements(self, expander_row_mock, button_mock, super_create_ui_elements_mock): + def testcreate_ui_elements(self, expander_row_mock, button_mock, super_create_ui_elements_mock): button_mock.return_value = button_mock expander_row_mock.return_value = expander_row_mock instance = CustomizationCore.__new__(CustomizationCore) - instance._create_ui_elements() + instance.create_ui_elements() super_create_ui_elements_mock.assert_called_once() button_mock.assert_called_once_with(icon_name="list-add", valign=3) @@ -216,7 +216,7 @@ def test_on_move_down(self): instance.refresh.assert_called_once() @patch( - 'HomeAssistantPlugin.actions.cores.customization_core.customization_core.BaseCore._set_enabled_disabled') + 'HomeAssistantPlugin.actions.cores.customization_core.customization_core.BaseCore.set_enabled_disabled') def test_set_enabled_disabled_no_domain(self, super_set_enabled_disabled_mock): instance = CustomizationCore.__new__(CustomizationCore) instance.initialized = True @@ -227,7 +227,7 @@ def test_set_enabled_disabled_no_domain(self, super_set_enabled_disabled_mock): instance.lm = Mock() instance.lm.get.return_value = "label" - instance._set_enabled_disabled() + instance.set_enabled_disabled() super_set_enabled_disabled_mock.assert_called_once() instance.settings.get_domain.assert_called_once() @@ -238,7 +238,7 @@ def test_set_enabled_disabled_no_domain(self, super_set_enabled_disabled_mock): instance.customization_expander.set_expanded.assert_called_once_with(False) @patch( - 'HomeAssistantPlugin.actions.cores.customization_core.customization_core.BaseCore._set_enabled_disabled') + 'HomeAssistantPlugin.actions.cores.customization_core.customization_core.BaseCore.set_enabled_disabled') def test_set_enabled_disabled_no_entity(self, super_set_enabled_disabled_mock): instance = CustomizationCore.__new__(CustomizationCore) instance.initialized = True @@ -249,7 +249,7 @@ def test_set_enabled_disabled_no_entity(self, super_set_enabled_disabled_mock): instance.lm = Mock() instance.lm.get.return_value = "label" - instance._set_enabled_disabled() + instance.set_enabled_disabled() super_set_enabled_disabled_mock.assert_called_once() instance.settings.get_domain.assert_called_once() @@ -260,7 +260,7 @@ def test_set_enabled_disabled_no_entity(self, super_set_enabled_disabled_mock): instance.customization_expander.set_expanded.assert_called_once_with(False) @patch( - 'HomeAssistantPlugin.actions.cores.customization_core.customization_core.BaseCore._set_enabled_disabled') + 'HomeAssistantPlugin.actions.cores.customization_core.customization_core.BaseCore.set_enabled_disabled') def test_set_enabled_disabled_no_customizations(self, super_set_enabled_disabled_mock): instance = CustomizationCore.__new__(CustomizationCore) instance.initialized = True @@ -272,7 +272,7 @@ def test_set_enabled_disabled_no_customizations(self, super_set_enabled_disabled instance.lm = Mock() instance.lm.get.return_value = "label" - instance._set_enabled_disabled() + instance.set_enabled_disabled() super_set_enabled_disabled_mock.assert_called_once() instance.settings.get_domain.assert_called_once() @@ -283,7 +283,7 @@ def test_set_enabled_disabled_no_customizations(self, super_set_enabled_disabled instance.customization_expander.set_expanded.assert_called_once_with(False) @patch( - 'HomeAssistantPlugin.actions.cores.customization_core.customization_core.BaseCore._set_enabled_disabled') + 'HomeAssistantPlugin.actions.cores.customization_core.customization_core.BaseCore.set_enabled_disabled') def test_set_enabled_disabled_with_customizations(self, super_set_enabled_disabled_mock): instance = CustomizationCore.__new__(CustomizationCore) instance.initialized = True @@ -295,7 +295,7 @@ def test_set_enabled_disabled_with_customizations(self, super_set_enabled_disabl instance.lm = Mock() instance.lm.get.return_value = "label" - instance._set_enabled_disabled() + instance.set_enabled_disabled() super_set_enabled_disabled_mock.assert_called_once() instance.settings.get_domain.assert_called_once() diff --git a/test/actions/cores/customization_core/test_customization_window.py b/test/actions/cores/customization_core/test_customization_window.py index 92b3cd3..c7236f1 100644 --- a/test/actions/cores/customization_core/test_customization_window.py +++ b/test/actions/cores/customization_core/test_customization_window.py @@ -199,7 +199,7 @@ def test_on_add_button_valid(self): def test_on_widget_changed_removes_error(self): window = self.get_window() - window._on_widget_changed(None) + window.on_widget_changed(None) window.condition_attribute.remove_css_class.assert_called_with(self.mock_customization_const.ERROR) window.operator.remove_css_class.assert_called_with(self.mock_customization_const.ERROR) window.entry_value.remove_css_class.assert_called_with(self.mock_customization_const.ERROR) @@ -208,7 +208,7 @@ def test_set_default_values_and_current_values(self): window = self.get_window() window.condition_attribute.set_selected = MagicMock() window.operator.set_selected = MagicMock() - window._set_default_values() + window.set_default_values() window.condition_attribute.set_selected.assert_called_with(0) window.operator.set_selected.assert_called_with(0) @@ -219,12 +219,12 @@ def test_set_current_values_no_current(self): window.entry_value.set_text = MagicMock() window.condition_attribute.get_model.return_value = [["attr1"], ["attr2"], ["attr3"]] window.operator.get_model.return_value = [["attr1"], ["attr2"], ["attr3"]] - window._set_current_values() + window.set_current_values() window.condition_attribute.set_active.assert_not_called() window.operator.set_active.assert_not_called() window.entry_value.set_text.assert_not_called() - def test_set_current_values(self): + def testset_current_values(self): attr1_mock = MagicMock() attr1_mock.get_string.return_value = "attr1" attr1_mock.value = "attr1" @@ -244,7 +244,7 @@ def test_set_current_values(self): window.entry_value.set_text = MagicMock() window.condition_attribute.get_model.return_value = [attr1_mock, attr2_mock, attr3_mock] window.operator.get_model.return_value = [attr1_mock, attr2_mock, attr3_mock] - window._set_current_values() + window.set_current_values() window.condition_attribute.set_selected.assert_called_with(1) window.operator.set_selected.assert_called_with(2) window.entry_value.set_text.assert_called_with("55") @@ -406,14 +406,14 @@ def test_on_change_scale_entry_text_digits_empty(self): entry.set_text.assert_called_with('5') def test_after_init_calls_all_methods(self): - """Test _after_init calls _set_default_values, _set_current_values, _connect_rows.""" + """Test _after_init calls set_default_values, set_current_values, _connect_rows.""" window = self.get_window() # Patch the called methods to monitor calls - window._set_default_values = MagicMock() - window._set_current_values = MagicMock() + window.set_default_values = MagicMock() + window.set_current_values = MagicMock() window._connect_rows = MagicMock() window.current = MagicMock() window._after_init() - window._set_default_values.assert_called_once() - window._set_current_values.assert_called_once() + window.set_default_values.assert_called_once() + window.set_current_values.assert_called_once() window._connect_rows.assert_called_once() \ No newline at end of file diff --git a/test/actions/level_dial/test_level_dial_adjust_level.py b/test/actions/level_dial/test_level_dial_adjust_level.py index 53d7391..b5ea163 100644 --- a/test/actions/level_dial/test_level_dial_adjust_level.py +++ b/test/actions/level_dial/test_level_dial_adjust_level.py @@ -372,7 +372,7 @@ def test_adjust_level_display_updates_immediately(self, mock_init): # But no HA command yet backend.perform_action.assert_not_called() - @patch.object(LevelDial, '_set_enabled_disabled') + @patch.object(LevelDial, 'set_enabled_disabled') @patch.object(LevelDial, '_load_customizations') @patch('HomeAssistantPlugin.actions.level_dial.level_dial.CustomizationCore.__init__') def test_adjust_level_refresh_clears_pending(self, mock_init, _load_cust, _set_ed): diff --git a/test/actions/level_dial/test_level_dial_refresh.py b/test/actions/level_dial/test_level_dial_refresh.py index 9ea8015..ee81e9c 100644 --- a/test/actions/level_dial/test_level_dial_refresh.py +++ b/test/actions/level_dial/test_level_dial_refresh.py @@ -64,7 +64,7 @@ def test_refresh_entity_state_none_fetches_from_backend(self, _): instance.set_center_label.assert_called_once_with("N/A") instance.set_media.assert_called_once_with() - @patch.object(LevelDial, '_set_enabled_disabled') + @patch.object(LevelDial, 'set_enabled_disabled') @patch.object(LevelDial, '_load_customizations') @patch('HomeAssistantPlugin.actions.level_dial.level_dial._get_icon_image') @patch('HomeAssistantPlugin.actions.level_dial.level_dial.CustomizationCore.__init__') @@ -96,7 +96,7 @@ def test_refresh_entity_off(self, _, mock_get_icon, _load_cust, _set_ed): ) instance.set_media.assert_called_once_with(image=mock_get_icon.return_value, size=0.75) - @patch.object(LevelDial, '_set_enabled_disabled') + @patch.object(LevelDial, 'set_enabled_disabled') @patch.object(LevelDial, '_load_customizations') @patch('HomeAssistantPlugin.actions.level_dial.level_dial._get_icon_image') @patch('HomeAssistantPlugin.actions.level_dial.level_dial.CustomizationCore.__init__') @@ -127,7 +127,7 @@ def test_refresh_entity_unavailable(self, _, mock_get_icon, _load_cust, _set_ed) outline_width=3, outline_color=[0, 0, 0] ) - @patch.object(LevelDial, '_set_enabled_disabled') + @patch.object(LevelDial, 'set_enabled_disabled') @patch.object(LevelDial, '_load_customizations') @patch('HomeAssistantPlugin.actions.level_dial.level_dial._get_icon_image') @patch('HomeAssistantPlugin.actions.level_dial.level_dial.CustomizationCore.__init__') @@ -159,7 +159,7 @@ def test_refresh_entity_on_with_brightness(self, _, mock_get_icon, _load_cust, _ outline_width=3, outline_color=[0, 0, 0] ) - @patch.object(LevelDial, '_set_enabled_disabled') + @patch.object(LevelDial, 'set_enabled_disabled') @patch.object(LevelDial, '_load_customizations') @patch('HomeAssistantPlugin.actions.level_dial.level_dial._get_icon_image') @patch('HomeAssistantPlugin.actions.level_dial.level_dial.CustomizationCore.__init__') @@ -212,7 +212,7 @@ def test_refresh_unsupported_domain_shows_question_mark(self, _): instance.set_center_label.assert_called_once_with("?") - @patch.object(LevelDial, '_set_enabled_disabled') + @patch.object(LevelDial, 'set_enabled_disabled') @patch.object(LevelDial, '_load_customizations') @patch('HomeAssistantPlugin.actions.level_dial.level_dial._get_icon_image') @patch('HomeAssistantPlugin.actions.level_dial.level_dial.CustomizationCore.__init__') @@ -243,7 +243,7 @@ def test_refresh_level_none_shows_off(self, _, mock_get_icon, _load_cust, _set_e outline_width=3, outline_color=[0, 0, 0] ) - @patch.object(LevelDial, '_set_enabled_disabled') + @patch.object(LevelDial, 'set_enabled_disabled') @patch.object(LevelDial, '_load_customizations') @patch('HomeAssistantPlugin.actions.level_dial.level_dial._get_icon_image') @patch('HomeAssistantPlugin.actions.level_dial.level_dial.CustomizationCore.__init__') diff --git a/test/actions/level_dial/test_level_dial_set_enabled_disabled.py b/test/actions/level_dial/test_level_dial_set_enabled_disabled.py index b9a753b..a7c8df3 100644 --- a/test/actions/level_dial/test_level_dial_set_enabled_disabled.py +++ b/test/actions/level_dial/test_level_dial_set_enabled_disabled.py @@ -23,11 +23,11 @@ def test_set_enabled_disabled_not_initialized(self, _): instance = LevelDial() instance.settings = settings_mock instance.initialized = False - instance._set_enabled_disabled() + instance.set_enabled_disabled() settings_mock.get_domain.assert_not_called() - @patch('HomeAssistantPlugin.actions.level_dial.level_dial.CustomizationCore._set_enabled_disabled') + @patch('HomeAssistantPlugin.actions.level_dial.level_dial.CustomizationCore.set_enabled_disabled') @patch('HomeAssistantPlugin.actions.level_dial.level_dial.CustomizationCore.__init__') def test_set_enabled_disabled_no_entity(self, _, super_set_mock): settings_mock = Mock() @@ -59,7 +59,7 @@ def test_set_enabled_disabled_no_entity(self, _, super_set_mock): instance.label_entry = label_entry_mock instance.step_scale = step_scale_mock instance.batch_delay_scale = batch_delay_scale_mock - instance._set_enabled_disabled() + instance.set_enabled_disabled() super_set_mock.assert_called_once() label_entry_mock.widget.set_sensitive.assert_called_once_with(False) @@ -68,7 +68,7 @@ def test_set_enabled_disabled_no_entity(self, _, super_set_mock): batch_delay_scale_mock.widget.set_sensitive.assert_called_once_with(False) batch_delay_scale_mock.widget.set_subtitle.assert_called_once_with("No entity selected") - @patch('HomeAssistantPlugin.actions.level_dial.level_dial.CustomizationCore._set_enabled_disabled') + @patch('HomeAssistantPlugin.actions.level_dial.level_dial.CustomizationCore.set_enabled_disabled') @patch('HomeAssistantPlugin.actions.level_dial.level_dial.CustomizationCore.__init__') def test_set_enabled_disabled_has_entity(self, _, super_set_mock): settings_mock = Mock() @@ -96,7 +96,7 @@ def test_set_enabled_disabled_has_entity(self, _, super_set_mock): instance.label_entry = label_entry_mock instance.step_scale = step_scale_mock instance.batch_delay_scale = batch_delay_scale_mock - instance._set_enabled_disabled() + instance.set_enabled_disabled() super_set_mock.assert_called_once() label_entry_mock.widget.set_sensitive.assert_called_once_with(True) @@ -105,7 +105,7 @@ def test_set_enabled_disabled_has_entity(self, _, super_set_mock): batch_delay_scale_mock.widget.set_sensitive.assert_called_once_with(True) batch_delay_scale_mock.widget.set_subtitle.assert_called_once_with(level_const.EMPTY_STRING) - @patch('HomeAssistantPlugin.actions.level_dial.level_dial.CustomizationCore._set_enabled_disabled') + @patch('HomeAssistantPlugin.actions.level_dial.level_dial.CustomizationCore.set_enabled_disabled') @patch('HomeAssistantPlugin.actions.level_dial.level_dial.CustomizationCore.__init__') def test_set_enabled_disabled_domain_only_no_entity(self, _, super_set_mock): """Domain set but entity empty -> disabled.""" @@ -138,7 +138,7 @@ def test_set_enabled_disabled_domain_only_no_entity(self, _, super_set_mock): instance.label_entry = label_entry_mock instance.step_scale = step_scale_mock instance.batch_delay_scale = batch_delay_scale_mock - instance._set_enabled_disabled() + instance.set_enabled_disabled() label_entry_mock.widget.set_sensitive.assert_called_once_with(False) step_scale_mock.widget.set_sensitive.assert_called_once_with(False) diff --git a/test/actions/perform_action/parameters/test_parameter_row.py b/test/actions/perform_action/parameters/test_parameter_row.py index d224870..683bf99 100644 --- a/test/actions/perform_action/parameters/test_parameter_row.py +++ b/test/actions/perform_action/parameters/test_parameter_row.py @@ -1,7 +1,6 @@ import sys import unittest from pathlib import Path -from typing import Dict from unittest.mock import Mock, patch, call absolute_mock_path = str(Path(__file__).parent.parent.parent.parent / "stream_controller_mock") @@ -10,7 +9,6 @@ absolute_plugin_path = str(Path(__file__).parent.parent.parent.parent.parent.parent.absolute()) sys.path.insert(0, absolute_plugin_path) - from HomeAssistantPlugin import const as base_const from HomeAssistantPlugin.actions.perform_action.parameters.parameter_entry_row import ParameterRow @@ -62,7 +60,6 @@ def test_init_field_in_parameters_required(self): instance.check.set_sensitive.assert_called_once_with(False) instance.check.connect.assert_called_once_with(base_const.CONNECT_TOGGLED, instance._on_change) - def test_get_parameter_value(self): required = False instance = create_instance(required) @@ -98,7 +95,9 @@ def test_on_change_not_active(self, get_parameter_value_mock): instance.action.settings.remove_parameter.assert_called_once_with(instance.field_name) -def create_instance(required: bool, parameters: Dict={}, field_name: str="test_field") -> ParameterRow: +def create_instance(required: bool, parameters=None, field_name: str = "test_field") -> ParameterRow: + if parameters is None: + parameters = {} action_core_mock = Mock() action_core_mock.settings = Mock() action_core_mock.settings.get_parameters = Mock(return_value=parameters) @@ -112,4 +111,3 @@ def create_instance(required: bool, parameters: Dict={}, field_name: str="test_f check_button_mock.set_sensitive = Mock() check_button_mock.connect = Mock() return ParameterRow(action_core_mock, field_name, required) - diff --git a/test/actions/perform_action/test_perform_action_create_ui_elements.py b/test/actions/perform_action/test_perform_action_create_ui_elements.py index 64ac75e..9e6bde0 100644 --- a/test/actions/perform_action/test_perform_action_create_ui_elements.py +++ b/test/actions/perform_action/test_perform_action_create_ui_elements.py @@ -17,12 +17,12 @@ class TestPerformActionCreateUiElements(unittest.TestCase): @patch('HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore.__init__') @patch( - 'HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore._create_ui_elements') + 'HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore.create_ui_elements') @patch('HomeAssistantPlugin.actions.perform_action.perform_action.ComboRow') @patch('HomeAssistantPlugin.actions.perform_action.perform_action.ExpanderRow') def test_create_ui_elements_success(self, expander_row_mock, combo_row_mock, create_ui_elements_mock, _): instance = PerformAction() - instance._create_ui_elements() + instance.create_ui_elements() create_ui_elements_mock.assert_called_once() combo_row_mock.assert_called_once_with( diff --git a/test/actions/perform_action/test_perform_action_on_change_domain.py b/test/actions/perform_action/test_perform_action_on_change_domain.py index dbd0ff1..4a45fce 100644 --- a/test/actions/perform_action/test_perform_action_on_change_domain.py +++ b/test/actions/perform_action/test_perform_action_on_change_domain.py @@ -16,9 +16,9 @@ class TestPerformActionOnChangeDomain(unittest.TestCase): @patch('HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore.__init__') @patch( - 'HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore._on_change_domain') + 'HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore.on_change_domain') @patch.object(PerformAction, '_load_actions') - @patch.object(PerformAction, '_set_enabled_disabled') + @patch.object(PerformAction, 'set_enabled_disabled') def test_on_change_domain_not_initialized(self, set_enabled_disabled_mock, load_actions_mock, on_change_domain_mock, _): new_domain = 'light' @@ -26,7 +26,7 @@ def test_on_change_domain_not_initialized(self, set_enabled_disabled_mock, load_ instance = PerformAction() instance.initialized = False - instance._on_change_domain(None, new_domain, old_domain) + instance.on_change_domain(None, new_domain, old_domain) on_change_domain_mock.assert_not_called() load_actions_mock.assert_not_called() @@ -34,9 +34,9 @@ def test_on_change_domain_not_initialized(self, set_enabled_disabled_mock, load_ @patch('HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore.__init__') @patch( - 'HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore._on_change_domain') + 'HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore.on_change_domain') @patch.object(PerformAction, '_load_actions') - @patch.object(PerformAction, '_set_enabled_disabled') + @patch.object(PerformAction, 'set_enabled_disabled') def test_on_change_domain_domain_none(self, set_enabled_disabled_mock, load_actions_mock, on_change_domain_mock, _): new_domain = None @@ -44,7 +44,7 @@ def test_on_change_domain_domain_none(self, set_enabled_disabled_mock, load_acti instance = PerformAction() instance.initialized = True - instance._on_change_domain(None, new_domain, old_domain) + instance.on_change_domain(None, new_domain, old_domain) on_change_domain_mock.assert_called_once_with(None, new_domain, old_domain) load_actions_mock.assert_not_called() @@ -52,9 +52,9 @@ def test_on_change_domain_domain_none(self, set_enabled_disabled_mock, load_acti @patch('HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore.__init__') @patch( - 'HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore._on_change_domain') + 'HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore.on_change_domain') @patch.object(PerformAction, '_load_actions') - @patch.object(PerformAction, '_set_enabled_disabled') + @patch.object(PerformAction, 'set_enabled_disabled') def test_on_change_domain_domain_empty(self, set_enabled_disabled_mock, load_actions_mock, on_change_domain_mock, _): new_domain = "" @@ -62,7 +62,7 @@ def test_on_change_domain_domain_empty(self, set_enabled_disabled_mock, load_act instance = PerformAction() instance.initialized = True - instance._on_change_domain(None, new_domain, old_domain) + instance.on_change_domain(None, new_domain, old_domain) on_change_domain_mock.assert_called_once_with(None, new_domain, old_domain) load_actions_mock.assert_not_called() @@ -70,9 +70,9 @@ def test_on_change_domain_domain_empty(self, set_enabled_disabled_mock, load_act @patch('HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore.__init__') @patch( - 'HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore._on_change_domain') + 'HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore.on_change_domain') @patch.object(PerformAction, '_load_actions') - @patch.object(PerformAction, '_set_enabled_disabled') + @patch.object(PerformAction, 'set_enabled_disabled') def test_on_change_domain_success(self, set_enabled_disabled_mock, load_actions_mock, on_change_domain_mock, _): new_domain = "light" @@ -80,7 +80,7 @@ def test_on_change_domain_success(self, set_enabled_disabled_mock, load_actions_ instance = PerformAction() instance.initialized = True - instance._on_change_domain(None, new_domain, old_domain) + instance.on_change_domain(None, new_domain, old_domain) on_change_domain_mock.assert_called_once_with(None, new_domain, old_domain) load_actions_mock.assert_called_once() diff --git a/test/actions/perform_action/test_perform_action_on_change_entity.py b/test/actions/perform_action/test_perform_action_on_change_entity.py index f1322b0..b92eb66 100644 --- a/test/actions/perform_action/test_perform_action_on_change_entity.py +++ b/test/actions/perform_action/test_perform_action_on_change_entity.py @@ -16,7 +16,7 @@ class TestPerformActionOnChangeDomain(unittest.TestCase): @patch('HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore.__init__') @patch( - 'HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore._on_change_entity') + 'HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore.on_change_entity') @patch( 'HomeAssistantPlugin.actions.perform_action.parameters.parameters_helper.load_parameters') @patch.object(PerformAction, '_reload') @@ -26,7 +26,7 @@ def test_on_change_domain_not_initialized(self, reload_mock, load_parameters_moc instance = PerformAction() instance.initialized = False - instance._on_change_entity(None, new_entity, old_entity) + instance.on_change_entity(None, new_entity, old_entity) on_change_entity_mock.assert_not_called() load_parameters_mock.assert_not_called() @@ -34,7 +34,7 @@ def test_on_change_domain_not_initialized(self, reload_mock, load_parameters_moc @patch('HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore.__init__') @patch( - 'HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore._on_change_entity') + 'HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore.on_change_entity') @patch( 'HomeAssistantPlugin.actions.perform_action.parameters.parameters_helper.load_parameters') @patch.object(PerformAction, '_reload') @@ -44,7 +44,7 @@ def test_on_change_domain_same_entity(self, reload_mock, load_parameters_mock, o instance = PerformAction() instance.initialized = True - instance._on_change_entity(None, new_entity, old_entity) + instance.on_change_entity(None, new_entity, old_entity) on_change_entity_mock.assert_not_called() load_parameters_mock.assert_not_called() @@ -52,7 +52,7 @@ def test_on_change_domain_same_entity(self, reload_mock, load_parameters_mock, o @patch('HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore.__init__') @patch( - 'HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore._on_change_entity') + 'HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore.on_change_entity') @patch( 'HomeAssistantPlugin.actions.perform_action.parameters.parameters_helper.load_parameters') @patch.object(PerformAction, '_reload') @@ -62,7 +62,7 @@ def test_on_change_domain_entity_none(self, reload_mock, load_parameters_mock, o instance = PerformAction() instance.initialized = True - instance._on_change_entity(None, new_entity, old_entity) + instance.on_change_entity(None, new_entity, old_entity) on_change_entity_mock.assert_called_once() load_parameters_mock.assert_not_called() @@ -70,7 +70,7 @@ def test_on_change_domain_entity_none(self, reload_mock, load_parameters_mock, o @patch('HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore.__init__') @patch( - 'HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore._on_change_entity') + 'HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore.on_change_entity') @patch( 'HomeAssistantPlugin.actions.perform_action.parameters.parameters_helper.load_parameters') @patch.object(PerformAction, '_reload') @@ -80,7 +80,7 @@ def test_on_change_domain_entity_empty(self, reload_mock, load_parameters_mock, instance = PerformAction() instance.initialized = True - instance._on_change_entity(None, new_entity, old_entity) + instance.on_change_entity(None, new_entity, old_entity) on_change_entity_mock.assert_called_once() load_parameters_mock.assert_not_called() @@ -88,7 +88,7 @@ def test_on_change_domain_entity_empty(self, reload_mock, load_parameters_mock, @patch('HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore.__init__') @patch( - 'HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore._on_change_entity') + 'HomeAssistantPlugin.actions.perform_action.perform_action.BaseCore.on_change_entity') @patch( 'HomeAssistantPlugin.actions.perform_action.parameters.parameters_helper.load_parameters') @patch.object(PerformAction, '_reload') @@ -98,7 +98,7 @@ def test_on_change_domain_success(self, reload_mock, load_parameters_mock, on_ch instance = PerformAction() instance.initialized = True - instance._on_change_entity(None, new_entity, old_entity) + instance.on_change_entity(None, new_entity, old_entity) on_change_entity_mock.assert_called_once() load_parameters_mock.assert_called_once_with(instance) diff --git a/test/actions/perform_action/test_perform_action_set_enabled_disabled.py b/test/actions/perform_action/test_perform_action_set_enabled_disabled.py index ee9cf08..afa88f9 100644 --- a/test/actions/perform_action/test_perform_action_set_enabled_disabled.py +++ b/test/actions/perform_action/test_perform_action_set_enabled_disabled.py @@ -23,7 +23,7 @@ def test_set_enabled_disabled_not_initialized(self, _): instance = PerformAction() instance.settings = settings_mock instance.initialized = False - instance._set_enabled_disabled() + instance.set_enabled_disabled() settings_mock.get_domain.assert_not_called() @@ -52,7 +52,7 @@ def test_set_enabled_disabled_domain_not_set(self, _): instance.lm = locale_manager instance.action_combo = action_combo_mock instance.parameters_expander = parameters_expander_mock - instance._set_enabled_disabled() + instance.set_enabled_disabled() settings_mock.get_domain.assert_called_once() action_combo_mock.widget.set_sensitive.assert_called_once_with(False) @@ -87,7 +87,7 @@ def test_set_enabled_disabled_no_actions(self, _): instance.lm = locale_manager instance.action_combo = action_combo_mock instance.parameters_expander = parameters_expander_mock - instance._set_enabled_disabled() + instance.set_enabled_disabled() settings_mock.get_domain.assert_called_once() action_combo_mock.widget.set_sensitive.assert_called_once_with(False) @@ -140,7 +140,7 @@ def test_set_enabled_disabled_no_parameters_no_target_one_entity(self, _): instance.entity_combo = entity_combo_mock instance.domain_combo = domain_combo_mock instance.plugin_base = plugin_base_mock - instance._set_enabled_disabled() + instance.set_enabled_disabled() settings_mock.get_domain.assert_called_once() action_combo_mock.widget.set_sensitive.assert_called_once_with(True) @@ -193,7 +193,7 @@ def test_set_enabled_disabled_parameters_no_target_two_entities(self, _): instance.entity_combo = entity_combo_mock instance.domain_combo = domain_combo_mock instance.plugin_base = plugin_base_mock - instance._set_enabled_disabled() + instance.set_enabled_disabled() settings_mock.get_domain.assert_called_once() action_combo_mock.widget.set_sensitive.assert_called_once_with(True) @@ -245,7 +245,7 @@ def test_set_enabled_disabled_parameters_target_no_entity(self, _): instance.entity_combo = entity_combo_mock instance.domain_combo = domain_combo_mock instance.plugin_base = plugin_base_mock - instance._set_enabled_disabled() + instance.set_enabled_disabled() settings_mock.get_domain.assert_called_once() action_combo_mock.widget.set_sensitive.assert_called_once_with(True) @@ -297,7 +297,7 @@ def test_set_enabled_disabled_parameters_target_two_entities(self, _): instance.entity_combo = entity_combo_mock instance.domain_combo = domain_combo_mock instance.plugin_base = plugin_base_mock - instance._set_enabled_disabled() + instance.set_enabled_disabled() settings_mock.get_domain.assert_called_once() action_combo_mock.widget.set_sensitive.assert_called_once_with(True) diff --git a/test/actions/show_icon/test_icon_action.py b/test/actions/show_icon/test_icon_action.py index b14bfe9..cb8ff5a 100644 --- a/test/actions/show_icon/test_icon_action.py +++ b/test/actions/show_icon/test_icon_action.py @@ -64,15 +64,15 @@ def test_get_config_rows(self): self.assertEqual(instance.get_config_rows(), expected_rows) - @patch('HomeAssistantPlugin.actions.show_icon.icon_action.CustomizationCore._create_ui_elements') + @patch('HomeAssistantPlugin.actions.show_icon.icon_action.CustomizationCore.create_ui_elements') @patch('HomeAssistantPlugin.actions.show_icon.icon_action.EntryRow') @patch('HomeAssistantPlugin.actions.show_icon.icon_action.ColorButtonRow') @patch('HomeAssistantPlugin.actions.show_icon.icon_action.ScaleRow') - def test_create_ui_elements(self, scale_row_mock, color_button_row_mock, entry_row_mock, super_create_ui_elements_mock): + def testcreate_ui_elements(self, scale_row_mock, color_button_row_mock, entry_row_mock, super_create_ui_elements_mock): instance = ShowIcon.__new__(ShowIcon) instance._reload = Mock() - instance._create_ui_elements() + instance.create_ui_elements() super_create_ui_elements_mock.assert_called_once() self.assertTrue(hasattr(instance, 'icon')) @@ -99,7 +99,7 @@ def test_create_ui_elements(self, scale_row_mock, color_button_row_mock, entry_r ) ]) - @patch('HomeAssistantPlugin.actions.show_icon.icon_action.CustomizationCore._set_enabled_disabled') + @patch('HomeAssistantPlugin.actions.show_icon.icon_action.CustomizationCore.set_enabled_disabled') def test_set_enabled_disabled_no_domain(self, super_set_enabled_disabled_mock): lm = { icon_const.LABEL_ICON_NO_ENTITY: "No entity selected" @@ -116,7 +116,7 @@ def test_set_enabled_disabled_no_domain(self, super_set_enabled_disabled_mock): instance.opacity = Mock() instance.lm = lm - instance._set_enabled_disabled() + instance.set_enabled_disabled() super_set_enabled_disabled_mock.assert_called_once() instance.icon.widget.set_sensitive.assert_called_once_with(False) @@ -127,7 +127,7 @@ def test_set_enabled_disabled_no_domain(self, super_set_enabled_disabled_mock): instance.opacity.widget.set_sensitive.assert_called_once_with(False) instance.opacity.widget.set_subtitle.assert_called_once_with(lm[icon_const.LABEL_ICON_NO_ENTITY]) - @patch('HomeAssistantPlugin.actions.show_icon.icon_action.CustomizationCore._set_enabled_disabled') + @patch('HomeAssistantPlugin.actions.show_icon.icon_action.CustomizationCore.set_enabled_disabled') def test_set_enabled_disabled_no_entity(self, super_set_enabled_disabled_mock): lm = { icon_const.LABEL_ICON_NO_ENTITY: "No entity selected" @@ -144,7 +144,7 @@ def test_set_enabled_disabled_no_entity(self, super_set_enabled_disabled_mock): instance.opacity = Mock() instance.lm = lm - instance._set_enabled_disabled() + instance.set_enabled_disabled() super_set_enabled_disabled_mock.assert_called_once() instance.icon.widget.set_sensitive.assert_called_once_with(False) @@ -155,7 +155,7 @@ def test_set_enabled_disabled_no_entity(self, super_set_enabled_disabled_mock): instance.opacity.widget.set_sensitive.assert_called_once_with(False) instance.opacity.widget.set_subtitle.assert_called_once_with(lm[icon_const.LABEL_ICON_NO_ENTITY]) - @patch('HomeAssistantPlugin.actions.show_icon.icon_action.CustomizationCore._set_enabled_disabled') + @patch('HomeAssistantPlugin.actions.show_icon.icon_action.CustomizationCore.set_enabled_disabled') def test_set_enabled_disabled_success(self, super_set_enabled_disabled_mock): instance = ShowIcon.__new__(ShowIcon) instance.initialized = True @@ -167,7 +167,7 @@ def test_set_enabled_disabled_success(self, super_set_enabled_disabled_mock): instance.scale = Mock() instance.opacity = Mock() - instance._set_enabled_disabled() + instance.set_enabled_disabled() super_set_enabled_disabled_mock.assert_called_once() instance.icon.widget.set_sensitive.assert_called_once_with(True) @@ -187,7 +187,7 @@ def test_refresh_not_initialized_not_connected(self, icon_helper_mock): instance.settings = Mock() instance.set_media = Mock() instance._load_customizations = Mock() - instance._set_enabled_disabled = Mock() + instance.set_enabled_disabled = Mock() icon_helper_mock.get_icon.return_value = ("icon_path", 3) state = {"state_key": "state_value"} @@ -198,7 +198,7 @@ def test_refresh_not_initialized_not_connected(self, icon_helper_mock): instance.set_media.assert_called_once_with(media_path="icon_path", size=3) instance.settings.get_entity.assert_not_called() instance._load_customizations.assert_not_called() - instance._set_enabled_disabled.assert_not_called() + instance.set_enabled_disabled.assert_not_called() def test_refresh_no_state(self): instance = ShowIcon.__new__(ShowIcon) @@ -209,14 +209,14 @@ def test_refresh_no_state(self): instance.settings.get_entity.return_value = "entity_id" instance.set_media = Mock() instance._load_customizations = Mock() - instance._set_enabled_disabled = Mock() + instance.set_enabled_disabled = Mock() instance.refresh() instance.set_media.assert_called_once_with() instance.plugin_base.backend.get_entity.assert_called_once_with("entity_id") instance._load_customizations.assert_not_called() - instance._set_enabled_disabled.assert_not_called() + instance.set_enabled_disabled.assert_not_called() @patch('HomeAssistantPlugin.actions.show_icon.icon_action.icon_helper') def test_refresh_state_from_backend(self, icon_helper_mock): @@ -231,7 +231,7 @@ def test_refresh_state_from_backend(self, icon_helper_mock): instance.settings.get_entity.return_value = "entity_id" instance.set_media = Mock() instance._load_customizations = Mock() - instance._set_enabled_disabled = Mock() + instance.set_enabled_disabled = Mock() icon_helper_mock.get_icon.return_value = ("icon_path", 3) instance.refresh() @@ -240,7 +240,7 @@ def test_refresh_state_from_backend(self, icon_helper_mock): icon_helper_mock.get_icon.assert_called_once_with(state, instance.settings, True) instance.set_media.assert_called_once_with(media_path="icon_path", size=3) instance._load_customizations.assert_called_once() - instance._set_enabled_disabled.assert_called_once() + instance.set_enabled_disabled.assert_called_once() @patch('HomeAssistantPlugin.actions.show_icon.icon_action.icon_helper') def test_refresh_state_as_parameter(self, icon_helper_mock): @@ -254,7 +254,7 @@ def test_refresh_state_as_parameter(self, icon_helper_mock): instance.settings.get_entity.return_value = "entity_id" instance.set_media = Mock() instance._load_customizations = Mock() - instance._set_enabled_disabled = Mock() + instance.set_enabled_disabled = Mock() icon_helper_mock.get_icon.return_value = ("icon_path", 3) instance.refresh(state) @@ -263,7 +263,7 @@ def test_refresh_state_as_parameter(self, icon_helper_mock): icon_helper_mock.get_icon.assert_called_once_with(state, instance.settings, True) instance.set_media.assert_called_once_with(media_path="icon_path", size=3) instance._load_customizations.assert_called_once() - instance._set_enabled_disabled.assert_called_once() + instance.set_enabled_disabled.assert_called_once() def test_get_domains(self): instance = ShowIcon.__new__(ShowIcon) diff --git a/test/actions/show_icon/test_icon_window.py b/test/actions/show_icon/test_icon_window.py index 5f55929..4c6180c 100644 --- a/test/actions/show_icon/test_icon_window.py +++ b/test/actions/show_icon/test_icon_window.py @@ -55,8 +55,8 @@ def super_init(instance, lm, *args, **kwargs): after_init_mock.assert_called_once() @patch( - 'HomeAssistantPlugin.actions.show_icon.icon_window.CustomizationWindow._set_default_values') - def test_set_default_values(self, super_set_default_values_mock): + 'HomeAssistantPlugin.actions.show_icon.icon_window.CustomizationWindow.set_default_values') + def testset_default_values(self, super_set_default_values_mock): instance = IconWindow.__new__(IconWindow) instance.color = Mock() instance.scale = Mock() @@ -64,7 +64,7 @@ def test_set_default_values(self, super_set_default_values_mock): instance.opacity = Mock() instance.opacity_entry = Mock() - instance._set_default_values() + instance.set_default_values() super_set_default_values_mock.assert_called_once() instance.color.set_rgba.assert_called_once() @@ -74,17 +74,17 @@ def test_set_default_values(self, super_set_default_values_mock): instance.opacity_entry.set_text.assert_called_once_with(str(icon_const.DEFAULT_ICON_OPACITY)) @patch( - 'HomeAssistantPlugin.actions.cores.customization_core.customization_window.CustomizationWindow._set_current_values') + 'HomeAssistantPlugin.actions.cores.customization_core.customization_window.CustomizationWindow.set_current_values') def test_set_current_values_no_current(self, super_set_current_values_mock): instance = IconWindow.__new__(IconWindow) instance.current = None - instance._set_current_values() + instance.set_current_values() super_set_current_values_mock.assert_not_called() @patch( - 'HomeAssistantPlugin.actions.cores.customization_core.customization_window.CustomizationWindow._set_current_values') + 'HomeAssistantPlugin.actions.cores.customization_core.customization_window.CustomizationWindow.set_current_values') def test_set_current_values_with_current(self, super_set_current_values_mock): instance = IconWindow.__new__(IconWindow) instance.current = Mock() @@ -104,7 +104,7 @@ def test_set_current_values_with_current(self, super_set_current_values_mock): instance.opacity_entry = Mock() instance.check_opacity = Mock() - instance._set_current_values() + instance.set_current_values() super_set_current_values_mock.assert_called_once() instance.icon.set_text.assert_called_once_with("icon_name") @@ -231,7 +231,7 @@ def test_on_add_button_success(self, icon_customization_mock, super_on_add_butto instance.destroy.assert_called_once() @patch( - 'HomeAssistantPlugin.actions.cores.customization_core.customization_window.CustomizationWindow._on_widget_changed') + 'HomeAssistantPlugin.actions.cores.customization_core.customization_window.CustomizationWindow.on_widget_changed') def test_on_widget_changed(self, super_on_widget_changed_mock): instance = IconWindow.__new__(IconWindow) instance.icon = Mock() @@ -240,7 +240,7 @@ def test_on_widget_changed(self, super_on_widget_changed_mock): instance.check_scale = Mock() instance.check_opacity = Mock() - instance._on_widget_changed() + instance.on_widget_changed() super_on_widget_changed_mock.assert_called_once() instance.icon.remove_css_class.assert_called_once_with(icon_const.ERROR) diff --git a/test/actions/show_text/test_text_action.py b/test/actions/show_text/test_text_action.py index 4148520..07431cd 100644 --- a/test/actions/show_text/test_text_action.py +++ b/test/actions/show_text/test_text_action.py @@ -83,7 +83,7 @@ def test_get_config_rows(self): self.assertEqual(result, expected) - @patch('HomeAssistantPlugin.actions.show_text.text_action.CustomizationCore._create_ui_elements') + @patch('HomeAssistantPlugin.actions.show_text.text_action.CustomizationCore.create_ui_elements') @patch('HomeAssistantPlugin.actions.show_text.text_action.ComboRow') @patch('HomeAssistantPlugin.actions.show_text.text_action.ExpanderRow') @patch('HomeAssistantPlugin.actions.show_text.text_action.ScaleRow') @@ -94,7 +94,7 @@ def test_create_ui_elements(self, switch_row_mock, color_button_row_mock, scale_ instance = ShowText.__new__(ShowText) instance._reload = Mock() - instance._create_ui_elements() + instance.create_ui_elements() super_create_ui_elements_mock.assert_called_once() self.assertTrue(hasattr(instance, "position")) @@ -150,7 +150,7 @@ def test_create_ui_elements(self, switch_row_mock, color_button_row_mock, scale_ can_reset=False, complex_var_name=True) ]) - @patch('HomeAssistantPlugin.actions.show_text.text_action.CustomizationCore._set_enabled_disabled') + @patch('HomeAssistantPlugin.actions.show_text.text_action.CustomizationCore.set_enabled_disabled') def test_set_enabled_disabled_no_domain(self, super_set_enabled_disabled_mock): lm = { text_const.LABEL_NO_ENTITY: "No entity selected" @@ -173,7 +173,7 @@ def test_set_enabled_disabled_no_domain(self, super_set_enabled_disabled_mock): instance.show_unit = Mock() instance.unit_line_break = Mock() - instance._set_enabled_disabled() + instance.set_enabled_disabled() super_set_enabled_disabled_mock.assert_called_once() instance.position.widget.set_sensitive.assert_called_once_with(False) @@ -197,7 +197,7 @@ def test_set_enabled_disabled_no_domain(self, super_set_enabled_disabled_mock): instance.unit_line_break.widget.set_sensitive.assert_called_once_with(False) instance.unit_line_break.widget.set_subtitle.assert_called_once_with(lm[text_const.LABEL_NO_ENTITY]) - @patch('HomeAssistantPlugin.actions.show_text.text_action.CustomizationCore._set_enabled_disabled') + @patch('HomeAssistantPlugin.actions.show_text.text_action.CustomizationCore.set_enabled_disabled') def test_set_enabled_disabled_no_entity(self, super_set_enabled_disabled_mock): lm = { text_const.LABEL_NO_ENTITY: "No entity selected" @@ -220,7 +220,7 @@ def test_set_enabled_disabled_no_entity(self, super_set_enabled_disabled_mock): instance.show_unit = Mock() instance.unit_line_break = Mock() - instance._set_enabled_disabled() + instance.set_enabled_disabled() super_set_enabled_disabled_mock.assert_called_once() instance.position.widget.set_sensitive.assert_called_once_with(False) @@ -244,7 +244,7 @@ def test_set_enabled_disabled_no_entity(self, super_set_enabled_disabled_mock): instance.unit_line_break.widget.set_sensitive.assert_called_once_with(False) instance.unit_line_break.widget.set_subtitle.assert_called_once_with(lm[text_const.LABEL_NO_ENTITY]) - @patch('HomeAssistantPlugin.actions.show_text.text_action.CustomizationCore._set_enabled_disabled') + @patch('HomeAssistantPlugin.actions.show_text.text_action.CustomizationCore.set_enabled_disabled') def test_set_enabled_disabled_without_unit(self, super_set_enabled_disabled_mock): lm = { text_const.LABEL_NO_ENTITY: "No entity selected" @@ -275,7 +275,7 @@ def test_set_enabled_disabled_without_unit(self, super_set_enabled_disabled_mock instance.show_unit.get_active.return_value = False instance.unit_line_break = Mock() - instance._set_enabled_disabled() + instance.set_enabled_disabled() super_set_enabled_disabled_mock.assert_called_once() instance.position.widget.set_sensitive.assert_called_once_with(True) @@ -301,7 +301,7 @@ def test_set_enabled_disabled_without_unit(self, super_set_enabled_disabled_mock instance.unit_line_break.widget.set_sensitive.assert_has_calls([call(False), call(False)]) instance.unit_line_break.widget.set_subtitle.assert_called_once_with(text_const.EMPTY_STRING) - @patch('HomeAssistantPlugin.actions.show_text.text_action.CustomizationCore._set_enabled_disabled') + @patch('HomeAssistantPlugin.actions.show_text.text_action.CustomizationCore.set_enabled_disabled') def test_set_enabled_disabled_with_unit(self, super_set_enabled_disabled_mock): lm = { text_const.LABEL_NO_ENTITY: "No entity selected" @@ -335,7 +335,7 @@ def test_set_enabled_disabled_with_unit(self, super_set_enabled_disabled_mock): instance.show_unit.get_active.return_value = True instance.unit_line_break = Mock() - instance._set_enabled_disabled() + instance.set_enabled_disabled() super_set_enabled_disabled_mock.assert_called_once() instance.position.widget.set_sensitive.assert_called_once_with(True) @@ -359,13 +359,13 @@ def test_set_enabled_disabled_with_unit(self, super_set_enabled_disabled_mock): instance.unit_line_break.widget.set_sensitive.assert_called_once_with(True) instance.unit_line_break.widget.set_subtitle.assert_called_once_with(text_const.EMPTY_STRING) - @patch('HomeAssistantPlugin.actions.show_text.text_action.CustomizationCore._on_change_entity') + @patch('HomeAssistantPlugin.actions.show_text.text_action.CustomizationCore.on_change_entity') def test_on_change_entity(self, super_on_change_entity_mock): instance = ShowText.__new__(ShowText) instance.initialized = True instance._load_attributes = Mock() - instance._on_change_entity(None, "entity", "old_entity") + instance.on_change_entity(None, "entity", "old_entity") instance._load_attributes.assert_called_once() super_on_change_entity_mock.assert_called_once_with(None, "entity", "old_entity") @@ -427,7 +427,7 @@ def test_refresh_not_initialized(self, text_helper_mock): instance.plugin_base.backend.get_entity.return_value = {"state": "state"} instance._load_attributes = Mock() instance._load_customizations = Mock() - instance._set_enabled_disabled = Mock() + instance.set_enabled_disabled = Mock() text_helper_mock.get_text.return_value = ("a", "b", "c", "d", "e", "f") instance.refresh() @@ -440,7 +440,7 @@ def test_refresh_not_initialized(self, text_helper_mock): instance.settings.get_entity.assert_not_called() instance._load_attributes.assert_not_called() instance._load_customizations.assert_not_called() - instance._set_enabled_disabled.assert_not_called() + instance.set_enabled_disabled.assert_not_called() @patch('HomeAssistantPlugin.actions.show_text.text_action.text_helper') def test_refresh_no_entity(self, text_helper_mock): @@ -454,7 +454,7 @@ def test_refresh_no_entity(self, text_helper_mock): instance.settings.get_entity.return_value = "" instance._load_attributes = Mock() instance._load_customizations = Mock() - instance._set_enabled_disabled = Mock() + instance.set_enabled_disabled = Mock() instance.refresh() @@ -464,7 +464,7 @@ def test_refresh_no_entity(self, text_helper_mock): instance.settings.get_entity.assert_called_once() instance._load_attributes.assert_not_called() instance._load_customizations.assert_not_called() - instance._set_enabled_disabled.assert_not_called() + instance.set_enabled_disabled.assert_not_called() @patch('HomeAssistantPlugin.actions.show_text.text_action.text_helper') def test_refresh_no_state(self, text_helper_mock): @@ -480,7 +480,7 @@ def test_refresh_no_state(self, text_helper_mock): instance.plugin_base.backend.get_entity.return_value = None instance._load_attributes = Mock() instance._load_customizations = Mock() - instance._set_enabled_disabled = Mock() + instance.set_enabled_disabled = Mock() instance.refresh() @@ -490,7 +490,7 @@ def test_refresh_no_state(self, text_helper_mock): instance.settings.get_entity.assert_called_once() instance._load_attributes.assert_called_once() instance._load_customizations.assert_not_called() - instance._set_enabled_disabled.assert_not_called() + instance.set_enabled_disabled.assert_not_called() @patch('HomeAssistantPlugin.actions.show_text.text_action.text_helper') def test_refresh_success(self, text_helper_mock): @@ -507,7 +507,7 @@ def test_refresh_success(self, text_helper_mock): instance.plugin_base.backend.get_entity.return_value = {"state": "state"} instance._load_attributes = Mock() instance._load_customizations = Mock() - instance._set_enabled_disabled = Mock() + instance.set_enabled_disabled = Mock() text_helper_mock.get_text.return_value = ("a", "b", "c", "d", "e", "f") instance.refresh() @@ -520,7 +520,7 @@ def test_refresh_success(self, text_helper_mock): text_helper_mock.get_text.assert_called_once_with({"state": "state"}, instance.settings, True) instance.set_label.assert_called_once_with("a", "b", "d", None, "c", "e", "f", None, None, True) instance._load_customizations.assert_called_once() - instance._set_enabled_disabled.assert_called_once() + instance.set_enabled_disabled.assert_called_once() def test_get_domains(self): instance = ShowText.__new__(ShowText) diff --git a/test/actions/show_text/test_text_window.py b/test/actions/show_text/test_text_window.py index 72851a1..df37729 100644 --- a/test/actions/show_text/test_text_window.py +++ b/test/actions/show_text/test_text_window.py @@ -83,10 +83,10 @@ def test_on_change_attribute_custom_text_visible(self): instance.custom_text.set_visible.assert_called_once_with(True) @patch( - 'HomeAssistantPlugin.actions.show_text.text_window.CustomizationWindow._set_default_values') + 'HomeAssistantPlugin.actions.show_text.text_window.CustomizationWindow.set_default_values') @patch( 'HomeAssistantPlugin.actions.show_text.text_window.customization_helper') - def test_set_default_values(self, customization_helper_mock, super_set_default_values_mock): + def testset_default_values(self, customization_helper_mock, super_set_default_values_mock): instance = TextWindow.__new__(TextWindow) position1 = Mock() @@ -122,7 +122,7 @@ def test_set_default_values(self, customization_helper_mock, super_set_default_v customization_helper_mock.convert_color_list_to_rgba.side_effect = ["color1", "color2"] - instance._set_default_values() + instance.set_default_values() super_set_default_values_mock.assert_called_once_with() instance.position.set_selected.assert_called_once_with(1) @@ -142,17 +142,17 @@ def test_set_default_values(self, customization_helper_mock, super_set_default_v instance.show_line_break.set_active.assert_called_once_with(text_const.DEFAULT_UNIT_LINE_BREAK) @patch( - 'HomeAssistantPlugin.actions.show_text.text_window.CustomizationWindow._set_current_values') + 'HomeAssistantPlugin.actions.show_text.text_window.CustomizationWindow.set_current_values') def test_set_current_values_no_current(self, super_current_values_mock): instance = TextWindow.__new__(TextWindow) instance.current = None - instance._set_current_values() + instance.set_current_values() super_current_values_mock.assert_not_called() @patch( - 'HomeAssistantPlugin.actions.show_text.text_window.CustomizationWindow._set_current_values') + 'HomeAssistantPlugin.actions.show_text.text_window.CustomizationWindow.set_current_values') @patch( 'HomeAssistantPlugin.actions.show_text.text_window.customization_helper') def test_set_current_values_success(self, customization_helper_mock, super_current_values_mock): @@ -214,7 +214,7 @@ def test_set_current_values_success(self, customization_helper_mock, super_curre customization_helper_mock.convert_color_list_to_rgba.side_effect = ["color1", "color2"] - instance._set_current_values() + instance.set_current_values() super_current_values_mock.assert_called_once() instance.position.set_selected.assert_called_once_with(1) @@ -480,7 +480,7 @@ def test_on_add_button_success(self, text_customization_mock, customization_help instance.destroy.assert_called_once() @patch( - 'HomeAssistantPlugin.actions.show_text.text_window.CustomizationWindow._on_widget_changed') + 'HomeAssistantPlugin.actions.show_text.text_window.CustomizationWindow.on_widget_changed') def test_on_widget_changed(self, super_on_widget_changed_mock): instance = TextWindow.__new__(TextWindow) instance.check_position = Mock() @@ -494,7 +494,7 @@ def test_on_widget_changed(self, super_on_widget_changed_mock): instance.check_show_unit = Mock() instance.check_line_break = Mock() - instance._on_widget_changed() + instance.on_widget_changed() super_on_widget_changed_mock.assert_called_once() instance.check_position.remove_css_class.assert_called_once_with(text_const.ERROR) diff --git a/test/backend/test_backend_get_entity.py b/test/backend/test_backend_get_entity.py index 47e4ca3..af5d180 100644 --- a/test/backend/test_backend_get_entity.py +++ b/test/backend/test_backend_get_entity.py @@ -1,7 +1,7 @@ import sys import unittest from pathlib import Path -from typing import Dict, Any +from typing import Any from unittest.mock import patch absolute_plugin_path = str(Path(__file__).parent.parent.parent.parent.absolute()) @@ -16,7 +16,8 @@ class TestBackendGetEntity(unittest.TestCase): @patch.object(HomeAssistantBackend, 'connect') @patch.object(HomeAssistantBackend, 'is_connected', return_value=True) def test_get_entity_no_id(self, is_connected_mock, _): - instance = HomeAssistantBackend(backend_const.EMPTY_STRING, backend_const.EMPTY_STRING, True, True, backend_const.EMPTY_STRING) + instance = HomeAssistantBackend(backend_const.EMPTY_STRING, backend_const.EMPTY_STRING, True, True, + backend_const.EMPTY_STRING) result = instance.get_entity(backend_const.EMPTY_STRING) expected = { @@ -31,7 +32,8 @@ def test_get_entity_no_id(self, is_connected_mock, _): @patch.object(HomeAssistantBackend, 'connect') @patch.object(HomeAssistantBackend, 'is_connected', return_value=True) def test_get_entity_no_dot_in_id(self, is_connected_mock, _): - instance = HomeAssistantBackend(backend_const.EMPTY_STRING, backend_const.EMPTY_STRING, True, True, backend_const.EMPTY_STRING) + instance = HomeAssistantBackend(backend_const.EMPTY_STRING, backend_const.EMPTY_STRING, True, True, + backend_const.EMPTY_STRING) result = instance.get_entity("domainentitiy") expected = { @@ -46,7 +48,7 @@ def test_get_entity_no_dot_in_id(self, is_connected_mock, _): @patch.object(HomeAssistantBackend, 'connect') @patch.object(HomeAssistantBackend, 'is_connected', return_value=True) def test_get_entity_success(self, is_connected_mock, _): - entities: Dict[str, Dict[str, Any]] = { + entities: dict[str, dict[str, Any]] = { "domain1": { "domain1.entity1": { "keys": { @@ -75,7 +77,8 @@ def test_get_entity_success(self, is_connected_mock, _): } } - instance = HomeAssistantBackend(backend_const.EMPTY_STRING, backend_const.EMPTY_STRING, True, True, backend_const.EMPTY_STRING) + instance = HomeAssistantBackend(backend_const.EMPTY_STRING, backend_const.EMPTY_STRING, True, True, + backend_const.EMPTY_STRING) instance._entities = entities result = instance.get_entity("domain1.entity2") @@ -84,4 +87,3 @@ def test_get_entity_success(self, is_connected_mock, _): self.assertEqual(expected, result) self.assertEqual(2, is_connected_mock.call_count) - diff --git a/test/stream_controller_mock/GtkHelper/GenerativeUI/ComboRow.py b/test/stream_controller_mock/GtkHelper/GenerativeUI/ComboRow.py index e2e12d4..242d197 100644 --- a/test/stream_controller_mock/GtkHelper/GenerativeUI/ComboRow.py +++ b/test/stream_controller_mock/GtkHelper/GenerativeUI/ComboRow.py @@ -3,6 +3,7 @@ class ComboRow: def __init__(self, *args, **kwargs): self.args = args self.kwargs = kwargs + self._widget = self def get_selected_item(self): pass @@ -17,4 +18,12 @@ def set_sensitive(self, _: bool) -> None: pass def get_item_amount(self) -> int: - return len(self.args[3]) \ No newline at end of file + return len(self.args[3]) + + @property + def widget(self): + return self._widget + + @widget.setter + def widget(self, value): + self._widget = value \ No newline at end of file diff --git a/test/stream_controller_mock/src/backend/PluginManager/PluginBase.py b/test/stream_controller_mock/src/backend/PluginManager/PluginBase.py index b1b8479..5cf4ff0 100644 --- a/test/stream_controller_mock/src/backend/PluginManager/PluginBase.py +++ b/test/stream_controller_mock/src/backend/PluginManager/PluginBase.py @@ -1,4 +1,4 @@ -from typing import Dict, Any +from typing import Any from HomeAssistantPlugin.const import SETTING_HOST, SETTING_PORT, SETTING_SSL, SETTING_TOKEN @@ -23,5 +23,5 @@ def register(self, **kwargs): def get_settings(self): return self.settings - def set_settings(self, settings: Dict[str, Any]): + def set_settings(self, settings: dict[str, Any]): self.settings = settings