From b44daa96c3641d82b70fbbbcadce51d705fa8d8f Mon Sep 17 00:00:00 2001 From: Sanghun Lee Date: Mon, 12 Aug 2024 16:22:35 +0900 Subject: [PATCH] feat: Add pydantic based config model --- src/ai/backend/common/config.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/ai/backend/common/config.py b/src/ai/backend/common/config.py index a92df13bea6..9c5bc7491f7 100644 --- a/src/ai/backend/common/config.py +++ b/src/ai/backend/common/config.py @@ -5,8 +5,13 @@ from pathlib import Path from typing import Any, Dict, Mapping, MutableMapping, Optional, Tuple, Union, cast +import humps import tomli import trafaret as t +from pydantic import ( + BaseModel, + ConfigDict, +) from . import validators as tx from .etcd import AsyncEtcd, ConfigScopes @@ -29,6 +34,23 @@ "merge", ) + +class BaseSchema(BaseModel): + model_config = ConfigDict(populate_by_name=True, from_attributes=True, extra="allow") + + +# TODO: Use pydantic alias_generators after v2.8 +# ref: https://docs.pydantic.dev/2.8/api/config/#pydantic.alias_generators.to_snake +def config_key_to_snake_case(o: Any) -> Any: + match o: + case dict(): + return {humps.dekebabize(k): config_key_to_snake_case(v) for k, v in o.items()} + case list(): + return [config_key_to_snake_case(i) for i in o] + case _: + return o + + etcd_config_iv = t.Dict({ t.Key("etcd"): t.Dict({ t.Key("namespace"): t.String,