This commit is contained in:
2025-07-01 16:38:22 -03:00
parent 978b968226
commit d50d828029
6 changed files with 42 additions and 12 deletions

View File

@@ -228,6 +228,7 @@ class KeyPair(Key):
*,
rename_key: str | None = None,
retain_key: bool = False,
table_name: str | None = None,
) -> None:
"""
Initializes a composite key using partition and sort key.
@@ -242,11 +243,13 @@ class KeyPair(Key):
If provided, renames the sort key in the output.
retain_key : bool, optional
Use the key itself as value if True; otherwise, use the extracted value.
table_name : str, optional
"""
super().__init__(**{PK: pk, SK: sk})
self._rename_key = rename_key
self._retain_key = retain_key
self._table_name = table_name
@property
def rename_key(self) -> str | None:
@@ -256,6 +259,10 @@ class KeyPair(Key):
def retain_key(self) -> bool:
return self._retain_key
@property
def table_name(self) -> str | None:
return self._table_name
def __repr__(self) -> str:
pk, sk, *_ = self.values()
return f'KeyPair({pk!r}, {sk!r})'
@@ -297,7 +304,12 @@ class KeyChain:
if not isinstance(other, KeyPair):
raise TypeError('Can only add a KeyPair to a KeyChain')
return KeyChain(pairs=self.pairs + (other,))
if other not in self.pairs:
pairs = self.pairs + (other,)
else:
pairs = self.pairs
return KeyChain(pairs=pairs)
@dataclass(frozen=True)
@@ -311,6 +323,7 @@ class TransactKey:
"""
pk: str
table_name: str | None = None
pairs: tuple[KeyPair, ...] = ()
def __add__(self, other: SortKey | KeyPair) -> 'TransactKey':
@@ -318,9 +331,18 @@ class TransactKey:
raise TypeError('Can only add a SortKey and KeyPair to a TransactKey')
if isinstance(other, SortKey):
other = KeyPair(self.pk, other)
other = KeyPair(self.pk, other, table_name=self.table_name)
return TransactKey(pk=self.pk, pairs=self.pairs + (other,))
if other not in self.pairs:
pairs = self.pairs + (other,)
else:
pairs = self.pairs
return TransactKey(
pk=self.pk,
table_name=self.table_name,
pairs=pairs,
)
class TransactionCanceledReason(TypedDict):
@@ -884,6 +906,7 @@ class DynamoDBCollection:
key: Key,
*,
ttl: int | datetime | None = None,
cond_expr: str | None = None,
**kwargs: Any,
) -> bool:
"""Creates a new item, or replaces an old item with a new item.
@@ -895,6 +918,8 @@ class DynamoDBCollection:
ttl: int or datetime, optional
Time-to-live for the item, specified as a timestamp integer
or datetime object.
cond_expr: str, optional
Conditional expression for deletion.
**kwargs
Additional data to be stored with the item.
@@ -909,7 +934,10 @@ class DynamoDBCollection:
if isinstance(ttl, datetime):
kwargs.update({'ttl': timestamp(ttl)})
return self.persistence_layer.put_item(item=key | kwargs)
return self.persistence_layer.put_item(
item=key | kwargs,
cond_expr=cond_expr,
)
def delete_item(
self,
@@ -1013,7 +1041,7 @@ class DynamoDBCollection:
transact_items = [
{
'Get': {
'TableName': getattr(pair, 'table_name', table_name),
'TableName': pair.table_name or table_name,
'Key': serialize(pair),
}
}

View File

@@ -1,6 +1,6 @@
[project]
name = "layercake"
version = "0.6.5"
version = "0.6.11"
description = "Packages shared dependencies to optimize deployment and ensure consistency across functions."
readme = "README.md"
authors = [
@@ -23,6 +23,7 @@ dependencies = [
"arnparse>=0.0.2",
"weasyprint>=65.0",
"smart-open[s3]>=7.1.0",
"sqlite-utils>=3.38",
]
[dependency-groups]
@@ -50,4 +51,4 @@ select = ["E", "F", "I"]
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
build-backend = "hatchling.build"

View File

@@ -6,4 +6,4 @@
{"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": "metadata#payment_policy"}, "due_days": {"N": "90"}}
{"id": {"S": "cJtK9SsnJhKPyxESe7g3DG"}, "sk": {"S": "metadata#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

@@ -269,7 +269,10 @@ def test_collection_get_items(
):
collect = DynamoDBCollection(dynamodb_persistence_layer)
doc = collect.get_items(
TransactKey('cJtK9SsnJhKPyxESe7g3DG')
TransactKey(
'cJtK9SsnJhKPyxESe7g3DG', table_name=dynamodb_persistence_layer.table_name
)
+ SortKey('0')
+ SortKey('0')
+ SortKey('metadata#billing_policy', path_spec='payment_method')
+ SortKey('metadata#payment_policy', remove_prefix='metadata#'),

2
layercake/uv.lock generated
View File

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