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

@@ -19,7 +19,6 @@ from middlewares import AuthenticationMiddleware
from routes import ( from routes import (
courses, courses,
enrollments, enrollments,
enrollments_,
lookup, lookup,
orders, orders,
orgs, orgs,
@@ -54,7 +53,6 @@ app = APIGatewayHttpResolver(
app.use(middlewares=[AuthenticationMiddleware()]) app.use(middlewares=[AuthenticationMiddleware()])
app.include_router(courses.router, prefix='/courses') app.include_router(courses.router, prefix='/courses')
app.include_router(enrollments.router, prefix='/enrollments') app.include_router(enrollments.router, prefix='/enrollments')
app.include_router(enrollments_.router, prefix='/new/enrollments')
app.include_router(enrollments.vacancies, prefix='/enrollments') app.include_router(enrollments.vacancies, prefix='/enrollments')
app.include_router(enrollments.enroll, prefix='/enrollments') app.include_router(enrollments.enroll, prefix='/enrollments')
app.include_router(enrollments.cancel, prefix='/enrollments') app.include_router(enrollments.cancel, prefix='/enrollments')

View File

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

View File

@@ -1,6 +1,6 @@
[project] [project]
name = "layercake" name = "layercake"
version = "0.6.5" version = "0.6.11"
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 = [
@@ -23,6 +23,7 @@ dependencies = [
"arnparse>=0.0.2", "arnparse>=0.0.2",
"weasyprint>=65.0", "weasyprint>=65.0",
"smart-open[s3]>=7.1.0", "smart-open[s3]>=7.1.0",
"sqlite-utils>=3.38",
] ]
[dependency-groups] [dependency-groups]

View File

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

2
layercake/uv.lock generated
View File

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