hexkit 3.0.0__tar.gz → 3.0.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {hexkit-3.0.0/src/hexkit.egg-info → hexkit-3.0.2}/PKG-INFO +1 -1
- {hexkit-3.0.0 → hexkit-3.0.2}/pyproject.toml +21 -2
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/custom_types.py +1 -1
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/protocols/dao.py +1 -1
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/mongodb/provider.py +1 -1
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/mongodb/testutils.py +3 -1
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/mongokafka/__init__.py +3 -1
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/mongokafka/provider.py +16 -7
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/s3/testutils.py +3 -3
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/testing/eventpub.py +1 -1
- {hexkit-3.0.0 → hexkit-3.0.2/src/hexkit.egg-info}/PKG-INFO +1 -1
- {hexkit-3.0.0 → hexkit-3.0.2}/LICENSE +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/MANIFEST.in +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/README.md +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/setup.cfg +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/__init__.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/__main__.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/base.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/config.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/correlation.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/log.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/protocols/__init__.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/protocols/daopub.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/protocols/daosub.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/protocols/eventpub.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/protocols/eventsub.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/protocols/objstorage.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/__init__.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/akafka/__init__.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/akafka/config.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/akafka/provider/__init__.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/akafka/provider/daosub.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/akafka/provider/eventpub.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/akafka/provider/eventsub.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/akafka/provider/utils.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/akafka/testcontainer.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/akafka/testutils.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/mongodb/__init__.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/s3/__init__.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/s3/provider.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/s3/test_files/__init__.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/s3/test_files/test_file1.yaml +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/s3/test_files/test_file2.yaml +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/s3/test_files/test_file3.yaml +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/s3/test_files/test_file4.yaml +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/testing/__init__.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/py.typed +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/utils.py +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit.egg-info/SOURCES.txt +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit.egg-info/dependency_links.txt +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit.egg-info/requires.txt +0 -0
- {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit.egg-info/top_level.txt +0 -0
|
@@ -23,7 +23,7 @@ classifiers = [
|
|
|
23
23
|
"Intended Audience :: Developers",
|
|
24
24
|
]
|
|
25
25
|
name = "hexkit"
|
|
26
|
-
version = "3.0.
|
|
26
|
+
version = "3.0.2"
|
|
27
27
|
description = "A Toolkit for Building Microservices using the Hexagonal Architecture"
|
|
28
28
|
dependencies = [
|
|
29
29
|
"pydantic >=2, <3",
|
|
@@ -113,6 +113,7 @@ ignore = [
|
|
|
113
113
|
"D107",
|
|
114
114
|
"D206",
|
|
115
115
|
"D300",
|
|
116
|
+
"UP040",
|
|
116
117
|
]
|
|
117
118
|
select = [
|
|
118
119
|
"C90",
|
|
@@ -183,4 +184,22 @@ source = [
|
|
|
183
184
|
]
|
|
184
185
|
|
|
185
186
|
[tool.tox]
|
|
186
|
-
legacy_tox_ini = "
|
|
187
|
+
legacy_tox_ini = """
|
|
188
|
+
[tox]
|
|
189
|
+
env_list = py3{9,12}
|
|
190
|
+
|
|
191
|
+
[gh-actions]
|
|
192
|
+
python =
|
|
193
|
+
3.9: py39
|
|
194
|
+
3.10: py310
|
|
195
|
+
3.11: py311
|
|
196
|
+
3.12: py312
|
|
197
|
+
|
|
198
|
+
[testenv]
|
|
199
|
+
pass_env =
|
|
200
|
+
TC_HOST
|
|
201
|
+
DOCKER_HOST
|
|
202
|
+
deps =
|
|
203
|
+
--no-deps -r ./lock/requirements-dev.txt
|
|
204
|
+
commands = pytest {posargs}
|
|
205
|
+
"""
|
|
@@ -22,7 +22,7 @@ from typing import Any, Literal, Union
|
|
|
22
22
|
# This is intended to type objects that could be a potential output of `json.loads`.
|
|
23
23
|
# (Scalar types as well as arrays are excluded from the above assumption.)
|
|
24
24
|
JsonObject = Mapping[
|
|
25
|
-
str, Union[int, float, str, bool, Sequence[Any], Mapping[str, Any]]
|
|
25
|
+
str, Union[int, float, str, bool, Sequence[Any], Mapping[str, Any], None]
|
|
26
26
|
]
|
|
27
27
|
|
|
28
28
|
|
|
@@ -201,7 +201,7 @@ class MongoDbDaoBase(ABC, Generic[Dto]):
|
|
|
201
201
|
# (trusting MongoDB that matching on the _id field can only yield one or
|
|
202
202
|
# zero matches)
|
|
203
203
|
|
|
204
|
-
async def delete(self,
|
|
204
|
+
async def delete(self, id_: str) -> None:
|
|
205
205
|
"""Delete a resource by providing its ID.
|
|
206
206
|
|
|
207
207
|
Args:
|
|
@@ -31,6 +31,8 @@ from testcontainers.mongodb import MongoDbContainer
|
|
|
31
31
|
from hexkit.custom_types import PytestScope
|
|
32
32
|
from hexkit.providers.mongodb.provider import MongoDbConfig, MongoDbDaoFactory
|
|
33
33
|
|
|
34
|
+
MONGODB_IMAGE = "mongo:6.0.3"
|
|
35
|
+
|
|
34
36
|
|
|
35
37
|
@dataclass(frozen=True)
|
|
36
38
|
class MongoDbFixture:
|
|
@@ -77,7 +79,7 @@ def mongodb_fixture_function() -> Generator[MongoDbFixture, None, None]:
|
|
|
77
79
|
|
|
78
80
|
**Do not call directly** Instead, use get_mongodb_fixture()
|
|
79
81
|
"""
|
|
80
|
-
with MongoDbContainer(image=
|
|
82
|
+
with MongoDbContainer(image=MONGODB_IMAGE) as mongodb:
|
|
81
83
|
config = config_from_mongodb_container(mongodb)
|
|
82
84
|
dao_factory = MongoDbDaoFactory(config=config)
|
|
83
85
|
client = mongodb.get_connection_client()
|
|
@@ -16,4 +16,6 @@
|
|
|
16
16
|
|
|
17
17
|
"""An implementation of the DaoPublisherFactoryProtocol based on MongoDB and Apache Kafka."""
|
|
18
18
|
|
|
19
|
-
from .provider import MongoKafkaConfig, MongoKafkaDaoPublisherFactory
|
|
19
|
+
from .provider import MongoKafkaConfig, MongoKafkaDaoPublisherFactory
|
|
20
|
+
|
|
21
|
+
__all__ = ["MongoKafkaConfig", "MongoKafkaDaoPublisherFactory"]
|
|
@@ -135,7 +135,7 @@ def get_delete_publish_func(
|
|
|
135
135
|
)
|
|
136
136
|
|
|
137
137
|
document = {"_id": id_, "__metadata__": {"deleted": True, "published": True}}
|
|
138
|
-
await collection.replace_one({"_id": document["_id"]}, document
|
|
138
|
+
await collection.replace_one({"_id": document["_id"]}, document)
|
|
139
139
|
|
|
140
140
|
return publish_deletion
|
|
141
141
|
|
|
@@ -233,13 +233,17 @@ class MongoKafkaDaoPublisher(Generic[Dto]):
|
|
|
233
233
|
ResourceNotFoundError:
|
|
234
234
|
when resource with the id specified in the dto was not found
|
|
235
235
|
"""
|
|
236
|
-
|
|
237
|
-
|
|
236
|
+
document = self._dao._dto_to_document(dto)
|
|
237
|
+
result = await self._collection.replace_one(
|
|
238
|
+
{"_id": document["_id"], "__metadata__.deleted": False}, document
|
|
239
|
+
)
|
|
240
|
+
if result.matched_count == 0:
|
|
241
|
+
raise ResourceNotFoundError(id_=document["_id"])
|
|
238
242
|
|
|
239
243
|
if self._autopublish:
|
|
240
244
|
await self._publish_change(dto)
|
|
241
245
|
|
|
242
|
-
async def delete(self,
|
|
246
|
+
async def delete(self, id_: str) -> None:
|
|
243
247
|
"""Delete a resource by providing its ID.
|
|
244
248
|
|
|
245
249
|
Args:
|
|
@@ -248,10 +252,15 @@ class MongoKafkaDaoPublisher(Generic[Dto]):
|
|
|
248
252
|
Raises:
|
|
249
253
|
ResourceNotFoundError: when resource with the specified id_ was not found
|
|
250
254
|
"""
|
|
251
|
-
document = {
|
|
252
|
-
|
|
253
|
-
{"
|
|
255
|
+
document = {
|
|
256
|
+
"_id": id_,
|
|
257
|
+
"__metadata__": {"deleted": True, "published": False},
|
|
258
|
+
}
|
|
259
|
+
result = await self._collection.replace_one(
|
|
260
|
+
{"_id": document["_id"], "__metadata__.deleted": False}, document
|
|
254
261
|
)
|
|
262
|
+
if result.matched_count == 0:
|
|
263
|
+
raise ResourceNotFoundError(id_=id_)
|
|
255
264
|
|
|
256
265
|
if self._autopublish:
|
|
257
266
|
await self._publish_delete(id_)
|
|
@@ -38,6 +38,8 @@ from hexkit.custom_types import PytestScope
|
|
|
38
38
|
from hexkit.protocols.objstorage import ObjectStorageProtocol, PresignedPostURL
|
|
39
39
|
from hexkit.providers.s3.provider import S3Config, S3ObjectStorage
|
|
40
40
|
|
|
41
|
+
LOCALSTACK_IMAGE = "localstack/localstack:0.14.5"
|
|
42
|
+
|
|
41
43
|
TEST_FILE_DIR = Path(__file__).parent.resolve() / "test_files"
|
|
42
44
|
|
|
43
45
|
TEST_FILE_PATHS = [
|
|
@@ -123,9 +125,7 @@ def s3_fixture_function() -> Generator[S3Fixture, None, None]:
|
|
|
123
125
|
|
|
124
126
|
**Do not call directly** Instead, use get_s3_fixture()
|
|
125
127
|
"""
|
|
126
|
-
with LocalStackContainer(image=
|
|
127
|
-
"s3"
|
|
128
|
-
) as localstack:
|
|
128
|
+
with LocalStackContainer(image=LOCALSTACK_IMAGE).with_services("s3") as localstack:
|
|
129
129
|
config = config_from_localstack_container(localstack)
|
|
130
130
|
|
|
131
131
|
storage = S3ObjectStorage(config=config)
|
|
@@ -67,7 +67,7 @@ class InMemEventPublisher(EventPublisherProtocol):
|
|
|
67
67
|
"""
|
|
68
68
|
An in-memory EventPublisher for testing purposes.
|
|
69
69
|
Please note, this only works when publisher and consumers are running in the same
|
|
70
|
-
thread. Not suitable for inter-thread or inter-process
|
|
70
|
+
thread. Not suitable for inter-thread or inter-process communication.
|
|
71
71
|
"""
|
|
72
72
|
|
|
73
73
|
def __init__(self, event_store: Optional[InMemEventStore] = None):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|