From bef51f492aef8d8237dbdd0c715527bf621a7632 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Rafael=20Siqueira?= Date: Sat, 12 Apr 2025 23:07:22 -0300 Subject: [PATCH] add parse_obj --- layercake/layercake/dynamodb.py | 15 ++++++++++++++- layercake/tests/test_dynamodb.py | 4 ++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/layercake/layercake/dynamodb.py b/layercake/layercake/dynamodb.py index e2098dd..06c7163 100644 --- a/layercake/layercake/dynamodb.py +++ b/layercake/layercake/dynamodb.py @@ -5,7 +5,7 @@ from base64 import urlsafe_b64decode, urlsafe_b64encode from dataclasses import dataclass from datetime import datetime from ipaddress import IPv4Address -from typing import TYPE_CHECKING, Any, Type, TypedDict +from typing import TYPE_CHECKING, Any, Self, Type, TypedDict from urllib.parse import quote, unquote from uuid import UUID @@ -251,6 +251,19 @@ class KeyPair(Key): ':sk': self[SK], } + @classmethod + def parse_obj(cls, obj: Any) -> Self | None: + if not obj: + return None + + match obj: + case dict(): + pair = obj.values() + case _: + pair = obj + + return cls(*pair) + class TransactItems: def __init__(self, table_name: str) -> None: diff --git a/layercake/tests/test_dynamodb.py b/layercake/tests/test_dynamodb.py index 1bfa6cb..843d7d9 100644 --- a/layercake/tests/test_dynamodb.py +++ b/layercake/tests/test_dynamodb.py @@ -75,6 +75,10 @@ def test_keypair(): assert KeyPair('123', 'abc').expr_attr_name() == {'#pk': 'id', '#sk': 'sk'} assert KeyPair('123', 'abc').expr_attr_values() == {':pk': '123', ':sk': 'abc'} + assert KeyPair.parse_obj({'id': '123', 'sk': 'abc'}) == {'id': '123', 'sk': 'abc'} + assert KeyPair.parse_obj(['123', 'abc']) == {'id': '123', 'sk': 'abc'} + assert KeyPair.parse_obj([]) is None + def test_prefixkey(): key = PrefixKey('emails')