hexkit 8.0.0__tar.gz → 8.1.0__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 (78) hide show
  1. {hexkit-8.0.0 → hexkit-8.1.0}/LICENSE +1 -1
  2. {hexkit-8.0.0/src/hexkit.egg-info → hexkit-8.1.0}/PKG-INFO +6 -6
  3. {hexkit-8.0.0 → hexkit-8.1.0}/pyproject.toml +7 -7
  4. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/__init__.py +1 -1
  5. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/__main__.py +1 -1
  6. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/base.py +1 -1
  7. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/config.py +14 -2
  8. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/correlation.py +1 -1
  9. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/custom_types.py +1 -1
  10. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/log.py +1 -1
  11. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/opentelemetry.py +1 -1
  12. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/protocols/__init__.py +1 -1
  13. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/protocols/dao.py +12 -1
  14. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/protocols/daopub.py +1 -1
  15. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/protocols/daosub.py +1 -1
  16. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/protocols/eventpub.py +1 -1
  17. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/protocols/eventsub.py +1 -1
  18. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/protocols/kvstore.py +1 -1
  19. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/protocols/objstorage.py +1 -1
  20. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/__init__.py +1 -1
  21. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/akafka/__init__.py +1 -1
  22. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/akafka/config.py +1 -1
  23. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/akafka/provider/__init__.py +1 -1
  24. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/akafka/provider/daosub.py +1 -1
  25. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/akafka/provider/eventpub.py +1 -1
  26. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/akafka/provider/eventsub.py +1 -1
  27. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/akafka/provider/utils.py +1 -1
  28. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/akafka/testcontainer.py +1 -1
  29. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/akafka/testutils.py +1 -1
  30. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/mongodb/__init__.py +1 -1
  31. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/mongodb/config.py +1 -1
  32. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/mongodb/migrations/__init__.py +1 -1
  33. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/mongodb/migrations/_manager.py +1 -1
  34. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/mongodb/migrations/_utils.py +1 -1
  35. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/mongodb/migrations/helpers.py +1 -1
  36. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/mongodb/provider/__init__.py +1 -1
  37. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/mongodb/provider/client.py +1 -1
  38. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/mongodb/provider/dao.py +26 -7
  39. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/mongodb/provider/kvstore.py +1 -1
  40. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/mongodb/provider/utils.py +1 -1
  41. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/mongodb/testutils.py +1 -1
  42. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/mongokafka/__init__.py +1 -1
  43. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/mongokafka/config.py +1 -1
  44. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/mongokafka/provider/__init__.py +1 -1
  45. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/mongokafka/provider/daopub.py +39 -13
  46. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/mongokafka/provider/persistent_pub.py +1 -1
  47. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/mongokafka/testutils.py +1 -1
  48. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/redis/__init__.py +1 -1
  49. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/redis/config.py +1 -1
  50. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/redis/provider/__init__.py +1 -1
  51. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/redis/provider/client.py +1 -1
  52. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/redis/provider/kvstore.py +1 -1
  53. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/redis/testutils.py +1 -1
  54. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/s3/__init__.py +1 -1
  55. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/s3/provider.py +1 -1
  56. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/s3/test_files/__init__.py +1 -1
  57. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/s3/testutils/__init__.py +1 -1
  58. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/s3/testutils/_fixtures.py +1 -1
  59. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/s3/testutils/_typical_workflow.py +1 -1
  60. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/s3/testutils/_utils.py +1 -1
  61. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/testing/__init__.py +1 -1
  62. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/testing/dao.py +1 -1
  63. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/testing/eventpub.py +1 -1
  64. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/testing/s3.py +1 -1
  65. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/utils.py +1 -1
  66. {hexkit-8.0.0 → hexkit-8.1.0/src/hexkit.egg-info}/PKG-INFO +6 -6
  67. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit.egg-info/requires.txt +5 -5
  68. {hexkit-8.0.0 → hexkit-8.1.0}/MANIFEST.in +0 -0
  69. {hexkit-8.0.0 → hexkit-8.1.0}/README.md +0 -0
  70. {hexkit-8.0.0 → hexkit-8.1.0}/setup.cfg +0 -0
  71. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/s3/test_files/test_file1.yaml +0 -0
  72. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/s3/test_files/test_file2.yaml +0 -0
  73. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/s3/test_files/test_file3.yaml +0 -0
  74. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/providers/s3/test_files/test_file4.yaml +0 -0
  75. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit/py.typed +0 -0
  76. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit.egg-info/SOURCES.txt +0 -0
  77. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit.egg-info/dependency_links.txt +0 -0
  78. {hexkit-8.0.0 → hexkit-8.1.0}/src/hexkit.egg-info/top_level.txt +0 -0
