From 6cf72d26b56fc09384960aa2e4ef177f8e3b652f Mon Sep 17 00:00:00 2001 From: sergey Date: Thu, 11 Jul 2024 21:26:30 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BA=D0=BE=D0=BD=D0=B2=D0=B5=D1=80=D1=82=D0=B5=D1=80?= =?UTF-8?q?=20+=20=D0=B1=D0=B0=D0=B7=D0=BE=D0=B2=D1=8B=D0=B9=20=D0=BA?= =?UTF-8?q?=D0=BB=D0=B0=D1=81=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sipi-app/core/models/__init__.py | 4 +++- sipi-app/core/models/base.py | 14 ++++++++++++++ sipi-app/main.py | 1 + sipi-app/utils/__init__.py | 5 +++++ sipi-app/utils/case_converter.py | 29 +++++++++++++++++++++++++++++ 5 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 sipi-app/core/models/base.py create mode 100644 sipi-app/utils/__init__.py create mode 100644 sipi-app/utils/case_converter.py diff --git a/sipi-app/core/models/__init__.py b/sipi-app/core/models/__init__.py index 59f11d9..5ba00c7 100644 --- a/sipi-app/core/models/__init__.py +++ b/sipi-app/core/models/__init__.py @@ -1,5 +1,7 @@ __all__ = ( - 'db_helper' + 'db_helper', + 'Base' ) from .db_helper import db_helper +from .base import Base \ No newline at end of file diff --git a/sipi-app/core/models/base.py b/sipi-app/core/models/base.py new file mode 100644 index 0000000..7611949 --- /dev/null +++ b/sipi-app/core/models/base.py @@ -0,0 +1,14 @@ +from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, declared_attr + +from utils import camel_case_to_snake_case + + + +class Base(DeclarativeBase): + __abstract__ = True + + @declared_attr.directive + def __tablename__(cls) -> str: + return f'{camel_case_to_snake_case(cls.__name__)}s' + + id: Mapped[int] = mapped_column(primary_key=True) \ No newline at end of file diff --git a/sipi-app/main.py b/sipi-app/main.py index b677f2c..7f8522c 100644 --- a/sipi-app/main.py +++ b/sipi-app/main.py @@ -16,6 +16,7 @@ async def lifespan(app: FastAPI): main_app = FastAPI( lifespan=lifespan, ) + main_app.include_router(api_router, prefix=settings.api.prefix) diff --git a/sipi-app/utils/__init__.py b/sipi-app/utils/__init__.py new file mode 100644 index 0000000..72b34ef --- /dev/null +++ b/sipi-app/utils/__init__.py @@ -0,0 +1,5 @@ +__all__ = ( + 'camel_case_to_snake_case', +) + +from .case_converter import camel_case_to_snake_case diff --git a/sipi-app/utils/case_converter.py b/sipi-app/utils/case_converter.py new file mode 100644 index 0000000..203e9a8 --- /dev/null +++ b/sipi-app/utils/case_converter.py @@ -0,0 +1,29 @@ +""" +Taken from +https://github.com/mahenzon/ri-sdk-python-wrapper/blob/master/ri_sdk_codegen/utils/case_converter.py +""" + + +def camel_case_to_snake_case(input_str: str) -> str: + """ + >>> camel_case_to_snake_case("SomeSDK") + 'some_sdk' + >>> camel_case_to_snake_case("RServoDrive") + 'r_servo_drive' + >>> camel_case_to_snake_case("SDKDemo") + 'sdk_demo' + """ + chars = [] + for c_idx, char in enumerate(input_str): + if c_idx and char.isupper(): + nxt_idx = c_idx + 1 + # idea of the flag is to separate abbreviations + # as new words, show them in lower case + flag = nxt_idx >= len(input_str) or input_str[nxt_idx].isupper() + prev_char = input_str[c_idx - 1] + if prev_char.isupper() and flag: + pass + else: + chars.append("_") + chars.append(char.lower()) + return "".join(chars)