remove prefix

This commit is contained in:
2025-05-22 16:54:43 -03:00
parent a51723f64f
commit 585bcfcc2a
5 changed files with 38 additions and 24 deletions

View File

@@ -151,6 +151,7 @@ if TYPE_CHECKING:
sk: str sk: str
table_name: str | None = None table_name: str | None = None
path_spec: str | None = None path_spec: str | None = None
remove_prefix: str | None = None
else: else:
class SortKey(str): class SortKey(str):
@@ -174,6 +175,7 @@ else:
*, *,
table_name: str | None = None, table_name: str | None = None,
path_spec: str | None = None, path_spec: str | None = None,
remove_prefix: str | None = None,
) -> str: ) -> str:
return super().__new__(cls, sk) return super().__new__(cls, sk)
@@ -183,12 +185,14 @@ else:
*, *,
table_name: str | None = None, table_name: str | None = None,
path_spec: str | None = None, path_spec: str | None = None,
remove_prefix: str | None = None,
) -> None: ) -> None:
# __init__ is used to store the parameters for later reference. # __init__ is used to store the parameters for later reference.
# For immutable types like str, __init__ cannot change the instance's value. # For immutable types like str, __init__ cannot change the instance's value.
self.sk = sk self.sk = sk
self.table_name = table_name self.table_name = table_name
self.path_spec = path_spec self.path_spec = path_spec
self.remove_prefix = remove_prefix
@dataclass @dataclass
@@ -524,8 +528,8 @@ class DynamoDBPersistenceLayer:
try: try:
response = self.dynamodb_client.query(**attrs) response = self.dynamodb_client.query(**attrs)
except ClientError as err: except ClientError as err:
logger.info(attrs)
logger.exception(err) logger.exception(err)
logger.debug(attrs)
raise raise
else: else:
return dict( return dict(
@@ -545,8 +549,8 @@ class DynamoDBPersistenceLayer:
try: try:
response = self.dynamodb_client.get_item(**attrs) response = self.dynamodb_client.get_item(**attrs)
except ClientError as err: except ClientError as err:
logger.info(attrs)
logger.exception(err) logger.exception(err)
logger.debug(attrs)
raise raise
else: else:
return deserialize(response.get('Item', {})) return deserialize(response.get('Item', {}))
@@ -563,8 +567,8 @@ class DynamoDBPersistenceLayer:
try: try:
self.dynamodb_client.put_item(**attrs) self.dynamodb_client.put_item(**attrs)
except ClientError as err: except ClientError as err:
logger.info(attrs)
logger.exception(err) logger.exception(err)
logger.debug(attrs)
raise raise
else: else:
return True return True
@@ -596,8 +600,8 @@ class DynamoDBPersistenceLayer:
try: try:
self.dynamodb_client.update_item(**attrs) self.dynamodb_client.update_item(**attrs)
except ClientError as err: except ClientError as err:
logger.info(attrs)
logger.exception(err) logger.exception(err)
logger.debug(attrs)
raise raise
else: else:
return True return True
@@ -630,8 +634,8 @@ class DynamoDBPersistenceLayer:
try: try:
self.dynamodb_client.delete_item(**attrs) self.dynamodb_client.delete_item(**attrs)
except ClientError as err: except ClientError as err:
logger.info(attrs)
logger.exception(err) logger.exception(err)
logger.debug(attrs)
raise raise
else: else:
return True return True
@@ -917,12 +921,20 @@ class DynamoDBCollection:
head, tail = {}, items head, tail = {}, items
def _getin(sk: SortKey, v: dict) -> dict: def _getin(sk: SortKey, v: dict) -> dict:
from glom import glom
v = omit((PK, SK), v) 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( def query(
self, self,
@@ -1004,9 +1016,9 @@ class DynamoDBCollection:
match key.get(PK), key.get(SK): match key.get(PK), key.get(SK):
case ComposeKey(), _: # Remove prefix from Partition Key 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 case _, PrefixKey(): # Remove prefix from Sort Key
items = _remove_prefix(items, SK, key[SK]) items = _removeprefix(items, SK, key[SK])
return { return {
'items': items, 'items': items,
@@ -1014,7 +1026,7 @@ class DynamoDBCollection:
} }
def _remove_prefix( def _removeprefix(
items: list[dict[str, Any]], items: list[dict[str, Any]],
/, /,
key: str, key: str,

View File

@@ -1,6 +1,6 @@
[project] [project]
name = "layercake" name = "layercake"
version = "0.2.19" version = "0.2.21"
description = "Packages shared dependencies to optimize deployment and ensure consistency across functions." description = "Packages shared dependencies to optimize deployment and ensure consistency across functions."
readme = "README.md" readme = "README.md"
authors = [ authors = [

View File

@@ -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": "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": "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": "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": "metadata#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#billing_policy"}, "billing_day": {"N": "1"}, "payment_method": {"S": "PIX"}}

View File

@@ -111,9 +111,8 @@ def test_transact_write_items(
exc_cls=EmailConflictError, exc_cls=EmailConflictError,
) )
with pytest.raises(EmailConflictError) as exc: with pytest.raises(EmailConflictError):
dynamodb_persistence_layer.transact_write_items(transact) dynamodb_persistence_layer.transact_write_items(transact)
# print(exc.value)
def test_collection_get_item( def test_collection_get_item(
@@ -257,8 +256,8 @@ def test_collection_get_items(
doc = collect.get_items( doc = collect.get_items(
TransactKey('cJtK9SsnJhKPyxESe7g3DG') TransactKey('cJtK9SsnJhKPyxESe7g3DG')
+ SortKey('0') + SortKey('0')
+ SortKey('billing_policy', path_spec='payment_method') + SortKey('metadata#billing_policy', path_spec='payment_method')
+ SortKey('payment_policy'), + SortKey('metadata#payment_policy', remove_prefix='metadata#'),
) )
assert doc == { assert doc == {
@@ -267,7 +266,7 @@ def test_collection_get_items(
'id': 'cJtK9SsnJhKPyxESe7g3DG', 'id': 'cJtK9SsnJhKPyxESe7g3DG',
'cnpj': '15608435000190', 'cnpj': '15608435000190',
'email': 'org+15608435000190@users.noreply.betaeducacao.com.br', 'email': 'org+15608435000190@users.noreply.betaeducacao.com.br',
'billing_policy': 'PIX', 'metadata#billing_policy': 'PIX',
'payment_policy': {'due_days': Decimal('90')}, 'payment_policy': {'due_days': Decimal('90')},
} }
@@ -280,12 +279,15 @@ def test_collection_get_items_unflatten(
doc = collect.get_items( doc = collect.get_items(
TransactKey('cJtK9SsnJhKPyxESe7g3DG') TransactKey('cJtK9SsnJhKPyxESe7g3DG')
+ SortKey('billing_policy') + SortKey('metadata#billing_policy')
+ SortKey('payment_policy'), + SortKey('metadata#payment_policy', remove_prefix='metadata#'),
flatten_top=False, flatten_top=False,
) )
assert doc == { 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')}, 'payment_policy': {'due_days': Decimal('90')},
} }

2
layercake/uv.lock generated
View File

@@ -589,7 +589,7 @@ wheels = [
[[package]] [[package]]
name = "layercake" name = "layercake"
version = "0.2.19" version = "0.2.20"
source = { editable = "." } source = { editable = "." }
dependencies = [ dependencies = [
{ name = "arnparse" }, { name = "arnparse" },