From c6f7f280f9f74af813f672e4c60d0e41029d2eec Mon Sep 17 00:00:00 2001 From: pablete Date: Fri, 8 Nov 2024 12:04:55 -0500 Subject: [PATCH 1/4] move to pydantic settings and remove dependency on urlpath --- pyproject.toml | 2 +- src/enerbitdso/config.py | 12 ++++-- src/enerbitdso/enerbit.py | 6 ++- uv.lock | 86 +++++++++++---------------------------- 4 files changed, 37 insertions(+), 69 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 73bd4f8..d24d055 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,10 +32,10 @@ dependencies = [ "orjson>=3.10.10", "pydantic>=2.9.2", "rich>=13.9.4", - "urlpath>=1.2.0", "typer>=0.12.5", "tzdata>=2024.2", "truststore>=0.10.0", + "pydantic-settings>=2.6.1", ] [project.scripts] diff --git a/src/enerbitdso/config.py b/src/enerbitdso/config.py index dc02835..3d559ff 100644 --- a/src/enerbitdso/config.py +++ b/src/enerbitdso/config.py @@ -1,9 +1,13 @@ -import pydantic +import pydantic_settings -class Config(pydantic.BaseSettings): - DAY_FILENAME_TEMPLATE: str = "STAR_{operation_day:%Y%m%d}_{serial}_Day_{now:%Y%m%d%H%M%S}.xml" - INTERVAL_FILENAME_TEMPLATE: str = "STAR_{operation_day:%Y%m%d}_{serial}_Interval_{now:%Y%m%d%H%M%S}.xml" +class Config(pydantic_settings.BaseSettings): + DAY_FILENAME_TEMPLATE: str = ( + "STAR_{operation_day:%Y%m%d}_{serial}_Day_{now:%Y%m%d%H%M%S}.xml" + ) + INTERVAL_FILENAME_TEMPLATE: str = ( + "STAR_{operation_day:%Y%m%d}_{serial}_Interval_{now:%Y%m%d%H%M%S}.xml" + ) settings = Config() diff --git a/src/enerbitdso/enerbit.py b/src/enerbitdso/enerbit.py index 05b9700..e617749 100644 --- a/src/enerbitdso/enerbit.py +++ b/src/enerbitdso/enerbit.py @@ -2,11 +2,12 @@ import logging import math import ssl +import urllib +import urllib.parse import httpx import pydantic import truststore -import urlpath logger = logging.getLogger(__name__) @@ -57,7 +58,8 @@ def get_auth_token(base_url, username, password): def get_client(base_url, username, password): - url = str(urlpath.URL(base_url)) + url_parse: urllib.parse.ParseResult = urllib.parse.urlparse(base_url) + url = url_parse.geturl() token = get_auth_token(url, username, password) auth = {"Authorization": f"Bearer {token}"} return httpx.Client(base_url=url, headers=auth, timeout=TIMEOUT, verify=SSL_CONTEXT) diff --git a/uv.lock b/uv.lock index d9c7c3a..e7179f0 100644 --- a/uv.lock +++ b/uv.lock @@ -34,30 +34,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", size = 167321 }, ] -[[package]] -name = "charset-normalizer" -version = "3.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/4f/e1808dc01273379acc506d18f1504eb2d299bd4131743b9fc54d7be4df1e/charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", size = 106620 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/69/8b/825cc84cf13a28bfbcba7c416ec22bf85a9584971be15b21dd8300c65b7f/charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6", size = 196363 }, - { url = "https://files.pythonhosted.org/packages/23/81/d7eef6a99e42c77f444fdd7bc894b0ceca6c3a95c51239e74a722039521c/charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b", size = 125639 }, - { url = "https://files.pythonhosted.org/packages/21/67/b4564d81f48042f520c948abac7079356e94b30cb8ffb22e747532cf469d/charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99", size = 120451 }, - { url = "https://files.pythonhosted.org/packages/c2/72/12a7f0943dd71fb5b4e7b55c41327ac0a1663046a868ee4d0d8e9c369b85/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca", size = 140041 }, - { url = "https://files.pythonhosted.org/packages/67/56/fa28c2c3e31217c4c52158537a2cf5d98a6c1e89d31faf476c89391cd16b/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d", size = 150333 }, - { url = "https://files.pythonhosted.org/packages/f9/d2/466a9be1f32d89eb1554cf84073a5ed9262047acee1ab39cbaefc19635d2/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7", size = 142921 }, - { url = "https://files.pythonhosted.org/packages/f8/01/344ec40cf5d85c1da3c1f57566c59e0c9b56bcc5566c08804a95a6cc8257/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3", size = 144785 }, - { url = "https://files.pythonhosted.org/packages/73/8b/2102692cb6d7e9f03b9a33a710e0164cadfce312872e3efc7cfe22ed26b4/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907", size = 146631 }, - { url = "https://files.pythonhosted.org/packages/d8/96/cc2c1b5d994119ce9f088a9a0c3ebd489d360a2eb058e2c8049f27092847/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b", size = 140867 }, - { url = "https://files.pythonhosted.org/packages/c9/27/cde291783715b8ec30a61c810d0120411844bc4c23b50189b81188b273db/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912", size = 149273 }, - { url = "https://files.pythonhosted.org/packages/3a/a4/8633b0fc1a2d1834d5393dafecce4a1cc56727bfd82b4dc18fc92f0d3cc3/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95", size = 152437 }, - { url = "https://files.pythonhosted.org/packages/64/ea/69af161062166b5975ccbb0961fd2384853190c70786f288684490913bf5/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e", size = 150087 }, - { url = "https://files.pythonhosted.org/packages/3b/fd/e60a9d9fd967f4ad5a92810138192f825d77b4fa2a557990fd575a47695b/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe", size = 145142 }, - { url = "https://files.pythonhosted.org/packages/6d/02/8cb0988a1e49ac9ce2eed1e07b77ff118f2923e9ebd0ede41ba85f2dcb04/charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc", size = 94701 }, - { url = "https://files.pythonhosted.org/packages/d6/20/f1d4670a8a723c46be695dff449d86d6092916f9e99c53051954ee33a1bc/charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749", size = 102191 }, - { url = "https://files.pythonhosted.org/packages/bf/9b/08c0432272d77b04803958a4598a51e2a4b51c06640af8b8f0f908c18bf2/charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", size = 49446 }, -] - [[package]] name = "click" version = "8.1.7" @@ -81,17 +57,17 @@ wheels = [ [[package]] name = "enerbitdso" -version = "0.1.14" +version = "0.1.15" source = { editable = "." } dependencies = [ { name = "httpx" }, { name = "orjson" }, { name = "pydantic" }, + { name = "pydantic-settings" }, { name = "rich" }, { name = "truststore" }, { name = "typer" }, { name = "tzdata" }, - { name = "urlpath" }, ] [package.dev-dependencies] @@ -108,11 +84,11 @@ requires-dist = [ { name = "httpx", specifier = ">=0.27.2" }, { name = "orjson", specifier = ">=3.10.10" }, { name = "pydantic", specifier = ">=2.9.2" }, + { name = "pydantic-settings", specifier = ">=2.6.1" }, { name = "rich", specifier = ">=13.9.4" }, { name = "truststore", specifier = ">=0.10.0" }, { name = "typer", specifier = ">=0.12.5" }, { name = "tzdata", specifier = ">=2024.2" }, - { name = "urlpath", specifier = ">=1.2.0" }, ] [package.metadata.requires-dev] @@ -375,6 +351,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a9/f9/b6bcaf874f410564a78908739c80861a171788ef4d4f76f5009656672dfe/pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753", size = 1920344 }, ] +[[package]] +name = "pydantic-settings" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b5/d4/9dfbe238f45ad8b168f5c96ee49a3df0598ce18a0795a983b419949ce65b/pydantic_settings-2.6.1.tar.gz", hash = "sha256:e0f92546d8a9923cb8941689abf85d6601a8c19a23e97a34b2964a2e3f813ca0", size = 75646 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/f9/ff95fd7d760af42f647ea87f9b8a383d891cdb5e5dbd4613edaeb094252a/pydantic_settings-2.6.1-py3-none-any.whl", hash = "sha256:7fb0637c786a558d3103436278a7c4f1cfd29ba8973238a50c5bb9a55387da87", size = 28595 }, +] + [[package]] name = "pygments" version = "2.18.0" @@ -414,27 +403,21 @@ wheels = [ ] [[package]] -name = "pytz" -version = "2024.2" +name = "python-dotenv" +version = "1.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3a/31/3c70bf7603cc2dca0f19bdc53b4537a797747a58875b552c8c413d963a3f/pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a", size = 319692 } +sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115 } wheels = [ - { url = "https://files.pythonhosted.org/packages/11/c3/005fcca25ce078d2cc29fd559379817424e94885510568bc1bc53d7d5846/pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725", size = 508002 }, + { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 }, ] [[package]] -name = "requests" -version = "2.32.3" +name = "pytz" +version = "2024.2" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "charset-normalizer" }, - { name = "idna" }, - { name = "urllib3" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } +sdist = { url = "https://files.pythonhosted.org/packages/3a/31/3c70bf7603cc2dca0f19bdc53b4537a797747a58875b552c8c413d963a3f/pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a", size = 319692 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, + { url = "https://files.pythonhosted.org/packages/11/c3/005fcca25ce078d2cc29fd559379817424e94885510568bc1bc53d7d5846/pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725", size = 508002 }, ] [[package]] @@ -562,24 +545,3 @@ sdist = { url = "https://files.pythonhosted.org/packages/e1/34/943888654477a574a wheels = [ { url = "https://files.pythonhosted.org/packages/a6/ab/7e5f53c3b9d14972843a647d8d7a853969a58aecc7559cb3267302c94774/tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd", size = 346586 }, ] - -[[package]] -name = "urllib3" -version = "2.2.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", size = 300677 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", size = 126338 }, -] - -[[package]] -name = "urlpath" -version = "1.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "requests" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/21/aa/e19a74232b82435d483aff27a37d411f1cbf3d478fc632180b7fe87a6396/urlpath-1.2.0.tar.gz", hash = "sha256:e54c0c82db4894a7217772150bdbc01413794576996e7834f81d67f22359c9d0", size = 12020 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/23/bc/ea728ff9db5e05361e021be4b2265d65b3277e607e87c46a4db9f105ea30/urlpath-1.2.0-py3-none-any.whl", hash = "sha256:9c175c4ce014e1c25bbc20984e75b2d05597cab915c3569b5e457acff2e692ad", size = 8289 }, -] From 0d783e13484514007691bb6d644c89129dba4916 Mon Sep 17 00:00:00 2001 From: pablete Date: Sat, 9 Nov 2024 11:33:10 -0500 Subject: [PATCH 2/4] make mypy happy --- src/enerbitdso/cli.py | 28 ++++++++++++++++++++++++---- src/enerbitdso/enerbit.py | 19 ++++++++++++------- src/enerbitdso/formats.py | 14 +++++++------- 3 files changed, 43 insertions(+), 18 deletions(-) diff --git a/src/enerbitdso/cli.py b/src/enerbitdso/cli.py index 6883c8d..ce4a690 100644 --- a/src/enerbitdso/cli.py +++ b/src/enerbitdso/cli.py @@ -4,7 +4,9 @@ import operator import pathlib import sys +from typing import Annotated, TypedDict +import pydantic import typer import zoneinfo from rich.console import Console @@ -17,7 +19,22 @@ logger = logging.getLogger(__name__) DATE_FORMATS = ["%Y-%m-%d", "%Y%m%d"] -DATE_PARTS_TO_START_DAY = {"hour": 0, "minute": 0, "second": 0, "microsecond": 0} + + +class DateParts(TypedDict, total=False): + hour: int + minute: int + second: int + microsecond: int + + +DATE_PARTS_TO_START_DAY: DateParts = { + "hour": 0, + "minute": 0, + "second": 0, + "microsecond": 0, +} + TZ_INFO = zoneinfo.ZoneInfo("America/Bogota") @@ -41,9 +58,12 @@ def today(): @usages.command() def fetch( - api_base_url: str = typer.Option(..., envvar="ENERBIT_API_BASE_URL"), - api_username: str = typer.Option(..., envvar="ENERBIT_API_USERNAME"), - api_password: str = typer.Option(..., envvar="ENERBIT_API_PASSWORD"), + api_base_url: Annotated[str, typer.Option(..., envvar="ENERBIT_API_BASE_URL")], + api_username: Annotated[str, typer.Option(..., envvar="ENERBIT_API_USERNAME")], + api_password: Annotated[ + pydantic.SecretStr, + typer.Option(parser=pydantic.SecretStr, envvar="ENERBIT_API_PASSWORD"), + ], since: dt.datetime = typer.Option( yesterday, formats=DATE_FORMATS, diff --git a/src/enerbitdso/enerbit.py b/src/enerbitdso/enerbit.py index e617749..e6e16d3 100644 --- a/src/enerbitdso/enerbit.py +++ b/src/enerbitdso/enerbit.py @@ -57,7 +57,9 @@ def get_auth_token(base_url, username, password): return token -def get_client(base_url, username, password): +def get_client( + base_url: str, username: str, password: pydantic.SecretStr +) -> httpx.Client: url_parse: urllib.parse.ParseResult = urllib.parse.urlparse(base_url) url = url_parse.geturl() token = get_auth_token(url, username, password) @@ -88,13 +90,16 @@ def get_schedule_usage_records( ) -> list[ScheduleUsageRecord]: path = "/measurements/schedules/usages" params = { - "since": since, - "until": until, + "since": since.isoformat(), + "until": until.isoformat(), "frt-code": frt_code, "period-string": "hour", - "period-number": 1, + "period-number": "1", } - response = client.get(path, params=params) + response = client.get( + path, + params=params, + ) try: response.raise_for_status() except httpx.HTTPStatusError as e: @@ -114,8 +119,8 @@ def get_schedule_measurement_records( ) -> list[ScheduleMeasurementRecord]: path = "/measurements/schedules/" params = { - "since": since, - "until": until, + "since": since.isoformat(), + "until": until.isoformat(), "frt-code": frt_code, } response = client.get(path, params=params) diff --git a/src/enerbitdso/formats.py b/src/enerbitdso/formats.py index ec8171b..52ca667 100644 --- a/src/enerbitdso/formats.py +++ b/src/enerbitdso/formats.py @@ -1,5 +1,6 @@ import csv import io +import typing import orjson import pydantic @@ -8,23 +9,22 @@ def as_json(records: list[pydantic.BaseModel]) -> io.StringIO: content = orjson.dumps([r.model_dump() for r in records]) res = io.BytesIO(content) - wrapper = io.TextIOWrapper(res, encoding="utf-8") - return wrapper + return io.StringIO(res.getvalue().decode("utf-8")) -def as_csv(records: list[pydantic.BaseModel], header: bool) -> io.StringIO: + +def as_csv(records: typing.Sequence[pydantic.BaseModel], header: bool) -> io.StringIO: res = io.StringIO(newline="") fields = records[0].model_fields.keys() - content_lines = [r.model_dump() for r in records] writer = csv.DictWriter(res, fields, lineterminator="\n") if header: writer.writeheader() - for i in content_lines: - writer.writerow(i) + for i in records: + writer.writerow(i.model_dump()) return res -def as_jsonl(records: list[pydantic.BaseModel]) -> io.StringIO: +def as_jsonl(records: typing.Sequence[pydantic.BaseModel]) -> io.StringIO: res = io.StringIO() for i in records: res.write(i.model_dump_json()) From 7e496cabe143a1773ec35d9b84c06a520fca10c4 Mon Sep 17 00:00:00 2001 From: pablete Date: Sat, 9 Nov 2024 11:47:07 -0500 Subject: [PATCH 3/4] make mypy happy --- tests/mocked_responses.py | 66 +++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 30 deletions(-) diff --git a/tests/mocked_responses.py b/tests/mocked_responses.py index d6bd56b..a2e775c 100644 --- a/tests/mocked_responses.py +++ b/tests/mocked_responses.py @@ -15,7 +15,7 @@ def create_mocked_schedules( frt_code: str, since: dt.datetime, until: dt.datetime ) -> None: mocked_schedules.clear() - dt_range = pd.core.indexes.datetimes.DatetimeIndex = ( + dt_range: pd.core.indexes.datetimes.DatetimeIndex = ( pd.core.indexes.datetimes.date_range( since, until, @@ -37,34 +37,38 @@ def create_mocked_schedules( reactive_energy_imported += round(random.randint(0, 100)) reactive_energy_exported += round(random.randint(0, 100)) mocked_usages.append( - { - "frt_code": str(frt_code), - "meter_serial": str(meter_serial), - "time_local_utc": item["start"], - "voltage_multiplier": 1, - "current_multiplier": 1, - "active_energy_imported": active_energy_imported, - "active_energy_exported": active_energy_exported, - "reactive_energy_imported": reactive_energy_imported, - "reactive_energy_exported": reactive_energy_exported, - } + ScheduleUsageRecord.model_validate( + { + "frt_code": str(frt_code), + "meter_serial": str(meter_serial), + "time_local_utc": item["start"], + "voltage_multiplier": 1, + "current_multiplier": 1, + "active_energy_imported": active_energy_imported, + "active_energy_exported": active_energy_exported, + "reactive_energy_imported": reactive_energy_imported, + "reactive_energy_exported": reactive_energy_exported, + } + ) ) -def get_mocked_schedules(ebclient, frt_code, since, until) -> list[ScheduleUsageRecord]: +def get_mocked_schedules( + ebclient, frt_code, since, until +) -> list[ScheduleMeasurementRecord]: filtered_mocked_usages = [ schedules for schedules in mocked_schedules - if schedules["time_local_utc"] >= since - and schedules["time_local_utc"] <= until - and schedules["frt_code"] == frt_code + if schedules.time_local_utc >= since + and schedules.time_local_utc <= until + and schedules.frt_code == frt_code ] return filtered_mocked_usages def create_mocked_usages(frt_code: str, since: dt.datetime, until: dt.datetime) -> None: mocked_usages.clear() - dt_range = pd.core.indexes.datetimes.DatetimeIndex = ( + dt_range: pd.core.indexes.datetimes.DatetimeIndex = ( pd.core.indexes.datetimes.date_range( since, until - dt.timedelta(hours=1), @@ -78,16 +82,18 @@ def create_mocked_usages(frt_code: str, since: dt.datetime, until: dt.datetime) meter_serial = "".join(random.choice(letters) for i in range(10)) for index, item in enumerate(list_interval): mocked_usages.append( - { - "frt_code": str(frt_code), - "meter_serial": str(meter_serial), - "time_start": item["start"], - "time_end": item["start"] + dt.timedelta(hours=1), - "active_energy_imported": round(random.uniform(0, 3), 2), - "active_energy_exported": round(random.uniform(0, 3), 2), - "reactive_energy_imported": round(random.uniform(0, 3), 2), - "reactive_energy_exported": round(random.uniform(0, 3), 2), - } + ScheduleUsageRecord.model_validate( + { + "frt_code": str(frt_code), + "meter_serial": str(meter_serial), + "time_start": item["start"], + "time_end": item["start"] + dt.timedelta(hours=1), + "active_energy_imported": round(random.uniform(0, 3), 2), + "active_energy_exported": round(random.uniform(0, 3), 2), + "reactive_energy_imported": round(random.uniform(0, 3), 2), + "reactive_energy_exported": round(random.uniform(0, 3), 2), + } + ) ) @@ -95,8 +101,8 @@ def get_mocked_usages(ebclient, frt_code, since, until) -> list[ScheduleUsageRec filtered_mocked_usages = [ usages for usages in mocked_usages - if usages["time_start"] >= since - and usages["time_end"] <= until - and usages["frt_code"] == frt_code + if usages.time_start >= since + and usages.time_end <= until + and usages.frt_code == frt_code ] return filtered_mocked_usages From d278741fe9e00e584fa7e9c962885a17749de5cc Mon Sep 17 00:00:00 2001 From: pablete Date: Sat, 9 Nov 2024 12:19:54 -0500 Subject: [PATCH 4/4] bump versin --- src/enerbitdso/VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/enerbitdso/VERSION b/src/enerbitdso/VERSION index 106528b..99a25fc 100644 --- a/src/enerbitdso/VERSION +++ b/src/enerbitdso/VERSION @@ -1 +1 @@ -0.1.15 \ No newline at end of file +0.1.16 \ No newline at end of file