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.
Files changed (52) hide show
  1. {hexkit-3.0.0/src/hexkit.egg-info → hexkit-3.0.2}/PKG-INFO +1 -1
  2. {hexkit-3.0.0 → hexkit-3.0.2}/pyproject.toml +21 -2
  3. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/custom_types.py +1 -1
  4. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/protocols/dao.py +1 -1
  5. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/mongodb/provider.py +1 -1
  6. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/mongodb/testutils.py +3 -1
  7. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/mongokafka/__init__.py +3 -1
  8. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/mongokafka/provider.py +16 -7
  9. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/s3/testutils.py +3 -3
  10. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/testing/eventpub.py +1 -1
  11. {hexkit-3.0.0 → hexkit-3.0.2/src/hexkit.egg-info}/PKG-INFO +1 -1
  12. {hexkit-3.0.0 → hexkit-3.0.2}/LICENSE +0 -0
  13. {hexkit-3.0.0 → hexkit-3.0.2}/MANIFEST.in +0 -0
  14. {hexkit-3.0.0 → hexkit-3.0.2}/README.md +0 -0
  15. {hexkit-3.0.0 → hexkit-3.0.2}/setup.cfg +0 -0
  16. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/__init__.py +0 -0
  17. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/__main__.py +0 -0
  18. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/base.py +0 -0
  19. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/config.py +0 -0
  20. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/correlation.py +0 -0
  21. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/log.py +0 -0
  22. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/protocols/__init__.py +0 -0
  23. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/protocols/daopub.py +0 -0
  24. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/protocols/daosub.py +0 -0
  25. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/protocols/eventpub.py +0 -0
  26. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/protocols/eventsub.py +0 -0
  27. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/protocols/objstorage.py +0 -0
  28. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/__init__.py +0 -0
  29. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/akafka/__init__.py +0 -0
  30. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/akafka/config.py +0 -0
  31. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/akafka/provider/__init__.py +0 -0
  32. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/akafka/provider/daosub.py +0 -0
  33. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/akafka/provider/eventpub.py +0 -0
  34. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/akafka/provider/eventsub.py +0 -0
  35. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/akafka/provider/utils.py +0 -0
  36. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/akafka/testcontainer.py +0 -0
  37. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/akafka/testutils.py +0 -0
  38. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/mongodb/__init__.py +0 -0
  39. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/s3/__init__.py +0 -0
  40. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/s3/provider.py +0 -0
  41. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/s3/test_files/__init__.py +0 -0
  42. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/s3/test_files/test_file1.yaml +0 -0
  43. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/s3/test_files/test_file2.yaml +0 -0
  44. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/s3/test_files/test_file3.yaml +0 -0
  45. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/s3/test_files/test_file4.yaml +0 -0
  46. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/providers/testing/__init__.py +0 -0
  47. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/py.typed +0 -0
  48. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit/utils.py +0 -0
  49. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit.egg-info/SOURCES.txt +0 -0
  50. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit.egg-info/dependency_links.txt +0 -0
  51. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit.egg-info/requires.txt +0 -0
  52. {hexkit-3.0.0 → hexkit-3.0.2}/src/hexkit.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: hexkit
3
- Version: 3.0.0
3
+ Version: 3.0.2
4
4
  Summary: A Toolkit for Building Microservices using the Hexagonal Architecture
5
5
  Author-email: "German Human Genome Phenome Archive (GHGA)" <contact@ghga.de>
6
6
  License: Apache 2.0
@@ -23,7 +23,7 @@ classifiers = [
23
23
  "Intended Audience :: Developers",
24
24
  ]
25
25
  name = "hexkit"
26
- version = "3.0.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 = " [tox]\n env_list = py3{9,12}\n\n [gh-actions]\n python =\n 3.9: py39\n 3.10: py310\n 3.11: py311\n 3.12: py312\n\n [testenv]\n pass_env =\n TC_HOST\n DOCKER_HOST\n deps =\n --no-deps -r ./lock/requirements-dev.txt\n commands = pytest {posargs}\n"
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
 
@@ -132,7 +132,7 @@ class DaoCommons(typing.Protocol[Dto]):
132
132
  """
133
133
  ...
134
134
 
135
- async def delete(self, *, id_: str) -> None:
135
+ async def delete(self, id_: str) -> None:
136
136
  """Delete a resource by providing its ID.
137
137
 
138
138
  Args:
@@ -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, *, id_: str) -> None:
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="mongo:6.0.3") as mongodb:
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 # noqa: F401
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, upsert=True)
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
- with assert_not_deleted():
237
- await self._dao.update(dto)
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, *, id_: str) -> None:
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 = {"_id": id_, "__metadata__": {"deleted": True, "published": False}}
252
- await self._collection.replace_one(
253
- {"_id": document["_id"]}, document, upsert=True
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="localstack/localstack:0.14.5").with_services(
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 comminication.
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):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: hexkit
3
- Version: 3.0.0
3
+ Version: 3.0.2
4
4
  Summary: A Toolkit for Building Microservices using the Hexagonal Architecture
5
5
  Author-email: "German Human Genome Phenome Archive (GHGA)" <contact@ghga.de>
6
6
  License: Apache 2.0
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