From 6d33879ff681b72bddc38c35251aab87b1ff0d47 Mon Sep 17 00:00:00 2001 From: Christopher Fenner Date: Mon, 23 Dec 2024 19:26:41 +0100 Subject: [PATCH 01/18] add test cases --- tests/test_VitoairFs300E.py | 10 ++++++++++ tests/test_vitocal-with-vitovent.py | 12 ++++++++++++ 2 files changed, 22 insertions(+) diff --git a/tests/test_VitoairFs300E.py b/tests/test_VitoairFs300E.py index 58648a5f..8ec5ebdb 100644 --- a/tests/test_VitoairFs300E.py +++ b/tests/test_VitoairFs300E.py @@ -47,3 +47,13 @@ def test_ventilationState(self): self.assertEqual(self.device.getVentilationDemand(), "unknown") self.assertEqual(self.device.getVentilationLevel(), "levelFour") self.assertEqual(self.device.getVentilationReason(), "sensorOverride") + + def test_ventilationQuickmode(self): + self.assertEqual(self.device.getVentilationQuickmode("forcedLevelFour"), False) + self.assertEqual(self.device.getVentilationQuickmode("silent"), False) + + def test_ventilationQuickmodes(self): + self.assertEqual(self.device.getVentilationQuickmodes(), [ + "forcedLevelFour", + "silent", + ]) diff --git a/tests/test_vitocal-with-vitovent.py b/tests/test_vitocal-with-vitovent.py index 0223bc6d..a392c8ca 100644 --- a/tests/test_vitocal-with-vitovent.py +++ b/tests/test_vitocal-with-vitovent.py @@ -17,3 +17,15 @@ def test_isSolarThermalDevice(self): def test_isVentilationDevice(self): self.assertEqual(self.device.isVentilationDevice(), True) + + def test_ventilationQuickmode(self): + self.assertEqual(self.device.getVentilationQuickmode("comfort"), False) + self.assertEqual(self.device.getVentilationQuickmode("eco"), False) + self.assertEqual(self.device.getVentilationQuickmode("holiday"), False) + + def test_ventilationQuickmodes(self): + self.assertEqual(self.device.getVentilationQuickmodes(), [ + "comfort", + "eco", + "holiday", + ]) From ef6f4c7805e4e50caeb56fc42d423901996361ea Mon Sep 17 00:00:00 2001 From: Christopher Fenner Date: Mon, 23 Dec 2024 19:31:56 +0100 Subject: [PATCH 02/18] extract quickmodes feature --- .../Features/FeatureVentilationQuickmodes.py | 26 +++++++++++++++++++ PyViCare/Features/__init__.py | 0 PyViCare/PyViCareVentilationDevice.py | 24 +++-------------- 3 files changed, 29 insertions(+), 21 deletions(-) create mode 100644 PyViCare/Features/FeatureVentilationQuickmodes.py create mode 100644 PyViCare/Features/__init__.py diff --git a/PyViCare/Features/FeatureVentilationQuickmodes.py b/PyViCare/Features/FeatureVentilationQuickmodes.py new file mode 100644 index 00000000..dc639d25 --- /dev/null +++ b/PyViCare/Features/FeatureVentilationQuickmodes.py @@ -0,0 +1,26 @@ +from contextlib import suppress + +from PyViCare.PyViCareDevice import Device +from PyViCare.PyViCareUtils import (PyViCareNotSupportedFeatureError, handleNotSupported) + +class FeatureVentilationQuickmodes(Device): + @handleNotSupported + def getVentilationQuickmodes(self) -> list[str]: + available_quickmodes = [] + for quickmode in ['comfort', 'eco', 'forcedLevelFour', 'holiday', 'standby', 'silent']: + with suppress(PyViCareNotSupportedFeatureError): + if self.service.getProperty(f"ventilation.quickmodes.{quickmode}") is not None: + available_quickmodes.append(quickmode) + return available_quickmodes + + @handleNotSupported + def getVentilationQuickmode(self, quickmode: str) -> bool: + return bool(self.service.getProperty(f"ventilation.quickmodes.{quickmode}")["properties"]["active"]["value"]) + + @handleNotSupported + def activateVentilationQuickmode(self, quickmode: str) -> None: + self.service.setProperty(f"ventilation.quickmodes.{quickmode}", "activate", {}) + + @handleNotSupported + def deactivateVentilationQuickmode(self, quickmode: str) -> None: + self.service.setProperty(f"ventilation.quickmodes.{quickmode}", "deactivate", {}) diff --git a/PyViCare/Features/__init__.py b/PyViCare/Features/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/PyViCare/PyViCareVentilationDevice.py b/PyViCare/PyViCareVentilationDevice.py index 347aa167..6094f017 100644 --- a/PyViCare/PyViCareVentilationDevice.py +++ b/PyViCare/PyViCareVentilationDevice.py @@ -1,10 +1,12 @@ + from contextlib import suppress +from PyViCare.Features.FeatureVentilationQuickmodes import FeatureVentilationQuickmodes from PyViCare.PyViCareDevice import Device from PyViCare.PyViCareUtils import (PyViCareNotSupportedFeatureError, handleAPICommandErrors, handleNotSupported) -class VentilationDevice(Device): +class VentilationDevice(FeatureVentilationQuickmodes, Device): """This is the base class for all ventilation devices. This class connects to the Viessmann ViCare API. The authentication is done through OAuth2. @@ -108,23 +110,3 @@ def getVentilationLevel(self) -> str: def getVentilationReason(self) -> str: return str(self.service.getProperty("ventilation.operating.state")["properties"]["reason"]["value"]) - @handleNotSupported - def getVentilationQuickmodes(self) -> list[str]: - available_quickmodes = [] - for quickmode in ['comfort', 'eco', 'forcedLevelFour', 'holiday', 'standby', 'silent']: - with suppress(PyViCareNotSupportedFeatureError): - if self.service.getProperty(f"ventilation.quickmodes.{quickmode}") is not None: - available_quickmodes.append(quickmode) - return available_quickmodes - - @handleNotSupported - def getVentilationQuickmode(self, quickmode: str) -> bool: - return bool(self.service.getProperty(f"ventilation.quickmodes.{quickmode}")["properties"]["active"]["value"]) - - @handleNotSupported - def activateVentilationQuickmode(self, quickmode: str) -> None: - self.service.setProperty(f"ventilation.quickmodes.{quickmode}", "activate", {}) - - @handleNotSupported - def deactivateVentilationQuickmode(self, quickmode: str) -> None: - self.service.setProperty(f"ventilation.quickmodes.{quickmode}", "deactivate", {}) From fc8c416f71dbddc71ba74314fedecb8c055c4c27 Mon Sep 17 00:00:00 2001 From: Christopher Fenner Date: Mon, 23 Dec 2024 19:40:09 +0100 Subject: [PATCH 03/18] add test case --- tests/test_Vitocal111S.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 tests/test_Vitocal111S.py diff --git a/tests/test_Vitocal111S.py b/tests/test_Vitocal111S.py new file mode 100644 index 00000000..f09a04f1 --- /dev/null +++ b/tests/test_Vitocal111S.py @@ -0,0 +1,32 @@ +import unittest + +from PyViCare.PyViCareUtils import PyViCareNotSupportedFeatureError +from PyViCare.PyViCareVentilationDevice import VentilationDevice +from tests.ViCareServiceMock import ViCareServiceMock + + +class Vitocal200(unittest.TestCase): + def setUp(self): + self.service = ViCareServiceMock('response/Vitocal111S.json') + self.device = VentilationDevice(self.service) + + def test_ventilation_state(self): + self.assertEqual(self.device.getVentilationDemand(), "ventilation") + self.assertEqual(self.device.getVentilationLevel(), "levelOne") + self.assertEqual(self.device.getVentilationReason(), "schedule") + + def test_ventilationQuickmode(self): + # quickmodes disabled + with self.assertRaises(PyViCareNotSupportedFeatureError): + self.device.getVentilationQuickmode("comfort") + with self.assertRaises(PyViCareNotSupportedFeatureError): + self.device.getVentilationQuickmode("eco") + with self.assertRaises(PyViCareNotSupportedFeatureError): + self.device.getVentilationQuickmode("holiday") + + def test_ventilationQuickmodes(self): + self.assertEqual(self.device.getVentilationQuickmodes(), [ + "comfort", + "eco", + "holiday", + ]) From 6f5e4a2a386ad34d365ee47ff65bc2d7f51f6f94 Mon Sep 17 00:00:00 2001 From: Christopher Fenner Date: Mon, 23 Dec 2024 19:55:49 +0100 Subject: [PATCH 04/18] add test cases --- tests/test_Vitocal111S.py | 4 ++-- tests/test_Vitocal222S.py | 16 ++++++++++++++++ tests/test_Vitocal333G.py | 16 ++++++++++++++++ tests/test_vitocal-with-vitovent.py | 9 +++++++-- 4 files changed, 41 insertions(+), 4 deletions(-) diff --git a/tests/test_Vitocal111S.py b/tests/test_Vitocal111S.py index f09a04f1..a4fbca4e 100644 --- a/tests/test_Vitocal111S.py +++ b/tests/test_Vitocal111S.py @@ -1,14 +1,14 @@ import unittest from PyViCare.PyViCareUtils import PyViCareNotSupportedFeatureError -from PyViCare.PyViCareVentilationDevice import VentilationDevice +from PyViCare.PyViCareHeatPump import HeatPump from tests.ViCareServiceMock import ViCareServiceMock class Vitocal200(unittest.TestCase): def setUp(self): self.service = ViCareServiceMock('response/Vitocal111S.json') - self.device = VentilationDevice(self.service) + self.device = HeatPump(self.service) def test_ventilation_state(self): self.assertEqual(self.device.getVentilationDemand(), "ventilation") diff --git a/tests/test_Vitocal222S.py b/tests/test_Vitocal222S.py index 2e09a417..27cfc4e3 100644 --- a/tests/test_Vitocal222S.py +++ b/tests/test_Vitocal222S.py @@ -1,6 +1,7 @@ import unittest from PyViCare.PyViCareHeatPump import HeatPump +from PyViCare.PyViCareUtils import PyViCareNotSupportedFeatureError from tests.helper import now_is from tests.ViCareServiceMock import ViCareServiceMock @@ -27,3 +28,18 @@ def test_isSolarThermalDevice(self): def test_isVentilationDevice(self): self.assertEqual(self.device.isVentilationDevice(), True) + + def test_ventilationState(self): + with self.assertRaises(PyViCareNotSupportedFeatureError): + self.device.getVentilationDemand() + with self.assertRaises(PyViCareNotSupportedFeatureError): + self.device.getVentilationLevel() + with self.assertRaises(PyViCareNotSupportedFeatureError): + self.device.getVentilationReason() + + def test_ventilationQuickmode(self): + with self.assertRaises(PyViCareNotSupportedFeatureError): + self.device.getVentilationQuickmode("standby") + + def test_ventilationQuickmodes(self): + self.assertEqual(self.device.getVentilationQuickmodes(), []) diff --git a/tests/test_Vitocal333G.py b/tests/test_Vitocal333G.py index fb4d8464..df5ebedb 100644 --- a/tests/test_Vitocal333G.py +++ b/tests/test_Vitocal333G.py @@ -1,6 +1,7 @@ import unittest from PyViCare.PyViCareHeatPump import HeatPump +from PyViCare.PyViCareUtils import PyViCareNotSupportedFeatureError from tests.ViCareServiceMock import ViCareServiceMock @@ -16,3 +17,18 @@ def test_getDomesticHotWaterStorageTemperature(self): def test_getHotWaterStorageTemperatureTop(self): self.assertEqual( self.device.getHotWaterStorageTemperatureTop(), 47.5) + + def test_ventilationState(self): + with self.assertRaises(PyViCareNotSupportedFeatureError): + self.device.getVentilationDemand() + with self.assertRaises(PyViCareNotSupportedFeatureError): + self.device.getVentilationLevel() + with self.assertRaises(PyViCareNotSupportedFeatureError): + self.device.getVentilationReason() + + def test_ventilationQuickmode(self): + with self.assertRaises(PyViCareNotSupportedFeatureError): + self.device.getVentilationQuickmode("standby") + + def test_ventilationQuickmodes(self): + self.assertEqual(self.device.getVentilationQuickmodes(), []) diff --git a/tests/test_vitocal-with-vitovent.py b/tests/test_vitocal-with-vitovent.py index a392c8ca..c566b0fe 100644 --- a/tests/test_vitocal-with-vitovent.py +++ b/tests/test_vitocal-with-vitovent.py @@ -1,13 +1,13 @@ import unittest -from PyViCare.PyViCareVentilationDevice import VentilationDevice +from PyViCare.PyViCareHeatPump import HeatPump from tests.ViCareServiceMock import ViCareServiceMock class Vitocal_with_Vitovent(unittest.TestCase): def setUp(self): self.service = ViCareServiceMock('response/Vitocal-200S-with-Vitovent-300W.json') - self.device = VentilationDevice(self.service) + self.device = HeatPump(self.service) def test_isDomesticHotWaterDevice(self): self.assertEqual(self.device.isDomesticHotWaterDevice(), True) @@ -18,6 +18,11 @@ def test_isSolarThermalDevice(self): def test_isVentilationDevice(self): self.assertEqual(self.device.isVentilationDevice(), True) + def test_ventilation_state(self): + self.assertEqual(self.device.getVentilationDemand(), "ventilation") + self.assertEqual(self.device.getVentilationLevel(), "levelTwo") + self.assertEqual(self.device.getVentilationReason(), "schedule") + def test_ventilationQuickmode(self): self.assertEqual(self.device.getVentilationQuickmode("comfort"), False) self.assertEqual(self.device.getVentilationQuickmode("eco"), False) From 70d465da7be05e96bd900e8d8734b5607a547d92 Mon Sep 17 00:00:00 2001 From: Christopher Fenner Date: Mon, 23 Dec 2024 19:56:05 +0100 Subject: [PATCH 05/18] add ventilation state feature --- PyViCare/Features/FeatureVentilationState.py | 15 +++++++++++++++ PyViCare/PyViCareVentilationDevice.py | 16 ++-------------- 2 files changed, 17 insertions(+), 14 deletions(-) create mode 100644 PyViCare/Features/FeatureVentilationState.py diff --git a/PyViCare/Features/FeatureVentilationState.py b/PyViCare/Features/FeatureVentilationState.py new file mode 100644 index 00000000..b791039a --- /dev/null +++ b/PyViCare/Features/FeatureVentilationState.py @@ -0,0 +1,15 @@ +from PyViCare.PyViCareDevice import Device +from PyViCare.PyViCareUtils import handleNotSupported + +class FeatureVentilationState(Device): + @handleNotSupported + def getVentilationDemand(self) -> str: + return str(self.service.getProperty("ventilation.operating.state")["properties"]["demand"]["value"]) + + @handleNotSupported + def getVentilationLevel(self) -> str: + return str(self.service.getProperty("ventilation.operating.state")["properties"]["level"]["value"]) + + @handleNotSupported + def getVentilationReason(self) -> str: + return str(self.service.getProperty("ventilation.operating.state")["properties"]["reason"]["value"]) diff --git a/PyViCare/PyViCareVentilationDevice.py b/PyViCare/PyViCareVentilationDevice.py index 6094f017..123e289a 100644 --- a/PyViCare/PyViCareVentilationDevice.py +++ b/PyViCare/PyViCareVentilationDevice.py @@ -2,11 +2,12 @@ from contextlib import suppress from PyViCare.Features.FeatureVentilationQuickmodes import FeatureVentilationQuickmodes +from PyViCare.Features.FeatureVentilationState import FeatureVentilationState from PyViCare.PyViCareDevice import Device from PyViCare.PyViCareUtils import (PyViCareNotSupportedFeatureError, handleAPICommandErrors, handleNotSupported) -class VentilationDevice(FeatureVentilationQuickmodes, Device): +class VentilationDevice(FeatureVentilationQuickmodes, FeatureVentilationState, Device): """This is the base class for all ventilation devices. This class connects to the Viessmann ViCare API. The authentication is done through OAuth2. @@ -97,16 +98,3 @@ def getSchedule(self): "sat": properties["entries"]["value"]["sat"], "sun": properties["entries"]["value"]["sun"] } - - @handleNotSupported - def getVentilationDemand(self) -> str: - return str(self.service.getProperty("ventilation.operating.state")["properties"]["demand"]["value"]) - - @handleNotSupported - def getVentilationLevel(self) -> str: - return str(self.service.getProperty("ventilation.operating.state")["properties"]["level"]["value"]) - - @handleNotSupported - def getVentilationReason(self) -> str: - return str(self.service.getProperty("ventilation.operating.state")["properties"]["reason"]["value"]) - From a279a84e239ec3f9e43155d226442e59c64fdcf9 Mon Sep 17 00:00:00 2001 From: Christopher Fenner Date: Mon, 23 Dec 2024 21:50:57 +0100 Subject: [PATCH 06/18] add test cases --- tests/test_TestForMissingProperties.py | 2 +- tests/test_VitoairFs300E.py | 12 ++++++++---- tests/test_Vitocal222S.py | 10 ++++++++++ tests/test_Vitocal333G.py | 10 ++++++++++ tests/test_Vitopure350.py | 14 ++++++++++++++ tests/test_vitocal-with-vitovent.py | 10 ++++++++++ 6 files changed, 53 insertions(+), 5 deletions(-) diff --git a/tests/test_TestForMissingProperties.py b/tests/test_TestForMissingProperties.py index 4824ff5a..19769ac0 100644 --- a/tests/test_TestForMissingProperties.py +++ b/tests/test_TestForMissingProperties.py @@ -143,7 +143,7 @@ def test_unverifiedProperties(self): for match in re.findall(r'getProperty\(\s*?f?"(.*)"\s*?\)', all_python_files[python]): feature_name = re.sub(r'{self.(circuit|burner|compressor)}', '0', match) feature_name = re.sub(r'{burner}', '0', feature_name) - feature_name = re.sub(r'\.{(quickmode|program|active_program)}', '', feature_name) + feature_name = re.sub(r'\.{(quickmode|mode|program|active_program)}', '', feature_name) used_features.append(feature_name) self.assertSetEqual(set([]), set(used_features) - set(all_features) - set(ignore)) diff --git a/tests/test_VitoairFs300E.py b/tests/test_VitoairFs300E.py index 8ec5ebdb..5eee55f4 100644 --- a/tests/test_VitoairFs300E.py +++ b/tests/test_VitoairFs300E.py @@ -43,11 +43,15 @@ def test_getSchedule(self): def test_getSerial(self): self.assertEqual(self.device.getSerial(), "################") - def test_ventilationState(self): - self.assertEqual(self.device.getVentilationDemand(), "unknown") - self.assertEqual(self.device.getVentilationLevel(), "levelFour") - self.assertEqual(self.device.getVentilationReason(), "sensorOverride") + def test_getActiveVentilationMode(self): + self.assertEqual("sensorOverride", self.device.getActiveVentilationMode()) + def test_getVentilationModes(self): + expected_modes = ['permanent', 'ventilation', 'sensorOverride', 'sensorDriven'] + self.assertListEqual(expected_modes, self.device.getVentilationModes()) + + def test_getVentilationMode(self): + self.assertEqual(False, self.device.getVentilationMode("filterChange")) def test_ventilationQuickmode(self): self.assertEqual(self.device.getVentilationQuickmode("forcedLevelFour"), False) self.assertEqual(self.device.getVentilationQuickmode("silent"), False) diff --git a/tests/test_Vitocal222S.py b/tests/test_Vitocal222S.py index 27cfc4e3..f2065594 100644 --- a/tests/test_Vitocal222S.py +++ b/tests/test_Vitocal222S.py @@ -29,6 +29,16 @@ def test_isSolarThermalDevice(self): def test_isVentilationDevice(self): self.assertEqual(self.device.isVentilationDevice(), True) + def test_getActiveVentilationMode(self): + self.assertEqual("ventilation", self.device.getActiveVentilationMode()) + + def test_getVentilationModes(self): + expected_modes = ['standby', 'standard', 'ventilation'] + self.assertListEqual(expected_modes, self.device.getVentilationModes()) + + def test_getVentilationMode(self): + self.assertEqual(False, self.device.getVentilationMode("standby")) + def test_ventilationState(self): with self.assertRaises(PyViCareNotSupportedFeatureError): self.device.getVentilationDemand() diff --git a/tests/test_Vitocal333G.py b/tests/test_Vitocal333G.py index df5ebedb..49f67f27 100644 --- a/tests/test_Vitocal333G.py +++ b/tests/test_Vitocal333G.py @@ -18,6 +18,16 @@ def test_getHotWaterStorageTemperatureTop(self): self.assertEqual( self.device.getHotWaterStorageTemperatureTop(), 47.5) + def test_getActiveVentilationMode(self): + self.assertEqual("ventilation", self.device.getActiveVentilationMode()) + + def test_getVentilationModes(self): + expected_modes = ['standby', 'standard', 'ventilation'] + self.assertListEqual(expected_modes, self.device.getVentilationModes()) + + def test_getVentilationMode(self): + self.assertEqual(False, self.device.getVentilationMode("standby")) + def test_ventilationState(self): with self.assertRaises(PyViCareNotSupportedFeatureError): self.device.getVentilationDemand() diff --git a/tests/test_Vitopure350.py b/tests/test_Vitopure350.py index ddc9c2c7..fabd0539 100644 --- a/tests/test_Vitopure350.py +++ b/tests/test_Vitopure350.py @@ -36,6 +36,20 @@ def test_getSerial(self): with self.assertRaises(PyViCareNotSupportedFeatureError): self.device.getSerial() + def test_getActiveVentilationMode(self): + self.assertEqual("sensorDriven", self.device.getActiveVentilationMode()) + + def test_getVentilationModes(self): + expected_modes = ['permanent', 'ventilation', 'sensorDriven'] + self.assertListEqual(expected_modes, self.device.getVentilationModes()) + + def test_getVentilationMode(self): + self.assertEqual(False, self.device.getVentilationMode("filterChange")) + + def test_getVentilationModePermanentLevel(self): + expected_levels = ['levelOne', 'levelTwo', 'levelThree', 'levelFour'] + self.assertListEqual(expected_levels, self.device.getVentilationModePermanentLevels()) + def test_ventilationState(self): self.assertEqual(self.device.getVentilationDemand(), "unknown") self.assertEqual(self.device.getVentilationLevel(), "unknown") diff --git a/tests/test_vitocal-with-vitovent.py b/tests/test_vitocal-with-vitovent.py index c566b0fe..85d159b9 100644 --- a/tests/test_vitocal-with-vitovent.py +++ b/tests/test_vitocal-with-vitovent.py @@ -18,6 +18,16 @@ def test_isSolarThermalDevice(self): def test_isVentilationDevice(self): self.assertEqual(self.device.isVentilationDevice(), True) + def test_getActiveVentilationMode(self): + self.assertEqual("ventilation", self.device.getActiveVentilationMode()) + + def test_getVentilationModes(self): + expected_modes = ['standby', 'standard', 'ventilation'] + self.assertListEqual(expected_modes, self.device.getVentilationModes()) + + def test_getVentilationMode(self): + self.assertEqual(False, self.device.getVentilationMode("standby")) + def test_ventilation_state(self): self.assertEqual(self.device.getVentilationDemand(), "ventilation") self.assertEqual(self.device.getVentilationLevel(), "levelTwo") From 8f2875a1735fb017dab73fb3c5801384198f9d84 Mon Sep 17 00:00:00 2001 From: Christopher Fenner Date: Mon, 23 Dec 2024 21:57:45 +0100 Subject: [PATCH 07/18] add features --- .../FeatureVentilationModePermanent.py | 11 +++++++ PyViCare/Features/FeatureVentilationModes.py | 29 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 PyViCare/Features/FeatureVentilationModePermanent.py create mode 100644 PyViCare/Features/FeatureVentilationModes.py diff --git a/PyViCare/Features/FeatureVentilationModePermanent.py b/PyViCare/Features/FeatureVentilationModePermanent.py new file mode 100644 index 00000000..d140bb0a --- /dev/null +++ b/PyViCare/Features/FeatureVentilationModePermanent.py @@ -0,0 +1,11 @@ +from PyViCare.PyViCareDevice import Device +from PyViCare.PyViCareUtils import handleAPICommandErrors, handleNotSupported + +class FeatureVentilationModePermanent(Device): + @handleNotSupported + def getVentilationModePermanentLevels(self) -> list[str]: + return list[str](self.service.getProperty("ventilation.operating.modes.permanent")["commands"]["setLevel"]["params"]["level"]["constraints"]["enum"]) + + @handleAPICommandErrors + def setVentilationModePermanentLevel(self, level: str): + return self.service.setProperty("ventilation.operating.modes.permanent", "setLevel", {'level': level}) diff --git a/PyViCare/Features/FeatureVentilationModes.py b/PyViCare/Features/FeatureVentilationModes.py new file mode 100644 index 00000000..9ed71349 --- /dev/null +++ b/PyViCare/Features/FeatureVentilationModes.py @@ -0,0 +1,29 @@ +from PyViCare.PyViCareDevice import Device +from PyViCare.PyViCareUtils import handleNotSupported + +class FeatureVentilationModes(Device): + @handleNotSupported + def getVentilationModes(self) -> list[str]: + return list[str](self.service.getProperty("ventilation.operating.modes.active")["commands"]["setMode"]["params"]["mode"]["constraints"]["enum"]) + + @handleNotSupported + def getVentilationMode(self, mode: str) -> bool: + return bool(self.service.getProperty(f"ventilation.operating.modes.{mode}")["properties"]["active"]["value"]) + + @handleNotSupported + def getActiveVentilationMode(self) -> str: + return str(self.service.getProperty("ventilation.operating.modes.active")["properties"]["value"]["value"]) + + def activateVentilationMode(self, mode: str): + """ Set the active ventilation mode + Parameters + ---------- + mode : str + Valid mode can be obtained using getVentilationModes() + + Returns + ------- + result: json + json representation of the answer + """ + return self.service.setProperty("ventilation.operating.modes.active", "setMode", {'mode': mode}) From 87896d5003d0fcb27fda45885b41761142d67df1 Mon Sep 17 00:00:00 2001 From: Christopher Fenner Date: Mon, 23 Dec 2024 21:58:07 +0100 Subject: [PATCH 08/18] use features --- PyViCare/PyViCareHeatPump.py | 12 +++++++++--- PyViCare/PyViCareVentilationDevice.py | 9 ++++++++- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/PyViCare/PyViCareHeatPump.py b/PyViCare/PyViCareHeatPump.py index 800b4758..54747e2c 100644 --- a/PyViCare/PyViCareHeatPump.py +++ b/PyViCare/PyViCareHeatPump.py @@ -1,12 +1,15 @@ from contextlib import suppress from typing import Any, List -from PyViCare.PyViCareHeatingDevice import (HeatingDevice, - HeatingDeviceWithComponent) +from PyViCare.Features.FeatureVentilationModePermanent import FeatureVentilationModePermanent +from PyViCare.Features.FeatureVentilationModes import FeatureVentilationModes +from PyViCare.Features.FeatureVentilationQuickmodes import FeatureVentilationQuickmodes +from PyViCare.Features.FeatureVentilationState import FeatureVentilationState +from PyViCare.PyViCareHeatingDevice import HeatingDevice, HeatingDeviceWithComponent from PyViCare.PyViCareUtils import PyViCareNotSupportedFeatureError, handleAPICommandErrors, handleNotSupported -class HeatPump(HeatingDevice): +class HeatPump(FeatureVentilationModePermanent, FeatureVentilationModes, FeatureVentilationQuickmodes, FeatureVentilationState, HeatingDevice): @property def compressors(self) -> List[Any]: @@ -118,14 +121,17 @@ def getPowerSummaryConsumptionDomesticHotWaterLastYear(self): def getVolumetricFlowReturn(self): return self.service.getProperty("heating.sensors.volumetricFlow.allengra")["properties"]['value']['value'] + #TODO: deprecate, use getVentilationModes @handleNotSupported def getAvailableVentilationModes(self): return self.service.getProperty("ventilation.operating.modes.active")["commands"]["setMode"]["params"]["mode"]["constraints"]["enum"] + #TODO: deprecate, use getActiveVentilationMode @handleNotSupported def getActiveVentilationMode(self): return self.service.getProperty("ventilation.operating.modes.active")["properties"]["value"]["value"] + #TODO: deprecate, use activateVentilationMode def setActiveVentilationMode(self, mode): """ Set the active mode Parameters diff --git a/PyViCare/PyViCareVentilationDevice.py b/PyViCare/PyViCareVentilationDevice.py index 123e289a..16fae89e 100644 --- a/PyViCare/PyViCareVentilationDevice.py +++ b/PyViCare/PyViCareVentilationDevice.py @@ -1,27 +1,32 @@ from contextlib import suppress +from PyViCare.Features.FeatureVentilationModePermanent import FeatureVentilationModePermanent +from PyViCare.Features.FeatureVentilationModes import FeatureVentilationModes from PyViCare.Features.FeatureVentilationQuickmodes import FeatureVentilationQuickmodes from PyViCare.Features.FeatureVentilationState import FeatureVentilationState from PyViCare.PyViCareDevice import Device from PyViCare.PyViCareUtils import (PyViCareNotSupportedFeatureError, handleAPICommandErrors, handleNotSupported) -class VentilationDevice(FeatureVentilationQuickmodes, FeatureVentilationState, Device): +class VentilationDevice(FeatureVentilationModePermanent, FeatureVentilationModes, FeatureVentilationQuickmodes, FeatureVentilationState, Device): """This is the base class for all ventilation devices. This class connects to the Viessmann ViCare API. The authentication is done through OAuth2. Note that currently, a new token is generated for each run. """ + #TODO: deprecate, use getVentilationModes @handleNotSupported def getAvailableModes(self): return self.service.getProperty("ventilation.operating.modes.active")["commands"]["setMode"]["params"]["mode"]["constraints"]["enum"] + #TODO: deprecate, use getActiveVentilationMode @handleNotSupported def getActiveMode(self): return self.service.getProperty("ventilation.operating.modes.active")["properties"]["value"]["value"] + #TODO: deprecate, use activateVentilationMode def setActiveMode(self, mode): """ Set the active mode Parameters @@ -77,10 +82,12 @@ def deactivateProgram(self, program): """ return self.service.setProperty(f"ventilation.operating.programs.{program}", "deactivate", {}) + #TODO: deprecate, use getVentilationModePermanentLevels @handleNotSupported def getPermanentLevels(self) -> list[str]: return list[str](self.service.getProperty("ventilation.operating.modes.permanent")["commands"]["setLevel"]["params"]["level"]["constraints"]["enum"]) + #TODO: deprecate, use setVentilationModePermanentLevel @handleAPICommandErrors def setPermanentLevel(self, level: str): return self.service.setProperty("ventilation.operating.modes.permanent", "setLevel", {'level': level}) From 676bf2a549fe2414d14011b67de392b502542407 Mon Sep 17 00:00:00 2001 From: Christopher Fenner Date: Mon, 23 Dec 2024 21:59:38 +0100 Subject: [PATCH 09/18] fix test cases --- tests/test_VitoairFs300E.py | 1 + tests/test_Vitopure350.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/test_VitoairFs300E.py b/tests/test_VitoairFs300E.py index 5eee55f4..dc72a086 100644 --- a/tests/test_VitoairFs300E.py +++ b/tests/test_VitoairFs300E.py @@ -52,6 +52,7 @@ def test_getVentilationModes(self): def test_getVentilationMode(self): self.assertEqual(False, self.device.getVentilationMode("filterChange")) + def test_ventilationQuickmode(self): self.assertEqual(self.device.getVentilationQuickmode("forcedLevelFour"), False) self.assertEqual(self.device.getVentilationQuickmode("silent"), False) diff --git a/tests/test_Vitopure350.py b/tests/test_Vitopure350.py index fabd0539..4ac9e8af 100644 --- a/tests/test_Vitopure350.py +++ b/tests/test_Vitopure350.py @@ -65,13 +65,13 @@ def test_ventilationQuickmodes(self): "silent", ]) - def test_activateComfort(self): + def test_activateVentilationQuickmodeStandby(self): self.device.activateVentilationQuickmode("standby") self.assertEqual(len(self.service.setPropertyData), 1) self.assertEqual(self.service.setPropertyData[0]['action'], 'activate') self.assertEqual(self.service.setPropertyData[0]['property_name'], 'ventilation.quickmodes.standby') - def test_deactivateComfort(self): + def test_deactivateVentilationQuickmodeStandby(self): self.device.deactivateVentilationQuickmode("standby") self.assertEqual(len(self.service.setPropertyData), 1) self.assertEqual(self.service.setPropertyData[0]['action'], 'deactivate') From 0d2bdc26b7069747999f0423272c26bb2944b839 Mon Sep 17 00:00:00 2001 From: Christopher Fenner Date: Mon, 23 Dec 2024 22:32:34 +0100 Subject: [PATCH 10/18] consolidate --- PyViCare/Features/FeatureVentilation.py | 72 +++++++++++++++++++ .../FeatureVentilationModePermanent.py | 11 --- PyViCare/Features/FeatureVentilationModes.py | 29 -------- .../Features/FeatureVentilationQuickmodes.py | 26 ------- PyViCare/Features/FeatureVentilationState.py | 15 ---- PyViCare/PyViCareHeatPump.py | 7 +- PyViCare/PyViCareVentilationDevice.py | 7 +- 7 files changed, 76 insertions(+), 91 deletions(-) create mode 100644 PyViCare/Features/FeatureVentilation.py delete mode 100644 PyViCare/Features/FeatureVentilationModePermanent.py delete mode 100644 PyViCare/Features/FeatureVentilationModes.py delete mode 100644 PyViCare/Features/FeatureVentilationQuickmodes.py delete mode 100644 PyViCare/Features/FeatureVentilationState.py diff --git a/PyViCare/Features/FeatureVentilation.py b/PyViCare/Features/FeatureVentilation.py new file mode 100644 index 00000000..a7946a3e --- /dev/null +++ b/PyViCare/Features/FeatureVentilation.py @@ -0,0 +1,72 @@ +from contextlib import suppress + +from PyViCare.PyViCareDevice import Device +from PyViCare.PyViCareUtils import PyViCareNotSupportedFeatureError, handleAPICommandErrors, handleNotSupported + +class FeatureVentilation(Device): + @handleNotSupported + def getVentilationDemand(self) -> str: + return str(self.service.getProperty("ventilation.operating.state")["properties"]["demand"]["value"]) + + @handleNotSupported + def getVentilationLevel(self) -> str: + return str(self.service.getProperty("ventilation.operating.state")["properties"]["level"]["value"]) + + @handleNotSupported + def getVentilationReason(self) -> str: + return str(self.service.getProperty("ventilation.operating.state")["properties"]["reason"]["value"]) + + @handleNotSupported + def getVentilationModes(self) -> list[str]: + return list[str](self.service.getProperty("ventilation.operating.modes.active")["commands"]["setMode"]["params"]["mode"]["constraints"]["enum"]) + + @handleNotSupported + def getVentilationMode(self, mode: str) -> bool: + return bool(self.service.getProperty(f"ventilation.operating.modes.{mode}")["properties"]["active"]["value"]) + + @handleNotSupported + def getActiveVentilationMode(self) -> str: + return str(self.service.getProperty("ventilation.operating.modes.active")["properties"]["value"]["value"]) + + def activateVentilationMode(self, mode: str): + """ Set the active ventilation mode + Parameters + ---------- + mode : str + Valid mode can be obtained using getVentilationModes() + + Returns + ------- + result: json + json representation of the answer + """ + return self.service.setProperty("ventilation.operating.modes.active", "setMode", {'mode': mode}) + + @handleNotSupported + def getVentilationModePermanentLevels(self) -> list[str]: + return list[str](self.service.getProperty("ventilation.operating.modes.permanent")["commands"]["setLevel"]["params"]["level"]["constraints"]["enum"]) + + @handleAPICommandErrors + def setVentilationModePermanentLevel(self, level: str): + return self.service.setProperty("ventilation.operating.modes.permanent", "setLevel", {'level': level}) + + @handleNotSupported + def getVentilationQuickmodes(self) -> list[str]: + available_quickmodes = [] + for quickmode in ['comfort', 'eco', 'forcedLevelFour', 'holiday', 'standby', 'silent']: + with suppress(PyViCareNotSupportedFeatureError): + if self.service.getProperty(f"ventilation.quickmodes.{quickmode}") is not None: + available_quickmodes.append(quickmode) + return available_quickmodes + + @handleNotSupported + def getVentilationQuickmode(self, quickmode: str) -> bool: + return bool(self.service.getProperty(f"ventilation.quickmodes.{quickmode}")["properties"]["active"]["value"]) + + @handleNotSupported + def activateVentilationQuickmode(self, quickmode: str) -> None: + self.service.setProperty(f"ventilation.quickmodes.{quickmode}", "activate", {}) + + @handleNotSupported + def deactivateVentilationQuickmode(self, quickmode: str) -> None: + self.service.setProperty(f"ventilation.quickmodes.{quickmode}", "deactivate", {}) diff --git a/PyViCare/Features/FeatureVentilationModePermanent.py b/PyViCare/Features/FeatureVentilationModePermanent.py deleted file mode 100644 index d140bb0a..00000000 --- a/PyViCare/Features/FeatureVentilationModePermanent.py +++ /dev/null @@ -1,11 +0,0 @@ -from PyViCare.PyViCareDevice import Device -from PyViCare.PyViCareUtils import handleAPICommandErrors, handleNotSupported - -class FeatureVentilationModePermanent(Device): - @handleNotSupported - def getVentilationModePermanentLevels(self) -> list[str]: - return list[str](self.service.getProperty("ventilation.operating.modes.permanent")["commands"]["setLevel"]["params"]["level"]["constraints"]["enum"]) - - @handleAPICommandErrors - def setVentilationModePermanentLevel(self, level: str): - return self.service.setProperty("ventilation.operating.modes.permanent", "setLevel", {'level': level}) diff --git a/PyViCare/Features/FeatureVentilationModes.py b/PyViCare/Features/FeatureVentilationModes.py deleted file mode 100644 index 9ed71349..00000000 --- a/PyViCare/Features/FeatureVentilationModes.py +++ /dev/null @@ -1,29 +0,0 @@ -from PyViCare.PyViCareDevice import Device -from PyViCare.PyViCareUtils import handleNotSupported - -class FeatureVentilationModes(Device): - @handleNotSupported - def getVentilationModes(self) -> list[str]: - return list[str](self.service.getProperty("ventilation.operating.modes.active")["commands"]["setMode"]["params"]["mode"]["constraints"]["enum"]) - - @handleNotSupported - def getVentilationMode(self, mode: str) -> bool: - return bool(self.service.getProperty(f"ventilation.operating.modes.{mode}")["properties"]["active"]["value"]) - - @handleNotSupported - def getActiveVentilationMode(self) -> str: - return str(self.service.getProperty("ventilation.operating.modes.active")["properties"]["value"]["value"]) - - def activateVentilationMode(self, mode: str): - """ Set the active ventilation mode - Parameters - ---------- - mode : str - Valid mode can be obtained using getVentilationModes() - - Returns - ------- - result: json - json representation of the answer - """ - return self.service.setProperty("ventilation.operating.modes.active", "setMode", {'mode': mode}) diff --git a/PyViCare/Features/FeatureVentilationQuickmodes.py b/PyViCare/Features/FeatureVentilationQuickmodes.py deleted file mode 100644 index dc639d25..00000000 --- a/PyViCare/Features/FeatureVentilationQuickmodes.py +++ /dev/null @@ -1,26 +0,0 @@ -from contextlib import suppress - -from PyViCare.PyViCareDevice import Device -from PyViCare.PyViCareUtils import (PyViCareNotSupportedFeatureError, handleNotSupported) - -class FeatureVentilationQuickmodes(Device): - @handleNotSupported - def getVentilationQuickmodes(self) -> list[str]: - available_quickmodes = [] - for quickmode in ['comfort', 'eco', 'forcedLevelFour', 'holiday', 'standby', 'silent']: - with suppress(PyViCareNotSupportedFeatureError): - if self.service.getProperty(f"ventilation.quickmodes.{quickmode}") is not None: - available_quickmodes.append(quickmode) - return available_quickmodes - - @handleNotSupported - def getVentilationQuickmode(self, quickmode: str) -> bool: - return bool(self.service.getProperty(f"ventilation.quickmodes.{quickmode}")["properties"]["active"]["value"]) - - @handleNotSupported - def activateVentilationQuickmode(self, quickmode: str) -> None: - self.service.setProperty(f"ventilation.quickmodes.{quickmode}", "activate", {}) - - @handleNotSupported - def deactivateVentilationQuickmode(self, quickmode: str) -> None: - self.service.setProperty(f"ventilation.quickmodes.{quickmode}", "deactivate", {}) diff --git a/PyViCare/Features/FeatureVentilationState.py b/PyViCare/Features/FeatureVentilationState.py deleted file mode 100644 index b791039a..00000000 --- a/PyViCare/Features/FeatureVentilationState.py +++ /dev/null @@ -1,15 +0,0 @@ -from PyViCare.PyViCareDevice import Device -from PyViCare.PyViCareUtils import handleNotSupported - -class FeatureVentilationState(Device): - @handleNotSupported - def getVentilationDemand(self) -> str: - return str(self.service.getProperty("ventilation.operating.state")["properties"]["demand"]["value"]) - - @handleNotSupported - def getVentilationLevel(self) -> str: - return str(self.service.getProperty("ventilation.operating.state")["properties"]["level"]["value"]) - - @handleNotSupported - def getVentilationReason(self) -> str: - return str(self.service.getProperty("ventilation.operating.state")["properties"]["reason"]["value"]) diff --git a/PyViCare/PyViCareHeatPump.py b/PyViCare/PyViCareHeatPump.py index 54747e2c..e6c5cf3f 100644 --- a/PyViCare/PyViCareHeatPump.py +++ b/PyViCare/PyViCareHeatPump.py @@ -1,15 +1,12 @@ from contextlib import suppress from typing import Any, List -from PyViCare.Features.FeatureVentilationModePermanent import FeatureVentilationModePermanent -from PyViCare.Features.FeatureVentilationModes import FeatureVentilationModes -from PyViCare.Features.FeatureVentilationQuickmodes import FeatureVentilationQuickmodes -from PyViCare.Features.FeatureVentilationState import FeatureVentilationState +from PyViCare.Features.FeatureVentilation import FeatureVentilation from PyViCare.PyViCareHeatingDevice import HeatingDevice, HeatingDeviceWithComponent from PyViCare.PyViCareUtils import PyViCareNotSupportedFeatureError, handleAPICommandErrors, handleNotSupported -class HeatPump(FeatureVentilationModePermanent, FeatureVentilationModes, FeatureVentilationQuickmodes, FeatureVentilationState, HeatingDevice): +class HeatPump(FeatureVentilation, HeatingDevice): @property def compressors(self) -> List[Any]: diff --git a/PyViCare/PyViCareVentilationDevice.py b/PyViCare/PyViCareVentilationDevice.py index 16fae89e..aed9484a 100644 --- a/PyViCare/PyViCareVentilationDevice.py +++ b/PyViCare/PyViCareVentilationDevice.py @@ -1,15 +1,12 @@ from contextlib import suppress -from PyViCare.Features.FeatureVentilationModePermanent import FeatureVentilationModePermanent -from PyViCare.Features.FeatureVentilationModes import FeatureVentilationModes -from PyViCare.Features.FeatureVentilationQuickmodes import FeatureVentilationQuickmodes -from PyViCare.Features.FeatureVentilationState import FeatureVentilationState +from PyViCare.Features.FeatureVentilation import FeatureVentilation from PyViCare.PyViCareDevice import Device from PyViCare.PyViCareUtils import (PyViCareNotSupportedFeatureError, handleAPICommandErrors, handleNotSupported) -class VentilationDevice(FeatureVentilationModePermanent, FeatureVentilationModes, FeatureVentilationQuickmodes, FeatureVentilationState, Device): +class VentilationDevice(FeatureVentilation, Device): """This is the base class for all ventilation devices. This class connects to the Viessmann ViCare API. The authentication is done through OAuth2. From 8574f755c6354f013cc6ad32002c40edcc79eb6c Mon Sep 17 00:00:00 2001 From: Christopher Fenner Date: Thu, 26 Dec 2024 08:47:23 +0100 Subject: [PATCH 11/18] reuse ventilation class --- PyViCare/PyViCareHeatPump.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PyViCare/PyViCareHeatPump.py b/PyViCare/PyViCareHeatPump.py index e6c5cf3f..212b53e3 100644 --- a/PyViCare/PyViCareHeatPump.py +++ b/PyViCare/PyViCareHeatPump.py @@ -1,12 +1,12 @@ from contextlib import suppress from typing import Any, List -from PyViCare.Features.FeatureVentilation import FeatureVentilation from PyViCare.PyViCareHeatingDevice import HeatingDevice, HeatingDeviceWithComponent from PyViCare.PyViCareUtils import PyViCareNotSupportedFeatureError, handleAPICommandErrors, handleNotSupported +from PyViCare.PyViCareVentilationDevice import VentilationDevice -class HeatPump(FeatureVentilation, HeatingDevice): +class HeatPump(VentilationDevice, HeatingDevice): @property def compressors(self) -> List[Any]: From b5994488bbb74c3aa5a29fccfb25a45a4f8aeea0 Mon Sep 17 00:00:00 2001 From: Christopher Fenner Date: Thu, 26 Dec 2024 13:36:34 +0100 Subject: [PATCH 12/18] remove feature class --- PyViCare/Features/FeatureVentilation.py | 72 ------------------------- PyViCare/Features/__init__.py | 0 2 files changed, 72 deletions(-) delete mode 100644 PyViCare/Features/FeatureVentilation.py delete mode 100644 PyViCare/Features/__init__.py diff --git a/PyViCare/Features/FeatureVentilation.py b/PyViCare/Features/FeatureVentilation.py deleted file mode 100644 index a7946a3e..00000000 --- a/PyViCare/Features/FeatureVentilation.py +++ /dev/null @@ -1,72 +0,0 @@ -from contextlib import suppress - -from PyViCare.PyViCareDevice import Device -from PyViCare.PyViCareUtils import PyViCareNotSupportedFeatureError, handleAPICommandErrors, handleNotSupported - -class FeatureVentilation(Device): - @handleNotSupported - def getVentilationDemand(self) -> str: - return str(self.service.getProperty("ventilation.operating.state")["properties"]["demand"]["value"]) - - @handleNotSupported - def getVentilationLevel(self) -> str: - return str(self.service.getProperty("ventilation.operating.state")["properties"]["level"]["value"]) - - @handleNotSupported - def getVentilationReason(self) -> str: - return str(self.service.getProperty("ventilation.operating.state")["properties"]["reason"]["value"]) - - @handleNotSupported - def getVentilationModes(self) -> list[str]: - return list[str](self.service.getProperty("ventilation.operating.modes.active")["commands"]["setMode"]["params"]["mode"]["constraints"]["enum"]) - - @handleNotSupported - def getVentilationMode(self, mode: str) -> bool: - return bool(self.service.getProperty(f"ventilation.operating.modes.{mode}")["properties"]["active"]["value"]) - - @handleNotSupported - def getActiveVentilationMode(self) -> str: - return str(self.service.getProperty("ventilation.operating.modes.active")["properties"]["value"]["value"]) - - def activateVentilationMode(self, mode: str): - """ Set the active ventilation mode - Parameters - ---------- - mode : str - Valid mode can be obtained using getVentilationModes() - - Returns - ------- - result: json - json representation of the answer - """ - return self.service.setProperty("ventilation.operating.modes.active", "setMode", {'mode': mode}) - - @handleNotSupported - def getVentilationModePermanentLevels(self) -> list[str]: - return list[str](self.service.getProperty("ventilation.operating.modes.permanent")["commands"]["setLevel"]["params"]["level"]["constraints"]["enum"]) - - @handleAPICommandErrors - def setVentilationModePermanentLevel(self, level: str): - return self.service.setProperty("ventilation.operating.modes.permanent", "setLevel", {'level': level}) - - @handleNotSupported - def getVentilationQuickmodes(self) -> list[str]: - available_quickmodes = [] - for quickmode in ['comfort', 'eco', 'forcedLevelFour', 'holiday', 'standby', 'silent']: - with suppress(PyViCareNotSupportedFeatureError): - if self.service.getProperty(f"ventilation.quickmodes.{quickmode}") is not None: - available_quickmodes.append(quickmode) - return available_quickmodes - - @handleNotSupported - def getVentilationQuickmode(self, quickmode: str) -> bool: - return bool(self.service.getProperty(f"ventilation.quickmodes.{quickmode}")["properties"]["active"]["value"]) - - @handleNotSupported - def activateVentilationQuickmode(self, quickmode: str) -> None: - self.service.setProperty(f"ventilation.quickmodes.{quickmode}", "activate", {}) - - @handleNotSupported - def deactivateVentilationQuickmode(self, quickmode: str) -> None: - self.service.setProperty(f"ventilation.quickmodes.{quickmode}", "deactivate", {}) diff --git a/PyViCare/Features/__init__.py b/PyViCare/Features/__init__.py deleted file mode 100644 index e69de29b..00000000 From 707ffce2b2ae2364ccf6933d0f6b82d10446fa63 Mon Sep 17 00:00:00 2001 From: Christopher Fenner Date: Thu, 26 Dec 2024 14:43:25 +0100 Subject: [PATCH 13/18] add ventilation methods --- PyViCare/PyViCareVentilationDevice.py | 155 ++++++++++++++++++++++---- poetry.lock | 93 +++++++++++++++- pyproject.toml | 1 + 3 files changed, 226 insertions(+), 23 deletions(-) diff --git a/PyViCare/PyViCareVentilationDevice.py b/PyViCare/PyViCareVentilationDevice.py index aed9484a..66b94e4e 100644 --- a/PyViCare/PyViCareVentilationDevice.py +++ b/PyViCare/PyViCareVentilationDevice.py @@ -1,29 +1,84 @@ - from contextlib import suppress +from deprecated import deprecated -from PyViCare.Features.FeatureVentilation import FeatureVentilation from PyViCare.PyViCareDevice import Device from PyViCare.PyViCareUtils import (PyViCareNotSupportedFeatureError, handleAPICommandErrors, handleNotSupported) -class VentilationDevice(FeatureVentilation, Device): +class VentilationDevice(Device): """This is the base class for all ventilation devices. This class connects to the Viessmann ViCare API. The authentication is done through OAuth2. Note that currently, a new token is generated for each run. """ - #TODO: deprecate, use getVentilationModes @handleNotSupported + def getVentilationDemand(self) -> str: + return str(self.service.getProperty("ventilation.operating.state")["properties"]["demand"]["value"]) + + @handleNotSupported + def getVentilationReason(self) -> str: + return str(self.service.getProperty("ventilation.operating.state")["properties"]["reason"]["value"]) + + @handleNotSupported + def getVentilationModes(self) -> list[str]: + return list[str](self.service.getProperty("ventilation.operating.modes.active")["commands"]["setMode"]["params"]["mode"]["constraints"]["enum"]) + + @handleNotSupported + @deprecated(reason="renamed, use getVentilationModes") def getAvailableModes(self): - return self.service.getProperty("ventilation.operating.modes.active")["commands"]["setMode"]["params"]["mode"]["constraints"]["enum"] + return self.getVentilationModes() + + @handleNotSupported + def getVentilationMode(self, mode: str) -> bool: + return bool(self.service.getProperty(f"ventilation.operating.modes.{mode}")["properties"]["active"]["value"]) - #TODO: deprecate, use getActiveVentilationMode @handleNotSupported + def getActiveVentilationMode(self) -> str: + return str(self.service.getProperty("ventilation.operating.modes.active")["properties"]["value"]["value"]) + + @handleNotSupported + def getVentilationLevels(self) -> list[str]: + return list[str](self.service.getProperty("ventilation.operating.modes.permanent")["commands"]["setLevel"]["params"]["level"]["constraints"]["enum"]) + + @handleNotSupported + @deprecated(reason="renamed, use getVentilationLevels") + def getPermanentLevels(self) -> list[str]: + return self.getVentilationLevels() + + @handleNotSupported + def getVentilationLevel(self) -> str: + return str(self.service.getProperty("ventilation.operating.state")["properties"]["level"]["value"]) + + @handleAPICommandErrors + def setVentilationLevel(self, level: str): + return self.service.setProperty("ventilation.operating.modes.permanent", "setLevel", {'level': level}) + + @handleAPICommandErrors + @deprecated(reason="renamed, use setVentilationLevel") + def setPermanentLevel(self, level: str): + return self.setVentilationLevel(level) + + @handleNotSupported + @deprecated(reason="renamed, use getActiveVentilationMode") def getActiveMode(self): - return self.service.getProperty("ventilation.operating.modes.active")["properties"]["value"]["value"] + return self.getActiveVentilationMode() + + def activateVentilationMode(self, mode: str): + """ Set the active ventilation mode + Parameters + ---------- + mode : str + Valid mode can be obtained using getVentilationModes() + + Returns + ------- + result: json + json representation of the answer + """ + return self.service.setProperty("ventilation.operating.modes.active", "setMode", {'mode': mode}) - #TODO: deprecate, use activateVentilationMode + @deprecated(reason="renamed, use activateVentilationMode") def setActiveMode(self, mode): """ Set the active mode Parameters @@ -36,10 +91,31 @@ def setActiveMode(self, mode): result: json json representation of the answer """ - return self.service.setProperty("ventilation.operating.modes.active", "setMode", {'mode': mode}) + return self.activateVentilationMode(mode) @handleNotSupported - def getAvailablePrograms(self): + def getVentilationQuickmodes(self) -> list[str]: + available_quickmodes = [] + for quickmode in ['comfort', 'eco', 'forcedLevelFour', 'holiday', 'standby', 'silent']: + with suppress(PyViCareNotSupportedFeatureError): + if self.service.getProperty(f"ventilation.quickmodes.{quickmode}") is not None: + available_quickmodes.append(quickmode) + return available_quickmodes + + @handleNotSupported + def getVentilationQuickmode(self, quickmode: str) -> bool: + return bool(self.service.getProperty(f"ventilation.quickmodes.{quickmode}")["properties"]["active"]["value"]) + + @handleNotSupported + def activateVentilationQuickmode(self, quickmode: str) -> None: + self.service.setProperty(f"ventilation.quickmodes.{quickmode}", "activate", {}) + + @handleNotSupported + def deactivateVentilationQuickmode(self, quickmode: str) -> None: + self.service.setProperty(f"ventilation.quickmodes.{quickmode}", "deactivate", {}) + + @handleNotSupported + def getVentilationPrograms(self): available_programs = [] for program in ['basic', 'intensive', 'reduced', 'standard', 'standby', 'holidayAtHome', 'permanent']: with suppress(PyViCareNotSupportedFeatureError): @@ -48,10 +124,20 @@ def getAvailablePrograms(self): return available_programs @handleNotSupported - def getActiveProgram(self): + @deprecated(reason="renamed, use getVentilationPrograms") + def getAvailablePrograms(self): + return self.getVentilationPrograms() + + @handleNotSupported + def getActiveVentilationProgram(self): return self.service.getProperty("ventilation.operating.programs.active")["properties"]["value"]["value"] - def activateProgram(self, program): + @handleNotSupported + @deprecated(reason="renamed, use getActiveVentilationProgram") + def getActiveProgram(self): + return self.getActiveVentilationProgram() + + def activateVentilationProgram(self, program): """ Activate a program NOTE DEVICE_COMMUNICATION_ERROR can just mean that the program is already on @@ -66,7 +152,23 @@ def activateProgram(self, program): """ return self.service.setProperty(f"ventilation.operating.programs.{program}", "activate", {}) - def deactivateProgram(self, program): + @deprecated(reason="renamed, use activateVentilationProgram") + def activateProgram(self, program): + """ Activate a program + NOTE + DEVICE_COMMUNICATION_ERROR can just mean that the program is already on + Parameters + ---------- + program : str + + Returns + ------- + result: json + json representation of the answer + """ + return self.activateVentilationProgram(program) + + def deactivateVentilationProgram(self, program): """ Deactivate a program Parameters ---------- @@ -79,18 +181,22 @@ def deactivateProgram(self, program): """ return self.service.setProperty(f"ventilation.operating.programs.{program}", "deactivate", {}) - #TODO: deprecate, use getVentilationModePermanentLevels - @handleNotSupported - def getPermanentLevels(self) -> list[str]: - return list[str](self.service.getProperty("ventilation.operating.modes.permanent")["commands"]["setLevel"]["params"]["level"]["constraints"]["enum"]) + @deprecated(reason="renamed, use deactivateVentilationProgram") + def deactivateProgram(self, program): + """ Deactivate a program + Parameters + ---------- + program : str - #TODO: deprecate, use setVentilationModePermanentLevel - @handleAPICommandErrors - def setPermanentLevel(self, level: str): - return self.service.setProperty("ventilation.operating.modes.permanent", "setLevel", {'level': level}) + Returns + ------- + result: json + json representation of the answer + """ + return self.deactivateVentilationProgram(program) @handleNotSupported - def getSchedule(self): + def getVentilationSchedule(self): properties = self.service.getProperty("ventilation.schedule")["properties"] return { "active": properties["active"]["value"], @@ -102,3 +208,8 @@ def getSchedule(self): "sat": properties["entries"]["value"]["sat"], "sun": properties["entries"]["value"]["sun"] } + + @handleNotSupported + @deprecated(reason="renamed, use getVentilationSchedule") + def getSchedule(self): + return self.getVentilationSchedule() diff --git a/poetry.lock b/poetry.lock index 3baa014a..7cb5bdb4 100644 --- a/poetry.lock +++ b/poetry.lock @@ -386,6 +386,23 @@ ssh = ["bcrypt (>=3.1.5)"] test = ["certifi", "cryptography-vectors (==43.0.3)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] +[[package]] +name = "deprecated" +version = "1.2.15" +description = "Python @deprecated decorator to deprecate old python classes, functions or methods." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +files = [ + {file = "Deprecated-1.2.15-py2.py3-none-any.whl", hash = "sha256:353bc4a8ac4bfc96800ddab349d89c25dec1079f65fd53acdcc1e0b975b21320"}, + {file = "deprecated-1.2.15.tar.gz", hash = "sha256:683e561a90de76239796e6b6feac66b99030d2dd3fcf61ef996330f14bbb9b0d"}, +] + +[package.dependencies] +wrapt = ">=1.10,<2" + +[package.extras] +dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "jinja2 (>=3.0.3,<3.1.0)", "setuptools", "sphinx (<2)", "tox"] + [[package]] name = "dill" version = "0.3.9" @@ -764,7 +781,81 @@ h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] +[[package]] +name = "wrapt" +version = "1.17.0" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.8" +files = [ + {file = "wrapt-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a0c23b8319848426f305f9cb0c98a6e32ee68a36264f45948ccf8e7d2b941f8"}, + {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1ca5f060e205f72bec57faae5bd817a1560fcfc4af03f414b08fa29106b7e2d"}, + {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e185ec6060e301a7e5f8461c86fb3640a7beb1a0f0208ffde7a65ec4074931df"}, + {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb90765dd91aed05b53cd7a87bd7f5c188fcd95960914bae0d32c5e7f899719d"}, + {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:879591c2b5ab0a7184258274c42a126b74a2c3d5a329df16d69f9cee07bba6ea"}, + {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fce6fee67c318fdfb7f285c29a82d84782ae2579c0e1b385b7f36c6e8074fffb"}, + {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0698d3a86f68abc894d537887b9bbf84d29bcfbc759e23f4644be27acf6da301"}, + {file = "wrapt-1.17.0-cp310-cp310-win32.whl", hash = "sha256:69d093792dc34a9c4c8a70e4973a3361c7a7578e9cd86961b2bbf38ca71e4e22"}, + {file = "wrapt-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:f28b29dc158ca5d6ac396c8e0a2ef45c4e97bb7e65522bfc04c989e6fe814575"}, + {file = "wrapt-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:74bf625b1b4caaa7bad51d9003f8b07a468a704e0644a700e936c357c17dd45a"}, + {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f2a28eb35cf99d5f5bd12f5dd44a0f41d206db226535b37b0c60e9da162c3ed"}, + {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81b1289e99cf4bad07c23393ab447e5e96db0ab50974a280f7954b071d41b489"}, + {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2939cd4a2a52ca32bc0b359015718472d7f6de870760342e7ba295be9ebaf9"}, + {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a9653131bda68a1f029c52157fd81e11f07d485df55410401f745007bd6d339"}, + {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4e4b4385363de9052dac1a67bfb535c376f3d19c238b5f36bddc95efae15e12d"}, + {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bdf62d25234290db1837875d4dceb2151e4ea7f9fff2ed41c0fde23ed542eb5b"}, + {file = "wrapt-1.17.0-cp311-cp311-win32.whl", hash = "sha256:5d8fd17635b262448ab8f99230fe4dac991af1dabdbb92f7a70a6afac8a7e346"}, + {file = "wrapt-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:92a3d214d5e53cb1db8b015f30d544bc9d3f7179a05feb8f16df713cecc2620a"}, + {file = "wrapt-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:89fc28495896097622c3fc238915c79365dd0ede02f9a82ce436b13bd0ab7569"}, + {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:875d240fdbdbe9e11f9831901fb8719da0bd4e6131f83aa9f69b96d18fae7504"}, + {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ed16d95fd142e9c72b6c10b06514ad30e846a0d0917ab406186541fe68b451"}, + {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b956061b8db634120b58f668592a772e87e2e78bc1f6a906cfcaa0cc7991c1"}, + {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:daba396199399ccabafbfc509037ac635a6bc18510ad1add8fd16d4739cdd106"}, + {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4d63f4d446e10ad19ed01188d6c1e1bb134cde8c18b0aa2acfd973d41fcc5ada"}, + {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8a5e7cc39a45fc430af1aefc4d77ee6bad72c5bcdb1322cfde852c15192b8bd4"}, + {file = "wrapt-1.17.0-cp312-cp312-win32.whl", hash = "sha256:0a0a1a1ec28b641f2a3a2c35cbe86c00051c04fffcfcc577ffcdd707df3f8635"}, + {file = "wrapt-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:3c34f6896a01b84bab196f7119770fd8466c8ae3dfa73c59c0bb281e7b588ce7"}, + {file = "wrapt-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:714c12485aa52efbc0fc0ade1e9ab3a70343db82627f90f2ecbc898fdf0bb181"}, + {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da427d311782324a376cacb47c1a4adc43f99fd9d996ffc1b3e8529c4074d393"}, + {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba1739fb38441a27a676f4de4123d3e858e494fac05868b7a281c0a383c098f4"}, + {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e711fc1acc7468463bc084d1b68561e40d1eaa135d8c509a65dd534403d83d7b"}, + {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:140ea00c87fafc42739bd74a94a5a9003f8e72c27c47cd4f61d8e05e6dec8721"}, + {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:73a96fd11d2b2e77d623a7f26e004cc31f131a365add1ce1ce9a19e55a1eef90"}, + {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0b48554952f0f387984da81ccfa73b62e52817a4386d070c75e4db7d43a28c4a"}, + {file = "wrapt-1.17.0-cp313-cp313-win32.whl", hash = "sha256:498fec8da10e3e62edd1e7368f4b24aa362ac0ad931e678332d1b209aec93045"}, + {file = "wrapt-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:fd136bb85f4568fffca995bd3c8d52080b1e5b225dbf1c2b17b66b4c5fa02838"}, + {file = "wrapt-1.17.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:17fcf043d0b4724858f25b8826c36e08f9fb2e475410bece0ec44a22d533da9b"}, + {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4a557d97f12813dc5e18dad9fa765ae44ddd56a672bb5de4825527c847d6379"}, + {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0229b247b0fc7dee0d36176cbb79dbaf2a9eb7ecc50ec3121f40ef443155fb1d"}, + {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8425cfce27b8b20c9b89d77fb50e368d8306a90bf2b6eef2cdf5cd5083adf83f"}, + {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c900108df470060174108012de06d45f514aa4ec21a191e7ab42988ff42a86c"}, + {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:4e547b447073fc0dbfcbff15154c1be8823d10dab4ad401bdb1575e3fdedff1b"}, + {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:914f66f3b6fc7b915d46c1cc424bc2441841083de01b90f9e81109c9759e43ab"}, + {file = "wrapt-1.17.0-cp313-cp313t-win32.whl", hash = "sha256:a4192b45dff127c7d69b3bdfb4d3e47b64179a0b9900b6351859f3001397dabf"}, + {file = "wrapt-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:4f643df3d4419ea3f856c5c3f40fec1d65ea2e89ec812c83f7767c8730f9827a"}, + {file = "wrapt-1.17.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:69c40d4655e078ede067a7095544bcec5a963566e17503e75a3a3e0fe2803b13"}, + {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f495b6754358979379f84534f8dd7a43ff8cff2558dcdea4a148a6e713a758f"}, + {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:baa7ef4e0886a6f482e00d1d5bcd37c201b383f1d314643dfb0367169f94f04c"}, + {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fc931382e56627ec4acb01e09ce66e5c03c384ca52606111cee50d931a342d"}, + {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8f8909cdb9f1b237786c09a810e24ee5e15ef17019f7cecb207ce205b9b5fcce"}, + {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ad47b095f0bdc5585bced35bd088cbfe4177236c7df9984b3cc46b391cc60627"}, + {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:948a9bd0fb2c5120457b07e59c8d7210cbc8703243225dbd78f4dfc13c8d2d1f"}, + {file = "wrapt-1.17.0-cp38-cp38-win32.whl", hash = "sha256:5ae271862b2142f4bc687bdbfcc942e2473a89999a54231aa1c2c676e28f29ea"}, + {file = "wrapt-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:f335579a1b485c834849e9075191c9898e0731af45705c2ebf70e0cd5d58beed"}, + {file = "wrapt-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d751300b94e35b6016d4b1e7d0e7bbc3b5e1751e2405ef908316c2a9024008a1"}, + {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7264cbb4a18dc4acfd73b63e4bcfec9c9802614572025bdd44d0721983fc1d9c"}, + {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33539c6f5b96cf0b1105a0ff4cf5db9332e773bb521cc804a90e58dc49b10578"}, + {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c30970bdee1cad6a8da2044febd824ef6dc4cc0b19e39af3085c763fdec7de33"}, + {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bc7f729a72b16ee21795a943f85c6244971724819819a41ddbaeb691b2dd85ad"}, + {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6ff02a91c4fc9b6a94e1c9c20f62ea06a7e375f42fe57587f004d1078ac86ca9"}, + {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2dfb7cff84e72e7bf975b06b4989477873dcf160b2fd89959c629535df53d4e0"}, + {file = "wrapt-1.17.0-cp39-cp39-win32.whl", hash = "sha256:2399408ac33ffd5b200480ee858baa58d77dd30e0dd0cab6a8a9547135f30a88"}, + {file = "wrapt-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:4f763a29ee6a20c529496a20a7bcb16a73de27f5da6a843249c7047daf135977"}, + {file = "wrapt-1.17.0-py3-none-any.whl", hash = "sha256:d2c63b93548eda58abf5188e505ffed0229bf675f7c3090f8e36ad55b8cbc371"}, + {file = "wrapt-1.17.0.tar.gz", hash = "sha256:16187aa2317c731170a88ef35e8937ae0f533c402872c1ee5e6d079fcf320801"}, +] + [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "5d7cbd6f2916dd8463e49a942da4281c5e5fda5a51c9df18ae843e4b085c787f" +content-hash = "18647d631135c240364d20c87da34fd556dafcd3d85e4f1c6d0dc2fc99f336a9" diff --git a/pyproject.toml b/pyproject.toml index 7683eef3..b2aeb6f5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,6 +44,7 @@ Changelog = "https://github.com/openviess/PyViCare/releases" authlib = ">1.2.0" python = "^3.9" requests = ">=2.31.0" +deprecated = "^1.2.15" [tool.poetry.group.dev.dependencies] codespell = "^2.3.0" From 9755cced8f230c6330a806ebb560a7b374d49f1b Mon Sep 17 00:00:00 2001 From: Christopher Fenner Date: Thu, 26 Dec 2024 14:44:00 +0100 Subject: [PATCH 14/18] change order --- PyViCare/PyViCareHeatPump.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PyViCare/PyViCareHeatPump.py b/PyViCare/PyViCareHeatPump.py index 212b53e3..6cb84d74 100644 --- a/PyViCare/PyViCareHeatPump.py +++ b/PyViCare/PyViCareHeatPump.py @@ -6,7 +6,7 @@ from PyViCare.PyViCareVentilationDevice import VentilationDevice -class HeatPump(VentilationDevice, HeatingDevice): +class HeatPump(HeatingDevice, VentilationDevice): @property def compressors(self) -> List[Any]: From 279ce6478f18e32eae293d5efd333e38b7e29647 Mon Sep 17 00:00:00 2001 From: Christopher Fenner Date: Thu, 26 Dec 2024 14:46:07 +0100 Subject: [PATCH 15/18] adjust test case --- tests/test_Vitopure350.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_Vitopure350.py b/tests/test_Vitopure350.py index 4ac9e8af..ed741bc5 100644 --- a/tests/test_Vitopure350.py +++ b/tests/test_Vitopure350.py @@ -46,9 +46,9 @@ def test_getVentilationModes(self): def test_getVentilationMode(self): self.assertEqual(False, self.device.getVentilationMode("filterChange")) - def test_getVentilationModePermanentLevel(self): + def test_getVentilationLevels(self): expected_levels = ['levelOne', 'levelTwo', 'levelThree', 'levelFour'] - self.assertListEqual(expected_levels, self.device.getVentilationModePermanentLevels()) + self.assertListEqual(expected_levels, self.device.getVentilationLevels()) def test_ventilationState(self): self.assertEqual(self.device.getVentilationDemand(), "unknown") From feff0e4949a6b586d2bfeb0d3ab3ba2421cd1778 Mon Sep 17 00:00:00 2001 From: Christopher Fenner Date: Thu, 26 Dec 2024 15:17:46 +0100 Subject: [PATCH 16/18] deprecate ventilation functions --- PyViCare/PyViCareHeatPump.py | 44 +++++++----------------------------- 1 file changed, 8 insertions(+), 36 deletions(-) diff --git a/PyViCare/PyViCareHeatPump.py b/PyViCare/PyViCareHeatPump.py index 6cb84d74..49cbaf89 100644 --- a/PyViCare/PyViCareHeatPump.py +++ b/PyViCare/PyViCareHeatPump.py @@ -1,8 +1,8 @@ -from contextlib import suppress from typing import Any, List +from deprecated import deprecated from PyViCare.PyViCareHeatingDevice import HeatingDevice, HeatingDeviceWithComponent -from PyViCare.PyViCareUtils import PyViCareNotSupportedFeatureError, handleAPICommandErrors, handleNotSupported +from PyViCare.PyViCareUtils import handleAPICommandErrors, handleNotSupported from PyViCare.PyViCareVentilationDevice import VentilationDevice @@ -118,17 +118,12 @@ def getPowerSummaryConsumptionDomesticHotWaterLastYear(self): def getVolumetricFlowReturn(self): return self.service.getProperty("heating.sensors.volumetricFlow.allengra")["properties"]['value']['value'] - #TODO: deprecate, use getVentilationModes @handleNotSupported + @deprecated(reason="renamed, use getVentilationModes") def getAvailableVentilationModes(self): - return self.service.getProperty("ventilation.operating.modes.active")["commands"]["setMode"]["params"]["mode"]["constraints"]["enum"] + return self.getVentilationModes() - #TODO: deprecate, use getActiveVentilationMode - @handleNotSupported - def getActiveVentilationMode(self): - return self.service.getProperty("ventilation.operating.modes.active")["properties"]["value"]["value"] - - #TODO: deprecate, use activateVentilationMode + @deprecated(reason="renamed, use activateVentilationMode") def setActiveVentilationMode(self, mode): """ Set the active mode Parameters @@ -141,35 +136,12 @@ def setActiveVentilationMode(self, mode): result: json json representation of the answer """ - return self.service.setProperty("ventilation.operating.modes.active", "setMode", {'mode': mode}) + return self.activateVentilationMode(mode) @handleNotSupported + @deprecated(reason="renamed, use getVentilationPrograms") def getAvailableVentilationPrograms(self): - available_programs = [] - for program in ['basic', 'intensive', 'reduced', 'standard', 'standby', 'holidayAtHome', 'permanent']: - with suppress(PyViCareNotSupportedFeatureError): - if self.service.getProperty(f"ventilation.operating.programs.{program}") is not None: - available_programs.append(program) - return available_programs - - @handleNotSupported - def getActiveVentilationProgram(self): - return self.service.getProperty("ventilation.operating.programs.active")["properties"]["value"]["value"] - - def activateVentilationProgram(self, program): - """ Activate a ventilation program - NOTE - DEVICE_COMMUNICATION_ERROR can just mean that the program is already on - Parameters - ---------- - program : str - - Returns - ------- - result: json - json representation of the answer - """ - return self.service.setProperty(f"ventilation.operating.programs.{program}", "activate", {}) + return self.getVentilationPrograms() @handleNotSupported def getDomesticHotWaterHysteresisUnit(self) -> str: From ff41e50d61f6e5b05da68c9e91c5f77d0b19dffd Mon Sep 17 00:00:00 2001 From: Christopher Fenner Date: Thu, 26 Dec 2024 18:41:12 +0100 Subject: [PATCH 17/18] fix type --- PyViCare/PyViCareVentilationDevice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PyViCare/PyViCareVentilationDevice.py b/PyViCare/PyViCareVentilationDevice.py index 66b94e4e..4169ffb2 100644 --- a/PyViCare/PyViCareVentilationDevice.py +++ b/PyViCare/PyViCareVentilationDevice.py @@ -44,7 +44,7 @@ def getVentilationLevels(self) -> list[str]: @handleNotSupported @deprecated(reason="renamed, use getVentilationLevels") def getPermanentLevels(self) -> list[str]: - return self.getVentilationLevels() + return list[str](self.getVentilationLevels()) @handleNotSupported def getVentilationLevel(self) -> str: From a2695f3ee05a5097b64a1a310b18869cc32573f4 Mon Sep 17 00:00:00 2001 From: Christopher Fenner Date: Thu, 26 Dec 2024 18:48:04 +0100 Subject: [PATCH 18/18] add types-deprecated --- poetry.lock | 414 ++++++++++++++++++++++++++----------------------- pyproject.toml | 1 + 2 files changed, 222 insertions(+), 193 deletions(-) diff --git a/poetry.lock b/poetry.lock index 7cb5bdb4..2d1e095c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,13 +2,13 @@ [[package]] name = "astroid" -version = "3.3.5" +version = "3.3.8" description = "An abstract syntax tree for Python with inference support." optional = false python-versions = ">=3.9.0" files = [ - {file = "astroid-3.3.5-py3-none-any.whl", hash = "sha256:a9d1c946ada25098d790e079ba2a1b112157278f3fb7e718ae6a9252f5835dc8"}, - {file = "astroid-3.3.5.tar.gz", hash = "sha256:5cfc40ae9f68311075d27ef68a4841bdc5cc7f6cf86671b49f00607d30188e2d"}, + {file = "astroid-3.3.8-py3-none-any.whl", hash = "sha256:187ccc0c248bfbba564826c26f070494f7bc964fd286b6d9fff4420e55de828c"}, + {file = "astroid-3.3.8.tar.gz", hash = "sha256:a88c7994f914a4ea8572fac479459f4955eeccc877be3f2d959a33273b0cf40b"}, ] [package.dependencies] @@ -16,13 +16,13 @@ typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} [[package]] name = "authlib" -version = "1.3.2" +version = "1.4.0" description = "The ultimate Python library in building OAuth and OpenID Connect servers and clients." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "Authlib-1.3.2-py2.py3-none-any.whl", hash = "sha256:ede026a95e9f5cdc2d4364a52103f5405e75aa156357e831ef2bfd0bc5094dfc"}, - {file = "authlib-1.3.2.tar.gz", hash = "sha256:4b16130117f9eb82aa6eec97f6dd4673c3f960ac0283ccdae2897ee4bc030ba2"}, + {file = "Authlib-1.4.0-py2.py3-none-any.whl", hash = "sha256:4bb20b978c8b636222b549317c1815e1fe62234fc1c5efe8855d84aebf3a74e3"}, + {file = "authlib-1.4.0.tar.gz", hash = "sha256:1c1e6608b5ed3624aeeee136ca7f8c120d6f51f731aa152b153d54741840e1f2"}, ] [package.dependencies] @@ -30,13 +30,13 @@ cryptography = "*" [[package]] name = "certifi" -version = "2024.8.30" +version = "2024.12.14" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, - {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, + {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, + {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, ] [[package]] @@ -120,116 +120,103 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.4.0" +version = "3.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, - {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, - {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, +python-versions = ">=3.7" +files = [ + {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, + {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, + {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, ] [[package]] @@ -262,73 +249,73 @@ files = [ [[package]] name = "coverage" -version = "7.6.4" +version = "7.6.10" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" files = [ - {file = "coverage-7.6.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f8ae553cba74085db385d489c7a792ad66f7f9ba2ee85bfa508aeb84cf0ba07"}, - {file = "coverage-7.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8165b796df0bd42e10527a3f493c592ba494f16ef3c8b531288e3d0d72c1f6f0"}, - {file = "coverage-7.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c8b95bf47db6d19096a5e052ffca0a05f335bc63cef281a6e8fe864d450a72"}, - {file = "coverage-7.6.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ed9281d1b52628e81393f5eaee24a45cbd64965f41857559c2b7ff19385df51"}, - {file = "coverage-7.6.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0809082ee480bb8f7416507538243c8863ac74fd8a5d2485c46f0f7499f2b491"}, - {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d541423cdd416b78626b55f123412fcf979d22a2c39fce251b350de38c15c15b"}, - {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58809e238a8a12a625c70450b48e8767cff9eb67c62e6154a642b21ddf79baea"}, - {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c9b8e184898ed014884ca84c70562b4a82cbc63b044d366fedc68bc2b2f3394a"}, - {file = "coverage-7.6.4-cp310-cp310-win32.whl", hash = "sha256:6bd818b7ea14bc6e1f06e241e8234508b21edf1b242d49831831a9450e2f35fa"}, - {file = "coverage-7.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:06babbb8f4e74b063dbaeb74ad68dfce9186c595a15f11f5d5683f748fa1d172"}, - {file = "coverage-7.6.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:73d2b73584446e66ee633eaad1a56aad577c077f46c35ca3283cd687b7715b0b"}, - {file = "coverage-7.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51b44306032045b383a7a8a2c13878de375117946d68dcb54308111f39775a25"}, - {file = "coverage-7.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3fb02fe73bed561fa12d279a417b432e5b50fe03e8d663d61b3d5990f29546"}, - {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed8fe9189d2beb6edc14d3ad19800626e1d9f2d975e436f84e19efb7fa19469b"}, - {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e"}, - {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ade3ca1e5f0ff46b678b66201f7ff477e8fa11fb537f3b55c3f0568fbfe6e718"}, - {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:27fb4a050aaf18772db513091c9c13f6cb94ed40eacdef8dad8411d92d9992db"}, - {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f704f0998911abf728a7783799444fcbbe8261c4a6c166f667937ae6a8aa522"}, - {file = "coverage-7.6.4-cp311-cp311-win32.whl", hash = "sha256:29155cd511ee058e260db648b6182c419422a0d2e9a4fa44501898cf918866cf"}, - {file = "coverage-7.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:8902dd6a30173d4ef09954bfcb24b5d7b5190cf14a43170e386979651e09ba19"}, - {file = "coverage-7.6.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2"}, - {file = "coverage-7.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117"}, - {file = "coverage-7.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613"}, - {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27"}, - {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52"}, - {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2"}, - {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1"}, - {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5"}, - {file = "coverage-7.6.4-cp312-cp312-win32.whl", hash = "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17"}, - {file = "coverage-7.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08"}, - {file = "coverage-7.6.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9"}, - {file = "coverage-7.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba"}, - {file = "coverage-7.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c"}, - {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06"}, - {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f"}, - {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b"}, - {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21"}, - {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a"}, - {file = "coverage-7.6.4-cp313-cp313-win32.whl", hash = "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e"}, - {file = "coverage-7.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963"}, - {file = "coverage-7.6.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f"}, - {file = "coverage-7.6.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806"}, - {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11"}, - {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3"}, - {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a"}, - {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc"}, - {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70"}, - {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef"}, - {file = "coverage-7.6.4-cp313-cp313t-win32.whl", hash = "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e"}, - {file = "coverage-7.6.4-cp313-cp313t-win_amd64.whl", hash = "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1"}, - {file = "coverage-7.6.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9cb7fa111d21a6b55cbf633039f7bc2749e74932e3aa7cb7333f675a58a58bf3"}, - {file = "coverage-7.6.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:11a223a14e91a4693d2d0755c7a043db43d96a7450b4f356d506c2562c48642c"}, - {file = "coverage-7.6.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a413a096c4cbac202433c850ee43fa326d2e871b24554da8327b01632673a076"}, - {file = "coverage-7.6.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00a1d69c112ff5149cabe60d2e2ee948752c975d95f1e1096742e6077affd376"}, - {file = "coverage-7.6.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f76846299ba5c54d12c91d776d9605ae33f8ae2b9d1d3c3703cf2db1a67f2c0"}, - {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fe439416eb6380de434886b00c859304338f8b19f6f54811984f3420a2e03858"}, - {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0294ca37f1ba500667b1aef631e48d875ced93ad5e06fa665a3295bdd1d95111"}, - {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6f01ba56b1c0e9d149f9ac85a2f999724895229eb36bd997b61e62999e9b0901"}, - {file = "coverage-7.6.4-cp39-cp39-win32.whl", hash = "sha256:bc66f0bf1d7730a17430a50163bb264ba9ded56739112368ba985ddaa9c3bd09"}, - {file = "coverage-7.6.4-cp39-cp39-win_amd64.whl", hash = "sha256:c481b47f6b5845064c65a7bc78bc0860e635a9b055af0df46fdf1c58cebf8e8f"}, - {file = "coverage-7.6.4-pp39.pp310-none-any.whl", hash = "sha256:3c65d37f3a9ebb703e710befdc489a38683a5b152242664b973a7b7b22348a4e"}, - {file = "coverage-7.6.4.tar.gz", hash = "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73"}, + {file = "coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78"}, + {file = "coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c"}, + {file = "coverage-7.6.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3b204c11e2b2d883946fe1d97f89403aa1811df28ce0447439178cc7463448a"}, + {file = "coverage-7.6.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32ee6d8491fcfc82652a37109f69dee9a830e9379166cb73c16d8dc5c2915165"}, + {file = "coverage-7.6.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675cefc4c06e3b4c876b85bfb7c59c5e2218167bbd4da5075cbe3b5790a28988"}, + {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f4f620668dbc6f5e909a0946a877310fb3d57aea8198bde792aae369ee1c23b5"}, + {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4eea95ef275de7abaef630c9b2c002ffbc01918b726a39f5a4353916ec72d2f3"}, + {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e2f0280519e42b0a17550072861e0bc8a80a0870de260f9796157d3fca2733c5"}, + {file = "coverage-7.6.10-cp310-cp310-win32.whl", hash = "sha256:bc67deb76bc3717f22e765ab3e07ee9c7a5e26b9019ca19a3b063d9f4b874244"}, + {file = "coverage-7.6.10-cp310-cp310-win_amd64.whl", hash = "sha256:0f460286cb94036455e703c66988851d970fdfd8acc2a1122ab7f4f904e4029e"}, + {file = "coverage-7.6.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ea3c8f04b3e4af80e17bab607c386a830ffc2fb88a5484e1df756478cf70d1d3"}, + {file = "coverage-7.6.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:507a20fc863cae1d5720797761b42d2d87a04b3e5aeb682ef3b7332e90598f43"}, + {file = "coverage-7.6.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d37a84878285b903c0fe21ac8794c6dab58150e9359f1aaebbeddd6412d53132"}, + {file = "coverage-7.6.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a534738b47b0de1995f85f582d983d94031dffb48ab86c95bdf88dc62212142f"}, + {file = "coverage-7.6.10-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d7a2bf79378d8fb8afaa994f91bfd8215134f8631d27eba3e0e2c13546ce994"}, + {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6713ba4b4ebc330f3def51df1d5d38fad60b66720948112f114968feb52d3f99"}, + {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab32947f481f7e8c763fa2c92fd9f44eeb143e7610c4ca9ecd6a36adab4081bd"}, + {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7bbd8c8f1b115b892e34ba66a097b915d3871db7ce0e6b9901f462ff3a975377"}, + {file = "coverage-7.6.10-cp311-cp311-win32.whl", hash = "sha256:299e91b274c5c9cdb64cbdf1b3e4a8fe538a7a86acdd08fae52301b28ba297f8"}, + {file = "coverage-7.6.10-cp311-cp311-win_amd64.whl", hash = "sha256:489a01f94aa581dbd961f306e37d75d4ba16104bbfa2b0edb21d29b73be83609"}, + {file = "coverage-7.6.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853"}, + {file = "coverage-7.6.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078"}, + {file = "coverage-7.6.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0"}, + {file = "coverage-7.6.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50"}, + {file = "coverage-7.6.10-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022"}, + {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b"}, + {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0"}, + {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852"}, + {file = "coverage-7.6.10-cp312-cp312-win32.whl", hash = "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359"}, + {file = "coverage-7.6.10-cp312-cp312-win_amd64.whl", hash = "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247"}, + {file = "coverage-7.6.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9"}, + {file = "coverage-7.6.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b"}, + {file = "coverage-7.6.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690"}, + {file = "coverage-7.6.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18"}, + {file = "coverage-7.6.10-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c"}, + {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd"}, + {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e"}, + {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694"}, + {file = "coverage-7.6.10-cp313-cp313-win32.whl", hash = "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6"}, + {file = "coverage-7.6.10-cp313-cp313-win_amd64.whl", hash = "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e"}, + {file = "coverage-7.6.10-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe"}, + {file = "coverage-7.6.10-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273"}, + {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8"}, + {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098"}, + {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb"}, + {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0"}, + {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf"}, + {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2"}, + {file = "coverage-7.6.10-cp313-cp313t-win32.whl", hash = "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312"}, + {file = "coverage-7.6.10-cp313-cp313t-win_amd64.whl", hash = "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d"}, + {file = "coverage-7.6.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:656c82b8a0ead8bba147de9a89bda95064874c91a3ed43a00e687f23cc19d53a"}, + {file = "coverage-7.6.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccc2b70a7ed475c68ceb548bf69cec1e27305c1c2606a5eb7c3afff56a1b3b27"}, + {file = "coverage-7.6.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5e37dc41d57ceba70956fa2fc5b63c26dba863c946ace9705f8eca99daecdc4"}, + {file = "coverage-7.6.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0aa9692b4fdd83a4647eeb7db46410ea1322b5ed94cd1715ef09d1d5922ba87f"}, + {file = "coverage-7.6.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa744da1820678b475e4ba3dfd994c321c5b13381d1041fe9c608620e6676e25"}, + {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c0b1818063dc9e9d838c09e3a473c1422f517889436dd980f5d721899e66f315"}, + {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:59af35558ba08b758aec4d56182b222976330ef8d2feacbb93964f576a7e7a90"}, + {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7ed2f37cfce1ce101e6dffdfd1c99e729dd2ffc291d02d3e2d0af8b53d13840d"}, + {file = "coverage-7.6.10-cp39-cp39-win32.whl", hash = "sha256:4bcc276261505d82f0ad426870c3b12cb177752834a633e737ec5ee79bbdff18"}, + {file = "coverage-7.6.10-cp39-cp39-win_amd64.whl", hash = "sha256:457574f4599d2b00f7f637a0700a6422243b3565509457b2dbd3f50703e11f59"}, + {file = "coverage-7.6.10-pp39.pp310-none-any.whl", hash = "sha256:fd34e7b3405f0cc7ab03d54a334c17a9e802897580d964bd8c2001f4b9fd488f"}, + {file = "coverage-7.6.10.tar.gz", hash = "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23"}, ] [package.dependencies] @@ -601,17 +588,17 @@ files = [ [[package]] name = "pylint" -version = "3.3.2" +version = "3.3.3" description = "python code static checker" optional = false python-versions = ">=3.9.0" files = [ - {file = "pylint-3.3.2-py3-none-any.whl", hash = "sha256:77f068c287d49b8683cd7c6e624243c74f92890f767f106ffa1ddf3c0a54cb7a"}, - {file = "pylint-3.3.2.tar.gz", hash = "sha256:9ec054ec992cd05ad30a6df1676229739a73f8feeabf3912c995d17601052b01"}, + {file = "pylint-3.3.3-py3-none-any.whl", hash = "sha256:26e271a2bc8bce0fc23833805a9076dd9b4d5194e2a02164942cb3cdc37b4183"}, + {file = "pylint-3.3.3.tar.gz", hash = "sha256:07c607523b17e6d16e2ae0d7ef59602e332caa762af64203c24b41c27139f36a"}, ] [package.dependencies] -astroid = ">=3.3.5,<=3.4.0-dev0" +astroid = ">=3.3.8,<=3.4.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.2", markers = "python_version < \"3.11\""}, @@ -719,13 +706,43 @@ files = [ [[package]] name = "tomli" -version = "2.0.2" +version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" files = [ - {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, - {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] [[package]] @@ -739,6 +756,17 @@ files = [ {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, ] +[[package]] +name = "types-deprecated" +version = "1.2.15.20241117" +description = "Typing stubs for Deprecated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-Deprecated-1.2.15.20241117.tar.gz", hash = "sha256:924002c8b7fddec51ba4949788a702411a2e3636cd9b2a33abd8ee119701d77e"}, + {file = "types_Deprecated-1.2.15.20241117-py3-none-any.whl", hash = "sha256:a0cc5e39f769fc54089fd8e005416b55d74aa03f6964d2ed1a0b0b2e28751884"}, +] + [[package]] name = "types-requests" version = "2.32.0.20241016" @@ -766,13 +794,13 @@ files = [ [[package]] name = "urllib3" -version = "2.2.3" +version = "2.3.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, - {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, + {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, + {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, ] [package.extras] @@ -858,4 +886,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "18647d631135c240364d20c87da34fd556dafcd3d85e4f1c6d0dc2fc99f336a9" +content-hash = "b3d0ada7afcb711bcbec89671ad90022a7d7ce2cc7a58dd6eb4cad13192cb77b" diff --git a/pyproject.toml b/pyproject.toml index b2aeb6f5..dd12a2e1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -53,6 +53,7 @@ pylint = "^3.2.6" pytest = "^8.3.2" pytest-cov = "^6.0.0" ruff = "^0.8.0" +types-deprecated = "^1.2.15.20241117" types-requests = ">=2.31" [tool.mypy]