diff --git a/layercake/layercake/dynamodb.py b/layercake/layercake/dynamodb.py index 67e36e7..5b50596 100644 --- a/layercake/layercake/dynamodb.py +++ b/layercake/layercake/dynamodb.py @@ -151,6 +151,7 @@ if TYPE_CHECKING: sk: str table_name: str | None = None path_spec: str | None = None + remove_prefix: str | None = None else: class SortKey(str): @@ -174,6 +175,7 @@ else: *, table_name: str | None = None, path_spec: str | None = None, + remove_prefix: str | None = None, ) -> str: return super().__new__(cls, sk) @@ -183,12 +185,14 @@ else: *, table_name: str | None = None, path_spec: str | None = None, + remove_prefix: str | None = None, ) -> None: # __init__ is used to store the parameters for later reference. # For immutable types like str, __init__ cannot change the instance's value. self.sk = sk self.table_name = table_name self.path_spec = path_spec + self.remove_prefix = remove_prefix @dataclass @@ -524,8 +528,8 @@ class DynamoDBPersistenceLayer: try: response = self.dynamodb_client.query(**attrs) except ClientError as err: + logger.info(attrs) logger.exception(err) - logger.debug(attrs) raise else: return dict( @@ -545,8 +549,8 @@ class DynamoDBPersistenceLayer: try: response = self.dynamodb_client.get_item(**attrs) except ClientError as err: + logger.info(attrs) logger.exception(err) - logger.debug(attrs) raise else: return deserialize(response.get('Item', {})) @@ -563,8 +567,8 @@ class DynamoDBPersistenceLayer: try: self.dynamodb_client.put_item(**attrs) except ClientError as err: + logger.info(attrs) logger.exception(err) - logger.debug(attrs) raise else: return True @@ -596,8 +600,8 @@ class DynamoDBPersistenceLayer: try: self.dynamodb_client.update_item(**attrs) except ClientError as err: + logger.info(attrs) logger.exception(err) - logger.debug(attrs) raise else: return True @@ -630,8 +634,8 @@ class DynamoDBPersistenceLayer: try: self.dynamodb_client.delete_item(**attrs) except ClientError as err: + logger.info(attrs) logger.exception(err) - logger.debug(attrs) raise else: return True @@ -917,12 +921,20 @@ class DynamoDBCollection: head, tail = {}, items def _getin(sk: SortKey, v: dict) -> dict: - from glom import glom - v = omit((PK, SK), v) - return glom(v, sk.path_spec) if sk.path_spec else v - return head | {k: _getin(k, item) for k, item in zip(sortkeys, tail) if item} + if sk.path_spec: + from glom import glom + + return glom(v, sk.path_spec) + return v + + def _removeprefix(sk: SortKey) -> str: + return sk.removeprefix(sk.remove_prefix) if sk.remove_prefix else sk + + return head | { + _removeprefix(k): _getin(k, item) for k, item in zip(sortkeys, tail) if item + } def query( self, @@ -1004,9 +1016,9 @@ class DynamoDBCollection: match key.get(PK), key.get(SK): case ComposeKey(), _: # Remove prefix from Partition Key - items = _remove_prefix(items, PK, key[PK].prefix + key[PK].delimiter) + items = _removeprefix(items, PK, key[PK].prefix + key[PK].delimiter) case _, PrefixKey(): # Remove prefix from Sort Key - items = _remove_prefix(items, SK, key[SK]) + items = _removeprefix(items, SK, key[SK]) return { 'items': items, @@ -1014,7 +1026,7 @@ class DynamoDBCollection: } -def _remove_prefix( +def _removeprefix( items: list[dict[str, Any]], /, key: str, diff --git a/layercake/pyproject.toml b/layercake/pyproject.toml index 1aa428b..459ceb8 100644 --- a/layercake/pyproject.toml +++ b/layercake/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "layercake" -version = "0.2.19" +version = "0.2.21" description = "Packages shared dependencies to optimize deployment and ensure consistency across functions." readme = "README.md" authors = [ diff --git a/layercake/tests/seeds.jsonl b/layercake/tests/seeds.jsonl index 4cf6a8d..b7e1f9e 100644 --- a/layercake/tests/seeds.jsonl +++ b/layercake/tests/seeds.jsonl @@ -3,5 +3,5 @@ {"id": {"S": "logs#5OxmMjL-ujoR5IMGegQz"}, "sk": {"S": "2024-02-08T16:42:33.776409-03:00"}, "action": {"S": "OPEN_EMAIL"}} {"id": {"S": "logs#5OxmMjL-ujoR5IMGegQz"}, "sk": {"S": "2019-03-25T00:00:00-03:00"}, "action": {"S": "CLICK_EMAIL"}} {"id": {"S": "cJtK9SsnJhKPyxESe7g3DG"}, "sk": {"S": "0"}, "name": {"S": "EDUSEG"}, "cnpj": {"S": "15608435000190"}, "email": {"S": "org+15608435000190@users.noreply.betaeducacao.com.br"}} -{"id": {"S": "cJtK9SsnJhKPyxESe7g3DG"}, "sk": {"S": "payment_policy"}, "due_days": {"N": "90"}} -{"id": {"S": "cJtK9SsnJhKPyxESe7g3DG"}, "sk": {"S": "billing_policy"}, "billing_day": {"N": "1"}, "payment_method": {"S": "PIX"}} +{"id": {"S": "cJtK9SsnJhKPyxESe7g3DG"}, "sk": {"S": "metadata#payment_policy"}, "due_days": {"N": "90"}} +{"id": {"S": "cJtK9SsnJhKPyxESe7g3DG"}, "sk": {"S": "metadata#billing_policy"}, "billing_day": {"N": "1"}, "payment_method": {"S": "PIX"}} diff --git a/layercake/tests/test_dynamodb.py b/layercake/tests/test_dynamodb.py index 6073c6e..bc9d426 100644 --- a/layercake/tests/test_dynamodb.py +++ b/layercake/tests/test_dynamodb.py @@ -111,9 +111,8 @@ def test_transact_write_items( exc_cls=EmailConflictError, ) - with pytest.raises(EmailConflictError) as exc: + with pytest.raises(EmailConflictError): dynamodb_persistence_layer.transact_write_items(transact) - # print(exc.value) def test_collection_get_item( @@ -257,8 +256,8 @@ def test_collection_get_items( doc = collect.get_items( TransactKey('cJtK9SsnJhKPyxESe7g3DG') + SortKey('0') - + SortKey('billing_policy', path_spec='payment_method') - + SortKey('payment_policy'), + + SortKey('metadata#billing_policy', path_spec='payment_method') + + SortKey('metadata#payment_policy', remove_prefix='metadata#'), ) assert doc == { @@ -267,7 +266,7 @@ def test_collection_get_items( 'id': 'cJtK9SsnJhKPyxESe7g3DG', 'cnpj': '15608435000190', 'email': 'org+15608435000190@users.noreply.betaeducacao.com.br', - 'billing_policy': 'PIX', + 'metadata#billing_policy': 'PIX', 'payment_policy': {'due_days': Decimal('90')}, } @@ -280,12 +279,15 @@ def test_collection_get_items_unflatten( doc = collect.get_items( TransactKey('cJtK9SsnJhKPyxESe7g3DG') - + SortKey('billing_policy') - + SortKey('payment_policy'), + + SortKey('metadata#billing_policy') + + SortKey('metadata#payment_policy', remove_prefix='metadata#'), flatten_top=False, ) assert doc == { - 'billing_policy': {'billing_day': Decimal('1'), 'payment_method': 'PIX'}, + 'metadata#billing_policy': { + 'billing_day': Decimal('1'), + 'payment_method': 'PIX', + }, 'payment_policy': {'due_days': Decimal('90')}, } diff --git a/layercake/uv.lock b/layercake/uv.lock index 2bb0469..3ccfcd2 100644 --- a/layercake/uv.lock +++ b/layercake/uv.lock @@ -589,7 +589,7 @@ wheels = [ [[package]] name = "layercake" -version = "0.2.19" +version = "0.2.20" source = { editable = "." } dependencies = [ { name = "arnparse" },