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
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,

View File

@@ -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 = [

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": "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"}}

View File

@@ -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')},
}

2
layercake/uv.lock generated
View File

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