diff --git a/http-api/app/app.py b/http-api/app/app.py index 15b4375..933fa45 100644 --- a/http-api/app/app.py +++ b/http-api/app/app.py @@ -19,7 +19,6 @@ from middlewares import AuthenticationMiddleware from routes import ( courses, enrollments, - enrollments_, lookup, orders, orgs, @@ -54,7 +53,6 @@ app = APIGatewayHttpResolver( app.use(middlewares=[AuthenticationMiddleware()]) app.include_router(courses.router, prefix='/courses') 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.enroll, prefix='/enrollments') app.include_router(enrollments.cancel, prefix='/enrollments') diff --git a/layercake/layercake/dynamodb.py b/layercake/layercake/dynamodb.py index 1850d17..bc2e334 100644 --- a/layercake/layercake/dynamodb.py +++ b/layercake/layercake/dynamodb.py @@ -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), } } diff --git a/layercake/pyproject.toml b/layercake/pyproject.toml index 27dcb73..1aad35e 100644 --- a/layercake/pyproject.toml +++ b/layercake/pyproject.toml @@ -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" \ No newline at end of file diff --git a/layercake/tests/seeds.jsonl b/layercake/tests/seeds.jsonl index 030a1e4..edd4d55 100644 --- a/layercake/tests/seeds.jsonl +++ b/layercake/tests/seeds.jsonl @@ -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"}} \ No newline at end of file diff --git a/layercake/tests/test_dynamodb.py b/layercake/tests/test_dynamodb.py index 026b0ab..76c6d4d 100644 --- a/layercake/tests/test_dynamodb.py +++ b/layercake/tests/test_dynamodb.py @@ -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#'), diff --git a/layercake/uv.lock b/layercake/uv.lock index cd6a0a3..6ace092 100644 --- a/layercake/uv.lock +++ b/layercake/uv.lock @@ -589,7 +589,7 @@ wheels = [ [[package]] name = "layercake" -version = "0.6.4" +version = "0.6.5" source = { editable = "." } dependencies = [ { name = "arnparse" },