qena-shared-lib 0.1.19__tar.gz → 0.1.21__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 (50) hide show
  1. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/PKG-INFO +1 -1
  2. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/pyproject.toml +1 -1
  3. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/http/__init__.py +3 -0
  4. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/mongodb.py +45 -18
  5. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/rabbitmq/message/__init__.py +3 -0
  6. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/README.md +0 -0
  7. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/__init__.py +0 -0
  8. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/alias.py +0 -0
  9. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/application.py +0 -0
  10. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/background.py +0 -0
  11. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/cache.py +0 -0
  12. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/dependencies/__init__.py +0 -0
  13. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/dependencies/http.py +0 -0
  14. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/dependencies/miscellaneous.py +0 -0
  15. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/enums.py +0 -0
  16. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/eventbus.py +0 -0
  17. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/exception_handling.py +0 -0
  18. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/exceptions.py +0 -0
  19. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/http/_base.py +0 -0
  20. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/http/_exception_handlers.py +0 -0
  21. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/http/_request.py +0 -0
  22. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/http/_response.py +0 -0
  23. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/kafka/__init__.py +0 -0
  24. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/kafka/_base.py +0 -0
  25. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/kafka/_consumer.py +0 -0
  26. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/kafka/_exception_handlers.py +0 -0
  27. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/kafka/_producer.py +0 -0
  28. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/logging.py +0 -0
  29. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/py.typed +0 -0
  30. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/rabbitmq/__init__.py +0 -0
  31. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/rabbitmq/_base.py +0 -0
  32. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/rabbitmq/_channel.py +0 -0
  33. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/rabbitmq/_exception_handlers.py +0 -0
  34. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/rabbitmq/_listener.py +0 -0
  35. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/rabbitmq/_pool.py +0 -0
  36. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/rabbitmq/_publisher.py +0 -0
  37. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/rabbitmq/_rpc_client.py +0 -0
  38. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/rabbitmq/message/_inbound.py +0 -0
  39. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/rabbitmq/message/_outbound.py +0 -0
  40. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/redis.py +0 -0
  41. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/remotelogging/__init__.py +0 -0
  42. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/remotelogging/_base.py +0 -0
  43. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/remotelogging/logstash/__init__.py +0 -0
  44. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/remotelogging/logstash/_base.py +0 -0
  45. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/remotelogging/logstash/_http_sender.py +0 -0
  46. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/remotelogging/logstash/_tcp_sender.py +0 -0
  47. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/scheduler.py +0 -0
  48. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/security.py +0 -0
  49. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/sync.py +0 -0
  50. {qena_shared_lib-0.1.19 → qena_shared_lib-0.1.21}/src/qena_shared_lib/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: qena-shared-lib
3
- Version: 0.1.19
3
+ Version: 0.1.21
4
4
  Summary: A shared tools for other services
5
5
  Requires-Dist: fastapi[all]==0.115.6
6
6
  Requires-Dist: prometheus-client==0.21.1
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "qena-shared-lib"
3
- version = "0.1.19"
3
+ version = "0.1.21"
4
4
  description = "A shared tools for other services"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -1,3 +1,5 @@