@@ -186,7 +186,7 @@
186
186
  same "printed page" as the copyright notice for easier
187
187
  identification within third-party archives.
188
188
 
189
- Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
189
+ Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
190
190
  for the German Human Genome-Phenome Archive (GHGA)
191
191
 
192
192
  Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hexkit
3
- Version: 8.0.0
3
+ Version: 8.1.0
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
@@ -29,7 +29,7 @@ Provides-Extra: s3
29
29
  Requires-Dist: boto3<2,>=1.42; extra == "s3"
30
30
  Requires-Dist: botocore<2,>=1.42; extra == "s3"
31
31
  Provides-Extra: mongodb
32
- Requires-Dist: pymongo<5,>=4.15; extra == "mongodb"
32
+ Requires-Dist: pymongo<5,>=4.16; extra == "mongodb"
33
33
  Provides-Extra: redis
34
34
  Requires-Dist: redis<8,>=7.1; extra == "redis"
35
35
  Provides-Extra: opentelemetry-base
@@ -64,16 +64,16 @@ Requires-Dist: hexkit[opentelemetry-fastapi]; extra == "opentelemetry"
64
64
  Requires-Dist: hexkit[opentelemetry-s3]; extra == "opentelemetry"
65
65
  Provides-Extra: test-akafka
66
66
  Requires-Dist: hexkit[akafka]; extra == "test-akafka"
67
- Requires-Dist: testcontainers[kafka]<5,>=4.13; extra == "test-akafka"
67
+ Requires-Dist: testcontainers[kafka]<5,>=4.14; extra == "test-akafka"
68
68
  Provides-Extra: test-s3
69
69
  Requires-Dist: hexkit[s3]; extra == "test-s3"
70
- Requires-Dist: testcontainers<5,>=4.13; extra == "test-s3"
70
+ Requires-Dist: testcontainers<5,>=4.14; extra == "test-s3"
71
71
  Provides-Extra: test-mongodb
72
72
  Requires-Dist: hexkit[mongodb]; extra == "test-mongodb"
73
- Requires-Dist: testcontainers[mongo]<5,>=4.13; extra == "test-mongodb"
73
+ Requires-Dist: testcontainers[mongo]<5,>=4.14; extra == "test-mongodb"
74
74
  Provides-Extra: test-redis
75
75
  Requires-Dist: hexkit[redis]; extra == "test-redis"
76
- Requires-Dist: testcontainers[redis]<5,>=4.13; extra == "test-redis"
76
+ Requires-Dist: testcontainers[redis]<5,>=4.14; extra == "test-redis"
77
77
  Provides-Extra: test
78
78
  Requires-Dist: hexkit[test-akafka,test-mongodb,test-s3]; extra == "test"
79
79
  Provides-Extra: all
@@ -23,7 +23,7 @@ classifiers = [
23
23
  "Intended Audience :: Developers",
24
24
  ]
25
25
  name = "hexkit"
26
- version = "8.0.0"
26
+ version = "8.1.0"
27
27
  description = "A Toolkit for Building Microservices using the Hexagonal Architecture"
