remove prefix
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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 = [
|
||||
|
||||
@@ -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"}}
|
||||
|
||||
@@ -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
2
layercake/uv.lock
generated
@@ -589,7 +589,7 @@ wheels = [
|
||||
|
||||
[[package]]
|
||||
name = "layercake"
|
||||
version = "0.2.19"
|
||||
version = "0.2.20"
|
||||
source = { editable = "." }
|
||||
dependencies = [
|
||||
{ name = "arnparse" },
|
||||
|
||||
Reference in New Issue
Block a user