1
+ from pydantic import Field
2
+
1
3
  from ._base import (
2
4
  ROUTE_HANDLER_ATTRIBUTE,
3
5
  APIRouter,
@@ -68,6 +70,7 @@ __all__ = [
68
70
  "Cookie",
69
71
  "delete",
70
72
  "Depends",
73
+ "Field",
71
74
  "File",
72
75
  "FileResponse",
73
76
  "Form",
@@ -14,7 +14,16 @@ from typing import (
14
14
 
15
15
  from bson.objectid import ObjectId
16
16
  from pydantic import BeforeValidator, Field, field_serializer
17
- from pymongo import AsyncMongoClient, IndexModel
17
+ from pymongo import (
18
+ ASCENDING,
19
+ DESCENDING,
20
+ GEO2D,
21
+ GEOSPHERE,
22
+ HASHED,
23
+ TEXT,
24
+ AsyncMongoClient,
25
+ IndexModel,
26
+ )
18
27
  from pymongo.asynchronous.client_session import AsyncClientSession
19
28
  from pymongo.asynchronous.collection import AsyncCollection
20
29
  from pymongo.asynchronous.database import AsyncDatabase
@@ -25,14 +34,22 @@ from .logging import LoggerFactory
25
34
 
26
35
  __all__ = [
27
36
  "AggregatedDocument",
37
+ "ASCENDING",
38
+ "AsyncClientSession",
39
+ "DESCENDING",
28
40
  "Document",
29
41
  "EmbeddedDocument",
42
+ "Field",
43
+ "GEO2D",
44
+ "GEOSPHERE",
45
+ "HASHED",
30
46
  "IndexManager",
31
47
  "IndexModel",
32
48
  "MongoDBManager",
33
49
  "MongoDBObjectId",
34
50
  "ProjectedDocument",
35
51
  "RepositoryBase",
52
+ "TEXT",
36
53
  "validate_object_id",
37
54
  ]
38
55
 
@@ -235,11 +252,9 @@ S = TypeVar("S")
235
252
 
236
253
 
237
254
  class RepositoryBase(Generic[T]):
238
- def __init__(
239
- self, db: MongoDBManager, session: AsyncClientSession | None = None
240
- ) -> None:
255
+ def __init__(self, db: MongoDBManager) -> None:
241
256
  self._db = db
242
- self._session = session
257
+ self._session = None
243
258
  self._document_type = None
244
259
 
245
260
  @property
@@ -254,6 +269,15 @@ class RepositoryBase(Generic[T]):
254
269
  def session(self) -> AsyncClientSession | None:
255
270
  return self._session
256
271
 
272
+ @session.setter
273
+ def session(self, session: AsyncClientSession) -> None:
274
+ if session.has_ended:
275
+ raise RuntimeError(
276
+ f"session with id {session.session_id} has already ended"
277
+ )
278
+
279
+ self._session = session
280
+
257
281
  @property
258
282
  def document_type(self) -> type[T]:
259
283
  document_type = self._document_type
@@ -364,25 +388,28 @@ class RepositoryBase(Generic[T]):
364
388
  session: AsyncClientSession | None = None,
365
389
  ) -> T | P | None:
366
390
  if projection is not None:
367
- return projection.from_raw_projected_document(
368
- await self.collection.find_one(
369
- filter=filter,
370
- projection=projection.get_projection(),
371
- skip=skip,
372
- sort=sort,
373
- session=session or self.session,
374
- )
391
+ document = await self.collection.find_one(
392
+ filter=filter,
393
+ projection=projection.get_projection(),
394
+ skip=skip,
395
+ sort=sort,
396
+ session=session or self.session,
375
397
  )
376
-
377
- return self.document_type.from_raw_document(
378
- await self.collection.find_one(
398
+ else:
399
+ document = await self.collection.find_one(
379
400
  filter=filter,
380
- projection=projection,
381
401
  skip=skip,
382
402
  sort=sort,
383
403
  session=session or self.session,
384
404
  )
385
- )
405
+
406
+ if document is None:
407
+ return None
408
+
409
+ if projection is not None:
410
+ return projection.from_raw_projected_document(document)
411
+
412
+ return self.document_type.from_raw_document(document)
386
413
 
387
414
  async def replace(
388
415
  self, replacement: T, session: AsyncClientSession | None = None
@@ -1,3 +1,5 @@
1
+ from pydantic import Field
2
+
1
3
  from ._inbound import (
2
4
  CamelCaseInboundMessage,
3
5
  InboundMessage,
@@ -12,6 +14,7 @@ from ._outbound import (
12
14
  __all__ = [
13
15
  "CamelCaseInboundMessage",
14
16
  "CamelCaseOutboundMessage",
17
+ "Field",
15
18
  "InboundMessage",
16
19
  "OutboundMessage",
17
20
  "SnakeCaseInboundMessage",