diff --git a/beekeepy/beekeepy/_communication/settings.py b/beekeepy/beekeepy/_communication/settings.py index b7835653cb0f4933910e8f9389cb063285183c9e..fbcd678046faae6edf28a00eea139384df43ebf7 100644 --- a/beekeepy/beekeepy/_communication/settings.py +++ b/beekeepy/beekeepy/_communication/settings.py @@ -4,10 +4,10 @@ from datetime import timedelta from os import environ from typing import TYPE_CHECKING, Any, ClassVar, cast -from msgspec import field from typing_extensions import Self from schemas._preconfigured_base_model import PreconfiguredBaseModel +from schemas.base import field from schemas.decoders import get_hf26_decoder if TYPE_CHECKING: diff --git a/beekeepy/beekeepy/_executable/abc/config.py b/beekeepy/beekeepy/_executable/abc/config.py index f07eaa4255a9810d8555ba10d37e97d5e7141982..a99fba702061d234cf06789c086b8c76ff98bcf1 100644 --- a/beekeepy/beekeepy/_executable/abc/config.py +++ b/beekeepy/beekeepy/_executable/abc/config.py @@ -5,6 +5,7 @@ from pathlib import Path from typing import TYPE_CHECKING, Any, ClassVar, Final from beekeepy._communication import Url +from beekeepy._runnable_handle.settings import strtobool from schemas._preconfigured_base_model import PreconfiguredBaseModel if TYPE_CHECKING: @@ -40,7 +41,9 @@ class Config(PreconfiguredBaseModel): return result def load(self, source: Path | Self) -> None: - self.__dict__.update((self.from_path(source) if isinstance(source, Path) else source).dict()) + new_config = self.from_path(source) if isinstance(source, Path) else source + for member_name, member_value in new_config.dict().items(): + setattr(self, member_name, member_value) @classmethod def from_path(cls, source: Path) -> Self: @@ -57,7 +60,9 @@ class Config(PreconfiguredBaseModel): config_name, config_value = line.split("=") member_name = cls._convert_config_name_to_member_name(config_name) values_to_write[member_name] = cls._convert_config_value_to_member_value( - config_value, current_value=values_to_write.get(member_name, default_object[member_name]) + config_value, + current_value=values_to_write.get(member_name, default_object[member_name]), + member_name=member_name, ) return cls.parse_builtins(values_to_write) @@ -89,8 +94,17 @@ class Config(PreconfiguredBaseModel): return str(member_value) @classmethod - def _convert_config_value_to_member_value(cls, config_value: str, *, current_value: Any) -> Any | None: + def _convert_config_value_to_member_value( + cls, config_value: str, *, current_value: Any, member_name: str + ) -> Any | None: config_value = config_value.strip(" \t\n\"'") + member_type: str = cls.__annotations__[member_name] + if config_value is not None and "bool" in member_type: + return strtobool(config_value) + + if config_value is not None and "int" in member_type and "[" not in member_type: + return int(config_value) + if len(config_value) == 0: return current_value diff --git a/beekeepy/beekeepy/_executable/beekeeper_config.py b/beekeepy/beekeepy/_executable/beekeeper_config.py index 42935b21a255418333ccd07dce78b18027416daa..1bbe8c8a8d498db92302c15c5fc9c13920b5d529 100644 --- a/beekeepy/beekeepy/_executable/beekeeper_config.py +++ b/beekeepy/beekeepy/_executable/beekeeper_config.py @@ -2,11 +2,10 @@ from __future__ import annotations from pathlib import Path # noqa: TCH003 -from msgspec import field - from beekeepy._communication import HttpUrl, WsUrl from beekeepy._executable.abc.config import Config from beekeepy._executable.defaults import BeekeeperDefaults, ExportKeysWalletParams +from schemas.base import field def http_webserver_default() -> HttpUrl: diff --git a/beekeepy/beekeepy/_interface/validators.py b/beekeepy/beekeepy/_interface/validators.py index 2c6225ae2d4f7fb22bb8b2ca87120d624d77b8ac..d844c01f7fac81d62463f74d175a2bf0ef7e9c82 100644 --- a/beekeepy/beekeepy/_interface/validators.py +++ b/beekeepy/beekeepy/_interface/validators.py @@ -4,8 +4,6 @@ import re from re import Pattern from typing import Final -import msgspec - from beekeepy.exceptions import ( InvalidAccountNameError, InvalidSchemaHexError, @@ -15,6 +13,7 @@ from beekeepy.exceptions import ( SchemaDetectableError, TimeTooBigError, ) +from schemas.errors import ValidationError from schemas.fields.basic import AccountName, PrivateKey, PublicKey from schemas.fields.hex import Hex @@ -35,7 +34,7 @@ def _generic_kwargs_validator( try: for _arg_name, arg_value in arguments.items(): validator(arg_value) - except msgspec.ValidationError as error: + except ValidationError as error: raise exception(_arg_name, arg_value) from error diff --git a/beekeepy/poetry.lock b/beekeepy/poetry.lock index 18e2a89e0fe473b15658b0084877ce4e2e48ea93..5cd62669725d82d3615cd4921ec9dc9f7af2e92c 100644 --- a/beekeepy/poetry.lock +++ b/beekeepy/poetry.lock @@ -775,21 +775,18 @@ idna2008 = ["idna"] [[package]] name = "schemas" -version = "0.0.1.dev393+d04802f" +version = "0.0.1.dev424+eeb5c94" description = "Tools for checking if message fits expected format" optional = false python-versions = ">=3.12,<4.0" groups = ["main"] files = [ - {file = "schemas-0.0.1.dev393+d04802f-py3-none-any.whl", hash = "sha256:9624e7c143c4c88319a20866297ca75dadd2e1d990cf496d4a65b35e1ef9bdc9"}, + {file = "schemas-0.0.1.dev424+eeb5c94-py3-none-any.whl", hash = "sha256:eaa87991fbec3878d1f3fbba1cf9562995364b80530787d1eb7598ad62bdea72"}, ] [package.dependencies] msgspec = "0.18.6" -[package.extras] -api-generation = ["datamodel-code-generator (==0.30.1)", "ruff (==0.11.5)"] - [package.source] type = "legacy" url = "https://gitlab.syncad.com/api/v4/projects/362/packages/pypi/simple" @@ -965,4 +962,4 @@ propcache = ">=0.2.0" [metadata] lock-version = "2.1" python-versions = "^3.12" -content-hash = "fc02c9c7b4ce6ff7b66ff93d90bc5909bf482c6dc60784e5642c490833d70f5a" +content-hash = "09ab12d7ca828842a3bbe0d01bb12dd22302aacb80e87415d5d690c9499e628a" diff --git a/beekeepy/pyproject.toml b/beekeepy/pyproject.toml index 211261f2152fe69084c2cf30fa38b9dbc09d49b9..12677aacf6623dc9789c82cfc86b5260ae8d071a 100644 --- a/beekeepy/pyproject.toml +++ b/beekeepy/pyproject.toml @@ -34,7 +34,7 @@ psutil = "7.0.0" python-dateutil = "2.8.2" requests = "2.32.3" -schemas = "0.0.1.dev393+d04802f" +schemas = "0.0.1.dev424+eeb5c94" [tool.poetry-dynamic-versioning] enable = true diff --git a/tests/local-tools/poetry.lock b/tests/local-tools/poetry.lock index e593e4f40e385ee2d959e0e8ca9ebecaab9e5168..c65390c8f91f10facf525d660c03f470e58ffdfb 100644 --- a/tests/local-tools/poetry.lock +++ b/tests/local-tools/poetry.lock @@ -189,7 +189,7 @@ loguru = "0.7.2" psutil = "7.0.0" python-dateutil = "2.8.2" requests = "2.32.3" -schemas = "0.0.1.dev393+d04802f" +schemas = "0.0.1.dev424+eeb5c94" [package.source] type = "directory" @@ -1289,21 +1289,18 @@ files = [ [[package]] name = "schemas" -version = "0.0.1.dev393+d04802f" +version = "0.0.1.dev424+eeb5c94" description = "Tools for checking if message fits expected format" optional = false python-versions = ">=3.12,<4.0" groups = ["main"] files = [ - {file = "schemas-0.0.1.dev393+d04802f-py3-none-any.whl", hash = "sha256:9624e7c143c4c88319a20866297ca75dadd2e1d990cf496d4a65b35e1ef9bdc9"}, + {file = "schemas-0.0.1.dev424+eeb5c94-py3-none-any.whl", hash = "sha256:eaa87991fbec3878d1f3fbba1cf9562995364b80530787d1eb7598ad62bdea72"}, ] [package.dependencies] msgspec = "0.18.6" -[package.extras] -api-generation = ["datamodel-code-generator (==0.30.1)", "ruff (==0.11.5)"] - [package.source] type = "legacy" url = "https://gitlab.syncad.com/api/v4/projects/362/packages/pypi/simple"