28
28
  dependencies = [
29
29
  "opentelemetry-api >=1.39, <2",
@@ -45,7 +45,7 @@ s3 = [
45
45
  "botocore >=1.42, <2",
46
46
  ]
47
47
  mongodb = [
48
- "pymongo >=4.15, <5",
48
+ "pymongo >=4.16, <5",
49
49
  ]
50
50
  redis = [
51
51
  "redis >=7.1, <8",
@@ -89,19 +89,19 @@ opentelemetry = [
89
89
  ]
90
90
  test-akafka = [
91
91
  "hexkit[akafka]",
92
- "testcontainers[kafka] >=4.13, <5",
92
+ "testcontainers[kafka] >=4.14, <5",
93
93
  ]
94
94
  test-s3 = [
95
95
  "hexkit[s3]",
96
- "testcontainers >=4.13, <5",
96
+ "testcontainers >=4.14, <5",
97
97
  ]
98
98
  test-mongodb = [
99
99
  "hexkit[mongodb]",
100
- "testcontainers[mongo] >=4.13, <5",
100
+ "testcontainers[mongo] >=4.14, <5",
101
101
  ]
102
102
  test-redis = [
103
103
  "hexkit[redis]",
104
- "testcontainers[redis] >=4.13, <5",
104
+ "testcontainers[redis] >=4.14, <5",
105
105
  ]
106
106
  test = [
107
107
  "hexkit[test-akafka,test-s3,test-mongodb]",
@@ -251,6 +251,6 @@ legacy_tox_ini = """
251
251
  deps =
252
252
  --no-deps -r ./lock/requirements-dev.txt
253
253
  commands =
254
- py310: pip install --no-deps backports.asyncio.runner==1.2.0 exceptiongroup==1.3.0 tomli==2.2.1
254
+ py310: pip install --no-deps backports.asyncio.runner==1.2.0 exceptiongroup==1.3.1 tomli==2.2.1
255
255
  pytest {posargs}
256
256
  """
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -29,6 +29,8 @@ from pydantic_settings import (
29
29
 
30
30
  # Default config prefix:
31
31
  DEFAULT_CONFIG_PREFIX: Final = "ghga_services"
32
+ # Default dotenv path:
33
+ DEFAULT_DOTENV_PATH: Final[Path] = Path("/secrets")
32
34
 
33
35
 
34
36
  class ConfigYamlDoesNotExist(RuntimeError):
@@ -82,6 +84,7 @@ def get_default_config_yaml(prefix: str) -> Path | None:
82
84
 
83
85
  def config_from_yaml(
84
86
  prefix: str = DEFAULT_CONFIG_PREFIX,
87
+ dotenv_prefix: Path = DEFAULT_DOTENV_PATH,
85
88
  ) -> Callable:
86
89
  """A factory that returns decorator functions which extends a
87
90
  pydantic BaseSettings class to read in parameters from a config yaml.
@@ -102,6 +105,10 @@ def config_from_yaml(
102
105
  "{prefix}_{actual_variable_name}". Moreover, this prefix is used
103
106
  to derive the default location for the config yaml file
104
107
  ("~/.{prefix}.yaml"). Defaults to "ghga_services".
108
+ dotenv_prefix: (Path, optional):
109
+ When defining parameters via dotenv files, this prefix is used to set the path
110
+ for the dotenv files. The final path used is constructed as
111
+ "{dotenv_prefix}/.env". Defaults to "/secrets".
105
112
  """
106
113
 
107
114
  def decorator(settings) -> Callable:
@@ -141,7 +148,11 @@ def config_from_yaml(
141
148
  class ModSettings(settings):
142
149
  """Modifies the original Settings class provided by the user"""
143
150
 
144
- model_config = SettingsConfigDict(frozen=True, env_prefix=f"{prefix}_")
151
+ model_config = SettingsConfigDict(
152
+ frozen=True,
153
+ env_prefix=f"{prefix}_",
154
+ env_file=(".env", dotenv_prefix / ".env"),
155
+ )
145
156
 
146
157
  @classmethod
147
158
  def settings_customise_sources(
@@ -156,6 +167,7 @@ def config_from_yaml(
156
167
  return (
157
168
  init_settings,
158
169
  env_settings,
170
+ dotenv_settings,
159
171
  file_secret_settings,
160
172
  YamlConfigSettingsSource(settings_cls, config_yaml),
161
173
  )
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -178,6 +178,9 @@ class Dao(typing.Protocol[Dto]):
178
178
  Raises:
179
179
  ResourceNotFoundError:
180
180
  when resource with the id specified in the dto was not found
181
+ UniqueConstraintViolationError:
182
+ when updating the dto would violate a unique index constraint over some
183
+ field other than the ID field.
181
184
  """
182
185
  ...
183
186
 
@@ -250,6 +253,9 @@ class Dao(typing.Protocol[Dto]):
250
253
  Raises:
251
254
  ResourceAlreadyExistsError:
252
255
  when a resource with the ID specified in the dto does already exist.
256
+ UniqueConstraintViolationError:
257
+ when inserting the dto would violate a unique index constraint over some
258
+ field other than the ID field.
253
259
  """
254
260
  ...
255
261
 
@@ -260,6 +266,11 @@ class Dao(typing.Protocol[Dto]):
260
266
  dto:
261
267
  Resource content as a pydantic-based data transfer object including the
262
268
  resource ID.
269
+
270
+ Raises:
271
+ UniqueConstraintViolationError:
272
+ when upserting the dto would violate a unique index constraint over some
273
+ field other than the ID field.
263
274
  """
264
275
  ...
265
276
 
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -243,12 +243,19 @@ class MongoDbDao(Generic[Dto]):
243
243
  Raises:
244
244
  ResourceNotFoundError:
245
245
  when resource with the id specified in the dto was not found
246
+ UniqueConstraintViolationError:
247
+ when updating the dto would violate a unique index constraint over some
248
+ field other than the ID field.
246
249
  """
247
250
  document = self._dto_to_document(dto)
248
251
  with translate_pymongo_errors():
249
- result = await self._collection.replace_one(
250
- {"_id": document["_id"]}, document
251
- )
252
+ try:
253
+ result = await self._collection.replace_one(
254
+ {"_id": document["_id"]}, document
255
+ )
256
+ except DuplicateKeyError as error:
257
+ key_value = error.details.get("keyValue", {}) # type: ignore
258
+ raise UniqueConstraintViolationError(unique_fields=key_value) from error
252
259
 
253
260
  if result.matched_count == 0:
254
261
  raise ResourceNotFoundError(id_=document["_id"])
@@ -353,6 +360,9 @@ class MongoDbDao(Generic[Dto]):
353
360
  Raises:
354
361
  ResourceAlreadyExistsError:
355
362
  when a resource with the ID specified in the dto does already exist.
363
+ UniqueConstraintViolationError:
364
+ when inserting the dto would violate a unique index constraint over some
365
+ field other than the ID field.
356
366
  """
357
367
  document = self._dto_to_document(dto)
358
368
  with translate_pymongo_errors():
@@ -373,12 +383,21 @@ class MongoDbDao(Generic[Dto]):
373
383
  dto:
374
384
  Resource content as a pydantic-based data transfer object including the
375
385
  resource ID.
386
+
387
+ Raises:
388
+ UniqueConstraintViolationError:
389
+ when upserting the dto would violate a unique index constraint over some
390
+ field other than the ID field.
376
391
  """
377
392
  document = self._dto_to_document(dto)
378
393
  with translate_pymongo_errors():
379
- await self._collection.replace_one(
380
- {"_id": document["_id"]}, document, upsert=True
381
- )
394
+ try:
395
+ await self._collection.replace_one(
396
+ {"_id": document["_id"]}, document, upsert=True
397
+ )
398
+ except DuplicateKeyError as error:
399
+ key_value = error.details.get("keyValue", {}) # type: ignore
400
+ raise UniqueConstraintViolationError(unique_fields=key_value) from error
382
401
 
383
402
 
384
403
  class MongoDbDaoFactory(DaoFactoryProtocol[MongoDbIndex]):
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -28,10 +28,16 @@ from uuid import uuid4
28
28
  from aiokafka import AIOKafkaProducer
29
29
  from pymongo import AsyncMongoClient
30
30
  from pymongo.asynchronous.collection import AsyncCollection
31
+ from pymongo.errors import DuplicateKeyError
31
32
 
32
33
  from hexkit.correlation import get_correlation_id, set_correlation_id
33
34
  from hexkit.custom_types import ID, JsonObject
34
- from hexkit.protocols.dao import Dao, Dto, ResourceNotFoundError
35
+ from hexkit.protocols.dao import (
36
+ Dao,
37
+ Dto,
38
+ ResourceNotFoundError,
39
+ UniqueConstraintViolationError,
40
+ )
35
41
  from hexkit.protocols.daopub import DaoPublisher, DaoPublisherFactoryProtocol
36
42
  from hexkit.protocols.eventpub import EventPublisherProtocol
37
43
  from hexkit.providers.akafka import KafkaEventPublisher
@@ -263,21 +269,29 @@ class MongoKafkaDaoPublisher(Generic[Dto]):
263
269
  Raises:
264
270
  ResourceNotFoundError:
265
271
  when resource with the id specified in the dto was not found
272
+ UniqueConstraintViolationError:
273
+ when updating the dto would violate a unique index constraint over some
274
+ field other than the ID field.
266
275
  """
267
276
  correlation_id = get_correlation_id()
268
277
  document = self._dao._dto_to_document(dto)
269
278
  document.setdefault("__metadata__", {})["correlation_id"] = correlation_id
270
279
  with translate_pymongo_errors():
271
- result = await self._collection.replace_one(
272
- {
273
- "_id": document["_id"],
274
- "$or": [
275
- {"__metadata__": {"$exists": False}},
276
- {"__metadata__.deleted": False},
277
- ],
278
- },
279
- document,
280
- )
280
+ try:
281
+ result = await self._collection.replace_one(
282
+ {
283
+ "_id": document["_id"],
284
+ "$or": [
285
+ {"__metadata__": {"$exists": False}},
286
+ {"__metadata__.deleted": False},
287
+ ],
288
+ },
289
+ document,
290
+ )
291
+ except DuplicateKeyError as error:
292
+ key_value = error.details.get("keyValue", {}) # type: ignore
293
+ raise UniqueConstraintViolationError(unique_fields=key_value) from error
294
+
281
295
  if result.matched_count == 0:
282
296
  raise ResourceNotFoundError(id_=document["_id"])
283
297
 
@@ -389,6 +403,9 @@ class MongoKafkaDaoPublisher(Generic[Dto]):
389
403
  Raises:
390
404
  ResourceAlreadyExistsError:
391
405
  when a resource with the ID specified in the dto does already exist.
406
+ UniqueConstraintViolationError:
407
+ when inserting the dto would violate a unique index constraint over some
408
+ field other than the ID field.
392
409
  """
393
410
  await self._dao.insert(dto=dto)
394
411
 
@@ -402,8 +419,17 @@ class MongoKafkaDaoPublisher(Generic[Dto]):
402
419
  dto:
403
420
  Resource content as a pydantic-based data transfer object including the
404
421
  resource ID.
422
+
423
+ Raises:
424
+ UniqueConstraintViolationError:
425
+ when upserting the dto would violate a unique index constraint over some
426
+ field other than the ID field.
405
427
  """
406
- await self._dao.upsert(dto=dto)
428
+ try:
429
+ await self._dao.upsert(dto=dto)
430
+ except DuplicateKeyError as error:
431
+ key_value = error.details.get("keyValue", {}) # type: ignore
432
+ raise UniqueConstraintViolationError(unique_fields=key_value) from error
407
433
  if self._autopublish:
408
434
  await self._publish_change(dto)
409
435
 
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,4 +1,4 @@
1
- # Copyright 2021 - 2025 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
1
+ # Copyright 2021 - 2026 Universität Tübingen, DKFZ, EMBL, and Universität zu Köln
2
2
  # for the German Human Genome-Phenome Archive (GHGA)
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hexkit
3
- Version: 8.0.0
3
+ Version: 8.1.0
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
@@ -29,7 +29,7 @@ Provides-Extra: s3
29
29
  Requires-Dist: boto3<2,>=1.42; extra == "s3"
30
30
  Requires-Dist: botocore<2,>=1.42; extra == "s3"
31
31
  Provides-Extra: mongodb
32
- Requires-Dist: pymongo<5,>=4.15; extra == "mongodb"
32
+ Requires-Dist: pymongo<5,>=4.16; extra == "mongodb"
33
33
  Provides-Extra: redis
34
34
  Requires-Dist: redis<8,>=7.1; extra == "redis"
35
35
  Provides-Extra: opentelemetry-base
@@ -64,16 +64,16 @@ Requires-Dist: hexkit[opentelemetry-fastapi]; extra == "opentelemetry"
64
64
  Requires-Dist: hexkit[opentelemetry-s3]; extra == "opentelemetry"
65
65
  Provides-Extra: test-akafka
66
66
  Requires-Dist: hexkit[akafka]; extra == "test-akafka"
67
- Requires-Dist: testcontainers[kafka]<5,>=4.13; extra == "test-akafka"
67
+ Requires-Dist: testcontainers[kafka]<5,>=4.14; extra == "test-akafka"
68
68
  Provides-Extra: test-s3
69
69
  Requires-Dist: hexkit[s3]; extra == "test-s3"
70
- Requires-Dist: testcontainers<5,>=4.13; extra == "test-s3"
70
+ Requires-Dist: testcontainers<5,>=4.14; extra == "test-s3"
71
71
  Provides-Extra: test-mongodb
72
72
  Requires-Dist: hexkit[mongodb]; extra == "test-mongodb"
73
- Requires-Dist: testcontainers[mongo]<5,>=4.13; extra == "test-mongodb"
73
+ Requires-Dist: testcontainers[mongo]<5,>=4.14; extra == "test-mongodb"
74
74
  Provides-Extra: test-redis
75
75
  Requires-Dist: hexkit[redis]; extra == "test-redis"
76
- Requires-Dist: testcontainers[redis]<5,>=4.13; extra == "test-redis"
76
+ Requires-Dist: testcontainers[redis]<5,>=4.14; extra == "test-redis"
77
77
  Provides-Extra: test
78
78
  Requires-Dist: hexkit[test-akafka,test-mongodb,test-s3]; extra == "test"
79
79
  Provides-Extra: all
@@ -12,7 +12,7 @@ hexkit[test]
12
12
  hexkit[opentelemetry]
13
13
 
14
14
  [mongodb]
15
- pymongo<5,>=4.15
15
+ pymongo<5,>=4.16
16
16
 
17
17
  [opentelemetry]
18
18
  hexkit[opentelemetry-akafka]
@@ -63,16 +63,16 @@ hexkit[test-akafka,test-mongodb,test-s3]
63
63
 
64
64
  [test-akafka]
65
65
  hexkit[akafka]
66
- testcontainers[kafka]<5,>=4.13
66
+ testcontainers[kafka]<5,>=4.14
67
67
 
68
68
  [test-mongodb]
69
69
  hexkit[mongodb]
70
- testcontainers[mongo]<5,>=4.13
70
+ testcontainers[mongo]<5,>=4.14
71
71
 
72
72
  [test-redis]
73
73
  hexkit[redis]
74
- testcontainers[redis]<5,>=4.13
74
+ testcontainers[redis]<5,>=4.14
75
75
 
76
76
  [test-s3]
77
77
  hexkit[s3]
78
- testcontainers<5,>=4.13
78
+ testcontainers<5,>=4.14
File without changes
File without changes
File without changes
File without changes