diff --git a/pyoverkiz/client.py b/pyoverkiz/client.py index 7a83b36a..8767eff8 100644 --- a/pyoverkiz/client.py +++ b/pyoverkiz/client.py @@ -61,9 +61,11 @@ Option, OptionParameter, Place, + ProtocolType, ServerConfig, Setup, State, + UIProfileDefinition, ) from pyoverkiz.obfuscate import obfuscate_sensitive_data from pyoverkiz.serializers import prepare_payload @@ -651,6 +653,76 @@ async def get_setup_option_parameter( return None + @retry_on_auth_error + async def get_reference_controllable(self, controllable_name: str) -> JSON: + """Get a controllable definition.""" + return await self.__get( + f"reference/controllable/{urllib.parse.quote_plus(controllable_name)}" + ) + + @retry_on_auth_error + async def get_reference_controllable_types(self) -> JSON: + """Get details about all supported controllable types.""" + return await self.__get("reference/controllableTypes") + + @retry_on_auth_error + async def search_reference_devices_model(self, payload: JSON) -> JSON: + """Search reference device models using a POST payload.""" + return await self.__post("reference/devices/search", payload) + + @retry_on_auth_error + async def get_reference_protocol_types(self) -> list[ProtocolType]: + """Get details about supported protocol types on that server instance. + + Returns a list of protocol type definitions, each containing: + - id: Numeric protocol identifier + - prefix: URL prefix used in device addresses + - name: Internal protocol name + - label: Human-readable protocol label + """ + response = await self.__get("reference/protocolTypes") + return [ProtocolType(**protocol) for protocol in response] + + @retry_on_auth_error + async def get_reference_timezones(self) -> JSON: + """Get timezones list.""" + return await self.__get("reference/timezones") + + @retry_on_auth_error + async def get_reference_ui_classes(self) -> list[str]: + """Get a list of all defined UI classes.""" + return await self.__get("reference/ui/classes") + + @retry_on_auth_error + async def get_reference_ui_classifiers(self) -> list[str]: + """Get a list of all defined UI classifiers.""" + return await self.__get("reference/ui/classifiers") + + @retry_on_auth_error + async def get_reference_ui_profile(self, profile_name: str) -> UIProfileDefinition: + """Get a description of a given UI profile (or form-factor variant). + + Returns a profile definition containing: + - name: Profile name + - commands: Available commands with parameters and descriptions + - states: Available states with value types and descriptions + - form_factor: Whether profile is tied to a specific physical device type + """ + response = await self.__get( + f"reference/ui/profile/{urllib.parse.quote_plus(profile_name)}" + ) + return UIProfileDefinition(**humps.decamelize(response)) + + @retry_on_auth_error + async def get_reference_ui_profile_names(self) -> list[str]: + """Get a list of all defined UI profiles (and form-factor variants).""" + return await self.__get("reference/ui/profileNames") + + @retry_on_auth_error + async def get_reference_ui_widgets(self) -> list[str]: + """Get a list of all defined UI widgets.""" + return await self.__get("reference/ui/widgets") + async def __get(self, path: str) -> Any: """Make a GET request to the OverKiz API.""" await self._refresh_token_if_expired() diff --git a/pyoverkiz/enums/__init__.py b/pyoverkiz/enums/__init__.py index e7fc94e0..bf6080d1 100644 --- a/pyoverkiz/enums/__init__.py +++ b/pyoverkiz/enums/__init__.py @@ -1,13 +1,43 @@ """Convenience re-exports for the enums package.""" -# flake8: noqa: F403 +# Explicitly re-export all Enum subclasses to avoid wildcard import issues +from pyoverkiz.enums.command import CommandMode, OverkizCommand, OverkizCommandParam +from pyoverkiz.enums.execution import ( + ExecutionState, + ExecutionSubType, + ExecutionType, +) +from pyoverkiz.enums.gateway import GatewaySubType, GatewayType, UpdateBoxStatus +from pyoverkiz.enums.general import DataType, EventName, FailureType, ProductType +from pyoverkiz.enums.measured_value_type import MeasuredValueType +from pyoverkiz.enums.protocol import Protocol +from pyoverkiz.enums.server import APIType, Server +from pyoverkiz.enums.state import OverkizAttribute, OverkizState +from pyoverkiz.enums.ui import UIClass, UIClassifier, UIWidget +from pyoverkiz.enums.ui_profile import UIProfile -from .command import * -from .execution import * -from .gateway import * -from .general import * -from .measured_value_type import * -from .protocol import * -from .server import * -from .state import * -from .ui import * +__all__ = [ + "APIType", + "CommandMode", + "DataType", + "EventName", + "ExecutionState", + "ExecutionSubType", + "ExecutionType", + "FailureType", + "GatewaySubType", + "GatewayType", + "MeasuredValueType", + "OverkizAttribute", + "OverkizCommand", + "OverkizCommandParam", + "OverkizState", + "ProductType", + "Protocol", + "Server", + "UIClass", + "UIClassifier", + "UIProfile", + "UIWidget", + "UpdateBoxStatus", +] diff --git a/pyoverkiz/enums/base.py b/pyoverkiz/enums/base.py new file mode 100644 index 00000000..9204194b --- /dev/null +++ b/pyoverkiz/enums/base.py @@ -0,0 +1,27 @@ +"""Shared enum helpers for consistent parsing and logging.""" + +from __future__ import annotations + +import logging +from typing import Self, cast + + +class UnknownEnumMixin: + """Mixin for enums that need an `UNKNOWN` fallback. + + Define `UNKNOWN` on the enum and optionally override + `__missing_message__` to customize the log message. + """ + + __missing_message__ = "Unsupported value %s has been returned for %s" + + @classmethod + def _missing_(cls, value: object) -> Self: # type: ignore[override] + """Return `UNKNOWN` and log unrecognized values. + + Intentionally overrides the Enum base `_missing_` to provide an UNKNOWN fallback. + """ + message = cls.__missing_message__ + logging.getLogger(cls.__module__).warning(message, value, cls) + # Type checker cannot infer UNKNOWN exists on Self, but all subclasses define it + return cast(Self, cls.UNKNOWN) # type: ignore[attr-defined] diff --git a/pyoverkiz/enums/command.py b/pyoverkiz/enums/command.py index 2964a448..48a9f23f 100644 --- a/pyoverkiz/enums/command.py +++ b/pyoverkiz/enums/command.py @@ -10,9 +10,11 @@ class OverkizCommand(StrEnum): """Device commands used by Overkiz.""" + ACTIVATE_CALENDAR = "activateCalendar" ACTIVATE_OPTION = "activateOption" ADD_LOCK_LEVEL = "addLockLevel" ADVANCED_REFRESH = "advancedRefresh" + ADVANCED_SOMFY_DISCOVER = "advancedSomfyDiscover" ALARM_OFF = "alarmOff" ALARM_ON = "alarmOn" ALARM_PARTIAL_1 = "alarmPartial1" @@ -21,48 +23,121 @@ class OverkizCommand(StrEnum): ARM = "arm" ARM_PARTIAL_DAY = "armPartialDay" ARM_PARTIAL_NIGHT = "armPartialNight" + BIND = "bind" + BINDING_NETWORK = "bindingNetwork" BIP = "bip" + BLINK_MODEM_LED = "blinkModemLed" CANCEL_ABSENCE = "cancelAbsence" + CANCEL_HEATING_LEVEL = "cancelHeatingLevel" + CANCEL_HOLIDAY_MODE = "cancelHolidayMode" CHECK_EVENT_TRIGGER = "checkEventTrigger" + CLEAR_CREDENTIALS = "clearCredentials" CLOSE = "close" + CLOSE_NETWORK = "closeNetwork" + CLOSE_NETWORK_MANAGEMENT = "closeNetworkManagement" CLOSE_SLATS = "closeSlats" + CONFIGURE_HOLIDAY_MODE = "configureHolidayMode" CYCLE = "cycle" + DEACTIVATE_CALENDAR = "deactivateCalendar" DEACTIVATE_OPTION = "deactivateOption" DELAYED_STOP_IDENTIFY = "delayedStopIdentify" + DELETE_CONTROLLERS = "deleteControllers" DEPLOY = "deploy" - DISARM = "disarm" DING_DONG = "dingDong" + DISARM = "disarm" + DISCOVER = "discover" + DISCOVER1_WAY_CONTROLLER = "discover1WayController" + DISCOVER_ACTUATORS = "discoverActuators" + DISCOVER_SENSORS = "discoverSensors" + DISCOVER_SOMFY_UNSET_ACTUATORS = "discoverSomfyUnsetActuators" DOWN = "down" EXIT_DEROGATION = "exitDerogation" + FAST_BACKWARD = "fastBackward" FAST_BIP_SEQUENCE = "fastBipSequence" + FAST_FORWARD = "fastForward" + GET_ALL_PLAYING_INFO = "getAllPlayingInfo" GET_CLOSURE = "getClosure" + GET_CURRENT_TRANSPORT_ACTIONS = "getCurrentTransportActions" + GET_GROUP_MUTE = "getGroupMute" + GET_GROUP_VOLUME = "getGroupVolume" GET_LEVEL = "getLevel" GET_LOWER_CLOSURE = "getLowerClosure" + GET_MEDIA_ELEMENTS = "getMediaElements" + GET_MEDIA_INFO = "getMediaInfo" + GET_MUTE = "getMute" GET_NAME = "getName" + GET_POSITION_INFO = "getPositionInfo" + GET_SONOS_FAVORITES = "getSonosFavorites" + GET_SONOS_PLAYLIST = "getSonosPlaylist" + GET_TRANSPORT_INFO = "getTransportInfo" GET_UPPER_CLOSURE = "getUpperClosure" + GET_VOLUME = "getVolume" GLOBAL_CONTROL = "globalControl" GO_TO_ALIAS = "goToAlias" IDENTIFY = "identify" + INCREASING_FREQUENCY_BIP = "increasingFrequencyBip" + IS_FAILED_DEVICE = "isFailedDevice" + JOIN_NETWORK = "joinNetwork" + KEEP_ONE_WAY_CONTROLLERS_AND_DELETE_NODE = "keepOneWayControllersAndDeleteNode" + LEAVE_NETWORK = "leaveNetwork" LOCK = "lock" + LONG_BIP = "longBip" LOWER_CLOSE = "lowerClose" LOWER_DOWN = "lowerDown" LOWER_OPEN = "lowerOpen" LOWER_UP = "lowerUp" MEMORIZED_VOLUME = "memorizedVolume" + MUTE = "mute" + MUTE_GROUP = "muteGroup" MY = "my" + NEXT = "next" + NO_PERSON_INSIDE = "noPersonInside" OFF = "off" OFFLINE = "offline" ON = "on" ONLINE = "online" + ON_WITH_INTERNAL_TIMER = "onWithInternalTimer" ON_WITH_TIMER = "onWithTimer" OPEN = "open" + OPEN_CONFIGURATION = "openConfiguration" + OPEN_NETWORK = "openNetwork" + OPEN_NETWORK_MANAGEMENT = "openNetworkManagement" + OPEN_NETWORK_WITH_COMMISSIONING_MANAGEMENT = ( + "openNetworkWithCommissioningManagement" + ) OPEN_SLATS = "openSlats" + PAIR = "pair" PAIR_ONE_WAY_CONTROLLER = "pairOneWayController" PARTIAL = "partial" PARTIAL_POSITION = "partialPosition" + PAUSE = "pause" + PERSON_INSIDE = "personInside" + PLAY = "play" + PLAY_URI = "playURI" + PREVIOUS = "previous" + REBOOT_MODEM = "rebootModem" + REFRESH_ABSENCE_END_DATE = "refreshAbsenceEndDate" + REFRESH_ABSENCE_MODE = "refreshAbsenceMode" REFRESH_ABSENCE_SCHEDULING_AVAILABILITY = "refreshAbsenceSchedulingAvailability" + REFRESH_ABSENCE_START_DATE = "refreshAbsenceStartDate" + REFRESH_ACTIVE_MODE = "refreshActiveMode" + REFRESH_AIRPLANE_MODE = "refreshAirplaneMode" + REFRESH_ALARM_DELAY = "refreshAlarmDelay" + REFRESH_ALARM_STATUS = "refreshAlarmStatus" + REFRESH_ANTI_LEGIONELLOSIS = "refreshAntiLegionellosis" + REFRESH_AUTO_PROGRAM = "refreshAutoProgram" REFRESH_AWAY_MODE_DURATION = "refreshAwayModeDuration" + REFRESH_BATTERY_LEVEL = "refreshBatteryLevel" + REFRESH_BATTERY_STATUS = "refreshBatteryStatus" + REFRESH_BINDING_TABLE = "refreshBindingTable" + REFRESH_BOILER_INSTALLATION_OPTION = "refreshBoilerInstallationOption" + REFRESH_BOOST_END_DATE = "refreshBoostEndDate" + REFRESH_BOOST_MODE = "refreshBoostMode" REFRESH_BOOST_MODE_DURATION = "refreshBoostModeDuration" + REFRESH_BOOST_MODE_PARAMETERS = "refreshBoostModeParameters" + REFRESH_BOOST_START_DATE = "refreshBoostStartDate" + REFRESH_BOTTOM_TANK_WATER_TEMPERATURE = "refreshBottomTankWaterTemperature" + REFRESH_CO2_HISTORY = "refreshCO2History" REFRESH_COMFORT_COOLING_TARGET_TEMPERATURE = ( "refreshComfortCoolingTargetTemperature" ) @@ -70,77 +145,197 @@ class OverkizCommand(StrEnum): "refreshComfortHeatingTargetTemperature" ) REFRESH_COMFORT_TARGET_DWH_TEMPERATURE = "refreshComfortTargetDHWTemperature" + REFRESH_COMFORT_TEMPERATURE = "refreshComfortTemperature" + REFRESH_CONTROLLER_ADDRESS = "refreshControllerAddress" + REFRESH_CUMULATED_LOWERING = "refreshCumulatedLowering" + REFRESH_CURRENT_ALARM_MODE = "refreshCurrentAlarmMode" + REFRESH_CURRENT_OPERATING_MODE = "refreshCurrentOperatingMode" + REFRESH_CURRENT_WORKING_RATE = "refreshCurrentWorkingRate" + REFRESH_DATE_TIME = "refreshDateTime" + REFRESH_DELETION_CANCELATION = "refreshDeletionCancelation" + REFRESH_DEROGATED_TARGET_TEMPERATURE = "refreshDerogatedTargetTemperature" + REFRESH_DEROGATION = "refreshDerogation" REFRESH_DEROGATION_REMAINING_TIME = "refreshDerogationRemainingTime" REFRESH_DEVICE_SERIAL_NUMBER = "refreshDeviceSerialNumber" + REFRESH_DHWCAPACITY = "refreshDHWCapacity" + REFRESH_DHWERROR = "refreshDHWError" + REFRESH_DHW_MODE = "refreshDHWMode" + REFRESH_DRYING_DURATION = "refreshDryingDuration" + REFRESH_DRYING_PARAMETERS = "refreshDryingParameters" REFRESH_ECO_COOLING_TARGET_TEMPERATURE = "refreshEcoCoolingTargetTemperature" REFRESH_ECO_HEATING_TARGET_TEMPERATURE = "refreshEcoHeatingTargetTemperature" REFRESH_ECO_TARGET_DWH_TEMPERATURE = "refreshEcoTargetDHWTemperature" + REFRESH_ECO_TEMPERATURE = "refreshEcoTemperature" + REFRESH_EFFECTIVE_TEMPERATURE_SETPOINT = "refreshEffectiveTemperatureSetpoint" + REFRESH_ELECTRICAL_EXTRA_MANAGEMENT = "refreshElectricalExtraManagement" + REFRESH_ELECTRIC_ENERGY_CONSUMPTION = "refreshElectricEnergyConsumption" + REFRESH_ENERGY_SAVING = "refreshEnergySaving" REFRESH_ERROR_CODE = "refreshErrorCode" - REFRESH_DHW_MODE = "refreshDHWMode" - REFRESH_HEATING_STATUS = "refreshHeatingStatus" + REFRESH_EXPECTED_NUMBER_OF_SHOWER = "refreshExpectedNumberOfShower" + REFRESH_EXTRACTION_OPTION = "refreshExtractionOption" + REFRESH_GPRSREGISTRATION = "refreshGPRSRegistration" + REFRESH_GSMREGISTRATION = "refreshGSMRegistration" REFRESH_HEATING_DEROGATION_AVAILABILITY = "refreshHeatingDerogationAvailability" + REFRESH_HEATING_LEVEL = "refreshHeatingLevel" + REFRESH_HEATING_STATUS = "refreshHeatingStatus" + REFRESH_IDENTIFIER = "refreshIdentifier" + REFRESH_INSTALLATION = "refreshInstallation" + REFRESH_INTRUSION_DETECTED = "refreshIntrusionDetected" + REFRESH_LOCAL_LEAD_TIME = "refreshLocalLeadTime" + REFRESH_MANUFACTURER_NAME = "refreshManufacturerName" + REFRESH_MANUFACTURER_SPECIFIC = "refreshManufacturerSpecific" + REFRESH_MAXIMUM_COOLING_TARGET_TEMPERATURE = ( + "refreshMaximumCoolingTargetTemperature" + ) + REFRESH_MAXIMUM_HEATING_TARGET_TEMPERATURE = ( + "refreshMaximumHeatingTargetTemperature" + ) + REFRESH_MAXIMUM_TARGET_TEMPERATURE = "refreshMaximumTargetTemperature" + REFRESH_MEMORIZED1_ORIENTATION = "refreshMemorized1Orientation" REFRESH_MEMORIZED_1_POSITION = "refreshMemorized1Position" + REFRESH_MIDDLE_WATER_TEMPERATURE = "refreshMiddleWaterTemperature" + REFRESH_MIDDLE_WATER_TEMPERATURE_IN = "refreshMiddleWaterTemperatureIn" + REFRESH_MINIMUM_COOLING_TARGET_TEMPERATURE = ( + "refreshMinimumCoolingTargetTemperature" + ) + REFRESH_MINIMUM_HEATING_TARGET_TEMPERATURE = ( + "refreshMinimumHeatingTargetTemperature" + ) + REFRESH_MODEL = "refreshModel" + REFRESH_MODE_SETTINGS = "refreshModeSettings" + REFRESH_NATIVE_FUNCTIONAL_LEVEL = "refreshNativeFunctionalLevel" + REFRESH_NEIGHBOR_TABLE = "refreshNeighborTable" + REFRESH_NETWORK = "refreshNetwork" + REFRESH_OCCUPANCY = "refreshOccupancy" + REFRESH_ON_OFF_STATE = "refreshOnOffState" REFRESH_OPERATING_MODE = "refreshOperatingMode" + REFRESH_OPERATING_MODE_CAPABILITIES = "refreshOperatingModeCapabilities" + REFRESH_OPERATING_RANGE = "refreshOperatingRange" + REFRESH_OPERATING_TIME = "refreshOperatingTime" + REFRESH_OPERATOR_CONFIG = "refreshOperatorConfig" + REFRESH_OPERATOR_NAME = "refreshOperatorName" REFRESH_PASS_APC_COOLING_MODE = "refreshPassAPCCoolingMode" REFRESH_PASS_APC_COOLING_PROFILE = "refreshPassAPCCoolingProfile" REFRESH_PASS_APC_HEATING_MODE = "refreshPassAPCHeatingMode" REFRESH_PASS_APC_HEATING_PROFILE = "refreshPassAPCHeatingProfile" + REFRESH_PEAK_NOTICE = "refreshPeakNotice" + REFRESH_PEAK_WARNING = "refreshPeakWarning" + REFRESH_POD_MODE = "refreshPodMode" + REFRESH_POWER_AND_TENSION = "refreshPowerAndTension" REFRESH_POWER_HEAT_ELECTRICAL = "refreshPowerHeatElectrical" REFRESH_PRODUCT_TYPE = "refreshProductType" + REFRESH_PROGRAMMING_SLOTS = "refreshProgrammingSlots" + REFRESH_RATE_MANAGEMENT = "refreshRateManagement" + REFRESH_RELATIVE_HUMIDITY = "refreshRelativeHumidity" + REFRESH_ROOM_DELETION_THRESHOLD = "refreshRoomDeletionThreshold" + REFRESH_ROUTING_TABLE = "refreshRoutingTable" + REFRESH_RSSILEVEL = "refreshRSSILevel" + REFRESH_SECURED_POSITION_TEMPERATURE = "refreshSecuredPositionTemperature" + REFRESH_SENSORS_STATE = "refreshSensorsState" + REFRESH_SETPOINT_LOWERING_TEMPERATURE_IN_PROG_MODE = ( + "refreshSetpointLoweringTemperatureInProgMode" + ) + REFRESH_SET_POINT_MODE = "refreshSetPointMode" + REFRESH_SIMCARD_STATUS = "refreshSIMCardStatus" + REFRESH_SIREN_STATUS = "refreshSirenStatus" + REFRESH_SMART_GRID_OPTION = "refreshSmartGridOption" + REFRESH_SSVERROR6 = "refreshSSVError6" REFRESH_STATE = "refreshState" + REFRESH_SYNCHRONISATION_REQUEST = "refreshSynchronisationRequest" REFRESH_TARGET_DWH_TEMPERATURE = "refreshTargetDHWTemperature" REFRESH_TARGET_TEMPERATURE = "refreshTargetTemperature" + REFRESH_TEMPERATURE = "refreshTemperature" + REFRESH_TEMPERATURE_PROBE_CALIBRATION_OFFSET = ( + "refreshTemperatureProbeCalibrationOffset" + ) REFRESH_THERMAL_SCHEDULING_AVAILABILITY = "refreshThermalSchedulingAvailability" + REFRESH_THERMOSTAT_SETPOINT_SUPPORTED = "refreshThermostatSetpointSupported" + REFRESH_THERMOSTAT_SET_POINT = "refreshThermostatSetPoint" + REFRESH_TIME_PROGRAM = "refreshTimeProgram" REFRESH_TIME_PROGRAM_BY_ID = "refreshTimeProgramById" + REFRESH_TOWEL_DRYER_TEMPORARY_STATE = "refreshTowelDryerTemporaryState" + REFRESH_TOWEL_DRYER_TIME_PROGRAM = "refreshTowelDryerTimeProgram" + REFRESH_UPDATE_STATUS = "refreshUpdateStatus" REFRESH_VENTILATION_CONFIGURATION_MODE = "refreshVentilationConfigurationMode" REFRESH_VENTILATION_STATE = "refreshVentilationState" + REFRESH_WAKE_UP_INTERVAL = "refreshWakeUpInterval" + REFRESH_WATER_CONSUMPTION = "refreshWaterConsumption" REFRESH_WATER_TARGET_TEMPERATURE = "refreshWaterTargetTemperature" + REFRESH_WATER_TEMPERATURE = "refreshWaterTemperature" REFRESH_ZONES_NUMBER = "refreshZonesNumber" + REFRESH_ZONES_PASS_APC_COOLING_PROFILE = "refreshZonesPassAPCCoolingProfile" + REFRESH_ZONES_PASS_APC_HEATING_PROFILE = "refreshZonesPassAPCHeatingProfile" REFRESH_ZONES_TARGET_TEMPERATURE = "refreshZonesTargetTemperature" REFRESH_ZONES_TEMPERATURE = "refreshZonesTemperature" REFRESH_ZONES_TEMPERATURE_SENSOR_AVAILABILITY = ( "refreshZonesTemperatureSensorAvailability" ) REFRESH_ZONES_THERMAL_CONFIGURATION = "refreshZonesThermalConfiguration" - REFRESH_ZONES_PASS_APC_COOLING_PROFILE = "refreshZonesPassAPCCoolingProfile" - REFRESH_ZONES_PASS_APC_HEATING_PROFILE = "refreshZonesPassAPCHeatingProfile" + REMOVE_FAILED_NODE = "removeFailedNode" REMOVE_LOCK_LEVEL = "removeLockLevel" + REPLACE_FAILED_DEVICE = "replaceFailedDevice" + RESET = "reset" RESET_LOCK_LEVELS = "resetLockLevels" + RESET_NETWORK_SECURITY = "resetNetworkSecurity" + RESET_VENTILATION = "resetVentilation" REST = "rest" + RESUME = "resume" + REWIND = "rewind" RIGHT = "right" RING = "ring" + RING_WITH_DOUBLE_SIMPLE_SEQUENCE = "ringWithDoubleSimpleSequence" RING_WITH_SINGLE_SIMPLE_SEQUENCE = "ringWithSingleSimpleSequence" + RING_WITH_THREE_SIMPLE_SEQUENCE = "ringWithThreeSimpleSequence" + RUN_MANUFACTURER_SETTINGS_COMMAND = "runManufacturerSettingsCommand" SAVE_ALIAS = "saveAlias" - SET_ABSENCE_MODE = "setAbsenceMode" + SEND_IOKEY = "sendIOKey" + SEND_PRIVATE = "sendPrivate" SET_ABSENCE_COOLING_TARGET_TEMPERATURE = "setAbsenceCoolingTargetTemperature" SET_ABSENCE_END_DATE = "setAbsenceEndDate" SET_ABSENCE_END_DATE_TIME = "setAbsenceEndDateTime" SET_ABSENCE_HEATING_TARGET_TEMPERATURE = "setAbsenceHeatingTargetTemperature" + SET_ABSENCE_MODE = "setAbsenceMode" SET_ABSENCE_START_DATE = "setAbsenceStartDate" SET_ABSENCE_START_DATE_TIME = "setAbsenceStartDateTime" + SET_ACTIVE_COOLING_TIME_PROGRAM = "setActiveCoolingTimeProgram" + SET_ACTIVE_HEATING_TIME_PROGRAM = "setActiveHeatingTimeProgram" SET_ACTIVE_MODE = "setActiveMode" + SET_AIRPLANE_MODE = "setAirplaneMode" SET_AIR_DEMAND_MODE = "setAirDemandMode" + SET_ALARM_DELAY = "setAlarmDelay" SET_ALARM_STATUS = "setAlarmStatus" SET_ALL_MODE_TEMPERATURES = "setAllModeTemperatures" + SET_ANTI_LEGIONELLOSIS = "setAntiLegionellosis" SET_AUTO_MANU_MODE = "setAutoManuMode" SET_AWAY_MODE_DURATION = "setAwayModeDuration" + SET_BOILER_INSTALLATION_OPTION = "setBoilerInstallationOption" + SET_BOOST_END_DATE = "setBoostEndDate" SET_BOOST_MODE = "setBoostMode" SET_BOOST_MODE_DURATION = "setBoostModeDuration" SET_BOOST_ON_OFF_STATE = "setBoostOnOffState" + SET_BOOST_START_DATE = "setBoostStartDate" + SET_CALENDAR = "setCalendar" + SET_CIE_COLOR_SPACE_XY = "setCieColorSpaceXY" SET_CLOSURE = "setClosure" SET_CLOSURE_AND_LINEAR_SPEED = "setClosureAndLinearSpeed" SET_CLOSURE_AND_ORIENTATION = "setClosureAndOrientation" - SET_CONFIG_STATE = "setConfigState" + SET_COLOR_TEMPERATURE = "setColorTemperature" SET_COMFORT_COOLING_TARGET_TEMPERATURE = "setComfortCoolingTargetTemperature" SET_COMFORT_HEATING_TARGET_TEMPERATURE = "setComfortHeatingTargetTemperature" SET_COMFORT_TARGET_DHW_TEMPERATURE = "setComfortTargetDHWTemperature" + SET_COMFORT_TARGET_TEMPERATURE = "setComfortTargetTemperature" SET_COMFORT_TEMPERATURE = "setComfortTemperature" + SET_COMMUNICATION_TEST = "setCommunicationTest" + SET_CONFIG_STATE = "setConfigState" SET_CONTROL_DHW = "setControlDHW" SET_CONTROL_DHW_SETTING_TEMPERATURE = "setControlDHWSettingTemperature" SET_COOLING_ON_OFF = "setCoolingOnOffState" SET_COOLING_TARGET_TEMPERATURE = "setCoolingTargetTemperature" + SET_COUNTRY_CODE = "setCountryCode" + SET_CTB = "setCTB" SET_CURRENT_OPERATING_MODE = "setCurrentOperatingMode" SET_DATE_TIME = "setDateTime" + SET_DELETION_CANCELATION = "setDeletionCancelation" SET_DEPLOYMENT = "setDeployment" SET_DEROGATED_TARGET_TEMPERATURE = "setDerogatedTargetTemperature" SET_DEROGATION = "setDerogation" @@ -148,47 +343,111 @@ class OverkizCommand(StrEnum): SET_DEROGATION_TIME = "setDerogationTime" SET_DHW_MODE = "setDHWMode" SET_DHW_ON_OFF_STATE = "setDHWOnOffState" + SET_DRYING_DURATION = "setDryingDuration" SET_ECO_COOLING_TARGET_TEMPERATURE = "setEcoCoolingTargetTemperature" SET_ECO_HEATING_TARGET_TEMPERATURE = "setEcoHeatingTargetTemperature" SET_ECO_TARGET_DHW_TEMPERATURE = "setEcoTargetDHWTemperature" + SET_ECO_TARGET_TEMPERATURE = "setEcoTargetTemperature" SET_ECO_TEMPERATURE = "setEcoTemperature" + SET_ELECTRICAL_EXTRA_MANAGEMENT = "setElectricalExtraManagement" SET_EXPECTED_NUMBER_OF_SHOWER = "setExpectedNumberOfShower" + SET_EXPECTED_PRESENCE = "setExpectedPresence" + SET_EXTRACTION_OPTION = "setExtractionOption" SET_FORCE_HEATING = "setForceHeating" + SET_FROST_PROTECTION_TARGET_TEMPERATURE = "setFrostProtectionTargetTemperature" + SET_GROUP_VOLUME = "setGroupVolume" + SET_HALTED_TARGET_TEMPERATURE = "setHaltedTargetTemperature" SET_HEATING_COOLING_AUTO_SWITCH = "setHeatingCoolingAutoSwitch" SET_HEATING_LEVEL = "setHeatingLevel" + SET_HEATING_LEVEL_FOR_TRIGGER = "setHeatingLevelForTrigger" + SET_HEATING_LEVEL_WITH_TIMER = "setHeatingLevelWithTimer" SET_HEATING_ON_OFF = "setHeatingOnOffState" SET_HEATING_TARGET_TEMPERATURE = "setHeatingTargetTemperature" SET_HOLIDAYS = "setHolidays" + SET_HOLIDAYS_TARGET_TEMPERATURE = "setHolidaysTargetTemperature" + SET_HSB = "setHSB" + SET_HUE_AND_SATURATION = "setHueAndSaturation" + SET_INSTALLATION = "setInstallation" SET_INTENSITY = "setIntensity" + SET_INTENSITY_WITH_TIMER = "setIntensityWithTimer" + SET_INTERNAL_TIMER = "setInternalTimer" + SET_INTRUSION_DETECTED = "setIntrusionDetected" SET_LEVEL = "setLevel" + SET_LIGHTING_LED_MODEM_MODE = "setLightingLedModemMode" + SET_LIGHTING_LED_POD_MODE = "setLightingLedPodMode" SET_LOWER_CLOSURE = "setLowerClosure" SET_LOWER_POSITION = "setLowerPosition" SET_MANU_AND_SET_POINT_MODES = "setManuAndSetPointModes" + SET_MAXIMUM_COOLING_TARGET_TEMPERATURE = "setMaximumCoolingTargetTemperature" + SET_MAXIMUM_HEATING_TARGET_TEMPERATURE = "setMaximumHeatingTargetTemperature" + SET_MAXIMUM_TEMPERATURE = "setMaximumTemperature" + SET_MEDIA_ELEMENT = "setMediaElement" + SET_MEMORIZED1_ORIENTATION = "setMemorized1Orientation" SET_MEMORIZED_1_POSITION = "setMemorized1Position" SET_MEMORIZED_SIMPLE_VOLUME = "setMemorizedSimpleVolume" + SET_MINIMUM_COOLING_TARGET_TEMPERATURE = "setMinimumCoolingTargetTemperature" + SET_MINIMUM_HEATING_TARGET_TEMPERATURE = "setMinimumHeatingTargetTemperature" + SET_MINIMUM_TEMPERATURE = "setMinimumTemperature" + SET_MODE = "setMode" + SET_MODEM_LED_OFF = "setModemLedOff" + SET_MODEM_LED_ON = "setModemLedOn" SET_MODE_TEMPERATURE = "setModeTemperature" SET_NAME = "setName" + SET_NATIVE_LEVELS_LIST = "setNativeLevelsList" + SET_OCCUPANCY = "setOccupancy" + SET_OCCUPANCY_ACTIVATION = "setOccupancyActivation" SET_ON_OFF = "setOnOff" + SET_OPEN_WINDOW_DETECTION_ACTIVATION = "setOpenWindowDetectionActivation" SET_OPERATING_MODE = "setOperatingMode" + SET_OPERATING_RANGE = "setOperatingRange" + SET_OPERATOR_CONFIG = "setOperatorConfig" SET_ORIENTATION = "setOrientation" SET_PASS_APC_COOLING_MODE = "setPassAPCCoolingMode" SET_PASS_APC_DHW_MODE = "setPassAPCDHWMode" SET_PASS_APC_HEATING_MODE = "setPassAPCHeatingMode" SET_PASS_APC_OPERATING_MODE = "setPassAPCOperatingMode" + SET_PEAK_NOTICE = "setPeakNotice" + SET_PEAK_WARNING = "setPeakWarning" SET_PEDESTRIAN_POSITION = "setPedestrianPosition" + SET_PICTO_VALUE = "setPictoValue" + SET_POD_LED_OFF = "setPodLedOff" + SET_POD_LED_ON = "setPodLedOn" SET_POSITION = "setPosition" + SET_POSITION_AND_LINEAR_SPEED = "setPositionAndLinearSpeed" + SET_PREVIOUS_TARGET_TEMPERATURE = "setPreviousTargetTemperature" + SET_PROGRAMMING_SLOTS = "setProgrammingSlots" + SET_RATE_MANAGEMENT = "setRateManagement" SET_RGB = "setRGB" + SET_ROOM_DELETION_THRESHOLD = "setRoomDeletionThreshold" SET_SCHEDULING_TYPE = "setSchedulingType" + SET_SECURED_ORIENTATION = "setSecuredOrientation" SET_SECURED_POSITION = "setSecuredPosition" SET_SECURED_POSITION_TEMPERATURE = "setSecuredPositionTemperature" - SET_TARGET_MODE = "setTargetMode" + SET_SETPOINT_LOWERING_TEMPERATURE_IN_PROG_MODE = ( + "setSetpointLoweringTemperatureInProgMode" + ) + SET_SET_POINT_TYPE_AND_TARGET_TEMPERATURE = "setSetPointTypeAndTargetTemperature" + SET_SIMPIN_CODE = "setSIMPinCode" + SET_SIREN_STATUS = "setSirenStatus" + SET_SMART_GRID_OPTION = "setSmartGridOption" SET_TARGET_ALARM_MODE = "setTargetAlarmMode" - SET_TARGET_TEMPERATURE = "setTargetTemperature" SET_TARGET_DHW_TEMPERATURE = "setTargetDHWTemperature" + SET_TARGET_INFRA_CONFIG = "setTargetInfraConfig" + SET_TARGET_MODE = "setTargetMode" + SET_TARGET_MODE_ALIAS = "setTargetModeAlias" + SET_TARGET_TEMPERATURE = "setTargetTemperature" + SET_TARGET_WAKE_UP_INTERVAL = "setTargetWakeUpInterval" + SET_TEMPERATURE_PROBE_CALIBRATION_OFFSET = "setTemperatureProbeCalibrationOffset" + SET_THERMOSTAT_SETPOINT = "setThermostatSetpoint" SET_THERMOSTAT_SETTING_CONTROL_ZONE_1 = "setThermostatSettingControlZone1" + SET_TIMELINE_POSITION = "setTimelinePosition" + SET_TIME_PROGRAM = "setTimeProgram" SET_TIME_PROGRAM_BY_ID = "setTimeProgramById" + SET_TOWEL_DRYER_BOOST_MODE_DURATION = "setTowelDryerBoostModeDuration" SET_TOWEL_DRYER_OPERATING_MODE = "setTowelDryerOperatingMode" SET_TOWEL_DRYER_TEMPORARY_STATE = "setTowelDryerTemporaryState" + SET_TOWEL_DRYER_TIME_PROGRAM = "setTowelDryerTimeProgram" + SET_TWINNING_EXIT = "setTwinningExit" SET_UPPER_AND_LOWER_CLOSURE = "setUpperAndLowerClosure" SET_UPPER_AND_LOWER_POSITION = "setUpperAndLowerPosition" SET_UPPER_CLOSURE = "setUpperClosure" @@ -196,21 +455,53 @@ class OverkizCommand(StrEnum): SET_VALVE_SETTINGS = "setValveSettings" SET_VENTILATION_CONFIGURATION_MODE = "setVentilationConfigurationMode" SET_VENTILATION_MODE = "setVentilationMode" + SET_VOLUME = "setVolume" + SET_WAKE_UP_INTERVAL = "setWakeUpInterval" SET_WATER_TARGET_TEMPERATURE = "setWaterTargetTemperature" + SET_WATER_TEMPERATURE = "setWaterTemperature" + SET_WEATHER_STATUS = "setWeatherStatus" + SET_WIFI_MODE = "setWifiMode" + SET_XYB = "setXYB" + SHARE_NETWORK = "shareNetwork" + SHORT_BIP = "shortBip" + SIREN = "siren" STANDARD = "standard" + START = "start" + START_EXCLUSION = "startExclusion" + START_EXCLUSION_WITH_MODE = "startExclusionWithMode" START_IDENTIFY = "startIdentify" + START_INCLUSION = "startInclusion" + START_INCLUSION_WITH_MODE = "startInclusionWithMode" + START_INCLUSION_WITH_MODE_AND_SECURITY_LEVEL = ( + "startInclusionWithModeAndSecurityLevel" + ) + START_LEARN = "startLearn" + START_LEARN_WITH_MODE = "startLearnWithMode" STOP = "stop" + STOP_BLINK_MODEM_LED = "stopBlinkModemLed" + STOP_EXCLUSION = "stopExclusion" STOP_IDENTIFY = "stopIdentify" + STOP_INCLUSION = "stopInclusion" + STOP_LEARN = "stopLearn" + TAKE_PICTURE = "takePicture" + TAKE_PICTURE_SEQUENCE = "takePictureSequence" TEST = "test" TILT = "tilt" TILT_DOWN = "tiltDown" TILT_NEGATIVE = "tiltNegative" TILT_POSITIVE = "tiltPositive" TILT_UP = "tiltUp" + TRESPASS = "trespass" + UNBIND = "unbind" UNDEPLOY = "undeploy" UNINSTALLED = "uninstalled" UNLOCK = "unlock" + UNMUTE = "unmute" + UNMUTE_GROUP = "unmuteGroup" UNPAIR_ALL_ONE_WAY_CONTROLLERS = "unpairAllOneWayControllers" + UNPAIR_ALL_ONE_WAY_CONTROLLERS_AND_DELETE_NODE = ( + "unpairAllOneWayControllersAndDeleteNode" + ) UNPAIR_ONE_WAY_CONTROLLER = "unpairOneWayController" UP = "up" UPDATE = "update" @@ -227,82 +518,141 @@ class OverkizCommandParam(StrEnum): A = "A" ABSENCE = "absence" + ACCUMULATION_DOMESTIC_HOT_WATER = "accumulationDomesticHotWater" ACTIVE = "active" ADJUSTMENT = "adjustment" - ANTIFREEZE = "antifreeze" + AIR_CONDITIONING = "airConditioning" + ALERT = "alert" ALWAYS = "always" + ANTIFREEZE = "antifreeze" ARMED = "armed" ARMED_DAY = "armedDay" ARMED_NIGHT = "armedNight" AT_HOME_MODE = "atHomeMode" AUTO = "auto" + AUTOCHANGEOVER = "autochangeover" AUTOCOOLING = "autocooling" AUTOHEATING = "autoheating" + AUTO_COOLING = "autoCooling" + AUTO_HEATING = "autoHeating" AUTO_MODE = "autoMode" AVAILABLE = "available" AWAY = "away" + AWAYCOOL = "awaycool" + AWAYHEAT = "awayheat" AWAY_MODE = "awayMode" B = "B" + BASE = "base" BASIC = "basic" - BY_PASS = "by_pass" + BOILER = "boiler" + BOILER_OPTIMISING = "boilerOptimising" + BOILER_PRIORITY = "boilerPriority" BOOST = "boost" BOTH = "both" + BY_PASS = "by_pass" C = "C" + CIRCULATOR = "circulator" + CLEAN = "clean" CLOSE = "close" CLOSED = "closed" COMFORT = "comfort" COMFORT_1 = "comfort-1" COMFORT_2 = "comfort-2" + COMFORT_LEVEL1 = "comfortLevel1" + COMFORT_LEVEL2 = "comfortLevel2" + COMFORT_LEVEL3 = "comfortLevel3" + COMFORT_LEVEL4 = "comfortLevel4" + CONVECTOR = "convector" COOLING = "cooling" + CT = "ct" + CYCLIC = "cyclic" + DATE = "date" DATE_SCHEDULING = "dateScheduling" DAY_OFF = "day-off" - DEROGATION = "derogation" + DEACTIVE = "deactive" DEAD = "dead" DEHUMIDIFY = "dehumidify" + DELETION_CANCELATION = "deletion cancelation" # value with space + DEROGATION = "derogation" DETECTED = "detected" - DISARMED = "disarmed" + DIRTY = "dirty" DISABLE = "disable" DISABLED = "disabled" + DISARMED = "disarmed" + DOUBLE_FLOW_CONTROLLED_MECHANICAL_VENTILATION = ( + "doubleFlowControlledMechanicalVentilation" + ) + DOUBLE_PRESS = "doublePress" + DOWN = "down" + DRY = "dry" DRYING = "drying" ECO = "eco" ENABLE = "enable" ENABLED = "enabled" + ENERGYCOOL = "energycool" + ENERGYHEAT = "energyheat" ENERGY_DEMAND_STATUS = "energyDemandStatus" + ENVIRONMENT_PROTECTION = "environmentProtection" EXTERNAL = "external" EXTERNAL_GATEWAY = "externalGateway" EXTERNAL_SCHEDULING = "externalScheduling" EXTERNAL_SETPOINT = "externalSetpoint" + EXTRA_BOILER = "extraBoiler" + EXTRA_SOLAR = "extraSolar" + FAILED = "failed" + FALSE = "false" FAN = "fan" + FAST_EXTRACTION_SPEED = "fastExtractionSpeed" FINISHED = "finished" + FORBIDDEN = "forbidden" + FORWARD = "forward" FREE = "free" FREEZE_MODE = "freezeMode" FROSTPROTECTION = "frostprotection" FULL = "full" + FULLPOWER = "fullpower" FULL_CLOSED = "full_closed" FULL_OPEN = "full_open" - FURTHER_NOTICE = "further_notice" + FURNACE = "furnace" + FURTHER_NOTICE = "furtherNotice" GEOFENCING_MODE = "geofencingMode" + GOOD = "good" + HEATER = "heater" HEATING = "heating" HEATING_AND_COOLING = "heatingAndCooling" HEATING_AND_COOLING_COMMON_SCHEDULING = "heatingAndCoolingCommonScheduling" HEATING_AND_COOLING_SEPARATED_SCHEDULING = "heatingAndCoolingSeparatedScheduling" + HEAT_PUMP = "heatPump" + HEAT_PUMP_OPTIMISING = "heatPumpOptimising" + HEAT_PUMP_PRIORITY = "heatPumpPriority" HI = "hi" HIGH = "high" HIGHEST = "highest" - HIGH_DEMAND = "high demand" # not a typo... + HIGH_DEMAND = "high demand" # value with space HOLIDAYS = "holidays" HORIZONTAL = "horizontal" + HS = "hs" + HUMAN_PROTECTION = "humanProtection" + HYBRID = "hybrid" INACTIVE = "inactive" INCREASE = "increase" INTERNAL = "internal" INTERNAL_SCHEDULING = "internalScheduling" + IN_PROGRESS = "inProgress" + KEPT = "kept" + KO = "KO" LO = "lo" LOCAL_USER = "localUser" LOCKED = "locked" LOCK_KEY = "lock_key" + LONG_PEAK = "long peak" # value with space + LONG_PEAK_WARNING = "long peak warning" # value with space + LONG_PRESS = "longPress" + LOST = "lost" LOW = "low" LOWSPEED = "lowspeed" LOW_BATTERY = "lowBattery" + LOW_EXTRACTION_SPEED = "lowExtractionSpeed" LSC = "LSC" MAINTENANCE_REQUIRED = "maintenanceRequired" MANU = "manu" @@ -310,56 +660,109 @@ class OverkizCommandParam(StrEnum): MANUAL_ECO_ACTIVE = "manualEcoActive" MANUAL_ECO_INACTIVE = "manualEcoInactive" MANUAL_MODE = "manualMode" + MAX = "max" MAX_SETPOINT = "max_setpoint" MED = "med" MEDIUM = "medium" MEMORIZED_VOLUME = "memorizedVolume" MIN_SETPOINT = "min_setpoint" - NORMAL = "normal" + MOIST = "moist" + MYSELF = "myself" + NEXT_MODE = "nextMode" + NO = "no" NONE = "none" + NORMAL = "normal" NOT_DETECTED = "notDetected" NO_DEFECT = "noDefect" + NO_DELETION_CANCELATION = "no deletion cancelation" # value with space + NO_EXTRACTION = "noExtraction" + NO_PEAK = "no peak" # value with space + NO_PERSON_INSIDE = "noPersonInside" + NO_WARNING = "no warning" # value with space NUMBER_OF_DAYS_SCHEDULING = "numberOfDaysScheduling" OFF = "off" + OFFLINE = "offline" + OK = "OK" ON = "on" + ONLINE = "online" + ONLY_THERMODYNAMIC = "onlyThermodynamic" + ON_OFF_LIGHT = "onOffLight" OPEN = "open" OPENED = "opened" OPEN_WINDOW = "open_window" + PAC24H_ELEC24H = "pac24h_elec24h" + PAC_PROG_ELEC_PROG = "pacProg_elecProg" PAIRING = "pairing" PARTIAL = "partial" PARTIAL_1 = "partial1" PARTIAL_2 = "partial2" + PAUSE = "pause" PEDESTRIAN = "pedestrian" PENDING = "pending" PERFORMANCE = "performance" PERMANENT_HEATING = "permanentHeating" PERSON_INSIDE = "personInside" + PLAYING = "playing" + PRESSED = "pressed" PROG = "prog" PROGRAM = "program" + RAIN = "rain" + RECOMMENDED = "recommended" + REGISTERED = "registered" RELAUNCH = "relaunch" RESET = "reset" + REWIND = "rewind" SAAC = "SAAC" SECURED = "secured" + SECURITY = "security" SFC = "SFC" SHORT = "short" + SHORT_PEAK = "short peak" # value with space + SHORT_PEAK_WARNING = "short peak warning" # value with space SILENCE = "silence" SILENT = "silent" + SIMPLE_PRESS = "simplePress" + SINGLE_FLOW_CONTROLLED_MECHANICAL_VENTILATION = ( + "singleFlowControlledMechanicalVentilation" + ) SLEEPING_MODE = "sleepingMode" + SOS = "sos" STANDARD = "standard" STANDBY = "standby" + STARTED = "started" STOP = "stop" + STOPPED = "stopped" SUDDEN_DROP_MODE = "suddenDropMode" + TEMPERATURE = "temperature" TEMPERATURE_OFFSET = "temperature_offset" + THERMODYNAMIC_DOMESTIC_HOT_WATER = "thermodynamicDomesticHotWater" TILT = "tilt" - TILT_POSITIVE = "tiltPositive" TILT_NEGATIVE = "tiltNegative" + TILT_POSITIVE = "tiltPositive" + TIMER = "timer" + TOP = "top" TOTAL = "total" + TRIPLE_PRESS = "triplePress" + TRUE = "true" + UNAVAILABLE = "unavailable" UNDETECTED = "undetected" + UNINSTALLED = "uninstalled" + UNKNOWN = "unknown" + UNSUITABLE = "unsuitable" + UP = "up" UPS = "UPS" + USER = "user" + USER_LEVEL1 = "userLevel1" + USER_LEVEL2 = "userLevel2" VERTICAL = "vertical" + VERY_LONG_PRESS = "veryLongPress" VERY_LOW = "verylow" + WANTED = "wanted" + WIND = "wind" + XY = "xy" ZONE_1 = "zone1" ZONE_2 = "zone2" + ZONE_CONTROLLER = "zoneController" @unique diff --git a/pyoverkiz/enums/execution.py b/pyoverkiz/enums/execution.py index 4ea2ea83..bb394df5 100644 --- a/pyoverkiz/enums/execution.py +++ b/pyoverkiz/enums/execution.py @@ -1,13 +1,12 @@ """Execution related enums (types, states and subtypes).""" -import logging from enum import StrEnum, unique -_LOGGER = logging.getLogger(__name__) +from pyoverkiz.enums.base import UnknownEnumMixin @unique -class ExecutionType(StrEnum): +class ExecutionType(UnknownEnumMixin, StrEnum): """High-level execution categories returned by the API.""" UNKNOWN = "UNKNOWN" @@ -18,14 +17,9 @@ class ExecutionType(StrEnum): RAW_TRIGGER_SERVER = "Raw trigger (Server)" RAW_TRIGGER_GATEWAY = "Raw trigger (Gateway)" - @classmethod - def _missing_(cls, value): # type: ignore - _LOGGER.warning(f"Unsupported value {value} has been returned for {cls}") - return cls.UNKNOWN - @unique -class ExecutionState(StrEnum): +class ExecutionState(UnknownEnumMixin, StrEnum): """Execution lifecycle states.""" UNKNOWN = "UNKNOWN" @@ -38,14 +32,9 @@ class ExecutionState(StrEnum): QUEUED_GATEWAY_SIDE = "QUEUED_GATEWAY_SIDE" QUEUED_SERVER_SIDE = "QUEUED_SERVER_SIDE" - @classmethod - def _missing_(cls, value): # type: ignore - _LOGGER.warning(f"Unsupported value {value} has been returned for {cls}") - return cls.UNKNOWN - @unique -class ExecutionSubType(StrEnum): +class ExecutionSubType(UnknownEnumMixin, StrEnum): """Subtypes for execution reasons or sources.""" UNKNOWN = "UNKNOWN" @@ -63,8 +52,3 @@ class ExecutionSubType(StrEnum): NO_ERROR = "NO_ERROR" P2P_COMMAND_REGULATION = "P2P_COMMAND_REGULATION" TIME_TRIGGER = "TIME_TRIGGER" - - @classmethod - def _missing_(cls, value): # type: ignore - _LOGGER.warning(f"Unsupported value {value} has been returned for {cls}") - return cls.UNKNOWN diff --git a/pyoverkiz/enums/gateway.py b/pyoverkiz/enums/gateway.py index b64659a5..9d1b2811 100644 --- a/pyoverkiz/enums/gateway.py +++ b/pyoverkiz/enums/gateway.py @@ -1,13 +1,12 @@ """Enums for gateway types and related helpers.""" -import logging from enum import IntEnum, StrEnum, unique -_LOGGER = logging.getLogger(__name__) +from pyoverkiz.enums.base import UnknownEnumMixin @unique -class GatewayType(IntEnum): +class GatewayType(UnknownEnumMixin, IntEnum): """Enumeration of known gateway types returned by Overkiz.""" UNKNOWN = -1 @@ -63,22 +62,19 @@ class GatewayType(IntEnum): TAHOMA_SWITCH_CH = 126 TAHOMA_SWITCH_SC = 128 - @classmethod - def _missing_(cls, value): # type: ignore - _LOGGER.warning(f"Unsupported value {value} has been returned for {cls}") - return cls.UNKNOWN - @property def beautify_name(self) -> str: """Return a human friendly name for the gateway type.""" - name = self.name.replace("_", " ").title() - name = name.replace("Tahoma", "TaHoma") - name = name.replace("Rts", "RTS") - return name + return ( + self.name.replace("_", " ") + .title() + .replace("Tahoma", "TaHoma") + .replace("Rts", "RTS") + ) @unique -class GatewaySubType(IntEnum): +class GatewaySubType(UnknownEnumMixin, IntEnum): """Sub-type enumeration for gateways to identify specific models/variants.""" UNKNOWN = -1 @@ -100,18 +96,15 @@ class GatewaySubType(IntEnum): TAHOMA_SECURITY_PRO = 16 # TAHOMA_BOX_C_IO = 12 # Note: This is likely 17, but tahomalink.com lists it as 12 - @classmethod - def _missing_(cls, value): # type: ignore - _LOGGER.warning(f"Unsupported value {value} has been returned for {cls}") - return cls.UNKNOWN - @property def beautify_name(self) -> str: """Return a human friendly name for the gateway sub-type.""" - name = self.name.replace("_", " ").title() - name = name.replace("Tahoma", "TaHoma") - name = name.replace("Rts", "RTS") - return name + return ( + self.name.replace("_", " ") + .title() + .replace("Tahoma", "TaHoma") + .replace("Rts", "RTS") + ) @unique diff --git a/pyoverkiz/enums/general.py b/pyoverkiz/enums/general.py index 6ddaadd5..4157e4d5 100644 --- a/pyoverkiz/enums/general.py +++ b/pyoverkiz/enums/general.py @@ -3,10 +3,9 @@ # ruff: noqa: S105 # Enum values contain "TOKEN" in API event names, not passwords -import logging from enum import IntEnum, StrEnum, unique -_LOGGER = logging.getLogger(__name__) +from pyoverkiz.enums.base import UnknownEnumMixin @unique @@ -40,7 +39,7 @@ class DataType(IntEnum): @unique -class FailureType(IntEnum): +class FailureType(UnknownEnumMixin, IntEnum): """Failure type codes returned by the API.""" UNKNOWN = -1 @@ -248,14 +247,9 @@ class FailureType(IntEnum): TIME_OUT_ON_COMMAND_PROGRESS = 20003 DEVICE_NO_ANSWER = 60004 - @classmethod - def _missing_(cls, value): # type: ignore - _LOGGER.warning(f"Unsupported value {value} has been returned for {cls}") - return cls.UNKNOWN - @unique -class EventName(StrEnum): +class EventName(UnknownEnumMixin, StrEnum): """Enumeration of event names emitted by Overkiz.""" UNKNOWN = "Unknown" @@ -440,8 +434,3 @@ class EventName(StrEnum): ZONE_CREATED = "ZoneCreatedEvent" ZONE_DELETED = "ZoneDeletedEvent" ZONE_UPDATED = "ZoneUpdatedEvent" - - @classmethod - def _missing_(cls, value): # type: ignore - _LOGGER.warning(f"Unsupported value {value} has been returned for {cls}") - return cls.UNKNOWN diff --git a/pyoverkiz/enums/protocol.py b/pyoverkiz/enums/protocol.py index d7372d94..7f958db3 100644 --- a/pyoverkiz/enums/protocol.py +++ b/pyoverkiz/enums/protocol.py @@ -1,13 +1,16 @@ -"""Protocol enums describe device URL schemes used by Overkiz.""" +"""Protocol enums describe device URL schemes used by Overkiz. + +THIS FILE IS AUTO-GENERATED. DO NOT EDIT MANUALLY. +Run `uv run utils/generate_enums.py` to regenerate. +""" -import logging from enum import StrEnum, unique -_LOGGER = logging.getLogger(__name__) +from pyoverkiz.enums.base import UnknownEnumMixin @unique -class Protocol(StrEnum): +class Protocol(UnknownEnumMixin, StrEnum): """Protocol used by Overkiz. Values have been retrieved from /reference/protocolTypes @@ -15,38 +18,33 @@ class Protocol(StrEnum): UNKNOWN = "unknown" - AUGUST = "august" - CAMERA = "camera" - ELIOT = "eliot" - ENOCEAN = "enocean" + AUGUST = "august" # 59: August Webservices + CAMERA = "camera" # 13: Generic Camera Control Protocol + ELIOT = "eliot" # 45: Eliot Webservices + ENOCEAN = "enocean" # 7: EnOcean HLRR_WIFI = "hlrrwifi" - HOMEKIT = "homekit" - HUE = "hue" - INTERNAL = "internal" - IO = "io" - JSW = "jsw" - MODBUS = "modbus" + HOMEKIT = "homekit" # 48: HOMEKIT + HUE = "hue" # 22: Philips HUE - Personal Wireless Lighting + INTERNAL = "internal" # 29: Kizbox Internal Modules + IO = "io" # 1: IO HomeControl© + JSW = "jsw" # 30: JSW Webservices + MODBUS = "modbus" # 20: Modbus MODBUSLINK = "modbuslink" - MYFOX = "myfox" - NETATMO = "netatmo" - OGCP = "ogcp" - OGP = "ogp" - OPENDOORS = "opendoors" - OVP = "ovp" - PROFALUX_868 = "profalux868" - RAMSES = "ramses" - RTD = "rtd" - RTDS = "rtds" + MYFOX = "myfox" # 25: MyFox Webservices + NETATMO = "netatmo" # 38: Netatmo Webservices + OGCP = "ogcp" # 62: Overkiz Generic Cloud Protocol + OGP = "ogp" # 56: Overkiz Generic Protocol + OPENDOORS = "opendoors" # 35: OpenDoors Webservices + OVP = "ovp" # 14: OVERKIZ Radio Protocol + PROFALUX_868 = "profalux868" # 50: Profalux 868 + RAMSES = "ramses" # 6: Ramses II (Honeywell) + RTD = "rtd" # 5: Domis RTD - Actuator + RTDS = "rtds" # 11: Domis RTD - Sensor RTN = "rtn" - RTS = "rts" - SOMFY_THERMOSTAT = "somfythermostat" - UPNP_CONTROL = "upnpcontrol" - VERISURE = "verisure" - WISER = "wiser" - ZIGBEE = "zigbee" - ZWAVE = "zwave" - - @classmethod - def _missing_(cls, value): # type: ignore - _LOGGER.warning(f"Unsupported protocol {value} has been returned for {cls}") - return cls.UNKNOWN + RTS = "rts" # 2: Somfy RTS + SOMFY_THERMOSTAT = "somfythermostat" # 39: Somfy Thermostat Webservice + UPNP_CONTROL = "upnpcontrol" # 43: UPnP Control + VERISURE = "verisure" # 23: Verisure Webservices + WISER = "wiser" # 54: Schneider Wiser + ZIGBEE = "zigbee" # 3: Zigbee + ZWAVE = "zwave" # 8: Z-Wave diff --git a/pyoverkiz/enums/ui.py b/pyoverkiz/enums/ui.py index 7375a3bd..3d2b918a 100644 --- a/pyoverkiz/enums/ui.py +++ b/pyoverkiz/enums/ui.py @@ -1,27 +1,31 @@ -"""UI enums for classes and widgets used to interpret device UI metadata.""" +"""UI enums for classes and widgets used to interpret device UI metadata. + +THIS FILE IS AUTO-GENERATED. DO NOT EDIT MANUALLY. +Run `uv run utils/generate_enums.py` to regenerate. +""" # ruff: noqa: S105 # Enum values contain "PASS" in API names (e.g. PassAPC), not passwords -import logging from enum import StrEnum, unique -_LOGGER = logging.getLogger(__name__) +from pyoverkiz.enums.base import UnknownEnumMixin @unique -class UIClass(StrEnum): +class UIClass(UnknownEnumMixin, StrEnum): """Enumeration of UI classes used to describe device categories and behaviors.""" - # A list of all defined UI classes from /reference/ui/classes + UNKNOWN = "Unknown" + ADJUSTABLE_SLATS_ROLLER_SHUTTER = "AdjustableSlatsRollerShutter" AIR_SENSOR = "AirSensor" ALARM = "Alarm" AWNING = "Awning" BALLAST = "Ballast" CAMERA = "Camera" - CARBON_DIOXIDE_SENSOR = "CarbonDioxideSensor" CAR_BUTTON_SENSOR = "CarButtonSensor" + CARBON_DIOXIDE_SENSOR = "CarbonDioxideSensor" CIRCUIT_BREAKER = "CircuitBreaker" CONFIGURATION_COMPONENT = "ConfigurationComponent" CONSUMPTION_SENSOR = "ConsumptionSensor" @@ -49,8 +53,8 @@ class UIClass(StrEnum): LIGHT = "Light" LIGHT_SENSOR = "LightSensor" MUSIC_PLAYER = "MusicPlayer" - NOISE_SENSOR = "NoiseSensor" NETWORK_COMPONENT = "NetworkComponent" + NOISE_SENSOR = "NoiseSensor" OCCUPANCY_SENSOR = "OccupancySensor" ON_OFF = "OnOff" OVEN = "Oven" @@ -60,6 +64,8 @@ class UIClass(StrEnum): RAIN_SENSOR = "RainSensor" REMOTE_CONTROLLER = "RemoteController" ROLLER_SHUTTER = "RollerShutter" + SCENE = "Scene" + SCENE_LAUNCHER_CONTROLLER = "SceneLauncherController" SCREEN = "Screen" SHUTTER = "Shutter" SIREN = "Siren" @@ -68,11 +74,12 @@ class UIClass(StrEnum): SUN_SENSOR = "SunSensor" SWIMMING_POOL = "SwimmingPool" SWINGING_SHUTTER = "SwingingShutter" + SWITCH = "Switch" TEMPERATURE_SENSOR = "TemperatureSensor" THERMAL_ENERGY_SENSOR = "ThermalEnergySensor" THIRD_PARTY_GATEWAY = "ThirdPartyGateway" VENETIAN_BLIND = "VenetianBlind" - VENTILATION_SYTEM = "VentilationSystem" + VENTILATION_SYSTEM = "VentilationSystem" WASHING_MACHINE = "WashingMachine" WATER_HEATING_SYSTEM = "WaterHeatingSystem" WATER_SENSOR = "WaterSensor" @@ -82,19 +89,13 @@ class UIClass(StrEnum): WINDOW = "Window" WINDOW_HANDLE = "WindowHandle" - UNKNOWN = "unknown" - - @classmethod - def _missing_(cls, value): # type: ignore - _LOGGER.warning(f"Unsupported value {value} has been returned for {cls}") - return cls.UNKNOWN - @unique -class UIWidget(StrEnum): +class UIWidget(UnknownEnumMixin, StrEnum): """Enumeration of UI widgets used by Overkiz for device presentation.""" - # A list of all defined UI widgets from /reference/ui/widgets + UNKNOWN = "Unknown" + AIR_FLOW_SENSOR = "AirFlowSensor" AIR_QUALITY_SENSOR = "AirQualitySensor" ALARM_PANEL_CONTROLLER = "AlarmPanelController" @@ -122,10 +123,13 @@ class UIWidget(StrEnum): BIOCLIMATIC_PERGOLA = "BioclimaticPergola" CO2_SENSOR = "CO2Sensor" CO_SENSOR = "COSensor" + CAMERA = "Camera" CAR_BUTTON_SENSOR = "CarButtonSensor" CAR_LOCK = "CarLock" CARD_SWITCH = "CardSwitch" CIRCUIT_BREAKER = "CircuitBreaker" + CIRCUIT_BREAKER_PEAK_AND_OFF_PEAK = "CircuitBreakerPeakAndOffPeak" + CONFIGURATION_SENSOR = "ConfigurationSensor" CONTACT_SENSOR = "ContactSensor" COTHERM_THERMOSTAT = "CothermThermostat" CUMULATIVE_ELECTRIC_POWER_CONSUMPTION_SENSOR = ( @@ -145,7 +149,7 @@ class UIWidget(StrEnum): CURTAIN_TRACK_UNO = "CurtainTrackUno" CYCLIC_GARAGE_DOOR = "CyclicGarageDoor" CYCLIC_GENERIC = "CyclicGeneric" - CYCLIC_SWINGING_GATE_OPENER = "CyclicSwingingGateOpener " + CYCLIC_SWINGING_GATE_OPENER = "CyclicSwingingGateOpener" DHW_SET_POINT = "DHWSetPoint" DE_DIETRICH_BOILER = "DeDietrichBoiler" DE_DIETRICH_DHW = "DeDietrichDHW" @@ -160,7 +164,7 @@ class UIWidget(StrEnum): DIMMER_LIGHT = "DimmerLight" DIMMER_ON_OFF = "DimmerOnOff" DIMMER_ON_OFF_LIGHT = "DimmerOnOffLight" - DIMMER_RGBCOLOURED_LIGHT = "DimmerRGBColouredLight" + DIMMER_RGB_COLOURED_LIGHT = "DimmerRGBColouredLight" DIMPLEX_VENTILATION_INLET_OUTLET = "DimplexVentilationInletOutlet" DISCRETE_EXTERIOR_HEATING = "DiscreteExteriorHeating" DISCRETE_GATE_WITH_PEDESTRIAN_POSITION = "DiscreteGateWithPedestrianPosition" @@ -168,18 +172,27 @@ class UIWidget(StrEnum): DISCRETE_POSITIONABLE_GATE = "DiscretePositionableGate" DOCK = "Dock" DOMESTIC_HOT_WATER_PRODUCTION = "DomesticHotWaterProduction" + DOMESTIC_HOT_WATER_PRODUCTION_PEAK_AND_OFF_PEAK = ( + "DomesticHotWaterProductionPeakAndOffPeak" + ) DOMESTIC_HOT_WATER_TANK = "DomesticHotWaterTank" DOOR_LOCK = "DoorLock" DROP_ARM_AWNING = "DropArmAwning" + DYNAMIC_AIR_SENSOR = "DynamicAirSensor" DYNAMIC_AIR_VENT = "DynamicAirVent" DYNAMIC_ALARM = "DynamicAlarm" + DYNAMIC_AMBIENT_NOISE_SENSOR = "DynamicAmbientNoiseSensor" DYNAMIC_AUDIO_PLAYER = "DynamicAudioPlayer" DYNAMIC_AWNING = "DynamicAwning" DYNAMIC_BRIDGE = "DynamicBridge" + DYNAMIC_CARBON_DIOXIDE_SENSOR = "DynamicCarbonDioxideSensor" DYNAMIC_CIRCUIT_BREAKER = "DynamicCircuitBreaker" DYNAMIC_CURTAIN = "DynamicCurtain" DYNAMIC_DOMESTIC_HOT_WATER_PRODUCTION = "DynamicDomesticHotWaterProduction" + DYNAMIC_ELECTRICITY_CONSUMPTION_SENSOR = "DynamicElectricityConsumptionSensor" + DYNAMIC_EXTERIOR_VENETIAN_BLIND = "DynamicExteriorVenetianBlind" DYNAMIC_GARAGE_DOOR = "DynamicGarageDoor" + DYNAMIC_GAS_MEASUREMENT_SENSOR = "DynamicGasMeasurementSensor" DYNAMIC_GATE = "DynamicGate" DYNAMIC_GATEWAY = "DynamicGateway" DYNAMIC_HEATER = "DynamicHeater" @@ -195,15 +208,20 @@ class UIWidget(StrEnum): DYNAMIC_OVEN = "DynamicOven" DYNAMIC_PERGOLA = "DynamicPergola" DYNAMIC_RAIN_SENSOR = "DynamicRainSensor" + DYNAMIC_REMOTE_CONTROLLER = "DynamicRemoteController" DYNAMIC_ROLLER_SHUTTER = "DynamicRollerShutter" + DYNAMIC_SCENE = "DynamicScene" + DYNAMIC_SCENE_LAUNCHER_CONTROLLER = "DynamicSceneLauncherController" DYNAMIC_SCREEN = "DynamicScreen" DYNAMIC_SHUTTER = "DynamicShutter" + DYNAMIC_SWITCH = "DynamicSwitch" DYNAMIC_TEMPERATURE_SENSOR = "DynamicTemperatureSensor" DYNAMIC_THERMOSTAT = "DynamicThermostat" DYNAMIC_THIRD_PARTY_GATEWAY = "DynamicThirdPartyGateway" DYNAMIC_VENETIAN_BLIND = "DynamicVenetianBlind" DYNAMIC_VENTILATION = "DynamicVentilation" DYNAMIC_WASHING_MACHINE = "DynamicWashingMachine" + DYNAMIC_WATER_MEASUREMENT_SENSOR = "DynamicWaterMeasurementSensor" DYNAMIC_WEATHER_STATION = "DynamicWeatherStation" DYNAMIC_WIND_SENSOR = "DynamicWindSensor" DYNAMIC_WINDOW = "DynamicWindow" @@ -216,15 +234,16 @@ class UIWidget(StrEnum): EN_OCEAN_GENERIC_ELECTRIC_COUNTER = "EnOceanGenericElectricCounter" EN_OCEAN_TRANSCEIVER = "EnOceanTransceiver" EVO_HOME_CONTROLLER = "EvoHomeController" - EWATTCH_TICCOUNTER = "EwattchTICCounter" + EWATTCH_TIC_COUNTER = "EwattchTICCounter" EXTERIOR_VENETIAN_BLIND = "ExteriorVenetianBlind" FLOOR_HEATING = "FloorHeating" GAS_DHW_CONSUMPTION_SENSOR = "GasDHWConsumptionSensor" GAS_HEATER_CONSUMPTION_SENSOR = "GasHeaterConsumptionSensor" - GENERIC_16_CHANNELS_COUNTER = "Generic16ChannelsCounter" - GENERIC_1_CHANNEL_COUNTER = "Generic1ChannelCounter" + GENERIC16_CHANNELS_COUNTER = "Generic16ChannelsCounter" + GENERIC1_CHANNEL_COUNTER = "Generic1ChannelCounter" GENERIC_CAMERA = "GenericCamera" GROUP_CONFIGURATION = "GroupConfiguration" + HLRR_WIFI_BRIDGE = "HLRRWifiBridge" HEAT_DETECTION_SENSOR = "HeatDetectionSensor" HEAT_PUMP = "HeatPump" HEATING_SET_POINT = "HeatingSetPoint" @@ -235,13 +254,12 @@ class UIWidget(StrEnum): HITACHI_DHW = "HitachiDHW" HITACHI_SWIMMING_POOL = "HitachiSwimmingPool" HITACHI_THERMOSTAT = "HitachiThermostat" - HLRR_WIFI_BRIDGE = "HLRRWifiBridge" HOMEKIT_STACK = "HomekitStack" HUE_BRIDGE = "HueBridge" - IOGENERIC = "IOGeneric" - IOSIREN = "IOSiren" - IOSTACK = "IOStack" - IRBLASTER = "IRBlaster" + IO_GENERIC = "IOGeneric" + IO_SIREN = "IOSiren" + IO_STACK = "IOStack" + IR_BLASTER = "IRBlaster" IMHOTEP_HEATING_TEMPERATURE_INTERFACE = "ImhotepHeatingTemperatureInterface" INSTANT_ELECTRIC_CURRENT_CONSUMPTION_SENSOR = ( "InstantElectricCurrentConsumptionSensor" @@ -251,7 +269,7 @@ class UIWidget(StrEnum): INTRUSION_EVENT_SENSOR = "IntrusionEventSensor" INTRUSION_SENSOR = "IntrusionSensor" INVALID = "Invalid" - JSWCAMERA = "JSWCamera" + JSW_CAMERA = "JSWCamera" KIZ_OTHERM_BRIDGE = "KizOThermBridge" KIZ_OTHERM_V2_BRIDGE = "KizOThermV2Bridge" LOCK_UNLOCK_DOOR_LOCK_WITH_UNKNOWN_POSITION = ( @@ -260,31 +278,38 @@ class UIWidget(StrEnum): LUMINANCE_SENSOR = "LuminanceSensor" MEDIA_RENDERER = "MediaRenderer" MOTION_SENSOR = "MotionSensor" + MULTI_GATEWAY = "MultiGateway" MULTI_METER_ELECTRIC_SENSOR = "MultiMeterElectricSensor" MY_FOX_ALARM_CONTROLLER = "MyFoxAlarmController" MY_FOX_CAMERA = "MyFoxCamera" MY_FOX_SECURITY_CAMERA = "MyFoxSecurityCamera" - NODE = "Node" NETATMO_CONFIGURATION_COMPONENT = "NetatmoConfigurationComponent" NETATMO_GATEWAY = "NetatmoGateway" + NETATMO_HEATING_TEMPERATURE_INTERFACE = "NetatmoHeatingTemperatureInterface" NETATMO_HOME = "NetatmoHome" + NETATMO_HOME_COACH_CONFIGURATION = "NetatmoHomeCoachConfiguration" NETATMO_WEATHER_STATION_CONFIGURATION = "NetatmoWeatherStationConfiguration" + NEXELEC_AIR_QUALITY_CONFIGURATION_TOOL = "NexelecAirQualityConfigurationTool" + NODE = "Node" NOISE_SENSOR = "NoiseSensor" - OVPGENERIC = "OVPGeneric" + OVP_GENERIC = "OVPGeneric" OCCUPANCY_SENSOR = "OccupancySensor" + ON_OFF_COOKING = "OnOffCooking" ON_OFF_HEATING_SYSTEM = "OnOffHeatingSystem" + ON_OFF_HEATING_SYSTEM_PILOT_WIRE = "OnOffHeatingSystemPilotWire" ON_OFF_LIGHT = "OnOffLight" ON_OFF_REMOTECONTROLLER = "OnOffRemotecontroller" + ON_OFF_VENTILATION_SPEED = "OnOffVentilationSpeed" OPEN_CLOSE_GATE = "OpenCloseGate" - OPEN_CLOSE_GATE_4T = "OpenCloseGate4T" + OPEN_CLOSE_GATE4_T = "OpenCloseGate4T" OPEN_CLOSE_GATE_WITH_PEDESTRIAN_POSITION = "OpenCloseGateWithPedestrianPosition" OPEN_CLOSE_SLIDING_GARAGE_DOOR = "OpenCloseSlidingGarageDoor" - OPEN_CLOSE_SLIDING_GARAGE_DOOR_4T = "OpenCloseSlidingGarageDoor4T" + OPEN_CLOSE_SLIDING_GARAGE_DOOR4_T = "OpenCloseSlidingGarageDoor4T" OPEN_CLOSE_SLIDING_GARAGE_DOOR_WITH_PEDESTRIAN_POSITION = ( "OpenCloseSlidingGarageDoorWithPedestrianPosition" ) OPEN_CLOSE_SLIDING_GATE = "OpenCloseSlidingGate" - OPEN_CLOSE_SLIDING_GATE_4T = "OpenCloseSlidingGate4T" + OPEN_CLOSE_SLIDING_GATE4_T = "OpenCloseSlidingGate4T" OPEN_CLOSE_SLIDING_GATE_WITH_PEDESTRIAN_POSITION = ( "OpenCloseSlidingGateWithPedestrianPosition" ) @@ -342,16 +367,16 @@ class UIWidget(StrEnum): RTD_INDOOR_SIREN = "RTDIndoorSiren" RTD_OUTDOOR_SIREN = "RTDOutdoorSiren" RTS_GENERIC = "RTSGeneric" - RTS_GENERIC_4T = "RTSGeneric4T" + RTS_GENERIC4_T = "RTSGeneric4T" RTS_THERMOSTAT = "RTSThermostat" RAIN_SENSOR = "RainSensor" RELATIVE_HUMIDITY_SENSOR = "RelativeHumiditySensor" REMOTE_CONTROLLER_ONE_WAY = "RemoteControllerOneWay" REPEATER = "Repeater" ROCKER_SWITCH_AUTO_MANU_UP_DOWN_CONTROLLER = "RockerSwitchAutoManuUpDownController" - ROCKER_SWITCHX_1_CONTROLLER = "RockerSwitchx1Controller" - ROCKER_SWITCHX_2_CONTROLLER = "RockerSwitchx2Controller" - ROCKER_SWITCHX_4_CONTROLLER = "RockerSwitchx4Controller" + ROCKER_SWITCHX1_CONTROLLER = "RockerSwitchx1Controller" + ROCKER_SWITCHX2_CONTROLLER = "RockerSwitchx2Controller" + ROCKER_SWITCHX4_CONTROLLER = "RockerSwitchx4Controller" SCENE_CONTROLLER = "SceneController" SCHNEIDER_SWITCH_CONFIGURATION = "SchneiderSwitchConfiguration" SIREN_STATUS = "SirenStatus" @@ -368,6 +393,8 @@ class UIWidget(StrEnum): STATEFUL_ALARM_CONTROLLER = "StatefulAlarmController" STATEFUL_ON_OFF = "StatefulOnOff" STATEFUL_ON_OFF_LIGHT = "StatefulOnOffLight" + STATEFUL_ON_OFF_PEAK_AND_OFF_PEAK = "StatefulOnOffPeakAndOffPeak" + STATEFUL_VENETIAN_SLATS = "StatefulVenetianSlats" STATELESS_ALARM_CONTROLLER = "StatelessAlarmController" STATELESS_EXTERIOR_HEATING = "StatelessExteriorHeating" STATELESS_ON_OFF = "StatelessOnOff" @@ -375,8 +402,9 @@ class UIWidget(StrEnum): SUN_INTENSITY_SENSOR = "SunIntensitySensor" SWIMMING_POOL = "SwimmingPool" SWINGING_SHUTTER = "SwingingShutter" - TSKALARM_CONTROLLER = "TSKAlarmController" + TSK_ALARM_CONTROLLER = "TSKAlarmController" TEMPERATURE_SENSOR = "TemperatureSensor" + THERMOSTAT_DUAL_MODE_AND_FAN = "ThermostatDualModeAndFan" THERMOSTAT_HEATING_TEMPERATURE_INTERFACE = "ThermostatHeatingTemperatureInterface" THERMOSTAT_SET_POINT = "ThermostatSetPoint" THERMOSTAT_ZONES_CONTROLLER = "ThermostatZonesController" @@ -384,16 +412,19 @@ class UIWidget(StrEnum): TILT_ONLY_VENETIAN_BLIND = "TiltOnlyVenetianBlind" TIMED_ON_OFF = "TimedOnOff" TIMED_ON_OFF_LIGHT = "TimedOnOffLight" + TOP_DOWN_BOTTOM_UP_SCREEN = "TopDownBottomUpScreen" UNIVERSAL_SENSOR = "UniversalSensor" UNTYPED = "Untyped" UP_DOWN_BIOCLIMATIC_PERGOLA = "UpDownBioclimaticPergola" + UP_DOWN_BOTTOM_UP_SCREEN = "UpDownBottomUpScreen" UP_DOWN_CELLULAR_SCREEN = "UpDownCellularScreen" UP_DOWN_CURTAIN = "UpDownCurtain" + UP_DOWN_DROP_ARM_AWNING = "UpDownDropArmAwning" UP_DOWN_DUAL_CURTAIN = "UpDownDualCurtain" UP_DOWN_EXTERIOR_SCREEN = "UpDownExteriorScreen" UP_DOWN_EXTERIOR_VENETIAN_BLIND = "UpDownExteriorVenetianBlind" UP_DOWN_GARAGE_DOOR = "UpDownGarageDoor" - UP_DOWN_GARAGE_DOOR_4T = "UpDownGarageDoor4T" + UP_DOWN_GARAGE_DOOR4_T = "UpDownGarageDoor4T" UP_DOWN_GARAGE_DOOR_WITH_VENTILATION_POSITION = ( "UpDownGarageDoorWithVentilationPosition" ) @@ -402,37 +433,45 @@ class UIWidget(StrEnum): UP_DOWN_SCREEN = "UpDownScreen" UP_DOWN_SHEER_SCREEN = "UpDownSheerScreen" UP_DOWN_SWINGING_SHUTTER = "UpDownSwingingShutter" + UP_DOWN_TOP_DOWN_SCREEN = "UpDownTopDownScreen" UP_DOWN_VENETIAN_BLIND = "UpDownVenetianBlind" UP_DOWN_WINDOW = "UpDownWindow" UP_DOWN_ZEBRA_SCREEN = "UpDownZebraScreen" - VOCSENSOR = "VOCSensor" + VOC_SENSOR = "VOCSensor" VALVE_HEATING_TEMPERATURE_INTERFACE = "ValveHeatingTemperatureInterface" + VENETIAN_SLATS = "VenetianSlats" VENTILATION_INLET = "VentilationInlet" VENTILATION_OUTLET = "VentilationOutlet" VENTILATION_TRANSFER = "VentilationTransfer" WATER_DETECTION_SENSOR = "WaterDetectionSensor" WEATHER_FORECAST_SENSOR = "WeatherForecastSensor" WIFI = "Wifi" - WIND_SPEED_SENSOR = "WindSpeedSensor" WIND_SPEED_AND_DIRECTION_SENSOR = "WindSpeedAndDirectionSensor" + WIND_SPEED_SENSOR = "WindSpeedSensor" WINDOW_LOCK = "WindowLock" WINDOW_WITH_TILT_SENSOR = "WindowWithTiltSensor" ZWAVE_AEOTEC_CONFIGURATION = "ZWaveAeotecConfiguration" ZWAVE_CONFIGURATION = "ZWaveConfiguration" - ZWAVE_DANFOSS_RSLINK = "ZWaveDanfossRSLink" + ZWAVE_DANFOSS_RS_LINK = "ZWaveDanfossRSLink" ZWAVE_DOOR_LOCK_CONFIGURATION = "ZWaveDoorLockConfiguration" ZWAVE_FIBARO_ROLLER_SHUTTER_CONFIGURATION = "ZWaveFibaroRollerShutterConfiguration" ZWAVE_HEATIT_THERMOSTAT_CONFIGURATION = "ZWaveHeatitThermostatConfiguration" ZWAVE_NODON_CONFIGURATION = "ZWaveNodonConfiguration" ZWAVE_QUBINO_CONFIGURATION = "ZWaveQubinoConfiguration" - ZWAVE_SEDEVICE_CONFIGURATION = "ZWaveSEDeviceConfiguration" + ZWAVE_SE_DEVICE_CONFIGURATION = "ZWaveSEDeviceConfiguration" ZWAVE_TRANSCEIVER = "ZWaveTransceiver" ZIGBEE_NETWORK = "ZigbeeNetwork" ZIGBEE_STACK = "ZigbeeStack" + +@unique +class UIClassifier(UnknownEnumMixin, StrEnum): + """Enumeration of UI classifiers used to categorize device types.""" + UNKNOWN = "unknown" - @classmethod - def _missing_(cls, value): # type: ignore - _LOGGER.warning(f"Unsupported value {value} has been returned for {cls}") - return cls.UNKNOWN + COOLING_SYSTEM = "coolingSystem" + EMITTER = "emitter" + GENERATOR = "generator" + HEATING_SYSTEM = "heatingSystem" + SENSOR = "sensor" diff --git a/pyoverkiz/enums/ui_profile.py b/pyoverkiz/enums/ui_profile.py new file mode 100644 index 00000000..559fe57c --- /dev/null +++ b/pyoverkiz/enums/ui_profile.py @@ -0,0 +1,1817 @@ +"""UI Profile enums describe device capabilities through commands and states. + +THIS FILE IS AUTO-GENERATED. DO NOT EDIT MANUALLY. +Run `uv run utils/generate_enums.py` to regenerate. +""" + +from enum import StrEnum, unique + +from pyoverkiz.enums.base import UnknownEnumMixin + + +@unique +class UIProfile(UnknownEnumMixin, StrEnum): + """UI Profiles define device capabilities through commands and states. + + Each profile describes what a device can do (commands) and what information + it provides (states). Form factor indicates if the profile is tied to a + specific physical device type. + """ + + UNKNOWN = "Unknown" + + # + # AirFan + # + # Commands: + # - setFanSpeedLevel(int 0-100): Set the device fan speed level (%) + AIR_FAN = "AirFan" + + # + # AirFanMode + # + # Commands: + # - setFanSpeedMode(string values: 'low', 'high'): Set the device fan speed mode + AIR_FAN_MODE = "AirFanMode" + + # + # AirOutputLevelSensor + # + # States: + # - core:AirOutputLevelState (int 0-100): Air output level (%) + AIR_OUTPUT_LEVEL_SENSOR = "AirOutputLevelSensor" + + # + # AirQuality + # + # States: + # - core:GlobalAirQualityState (string values: 'bad', 'error', 'excellent', 'fair', 'good', 'poor'): Air quality status + AIR_QUALITY = "AirQuality" + + # + # Alarm + # + # Commands: + # - arm(): Arm the system + # - disarm(): Disarm the system + ALARM = "Alarm" + + # + # AmbientNoiseSensor + # + # States: + # - core:AmbientNoiseState (float >= 0.0): Ambient noise in dB(A) + AMBIENT_NOISE_SENSOR = "AmbientNoiseSensor" + + # + # BasicCloseable + # + # Commands: + # - setClosure(int 0-100): Closure level (100%=fully close, 0%=open) + BASIC_CLOSEABLE = "BasicCloseable" + + # + # BasicOpenClose + # + # Commands: + # - close(): Fully close the device + # - open(): Fully open the device + BASIC_OPEN_CLOSE = "BasicOpenClose" + + # + # BasicUpDown + # + # Commands: + # - down(): Move the device completely down + # - up(): Move the device completely up + BASIC_UP_DOWN = "BasicUpDown" + + # + # BatteryStatus + # + # States: + # - core:BatteryState (string values: 'verylow', 'low', 'normal', 'full'): Device battery status + BATTERY_STATUS = "BatteryStatus" + + # + # CO2Concentration + # + # States: + # - core:CO2ConcentrationState (float >= 0.0): Current carbon dioxide concentration (ppm) + CO2_CONCENTRATION = "CO2Concentration" + + # + # COConcentration + # + # States: + # - core:COConcentrationState (float >= 0.0): Current carbon monoxide concentration (ppm) + CO_CONCENTRATION = "COConcentration" + + # + # CODetection + # + # States: + # - core:CODetectionState (string values: 'detected', 'notDetected'): Indicate if carbon monoxide level is too high + CO_DETECTION = "CODetection" + + # + # CardReader + # + # States: + # - core:CardPositionState (string values: 'inserted', 'removed'): Indicate if a security card or device was inserted or detected + CARD_READER = "CardReader" + + # + # Closeable + # + # Commands: + # - setClosure(int 0-100): Closure level (100%=fully close, 0%=open) + # - stop(): Stop the current actuator behavior (movement, sound or timer) + CLOSEABLE = "Closeable" + + # + # CloseableBlind + # + # Commands: + # - setClosure(int 0-100): Closure level (100%=fully close, 0%=open) + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # Form factor specific: Yes + CLOSEABLE_BLIND = "CloseableBlind" + + # + # CloseableCurtain + # + # Commands: + # - setClosure(int 0-100): Closure level (100%=fully close, 0%=open) + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # Form factor specific: Yes + CLOSEABLE_CURTAIN = "CloseableCurtain" + + # + # CloseableScreen + # + # Commands: + # - setClosure(int 0-100): Closure level (100%=fully close, 0%=open) + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # Form factor specific: Yes + CLOSEABLE_SCREEN = "CloseableScreen" + + # + # CloseableShutter + # + # Commands: + # - setClosure(int 0-100): Closure level (100%=fully close, 0%=open) + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # Form factor specific: Yes + CLOSEABLE_SHUTTER = "CloseableShutter" + + # + # CloseableWindow + # + # Commands: + # - setClosure(int 0-100): Closure level (100%=fully close, 0%=open) + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # Form factor specific: Yes + CLOSEABLE_WINDOW = "CloseableWindow" + + # + # ContactAndVibrationDetector + # + # States: + # - core:ContactState (string values: 'open', 'closed'): Contact sensor is open or closed + # - core:VibrationState (string values: 'detected', 'notDetected'): Indicate if strong vibrations are detected or not + CONTACT_AND_VIBRATION_DETECTOR = "ContactAndVibrationDetector" + + # + # ContactDetector + # + # States: + # - core:ContactState (string values: 'open', 'closed'): Contact sensor is open or closed + CONTACT_DETECTOR = "ContactDetector" + + # + # CoolingThermostat + # + # Commands: + # - setCoolingTargetTemperature(float 7.0-35.0): Set the cooling target temperature (manual set point) + COOLING_THERMOSTAT = "CoolingThermostat" + + # + # Cyclic + # + # Commands: + # - cycle(): Do a cycle of supported motion kinematics or modes + CYCLIC = "Cyclic" + + # + # CyclicGarageOpener + # + # Commands: + # - cycle(): Do a cycle of supported motion kinematics or modes + # + # Form factor specific: Yes + CYCLIC_GARAGE_OPENER = "CyclicGarageOpener" + + # + # CyclicGateOpener + # + # Commands: + # - cycle(): Do a cycle of supported motion kinematics or modes + # + # Form factor specific: Yes + CYCLIC_GATE_OPENER = "CyclicGateOpener" + + # + # DHWTemperature + # + # States: + # - core:DHWTemperatureState (float -100.0-100.0): Current water temperature (°C) + DHW_TEMPERATURE = "DHWTemperature" + + # + # DHWThermostat + # + # Commands: + # - setTargetDHWTemperature(float 38.0-60.0): Set the new water temperature to reach for a Domestic Hot Water system + DHW_THERMOSTAT = "DHWThermostat" + + # + # DHWThermostatTargetReader + # + # States: + # - core:TargetDHWTemperatureState (float 38.0-60.0): Domestic hot water target temperature (°C) + DHW_THERMOSTAT_TARGET_READER = "DHWThermostatTargetReader" + + # + # DeployUndeploy + # + # Commands: + # - deploy(): Fully deploy the device + # - undeploy(): Fully undeploy the device + DEPLOY_UNDEPLOY = "DeployUndeploy" + + # + # DeployUndeployAwning + # + # Commands: + # - deploy(): Fully deploy the device + # - undeploy(): Fully undeploy the device + # + # Form factor specific: Yes + DEPLOY_UNDEPLOY_AWNING = "DeployUndeployAwning" + + # + # Deployable + # + # Commands: + # - setDeployment(int 0-100): Device deployment level (100%=fully deployed, 0%=fully undeployed) + DEPLOYABLE = "Deployable" + + # + # DeployableAwning + # + # Commands: + # - setDeployment(int 0-100): Device deployment level (100%=fully deployed, 0%=fully undeployed) + # + # Form factor specific: Yes + DEPLOYABLE_AWNING = "DeployableAwning" + + # + # DeployableVerticalAwning + # + # Commands: + # - setDeployment(int 0-100): Device deployment level (100%=fully deployed, 0%=fully undeployed) + # + # Form factor specific: Yes + DEPLOYABLE_VERTICAL_AWNING = "DeployableVerticalAwning" + + # + # Dimmable + # + # Commands: + # - setIntensity(int 0-100): Light intensity level (100%=maximum intensity, 0%=off) + DIMMABLE = "Dimmable" + + # + # DoorContactSensor + # + # States: + # - core:ContactState (string values: 'open', 'closed'): Contact sensor is open or closed + # + # Form factor specific: Yes + DOOR_CONTACT_SENSOR = "DoorContactSensor" + + # + # DoorOpeningStatus + # + # States: + # - core:OpenClosedState (string values: 'open', 'closed'): Indicate if the device is open or closed + # + # Form factor specific: Yes + DOOR_OPENING_STATUS = "DoorOpeningStatus" + + # + # DualThermostat + # + # Commands: + # - setCoolingTargetTemperature(float 7.0-35.0): Set the cooling target temperature (manual set point) + # - setHeatingTargetTemperature(float 7.0-35.0): Set the heating target temperature (manual set point) + DUAL_THERMOSTAT = "DualThermostat" + + # + # ElectricCurrentMeter + # + # States: + # - core:ElectricCurrentState (float >= 0.0): Current electric current intensity (Amp) + ELECTRIC_CURRENT_METER = "ElectricCurrentMeter" + + # + # ElectricEnergyAndPower + # + # States: + # - core:ElectricEnergyConsumptionState (int >= 0): Electric energy consumption index (Wh) + # - core:ElectricPowerConsumptionState (float >= 0.0): Current electric power (W) + ELECTRIC_ENERGY_AND_POWER = "ElectricEnergyAndPower" + + # + # ElectricEnergyConsumption + # + # States: + # - core:ElectricEnergyConsumptionState (int >= 0): Electric energy consumption index (Wh) + ELECTRIC_ENERGY_CONSUMPTION = "ElectricEnergyConsumption" + + # + # ElectricPowerMeter + # + # States: + # - core:ElectricPowerConsumptionState (float >= 0.0): Current electric power (W) + ELECTRIC_POWER_METER = "ElectricPowerMeter" + + # + # FossilEnergyConsumption + # + # States: + # - core:FossilEnergyConsumptionState (int >= 0): Fossil energy consumption index (Wh) + FOSSIL_ENERGY_CONSUMPTION = "FossilEnergyConsumption" + + # + # GasConsumption + # + # States: + # - core:GasConsumptionState (float >= 0.0): Gas consumption index (m^3) + GAS_CONSUMPTION = "GasConsumption" + + # + # GasDetector + # + # States: + # - core:GasDetectionState (string values: 'detected', 'notDetected'): Indicate if a gas leak is detected or not + GAS_DETECTOR = "GasDetector" + + # Generic (details unavailable) + GENERIC = "Generic" + + # + # HeatingLevel + # + # Commands: + # - setHeatingLevel(string values: 'comfort', 'eco'): Sets the device heating level mode + HEATING_LEVEL = "HeatingLevel" + + # + # IntrusionDetector + # + # States: + # - core:IntrusionState (string values: 'detected', 'notDetected'): Indicate if an intrusion was detected or not + INTRUSION_DETECTOR = "IntrusionDetector" + + # + # IntrusionEventDetector + # + # States: + # - core:IntrusionDetectedState (boolean): Indicate each time an intrusion was detected + INTRUSION_EVENT_DETECTOR = "IntrusionEventDetector" + + # + # LevelControl + # + # Commands: + # - setLevel(int 0-100): Generic device working level (0-100%) Functional meaning depends on device + LEVEL_CONTROL = "LevelControl" + + # + # LightDimmer + # + # Commands: + # - setIntensity(int 0-100): Light intensity level (100%=maximum intensity, 0%=off) + # + # Form factor specific: Yes + LIGHT_DIMMER = "LightDimmer" + + # + # Lock + # + # Commands: + # - lock(): Lock the device + # - unlock(): Unlock the device + LOCK = "Lock" + + # + # LockStatus + # + # States: + # - core:LockedUnlockedState (string values: 'locked', 'unlocked'): Indicate if the device is locked or unlocked + LOCK_STATUS = "LockStatus" + + # + # LockableOpeningStatus + # + # States: + # - core:LockedUnlockedState (string values: 'locked', 'unlocked'): Indicate if the device is locked or unlocked + # - core:OpenClosedState (string values: 'open', 'closed'): Indicate if the device is open or closed + LOCKABLE_OPENING_STATUS = "LockableOpeningStatus" + + # + # LockableTiltableOpeningStatus + # + # States: + # - core:LockedUnlockedState (string values: 'locked', 'unlocked'): Indicate if the device is locked or unlocked + # - core:OpenClosedState (string values: 'open', 'closed'): Indicate if the device is open or closed + # - core:TiltedState (boolean): Indicate if a device is titled or straight + LOCKABLE_TILTABLE_OPENING_STATUS = "LockableTiltableOpeningStatus" + + # + # LockableTiltableWindowOpeningStatus + # + # States: + # - core:LockedUnlockedState (string values: 'locked', 'unlocked'): Indicate if the device is locked or unlocked + # - core:OpenClosedState (string values: 'open', 'closed'): Indicate if the device is open or closed + # - core:TiltedState (boolean): Indicate if a device is titled or straight + # + # Form factor specific: Yes + LOCKABLE_TILTABLE_WINDOW_OPENING_STATUS = "LockableTiltableWindowOpeningStatus" + + # + # Luminance + # + # States: + # - core:LuminanceState (int >= 0): Current illuminance value (Lux) + LUMINANCE = "Luminance" + + # + # MusicPlayer + # + # Commands: + # - pause(): Pause current action + # - play(): Play media + # - setVolume(int 0-100): Set the device output volume + MUSIC_PLAYER = "MusicPlayer" + + # + # OccupancyDetector + # + # States: + # - core:OccupancyState (string values: 'personInside', 'noPersonInside'): Indicate if a person or motion was detected or not + OCCUPANCY_DETECTOR = "OccupancyDetector" + + # + # OnOffButton + # + # States: + # - core:OnOffButtonState (string values: 'on', 'off'): Position of an on/off switch + ON_OFF_BUTTON = "OnOffButton" + + # + # OnOffStatus + # + # States: + # - core:OnOffState (string values: 'on', 'off'): Device on/off status + ON_OFF_STATUS = "OnOffStatus" + + # + # OpenClose + # + # Commands: + # - close(): Fully close the device + # - open(): Fully open the device + # - stop(): Stop the current actuator behavior (movement, sound or timer) + OPEN_CLOSE = "OpenClose" + + # + # OpenCloseBlind + # + # Commands: + # - close(): Fully close the device + # - open(): Fully open the device + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # Form factor specific: Yes + OPEN_CLOSE_BLIND = "OpenCloseBlind" + + # + # OpenCloseCameraShutter + # + # Commands: + # - close(): Fully close the device + # - open(): Fully open the device + # + # Form factor specific: Yes + OPEN_CLOSE_CAMERA_SHUTTER = "OpenCloseCameraShutter" + + # + # OpenCloseCurtain + # + # Commands: + # - close(): Fully close the device + # - open(): Fully open the device + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # Form factor specific: Yes + OPEN_CLOSE_CURTAIN = "OpenCloseCurtain" + + # + # OpenCloseGarageOpener + # + # Commands: + # - close(): Fully close the device + # - open(): Fully open the device + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # Form factor specific: Yes + OPEN_CLOSE_GARAGE_OPENER = "OpenCloseGarageOpener" + + # + # OpenCloseGateOpener + # + # Commands: + # - close(): Fully close the device + # - open(): Fully open the device + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # Form factor specific: Yes + OPEN_CLOSE_GATE_OPENER = "OpenCloseGateOpener" + + # + # OpenCloseScreen + # + # Commands: + # - close(): Fully close the device + # - open(): Fully open the device + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # Form factor specific: Yes + OPEN_CLOSE_SCREEN = "OpenCloseScreen" + + # + # OpenCloseShutter + # + # Commands: + # - close(): Fully close the device + # - open(): Fully open the device + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # Form factor specific: Yes + OPEN_CLOSE_SHUTTER = "OpenCloseShutter" + + # + # OpenCloseShutterSwitch + # + # Commands: + # - close(): Fully close the device + # - open(): Fully open the device + # + # Form factor specific: Yes + OPEN_CLOSE_SHUTTER_SWITCH = "OpenCloseShutterSwitch" + + # + # OpenCloseSlidingGateOpener + # + # Commands: + # - close(): Fully close the device + # - open(): Fully open the device + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # Form factor specific: Yes + OPEN_CLOSE_SLIDING_GATE_OPENER = "OpenCloseSlidingGateOpener" + + # + # OpenCloseSwingingShutter + # + # Commands: + # - close(): Fully close the device + # - open(): Fully open the device + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # Form factor specific: Yes + OPEN_CLOSE_SWINGING_SHUTTER = "OpenCloseSwingingShutter" + + # + # OpenCloseWindow + # + # Commands: + # - close(): Fully close the device + # - open(): Fully open the device + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # Form factor specific: Yes + OPEN_CLOSE_WINDOW = "OpenCloseWindow" + + # + # OpeningStatus + # + # States: + # - core:OpenClosedState (string values: 'open', 'closed'): Indicate if the device is open or closed + OPENING_STATUS = "OpeningStatus" + + # + # OperatingModeHeating + # + # Commands: + # - setOperatingMode(any): Set an operating mode + OPERATING_MODE_HEATING = "OperatingModeHeating" + + # + # OrientableAndCloseable + # + # Commands: + # - setClosureAndOrientation(int 0-100, int 0-100): Set both the closure level (0-100%) and relative slats orientation (0-100%) of the device + ORIENTABLE_AND_CLOSEABLE = "OrientableAndCloseable" + + # + # OrientableOrCloseable + # + # Commands: + # - setClosureOrOrientation(int 0-100, int 0-100): Set device closure level (0-100%), or put the device in rocking position ('rocker') and set the relative slats orientation (0-100%) + ORIENTABLE_OR_CLOSEABLE = "OrientableOrCloseable" + + # + # OrientablePlusCloseable + # + # Commands: + # - setClosure(int 0-100): Closure level (100%=fully close, 0%=open) + # - setOrientation(int 0-100): Set the relative orientation (0-100%) of the device slats + # - stop(): Stop the current actuator behavior (movement, sound or timer) + ORIENTABLE_PLUS_CLOSEABLE = "OrientablePlusCloseable" + + # + # OrientableSlats + # + # Commands: + # - setOrientation(int 0-100): Set the relative orientation (0-100%) of the device slats + ORIENTABLE_SLATS = "OrientableSlats" + + # + # PictureCamera + # + # Commands: + # - takePicture(): Take a still picture + PICTURE_CAMERA = "PictureCamera" + + # + # PowerCutDetector + # + # States: + # - core:PowerCutDetectionState (string values: 'detected', 'notDetected'): Indicate if a main power cut was detected or not + POWER_CUT_DETECTOR = "PowerCutDetector" + + # + # PushButtonSensor + # + # States: + # - core:ButtonState (string values: 'pressed', 'released', 'shortPressed'): Indicate if a button is pressed or released + PUSH_BUTTON_SENSOR = "PushButtonSensor" + + # + # RainDetector + # + # States: + # - core:RainState (string values: 'detected', 'notDetected'): Indicate if rain is detected or not + RAIN_DETECTOR = "RainDetector" + + # + # RelativeHumidity + # + # States: + # - core:RelativeHumidityState (float 0.0-100.0): Air relative humidity (0%=totally dry, 100%=fully saturated) + RELATIVE_HUMIDITY = "RelativeHumidity" + + # + # RockerSwitch + # + # States: + # - core:RockerSwitchPushWayState (string values: 'heldDown', 'pressed', 'pressedX2', 'pressedX3', 'pressedX4', 'pressedX5', 'released'): Indicate when a rocker switch is pressed or released + ROCKER_SWITCH = "RockerSwitch" + + # + # ScenarioTrigger + # + # States: + # - core:LaunchStatusState (string values: 'launched', 'standby'): Indicates if the scene is launched or standby. "launched" value indicates that the launch conditions have been met (ex button pressed on a remote controller). "standby" value matches with an intermediate status, typically between two launch actions (ex button released on a remote controller). "launched" value should be used during a very short time and not persist across different launch events, whereas "standby" is a more stable value. + SCENARIO_TRIGGER = "ScenarioTrigger" + + # + # Siren + # + # Commands: + # - ring(): Ask the device to start ringing + # - stop(): Stop the current actuator behavior (movement, sound or timer) + SIREN = "Siren" + + # + # SlidingPergola + # + # Commands: + # - setDeployment(int 0-100): Device deployment level (100%=fully deployed, 0%=fully undeployed) + # + # Form factor specific: Yes + SLIDING_PERGOLA = "SlidingPergola" + + # + # SmokeDetector + # + # States: + # - core:SmokeState (string values: 'detected', 'notDetected'): Indicate if smoke is detected or not + SMOKE_DETECTOR = "SmokeDetector" + + # Specific (details unavailable) + SPECIFIC = "Specific" + + # + # StartStop + # + # Commands: + # - start(): Start the default actuator behavior (movement, sound or timer) + # - stop(): Stop the current actuator behavior (movement, sound or timer) + START_STOP = "StartStop" + + # + # StatefulAirFan + # + # Commands: + # - setFanSpeedLevel(int 0-100): Set the device fan speed level (%) + # + # States: + # - core:FanSpeedLevelState (int 0-100): Fan speed level (%) + STATEFUL_AIR_FAN = "StatefulAirFan" + + # + # StatefulAlarm + # + # Commands: + # - arm(): Arm the system + # - disarm(): Disarm the system + # + # States: + # - core:ArmedState (boolean): Indicate if the security device is armed (true=armed) + STATEFUL_ALARM = "StatefulAlarm" + + # + # StatefulBasicCloseable + # + # Commands: + # - setClosure(int 0-100): Closure level (100%=fully close, 0%=open) + # + # States: + # - core:ClosureState (int 0-100): Device closure percentage (0%=fully open, 100%=fully closed) + STATEFUL_BASIC_CLOSEABLE = "StatefulBasicCloseable" + + # + # StatefulBasicOpenClose + # + # Commands: + # - close(): Fully close the device + # - open(): Fully open the device + # + # States: + # - core:OpenClosedState (string values: 'open', 'closed'): Indicate if the device is open or closed + STATEFUL_BASIC_OPEN_CLOSE = "StatefulBasicOpenClose" + + # + # StatefulBioClimaticPergola + # + # Commands: + # - setOrientation(int 0-100): Set the relative orientation (0-100%) of the device slats + # + # States: + # - core:SlateOrientationState (int 0-100): Slats orientation percentage (0%=not tilted,100%=maximum tilt) + # + # Form factor specific: Yes + STATEFUL_BIO_CLIMATIC_PERGOLA = "StatefulBioClimaticPergola" + + # + # StatefulCarLockWithOpeningStatus + # + # Commands: + # - lock(): Lock the device + # - unlock(): Unlock the device + # + # States: + # - core:LockedUnlockedState (string values: 'locked', 'unlocked'): Indicate if the device is locked or unlocked + # - core:OpenClosedState (string values: 'open', 'closed'): Indicate if the device is open or closed + # + # Form factor specific: Yes + STATEFUL_CAR_LOCK_WITH_OPENING_STATUS = "StatefulCarLockWithOpeningStatus" + + # + # StatefulCloseable + # + # Commands: + # - setClosure(int 0-100): Closure level (100%=fully close, 0%=open) + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # States: + # - core:ClosureState (int 0-100): Device closure percentage (0%=fully open, 100%=fully closed) + STATEFUL_CLOSEABLE = "StatefulCloseable" + + # + # StatefulCloseableAirVent + # + # Commands: + # - setClosure(int 0-100): Closure level (100%=fully close, 0%=open) + # + # States: + # - core:ClosureState (int 0-100): Device closure percentage (0%=fully open, 100%=fully closed) + # + # Form factor specific: Yes + STATEFUL_CLOSEABLE_AIR_VENT = "StatefulCloseableAirVent" + + # + # StatefulCloseableBlind + # + # Commands: + # - setClosure(int 0-100): Closure level (100%=fully close, 0%=open) + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # States: + # - core:ClosureState (int 0-100): Device closure percentage (0%=fully open, 100%=fully closed) + # + # Form factor specific: Yes + STATEFUL_CLOSEABLE_BLIND = "StatefulCloseableBlind" + + # + # StatefulCloseableCurtain + # + # Commands: + # - setClosure(int 0-100): Closure level (100%=fully close, 0%=open) + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # States: + # - core:ClosureState (int 0-100): Device closure percentage (0%=fully open, 100%=fully closed) + # + # Form factor specific: Yes + STATEFUL_CLOSEABLE_CURTAIN = "StatefulCloseableCurtain" + + # + # StatefulCloseableGarageOpener + # + # Commands: + # - setClosure(int 0-100): Closure level (100%=fully close, 0%=open) + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # States: + # - core:ClosureState (int 0-100): Device closure percentage (0%=fully open, 100%=fully closed) + # + # Form factor specific: Yes + STATEFUL_CLOSEABLE_GARAGE_OPENER = "StatefulCloseableGarageOpener" + + # + # StatefulCloseableGateOpener + # + # Commands: + # - setClosure(int 0-100): Closure level (100%=fully close, 0%=open) + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # States: + # - core:ClosureState (int 0-100): Device closure percentage (0%=fully open, 100%=fully closed) + # + # Form factor specific: Yes + STATEFUL_CLOSEABLE_GATE_OPENER = "StatefulCloseableGateOpener" + + # + # StatefulCloseableScreen + # + # Commands: + # - setClosure(int 0-100): Closure level (100%=fully close, 0%=open) + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # States: + # - core:ClosureState (int 0-100): Device closure percentage (0%=fully open, 100%=fully closed) + # + # Form factor specific: Yes + STATEFUL_CLOSEABLE_SCREEN = "StatefulCloseableScreen" + + # + # StatefulCloseableShutter + # + # Commands: + # - setClosure(int 0-100): Closure level (100%=fully close, 0%=open) + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # States: + # - core:ClosureState (int 0-100): Device closure percentage (0%=fully open, 100%=fully closed) + # + # Form factor specific: Yes + STATEFUL_CLOSEABLE_SHUTTER = "StatefulCloseableShutter" + + # + # StatefulCloseableSlidingDoor + # + # Commands: + # - setClosure(int 0-100): Closure level (100%=fully close, 0%=open) + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # States: + # - core:ClosureState (int 0-100): Device closure percentage (0%=fully open, 100%=fully closed) + # + # Form factor specific: Yes + STATEFUL_CLOSEABLE_SLIDING_DOOR = "StatefulCloseableSlidingDoor" + + # + # StatefulCloseableSlidingWindow + # + # Commands: + # - setClosure(int 0-100): Closure level (100%=fully close, 0%=open) + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # States: + # - core:ClosureState (int 0-100): Device closure percentage (0%=fully open, 100%=fully closed) + # + # Form factor specific: Yes + STATEFUL_CLOSEABLE_SLIDING_WINDOW = "StatefulCloseableSlidingWindow" + + # + # StatefulCloseableSwingingShutter + # + # Commands: + # - setClosure(int 0-100): Closure level (100%=fully close, 0%=open) + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # States: + # - core:ClosureState (int 0-100): Device closure percentage (0%=fully open, 100%=fully closed) + # + # Form factor specific: Yes + STATEFUL_CLOSEABLE_SWINGING_SHUTTER = "StatefulCloseableSwingingShutter" + + # + # StatefulCloseableValve + # + # Commands: + # - setClosure(int 0-100): Closure level (100%=fully close, 0%=open) + # + # States: + # - core:ClosureState (int 0-100): Device closure percentage (0%=fully open, 100%=fully closed) + # + # Form factor specific: Yes + STATEFUL_CLOSEABLE_VALVE = "StatefulCloseableValve" + + # + # StatefulCloseableWindow + # + # Commands: + # - setClosure(int 0-100): Closure level (100%=fully close, 0%=open) + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # States: + # - core:ClosureState (int 0-100): Device closure percentage (0%=fully open, 100%=fully closed) + # + # Form factor specific: Yes + STATEFUL_CLOSEABLE_WINDOW = "StatefulCloseableWindow" + + # + # StatefulCoolingThermostat + # + # Commands: + # - setCoolingTargetTemperature(float 7.0-35.0): Set the cooling target temperature (manual set point) + # + # States: + # - core:CoolingTargetTemperatureState (float 12.0-30.0): Room target temperature (°C) for dual heating/cooling system + STATEFUL_COOLING_THERMOSTAT = "StatefulCoolingThermostat" + + # + # StatefulCoolingThermostatWithSensor + # + # Commands: + # - setCoolingTargetTemperature(float 7.0-35.0): Set the cooling target temperature (manual set point) + # + # States: + # - core:CoolingTargetTemperatureState (float 12.0-30.0): Room target temperature (°C) for dual heating/cooling system + # - core:TemperatureState (float -100.0-100.0): Current room temperature (°C) + STATEFUL_COOLING_THERMOSTAT_WITH_SENSOR = "StatefulCoolingThermostatWithSensor" + + # + # StatefulDHWThermostat + # + # Commands: + # - setTargetDHWTemperature(float 38.0-60.0): Set the new water temperature to reach for a Domestic Hot Water system + # + # States: + # - core:TargetDHWTemperatureState (float 38.0-60.0): Domestic hot water target temperature (°C) + STATEFUL_DHW_THERMOSTAT = "StatefulDHWThermostat" + + # + # StatefulDeployUndeploy + # + # Commands: + # - deploy(): Fully deploy the device + # - undeploy(): Fully undeploy the device + # + # States: + # - core:DeployedUndeployedState (string values: 'deployed', 'undeployed'): Indicate if the device is deployed or not + STATEFUL_DEPLOY_UNDEPLOY = "StatefulDeployUndeploy" + + # + # StatefulDeployUndeployAwning + # + # Commands: + # - deploy(): Fully deploy the device + # - undeploy(): Fully undeploy the device + # + # States: + # - core:DeployedUndeployedState (string values: 'deployed', 'undeployed'): Indicate if the device is deployed or not + # + # Form factor specific: Yes + STATEFUL_DEPLOY_UNDEPLOY_AWNING = "StatefulDeployUndeployAwning" + + # + # StatefulDeployable + # + # Commands: + # - setDeployment(int 0-100): Device deployment level (100%=fully deployed, 0%=fully undeployed) + # + # States: + # - core:DeploymentState (int 0-100): Device deployment percentage (0%=fully retracted, 100%=fully deployed) + STATEFUL_DEPLOYABLE = "StatefulDeployable" + + # + # StatefulDeployableAwning + # + # Commands: + # - setDeployment(int 0-100): Device deployment level (100%=fully deployed, 0%=fully undeployed) + # + # States: + # - core:DeploymentState (int 0-100): Device deployment percentage (0%=fully retracted, 100%=fully deployed) + # + # Form factor specific: Yes + STATEFUL_DEPLOYABLE_AWNING = "StatefulDeployableAwning" + + # + # StatefulDeployableVerticalAwning + # + # Commands: + # - setDeployment(int 0-100): Device deployment level (100%=fully deployed, 0%=fully undeployed) + # + # States: + # - core:DeploymentState (int 0-100): Device deployment percentage (0%=fully retracted, 100%=fully deployed) + # + # Form factor specific: Yes + STATEFUL_DEPLOYABLE_VERTICAL_AWNING = "StatefulDeployableVerticalAwning" + + # + # StatefulDimmable + # + # Commands: + # - setIntensity(int 0-100): Light intensity level (100%=maximum intensity, 0%=off) + # + # States: + # - core:LightIntensityState (int 0-100): Light intensity percentage (0%=min intensity,100%=maximum intensity) + STATEFUL_DIMMABLE = "StatefulDimmable" + + # + # StatefulDoorLock + # + # Commands: + # - lock(): Lock the device + # - unlock(): Unlock the device + # + # States: + # - core:LockedUnlockedState (string values: 'locked', 'unlocked'): Indicate if the device is locked or unlocked + # + # Form factor specific: Yes + STATEFUL_DOOR_LOCK = "StatefulDoorLock" + + # + # StatefulDoorLockWithOpeningStatus + # + # Commands: + # - lock(): Lock the device + # - unlock(): Unlock the device + # + # States: + # - core:LockedUnlockedState (string values: 'locked', 'unlocked'): Indicate if the device is locked or unlocked + # - core:OpenClosedState (string values: 'open', 'closed'): Indicate if the device is open or closed + # + # Form factor specific: Yes + STATEFUL_DOOR_LOCK_WITH_OPENING_STATUS = "StatefulDoorLockWithOpeningStatus" + + # + # StatefulDualThermostat + # + # Commands: + # - setCoolingTargetTemperature(float 7.0-35.0): Set the cooling target temperature (manual set point) + # - setHeatingTargetTemperature(float 7.0-35.0): Set the heating target temperature (manual set point) + # + # States: + # - core:CoolingTargetTemperatureState (float 12.0-30.0): Room target temperature (°C) for dual heating/cooling system + # - core:HeatingTargetTemperatureState (float 12.0-30.0): Room target temperature (°C) for dual heating/cooling system + STATEFUL_DUAL_THERMOSTAT = "StatefulDualThermostat" + + # + # StatefulDualThermostatWithSensor + # + # Commands: + # - setCoolingTargetTemperature(float 7.0-35.0): Set the cooling target temperature (manual set point) + # - setHeatingTargetTemperature(float 7.0-35.0): Set the heating target temperature (manual set point) + # + # States: + # - core:CoolingTargetTemperatureState (float 12.0-30.0): Room target temperature (°C) for dual heating/cooling system + # - core:HeatingTargetTemperatureState (float 12.0-30.0): Room target temperature (°C) for dual heating/cooling system + # - core:TemperatureState (float -100.0-100.0): Current room temperature (°C) + STATEFUL_DUAL_THERMOSTAT_WITH_SENSOR = "StatefulDualThermostatWithSensor" + + # + # StatefulHeatingLevel + # + # Commands: + # - setHeatingLevel(string values: 'comfort', 'eco'): Sets the device heating level mode + # + # States: + # - core:TargetHeatingLevelState (string values: 'comfort', 'eco'): Current heating level + STATEFUL_HEATING_LEVEL = "StatefulHeatingLevel" + + # + # StatefulLevelControl + # + # Commands: + # - setLevel(int 0-100): Generic device working level (0-100%) Functional meaning depends on device + # + # States: + # - core:LevelState (int 0-100): Device working level percentage (0%=min level, 100%=maximum level) + STATEFUL_LEVEL_CONTROL = "StatefulLevelControl" + + # + # StatefulLevelControlHeating + # + # Commands: + # - setLevel(int 0-100): Generic device working level (0-100%) Functional meaning depends on device + # + # States: + # - core:LevelState (int 0-100): Device working level percentage (0%=min level, 100%=maximum level) + # + # Form factor specific: Yes + STATEFUL_LEVEL_CONTROL_HEATING = "StatefulLevelControlHeating" + + # + # StatefulLightDimmer + # + # Commands: + # - setIntensity(int 0-100): Light intensity level (100%=maximum intensity, 0%=off) + # + # States: + # - core:LightIntensityState (int 0-100): Light intensity percentage (0%=min intensity,100%=maximum intensity) + # + # Form factor specific: Yes + STATEFUL_LIGHT_DIMMER = "StatefulLightDimmer" + + # + # StatefulLock + # + # Commands: + # - lock(): Lock the device + # - unlock(): Unlock the device + # + # States: + # - core:LockedUnlockedState (string values: 'locked', 'unlocked'): Indicate if the device is locked or unlocked + STATEFUL_LOCK = "StatefulLock" + + # + # StatefulLockWithOpeningStatus + # + # Commands: + # - lock(): Lock the device + # - unlock(): Unlock the device + # + # States: + # - core:LockedUnlockedState (string values: 'locked', 'unlocked'): Indicate if the device is locked or unlocked + # - core:OpenClosedState (string values: 'open', 'closed'): Indicate if the device is open or closed + STATEFUL_LOCK_WITH_OPENING_STATUS = "StatefulLockWithOpeningStatus" + + # + # StatefulOpenClose + # + # Commands: + # - close(): Fully close the device + # - open(): Fully open the device + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # States: + # - core:OpenClosedState (string values: 'open', 'closed'): Indicate if the device is open or closed + STATEFUL_OPEN_CLOSE = "StatefulOpenClose" + + # + # StatefulOpenCloseGateOpener + # + # Commands: + # - close(): Fully close the device + # - open(): Fully open the device + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # States: + # - core:OpenClosedState (string values: 'open', 'closed'): Indicate if the device is open or closed + # + # Form factor specific: Yes + STATEFUL_OPEN_CLOSE_GATE_OPENER = "StatefulOpenCloseGateOpener" + + # + # StatefulOpenCloseShutter + # + # Commands: + # - close(): Fully close the device + # - open(): Fully open the device + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # States: + # - core:OpenClosedState (string values: 'open', 'closed'): Indicate if the device is open or closed + # + # Form factor specific: Yes + STATEFUL_OPEN_CLOSE_SHUTTER = "StatefulOpenCloseShutter" + + # + # StatefulOpenCloseSwingingShutter + # + # Commands: + # - close(): Fully close the device + # - open(): Fully open the device + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # States: + # - core:OpenClosedState (string values: 'open', 'closed'): Indicate if the device is open or closed + # + # Form factor specific: Yes + STATEFUL_OPEN_CLOSE_SWINGING_SHUTTER = "StatefulOpenCloseSwingingShutter" + + # + # StatefulOpenCloseValve + # + # Commands: + # - close(): Fully close the device + # - open(): Fully open the device + # + # States: + # - core:OpenClosedState (string values: 'open', 'closed'): Indicate if the device is open or closed + # + # Form factor specific: Yes + STATEFUL_OPEN_CLOSE_VALVE = "StatefulOpenCloseValve" + + # + # StatefulOperatingModeHeating + # + # Commands: + # - setOperatingMode(any): Set an operating mode + # + # States: + # - core:OperatingModeState (string values: 'antifreeze', 'auto', 'away', 'eco', 'frostprotection', 'manual', 'max', 'normal', 'off', 'on', 'prog', 'program', 'boost'): Current operating mode + STATEFUL_OPERATING_MODE_HEATING = "StatefulOperatingModeHeating" + + # + # StatefulOrientableAndCloseable + # + # Commands: + # - setClosureAndOrientation(int 0-100, int 0-100): Set both the closure level (0-100%) and relative slats orientation (0-100%) of the device + # + # States: + # - core:ClosureState (int 0-100): Device closure percentage (0%=fully open, 100%=fully closed) + # - core:SlateOrientationState (int 0-100): Slats orientation percentage (0%=not tilted,100%=maximum tilt) + STATEFUL_ORIENTABLE_AND_CLOSEABLE = "StatefulOrientableAndCloseable" + + # + # StatefulOrientableAndCloseableShutter + # + # Commands: + # - setClosureAndOrientation(int 0-100, int 0-100): Set both the closure level (0-100%) and relative slats orientation (0-100%) of the device + # + # States: + # - core:ClosureState (int 0-100): Device closure percentage (0%=fully open, 100%=fully closed) + # - core:SlateOrientationState (int 0-100): Slats orientation percentage (0%=not tilted,100%=maximum tilt) + # + # Form factor specific: Yes + STATEFUL_ORIENTABLE_AND_CLOSEABLE_SHUTTER = "StatefulOrientableAndCloseableShutter" + + # + # StatefulOrientableOrCloseable + # + # Commands: + # - setClosureOrOrientation(int 0-100, int 0-100): Set device closure level (0-100%), or put the device in rocking position ('rocker') and set the relative slats orientation (0-100%) + # + # States: + # - core:ClosureState (int 0-100): Device closure percentage (0%=fully open, 100%=fully closed) + # - core:SlateOrientationState (int 0-100): Slats orientation percentage (0%=not tilted,100%=maximum tilt) + STATEFUL_ORIENTABLE_OR_CLOSEABLE = "StatefulOrientableOrCloseable" + + # + # StatefulOrientablePlusCloseable + # + # Commands: + # - setClosure(int 0-100): Closure level (100%=fully close, 0%=open) + # - setOrientation(int 0-100): Set the relative orientation (0-100%) of the device slats + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # States: + # - core:ClosureState (int 0-100): Device closure percentage (0%=fully open, 100%=fully closed) + # - core:SlateOrientationState (int 0-100): Slats orientation percentage (0%=not tilted,100%=maximum tilt) + STATEFUL_ORIENTABLE_PLUS_CLOSEABLE = "StatefulOrientablePlusCloseable" + + # + # StatefulOrientablePlusCloseablePergola + # + # Commands: + # - setClosure(int 0-100): Closure level (100%=fully close, 0%=open) + # - setOrientation(int 0-100): Set the relative orientation (0-100%) of the device slats + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # States: + # - core:ClosureState (int 0-100): Device closure percentage (0%=fully open, 100%=fully closed) + # - core:SlateOrientationState (int 0-100): Slats orientation percentage (0%=not tilted,100%=maximum tilt) + # + # Form factor specific: Yes + STATEFUL_ORIENTABLE_PLUS_CLOSEABLE_PERGOLA = ( + "StatefulOrientablePlusCloseablePergola" + ) + + # + # StatefulOrientableShutter + # + # Commands: + # - setClosure(int 0-100): Closure level (100%=fully close, 0%=open) + # - setOrientation(int 0-100): Set the relative orientation (0-100%) of the device slats + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # States: + # - core:ClosureState (int 0-100): Device closure percentage (0%=fully open, 100%=fully closed) + # - core:SlateOrientationState (int 0-100): Slats orientation percentage (0%=not tilted,100%=maximum tilt) + # + # Form factor specific: Yes + STATEFUL_ORIENTABLE_SHUTTER = "StatefulOrientableShutter" + + # + # StatefulOrientableSlats + # + # Commands: + # - setOrientation(int 0-100): Set the relative orientation (0-100%) of the device slats + # + # States: + # - core:SlateOrientationState (int 0-100): Slats orientation percentage (0%=not tilted,100%=maximum tilt) + STATEFUL_ORIENTABLE_SLATS = "StatefulOrientableSlats" + + # + # StatefulRockingShutter + # + # Commands: + # - setClosureOrOrientation(int 0-100, int 0-100): Set device closure level (0-100%), or put the device in rocking position ('rocker') and set the relative slats orientation (0-100%) + # + # States: + # - core:ClosureState (int 0-100): Device closure percentage (0%=fully open, 100%=fully closed) + # - core:SlateOrientationState (int 0-100): Slats orientation percentage (0%=not tilted,100%=maximum tilt) + # + # Form factor specific: Yes + STATEFUL_ROCKING_SHUTTER = "StatefulRockingShutter" + + # + # StatefulSiren + # + # Commands: + # - ring(): Ask the device to start ringing + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # States: + # - core:OnOffState (string values: 'on', 'off'): Device on/off status + STATEFUL_SIREN = "StatefulSiren" + + # + # StatefulSlidingPergola + # + # Commands: + # - setDeployment(int 0-100): Device deployment level (100%=fully deployed, 0%=fully undeployed) + # + # States: + # - core:DeploymentState (int 0-100): Device deployment percentage (0%=fully retracted, 100%=fully deployed) + # + # Form factor specific: Yes + STATEFUL_SLIDING_PERGOLA = "StatefulSlidingPergola" + + # + # StatefulStartStop + # + # Commands: + # - start(): Start the default actuator behavior (movement, sound or timer) + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # States: + # - core:StartedStoppedState (string values: 'started', 'stopped'): Indicate if the sequence if started or stopped + STATEFUL_START_STOP = "StatefulStartStop" + + # + # StatefulStartStopOven + # + # Commands: + # - start(): Start the default actuator behavior (movement, sound or timer) + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # States: + # - core:StartedStoppedState (string values: 'started', 'stopped'): Indicate if the sequence if started or stopped + # + # Form factor specific: Yes + STATEFUL_START_STOP_OVEN = "StatefulStartStopOven" + + # + # StatefulStartStopWashingMachine + # + # Commands: + # - start(): Start the default actuator behavior (movement, sound or timer) + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # + # States: + # - core:StartedStoppedState (string values: 'started', 'stopped'): Indicate if the sequence if started or stopped + # + # Form factor specific: Yes + STATEFUL_START_STOP_WASHING_MACHINE = "StatefulStartStopWashingMachine" + + # + # StatefulSwitchable + # + # Commands: + # - off(): Turn off the device + # - on(): Turn on the device + # + # States: + # - core:OnOffState (string values: 'on', 'off'): Device on/off status + STATEFUL_SWITCHABLE = "StatefulSwitchable" + + # + # StatefulSwitchableHeating + # + # Commands: + # - off(): Turn off the device + # - on(): Turn on the device + # + # States: + # - core:OnOffState (string values: 'on', 'off'): Device on/off status + # + # Form factor specific: Yes + STATEFUL_SWITCHABLE_HEATING = "StatefulSwitchableHeating" + + # + # StatefulSwitchableLight + # + # Commands: + # - off(): Turn off the device + # - on(): Turn on the device + # + # States: + # - core:OnOffState (string values: 'on', 'off'): Device on/off status + # + # Form factor specific: Yes + STATEFUL_SWITCHABLE_LIGHT = "StatefulSwitchableLight" + + # + # StatefulSwitchablePlug + # + # Commands: + # - off(): Turn off the device + # - on(): Turn on the device + # + # States: + # - core:OnOffState (string values: 'on', 'off'): Device on/off status + # + # Form factor specific: Yes + STATEFUL_SWITCHABLE_PLUG = "StatefulSwitchablePlug" + + # + # StatefulSwitchableVentilation + # + # Commands: + # - off(): Turn off the device + # - on(): Turn on the device + # + # States: + # - core:OnOffState (string values: 'on', 'off'): Device on/off status + # + # Form factor specific: Yes + STATEFUL_SWITCHABLE_VENTILATION = "StatefulSwitchableVentilation" + + # + # StatefulThermostat + # + # Commands: + # - setTargetTemperature(float 12.0-30.0): Set the new air temperature to reach + # + # States: + # - core:TargetTemperatureState (float 12.0-30.0): Room target temperature (°C) + STATEFUL_THERMOSTAT = "StatefulThermostat" + + # + # StatefulThermostatWithSensor + # + # Commands: + # - setTargetTemperature(float 12.0-30.0): Set the new air temperature to reach + # + # States: + # - core:TargetTemperatureState (float 12.0-30.0): Room target temperature (°C) + # - core:TemperatureState (float -100.0-100.0): Current room temperature (°C) + STATEFUL_THERMOSTAT_WITH_SENSOR = "StatefulThermostatWithSensor" + + # + # StatefulVenetianBlind + # + # Commands: + # - setClosureAndOrientation(int 0-100, int 0-100): Set both the closure level (0-100%) and relative slats orientation (0-100%) of the device + # + # States: + # - core:ClosureState (int 0-100): Device closure percentage (0%=fully open, 100%=fully closed) + # - core:SlateOrientationState (int 0-100): Slats orientation percentage (0%=not tilted,100%=maximum tilt) + # + # Form factor specific: Yes + STATEFUL_VENETIAN_BLIND = "StatefulVenetianBlind" + + # + # StatefulVenetianSlats + # + # Commands: + # - setOrientation(int 0-100): Set the relative orientation (0-100%) of the device slats + # + # States: + # - core:SlateOrientationState (int 0-100): Slats orientation percentage (0%=not tilted,100%=maximum tilt) + # + # Form factor specific: Yes + STATEFUL_VENETIAN_SLATS = "StatefulVenetianSlats" + + # + # StatefulWindowLockWithOpeningStatus + # + # Commands: + # - lock(): Lock the device + # - unlock(): Unlock the device + # + # States: + # - core:LockedUnlockedState (string values: 'locked', 'unlocked'): Indicate if the device is locked or unlocked + # - core:OpenClosedState (string values: 'open', 'closed'): Indicate if the device is open or closed + # + # Form factor specific: Yes + STATEFUL_WINDOW_LOCK_WITH_OPENING_STATUS = "StatefulWindowLockWithOpeningStatus" + + # + # StoppableMusicPlayer + # + # Commands: + # - pause(): Pause current action + # - play(): Play media + # - setVolume(int 0-100): Set the device output volume + # - stop(): Stop the current actuator behavior (movement, sound or timer) + STOPPABLE_MUSIC_PLAYER = "StoppableMusicPlayer" + + # + # Switch + # + # States: + # - core:ActionState (string): Contains the id of current active button action (stateful information). Example, physical position of a switch. + # - core:AvailableActionsState (array): List of action ids available + SWITCH = "Switch" + + # + # SwitchEvent + # + # States: + # - core:AvailableActionsState (array): List of action ids available + # - core:ButtonActionsEventState (string): Contains the id of triggered button action (stateless information, makes sense only punctually at a certain time, does not indicate a stable or continuous status). + SWITCH_EVENT = "SwitchEvent" + + # + # Switchable + # + # Commands: + # - off(): Turn off the device + # - on(): Turn on the device + SWITCHABLE = "Switchable" + + # + # SwitchableHeating + # + # Commands: + # - off(): Turn off the device + # - on(): Turn on the device + # + # Form factor specific: Yes + SWITCHABLE_HEATING = "SwitchableHeating" + + # + # SwitchableHeatingStatus + # + # States: + # - core:OnOffState (string values: 'on', 'off'): Device on/off status + # + # Form factor specific: Yes + SWITCHABLE_HEATING_STATUS = "SwitchableHeatingStatus" + + # + # SwitchableLight + # + # Commands: + # - off(): Turn off the device + # - on(): Turn on the device + # + # Form factor specific: Yes + SWITCHABLE_LIGHT = "SwitchableLight" + + # + # SwitchablePlug + # + # Commands: + # - off(): Turn off the device + # - on(): Turn on the device + # + # Form factor specific: Yes + SWITCHABLE_PLUG = "SwitchablePlug" + + # + # SwitchableVentilation + # + # Commands: + # - off(): Turn off the device + # - on(): Turn on the device + # + # Form factor specific: Yes + SWITCHABLE_VENTILATION = "SwitchableVentilation" + + # + # Temperature + # + # States: + # - core:TemperatureState (float -100.0-100.0): Current room temperature (°C) + TEMPERATURE = "Temperature" + + # + # ThermalEnergyConsumption + # + # States: + # - core:ThermalEnergyConsumptionState (int >= 0): Thermal energy consumption index (Wh) + THERMAL_ENERGY_CONSUMPTION = "ThermalEnergyConsumption" + + # + # Thermostat + # + # Commands: + # - setTargetTemperature(float 12.0-30.0): Set the new air temperature to reach + THERMOSTAT = "Thermostat" + + # + # ThermostatOffsetReader + # + # States: + # - core:ThermostatOffsetState (int -5-5): Thermostat offset (°C) + THERMOSTAT_OFFSET_READER = "ThermostatOffsetReader" + + # + # ThermostatTargetReader + # + # States: + # - core:TargetTemperatureState (float 12.0-30.0): Room target temperature (°C) + THERMOSTAT_TARGET_READER = "ThermostatTargetReader" + + # + # TiltableOpeningStatus + # + # States: + # - core:OpenClosedState (string values: 'open', 'closed'): Indicate if the device is open or closed + # - core:TiltedState (boolean): Indicate if a device is titled or straight + TILTABLE_OPENING_STATUS = "TiltableOpeningStatus" + + # + # TiltableWindowOpeningStatus + # + # States: + # - core:OpenClosedState (string values: 'open', 'closed'): Indicate if the device is open or closed + # - core:TiltedState (boolean): Indicate if a device is titled or straight + # + # Form factor specific: Yes + TILTABLE_WINDOW_OPENING_STATUS = "TiltableWindowOpeningStatus" + + # + # TiltedStatus + # + # States: + # - core:TiltedState (boolean): Indicate if a device is titled or straight + TILTED_STATUS = "TiltedStatus" + + # + # UpDown + # + # Commands: + # - down(): Move the device completely down + # - stop(): Stop the current actuator behavior (movement, sound or timer) + # - up(): Move the device completely up + UP_DOWN = "UpDown" + + # + # UpdatableComponent + # + # Commands: + # - update(): Update the gateway software. The update may have to be downloaded first, which can take a while. + UPDATABLE_COMPONENT = "UpdatableComponent" + + # + # VOCConcentration + # + # States: + # - core:VOCConcentrationState (float >= 0.0): Current volatile organic compounds concentration (ppm) + VOC_CONCENTRATION = "VOCConcentration" + + # + # VenetianBlind + # + # Commands: + # - setClosureAndOrientation(int 0-100, int 0-100): Set both the closure level (0-100%) and relative slats orientation (0-100%) of the device + # + # Form factor specific: Yes + VENETIAN_BLIND = "VenetianBlind" + + # + # VenetianSlats + # + # Commands: + # - setOrientation(int 0-100): Set the relative orientation (0-100%) of the device slats + # + # Form factor specific: Yes + VENETIAN_SLATS = "VenetianSlats" + + # + # VibrationDetector + # + # States: + # - core:VibrationState (string values: 'detected', 'notDetected'): Indicate if strong vibrations are detected or not + VIBRATION_DETECTOR = "VibrationDetector" + + # + # VolumeControl + # + # Commands: + # - setVolume(int 0-100): Set the device output volume + VOLUME_CONTROL = "VolumeControl" + + # + # WaterConsumption + # + # States: + # - core:WaterConsumptionState (float >= 0.0): Water consumption index (m^3) + WATER_CONSUMPTION = "WaterConsumption" + + # + # WaterDetector + # + # States: + # - core:WaterDetectionState (string values: 'detected', 'notDetected'): Indicate if a water leak is detected or not + WATER_DETECTOR = "WaterDetector" + + # + # WindDirection + # + # States: + # - core:WindDirectionState (int 0-360): Wind direction (0°=North, clockwise) + WIND_DIRECTION = "WindDirection" + + # + # WindSpeed + # + # States: + # - core:WindSpeedState (float >= 0.0): Wind speed (km/h) + WIND_SPEED = "WindSpeed" + + # + # WindSpeedAndDirection + # + # States: + # - core:WindDirectionState (int 0-360): Wind direction (0°=North, clockwise) + # - core:WindSpeedState (float >= 0.0): Wind speed (km/h) + WIND_SPEED_AND_DIRECTION = "WindSpeedAndDirection" + + # + # WindowContactAndVibrationSensor + # + # States: + # - core:ContactState (string values: 'open', 'closed'): Contact sensor is open or closed + # - core:VibrationState (string values: 'detected', 'notDetected'): Indicate if strong vibrations are detected or not + # + # Form factor specific: Yes + WINDOW_CONTACT_AND_VIBRATION_SENSOR = "WindowContactAndVibrationSensor" + + # + # WindowOpeningStatus + # + # States: + # - core:OpenClosedState (string values: 'open', 'closed'): Indicate if the device is open or closed + # + # Form factor specific: Yes + WINDOW_OPENING_STATUS = "WindowOpeningStatus" diff --git a/pyoverkiz/models.py b/pyoverkiz/models.py index 9159839d..dbe791aa 100644 --- a/pyoverkiz/models.py +++ b/pyoverkiz/models.py @@ -680,7 +680,7 @@ def to_payload(self) -> dict[str, object]: if self.parameters is not None: payload["parameters"] = [ p if isinstance(p, (str, int, float, bool)) else str(p) - for p in self.parameters # type: ignore[arg-type] + for p in self.parameters ] return payload @@ -1209,3 +1209,171 @@ def __init__( self.parameters = ( [OptionParameter(**p) for p in parameters] if parameters else [] ) + + +@define(init=False, kw_only=True) +class ProtocolType: + """Protocol type definition from the reference API.""" + + id: int + prefix: str + name: str + label: str + + def __init__(self, id: int, prefix: str, name: str, label: str, **_: Any): + """Initialize ProtocolType from API data.""" + self.id = id + self.prefix = prefix + self.name = name + self.label = label + + +@define(init=False, kw_only=True) +class ValuePrototype: + """Value prototype defining parameter/state value constraints.""" + + type: str + min_value: int | float | None = None + max_value: int | float | None = None + enum_values: list[str] | None = None + description: str | None = None + + def __init__( + self, + type: str, + min_value: int | float | None = None, + max_value: int | float | None = None, + enum_values: list[str] | None = None, + description: str | None = None, + **_: Any, + ): + """Initialize ValuePrototype from API data.""" + self.type = type + self.min_value = min_value + self.max_value = max_value + self.enum_values = enum_values + self.description = description + + +@define(init=False, kw_only=True) +class CommandParameter: + """Command parameter definition.""" + + optional: bool + sensitive: bool + value_prototypes: list[ValuePrototype] + + def __init__( + self, + optional: bool, + sensitive: bool, + value_prototypes: list[dict] | None = None, + **_: Any, + ): + """Initialize CommandParameter from API data.""" + self.optional = optional + self.sensitive = sensitive + self.value_prototypes = ( + [ValuePrototype(**vp) for vp in value_prototypes] + if value_prototypes + else [] + ) + + +@define(init=False, kw_only=True) +class CommandPrototype: + """Command prototype defining parameters.""" + + parameters: list[CommandParameter] + + def __init__(self, parameters: list[dict] | None = None, **_: Any): + """Initialize CommandPrototype from API data.""" + self.parameters = ( + [CommandParameter(**p) for p in parameters] if parameters else [] + ) + + +@define(init=False, kw_only=True) +class UIProfileCommand: + """UI profile command definition.""" + + name: str + prototype: CommandPrototype | None = None + description: str | None = None + + def __init__( + self, + name: str, + prototype: dict | None = None, + description: str | None = None, + **_: Any, + ): + """Initialize UIProfileCommand from API data.""" + self.name = name + self.prototype = CommandPrototype(**prototype) if prototype else None + self.description = description + + +@define(init=False, kw_only=True) +class StatePrototype: + """State prototype defining value constraints.""" + + value_prototypes: list[ValuePrototype] + + def __init__(self, value_prototypes: list[dict] | None = None, **_: Any): + """Initialize StatePrototype from API data.""" + self.value_prototypes = ( + [ValuePrototype(**vp) for vp in value_prototypes] + if value_prototypes + else [] + ) + + +@define(init=False, kw_only=True) +class UIProfileState: + """UI profile state definition.""" + + name: str + prototype: StatePrototype | None = None + description: str | None = None + + def __init__( + self, + name: str, + prototype: dict | None = None, + description: str | None = None, + **_: Any, + ): + """Initialize UIProfileState from API data.""" + self.name = name + self.prototype = StatePrototype(**prototype) if prototype else None + self.description = description + + +@define(init=False, kw_only=True) +class UIProfileDefinition: + """UI profile definition from the reference API. + + Describes device capabilities through available commands and states. + """ + + name: str + commands: list[UIProfileCommand] + states: list[UIProfileState] + form_factor: bool + + def __init__( + self, + name: str, + commands: list[dict] | None = None, + states: list[dict] | None = None, + form_factor: bool = False, + **_: Any, + ): + """Initialize UIProfileDefinition from API data.""" + self.name = name + self.commands = ( + [UIProfileCommand(**cmd) for cmd in commands] if commands else [] + ) + self.states = [UIProfileState(**s) for s in states] if states else [] + self.form_factor = form_factor diff --git a/pyoverkiz/utils.py b/pyoverkiz/utils.py index 6c28cdd3..23313ed9 100644 --- a/pyoverkiz/utils.py +++ b/pyoverkiz/utils.py @@ -37,6 +37,7 @@ def create_server_config( configuration_url: str | None = None, ) -> ServerConfig: """Generate server configuration with the provided endpoint and metadata.""" + # ServerConfig.__init__ accepts str | enum types and converts them internally return ServerConfig( server=server, # type: ignore[arg-type] name=name, diff --git a/tests/test_ui_profile.py b/tests/test_ui_profile.py new file mode 100644 index 00000000..df88bc72 --- /dev/null +++ b/tests/test_ui_profile.py @@ -0,0 +1,146 @@ +"""Tests for UIProfileDefinition models.""" + +from pyoverkiz.models import ( + CommandParameter, + UIProfileCommand, + UIProfileDefinition, + UIProfileState, + ValuePrototype, +) + + +def test_value_prototype_with_range(): + """Test ValuePrototype with min/max range.""" + vp = ValuePrototype(type="INT", min_value=0, max_value=100) + assert vp.type == "INT" + assert vp.min_value == 0 + assert vp.max_value == 100 + assert vp.enum_values is None + + +def test_value_prototype_with_enum(): + """Test ValuePrototype with enum values.""" + vp = ValuePrototype( + type="STRING", enum_values=["low", "high"], description="Fan speed mode" + ) + assert vp.type == "STRING" + assert vp.enum_values == ["low", "high"] + assert vp.description == "Fan speed mode" + + +def test_command_parameter(): + """Test CommandParameter with value prototypes.""" + param = CommandParameter( + optional=False, + sensitive=False, + value_prototypes=[{"type": "INT", "min_value": 0, "max_value": 100}], + ) + assert param.optional is False + assert param.sensitive is False + assert len(param.value_prototypes) == 1 + assert param.value_prototypes[0].type == "INT" + + +def test_ui_profile_command(): + """Test UIProfileCommand with prototype.""" + cmd = UIProfileCommand( + name="setFanSpeedLevel", + prototype={ + "parameters": [ + { + "optional": False, + "sensitive": False, + "value_prototypes": [ + {"type": "INT", "min_value": 0, "max_value": 100} + ], + } + ] + }, + description="Set the device fan speed level", + ) + assert cmd.name == "setFanSpeedLevel" + assert cmd.description == "Set the device fan speed level" + assert cmd.prototype is not None + assert len(cmd.prototype.parameters) == 1 + + +def test_ui_profile_state(): + """Test UIProfileState with prototype.""" + state = UIProfileState( + name="core:TemperatureState", + prototype={ + "value_prototypes": [ + {"type": "FLOAT", "min_value": -100.0, "max_value": 100.0} + ] + }, + description="Current room temperature", + ) + assert state.name == "core:TemperatureState" + assert state.description == "Current room temperature" + assert state.prototype is not None + assert len(state.prototype.value_prototypes) == 1 + + +def test_ui_profile_definition(): + """Test complete UIProfileDefinition.""" + profile = UIProfileDefinition( + name="AirFan", + commands=[ + { + "name": "setFanSpeedLevel", + "prototype": { + "parameters": [ + { + "optional": False, + "sensitive": False, + "value_prototypes": [ + {"type": "INT", "min_value": 0, "max_value": 100} + ], + } + ] + }, + "description": "Set fan speed", + } + ], + states=[ + { + "name": "core:FanSpeedState", + "prototype": { + "value_prototypes": [ + {"type": "INT", "min_value": 0, "max_value": 100} + ] + }, + "description": "Current fan speed", + } + ], + form_factor=False, + ) + + assert profile.name == "AirFan" + assert len(profile.commands) == 1 + assert len(profile.states) == 1 + assert profile.form_factor is False + + # Verify command structure + cmd = profile.commands[0] + assert cmd.name == "setFanSpeedLevel" + assert cmd.description == "Set fan speed" + assert cmd.prototype is not None + assert len(cmd.prototype.parameters) == 1 + + # Verify state structure + state = profile.states[0] + assert state.name == "core:FanSpeedState" + assert state.description == "Current fan speed" + assert state.prototype is not None + assert len(state.prototype.value_prototypes) == 1 + + +def test_ui_profile_definition_minimal(): + """Test UIProfileDefinition with minimal data.""" + profile = UIProfileDefinition(name="MinimalProfile") + + assert profile.name == "MinimalProfile" + assert profile.commands == [] + assert profile.states == [] + assert profile.form_factor is False diff --git a/utils/generate_enums.py b/utils/generate_enums.py new file mode 100644 index 00000000..fe768d94 --- /dev/null +++ b/utils/generate_enums.py @@ -0,0 +1,695 @@ +"""Generate enum files from the Overkiz API reference data.""" + +# ruff: noqa: T201 + +from __future__ import annotations + +import asyncio +import os +import re +from pathlib import Path +from typing import cast + +from pyoverkiz.auth.credentials import UsernamePasswordCredentials +from pyoverkiz.client import OverkizClient +from pyoverkiz.enums import Server +from pyoverkiz.exceptions import OverkizException +from pyoverkiz.models import UIProfileDefinition, ValuePrototype + +# Hardcoded protocols that may not be available on all servers +# Format: (name, prefix) +ADDITIONAL_PROTOCOLS = [ + ("HLRR_WIFI", "hlrrwifi"), + ("MODBUSLINK", "modbuslink"), + ("RTN", "rtn"), +] + +# Hardcoded widgets that may not be available on all servers +# Format: (enum_name, value) +ADDITIONAL_WIDGETS = [ + ("ALARM_PANEL_CONTROLLER", "AlarmPanelController"), + ("CYCLIC_GARAGE_DOOR", "CyclicGarageDoor"), + ("CYCLIC_SWINGING_GATE_OPENER", "CyclicSwingingGateOpener"), + ("DISCRETE_GATE_WITH_PEDESTRIAN_POSITION", "DiscreteGateWithPedestrianPosition"), + ("HLRR_WIFI_BRIDGE", "HLRRWifiBridge"), + ("NODE", "Node"), +] + + +async def generate_protocol_enum() -> None: + """Generate the Protocol enum from the Overkiz API.""" + username = os.environ["OVERKIZ_USERNAME"] + password = os.environ["OVERKIZ_PASSWORD"] + + async with OverkizClient( + server=Server.SOMFY_EUROPE, + credentials=UsernamePasswordCredentials(username, password), + ) as client: + await client.login() + + protocol_types = await client.get_reference_protocol_types() + + # Build list of protocol entries (name, prefix, id, label) + protocols: list[tuple[str, str, int | None, str | None]] = [ + (p.name, p.prefix, p.id, p.label) for p in protocol_types + ] + + # Add hardcoded protocols that may not be on all servers (avoid duplicates) + fetched_prefixes = {p.prefix for p in protocol_types} + for name, prefix in ADDITIONAL_PROTOCOLS: + if prefix not in fetched_prefixes: + protocols.append((name, prefix, None, None)) + + # Sort by name for consistent output + protocols.sort(key=lambda p: p[0]) + + # Generate the enum file content + lines = [ + '"""Protocol enums describe device URL schemes used by Overkiz.', + "", + "THIS FILE IS AUTO-GENERATED. DO NOT EDIT MANUALLY.", + "Run `uv run utils/generate_enums.py` to regenerate.", + '"""', + "", + "from enum import StrEnum, unique", + "", + "from pyoverkiz.enums.base import UnknownEnumMixin", + "", + "", + "@unique", + "class Protocol(UnknownEnumMixin, StrEnum):", + ' """Protocol used by Overkiz.', + "", + " Values have been retrieved from /reference/protocolTypes", + ' """', + "", + ' UNKNOWN = "unknown"', + "", + ] + + # Add each protocol as an enum value with label comment + for name, prefix, protocol_id, label in protocols: + if protocol_id is not None: + lines.append(f' {name} = "{prefix}" # {protocol_id}: {label}') + else: + lines.append(f' {name} = "{prefix}"') + + lines.append("") # End with newline + + # Write to the protocol.py file + output_path = ( + Path(__file__).parent.parent / "pyoverkiz" / "enums" / "protocol.py" + ) + output_path.write_text("\n".join(lines)) + + fetched_count = len(protocol_types) + additional_count = len( + [p for p in ADDITIONAL_PROTOCOLS if p[1] not in fetched_prefixes] + ) + + print(f"✓ Generated {output_path}") + print(f"✓ Added {fetched_count} protocols from API") + print(f"✓ Added {additional_count} additional hardcoded protocols") + print(f"✓ Total: {len(protocols)} protocols") + + +async def generate_ui_enums() -> None: + """Generate the UIClass and UIWidget enums from the Overkiz API.""" + username = os.environ["OVERKIZ_USERNAME"] + password = os.environ["OVERKIZ_PASSWORD"] + + async with OverkizClient( + server=Server.SOMFY_EUROPE, + credentials=UsernamePasswordCredentials(username, password), + ) as client: + await client.login() + + ui_classes = cast(list[str], await client.get_reference_ui_classes()) + ui_widgets = cast(list[str], await client.get_reference_ui_widgets()) + + # Convert camelCase to SCREAMING_SNAKE_CASE for enum names + def to_enum_name(value: str) -> str: + # Handle special cases first + name = value.replace("ZWave", "ZWAVE_") + name = name.replace("OTherm", "OTHERM_") + + # Insert underscore before uppercase letters + name = re.sub(r"([A-Z]+)([A-Z][a-z])", r"\1_\2", name) + name = re.sub(r"([a-z\d])([A-Z])", r"\1_\2", name) + + # Fix specific cases after general conversion + name = name.replace("APCDHW", "APC_DHW") + + # Clean up any double underscores and trailing underscores + name = re.sub(r"__+", "_", name) + name = name.rstrip("_") + + return name.upper() + + # Generate the enum file content + lines = [ + '"""UI enums for classes and widgets used to interpret device UI metadata.', + "", + "THIS FILE IS AUTO-GENERATED. DO NOT EDIT MANUALLY.", + "Run `uv run utils/generate_enums.py` to regenerate.", + '"""', + "", + "# ruff: noqa: S105", + '# Enum values contain "PASS" in API names (e.g. PassAPC), not passwords', + "", + "from enum import StrEnum, unique", + "", + "from pyoverkiz.enums.base import UnknownEnumMixin", + "", + "", + "@unique", + "class UIClass(UnknownEnumMixin, StrEnum):", + ' """Enumeration of UI classes used to describe device categories and behaviors."""', + "", + ' UNKNOWN = "Unknown"', + "", + ] + + # Add UI classes + sorted_classes = sorted(ui_classes) + for ui_class in sorted_classes: + enum_name = to_enum_name(ui_class) + lines.append(f' {enum_name} = "{ui_class}"') + + lines.append("") + lines.append("") + lines.append("@unique") + lines.append("class UIWidget(UnknownEnumMixin, StrEnum):") + lines.append( + ' """Enumeration of UI widgets used by Overkiz for device presentation."""' + ) + lines.append("") + lines.append(' UNKNOWN = "Unknown"') + lines.append("") + + # Add UI widgets + sorted_widgets = sorted(ui_widgets) + + # Add hardcoded widgets that may not be on all servers (avoid duplicates) + fetched_widget_values = set(ui_widgets) + for _enum_name, widget_value in ADDITIONAL_WIDGETS: + if widget_value not in fetched_widget_values: + sorted_widgets.append(widget_value) + + sorted_widgets = sorted(sorted_widgets) + + for ui_widget in sorted_widgets: + enum_name = to_enum_name(ui_widget) + lines.append(f' {enum_name} = "{ui_widget}"') + + lines.append("") # End with newline + + # Fetch and add UI classifiers + ui_classifiers = cast(list[str], await client.get_reference_ui_classifiers()) + + lines.append("") + lines.append("@unique") + lines.append("class UIClassifier(UnknownEnumMixin, StrEnum):") + lines.append( + ' """Enumeration of UI classifiers used to categorize device types."""' + ) + lines.append("") + lines.append(' UNKNOWN = "unknown"') + lines.append("") + + # Add UI classifiers + sorted_classifiers = sorted(ui_classifiers) + for ui_classifier in sorted_classifiers: + enum_name = to_enum_name(ui_classifier) + lines.append(f' {enum_name} = "{ui_classifier}"') + + lines.append("") # End with newline + + # Write to the ui.py file + output_path = Path(__file__).parent.parent / "pyoverkiz" / "enums" / "ui.py" + output_path.write_text("\n".join(lines)) + + additional_widget_count = len( + [w for w in ADDITIONAL_WIDGETS if w[1] not in fetched_widget_values] + ) + + print(f"✓ Generated {output_path}") + print(f"✓ Added {len(ui_classes)} UI classes") + print(f"✓ Added {len(ui_widgets)} UI widgets from API") + print(f"✓ Added {additional_widget_count} additional hardcoded UI widgets") + print(f"✓ Total: {len(sorted_widgets)} UI widgets") + print(f"✓ Added {len(sorted_classifiers)} UI classifiers") + + +async def generate_ui_profiles() -> None: + """Generate the UIProfile enum from the Overkiz API.""" + username = os.environ["OVERKIZ_USERNAME"] + password = os.environ["OVERKIZ_PASSWORD"] + + async with OverkizClient( + server=Server.SOMFY_EUROPE, + credentials=UsernamePasswordCredentials(username, password), + ) as client: + await client.login() + + ui_profile_names = await client.get_reference_ui_profile_names() + + # Fetch details for all profiles + profiles_with_details: list[tuple[str, UIProfileDefinition | None]] = [] + + for profile_name in ui_profile_names: + print(f"Fetching {profile_name}...") + try: + details = await client.get_reference_ui_profile(profile_name) + profiles_with_details.append((profile_name, details)) + except OverkizException: + print(f" ! Could not fetch details for {profile_name}") + profiles_with_details.append((profile_name, None)) + + # Convert camelCase to SCREAMING_SNAKE_CASE for enum names + def to_enum_name(value: str) -> str: + # Insert underscore before uppercase letters + name = re.sub(r"([A-Z]+)([A-Z][a-z])", r"\1_\2", value) + name = re.sub(r"([a-z\d])([A-Z])", r"\1_\2", name) + + # Clean up any double underscores + name = re.sub(r"__+", "_", name) + + return name.upper() + + def format_value_prototype(vp: ValuePrototype) -> str: + """Format a value prototype into a readable string.""" + type_str = vp.type.lower() + parts = [type_str] + + if vp.min_value is not None and vp.max_value is not None: + parts.append(f"{vp.min_value}-{vp.max_value}") + elif vp.min_value is not None: + parts.append(f">= {vp.min_value}") + elif vp.max_value is not None: + parts.append(f"<= {vp.max_value}") + + if vp.enum_values: + enum_vals = ", ".join(f"'{v}'" for v in vp.enum_values) + parts.append(f"values: {enum_vals}") + + return " ".join(parts) + + def clean_description(desc: str) -> str: + """Clean description text to fit in a single-line comment.""" + # Remove newlines and excessive whitespace + cleaned = " ".join(desc.split()) + return cleaned.strip() + + # Generate the enum file content + lines = [ + '"""UI Profile enums describe device capabilities through commands and states.', + "", + "THIS FILE IS AUTO-GENERATED. DO NOT EDIT MANUALLY.", + "Run `uv run utils/generate_enums.py` to regenerate.", + '"""', + "", + "from enum import StrEnum, unique", + "", + "from pyoverkiz.enums.base import UnknownEnumMixin", + "", + "", + "@unique", + "class UIProfile(UnknownEnumMixin, StrEnum):", + ' """', + " UI Profiles define device capabilities through commands and states.", + " ", + " Each profile describes what a device can do (commands) and what information", + " it provides (states). Form factor indicates if the profile is tied to a", + " specific physical device type.", + ' """', + "", + ' UNKNOWN = "Unknown"', + "", + ] + + # Sort profiles by name for consistent output + profiles_with_details.sort(key=lambda p: p[0]) + + # Add each profile with detailed comments + for profile_name, details_obj in profiles_with_details: + enum_name = to_enum_name(profile_name) + + if details_obj is None: + # No details available + lines.append(f" # {profile_name} (details unavailable)") + lines.append(f' {enum_name} = "{profile_name}"') + lines.append("") + continue + + # Build multi-line comment + comment_lines = [] + + # Add commands if present + if details_obj.commands: + comment_lines.append("Commands:") + for cmd in details_obj.commands: + cmd_name = cmd.name + desc = clean_description(cmd.description or "") + + # Get parameter info + if cmd.prototype and cmd.prototype.parameters: + param_strs = [] + for param in cmd.prototype.parameters: + if param.value_prototypes: + param_strs.append( + format_value_prototype(param.value_prototypes[0]) + ) + param_info = ( + f"({', '.join(param_strs)})" if param_strs else "()" + ) + else: + param_info = "()" + + if desc: + comment_lines.append(f" - {cmd_name}{param_info}: {desc}") + else: + comment_lines.append(f" - {cmd_name}{param_info}") + + # Add states if present + if details_obj.states: + if comment_lines: + comment_lines.append("") + comment_lines.append("States:") + for state in details_obj.states: + state_name = state.name + desc = clean_description(state.description or "") + + # Get value prototype info + if state.prototype and state.prototype.value_prototypes: + type_info = f" ({format_value_prototype(state.prototype.value_prototypes[0])})" + else: + type_info = "" + + if desc: + comment_lines.append(f" - {state_name}{type_info}: {desc}") + else: + comment_lines.append(f" - {state_name}{type_info}") + + # Add form factor info + if details_obj.form_factor: + if comment_lines: + comment_lines.append("") + comment_lines.append("Form factor specific: Yes") + + # If we have any details, add the comment block + if comment_lines: + lines.append(" #") + lines.append(f" # {profile_name}") + lines.append(" #") + for comment_line in comment_lines: + if comment_line: + lines.append(f" # {comment_line}") + else: + lines.append(" #") + else: + # Simple single-line comment + lines.append(f" # {profile_name}") + + lines.append(f' {enum_name} = "{profile_name}"') + lines.append("") + + # Write to the ui_profile.py file + output_path = ( + Path(__file__).parent.parent / "pyoverkiz" / "enums" / "ui_profile.py" + ) + output_path.write_text("\n".join(lines)) + + print(f"\n✓ Generated {output_path}") + print(f"✓ Added {len(profiles_with_details)} UI profiles") + print( + f"✓ Profiles with details: {sum(1 for _, d in profiles_with_details if d is not None)}" + ) + print( + f"✓ Profiles without details: {sum(1 for _, d in profiles_with_details if d is None)}" + ) + + +def extract_commands_from_fixtures(fixtures_dir: Path) -> set[str]: + """Extract all commands from fixture files in the given directory. + + Reads all JSON fixture files and collects unique command names from device + definitions. Commands are returned as camelCase values. + """ + import json + + commands: set[str] = set() + + for fixture_file in fixtures_dir.glob("*.json"): + try: + data = json.loads(fixture_file.read_text()) + if "devices" not in data: + continue + + for device in data["devices"]: + if "definition" not in device: + continue + + definition = device["definition"] + if "commands" not in definition: + continue + + for command in definition["commands"]: + if "commandName" in command: + commands.add(command["commandName"]) + except (json.JSONDecodeError, KeyError, TypeError): + # Skip files that can't be parsed or have unexpected structure + continue + + return commands + + +def extract_state_values_from_fixtures(fixtures_dir: Path) -> set[str]: + """Extract all state values from fixture files in the given directory. + + Reads all JSON fixture files and collects unique state values from device + definitions. Values are extracted from DiscreteState types. + """ + import json + + values: set[str] = set() + + for fixture_file in fixtures_dir.glob("*.json"): + try: + data = json.loads(fixture_file.read_text()) + if "devices" not in data: + continue + + for device in data["devices"]: + if "definition" not in device: + continue + + definition = device["definition"] + if "states" not in definition: + continue + + for state in definition["states"]: + # Extract values from DiscreteState + if state.get("type") == "DiscreteState" and "values" in state: + for value in state["values"]: + if isinstance(value, str): + values.add(value) + except (json.JSONDecodeError, KeyError, TypeError): + # Skip files that can't be parsed or have unexpected structure + continue + + return values + + +def command_to_enum_name(command_name: str) -> str: + """Convert a command name (camelCase) to an ENUM_NAME (SCREAMING_SNAKE_CASE). + + Example: "setTargetTemperature" -> "SET_TARGET_TEMPERATURE" + Spaces are converted to underscores: "long peak" -> "LONG_PEAK" + """ + # First, replace spaces with underscores + name = command_name.replace(" ", "_") + # Insert underscore before uppercase letters + name = re.sub(r"([a-z\d])([A-Z])", r"\1_\2", name) + return name.upper() + + +async def generate_command_enums() -> None: + """Generate the OverkizCommand enum and update OverkizCommandParam from fixture files.""" + fixtures_dir = Path(__file__).parent.parent / "tests" / "fixtures" / "setup" + + # Extract commands and state values from fixtures + fixture_commands = extract_commands_from_fixtures(fixtures_dir) + fixture_state_values = extract_state_values_from_fixtures(fixtures_dir) + + # Read existing commands from the command.py file + command_file = Path(__file__).parent.parent / "pyoverkiz" / "enums" / "command.py" + content = command_file.read_text() + + # Find the OverkizCommandParam class + param_class_start_idx = content.find("@unique\nclass OverkizCommandParam") + command_mode_class_start_idx = content.find("@unique\nclass CommandMode") + + # Parse existing commands from OverkizCommand + existing_commands: dict[str, str] = {} + in_overkiz_command = False + lines_before_param = content[:param_class_start_idx].split("\n") + + for line in lines_before_param: + if "class OverkizCommand" in line: + in_overkiz_command = True + continue + if in_overkiz_command and line.strip() and not line.startswith(" "): + break + if in_overkiz_command and " = " in line and not line.strip().startswith("#"): + parts = line.strip().split(" = ") + if len(parts) == 2: + enum_name = parts[0].strip() + value_part = parts[1].split("#")[0].strip() + if value_part.startswith('"') and value_part.endswith('"'): + command_value = value_part[1:-1] + existing_commands[command_value] = enum_name + + # Parse existing parameters from OverkizCommandParam + existing_params: dict[str, str] = {} + in_param_class = False + lines_param_section = content[ + param_class_start_idx:command_mode_class_start_idx + ].split("\n") + + for line in lines_param_section: + if "class OverkizCommandParam" in line: + in_param_class = True + continue + if in_param_class and line.strip() and not line.startswith(" "): + break + if in_param_class and " = " in line and not line.strip().startswith("#"): + parts = line.strip().split(" = ") + if len(parts) == 2: + enum_name = parts[0].strip() + value_part = parts[1].split("#")[0].strip() + if value_part.startswith('"') and value_part.endswith('"'): + param_value = value_part[1:-1] + existing_params[param_value] = enum_name + + # Merge: keep existing commands and add new ones from fixtures + all_command_values = set(existing_commands.keys()) | fixture_commands + + # Convert to list of tuples for commands: (enum_name, command_value) + # Track enum names to detect duplicates + command_enum_names: set[str] = set() + command_tuples: list[tuple[str, str]] = [] + for cmd_value in sorted(all_command_values): + if cmd_value in existing_commands: + enum_name = existing_commands[cmd_value] + else: + enum_name = command_to_enum_name(cmd_value) + + # Skip if this enum_name already exists (avoid duplicates) + if enum_name not in command_enum_names: + command_tuples.append((enum_name, cmd_value)) + command_enum_names.add(enum_name) + + # Sort alphabetically by enum name + command_tuples.sort(key=lambda x: x[0]) + + # Merge: keep existing params and add new ones from fixture state values + all_param_values = set(existing_params.keys()) | fixture_state_values + + # Convert to list of tuples for params: (enum_name, param_value) + # Track enum names to detect duplicates + param_enum_names: set[str] = set() + param_tuples: list[tuple[str, str]] = [] + for param_value in sorted(all_param_values): + if param_value in existing_params: + enum_name = existing_params[param_value] + else: + enum_name = command_to_enum_name(param_value) + + # Skip if this enum_name already exists (avoid duplicates) + if enum_name not in param_enum_names: + param_tuples.append((enum_name, param_value)) + param_enum_names.add(enum_name) + + # Sort alphabetically by enum name + param_tuples.sort(key=lambda x: x[0]) + + # Sort alphabetically by enum name + param_tuples.sort(key=lambda x: x[0]) + + # Generate the enum file content + lines = [ + '"""Command-related enums and parameters used by device commands."""', + "", + "# ruff: noqa: S105", + '# Enum values contain "PASS" in API names (e.g. PassAPC), not passwords', + "", + "from enum import StrEnum, unique", + "", + "", + "@unique", + "class OverkizCommand(StrEnum):", + ' """Device commands used by Overkiz."""', + "", + ] + + # Add each command + for enum_name, cmd_value in command_tuples: + if " " in cmd_value: + lines.append(f' {enum_name} = "{cmd_value}" # value with space') + else: + lines.append(f' {enum_name} = "{cmd_value}"') + + lines.append("") + lines.append("") + lines.append("@unique") + lines.append("class OverkizCommandParam(StrEnum):") + lines.append(' """Parameter used by Overkiz commands and/or states."""') + lines.append("") + + # Add each param + for enum_name, param_value in param_tuples: + if " " in param_value: + lines.append(f' {enum_name} = "{param_value}" # value with space') + else: + lines.append(f' {enum_name} = "{param_value}"') + + lines.append("") + lines.append("") + + # Append CommandMode class + command_mode_start = content.find("@unique\nclass CommandMode") + if command_mode_start != -1: + lines.append(content[command_mode_start:].rstrip()) + lines.append("") + + # Write to the command.py file + command_file.write_text("\n".join(lines)) + + print(f"✓ Generated {command_file}") + print(f"✓ Added {len(existing_commands)} existing commands") + print(f"✓ Found {len(fixture_commands)} total commands in fixtures") + new_commands_count = len(fixture_commands - set(existing_commands.keys())) + print(f"✓ Added {new_commands_count} new commands from fixtures") + print(f"✓ Total: {len(all_command_values)} commands") + print() + print(f"✓ Added {len(existing_params)} existing parameters") + print(f"✓ Found {len(fixture_state_values)} total state values in fixtures") + new_params_count = len(fixture_state_values - set(existing_params.keys())) + print(f"✓ Added {new_params_count} new parameters from fixtures") + print(f"✓ Total: {len(all_param_values)} parameters") + + +async def generate_all() -> None: + """Generate all enums from the Overkiz API.""" + await generate_protocol_enum() + print() + await generate_ui_enums() + print() + await generate_ui_profiles() + print() + await generate_command_enums() + + +if __name__ == "__main__": + asyncio.run(generate_all()) diff --git a/uv.lock b/uv.lock index ed1d047f..1c2bda23 100644 --- a/uv.lock +++ b/uv.lock @@ -120,11 +120,11 @@ wheels = [ [[package]] name = "babel" -version = "2.17.0" +version = "2.18.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554, upload-time = "2026-02-01T12:30:56.078Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, + { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, ] [[package]] @@ -152,30 +152,30 @@ wheels = [ [[package]] name = "boto3" -version = "1.42.39" +version = "1.42.49" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "botocore" }, { name = "jmespath" }, { name = "s3transfer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b8/ea/b96c77da49fed28744ee0347374d8223994a2b8570e76e8380a4064a8c4a/boto3-1.42.39.tar.gz", hash = "sha256:d03f82363314759eff7f84a27b9e6428125f89d8119e4588e8c2c1d79892c956", size = 112783, upload-time = "2026-01-30T20:38:31.226Z" } +sdist = { url = "https://files.pythonhosted.org/packages/20/91/105aa17e0f3a566d33e2d8a3b32a70f553b1ad500d9756c6dd63991d8354/boto3-1.42.49.tar.gz", hash = "sha256:9cd252f640567b86e92b0a8ffdd4ade9a3018ee357c724bff6a21b8c8a41be0c", size = 112877, upload-time = "2026-02-13T20:29:57.062Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b2/c4/3493b5c86e32d6dd558b30d16b55503e24a6e6cd7115714bc102b247d26e/boto3-1.42.39-py3-none-any.whl", hash = "sha256:d9d6ce11df309707b490d2f5f785b761cfddfd6d1f665385b78c9d8ed097184b", size = 140606, upload-time = "2026-01-30T20:38:28.635Z" }, + { url = "https://files.pythonhosted.org/packages/12/b1/1fa30cd7b26617d59efbe3a4f3660a5b8b397a4623bf1e67016c4cb6dd0e/boto3-1.42.49-py3-none-any.whl", hash = "sha256:99e1df4361c3f6ff6ade65803c043ea96314826134962dd3b385433b309eb819", size = 140606, upload-time = "2026-02-13T20:29:55.366Z" }, ] [[package]] name = "botocore" -version = "1.42.39" +version = "1.42.49" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jmespath" }, { name = "python-dateutil" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ac/a6/3a34d1b74effc0f759f5ff4e91c77729d932bc34dd3207905e9ecbba1103/botocore-1.42.39.tar.gz", hash = "sha256:0f00355050821e91a5fe6d932f7bf220f337249b752899e3e4cf6ed54326249e", size = 14914927, upload-time = "2026-01-30T20:38:19.265Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c5/95/c3a3765ab65073695161e7180d631428cb6e67c18d97e8897871dfe51fcc/botocore-1.42.49.tar.gz", hash = "sha256:333115a64a507697b0c450ade7e2d82bc8b4e21c0051542514532b455712bdcc", size = 14958380, upload-time = "2026-02-13T20:29:47.218Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/71/9a2c88abb5fe47b46168b262254d5b5d635de371eba4bd01ea5c8c109575/botocore-1.42.39-py3-none-any.whl", hash = "sha256:9e0d0fed9226449cc26fcf2bbffc0392ac698dd8378e8395ce54f3ec13f81d58", size = 14591958, upload-time = "2026-01-30T20:38:14.814Z" }, + { url = "https://files.pythonhosted.org/packages/d6/cd/7e7ceeff26889d1fd923f069381e3b2b85ff6d46c6fd1409ed8f486cc06f/botocore-1.42.49-py3-none-any.whl", hash = "sha256:1c33544f72101eed4ccf903ebb667a803e14e25b2af4e0836e4b871da1c0af37", size = 14630510, upload-time = "2026-02-13T20:29:43.086Z" }, ] [[package]] @@ -267,76 +267,86 @@ wheels = [ [[package]] name = "coverage" -version = "7.13.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ad/49/349848445b0e53660e258acbcc9b0d014895b6739237920886672240f84b/coverage-7.13.2.tar.gz", hash = "sha256:044c6951ec37146b72a50cc81ef02217d27d4c3640efd2640311393cbbf143d3", size = 826523, upload-time = "2026-01-25T13:00:04.889Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/46/39/e92a35f7800222d3f7b2cbb7bbc3b65672ae8d501cb31801b2d2bd7acdf1/coverage-7.13.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f106b2af193f965d0d3234f3f83fc35278c7fb935dfbde56ae2da3dd2c03b84d", size = 219142, upload-time = "2026-01-25T12:58:00.448Z" }, - { url = "https://files.pythonhosted.org/packages/45/7a/8bf9e9309c4c996e65c52a7c5a112707ecdd9fbaf49e10b5a705a402bbb4/coverage-7.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78f45d21dc4d5d6bd29323f0320089ef7eae16e4bef712dff79d184fa7330af3", size = 219503, upload-time = "2026-01-25T12:58:02.451Z" }, - { url = "https://files.pythonhosted.org/packages/87/93/17661e06b7b37580923f3f12406ac91d78aeed293fb6da0b69cc7957582f/coverage-7.13.2-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:fae91dfecd816444c74531a9c3d6ded17a504767e97aa674d44f638107265b99", size = 251006, upload-time = "2026-01-25T12:58:04.059Z" }, - { url = "https://files.pythonhosted.org/packages/12/f0/f9e59fb8c310171497f379e25db060abef9fa605e09d63157eebec102676/coverage-7.13.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:264657171406c114787b441484de620e03d8f7202f113d62fcd3d9688baa3e6f", size = 253750, upload-time = "2026-01-25T12:58:05.574Z" }, - { url = "https://files.pythonhosted.org/packages/e5/b1/1935e31add2232663cf7edd8269548b122a7d100047ff93475dbaaae673e/coverage-7.13.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ae47d8dcd3ded0155afbb59c62bd8ab07ea0fd4902e1c40567439e6db9dcaf2f", size = 254862, upload-time = "2026-01-25T12:58:07.647Z" }, - { url = "https://files.pythonhosted.org/packages/af/59/b5e97071ec13df5f45da2b3391b6cdbec78ba20757bc92580a5b3d5fa53c/coverage-7.13.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8a0b33e9fd838220b007ce8f299114d406c1e8edb21336af4c97a26ecfd185aa", size = 251420, upload-time = "2026-01-25T12:58:09.309Z" }, - { url = "https://files.pythonhosted.org/packages/3f/75/9495932f87469d013dc515fb0ce1aac5fa97766f38f6b1a1deb1ee7b7f3a/coverage-7.13.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b3becbea7f3ce9a2d4d430f223ec15888e4deb31395840a79e916368d6004cce", size = 252786, upload-time = "2026-01-25T12:58:10.909Z" }, - { url = "https://files.pythonhosted.org/packages/6a/59/af550721f0eb62f46f7b8cb7e6f1860592189267b1c411a4e3a057caacee/coverage-7.13.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f819c727a6e6eeb8711e4ce63d78c620f69630a2e9d53bc95ca5379f57b6ba94", size = 250928, upload-time = "2026-01-25T12:58:12.449Z" }, - { url = "https://files.pythonhosted.org/packages/9b/b1/21b4445709aae500be4ab43bbcfb4e53dc0811c3396dcb11bf9f23fd0226/coverage-7.13.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:4f7b71757a3ab19f7ba286e04c181004c1d61be921795ee8ba6970fd0ec91da5", size = 250496, upload-time = "2026-01-25T12:58:14.047Z" }, - { url = "https://files.pythonhosted.org/packages/ba/b1/0f5d89dfe0392990e4f3980adbde3eb34885bc1effb2dc369e0bf385e389/coverage-7.13.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b7fc50d2afd2e6b4f6f2f403b70103d280a8e0cb35320cbbe6debcda02a1030b", size = 252373, upload-time = "2026-01-25T12:58:15.976Z" }, - { url = "https://files.pythonhosted.org/packages/01/c9/0cf1a6a57a9968cc049a6b896693faa523c638a5314b1fc374eb2b2ac904/coverage-7.13.2-cp312-cp312-win32.whl", hash = "sha256:292250282cf9bcf206b543d7608bda17ca6fc151f4cbae949fc7e115112fbd41", size = 221696, upload-time = "2026-01-25T12:58:17.517Z" }, - { url = "https://files.pythonhosted.org/packages/4d/05/d7540bf983f09d32803911afed135524570f8c47bb394bf6206c1dc3a786/coverage-7.13.2-cp312-cp312-win_amd64.whl", hash = "sha256:eeea10169fac01549a7921d27a3e517194ae254b542102267bef7a93ed38c40e", size = 222504, upload-time = "2026-01-25T12:58:19.115Z" }, - { url = "https://files.pythonhosted.org/packages/15/8b/1a9f037a736ced0a12aacf6330cdaad5008081142a7070bc58b0f7930cbc/coverage-7.13.2-cp312-cp312-win_arm64.whl", hash = "sha256:2a5b567f0b635b592c917f96b9a9cb3dbd4c320d03f4bf94e9084e494f2e8894", size = 221120, upload-time = "2026-01-25T12:58:21.334Z" }, - { url = "https://files.pythonhosted.org/packages/a7/f0/3d3eac7568ab6096ff23791a526b0048a1ff3f49d0e236b2af6fb6558e88/coverage-7.13.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ed75de7d1217cf3b99365d110975f83af0528c849ef5180a12fd91b5064df9d6", size = 219168, upload-time = "2026-01-25T12:58:23.376Z" }, - { url = "https://files.pythonhosted.org/packages/a3/a6/f8b5cfeddbab95fdef4dcd682d82e5dcff7a112ced57a959f89537ee9995/coverage-7.13.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:97e596de8fa9bada4d88fde64a3f4d37f1b6131e4faa32bad7808abc79887ddc", size = 219537, upload-time = "2026-01-25T12:58:24.932Z" }, - { url = "https://files.pythonhosted.org/packages/7b/e6/8d8e6e0c516c838229d1e41cadcec91745f4b1031d4db17ce0043a0423b4/coverage-7.13.2-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:68c86173562ed4413345410c9480a8d64864ac5e54a5cda236748031e094229f", size = 250528, upload-time = "2026-01-25T12:58:26.567Z" }, - { url = "https://files.pythonhosted.org/packages/8e/78/befa6640f74092b86961f957f26504c8fba3d7da57cc2ab7407391870495/coverage-7.13.2-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7be4d613638d678b2b3773b8f687537b284d7074695a43fe2fbbfc0e31ceaed1", size = 253132, upload-time = "2026-01-25T12:58:28.251Z" }, - { url = "https://files.pythonhosted.org/packages/9d/10/1630db1edd8ce675124a2ee0f7becc603d2bb7b345c2387b4b95c6907094/coverage-7.13.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d7f63ce526a96acd0e16c4af8b50b64334239550402fb1607ce6a584a6d62ce9", size = 254374, upload-time = "2026-01-25T12:58:30.294Z" }, - { url = "https://files.pythonhosted.org/packages/ed/1d/0d9381647b1e8e6d310ac4140be9c428a0277330991e0c35bdd751e338a4/coverage-7.13.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:406821f37f864f968e29ac14c3fccae0fec9fdeba48327f0341decf4daf92d7c", size = 250762, upload-time = "2026-01-25T12:58:32.036Z" }, - { url = "https://files.pythonhosted.org/packages/43/e4/5636dfc9a7c871ee8776af83ee33b4c26bc508ad6cee1e89b6419a366582/coverage-7.13.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ee68e5a4e3e5443623406b905db447dceddffee0dceb39f4e0cd9ec2a35004b5", size = 252502, upload-time = "2026-01-25T12:58:33.961Z" }, - { url = "https://files.pythonhosted.org/packages/02/2a/7ff2884d79d420cbb2d12fed6fff727b6d0ef27253140d3cdbbd03187ee0/coverage-7.13.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2ee0e58cca0c17dd9c6c1cdde02bb705c7b3fbfa5f3b0b5afeda20d4ebff8ef4", size = 250463, upload-time = "2026-01-25T12:58:35.529Z" }, - { url = "https://files.pythonhosted.org/packages/91/c0/ba51087db645b6c7261570400fc62c89a16278763f36ba618dc8657a187b/coverage-7.13.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:6e5bbb5018bf76a56aabdb64246b5288d5ae1b7d0dd4d0534fe86df2c2992d1c", size = 250288, upload-time = "2026-01-25T12:58:37.226Z" }, - { url = "https://files.pythonhosted.org/packages/03/07/44e6f428551c4d9faf63ebcefe49b30e5c89d1be96f6a3abd86a52da9d15/coverage-7.13.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a55516c68ef3e08e134e818d5e308ffa6b1337cc8b092b69b24287bf07d38e31", size = 252063, upload-time = "2026-01-25T12:58:38.821Z" }, - { url = "https://files.pythonhosted.org/packages/c2/67/35b730ad7e1859dd57e834d1bc06080d22d2f87457d53f692fce3f24a5a9/coverage-7.13.2-cp313-cp313-win32.whl", hash = "sha256:5b20211c47a8abf4abc3319d8ce2464864fa9f30c5fcaf958a3eed92f4f1fef8", size = 221716, upload-time = "2026-01-25T12:58:40.484Z" }, - { url = "https://files.pythonhosted.org/packages/0d/82/e5fcf5a97c72f45fc14829237a6550bf49d0ab882ac90e04b12a69db76b4/coverage-7.13.2-cp313-cp313-win_amd64.whl", hash = "sha256:14f500232e521201cf031549fb1ebdfc0a40f401cf519157f76c397e586c3beb", size = 222522, upload-time = "2026-01-25T12:58:43.247Z" }, - { url = "https://files.pythonhosted.org/packages/b1/f1/25d7b2f946d239dd2d6644ca2cc060d24f97551e2af13b6c24c722ae5f97/coverage-7.13.2-cp313-cp313-win_arm64.whl", hash = "sha256:9779310cb5a9778a60c899f075a8514c89fa6d10131445c2207fc893e0b14557", size = 221145, upload-time = "2026-01-25T12:58:45Z" }, - { url = "https://files.pythonhosted.org/packages/9e/f7/080376c029c8f76fadfe43911d0daffa0cbdc9f9418a0eead70c56fb7f4b/coverage-7.13.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:e64fa5a1e41ce5df6b547cbc3d3699381c9e2c2c369c67837e716ed0f549d48e", size = 219861, upload-time = "2026-01-25T12:58:46.586Z" }, - { url = "https://files.pythonhosted.org/packages/42/11/0b5e315af5ab35f4c4a70e64d3314e4eec25eefc6dec13be3a7d5ffe8ac5/coverage-7.13.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b01899e82a04085b6561eb233fd688474f57455e8ad35cd82286463ba06332b7", size = 220207, upload-time = "2026-01-25T12:58:48.277Z" }, - { url = "https://files.pythonhosted.org/packages/b2/0c/0874d0318fb1062117acbef06a09cf8b63f3060c22265adaad24b36306b7/coverage-7.13.2-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:838943bea48be0e2768b0cf7819544cdedc1bbb2f28427eabb6eb8c9eb2285d3", size = 261504, upload-time = "2026-01-25T12:58:49.904Z" }, - { url = "https://files.pythonhosted.org/packages/83/5e/1cd72c22ecb30751e43a72f40ba50fcef1b7e93e3ea823bd9feda8e51f9a/coverage-7.13.2-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:93d1d25ec2b27e90bcfef7012992d1f5121b51161b8bffcda756a816cf13c2c3", size = 263582, upload-time = "2026-01-25T12:58:51.582Z" }, - { url = "https://files.pythonhosted.org/packages/9b/da/8acf356707c7a42df4d0657020308e23e5a07397e81492640c186268497c/coverage-7.13.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93b57142f9621b0d12349c43fc7741fe578e4bc914c1e5a54142856cfc0bf421", size = 266008, upload-time = "2026-01-25T12:58:53.234Z" }, - { url = "https://files.pythonhosted.org/packages/41/41/ea1730af99960309423c6ea8d6a4f1fa5564b2d97bd1d29dda4b42611f04/coverage-7.13.2-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f06799ae1bdfff7ccb8665d75f8291c69110ba9585253de254688aa8a1ccc6c5", size = 260762, upload-time = "2026-01-25T12:58:55.372Z" }, - { url = "https://files.pythonhosted.org/packages/22/fa/02884d2080ba71db64fdc127b311db60e01fe6ba797d9c8363725e39f4d5/coverage-7.13.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:7f9405ab4f81d490811b1d91c7a20361135a2df4c170e7f0b747a794da5b7f23", size = 263571, upload-time = "2026-01-25T12:58:57.52Z" }, - { url = "https://files.pythonhosted.org/packages/d2/6b/4083aaaeba9b3112f55ac57c2ce7001dc4d8fa3fcc228a39f09cc84ede27/coverage-7.13.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:f9ab1d5b86f8fbc97a5b3cd6280a3fd85fef3b028689d8a2c00918f0d82c728c", size = 261200, upload-time = "2026-01-25T12:58:59.255Z" }, - { url = "https://files.pythonhosted.org/packages/e9/d2/aea92fa36d61955e8c416ede9cf9bf142aa196f3aea214bb67f85235a050/coverage-7.13.2-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:f674f59712d67e841525b99e5e2b595250e39b529c3bda14764e4f625a3fa01f", size = 260095, upload-time = "2026-01-25T12:59:01.066Z" }, - { url = "https://files.pythonhosted.org/packages/0d/ae/04ffe96a80f107ea21b22b2367175c621da920063260a1c22f9452fd7866/coverage-7.13.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c6cadac7b8ace1ba9144feb1ae3cb787a6065ba6d23ffc59a934b16406c26573", size = 262284, upload-time = "2026-01-25T12:59:02.802Z" }, - { url = "https://files.pythonhosted.org/packages/1c/7a/6f354dcd7dfc41297791d6fb4e0d618acb55810bde2c1fd14b3939e05c2b/coverage-7.13.2-cp313-cp313t-win32.whl", hash = "sha256:14ae4146465f8e6e6253eba0cccd57423e598a4cb925958b240c805300918343", size = 222389, upload-time = "2026-01-25T12:59:04.563Z" }, - { url = "https://files.pythonhosted.org/packages/8d/d5/080ad292a4a3d3daf411574be0a1f56d6dee2c4fdf6b005342be9fac807f/coverage-7.13.2-cp313-cp313t-win_amd64.whl", hash = "sha256:9074896edd705a05769e3de0eac0a8388484b503b68863dd06d5e473f874fd47", size = 223450, upload-time = "2026-01-25T12:59:06.677Z" }, - { url = "https://files.pythonhosted.org/packages/88/96/df576fbacc522e9fb8d1c4b7a7fc62eb734be56e2cba1d88d2eabe08ea3f/coverage-7.13.2-cp313-cp313t-win_arm64.whl", hash = "sha256:69e526e14f3f854eda573d3cf40cffd29a1a91c684743d904c33dbdcd0e0f3e7", size = 221707, upload-time = "2026-01-25T12:59:08.363Z" }, - { url = "https://files.pythonhosted.org/packages/55/53/1da9e51a0775634b04fcc11eb25c002fc58ee4f92ce2e8512f94ac5fc5bf/coverage-7.13.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:387a825f43d680e7310e6f325b2167dd093bc8ffd933b83e9aa0983cf6e0a2ef", size = 219213, upload-time = "2026-01-25T12:59:11.909Z" }, - { url = "https://files.pythonhosted.org/packages/46/35/b3caac3ebbd10230fea5a33012b27d19e999a17c9285c4228b4b2e35b7da/coverage-7.13.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f0d7fea9d8e5d778cd5a9e8fc38308ad688f02040e883cdc13311ef2748cb40f", size = 219549, upload-time = "2026-01-25T12:59:13.638Z" }, - { url = "https://files.pythonhosted.org/packages/76/9c/e1cf7def1bdc72c1907e60703983a588f9558434a2ff94615747bd73c192/coverage-7.13.2-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e080afb413be106c95c4ee96b4fffdc9e2fa56a8bbf90b5c0918e5c4449412f5", size = 250586, upload-time = "2026-01-25T12:59:15.808Z" }, - { url = "https://files.pythonhosted.org/packages/ba/49/f54ec02ed12be66c8d8897270505759e057b0c68564a65c429ccdd1f139e/coverage-7.13.2-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a7fc042ba3c7ce25b8a9f097eb0f32a5ce1ccdb639d9eec114e26def98e1f8a4", size = 253093, upload-time = "2026-01-25T12:59:17.491Z" }, - { url = "https://files.pythonhosted.org/packages/fb/5e/aaf86be3e181d907e23c0f61fccaeb38de8e6f6b47aed92bf57d8fc9c034/coverage-7.13.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d0ba505e021557f7f8173ee8cd6b926373d8653e5ff7581ae2efce1b11ef4c27", size = 254446, upload-time = "2026-01-25T12:59:19.752Z" }, - { url = "https://files.pythonhosted.org/packages/28/c8/a5fa01460e2d75b0c853b392080d6829d3ca8b5ab31e158fa0501bc7c708/coverage-7.13.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7de326f80e3451bd5cc7239ab46c73ddb658fe0b7649476bc7413572d36cd548", size = 250615, upload-time = "2026-01-25T12:59:21.928Z" }, - { url = "https://files.pythonhosted.org/packages/86/0b/6d56315a55f7062bb66410732c24879ccb2ec527ab6630246de5fe45a1df/coverage-7.13.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:abaea04f1e7e34841d4a7b343904a3f59481f62f9df39e2cd399d69a187a9660", size = 252452, upload-time = "2026-01-25T12:59:23.592Z" }, - { url = "https://files.pythonhosted.org/packages/30/19/9bc550363ebc6b0ea121977ee44d05ecd1e8bf79018b8444f1028701c563/coverage-7.13.2-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:9f93959ee0c604bccd8e0697be21de0887b1f73efcc3aa73a3ec0fd13feace92", size = 250418, upload-time = "2026-01-25T12:59:25.392Z" }, - { url = "https://files.pythonhosted.org/packages/1f/53/580530a31ca2f0cc6f07a8f2ab5460785b02bb11bdf815d4c4d37a4c5169/coverage-7.13.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:13fe81ead04e34e105bf1b3c9f9cdf32ce31736ee5d90a8d2de02b9d3e1bcb82", size = 250231, upload-time = "2026-01-25T12:59:27.888Z" }, - { url = "https://files.pythonhosted.org/packages/e2/42/dd9093f919dc3088cb472893651884bd675e3df3d38a43f9053656dca9a2/coverage-7.13.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d6d16b0f71120e365741bca2cb473ca6fe38930bc5431c5e850ba949f708f892", size = 251888, upload-time = "2026-01-25T12:59:29.636Z" }, - { url = "https://files.pythonhosted.org/packages/fa/a6/0af4053e6e819774626e133c3d6f70fae4d44884bfc4b126cb647baee8d3/coverage-7.13.2-cp314-cp314-win32.whl", hash = "sha256:9b2f4714bb7d99ba3790ee095b3b4ac94767e1347fe424278a0b10acb3ff04fe", size = 221968, upload-time = "2026-01-25T12:59:31.424Z" }, - { url = "https://files.pythonhosted.org/packages/c4/cc/5aff1e1f80d55862442855517bb8ad8ad3a68639441ff6287dde6a58558b/coverage-7.13.2-cp314-cp314-win_amd64.whl", hash = "sha256:e4121a90823a063d717a96e0a0529c727fb31ea889369a0ee3ec00ed99bf6859", size = 222783, upload-time = "2026-01-25T12:59:33.118Z" }, - { url = "https://files.pythonhosted.org/packages/de/20/09abafb24f84b3292cc658728803416c15b79f9ee5e68d25238a895b07d9/coverage-7.13.2-cp314-cp314-win_arm64.whl", hash = "sha256:6873f0271b4a15a33e7590f338d823f6f66f91ed147a03938d7ce26efd04eee6", size = 221348, upload-time = "2026-01-25T12:59:34.939Z" }, - { url = "https://files.pythonhosted.org/packages/b6/60/a3820c7232db63be060e4019017cd3426751c2699dab3c62819cdbcea387/coverage-7.13.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:f61d349f5b7cd95c34017f1927ee379bfbe9884300d74e07cf630ccf7a610c1b", size = 219950, upload-time = "2026-01-25T12:59:36.624Z" }, - { url = "https://files.pythonhosted.org/packages/fd/37/e4ef5975fdeb86b1e56db9a82f41b032e3d93a840ebaf4064f39e770d5c5/coverage-7.13.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a43d34ce714f4ca674c0d90beb760eb05aad906f2c47580ccee9da8fe8bfb417", size = 220209, upload-time = "2026-01-25T12:59:38.339Z" }, - { url = "https://files.pythonhosted.org/packages/54/df/d40e091d00c51adca1e251d3b60a8b464112efa3004949e96a74d7c19a64/coverage-7.13.2-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bff1b04cb9d4900ce5c56c4942f047dc7efe57e2608cb7c3c8936e9970ccdbee", size = 261576, upload-time = "2026-01-25T12:59:40.446Z" }, - { url = "https://files.pythonhosted.org/packages/c5/44/5259c4bed54e3392e5c176121af9f71919d96dde853386e7730e705f3520/coverage-7.13.2-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6ae99e4560963ad8e163e819e5d77d413d331fd00566c1e0856aa252303552c1", size = 263704, upload-time = "2026-01-25T12:59:42.346Z" }, - { url = "https://files.pythonhosted.org/packages/16/bd/ae9f005827abcbe2c70157459ae86053971c9fa14617b63903abbdce26d9/coverage-7.13.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e79a8c7d461820257d9aa43716c4efc55366d7b292e46b5b37165be1d377405d", size = 266109, upload-time = "2026-01-25T12:59:44.073Z" }, - { url = "https://files.pythonhosted.org/packages/a2/c0/8e279c1c0f5b1eaa3ad9b0fb7a5637fc0379ea7d85a781c0fe0bb3cfc2ab/coverage-7.13.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:060ee84f6a769d40c492711911a76811b4befb6fba50abb450371abb720f5bd6", size = 260686, upload-time = "2026-01-25T12:59:45.804Z" }, - { url = "https://files.pythonhosted.org/packages/b2/47/3a8112627e9d863e7cddd72894171c929e94491a597811725befdcd76bce/coverage-7.13.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3bca209d001fd03ea2d978f8a4985093240a355c93078aee3f799852c23f561a", size = 263568, upload-time = "2026-01-25T12:59:47.929Z" }, - { url = "https://files.pythonhosted.org/packages/92/bc/7ea367d84afa3120afc3ce6de294fd2dcd33b51e2e7fbe4bbfd200f2cb8c/coverage-7.13.2-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:6b8092aa38d72f091db61ef83cb66076f18f02da3e1a75039a4f218629600e04", size = 261174, upload-time = "2026-01-25T12:59:49.717Z" }, - { url = "https://files.pythonhosted.org/packages/33/b7/f1092dcecb6637e31cc2db099581ee5c61a17647849bae6b8261a2b78430/coverage-7.13.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:4a3158dc2dcce5200d91ec28cd315c999eebff355437d2765840555d765a6e5f", size = 260017, upload-time = "2026-01-25T12:59:51.463Z" }, - { url = "https://files.pythonhosted.org/packages/2b/cd/f3d07d4b95fbe1a2ef0958c15da614f7e4f557720132de34d2dc3aa7e911/coverage-7.13.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3973f353b2d70bd9796cc12f532a05945232ccae966456c8ed7034cb96bbfd6f", size = 262337, upload-time = "2026-01-25T12:59:53.407Z" }, - { url = "https://files.pythonhosted.org/packages/e0/db/b0d5b2873a07cb1e06a55d998697c0a5a540dcefbf353774c99eb3874513/coverage-7.13.2-cp314-cp314t-win32.whl", hash = "sha256:79f6506a678a59d4ded048dc72f1859ebede8ec2b9a2d509ebe161f01c2879d3", size = 222749, upload-time = "2026-01-25T12:59:56.316Z" }, - { url = "https://files.pythonhosted.org/packages/e5/2f/838a5394c082ac57d85f57f6aba53093b30d9089781df72412126505716f/coverage-7.13.2-cp314-cp314t-win_amd64.whl", hash = "sha256:196bfeabdccc5a020a57d5a368c681e3a6ceb0447d153aeccc1ab4d70a5032ba", size = 223857, upload-time = "2026-01-25T12:59:58.201Z" }, - { url = "https://files.pythonhosted.org/packages/44/d4/b608243e76ead3a4298824b50922b89ef793e50069ce30316a65c1b4d7ef/coverage-7.13.2-cp314-cp314t-win_arm64.whl", hash = "sha256:69269ab58783e090bfbf5b916ab3d188126e22d6070bbfc93098fdd474ef937c", size = 221881, upload-time = "2026-01-25T13:00:00.449Z" }, - { url = "https://files.pythonhosted.org/packages/d2/db/d291e30fdf7ea617a335531e72294e0c723356d7fdde8fba00610a76bda9/coverage-7.13.2-py3-none-any.whl", hash = "sha256:40ce1ea1e25125556d8e76bd0b61500839a07944cc287ac21d5626f3e620cad5", size = 210943, upload-time = "2026-01-25T13:00:02.388Z" }, +version = "7.13.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/56/95b7e30fa389756cb56630faa728da46a27b8c6eb46f9d557c68fff12b65/coverage-7.13.4.tar.gz", hash = "sha256:e5c8f6ed1e61a8b2dcdf31eb0b9bbf0130750ca79c1c49eb898e2ad86f5ccc91", size = 827239, upload-time = "2026-02-09T12:59:03.86Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/81/4ce2fdd909c5a0ed1f6dedb88aa57ab79b6d1fbd9b588c1ac7ef45659566/coverage-7.13.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:02231499b08dabbe2b96612993e5fc34217cdae907a51b906ac7fca8027a4459", size = 219449, upload-time = "2026-02-09T12:56:54.889Z" }, + { url = "https://files.pythonhosted.org/packages/5d/96/5238b1efc5922ddbdc9b0db9243152c09777804fb7c02ad1741eb18a11c0/coverage-7.13.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40aa8808140e55dc022b15d8aa7f651b6b3d68b365ea0398f1441e0b04d859c3", size = 219810, upload-time = "2026-02-09T12:56:56.33Z" }, + { url = "https://files.pythonhosted.org/packages/78/72/2f372b726d433c9c35e56377cf1d513b4c16fe51841060d826b95caacec1/coverage-7.13.4-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5b856a8ccf749480024ff3bd7310adaef57bf31fd17e1bfc404b7940b6986634", size = 251308, upload-time = "2026-02-09T12:56:57.858Z" }, + { url = "https://files.pythonhosted.org/packages/5d/a0/2ea570925524ef4e00bb6c82649f5682a77fac5ab910a65c9284de422600/coverage-7.13.4-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c048ea43875fbf8b45d476ad79f179809c590ec7b79e2035c662e7afa3192e3", size = 254052, upload-time = "2026-02-09T12:56:59.754Z" }, + { url = "https://files.pythonhosted.org/packages/e8/ac/45dc2e19a1939098d783c846e130b8f862fbb50d09e0af663988f2f21973/coverage-7.13.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b7b38448866e83176e28086674fe7368ab8590e4610fb662b44e345b86d63ffa", size = 255165, upload-time = "2026-02-09T12:57:01.287Z" }, + { url = "https://files.pythonhosted.org/packages/2d/4d/26d236ff35abc3b5e63540d3386e4c3b192168c1d96da5cb2f43c640970f/coverage-7.13.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:de6defc1c9badbf8b9e67ae90fd00519186d6ab64e5cc5f3d21359c2a9b2c1d3", size = 257432, upload-time = "2026-02-09T12:57:02.637Z" }, + { url = "https://files.pythonhosted.org/packages/ec/55/14a966c757d1348b2e19caf699415a2a4c4f7feaa4bbc6326a51f5c7dd1b/coverage-7.13.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7eda778067ad7ffccd23ecffce537dface96212576a07924cbf0d8799d2ded5a", size = 251716, upload-time = "2026-02-09T12:57:04.056Z" }, + { url = "https://files.pythonhosted.org/packages/77/33/50116647905837c66d28b2af1321b845d5f5d19be9655cb84d4a0ea806b4/coverage-7.13.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e87f6c587c3f34356c3759f0420693e35e7eb0e2e41e4c011cb6ec6ecbbf1db7", size = 253089, upload-time = "2026-02-09T12:57:05.503Z" }, + { url = "https://files.pythonhosted.org/packages/c2/b4/8efb11a46e3665d92635a56e4f2d4529de6d33f2cb38afd47d779d15fc99/coverage-7.13.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8248977c2e33aecb2ced42fef99f2d319e9904a36e55a8a68b69207fb7e43edc", size = 251232, upload-time = "2026-02-09T12:57:06.879Z" }, + { url = "https://files.pythonhosted.org/packages/51/24/8cd73dd399b812cc76bb0ac260e671c4163093441847ffe058ac9fda1e32/coverage-7.13.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:25381386e80ae727608e662474db537d4df1ecd42379b5ba33c84633a2b36d47", size = 255299, upload-time = "2026-02-09T12:57:08.245Z" }, + { url = "https://files.pythonhosted.org/packages/03/94/0a4b12f1d0e029ce1ccc1c800944a9984cbe7d678e470bb6d3c6bc38a0da/coverage-7.13.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:ee756f00726693e5ba94d6df2bdfd64d4852d23b09bb0bc700e3b30e6f333985", size = 250796, upload-time = "2026-02-09T12:57:10.142Z" }, + { url = "https://files.pythonhosted.org/packages/73/44/6002fbf88f6698ca034360ce474c406be6d5a985b3fdb3401128031eef6b/coverage-7.13.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fdfc1e28e7c7cdce44985b3043bc13bbd9c747520f94a4d7164af8260b3d91f0", size = 252673, upload-time = "2026-02-09T12:57:12.197Z" }, + { url = "https://files.pythonhosted.org/packages/de/c6/a0279f7c00e786be75a749a5674e6fa267bcbd8209cd10c9a450c655dfa7/coverage-7.13.4-cp312-cp312-win32.whl", hash = "sha256:01d4cbc3c283a17fc1e42d614a119f7f438eabb593391283adca8dc86eff1246", size = 221990, upload-time = "2026-02-09T12:57:14.085Z" }, + { url = "https://files.pythonhosted.org/packages/77/4e/c0a25a425fcf5557d9abd18419c95b63922e897bc86c1f327f155ef234a9/coverage-7.13.4-cp312-cp312-win_amd64.whl", hash = "sha256:9401ebc7ef522f01d01d45532c68c5ac40fb27113019b6b7d8b208f6e9baa126", size = 222800, upload-time = "2026-02-09T12:57:15.944Z" }, + { url = "https://files.pythonhosted.org/packages/47/ac/92da44ad9a6f4e3a7debd178949d6f3769bedca33830ce9b1dcdab589a37/coverage-7.13.4-cp312-cp312-win_arm64.whl", hash = "sha256:b1ec7b6b6e93255f952e27ab58fbc68dcc468844b16ecbee881aeb29b6ab4d8d", size = 221415, upload-time = "2026-02-09T12:57:17.497Z" }, + { url = "https://files.pythonhosted.org/packages/db/23/aad45061a31677d68e47499197a131eea55da4875d16c1f42021ab963503/coverage-7.13.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b66a2da594b6068b48b2692f043f35d4d3693fb639d5ea8b39533c2ad9ac3ab9", size = 219474, upload-time = "2026-02-09T12:57:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/a5/70/9b8b67a0945f3dfec1fd896c5cefb7c19d5a3a6d74630b99a895170999ae/coverage-7.13.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3599eb3992d814d23b35c536c28df1a882caa950f8f507cef23d1cbf334995ac", size = 219844, upload-time = "2026-02-09T12:57:20.66Z" }, + { url = "https://files.pythonhosted.org/packages/97/fd/7e859f8fab324cef6c4ad7cff156ca7c489fef9179d5749b0c8d321281c2/coverage-7.13.4-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:93550784d9281e374fb5a12bf1324cc8a963fd63b2d2f223503ef0fd4aa339ea", size = 250832, upload-time = "2026-02-09T12:57:22.007Z" }, + { url = "https://files.pythonhosted.org/packages/e4/dc/b2442d10020c2f52617828862d8b6ee337859cd8f3a1f13d607dddda9cf7/coverage-7.13.4-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b720ce6a88a2755f7c697c23268ddc47a571b88052e6b155224347389fdf6a3b", size = 253434, upload-time = "2026-02-09T12:57:23.339Z" }, + { url = "https://files.pythonhosted.org/packages/5a/88/6728a7ad17428b18d836540630487231f5470fb82454871149502f5e5aa2/coverage-7.13.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7b322db1284a2ed3aa28ffd8ebe3db91c929b7a333c0820abec3d838ef5b3525", size = 254676, upload-time = "2026-02-09T12:57:24.774Z" }, + { url = "https://files.pythonhosted.org/packages/7c/bc/21244b1b8cedf0dff0a2b53b208015fe798d5f2a8d5348dbfece04224fff/coverage-7.13.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f4594c67d8a7c89cf922d9df0438c7c7bb022ad506eddb0fdb2863359ff78242", size = 256807, upload-time = "2026-02-09T12:57:26.125Z" }, + { url = "https://files.pythonhosted.org/packages/97/a0/ddba7ed3251cff51006737a727d84e05b61517d1784a9988a846ba508877/coverage-7.13.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:53d133df809c743eb8bce33b24bcababb371f4441340578cd406e084d94a6148", size = 251058, upload-time = "2026-02-09T12:57:27.614Z" }, + { url = "https://files.pythonhosted.org/packages/9b/55/e289addf7ff54d3a540526f33751951bf0878f3809b47f6dfb3def69c6f7/coverage-7.13.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:76451d1978b95ba6507a039090ba076105c87cc76fc3efd5d35d72093964d49a", size = 252805, upload-time = "2026-02-09T12:57:29.066Z" }, + { url = "https://files.pythonhosted.org/packages/13/4e/cc276b1fa4a59be56d96f1dabddbdc30f4ba22e3b1cd42504c37b3313255/coverage-7.13.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7f57b33491e281e962021de110b451ab8a24182589be17e12a22c79047935e23", size = 250766, upload-time = "2026-02-09T12:57:30.522Z" }, + { url = "https://files.pythonhosted.org/packages/94/44/1093b8f93018f8b41a8cf29636c9292502f05e4a113d4d107d14a3acd044/coverage-7.13.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1731dc33dc276dafc410a885cbf5992f1ff171393e48a21453b78727d090de80", size = 254923, upload-time = "2026-02-09T12:57:31.946Z" }, + { url = "https://files.pythonhosted.org/packages/8b/55/ea2796da2d42257f37dbea1aab239ba9263b31bd91d5527cdd6db5efe174/coverage-7.13.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:bd60d4fe2f6fa7dff9223ca1bbc9f05d2b6697bc5961072e5d3b952d46e1b1ea", size = 250591, upload-time = "2026-02-09T12:57:33.842Z" }, + { url = "https://files.pythonhosted.org/packages/d4/fa/7c4bb72aacf8af5020675aa633e59c1fbe296d22aed191b6a5b711eb2bc7/coverage-7.13.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9181a3ccead280b828fae232df12b16652702b49d41e99d657f46cc7b1f6ec7a", size = 252364, upload-time = "2026-02-09T12:57:35.743Z" }, + { url = "https://files.pythonhosted.org/packages/5c/38/a8d2ec0146479c20bbaa7181b5b455a0c41101eed57f10dd19a78ab44c80/coverage-7.13.4-cp313-cp313-win32.whl", hash = "sha256:f53d492307962561ac7de4cd1de3e363589b000ab69617c6156a16ba7237998d", size = 222010, upload-time = "2026-02-09T12:57:37.25Z" }, + { url = "https://files.pythonhosted.org/packages/e2/0c/dbfafbe90a185943dcfbc766fe0e1909f658811492d79b741523a414a6cc/coverage-7.13.4-cp313-cp313-win_amd64.whl", hash = "sha256:e6f70dec1cc557e52df5306d051ef56003f74d56e9c4dd7ddb07e07ef32a84dd", size = 222818, upload-time = "2026-02-09T12:57:38.734Z" }, + { url = "https://files.pythonhosted.org/packages/04/d1/934918a138c932c90d78301f45f677fb05c39a3112b96fd2c8e60503cdc7/coverage-7.13.4-cp313-cp313-win_arm64.whl", hash = "sha256:fb07dc5da7e849e2ad31a5d74e9bece81f30ecf5a42909d0a695f8bd1874d6af", size = 221438, upload-time = "2026-02-09T12:57:40.223Z" }, + { url = "https://files.pythonhosted.org/packages/52/57/ee93ced533bcb3e6df961c0c6e42da2fc6addae53fb95b94a89b1e33ebd7/coverage-7.13.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:40d74da8e6c4b9ac18b15331c4b5ebc35a17069410cad462ad4f40dcd2d50c0d", size = 220165, upload-time = "2026-02-09T12:57:41.639Z" }, + { url = "https://files.pythonhosted.org/packages/c5/e0/969fc285a6fbdda49d91af278488d904dcd7651b2693872f0ff94e40e84a/coverage-7.13.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4223b4230a376138939a9173f1bdd6521994f2aff8047fae100d6d94d50c5a12", size = 220516, upload-time = "2026-02-09T12:57:44.215Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b8/9531944e16267e2735a30a9641ff49671f07e8138ecf1ca13db9fd2560c7/coverage-7.13.4-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1d4be36a5114c499f9f1f9195e95ebf979460dbe2d88e6816ea202010ba1c34b", size = 261804, upload-time = "2026-02-09T12:57:45.989Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f3/e63df6d500314a2a60390d1989240d5f27318a7a68fa30ad3806e2a9323e/coverage-7.13.4-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:200dea7d1e8095cc6e98cdabe3fd1d21ab17d3cee6dab00cadbb2fe35d9c15b9", size = 263885, upload-time = "2026-02-09T12:57:47.42Z" }, + { url = "https://files.pythonhosted.org/packages/f3/67/7654810de580e14b37670b60a09c599fa348e48312db5b216d730857ffe6/coverage-7.13.4-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8eb931ee8e6d8243e253e5ed7336deea6904369d2fd8ae6e43f68abbf167092", size = 266308, upload-time = "2026-02-09T12:57:49.345Z" }, + { url = "https://files.pythonhosted.org/packages/37/6f/39d41eca0eab3cc82115953ad41c4e77935286c930e8fad15eaed1389d83/coverage-7.13.4-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:75eab1ebe4f2f64d9509b984f9314d4aa788540368218b858dad56dc8f3e5eb9", size = 267452, upload-time = "2026-02-09T12:57:50.811Z" }, + { url = "https://files.pythonhosted.org/packages/50/6d/39c0fbb8fc5cd4d2090811e553c2108cf5112e882f82505ee7495349a6bf/coverage-7.13.4-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c35eb28c1d085eb7d8c9b3296567a1bebe03ce72962e932431b9a61f28facf26", size = 261057, upload-time = "2026-02-09T12:57:52.447Z" }, + { url = "https://files.pythonhosted.org/packages/a4/a2/60010c669df5fa603bb5a97fb75407e191a846510da70ac657eb696b7fce/coverage-7.13.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb88b316ec33760714a4720feb2816a3a59180fd58c1985012054fa7aebee4c2", size = 263875, upload-time = "2026-02-09T12:57:53.938Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d9/63b22a6bdbd17f1f96e9ed58604c2a6b0e72a9133e37d663bef185877cf6/coverage-7.13.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7d41eead3cc673cbd38a4417deb7fd0b4ca26954ff7dc6078e33f6ff97bed940", size = 261500, upload-time = "2026-02-09T12:57:56.012Z" }, + { url = "https://files.pythonhosted.org/packages/70/bf/69f86ba1ad85bc3ad240e4c0e57a2e620fbc0e1645a47b5c62f0e941ad7f/coverage-7.13.4-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:fb26a934946a6afe0e326aebe0730cdff393a8bc0bbb65a2f41e30feddca399c", size = 265212, upload-time = "2026-02-09T12:57:57.5Z" }, + { url = "https://files.pythonhosted.org/packages/ae/f2/5f65a278a8c2148731831574c73e42f57204243d33bedaaf18fa79c5958f/coverage-7.13.4-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:dae88bc0fc77edaa65c14be099bd57ee140cf507e6bfdeea7938457ab387efb0", size = 260398, upload-time = "2026-02-09T12:57:59.027Z" }, + { url = "https://files.pythonhosted.org/packages/ef/80/6e8280a350ee9fea92f14b8357448a242dcaa243cb2c72ab0ca591f66c8c/coverage-7.13.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:845f352911777a8e722bfce168958214951e07e47e5d5d9744109fa5fe77f79b", size = 262584, upload-time = "2026-02-09T12:58:01.129Z" }, + { url = "https://files.pythonhosted.org/packages/22/63/01ff182fc95f260b539590fb12c11ad3e21332c15f9799cb5e2386f71d9f/coverage-7.13.4-cp313-cp313t-win32.whl", hash = "sha256:2fa8d5f8de70688a28240de9e139fa16b153cc3cbb01c5f16d88d6505ebdadf9", size = 222688, upload-time = "2026-02-09T12:58:02.736Z" }, + { url = "https://files.pythonhosted.org/packages/a9/43/89de4ef5d3cd53b886afa114065f7e9d3707bdb3e5efae13535b46ae483d/coverage-7.13.4-cp313-cp313t-win_amd64.whl", hash = "sha256:9351229c8c8407645840edcc277f4a2d44814d1bc34a2128c11c2a031d45a5dd", size = 223746, upload-time = "2026-02-09T12:58:05.362Z" }, + { url = "https://files.pythonhosted.org/packages/35/39/7cf0aa9a10d470a5309b38b289b9bb07ddeac5d61af9b664fe9775a4cb3e/coverage-7.13.4-cp313-cp313t-win_arm64.whl", hash = "sha256:30b8d0512f2dc8c8747557e8fb459d6176a2c9e5731e2b74d311c03b78451997", size = 222003, upload-time = "2026-02-09T12:58:06.952Z" }, + { url = "https://files.pythonhosted.org/packages/92/11/a9cf762bb83386467737d32187756a42094927150c3e107df4cb078e8590/coverage-7.13.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:300deaee342f90696ed186e3a00c71b5b3d27bffe9e827677954f4ee56969601", size = 219522, upload-time = "2026-02-09T12:58:08.623Z" }, + { url = "https://files.pythonhosted.org/packages/d3/28/56e6d892b7b052236d67c95f1936b6a7cf7c3e2634bf27610b8cbd7f9c60/coverage-7.13.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:29e3220258d682b6226a9b0925bc563ed9a1ebcff3cad30f043eceea7eaf2689", size = 219855, upload-time = "2026-02-09T12:58:10.176Z" }, + { url = "https://files.pythonhosted.org/packages/e5/69/233459ee9eb0c0d10fcc2fe425a029b3fa5ce0f040c966ebce851d030c70/coverage-7.13.4-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:391ee8f19bef69210978363ca930f7328081c6a0152f1166c91f0b5fdd2a773c", size = 250887, upload-time = "2026-02-09T12:58:12.503Z" }, + { url = "https://files.pythonhosted.org/packages/06/90/2cdab0974b9b5bbc1623f7876b73603aecac11b8d95b85b5b86b32de5eab/coverage-7.13.4-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0dd7ab8278f0d58a0128ba2fca25824321f05d059c1441800e934ff2efa52129", size = 253396, upload-time = "2026-02-09T12:58:14.615Z" }, + { url = "https://files.pythonhosted.org/packages/ac/15/ea4da0f85bf7d7b27635039e649e99deb8173fe551096ea15017f7053537/coverage-7.13.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78cdf0d578b15148b009ccf18c686aa4f719d887e76e6b40c38ffb61d264a552", size = 254745, upload-time = "2026-02-09T12:58:16.162Z" }, + { url = "https://files.pythonhosted.org/packages/99/11/bb356e86920c655ca4d61daee4e2bbc7258f0a37de0be32d233b561134ff/coverage-7.13.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:48685fee12c2eb3b27c62f2658e7ea21e9c3239cba5a8a242801a0a3f6a8c62a", size = 257055, upload-time = "2026-02-09T12:58:17.892Z" }, + { url = "https://files.pythonhosted.org/packages/c9/0f/9ae1f8cb17029e09da06ca4e28c9e1d5c1c0a511c7074592e37e0836c915/coverage-7.13.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4e83efc079eb39480e6346a15a1bcb3e9b04759c5202d157e1dd4303cd619356", size = 250911, upload-time = "2026-02-09T12:58:19.495Z" }, + { url = "https://files.pythonhosted.org/packages/89/3a/adfb68558fa815cbc29747b553bc833d2150228f251b127f1ce97e48547c/coverage-7.13.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ecae9737b72408d6a950f7e525f30aca12d4bd8dd95e37342e5beb3a2a8c4f71", size = 252754, upload-time = "2026-02-09T12:58:21.064Z" }, + { url = "https://files.pythonhosted.org/packages/32/b1/540d0c27c4e748bd3cd0bd001076ee416eda993c2bae47a73b7cc9357931/coverage-7.13.4-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ae4578f8528569d3cf303fef2ea569c7f4c4059a38c8667ccef15c6e1f118aa5", size = 250720, upload-time = "2026-02-09T12:58:22.622Z" }, + { url = "https://files.pythonhosted.org/packages/c7/95/383609462b3ffb1fe133014a7c84fc0dd01ed55ac6140fa1093b5af7ebb1/coverage-7.13.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:6fdef321fdfbb30a197efa02d48fcd9981f0d8ad2ae8903ac318adc653f5df98", size = 254994, upload-time = "2026-02-09T12:58:24.548Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ba/1761138e86c81680bfc3c49579d66312865457f9fe405b033184e5793cb3/coverage-7.13.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b0f6ccf3dbe577170bebfce1318707d0e8c3650003cb4b3a9dd744575daa8b5", size = 250531, upload-time = "2026-02-09T12:58:26.271Z" }, + { url = "https://files.pythonhosted.org/packages/f8/8e/05900df797a9c11837ab59c4d6fe94094e029582aab75c3309a93e6fb4e3/coverage-7.13.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75fcd519f2a5765db3f0e391eb3b7d150cce1a771bf4c9f861aeab86c767a3c0", size = 252189, upload-time = "2026-02-09T12:58:27.807Z" }, + { url = "https://files.pythonhosted.org/packages/00/bd/29c9f2db9ea4ed2738b8a9508c35626eb205d51af4ab7bf56a21a2e49926/coverage-7.13.4-cp314-cp314-win32.whl", hash = "sha256:8e798c266c378da2bd819b0677df41ab46d78065fb2a399558f3f6cae78b2fbb", size = 222258, upload-time = "2026-02-09T12:58:29.441Z" }, + { url = "https://files.pythonhosted.org/packages/a7/4d/1f8e723f6829977410efeb88f73673d794075091c8c7c18848d273dc9d73/coverage-7.13.4-cp314-cp314-win_amd64.whl", hash = "sha256:245e37f664d89861cf2329c9afa2c1fe9e6d4e1a09d872c947e70718aeeac505", size = 223073, upload-time = "2026-02-09T12:58:31.026Z" }, + { url = "https://files.pythonhosted.org/packages/51/5b/84100025be913b44e082ea32abcf1afbf4e872f5120b7a1cab1d331b1e13/coverage-7.13.4-cp314-cp314-win_arm64.whl", hash = "sha256:ad27098a189e5838900ce4c2a99f2fe42a0bf0c2093c17c69b45a71579e8d4a2", size = 221638, upload-time = "2026-02-09T12:58:32.599Z" }, + { url = "https://files.pythonhosted.org/packages/a7/e4/c884a405d6ead1370433dad1e3720216b4f9fd8ef5b64bfd984a2a60a11a/coverage-7.13.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:85480adfb35ffc32d40918aad81b89c69c9cc5661a9b8a81476d3e645321a056", size = 220246, upload-time = "2026-02-09T12:58:34.181Z" }, + { url = "https://files.pythonhosted.org/packages/81/5c/4d7ed8b23b233b0fffbc9dfec53c232be2e695468523242ea9fd30f97ad2/coverage-7.13.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:79be69cf7f3bf9b0deeeb062eab7ac7f36cd4cc4c4dd694bd28921ba4d8596cc", size = 220514, upload-time = "2026-02-09T12:58:35.704Z" }, + { url = "https://files.pythonhosted.org/packages/2f/6f/3284d4203fd2f28edd73034968398cd2d4cb04ab192abc8cff007ea35679/coverage-7.13.4-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:caa421e2684e382c5d8973ac55e4f36bed6821a9bad5c953494de960c74595c9", size = 261877, upload-time = "2026-02-09T12:58:37.864Z" }, + { url = "https://files.pythonhosted.org/packages/09/aa/b672a647bbe1556a85337dc95bfd40d146e9965ead9cc2fe81bde1e5cbce/coverage-7.13.4-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:14375934243ee05f56c45393fe2ce81fe5cc503c07cee2bdf1725fb8bef3ffaf", size = 264004, upload-time = "2026-02-09T12:58:39.492Z" }, + { url = "https://files.pythonhosted.org/packages/79/a1/aa384dbe9181f98bba87dd23dda436f0c6cf2e148aecbb4e50fc51c1a656/coverage-7.13.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:25a41c3104d08edb094d9db0d905ca54d0cd41c928bb6be3c4c799a54753af55", size = 266408, upload-time = "2026-02-09T12:58:41.852Z" }, + { url = "https://files.pythonhosted.org/packages/53/5e/5150bf17b4019bc600799f376bb9606941e55bd5a775dc1e096b6ffea952/coverage-7.13.4-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6f01afcff62bf9a08fb32b2c1d6e924236c0383c02c790732b6537269e466a72", size = 267544, upload-time = "2026-02-09T12:58:44.093Z" }, + { url = "https://files.pythonhosted.org/packages/e0/ed/f1de5c675987a4a7a672250d2c5c9d73d289dbf13410f00ed7181d8017dd/coverage-7.13.4-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eb9078108fbf0bcdde37c3f4779303673c2fa1fe8f7956e68d447d0dd426d38a", size = 260980, upload-time = "2026-02-09T12:58:45.721Z" }, + { url = "https://files.pythonhosted.org/packages/b3/e3/fe758d01850aa172419a6743fe76ba8b92c29d181d4f676ffe2dae2ba631/coverage-7.13.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0e086334e8537ddd17e5f16a344777c1ab8194986ec533711cbe6c41cde841b6", size = 263871, upload-time = "2026-02-09T12:58:47.334Z" }, + { url = "https://files.pythonhosted.org/packages/b6/76/b829869d464115e22499541def9796b25312b8cf235d3bb00b39f1675395/coverage-7.13.4-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:725d985c5ab621268b2edb8e50dfe57633dc69bda071abc470fed55a14935fd3", size = 261472, upload-time = "2026-02-09T12:58:48.995Z" }, + { url = "https://files.pythonhosted.org/packages/14/9e/caedb1679e73e2f6ad240173f55218488bfe043e38da577c4ec977489915/coverage-7.13.4-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:3c06f0f1337c667b971ca2f975523347e63ec5e500b9aa5882d91931cd3ef750", size = 265210, upload-time = "2026-02-09T12:58:51.178Z" }, + { url = "https://files.pythonhosted.org/packages/3a/10/0dd02cb009b16ede425b49ec344aba13a6ae1dc39600840ea6abcb085ac4/coverage-7.13.4-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:590c0ed4bf8e85f745e6b805b2e1c457b2e33d5255dd9729743165253bc9ad39", size = 260319, upload-time = "2026-02-09T12:58:53.081Z" }, + { url = "https://files.pythonhosted.org/packages/92/8e/234d2c927af27c6d7a5ffad5bd2cf31634c46a477b4c7adfbfa66baf7ebb/coverage-7.13.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:eb30bf180de3f632cd043322dad5751390e5385108b2807368997d1a92a509d0", size = 262638, upload-time = "2026-02-09T12:58:55.258Z" }, + { url = "https://files.pythonhosted.org/packages/2f/64/e5547c8ff6964e5965c35a480855911b61509cce544f4d442caa759a0702/coverage-7.13.4-cp314-cp314t-win32.whl", hash = "sha256:c4240e7eded42d131a2d2c4dec70374b781b043ddc79a9de4d55ca71f8e98aea", size = 223040, upload-time = "2026-02-09T12:58:56.936Z" }, + { url = "https://files.pythonhosted.org/packages/c7/96/38086d58a181aac86d503dfa9c47eb20715a79c3e3acbdf786e92e5c09a8/coverage-7.13.4-cp314-cp314t-win_amd64.whl", hash = "sha256:4c7d3cc01e7350f2f0f6f7036caaf5673fb56b6998889ccfe9e1c1fe75a9c932", size = 224148, upload-time = "2026-02-09T12:58:58.645Z" }, + { url = "https://files.pythonhosted.org/packages/ce/72/8d10abd3740a0beb98c305e0c3faf454366221c0f37a8bcf8f60020bb65a/coverage-7.13.4-cp314-cp314t-win_arm64.whl", hash = "sha256:23e3f687cf945070d1c90f85db66d11e3025665d8dafa831301a0e0038f3db9b", size = 222172, upload-time = "2026-02-09T12:59:00.396Z" }, + { url = "https://files.pythonhosted.org/packages/0d/4a/331fe2caf6799d591109bb9c08083080f6de90a823695d412a935622abb2/coverage-7.13.4-py3-none-any.whl", hash = "sha256:1af1641e57cf7ba1bd67d677c9abdbcd6cc2ab7da3bca7fa1e2b7e50e65f2ad0", size = 211242, upload-time = "2026-02-09T12:59:02.032Z" }, ] [[package]] @@ -463,14 +473,34 @@ wheels = [ [[package]] name = "griffe" -version = "1.15.0" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "griffecli" }, + { name = "griffelib" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/94/ee21d41e7eb4f823b94603b9d40f86d3c7fde80eacc2c3c71845476dddaa/griffe-2.0.0-py3-none-any.whl", hash = "sha256:5418081135a391c3e6e757a7f3f156f1a1a746cc7b4023868ff7d5e2f9a980aa", size = 5214, upload-time = "2026-02-09T19:09:44.105Z" }, +] + +[[package]] +name = "griffecli" +version = "2.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama" }, + { name = "griffelib" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/ed/d93f7a447bbf7a935d8868e9617cbe1cadf9ee9ee6bd275d3040fbf93d60/griffecli-2.0.0-py3-none-any.whl", hash = "sha256:9f7cd9ee9b21d55e91689358978d2385ae65c22f307a63fb3269acf3f21e643d", size = 9345, upload-time = "2026-02-09T19:09:42.554Z" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0d/0c/3a471b6e31951dce2360477420d0a8d1e00dea6cf33b70f3e8c3ab6e28e1/griffe-1.15.0.tar.gz", hash = "sha256:7726e3afd6f298fbc3696e67958803e7ac843c1cfe59734b6251a40cdbfb5eea", size = 424112, upload-time = "2025-11-10T15:03:15.52Z" } + +[[package]] +name = "griffelib" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9c/83/3b1d03d36f224edded98e9affd0467630fc09d766c0e56fb1498cbb04a9b/griffe-1.15.0-py3-none-any.whl", hash = "sha256:6f6762661949411031f5fcda9593f586e6ce8340f0ba88921a0f2ef7a81eb9a3", size = 150705, upload-time = "2025-11-10T15:03:13.549Z" }, + { url = "https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl", hash = "sha256:01284878c966508b6d6f1dbff9b6fa607bc062d8261c5c7253cb285b06422a7f", size = 142004, upload-time = "2026-02-09T19:09:40.561Z" }, ] [[package]] @@ -514,63 +544,71 @@ wheels = [ [[package]] name = "librt" -version = "0.7.8" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/24/5f3646ff414285e0f7708fa4e946b9bf538345a41d1c375c439467721a5e/librt-0.7.8.tar.gz", hash = "sha256:1a4ede613941d9c3470b0368be851df6bb78ab218635512d0370b27a277a0862", size = 148323, upload-time = "2026-01-14T12:56:16.876Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/56/04/79d8fcb43cae376c7adbab7b2b9f65e48432c9eced62ac96703bcc16e09b/librt-0.7.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9b6943885b2d49c48d0cff23b16be830ba46b0152d98f62de49e735c6e655a63", size = 57472, upload-time = "2026-01-14T12:55:08.528Z" }, - { url = "https://files.pythonhosted.org/packages/b4/ba/60b96e93043d3d659da91752689023a73981336446ae82078cddf706249e/librt-0.7.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:46ef1f4b9b6cc364b11eea0ecc0897314447a66029ee1e55859acb3dd8757c93", size = 58986, upload-time = "2026-01-14T12:55:09.466Z" }, - { url = "https://files.pythonhosted.org/packages/7c/26/5215e4cdcc26e7be7eee21955a7e13cbf1f6d7d7311461a6014544596fac/librt-0.7.8-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:907ad09cfab21e3c86e8f1f87858f7049d1097f77196959c033612f532b4e592", size = 168422, upload-time = "2026-01-14T12:55:10.499Z" }, - { url = "https://files.pythonhosted.org/packages/0f/84/e8d1bc86fa0159bfc24f3d798d92cafd3897e84c7fea7fe61b3220915d76/librt-0.7.8-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2991b6c3775383752b3ca0204842743256f3ad3deeb1d0adc227d56b78a9a850", size = 177478, upload-time = "2026-01-14T12:55:11.577Z" }, - { url = "https://files.pythonhosted.org/packages/57/11/d0268c4b94717a18aa91df1100e767b010f87b7ae444dafaa5a2d80f33a6/librt-0.7.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03679b9856932b8c8f674e87aa3c55ea11c9274301f76ae8dc4d281bda55cf62", size = 192439, upload-time = "2026-01-14T12:55:12.7Z" }, - { url = "https://files.pythonhosted.org/packages/8d/56/1e8e833b95fe684f80f8894ae4d8b7d36acc9203e60478fcae599120a975/librt-0.7.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3968762fec1b2ad34ce57458b6de25dbb4142713e9ca6279a0d352fa4e9f452b", size = 191483, upload-time = "2026-01-14T12:55:13.838Z" }, - { url = "https://files.pythonhosted.org/packages/17/48/f11cf28a2cb6c31f282009e2208312aa84a5ee2732859f7856ee306176d5/librt-0.7.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bb7a7807523a31f03061288cc4ffc065d684c39db7644c676b47d89553c0d714", size = 185376, upload-time = "2026-01-14T12:55:15.017Z" }, - { url = "https://files.pythonhosted.org/packages/b8/6a/d7c116c6da561b9155b184354a60a3d5cdbf08fc7f3678d09c95679d13d9/librt-0.7.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad64a14b1e56e702e19b24aae108f18ad1bf7777f3af5fcd39f87d0c5a814449", size = 206234, upload-time = "2026-01-14T12:55:16.571Z" }, - { url = "https://files.pythonhosted.org/packages/61/de/1975200bb0285fc921c5981d9978ce6ce11ae6d797df815add94a5a848a3/librt-0.7.8-cp312-cp312-win32.whl", hash = "sha256:0241a6ed65e6666236ea78203a73d800dbed896cf12ae25d026d75dc1fcd1dac", size = 44057, upload-time = "2026-01-14T12:55:18.077Z" }, - { url = "https://files.pythonhosted.org/packages/8e/cd/724f2d0b3461426730d4877754b65d39f06a41ac9d0a92d5c6840f72b9ae/librt-0.7.8-cp312-cp312-win_amd64.whl", hash = "sha256:6db5faf064b5bab9675c32a873436b31e01d66ca6984c6f7f92621656033a708", size = 50293, upload-time = "2026-01-14T12:55:19.179Z" }, - { url = "https://files.pythonhosted.org/packages/bd/cf/7e899acd9ee5727ad8160fdcc9994954e79fab371c66535c60e13b968ffc/librt-0.7.8-cp312-cp312-win_arm64.whl", hash = "sha256:57175aa93f804d2c08d2edb7213e09276bd49097611aefc37e3fa38d1fb99ad0", size = 43574, upload-time = "2026-01-14T12:55:20.185Z" }, - { url = "https://files.pythonhosted.org/packages/a1/fe/b1f9de2829cf7fc7649c1dcd202cfd873837c5cc2fc9e526b0e7f716c3d2/librt-0.7.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4c3995abbbb60b3c129490fa985dfe6cac11d88fc3c36eeb4fb1449efbbb04fc", size = 57500, upload-time = "2026-01-14T12:55:21.219Z" }, - { url = "https://files.pythonhosted.org/packages/eb/d4/4a60fbe2e53b825f5d9a77325071d61cd8af8506255067bf0c8527530745/librt-0.7.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:44e0c2cbc9bebd074cf2cdbe472ca185e824be4e74b1c63a8e934cea674bebf2", size = 59019, upload-time = "2026-01-14T12:55:22.256Z" }, - { url = "https://files.pythonhosted.org/packages/6a/37/61ff80341ba5159afa524445f2d984c30e2821f31f7c73cf166dcafa5564/librt-0.7.8-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4d2f1e492cae964b3463a03dc77a7fe8742f7855d7258c7643f0ee32b6651dd3", size = 169015, upload-time = "2026-01-14T12:55:23.24Z" }, - { url = "https://files.pythonhosted.org/packages/1c/86/13d4f2d6a93f181ebf2fc953868826653ede494559da8268023fe567fca3/librt-0.7.8-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:451e7ffcef8f785831fdb791bd69211f47e95dc4c6ddff68e589058806f044c6", size = 178161, upload-time = "2026-01-14T12:55:24.826Z" }, - { url = "https://files.pythonhosted.org/packages/88/26/e24ef01305954fc4d771f1f09f3dd682f9eb610e1bec188ffb719374d26e/librt-0.7.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3469e1af9f1380e093ae06bedcbdd11e407ac0b303a56bbe9afb1d6824d4982d", size = 193015, upload-time = "2026-01-14T12:55:26.04Z" }, - { url = "https://files.pythonhosted.org/packages/88/a0/92b6bd060e720d7a31ed474d046a69bd55334ec05e9c446d228c4b806ae3/librt-0.7.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f11b300027ce19a34f6d24ebb0a25fd0e24a9d53353225a5c1e6cadbf2916b2e", size = 192038, upload-time = "2026-01-14T12:55:27.208Z" }, - { url = "https://files.pythonhosted.org/packages/06/bb/6f4c650253704279c3a214dad188101d1b5ea23be0606628bc6739456624/librt-0.7.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4adc73614f0d3c97874f02f2c7fd2a27854e7e24ad532ea6b965459c5b757eca", size = 186006, upload-time = "2026-01-14T12:55:28.594Z" }, - { url = "https://files.pythonhosted.org/packages/dc/00/1c409618248d43240cadf45f3efb866837fa77e9a12a71481912135eb481/librt-0.7.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:60c299e555f87e4c01b2eca085dfccda1dde87f5a604bb45c2906b8305819a93", size = 206888, upload-time = "2026-01-14T12:55:30.214Z" }, - { url = "https://files.pythonhosted.org/packages/d9/83/b2cfe8e76ff5c1c77f8a53da3d5de62d04b5ebf7cf913e37f8bca43b5d07/librt-0.7.8-cp313-cp313-win32.whl", hash = "sha256:b09c52ed43a461994716082ee7d87618096851319bf695d57ec123f2ab708951", size = 44126, upload-time = "2026-01-14T12:55:31.44Z" }, - { url = "https://files.pythonhosted.org/packages/a9/0b/c59d45de56a51bd2d3a401fc63449c0ac163e4ef7f523ea8b0c0dee86ec5/librt-0.7.8-cp313-cp313-win_amd64.whl", hash = "sha256:f8f4a901a3fa28969d6e4519deceab56c55a09d691ea7b12ca830e2fa3461e34", size = 50262, upload-time = "2026-01-14T12:55:33.01Z" }, - { url = "https://files.pythonhosted.org/packages/fc/b9/973455cec0a1ec592395250c474164c4a58ebf3e0651ee920fef1a2623f1/librt-0.7.8-cp313-cp313-win_arm64.whl", hash = "sha256:43d4e71b50763fcdcf64725ac680d8cfa1706c928b844794a7aa0fa9ac8e5f09", size = 43600, upload-time = "2026-01-14T12:55:34.054Z" }, - { url = "https://files.pythonhosted.org/packages/1a/73/fa8814c6ce2d49c3827829cadaa1589b0bf4391660bd4510899393a23ebc/librt-0.7.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:be927c3c94c74b05128089a955fba86501c3b544d1d300282cc1b4bd370cb418", size = 57049, upload-time = "2026-01-14T12:55:35.056Z" }, - { url = "https://files.pythonhosted.org/packages/53/fe/f6c70956da23ea235fd2e3cc16f4f0b4ebdfd72252b02d1164dd58b4e6c3/librt-0.7.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7b0803e9008c62a7ef79058233db7ff6f37a9933b8f2573c05b07ddafa226611", size = 58689, upload-time = "2026-01-14T12:55:36.078Z" }, - { url = "https://files.pythonhosted.org/packages/1f/4d/7a2481444ac5fba63050d9abe823e6bc16896f575bfc9c1e5068d516cdce/librt-0.7.8-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:79feb4d00b2a4e0e05c9c56df707934f41fcb5fe53fd9efb7549068d0495b758", size = 166808, upload-time = "2026-01-14T12:55:37.595Z" }, - { url = "https://files.pythonhosted.org/packages/ac/3c/10901d9e18639f8953f57c8986796cfbf4c1c514844a41c9197cf87cb707/librt-0.7.8-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b9122094e3f24aa759c38f46bd8863433820654927370250f460ae75488b66ea", size = 175614, upload-time = "2026-01-14T12:55:38.756Z" }, - { url = "https://files.pythonhosted.org/packages/db/01/5cbdde0951a5090a80e5ba44e6357d375048123c572a23eecfb9326993a7/librt-0.7.8-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7e03bea66af33c95ce3addf87a9bf1fcad8d33e757bc479957ddbc0e4f7207ac", size = 189955, upload-time = "2026-01-14T12:55:39.939Z" }, - { url = "https://files.pythonhosted.org/packages/6a/b4/e80528d2f4b7eaf1d437fcbd6fc6ba4cbeb3e2a0cb9ed5a79f47c7318706/librt-0.7.8-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f1ade7f31675db00b514b98f9ab9a7698c7282dad4be7492589109471852d398", size = 189370, upload-time = "2026-01-14T12:55:41.057Z" }, - { url = "https://files.pythonhosted.org/packages/c1/ab/938368f8ce31a9787ecd4becb1e795954782e4312095daf8fd22420227c8/librt-0.7.8-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a14229ac62adcf1b90a15992f1ab9c69ae8b99ffb23cb64a90878a6e8a2f5b81", size = 183224, upload-time = "2026-01-14T12:55:42.328Z" }, - { url = "https://files.pythonhosted.org/packages/3c/10/559c310e7a6e4014ac44867d359ef8238465fb499e7eb31b6bfe3e3f86f5/librt-0.7.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5bcaaf624fd24e6a0cb14beac37677f90793a96864c67c064a91458611446e83", size = 203541, upload-time = "2026-01-14T12:55:43.501Z" }, - { url = "https://files.pythonhosted.org/packages/f8/db/a0db7acdb6290c215f343835c6efda5b491bb05c3ddc675af558f50fdba3/librt-0.7.8-cp314-cp314-win32.whl", hash = "sha256:7aa7d5457b6c542ecaed79cec4ad98534373c9757383973e638ccced0f11f46d", size = 40657, upload-time = "2026-01-14T12:55:44.668Z" }, - { url = "https://files.pythonhosted.org/packages/72/e0/4f9bdc2a98a798511e81edcd6b54fe82767a715e05d1921115ac70717f6f/librt-0.7.8-cp314-cp314-win_amd64.whl", hash = "sha256:3d1322800771bee4a91f3b4bd4e49abc7d35e65166821086e5afd1e6c0d9be44", size = 46835, upload-time = "2026-01-14T12:55:45.655Z" }, - { url = "https://files.pythonhosted.org/packages/f9/3d/59c6402e3dec2719655a41ad027a7371f8e2334aa794ed11533ad5f34969/librt-0.7.8-cp314-cp314-win_arm64.whl", hash = "sha256:5363427bc6a8c3b1719f8f3845ea53553d301382928a86e8fab7984426949bce", size = 39885, upload-time = "2026-01-14T12:55:47.138Z" }, - { url = "https://files.pythonhosted.org/packages/4e/9c/2481d80950b83085fb14ba3c595db56330d21bbc7d88a19f20165f3538db/librt-0.7.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:ca916919793a77e4a98d4a1701e345d337ce53be4a16620f063191f7322ac80f", size = 59161, upload-time = "2026-01-14T12:55:48.45Z" }, - { url = "https://files.pythonhosted.org/packages/96/79/108df2cfc4e672336765d54e3ff887294c1cc36ea4335c73588875775527/librt-0.7.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:54feb7b4f2f6706bb82325e836a01be805770443e2400f706e824e91f6441dde", size = 61008, upload-time = "2026-01-14T12:55:49.527Z" }, - { url = "https://files.pythonhosted.org/packages/46/f2/30179898f9994a5637459d6e169b6abdc982012c0a4b2d4c26f50c06f911/librt-0.7.8-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:39a4c76fee41007070f872b648cc2f711f9abf9a13d0c7162478043377b52c8e", size = 187199, upload-time = "2026-01-14T12:55:50.587Z" }, - { url = "https://files.pythonhosted.org/packages/b4/da/f7563db55cebdc884f518ba3791ad033becc25ff68eb70902b1747dc0d70/librt-0.7.8-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac9c8a458245c7de80bc1b9765b177055efff5803f08e548dd4bb9ab9a8d789b", size = 198317, upload-time = "2026-01-14T12:55:51.991Z" }, - { url = "https://files.pythonhosted.org/packages/b3/6c/4289acf076ad371471fa86718c30ae353e690d3de6167f7db36f429272f1/librt-0.7.8-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95b67aa7eff150f075fda09d11f6bfb26edffd300f6ab1666759547581e8f666", size = 210334, upload-time = "2026-01-14T12:55:53.682Z" }, - { url = "https://files.pythonhosted.org/packages/4a/7f/377521ac25b78ac0a5ff44127a0360ee6d5ddd3ce7327949876a30533daa/librt-0.7.8-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:535929b6eff670c593c34ff435d5440c3096f20fa72d63444608a5aef64dd581", size = 211031, upload-time = "2026-01-14T12:55:54.827Z" }, - { url = "https://files.pythonhosted.org/packages/c5/b1/e1e96c3e20b23d00cf90f4aad48f0deb4cdfec2f0ed8380d0d85acf98bbf/librt-0.7.8-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:63937bd0f4d1cb56653dc7ae900d6c52c41f0015e25aaf9902481ee79943b33a", size = 204581, upload-time = "2026-01-14T12:55:56.811Z" }, - { url = "https://files.pythonhosted.org/packages/43/71/0f5d010e92ed9747e14bef35e91b6580533510f1e36a8a09eb79ee70b2f0/librt-0.7.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cf243da9e42d914036fd362ac3fa77d80a41cadcd11ad789b1b5eec4daaf67ca", size = 224731, upload-time = "2026-01-14T12:55:58.175Z" }, - { url = "https://files.pythonhosted.org/packages/22/f0/07fb6ab5c39a4ca9af3e37554f9d42f25c464829254d72e4ebbd81da351c/librt-0.7.8-cp314-cp314t-win32.whl", hash = "sha256:171ca3a0a06c643bd0a2f62a8944e1902c94aa8e5da4db1ea9a8daf872685365", size = 41173, upload-time = "2026-01-14T12:55:59.315Z" }, - { url = "https://files.pythonhosted.org/packages/24/d4/7e4be20993dc6a782639625bd2f97f3c66125c7aa80c82426956811cfccf/librt-0.7.8-cp314-cp314t-win_amd64.whl", hash = "sha256:445b7304145e24c60288a2f172b5ce2ca35c0f81605f5299f3fa567e189d2e32", size = 47668, upload-time = "2026-01-14T12:56:00.261Z" }, - { url = "https://files.pythonhosted.org/packages/fc/85/69f92b2a7b3c0f88ffe107c86b952b397004b5b8ea5a81da3d9c04c04422/librt-0.7.8-cp314-cp314t-win_arm64.whl", hash = "sha256:8766ece9de08527deabcd7cb1b4f1a967a385d26e33e536d6d8913db6ef74f06", size = 40550, upload-time = "2026-01-14T12:56:01.542Z" }, +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/3f/4ca7dd7819bf8ff303aca39c3c60e5320e46e766ab7f7dd627d3b9c11bdf/librt-0.8.0.tar.gz", hash = "sha256:cb74cdcbc0103fc988e04e5c58b0b31e8e5dd2babb9182b6f9490488eb36324b", size = 177306, upload-time = "2026-02-12T14:53:54.743Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/53/f3bc0c4921adb0d4a5afa0656f2c0fbe20e18e3e0295e12985b9a5dc3f55/librt-0.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:17269dd2745dbe8e42475acb28e419ad92dfa38214224b1b01020b8cac70b645", size = 66511, upload-time = "2026-02-12T14:52:30.34Z" }, + { url = "https://files.pythonhosted.org/packages/89/4b/4c96357432007c25a1b5e363045373a6c39481e49f6ba05234bb59a839c1/librt-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f4617cef654fca552f00ce5ffdf4f4b68770f18950e4246ce94629b789b92467", size = 68628, upload-time = "2026-02-12T14:52:31.491Z" }, + { url = "https://files.pythonhosted.org/packages/47/16/52d75374d1012e8fc709216b5eaa25f471370e2a2331b8be00f18670a6c7/librt-0.8.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5cb11061a736a9db45e3c1293cfcb1e3caf205912dfa085734ba750f2197ff9a", size = 198941, upload-time = "2026-02-12T14:52:32.489Z" }, + { url = "https://files.pythonhosted.org/packages/fc/11/d5dd89e5a2228567b1228d8602d896736247424484db086eea6b8010bcba/librt-0.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4bb00bd71b448f16749909b08a0ff16f58b079e2261c2e1000f2bbb2a4f0a45", size = 210009, upload-time = "2026-02-12T14:52:33.634Z" }, + { url = "https://files.pythonhosted.org/packages/49/d8/fc1a92a77c3020ee08ce2dc48aed4b42ab7c30fb43ce488d388673b0f164/librt-0.8.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95a719a049f0eefaf1952673223cf00d442952273cbd20cf2ed7ec423a0ef58d", size = 224461, upload-time = "2026-02-12T14:52:34.868Z" }, + { url = "https://files.pythonhosted.org/packages/7f/98/eb923e8b028cece924c246104aa800cf72e02d023a8ad4ca87135b05a2fe/librt-0.8.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bd32add59b58fba3439d48d6f36ac695830388e3da3e92e4fc26d2d02670d19c", size = 217538, upload-time = "2026-02-12T14:52:36.078Z" }, + { url = "https://files.pythonhosted.org/packages/fd/67/24e80ab170674a1d8ee9f9a83081dca4635519dbd0473b8321deecddb5be/librt-0.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4f764b2424cb04524ff7a486b9c391e93f93dc1bd8305b2136d25e582e99aa2f", size = 225110, upload-time = "2026-02-12T14:52:37.301Z" }, + { url = "https://files.pythonhosted.org/packages/d8/c7/6fbdcbd1a6e5243c7989c21d68ab967c153b391351174b4729e359d9977f/librt-0.8.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f04ca50e847abc486fa8f4107250566441e693779a5374ba211e96e238f298b9", size = 217758, upload-time = "2026-02-12T14:52:38.89Z" }, + { url = "https://files.pythonhosted.org/packages/4b/bd/4d6b36669db086e3d747434430073e14def032dd58ad97959bf7e2d06c67/librt-0.8.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9ab3a3475a55b89b87ffd7e6665838e8458e0b596c22e0177e0f961434ec474a", size = 218384, upload-time = "2026-02-12T14:52:40.637Z" }, + { url = "https://files.pythonhosted.org/packages/50/2d/afe966beb0a8f179b132f3e95c8dd90738a23e9ebdba10f89a3f192f9366/librt-0.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3e36a8da17134ffc29373775d88c04832f9ecfab1880470661813e6c7991ef79", size = 241187, upload-time = "2026-02-12T14:52:43.55Z" }, + { url = "https://files.pythonhosted.org/packages/02/d0/6172ea4af2b538462785ab1a68e52d5c99cfb9866a7caf00fdf388299734/librt-0.8.0-cp312-cp312-win32.whl", hash = "sha256:4eb5e06ebcc668677ed6389164f52f13f71737fc8be471101fa8b4ce77baeb0c", size = 54914, upload-time = "2026-02-12T14:52:44.676Z" }, + { url = "https://files.pythonhosted.org/packages/d4/cb/ceb6ed6175612a4337ad49fb01ef594712b934b4bc88ce8a63554832eb44/librt-0.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:0a33335eb59921e77c9acc05d0e654e4e32e45b014a4d61517897c11591094f8", size = 62020, upload-time = "2026-02-12T14:52:45.676Z" }, + { url = "https://files.pythonhosted.org/packages/f1/7e/61701acbc67da74ce06ddc7ba9483e81c70f44236b2d00f6a4bfee1aacbf/librt-0.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:24a01c13a2a9bdad20997a4443ebe6e329df063d1978bbe2ebbf637878a46d1e", size = 52443, upload-time = "2026-02-12T14:52:47.218Z" }, + { url = "https://files.pythonhosted.org/packages/6d/32/3edb0bcb4113a9c8bdcd1750663a54565d255027657a5df9d90f13ee07fa/librt-0.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7f820210e21e3a8bf8fde2ae3c3d10106d4de9ead28cbfdf6d0f0f41f5b12fa1", size = 66522, upload-time = "2026-02-12T14:52:48.219Z" }, + { url = "https://files.pythonhosted.org/packages/30/ab/e8c3d05e281f5d405ebdcc5bc8ab36df23e1a4b40ac9da8c3eb9928b72b9/librt-0.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4831c44b8919e75ca0dfb52052897c1ef59fdae19d3589893fbd068f1e41afbf", size = 68658, upload-time = "2026-02-12T14:52:50.351Z" }, + { url = "https://files.pythonhosted.org/packages/7c/d3/74a206c47b7748bbc8c43942de3ed67de4c231156e148b4f9250869593df/librt-0.8.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:88c6e75540f1f10f5e0fc5e87b4b6c290f0e90d1db8c6734f670840494764af8", size = 199287, upload-time = "2026-02-12T14:52:51.938Z" }, + { url = "https://files.pythonhosted.org/packages/fa/29/ef98a9131cf12cb95771d24e4c411fda96c89dc78b09c2de4704877ebee4/librt-0.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9646178cd794704d722306c2c920c221abbf080fede3ba539d5afdec16c46dad", size = 210293, upload-time = "2026-02-12T14:52:53.128Z" }, + { url = "https://files.pythonhosted.org/packages/5b/3e/89b4968cb08c53d4c2d8b02517081dfe4b9e07a959ec143d333d76899f6c/librt-0.8.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e1af31a710e17891d9adf0dbd9a5fcd94901a3922a96499abdbf7ce658f4e01", size = 224801, upload-time = "2026-02-12T14:52:54.367Z" }, + { url = "https://files.pythonhosted.org/packages/6d/28/f38526d501f9513f8b48d78e6be4a241e15dd4b000056dc8b3f06ee9ce5d/librt-0.8.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:507e94f4bec00b2f590fbe55f48cd518a208e2474a3b90a60aa8f29136ddbada", size = 218090, upload-time = "2026-02-12T14:52:55.758Z" }, + { url = "https://files.pythonhosted.org/packages/02/ec/64e29887c5009c24dc9c397116c680caffc50286f62bd99c39e3875a2854/librt-0.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f1178e0de0c271231a660fbef9be6acdfa1d596803464706862bef6644cc1cae", size = 225483, upload-time = "2026-02-12T14:52:57.375Z" }, + { url = "https://files.pythonhosted.org/packages/ee/16/7850bdbc9f1a32d3feff2708d90c56fc0490b13f1012e438532781aa598c/librt-0.8.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:71fc517efc14f75c2f74b1f0a5d5eb4a8e06aa135c34d18eaf3522f4a53cd62d", size = 218226, upload-time = "2026-02-12T14:52:58.534Z" }, + { url = "https://files.pythonhosted.org/packages/1c/4a/166bffc992d65ddefa7c47052010a87c059b44a458ebaf8f5eba384b0533/librt-0.8.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:0583aef7e9a720dd40f26a2ad5a1bf2ccbb90059dac2b32ac516df232c701db3", size = 218755, upload-time = "2026-02-12T14:52:59.701Z" }, + { url = "https://files.pythonhosted.org/packages/da/5d/9aeee038bcc72a9cfaaee934463fe9280a73c5440d36bd3175069d2cb97b/librt-0.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5d0f76fc73480d42285c609c0ea74d79856c160fa828ff9aceab574ea4ecfd7b", size = 241617, upload-time = "2026-02-12T14:53:00.966Z" }, + { url = "https://files.pythonhosted.org/packages/64/ff/2bec6b0296b9d0402aa6ec8540aa19ebcb875d669c37800cb43d10d9c3a3/librt-0.8.0-cp313-cp313-win32.whl", hash = "sha256:e79dbc8f57de360f0ed987dc7de7be814b4803ef0e8fc6d3ff86e16798c99935", size = 54966, upload-time = "2026-02-12T14:53:02.042Z" }, + { url = "https://files.pythonhosted.org/packages/08/8d/bf44633b0182996b2c7ea69a03a5c529683fa1f6b8e45c03fe874ff40d56/librt-0.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:25b3e667cbfc9000c4740b282df599ebd91dbdcc1aa6785050e4c1d6be5329ab", size = 62000, upload-time = "2026-02-12T14:53:03.822Z" }, + { url = "https://files.pythonhosted.org/packages/5c/fd/c6472b8e0eac0925001f75e366cf5500bcb975357a65ef1f6b5749389d3a/librt-0.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:e9a3a38eb4134ad33122a6d575e6324831f930a771d951a15ce232e0237412c2", size = 52496, upload-time = "2026-02-12T14:53:04.889Z" }, + { url = "https://files.pythonhosted.org/packages/e0/13/79ebfe30cd273d7c0ce37a5f14dc489c5fb8b722a008983db2cfd57270bb/librt-0.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:421765e8c6b18e64d21c8ead315708a56fc24f44075059702e421d164575fdda", size = 66078, upload-time = "2026-02-12T14:53:06.085Z" }, + { url = "https://files.pythonhosted.org/packages/4b/8f/d11eca40b62a8d5e759239a80636386ef88adecb10d1a050b38cc0da9f9e/librt-0.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:48f84830a8f8ad7918afd743fd7c4eb558728bceab7b0e38fd5a5cf78206a556", size = 68309, upload-time = "2026-02-12T14:53:07.121Z" }, + { url = "https://files.pythonhosted.org/packages/9c/b4/f12ee70a3596db40ff3c88ec9eaa4e323f3b92f77505b4d900746706ec6a/librt-0.8.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9f09d4884f882baa39a7e36bbf3eae124c4ca2a223efb91e567381d1c55c6b06", size = 196804, upload-time = "2026-02-12T14:53:08.164Z" }, + { url = "https://files.pythonhosted.org/packages/8b/7e/70dbbdc0271fd626abe1671ad117bcd61a9a88cdc6a10ccfbfc703db1873/librt-0.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:693697133c3b32aa9b27f040e3691be210e9ac4d905061859a9ed519b1d5a376", size = 206915, upload-time = "2026-02-12T14:53:09.333Z" }, + { url = "https://files.pythonhosted.org/packages/79/13/6b9e05a635d4327608d06b3c1702166e3b3e78315846373446cf90d7b0bf/librt-0.8.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5512aae4648152abaf4d48b59890503fcbe86e85abc12fb9b096fe948bdd816", size = 221200, upload-time = "2026-02-12T14:53:10.68Z" }, + { url = "https://files.pythonhosted.org/packages/35/6c/e19a3ac53e9414de43a73d7507d2d766cd22d8ca763d29a4e072d628db42/librt-0.8.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:995d24caa6bbb34bcdd4a41df98ac6d1af637cfa8975cb0790e47d6623e70e3e", size = 214640, upload-time = "2026-02-12T14:53:12.342Z" }, + { url = "https://files.pythonhosted.org/packages/30/f0/23a78464788619e8c70f090cfd099cce4973eed142c4dccb99fc322283fd/librt-0.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b9aef96d7593584e31ef6ac1eb9775355b0099fee7651fae3a15bc8657b67b52", size = 221980, upload-time = "2026-02-12T14:53:13.603Z" }, + { url = "https://files.pythonhosted.org/packages/03/32/38e21420c5d7aa8a8bd2c7a7d5252ab174a5a8aaec8b5551968979b747bf/librt-0.8.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:4f6e975377fbc4c9567cb33ea9ab826031b6c7ec0515bfae66a4fb110d40d6da", size = 215146, upload-time = "2026-02-12T14:53:14.8Z" }, + { url = "https://files.pythonhosted.org/packages/bb/00/bd9ecf38b1824c25240b3ad982fb62c80f0a969e6679091ba2b3afb2b510/librt-0.8.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:daae5e955764be8fd70a93e9e5133c75297f8bce1e802e1d3683b98f77e1c5ab", size = 215203, upload-time = "2026-02-12T14:53:16.087Z" }, + { url = "https://files.pythonhosted.org/packages/b9/60/7559bcc5279d37810b98d4a52616febd7b8eef04391714fd6bdf629598b1/librt-0.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7bd68cebf3131bb920d5984f75fe302d758db33264e44b45ad139385662d7bc3", size = 237937, upload-time = "2026-02-12T14:53:17.236Z" }, + { url = "https://files.pythonhosted.org/packages/41/cc/be3e7da88f1abbe2642672af1dc00a0bccece11ca60241b1883f3018d8d5/librt-0.8.0-cp314-cp314-win32.whl", hash = "sha256:1e6811cac1dcb27ca4c74e0ca4a5917a8e06db0d8408d30daee3a41724bfde7a", size = 50685, upload-time = "2026-02-12T14:53:18.888Z" }, + { url = "https://files.pythonhosted.org/packages/38/27/e381d0df182a8f61ef1f6025d8b138b3318cc9d18ad4d5f47c3bf7492523/librt-0.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:178707cda89d910c3b28bf5aa5f69d3d4734e0f6ae102f753ad79edef83a83c7", size = 57872, upload-time = "2026-02-12T14:53:19.942Z" }, + { url = "https://files.pythonhosted.org/packages/c5/0c/ca9dfdf00554a44dea7d555001248269a4bab569e1590a91391feb863fa4/librt-0.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:3e8b77b5f54d0937b26512774916041756c9eb3e66f1031971e626eea49d0bf4", size = 48056, upload-time = "2026-02-12T14:53:21.473Z" }, + { url = "https://files.pythonhosted.org/packages/f2/ed/6cc9c4ad24f90c8e782193c7b4a857408fd49540800613d1356c63567d7b/librt-0.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:789911e8fa40a2e82f41120c936b1965f3213c67f5a483fc5a41f5839a05dcbb", size = 68307, upload-time = "2026-02-12T14:53:22.498Z" }, + { url = "https://files.pythonhosted.org/packages/84/d8/0e94292c6b3e00b6eeea39dd44d5703d1ec29b6dafce7eea19dc8f1aedbd/librt-0.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2b37437e7e4ef5e15a297b36ba9e577f73e29564131d86dd75875705e97402b5", size = 70999, upload-time = "2026-02-12T14:53:23.603Z" }, + { url = "https://files.pythonhosted.org/packages/0e/f4/6be1afcbdeedbdbbf54a7c9d73ad43e1bf36897cebf3978308cd64922e02/librt-0.8.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:671a6152edf3b924d98a5ed5e6982ec9cb30894085482acadce0975f031d4c5c", size = 220782, upload-time = "2026-02-12T14:53:25.133Z" }, + { url = "https://files.pythonhosted.org/packages/f0/8d/f306e8caa93cfaf5c6c9e0d940908d75dc6af4fd856baa5535c922ee02b1/librt-0.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8992ca186a1678107b0af3d0c9303d8c7305981b9914989b9788319ed4d89546", size = 235420, upload-time = "2026-02-12T14:53:27.047Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f2/65d86bd462e9c351326564ca805e8457442149f348496e25ccd94583ffa2/librt-0.8.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:001e5330093d887b8b9165823eca6c5c4db183fe4edea4fdc0680bbac5f46944", size = 246452, upload-time = "2026-02-12T14:53:28.341Z" }, + { url = "https://files.pythonhosted.org/packages/03/94/39c88b503b4cb3fcbdeb3caa29672b6b44ebee8dcc8a54d49839ac280f3f/librt-0.8.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d920789eca7ef71df7f31fd547ec0d3002e04d77f30ba6881e08a630e7b2c30e", size = 238891, upload-time = "2026-02-12T14:53:29.625Z" }, + { url = "https://files.pythonhosted.org/packages/e3/c6/6c0d68190893d01b71b9569b07a1c811e280c0065a791249921c83dc0290/librt-0.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:82fb4602d1b3e303a58bfe6165992b5a78d823ec646445356c332cd5f5bbaa61", size = 250249, upload-time = "2026-02-12T14:53:30.93Z" }, + { url = "https://files.pythonhosted.org/packages/52/7a/f715ed9e039035d0ea637579c3c0155ab3709a7046bc408c0fb05d337121/librt-0.8.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:4d3e38797eb482485b486898f89415a6ab163bc291476bd95712e42cf4383c05", size = 240642, upload-time = "2026-02-12T14:53:32.174Z" }, + { url = "https://files.pythonhosted.org/packages/c2/3c/609000a333debf5992efe087edc6467c1fdbdddca5b610355569bbea9589/librt-0.8.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:a905091a13e0884701226860836d0386b88c72ce5c2fdfba6618e14c72be9f25", size = 239621, upload-time = "2026-02-12T14:53:33.39Z" }, + { url = "https://files.pythonhosted.org/packages/b9/df/87b0673d5c395a8f34f38569c116c93142d4dc7e04af2510620772d6bd4f/librt-0.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:375eda7acfce1f15f5ed56cfc960669eefa1ec8732e3e9087c3c4c3f2066759c", size = 262986, upload-time = "2026-02-12T14:53:34.617Z" }, + { url = "https://files.pythonhosted.org/packages/09/7f/6bbbe9dcda649684773aaea78b87fff4d7e59550fbc2877faa83612087a3/librt-0.8.0-cp314-cp314t-win32.whl", hash = "sha256:2ccdd20d9a72c562ffb73098ac411de351b53a6fbb3390903b2d33078ef90447", size = 51328, upload-time = "2026-02-12T14:53:36.15Z" }, + { url = "https://files.pythonhosted.org/packages/bb/f3/e1981ab6fa9b41be0396648b5850267888a752d025313a9e929c4856208e/librt-0.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:25e82d920d4d62ad741592fcf8d0f3bda0e3fc388a184cb7d2f566c681c5f7b9", size = 58719, upload-time = "2026-02-12T14:53:37.183Z" }, + { url = "https://files.pythonhosted.org/packages/94/d1/433b3c06e78f23486fe4fdd19bc134657eb30997d2054b0dbf52bbf3382e/librt-0.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:92249938ab744a5890580d3cb2b22042f0dce71cdaa7c1369823df62bedf7cbc", size = 48753, upload-time = "2026-02-12T14:53:38.539Z" }, ] [[package]] name = "markdown" -version = "3.10.1" +version = "3.10.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b7/b1/af95bcae8549f1f3fd70faacb29075826a0d689a27f232e8cee315efa053/markdown-3.10.1.tar.gz", hash = "sha256:1c19c10bd5c14ac948c53d0d762a04e2fa35a6d58a6b7b1e6bfcbe6fefc0001a", size = 365402, upload-time = "2026-01-21T18:09:28.206Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2b/f4/69fa6ed85ae003c2378ffa8f6d2e3234662abd02c10d216c0ba96081a238/markdown-3.10.2.tar.gz", hash = "sha256:994d51325d25ad8aa7ce4ebaec003febcce822c3f8c911e3b17c52f7f589f950", size = 368805, upload-time = "2026-02-09T14:57:26.942Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/59/1b/6ef961f543593969d25b2afe57a3564200280528caa9bd1082eecdd7b3bc/markdown-3.10.1-py3-none-any.whl", hash = "sha256:867d788939fe33e4b736426f5b9f651ad0c0ae0ecf89df0ca5d1176c70812fe3", size = 107684, upload-time = "2026-01-21T18:09:27.203Z" }, + { url = "https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl", hash = "sha256:e91464b71ae3ee7afd3017d9f358ef0baf158fd9a298db92f1d4761133824c36", size = 108180, upload-time = "2026-02-09T14:57:25.787Z" }, ] [[package]] @@ -671,16 +709,16 @@ wheels = [ [[package]] name = "mkdocs-autorefs" -version = "1.4.3" +version = "1.4.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown" }, { name = "markupsafe" }, { name = "mkdocs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/51/fa/9124cd63d822e2bcbea1450ae68cdc3faf3655c69b455f3a7ed36ce6c628/mkdocs_autorefs-1.4.3.tar.gz", hash = "sha256:beee715b254455c4aa93b6ef3c67579c399ca092259cc41b7d9342573ff1fc75", size = 55425, upload-time = "2025-08-26T14:23:17.223Z" } +sdist = { url = "https://files.pythonhosted.org/packages/52/c0/f641843de3f612a6b48253f39244165acff36657a91cc903633d456ae1ac/mkdocs_autorefs-1.4.4.tar.gz", hash = "sha256:d54a284f27a7346b9c38f1f852177940c222da508e66edc816a0fa55fc6da197", size = 56588, upload-time = "2026-02-10T15:23:55.105Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/4d/7123b6fa2278000688ebd338e2a06d16870aaf9eceae6ba047ea05f92df1/mkdocs_autorefs-1.4.3-py3-none-any.whl", hash = "sha256:469d85eb3114801d08e9cc55d102b3ba65917a869b893403b8987b601cf55dc9", size = 25034, upload-time = "2025-08-26T14:23:15.906Z" }, + { url = "https://files.pythonhosted.org/packages/28/de/a3e710469772c6a89595fc52816da05c1e164b4c866a89e3cb82fb1b67c5/mkdocs_autorefs-1.4.4-py3-none-any.whl", hash = "sha256:834ef5408d827071ad1bc69e0f39704fa34c7fc05bc8e1c72b227dfdc5c76089", size = 25530, upload-time = "2026-02-10T15:23:53.817Z" }, ] [[package]] @@ -730,7 +768,7 @@ wheels = [ [[package]] name = "mkdocstrings" -version = "1.0.2" +version = "1.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jinja2" }, @@ -740,9 +778,9 @@ dependencies = [ { name = "mkdocs-autorefs" }, { name = "pymdown-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/4d/1ca8a9432579184599714aaeb36591414cc3d3bfd9d494f6db540c995ae4/mkdocstrings-1.0.2.tar.gz", hash = "sha256:48edd0ccbcb9e30a3121684e165261a9d6af4d63385fc4f39a54a49ac3b32ea8", size = 101048, upload-time = "2026-01-24T15:57:25.735Z" } +sdist = { url = "https://files.pythonhosted.org/packages/46/62/0dfc5719514115bf1781f44b1d7f2a0923fcc01e9c5d7990e48a05c9ae5d/mkdocstrings-1.0.3.tar.gz", hash = "sha256:ab670f55040722b49bb45865b2e93b824450fb4aef638b00d7acb493a9020434", size = 100946, upload-time = "2026-02-07T14:31:40.973Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/57/32/407a9a5fdd7d8ecb4af8d830b9bcdf47ea68f916869b3f44bac31f081250/mkdocstrings-1.0.2-py3-none-any.whl", hash = "sha256:41897815a8026c3634fe5d51472c3a569f92ded0ad8c7a640550873eea3b6817", size = 35443, upload-time = "2026-01-24T15:57:23.933Z" }, + { url = "https://files.pythonhosted.org/packages/04/41/1cf02e3df279d2dd846a1bf235a928254eba9006dd22b4a14caa71aed0f7/mkdocstrings-1.0.3-py3-none-any.whl", hash = "sha256:0d66d18430c2201dc7fe85134277382baaa15e6b30979f3f3bdbabd6dbdb6046", size = 35523, upload-time = "2026-02-07T14:31:39.27Z" }, ] [package.optional-dependencies] @@ -752,16 +790,16 @@ python = [ [[package]] name = "mkdocstrings-python" -version = "2.0.1" +version = "2.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "griffe" }, { name = "mkdocs-autorefs" }, { name = "mkdocstrings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/24/75/d30af27a2906f00eb90143470272376d728521997800f5dce5b340ba35bc/mkdocstrings_python-2.0.1.tar.gz", hash = "sha256:843a562221e6a471fefdd4b45cc6c22d2607ccbad632879234fa9692e9cf7732", size = 199345, upload-time = "2025-12-03T14:26:11.755Z" } +sdist = { url = "https://files.pythonhosted.org/packages/25/84/78243847ad9d5c21d30a2842720425b17e880d99dfe824dee11d6b2149b4/mkdocstrings_python-2.0.2.tar.gz", hash = "sha256:4a32ccfc4b8d29639864698e81cfeb04137bce76bb9f3c251040f55d4b6e1ad8", size = 199124, upload-time = "2026-02-09T15:12:01.543Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/06/c5f8deba7d2cbdfa7967a716ae801aa9ca5f734b8f54fd473ef77a088dbe/mkdocstrings_python-2.0.1-py3-none-any.whl", hash = "sha256:66ecff45c5f8b71bf174e11d49afc845c2dfc7fc0ab17a86b6b337e0f24d8d90", size = 105055, upload-time = "2025-12-03T14:26:10.184Z" }, + { url = "https://files.pythonhosted.org/packages/f3/31/7ee938abbde2322e553a2cb5f604cdd1e4728e08bba39c7ee6fae9af840b/mkdocstrings_python-2.0.2-py3-none-any.whl", hash = "sha256:31241c0f43d85a69306d704d5725786015510ea3f3c4bdfdb5a5731d83cdc2b0", size = 104900, upload-time = "2026-02-09T15:12:00.166Z" }, ] [[package]] @@ -934,11 +972,11 @@ wheels = [ [[package]] name = "platformdirs" -version = "4.5.1" +version = "4.9.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cf/86/0248f086a84f01b37aaec0fa567b397df1a119f73c16f6c7a9aac73ea309/platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda", size = 21715, upload-time = "2025-12-05T13:52:58.638Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/d5/763666321efaded11112de8b7a7f2273dd8d1e205168e73c334e54b0ab9a/platformdirs-4.9.1.tar.gz", hash = "sha256:f310f16e89c4e29117805d8328f7c10876eeff36c94eac879532812110f7d39f", size = 28392, upload-time = "2026-02-14T21:02:44.973Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" }, + { url = "https://files.pythonhosted.org/packages/70/77/e8c95e95f1d4cdd88c90a96e31980df7e709e51059fac150046ad67fac63/platformdirs-4.9.1-py3-none-any.whl", hash = "sha256:61d8b967d34791c162d30d60737369cbbd77debad5b981c4bfda1842e71e0d66", size = 21307, upload-time = "2026-02-14T21:02:43.492Z" }, ] [[package]] @@ -952,26 +990,26 @@ wheels = [ [[package]] name = "prek" -version = "0.3.1" +version = "0.3.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/76/62/4b91c8a343e21fcefabc569a91d08cf8756c554332521af78294acef7c27/prek-0.3.1.tar.gz", hash = "sha256:45abc4ffd3cb2d39c478f47e92e88f050e5a4b7a20915d78e54b1a3d3619ebe4", size = 323141, upload-time = "2026-01-31T13:25:58.128Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/f5/ee52def928dd1355c20bcfcf765e1e61434635c33f3075e848e7b83a157b/prek-0.3.2.tar.gz", hash = "sha256:dce0074ff1a21290748ca567b4bda7553ee305a8c7b14d737e6c58364a499364", size = 334229, upload-time = "2026-02-06T13:49:47.539Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/c1/e0e545048e4190245fb4ae375d67684108518f3c69b67b81d62e1cd855c6/prek-0.3.1-py3-none-linux_armv6l.whl", hash = "sha256:1f77d0845cc63cad9c447f7f7d554c1ad188d07dbe02741823d20d58c7312eaf", size = 4285460, upload-time = "2026-01-31T13:25:42.066Z" }, - { url = "https://files.pythonhosted.org/packages/10/fe/7636d10e2dafdf2a4a927c989f32ce3f08e99d62ebad7563f0272e74b7f4/prek-0.3.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e21142300d139e8c7f3970dd8aa66391cb43cd17c0c4ee65ff1af48856bb6a4b", size = 4287085, upload-time = "2026-01-31T13:25:40.193Z" }, - { url = "https://files.pythonhosted.org/packages/a3/7f/62ed57340071e04c02057d64276ec3986baca3ad4759523e2f433dc9be55/prek-0.3.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c09391de7d1994f9402c46cb31671800ea309b1668d839614965706206da3655", size = 3936188, upload-time = "2026-01-31T13:25:47.314Z" }, - { url = "https://files.pythonhosted.org/packages/6b/17/cb24f462c255f76d130ca110f4fcec09b041c3c770e43960cc3fc9dcc9ce/prek-0.3.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:a0b0a012ef6ef28dee019cf81a95c5759b2c03287c32c1f2adcb5f5fb097138e", size = 4275214, upload-time = "2026-01-31T13:25:38.053Z" }, - { url = "https://files.pythonhosted.org/packages/f2/85/db155b59d73cf972c8467e4d95def635f9976d5fcbcc790a4bbe9d2e049a/prek-0.3.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f4a0e40785d39b8feae0d7ecf5534789811a2614114ab47f4e344a2ebd75ac10", size = 4197982, upload-time = "2026-01-31T13:25:50.034Z" }, - { url = "https://files.pythonhosted.org/packages/06/cf/d35c32436692928a9ca53eed3334e30148a60f0faa33c42e8d11b6028fa6/prek-0.3.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac5c2f5e377e3cc5a5ea191deb8255a5823fbaa01b424417fe18ff12c7c800f3", size = 4458572, upload-time = "2026-01-31T13:25:51.46Z" }, - { url = "https://files.pythonhosted.org/packages/b4/c0/eb36fecb21fe30baa72fb87ccf3a791c32932786c287f95f8972402e9245/prek-0.3.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fe70e97f4dfca57ce142caecd77b90a435abd1c855f9e96041078415d80e89a", size = 4999230, upload-time = "2026-01-31T13:25:44.055Z" }, - { url = "https://files.pythonhosted.org/packages/e4/f3/ad1a25ea16320e6acd1fedd6bd96a0d22526f5132d9b5adc045996ccca4c/prek-0.3.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b28e921d893771bdd7533cd94d46a10e0cf2855c5e6bf6809b598b5e45baa73", size = 4510376, upload-time = "2026-01-31T13:25:48.563Z" }, - { url = "https://files.pythonhosted.org/packages/39/b7/91afdd24be808ccf3b9119f4cf2bd6d02e30683143a62a08f432a3435861/prek-0.3.1-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:555610a53c4541976f4fe8602177ecd7a86a931dcb90a89e5826cfc4a6c8f2cb", size = 4273229, upload-time = "2026-01-31T13:25:56.362Z" }, - { url = "https://files.pythonhosted.org/packages/5a/bb/636c77c5c9fc5eadcc2af975a95b48eeeff2dc833021e222b0e9479b9b47/prek-0.3.1-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:663a15a31b705db5d01a1c9eb28c6ea417628e6cb68de2dc7b3016ca2f959a99", size = 4301166, upload-time = "2026-01-31T13:25:36.281Z" }, - { url = "https://files.pythonhosted.org/packages/4e/cf/c928a36173e71b21b252943404a5b3d1ddc1f08c9e0f1d7282a2c62c7325/prek-0.3.1-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:1d03fb5fa37177dc37ccbe474252473adcbde63287a63e9fa3d5745470f95bd8", size = 4188473, upload-time = "2026-01-31T13:25:53.341Z" }, - { url = "https://files.pythonhosted.org/packages/98/4c/af8f6a40cb094e88225514b89e8ae05ac69fc479d6b500e4b984f9ef8ae3/prek-0.3.1-py3-none-musllinux_1_1_i686.whl", hash = "sha256:3e20a5b704c06944dca9555a39f1de3622edc8ed2becaf8b3564925d1b7c1c0d", size = 4342239, upload-time = "2026-01-31T13:25:55.179Z" }, - { url = "https://files.pythonhosted.org/packages/b7/ba/6b0f725c0cf96182ab9622b4d122a01f04de9b2b6e4a6516874390218510/prek-0.3.1-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:6889acf0c9b0dd7b9cd3510ec36af10a739826d2b9de1e2d021ae6a9f130959a", size = 4618674, upload-time = "2026-01-31T13:25:59.175Z" }, - { url = "https://files.pythonhosted.org/packages/d8/49/caa320893640c9e72ed3d3e2bab7959faba54cefeea09be18c33d5f75baf/prek-0.3.1-py3-none-win32.whl", hash = "sha256:cc62a4bff79ed835d448098f0667c1a91915cec9cfac6c6246b675f0da46eded", size = 3928699, upload-time = "2026-01-31T13:25:33.168Z" }, - { url = "https://files.pythonhosted.org/packages/59/19/15907abe245ae9a120abcebb0c50c6d456ba719eb640f7c57e4f5b2f00e3/prek-0.3.1-py3-none-win_amd64.whl", hash = "sha256:3515140def20bab85e53585b0beb90d894ff2915d2fdb4451b6a4588e16516d8", size = 4296106, upload-time = "2026-01-31T13:25:45.606Z" }, - { url = "https://files.pythonhosted.org/packages/a6/5e/9b994b5de36d6aa5caaf09a018d8fe4820db46e4da577c2fd7a1e176b56c/prek-0.3.1-py3-none-win_arm64.whl", hash = "sha256:cfa58365eb36753cff684dc3b00196c1163bb135fe72c6a1c6ebb1a179f5dbdf", size = 4021714, upload-time = "2026-01-31T13:25:34.993Z" }, + { url = "https://files.pythonhosted.org/packages/76/69/70a5fc881290a63910494df2677c0fb241d27cfaa435bbcd0de5cd2e2443/prek-0.3.2-py3-none-linux_armv6l.whl", hash = "sha256:4f352f9c3fc98aeed4c8b2ec4dbf16fc386e45eea163c44d67e5571489bd8e6f", size = 4614960, upload-time = "2026-02-06T13:50:05.818Z" }, + { url = "https://files.pythonhosted.org/packages/c0/15/a82d5d32a2207ccae5d86ea9e44f2b93531ed000faf83a253e8d1108e026/prek-0.3.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:4a000cfbc3a6ec7d424f8be3c3e69ccd595448197f92daac8652382d0acc2593", size = 4622889, upload-time = "2026-02-06T13:49:53.662Z" }, + { url = "https://files.pythonhosted.org/packages/89/75/ea833b58a12741397017baef9b66a6e443bfa8286ecbd645d14111446280/prek-0.3.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5436bdc2702cbd7bcf9e355564ae66f8131211e65fefae54665a94a07c3d450a", size = 4239653, upload-time = "2026-02-06T13:50:02.88Z" }, + { url = "https://files.pythonhosted.org/packages/10/b4/d9c3885987afac6e20df4cb7db14e3b0d5a08a77ae4916488254ebac4d0b/prek-0.3.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:0161b5f584f9e7f416d6cf40a17b98f17953050ff8d8350ec60f20fe966b86b6", size = 4595101, upload-time = "2026-02-06T13:49:49.813Z" }, + { url = "https://files.pythonhosted.org/packages/21/a6/1a06473ed83dbc898de22838abdb13954e2583ce229f857f61828384634c/prek-0.3.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4e641e8533bca38797eebb49aa89ed0e8db0e61225943b27008c257e3af4d631", size = 4521978, upload-time = "2026-02-06T13:49:41.266Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5e/c38390d5612e6d86b32151c1d2fdab74a57913473193591f0eb00c894c21/prek-0.3.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfca1810d49d3f9ef37599c958c4e716bc19a1d78a7e88cbdcb332e0b008994f", size = 4829108, upload-time = "2026-02-06T13:49:44.598Z" }, + { url = "https://files.pythonhosted.org/packages/80/a6/cecce2ab623747ff65ed990bb0d95fa38449ee19b348234862acf9392fff/prek-0.3.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d69d754299a95a85dc20196f633232f306bee7e7c8cba61791f49ce70404ec", size = 5357520, upload-time = "2026-02-06T13:49:48.512Z" }, + { url = "https://files.pythonhosted.org/packages/a5/18/d6bcb29501514023c76d55d5cd03bdbc037737c8de8b6bc41cdebfb1682c/prek-0.3.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:539dcb90ad9b20837968539855df6a29493b328a1ae87641560768eed4f313b0", size = 4852635, upload-time = "2026-02-06T13:49:58.347Z" }, + { url = "https://files.pythonhosted.org/packages/1b/0a/ae46f34ba27ba87aea5c9ad4ac9cd3e07e014fd5079ae079c84198f62118/prek-0.3.2-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:1998db3d0cbe243984736c82232be51318f9192e2433919a6b1c5790f600b5fd", size = 4599484, upload-time = "2026-02-06T13:49:43.296Z" }, + { url = "https://files.pythonhosted.org/packages/1a/a9/73bfb5b3f7c3583f9b0d431924873928705cdef6abb3d0461c37254a681b/prek-0.3.2-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:07ab237a5415a3e8c0db54de9d63899bcd947624bdd8820d26f12e65f8d19eb7", size = 4657694, upload-time = "2026-02-06T13:50:01.074Z" }, + { url = "https://files.pythonhosted.org/packages/a7/bc/0994bc176e1a80110fad3babce2c98b0ac4007630774c9e18fc200a34781/prek-0.3.2-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:0ced19701d69c14a08125f14a5dd03945982edf59e793c73a95caf4697a7ac30", size = 4509337, upload-time = "2026-02-06T13:49:54.891Z" }, + { url = "https://files.pythonhosted.org/packages/f9/13/e73f85f65ba8f626468e5d1694ab3763111513da08e0074517f40238c061/prek-0.3.2-py3-none-musllinux_1_1_i686.whl", hash = "sha256:ffb28189f976fa111e770ee94e4f298add307714568fb7d610c8a7095cb1ce59", size = 4697350, upload-time = "2026-02-06T13:50:04.526Z" }, + { url = "https://files.pythonhosted.org/packages/14/47/98c46dcd580305b9960252a4eb966f1a7b1035c55c363f378d85662ba400/prek-0.3.2-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:f63134b3eea14421789a7335d86f99aee277cb520427196f2923b9260c60e5c5", size = 4955860, upload-time = "2026-02-06T13:49:56.581Z" }, + { url = "https://files.pythonhosted.org/packages/73/42/1bb4bba3ff47897df11e9dfd774027cdfa135482c961a54e079af0faf45a/prek-0.3.2-py3-none-win32.whl", hash = "sha256:58c806bd1344becd480ef5a5ba348846cc000af0e1fbe854fef91181a2e06461", size = 4267619, upload-time = "2026-02-06T13:49:39.503Z" }, + { url = "https://files.pythonhosted.org/packages/97/11/6665f47a7c350d83de17403c90bbf7a762ef50876ece456a86f64f46fbfb/prek-0.3.2-py3-none-win_amd64.whl", hash = "sha256:70114b48e9eb8048b2c11b4c7715ce618529c6af71acc84dd8877871a2ef71a6", size = 4624324, upload-time = "2026-02-06T13:49:45.922Z" }, + { url = "https://files.pythonhosted.org/packages/22/e7/740997ca82574d03426f897fd88afe3fc8a7306b8c7ea342a8bc1c538488/prek-0.3.2-py3-none-win_arm64.whl", hash = "sha256:9144d176d0daa2469a25c303ef6f6fa95a8df015eb275232f5cb53551ecefef0", size = 4336008, upload-time = "2026-02-06T13:49:52.27Z" }, ] [[package]] @@ -1314,28 +1352,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.14.14" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2e/06/f71e3a86b2df0dfa2d2f72195941cd09b44f87711cb7fa5193732cb9a5fc/ruff-0.14.14.tar.gz", hash = "sha256:2d0f819c9a90205f3a867dbbd0be083bee9912e170fd7d9704cc8ae45824896b", size = 4515732, upload-time = "2026-01-22T22:30:17.527Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/89/20a12e97bc6b9f9f68343952da08a8099c57237aef953a56b82711d55edd/ruff-0.14.14-py3-none-linux_armv6l.whl", hash = "sha256:7cfe36b56e8489dee8fbc777c61959f60ec0f1f11817e8f2415f429552846aed", size = 10467650, upload-time = "2026-01-22T22:30:08.578Z" }, - { url = "https://files.pythonhosted.org/packages/a3/b1/c5de3fd2d5a831fcae21beda5e3589c0ba67eec8202e992388e4b17a6040/ruff-0.14.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6006a0082336e7920b9573ef8a7f52eec837add1265cc74e04ea8a4368cd704c", size = 10883245, upload-time = "2026-01-22T22:30:04.155Z" }, - { url = "https://files.pythonhosted.org/packages/b8/7c/3c1db59a10e7490f8f6f8559d1db8636cbb13dccebf18686f4e3c9d7c772/ruff-0.14.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:026c1d25996818f0bf498636686199d9bd0d9d6341c9c2c3b62e2a0198b758de", size = 10231273, upload-time = "2026-01-22T22:30:34.642Z" }, - { url = "https://files.pythonhosted.org/packages/a1/6e/5e0e0d9674be0f8581d1f5e0f0a04761203affce3232c1a1189d0e3b4dad/ruff-0.14.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f666445819d31210b71e0a6d1c01e24447a20b85458eea25a25fe8142210ae0e", size = 10585753, upload-time = "2026-01-22T22:30:31.781Z" }, - { url = "https://files.pythonhosted.org/packages/23/09/754ab09f46ff1884d422dc26d59ba18b4e5d355be147721bb2518aa2a014/ruff-0.14.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c0f18b922c6d2ff9a5e6c3ee16259adc513ca775bcf82c67ebab7cbd9da5bc8", size = 10286052, upload-time = "2026-01-22T22:30:24.827Z" }, - { url = "https://files.pythonhosted.org/packages/c8/cc/e71f88dd2a12afb5f50733851729d6b571a7c3a35bfdb16c3035132675a0/ruff-0.14.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1629e67489c2dea43e8658c3dba659edbfd87361624b4040d1df04c9740ae906", size = 11043637, upload-time = "2026-01-22T22:30:13.239Z" }, - { url = "https://files.pythonhosted.org/packages/67/b2/397245026352494497dac935d7f00f1468c03a23a0c5db6ad8fc49ca3fb2/ruff-0.14.14-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:27493a2131ea0f899057d49d303e4292b2cae2bb57253c1ed1f256fbcd1da480", size = 12194761, upload-time = "2026-01-22T22:30:22.542Z" }, - { url = "https://files.pythonhosted.org/packages/5b/06/06ef271459f778323112c51b7587ce85230785cd64e91772034ddb88f200/ruff-0.14.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01ff589aab3f5b539e35db38425da31a57521efd1e4ad1ae08fc34dbe30bd7df", size = 12005701, upload-time = "2026-01-22T22:30:20.499Z" }, - { url = "https://files.pythonhosted.org/packages/41/d6/99364514541cf811ccc5ac44362f88df66373e9fec1b9d1c4cc830593fe7/ruff-0.14.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc12d74eef0f29f51775f5b755913eb523546b88e2d733e1d701fe65144e89b", size = 11282455, upload-time = "2026-01-22T22:29:59.679Z" }, - { url = "https://files.pythonhosted.org/packages/ca/71/37daa46f89475f8582b7762ecd2722492df26421714a33e72ccc9a84d7a5/ruff-0.14.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb8481604b7a9e75eff53772496201690ce2687067e038b3cc31aaf16aa0b974", size = 11215882, upload-time = "2026-01-22T22:29:57.032Z" }, - { url = "https://files.pythonhosted.org/packages/2c/10/a31f86169ec91c0705e618443ee74ede0bdd94da0a57b28e72db68b2dbac/ruff-0.14.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:14649acb1cf7b5d2d283ebd2f58d56b75836ed8c6f329664fa91cdea19e76e66", size = 11180549, upload-time = "2026-01-22T22:30:27.175Z" }, - { url = "https://files.pythonhosted.org/packages/fd/1e/c723f20536b5163adf79bdd10c5f093414293cdf567eed9bdb7b83940f3f/ruff-0.14.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e8058d2145566510790eab4e2fad186002e288dec5e0d343a92fe7b0bc1b3e13", size = 10543416, upload-time = "2026-01-22T22:30:01.964Z" }, - { url = "https://files.pythonhosted.org/packages/3e/34/8a84cea7e42c2d94ba5bde1d7a4fae164d6318f13f933d92da6d7c2041ff/ruff-0.14.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e651e977a79e4c758eb807f0481d673a67ffe53cfa92209781dfa3a996cf8412", size = 10285491, upload-time = "2026-01-22T22:30:29.51Z" }, - { url = "https://files.pythonhosted.org/packages/55/ef/b7c5ea0be82518906c978e365e56a77f8de7678c8bb6651ccfbdc178c29f/ruff-0.14.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:cc8b22da8d9d6fdd844a68ae937e2a0adf9b16514e9a97cc60355e2d4b219fc3", size = 10733525, upload-time = "2026-01-22T22:30:06.499Z" }, - { url = "https://files.pythonhosted.org/packages/6a/5b/aaf1dfbcc53a2811f6cc0a1759de24e4b03e02ba8762daabd9b6bd8c59e3/ruff-0.14.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:16bc890fb4cc9781bb05beb5ab4cd51be9e7cb376bf1dd3580512b24eb3fda2b", size = 11315626, upload-time = "2026-01-22T22:30:36.848Z" }, - { url = "https://files.pythonhosted.org/packages/2c/aa/9f89c719c467dfaf8ad799b9bae0df494513fb21d31a6059cb5870e57e74/ruff-0.14.14-py3-none-win32.whl", hash = "sha256:b530c191970b143375b6a68e6f743800b2b786bbcf03a7965b06c4bf04568167", size = 10502442, upload-time = "2026-01-22T22:30:38.93Z" }, - { url = "https://files.pythonhosted.org/packages/87/44/90fa543014c45560cae1fffc63ea059fb3575ee6e1cb654562197e5d16fb/ruff-0.14.14-py3-none-win_amd64.whl", hash = "sha256:3dde1435e6b6fe5b66506c1dff67a421d0b7f6488d466f651c07f4cab3bf20fd", size = 11630486, upload-time = "2026-01-22T22:30:10.852Z" }, - { url = "https://files.pythonhosted.org/packages/9e/6a/40fee331a52339926a92e17ae748827270b288a35ef4a15c9c8f2ec54715/ruff-0.14.14-py3-none-win_arm64.whl", hash = "sha256:56e6981a98b13a32236a72a8da421d7839221fa308b223b9283312312e5ac76c", size = 10920448, upload-time = "2026-01-22T22:30:15.417Z" }, +version = "0.15.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/04/dc/4e6ac71b511b141cf626357a3946679abeba4cf67bc7cc5a17920f31e10d/ruff-0.15.1.tar.gz", hash = "sha256:c590fe13fb57c97141ae975c03a1aedb3d3156030cabd740d6ff0b0d601e203f", size = 4540855, upload-time = "2026-02-12T23:09:09.998Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/bf/e6e4324238c17f9d9120a9d60aa99a7daaa21204c07fcd84e2ef03bb5fd1/ruff-0.15.1-py3-none-linux_armv6l.whl", hash = "sha256:b101ed7cf4615bda6ffe65bdb59f964e9f4a0d3f85cbf0e54f0ab76d7b90228a", size = 10367819, upload-time = "2026-02-12T23:09:03.598Z" }, + { url = "https://files.pythonhosted.org/packages/b3/ea/c8f89d32e7912269d38c58f3649e453ac32c528f93bb7f4219258be2e7ed/ruff-0.15.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:939c995e9277e63ea632cc8d3fae17aa758526f49a9a850d2e7e758bfef46602", size = 10798618, upload-time = "2026-02-12T23:09:22.928Z" }, + { url = "https://files.pythonhosted.org/packages/5e/0f/1d0d88bc862624247d82c20c10d4c0f6bb2f346559d8af281674cf327f15/ruff-0.15.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1d83466455fdefe60b8d9c8df81d3c1bbb2115cede53549d3b522ce2bc703899", size = 10148518, upload-time = "2026-02-12T23:08:58.339Z" }, + { url = "https://files.pythonhosted.org/packages/f5/c8/291c49cefaa4a9248e986256df2ade7add79388fe179e0691be06fae6f37/ruff-0.15.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9457e3c3291024866222b96108ab2d8265b477e5b1534c7ddb1810904858d16", size = 10518811, upload-time = "2026-02-12T23:09:31.865Z" }, + { url = "https://files.pythonhosted.org/packages/c3/1a/f5707440e5ae43ffa5365cac8bbb91e9665f4a883f560893829cf16a606b/ruff-0.15.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:92c92b003e9d4f7fbd33b1867bb15a1b785b1735069108dfc23821ba045b29bc", size = 10196169, upload-time = "2026-02-12T23:09:17.306Z" }, + { url = "https://files.pythonhosted.org/packages/2a/ff/26ddc8c4da04c8fd3ee65a89c9fb99eaa5c30394269d424461467be2271f/ruff-0.15.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fe5c41ab43e3a06778844c586251eb5a510f67125427625f9eb2b9526535779", size = 10990491, upload-time = "2026-02-12T23:09:25.503Z" }, + { url = "https://files.pythonhosted.org/packages/fc/00/50920cb385b89413f7cdb4bb9bc8fc59c1b0f30028d8bccc294189a54955/ruff-0.15.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66a6dd6df4d80dc382c6484f8ce1bcceb55c32e9f27a8b94c32f6c7331bf14fb", size = 11843280, upload-time = "2026-02-12T23:09:19.88Z" }, + { url = "https://files.pythonhosted.org/packages/5d/6d/2f5cad8380caf5632a15460c323ae326f1e1a2b5b90a6ee7519017a017ca/ruff-0.15.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a4a42cbb8af0bda9bcd7606b064d7c0bc311a88d141d02f78920be6acb5aa83", size = 11274336, upload-time = "2026-02-12T23:09:14.907Z" }, + { url = "https://files.pythonhosted.org/packages/a3/1d/5f56cae1d6c40b8a318513599b35ea4b075d7dc1cd1d04449578c29d1d75/ruff-0.15.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ab064052c31dddada35079901592dfba2e05f5b1e43af3954aafcbc1096a5b2", size = 11137288, upload-time = "2026-02-12T23:09:07.475Z" }, + { url = "https://files.pythonhosted.org/packages/cd/20/6f8d7d8f768c93b0382b33b9306b3b999918816da46537d5a61635514635/ruff-0.15.1-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:5631c940fe9fe91f817a4c2ea4e81f47bee3ca4aa646134a24374f3c19ad9454", size = 11070681, upload-time = "2026-02-12T23:08:55.43Z" }, + { url = "https://files.pythonhosted.org/packages/9a/67/d640ac76069f64cdea59dba02af2e00b1fa30e2103c7f8d049c0cff4cafd/ruff-0.15.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:68138a4ba184b4691ccdc39f7795c66b3c68160c586519e7e8444cf5a53e1b4c", size = 10486401, upload-time = "2026-02-12T23:09:27.927Z" }, + { url = "https://files.pythonhosted.org/packages/65/3d/e1429f64a3ff89297497916b88c32a5cc88eeca7e9c787072d0e7f1d3e1e/ruff-0.15.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:518f9af03bfc33c03bdb4cb63fabc935341bb7f54af500f92ac309ecfbba6330", size = 10197452, upload-time = "2026-02-12T23:09:12.147Z" }, + { url = "https://files.pythonhosted.org/packages/78/83/e2c3bade17dad63bf1e1c2ffaf11490603b760be149e1419b07049b36ef2/ruff-0.15.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:da79f4d6a826caaea95de0237a67e33b81e6ec2e25fc7e1993a4015dffca7c61", size = 10693900, upload-time = "2026-02-12T23:09:34.418Z" }, + { url = "https://files.pythonhosted.org/packages/a1/27/fdc0e11a813e6338e0706e8b39bb7a1d61ea5b36873b351acee7e524a72a/ruff-0.15.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3dd86dccb83cd7d4dcfac303ffc277e6048600dfc22e38158afa208e8bf94a1f", size = 11227302, upload-time = "2026-02-12T23:09:36.536Z" }, + { url = "https://files.pythonhosted.org/packages/f6/58/ac864a75067dcbd3b95be5ab4eb2b601d7fbc3d3d736a27e391a4f92a5c1/ruff-0.15.1-py3-none-win32.whl", hash = "sha256:660975d9cb49b5d5278b12b03bb9951d554543a90b74ed5d366b20e2c57c2098", size = 10462555, upload-time = "2026-02-12T23:09:29.899Z" }, + { url = "https://files.pythonhosted.org/packages/e0/5e/d4ccc8a27ecdb78116feac4935dfc39d1304536f4296168f91ed3ec00cd2/ruff-0.15.1-py3-none-win_amd64.whl", hash = "sha256:c820fef9dd5d4172a6570e5721704a96c6679b80cf7be41659ed439653f62336", size = 11599956, upload-time = "2026-02-12T23:09:01.157Z" }, + { url = "https://files.pythonhosted.org/packages/2a/07/5bda6a85b220c64c65686bc85bd0bbb23b29c62b3a9f9433fa55f17cda93/ruff-0.15.1-py3-none-win_arm64.whl", hash = "sha256:5ff7d5f0f88567850f45081fac8f4ec212be8d0b963e385c3f7d0d2eb4899416", size = 10874604, upload-time = "2026-02-12T23:09:05.515Z" }, ] [[package]] @@ -1361,26 +1398,26 @@ wheels = [ [[package]] name = "ty" -version = "0.0.14" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/57/22c3d6bf95c2229120c49ffc2f0da8d9e8823755a1c3194da56e51f1cc31/ty-0.0.14.tar.gz", hash = "sha256:a691010565f59dd7f15cf324cdcd1d9065e010c77a04f887e1ea070ba34a7de2", size = 5036573, upload-time = "2026-01-27T00:57:31.427Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/99/cb/cc6d1d8de59beb17a41f9a614585f884ec2d95450306c173b3b7cc090d2e/ty-0.0.14-py3-none-linux_armv6l.whl", hash = "sha256:32cf2a7596e693094621d3ae568d7ee16707dce28c34d1762947874060fdddaa", size = 10034228, upload-time = "2026-01-27T00:57:53.133Z" }, - { url = "https://files.pythonhosted.org/packages/f3/96/dd42816a2075a8f31542296ae687483a8d047f86a6538dfba573223eaf9a/ty-0.0.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:f971bf9805f49ce8c0968ad53e29624d80b970b9eb597b7cbaba25d8a18ce9a2", size = 9939162, upload-time = "2026-01-27T00:57:43.857Z" }, - { url = "https://files.pythonhosted.org/packages/ff/b4/73c4859004e0f0a9eead9ecb67021438b2e8e5fdd8d03e7f5aca77623992/ty-0.0.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:45448b9e4806423523268bc15e9208c4f3f2ead7c344f615549d2e2354d6e924", size = 9418661, upload-time = "2026-01-27T00:58:03.411Z" }, - { url = "https://files.pythonhosted.org/packages/58/35/839c4551b94613db4afa20ee555dd4f33bfa7352d5da74c5fa416ffa0fd2/ty-0.0.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee94a9b747ff40114085206bdb3205a631ef19a4d3fb89e302a88754cbbae54c", size = 9837872, upload-time = "2026-01-27T00:57:23.718Z" }, - { url = "https://files.pythonhosted.org/packages/41/2b/bbecf7e2faa20c04bebd35fc478668953ca50ee5847ce23e08acf20ea119/ty-0.0.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6756715a3c33182e9ab8ffca2bb314d3c99b9c410b171736e145773ee0ae41c3", size = 9848819, upload-time = "2026-01-27T00:57:58.501Z" }, - { url = "https://files.pythonhosted.org/packages/be/60/3c0ba0f19c0f647ad9d2b5b5ac68c0f0b4dc899001bd53b3a7537fb247a2/ty-0.0.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89d0038a2f698ba8b6fec5cf216a4e44e2f95e4a5095a8c0f57fe549f87087c2", size = 10324371, upload-time = "2026-01-27T00:57:29.291Z" }, - { url = "https://files.pythonhosted.org/packages/24/32/99d0a0b37d0397b0a989ffc2682493286aa3bc252b24004a6714368c2c3d/ty-0.0.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c64a83a2d669b77f50a4957039ca1450626fb474619f18f6f8a3eb885bf7544", size = 10865898, upload-time = "2026-01-27T00:57:33.542Z" }, - { url = "https://files.pythonhosted.org/packages/1a/88/30b583a9e0311bb474269cfa91db53350557ebec09002bfc3fb3fc364e8c/ty-0.0.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:242488bfb547ef080199f6fd81369ab9cb638a778bb161511d091ffd49c12129", size = 10555777, upload-time = "2026-01-27T00:58:05.853Z" }, - { url = "https://files.pythonhosted.org/packages/cd/a2/cb53fb6325dcf3d40f2b1d0457a25d55bfbae633c8e337bde8ec01a190eb/ty-0.0.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4790c3866f6c83a4f424fc7d09ebdb225c1f1131647ba8bdc6fcdc28f09ed0ff", size = 10412913, upload-time = "2026-01-27T00:57:38.834Z" }, - { url = "https://files.pythonhosted.org/packages/42/8f/f2f5202d725ed1e6a4e5ffaa32b190a1fe70c0b1a2503d38515da4130b4c/ty-0.0.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:950f320437f96d4ea9a2332bbfb5b68f1c1acd269ebfa4c09b6970cc1565bd9d", size = 9837608, upload-time = "2026-01-27T00:57:55.898Z" }, - { url = "https://files.pythonhosted.org/packages/f7/ba/59a2a0521640c489dafa2c546ae1f8465f92956fede18660653cce73b4c5/ty-0.0.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:4a0ec3ee70d83887f86925bbc1c56f4628bd58a0f47f6f32ddfe04e1f05466df", size = 9884324, upload-time = "2026-01-27T00:57:46.786Z" }, - { url = "https://files.pythonhosted.org/packages/03/95/8d2a49880f47b638743212f011088552ecc454dd7a665ddcbdabea25772a/ty-0.0.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a1a4e6b6da0c58b34415955279eff754d6206b35af56a18bb70eb519d8d139ef", size = 10033537, upload-time = "2026-01-27T00:58:01.149Z" }, - { url = "https://files.pythonhosted.org/packages/e9/40/4523b36f2ce69f92ccf783855a9e0ebbbd0f0bb5cdce6211ee1737159ed3/ty-0.0.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:dc04384e874c5de4c5d743369c277c8aa73d1edea3c7fc646b2064b637db4db3", size = 10495910, upload-time = "2026-01-27T00:57:26.691Z" }, - { url = "https://files.pythonhosted.org/packages/08/d5/655beb51224d1bfd4f9ddc0bb209659bfe71ff141bcf05c418ab670698f0/ty-0.0.14-py3-none-win32.whl", hash = "sha256:b20e22cf54c66b3e37e87377635da412d9a552c9bf4ad9fc449fed8b2e19dad2", size = 9507626, upload-time = "2026-01-27T00:57:41.43Z" }, - { url = "https://files.pythonhosted.org/packages/b6/d9/c569c9961760e20e0a4bc008eeb1415754564304fd53997a371b7cf3f864/ty-0.0.14-py3-none-win_amd64.whl", hash = "sha256:e312ff9475522d1a33186657fe74d1ec98e4a13e016d66f5758a452c90ff6409", size = 10437980, upload-time = "2026-01-27T00:57:36.422Z" }, - { url = "https://files.pythonhosted.org/packages/ad/0c/186829654f5bfd9a028f6648e9caeb11271960a61de97484627d24443f91/ty-0.0.14-py3-none-win_arm64.whl", hash = "sha256:b6facdbe9b740cb2c15293a1d178e22ffc600653646452632541d01c36d5e378", size = 9885831, upload-time = "2026-01-27T00:57:49.747Z" }, +version = "0.0.17" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/66/c3/41ae6346443eedb65b96761abfab890a48ce2aa5a8a27af69c5c5d99064d/ty-0.0.17.tar.gz", hash = "sha256:847ed6c120913e280bf9b54d8eaa7a1049708acb8824ad234e71498e8ad09f97", size = 5167209, upload-time = "2026-02-13T13:26:36.835Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/01/0ef15c22a1c54b0f728ceff3f62d478dbf8b0dcf8ff7b80b954f79584f3e/ty-0.0.17-py3-none-linux_armv6l.whl", hash = "sha256:64a9a16555cc8867d35c2647c2f1afbd3cae55f68fd95283a574d1bb04fe93e0", size = 10192793, upload-time = "2026-02-13T13:27:13.943Z" }, + { url = "https://files.pythonhosted.org/packages/0f/2c/f4c322d9cded56edc016b1092c14b95cf58c8a33b4787316ea752bb9418e/ty-0.0.17-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:eb2dbd8acd5c5a55f4af0d479523e7c7265a88542efe73ed3d696eb1ba7b6454", size = 10051977, upload-time = "2026-02-13T13:26:57.741Z" }, + { url = "https://files.pythonhosted.org/packages/4c/a5/43746c1ff81e784f5fc303afc61fe5bcd85d0fcf3ef65cb2cef78c7486c7/ty-0.0.17-py3-none-macosx_11_0_arm64.whl", hash = "sha256:f18f5fd927bc628deb9ea2df40f06b5f79c5ccf355db732025a3e8e7152801f6", size = 9564639, upload-time = "2026-02-13T13:26:42.781Z" }, + { url = "https://files.pythonhosted.org/packages/d6/b8/280b04e14a9c0474af574f929fba2398b5e1c123c1e7735893b4cd73d13c/ty-0.0.17-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5383814d1d7a5cc53b3b07661856bab04bb2aac7a677c8d33c55169acdaa83df", size = 10061204, upload-time = "2026-02-13T13:27:00.152Z" }, + { url = "https://files.pythonhosted.org/packages/2a/d7/493e1607d8dfe48288d8a768a2adc38ee27ef50e57f0af41ff273987cda0/ty-0.0.17-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9c20423b8744b484f93e7bf2ef8a9724bca2657873593f9f41d08bd9f83444c9", size = 10013116, upload-time = "2026-02-13T13:26:34.543Z" }, + { url = "https://files.pythonhosted.org/packages/80/ef/22f3ed401520afac90dbdf1f9b8b7755d85b0d5c35c1cb35cf5bd11b59c2/ty-0.0.17-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6f5b1aba97db9af86517b911674b02f5bc310750485dc47603a105bd0e83ddd", size = 10533623, upload-time = "2026-02-13T13:26:31.449Z" }, + { url = "https://files.pythonhosted.org/packages/75/ce/744b15279a11ac7138832e3a55595706b4a8a209c9f878e3ab8e571d9032/ty-0.0.17-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:488bce1a9bea80b851a97cd34c4d2ffcd69593d6c3f54a72ae02e5c6e47f3d0c", size = 11069750, upload-time = "2026-02-13T13:26:48.638Z" }, + { url = "https://files.pythonhosted.org/packages/f2/be/1133c91f15a0e00d466c24f80df486d630d95d1b2af63296941f7473812f/ty-0.0.17-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8df66b91ec84239420985ec215e7f7549bfda2ac036a3b3c065f119d1c06825a", size = 10870862, upload-time = "2026-02-13T13:26:54.715Z" }, + { url = "https://files.pythonhosted.org/packages/3e/4a/a2ed209ef215b62b2d3246e07e833081e07d913adf7e0448fc204be443d6/ty-0.0.17-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:002139e807c53002790dfefe6e2f45ab0e04012e76db3d7c8286f96ec121af8f", size = 10628118, upload-time = "2026-02-13T13:26:45.439Z" }, + { url = "https://files.pythonhosted.org/packages/b3/0c/87476004cb5228e9719b98afffad82c3ef1f84334bde8527bcacba7b18cb/ty-0.0.17-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6c4e01f05ce82e5d489ab3900ca0899a56c4ccb52659453780c83e5b19e2b64c", size = 10038185, upload-time = "2026-02-13T13:27:02.693Z" }, + { url = "https://files.pythonhosted.org/packages/46/4b/98f0b3ba9aef53c1f0305519536967a4aa793a69ed72677b0a625c5313ac/ty-0.0.17-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:2b226dd1e99c0d2152d218c7e440150d1a47ce3c431871f0efa073bbf899e881", size = 10047644, upload-time = "2026-02-13T13:27:05.474Z" }, + { url = "https://files.pythonhosted.org/packages/93/e0/06737bb80aa1a9103b8651d2eb691a7e53f1ed54111152be25f4a02745db/ty-0.0.17-py3-none-musllinux_1_2_i686.whl", hash = "sha256:8b11f1da7859e0ad69e84b3c5ef9a7b055ceed376a432fad44231bdfc48061c2", size = 10231140, upload-time = "2026-02-13T13:27:10.844Z" }, + { url = "https://files.pythonhosted.org/packages/7c/79/e2a606bd8852383ba9abfdd578f4a227bd18504145381a10a5f886b4e751/ty-0.0.17-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:c04e196809ff570559054d3e011425fd7c04161529eb551b3625654e5f2434cb", size = 10718344, upload-time = "2026-02-13T13:26:51.66Z" }, + { url = "https://files.pythonhosted.org/packages/c5/2d/2663984ac11de6d78f74432b8b14ba64d170b45194312852b7543cf7fd56/ty-0.0.17-py3-none-win32.whl", hash = "sha256:305b6ed150b2740d00a817b193373d21f0767e10f94ac47abfc3b2e5a5aec809", size = 9672932, upload-time = "2026-02-13T13:27:08.522Z" }, + { url = "https://files.pythonhosted.org/packages/de/b5/39be78f30b31ee9f5a585969930c7248354db90494ff5e3d0756560fb731/ty-0.0.17-py3-none-win_amd64.whl", hash = "sha256:531828267527aee7a63e972f54e5eee21d9281b72baf18e5c2850c6b862add83", size = 10542138, upload-time = "2026-02-13T13:27:17.084Z" }, + { url = "https://files.pythonhosted.org/packages/40/b7/f875c729c5d0079640c75bad2c7e5d43edc90f16ba242f28a11966df8f65/ty-0.0.17-py3-none-win_arm64.whl", hash = "sha256:de9810234c0c8d75073457e10a84825b9cd72e6629826b7f01c7a0b266ae25b1", size = 10023068, upload-time = "2026-02-13T13:26:39.637Z" }, ] [[package]]