neuroglia-python 0.1.8__tar.gz → 0.6.17__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 (154) hide show
  1. neuroglia_python-0.6.17/PKG-INFO +513 -0
  2. neuroglia_python-0.6.17/README.md +450 -0
  3. neuroglia_python-0.6.17/pyproject.toml +97 -0
  4. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/__init__.py +214 -38
  5. neuroglia_python-0.6.17/src/neuroglia/application/__init__.py +33 -0
  6. neuroglia_python-0.6.17/src/neuroglia/application/background_scheduler.py +475 -0
  7. neuroglia_python-0.6.17/src/neuroglia/coordination/__init__.py +17 -0
  8. neuroglia_python-0.6.17/src/neuroglia/coordination/abstractions.py +69 -0
  9. neuroglia_python-0.6.17/src/neuroglia/coordination/leader_election.py +221 -0
  10. neuroglia_python-0.6.17/src/neuroglia/coordination/redis_backend.py +117 -0
  11. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/core/__init__.py +2 -1
  12. neuroglia_python-0.6.17/src/neuroglia/core/operation_result.py +269 -0
  13. neuroglia_python-0.6.17/src/neuroglia/core/problem_details.py +148 -0
  14. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/core/type_extensions.py +28 -12
  15. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/core/type_finder.py +12 -5
  16. neuroglia_python-0.6.17/src/neuroglia/core/type_registry.py +143 -0
  17. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/__init__.py +19 -12
  18. neuroglia_python-0.6.17/src/neuroglia/data/abstractions.py +348 -0
  19. neuroglia_python-0.6.17/src/neuroglia/data/exceptions.py +113 -0
  20. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/infrastructure/__init__.py +24 -12
  21. neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/abstractions.py +307 -0
  22. neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/event_sourcing/abstractions.py +210 -0
  23. neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/event_sourcing/event_sourcing_repository.py +266 -0
  24. neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/event_sourcing/event_store/event_store.py +371 -0
  25. neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/event_sourcing/read_model_reconciliator.py +89 -0
  26. neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/filesystem/__init__.py +5 -0
  27. neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/filesystem/filesystem_repository.py +308 -0
  28. neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/memory/memory_repository.py +86 -0
  29. neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/mongo/__init__.py +85 -0
  30. neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/mongo/enhanced_mongo_repository.py +353 -0
  31. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/infrastructure/mongo/mongo_repository.py +168 -91
  32. neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/mongo/motor_repository.py +770 -0
  33. neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/mongo/serialization_helper.py +229 -0
  34. neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/mongo/typed_mongo_query.py +320 -0
  35. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/infrastructure/resources/in_memory_storage_backend.py +17 -19
  36. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/infrastructure/resources/postgres_resource_store.py +37 -36
  37. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/infrastructure/resources/redis_resource_store.py +25 -23
  38. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/infrastructure/resources/resource_repository.py +99 -59
  39. neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/tracing_mixin.py +408 -0
  40. neuroglia_python-0.6.17/src/neuroglia/data/queries/generic/get_by_id_query.py +81 -0
  41. neuroglia_python-0.6.17/src/neuroglia/data/queries/generic/list_query.py +70 -0
  42. neuroglia_python-0.6.17/src/neuroglia/data/queryable.py +295 -0
  43. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/resources/__init__.py +18 -26
  44. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/resources/abstractions.py +135 -51
  45. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/resources/controller.py +150 -104
  46. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/resources/serializers/xml_serializer.py +45 -45
  47. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/resources/serializers/yaml_serializer.py +35 -35
  48. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/resources/state_machine.py +48 -47
  49. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/resources/watcher.py +140 -101
  50. neuroglia_python-0.6.17/src/neuroglia/data/unit_of_work.py +256 -0
  51. neuroglia_python-0.6.17/src/neuroglia/dependency_injection/__init__.py +54 -0
  52. neuroglia_python-0.6.17/src/neuroglia/dependency_injection/service_provider.py +939 -0
  53. neuroglia_python-0.6.17/src/neuroglia/dependency_injection/service_provider_backup.py +850 -0
  54. neuroglia_python-0.6.17/src/neuroglia/eventing/__init__.py +71 -0
  55. neuroglia_python-0.6.17/src/neuroglia/eventing/cloud_events/__init__.py +3 -0
  56. neuroglia_python-0.6.17/src/neuroglia/eventing/cloud_events/cloud_event.py +257 -0
  57. neuroglia_python-0.6.17/src/neuroglia/eventing/cloud_events/decorators.py +89 -0
  58. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/eventing/cloud_events/infrastructure/__init__.py +2 -0
  59. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/eventing/cloud_events/infrastructure/cloud_event_ingestor.py +14 -7
  60. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/eventing/cloud_events/infrastructure/cloud_event_middleware.py +4 -2
  61. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/eventing/cloud_events/infrastructure/cloud_event_publisher.py +38 -25
  62. neuroglia_python-0.6.17/src/neuroglia/eventing/tracing.py +176 -0
  63. neuroglia_python-0.6.17/src/neuroglia/extensions/cqrs_metrics_extensions.py +98 -0
  64. neuroglia_python-0.6.17/src/neuroglia/extensions/mediator_extensions.py +72 -0
  65. neuroglia_python-0.6.17/src/neuroglia/extensions/state_persistence_extensions.py +288 -0
  66. neuroglia_python-0.6.17/src/neuroglia/hosting/__init__.py +109 -0
  67. neuroglia_python-0.6.17/src/neuroglia/hosting/abstractions.py +169 -0
  68. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/hosting/configuration/data_access_layer.py +30 -23
  69. neuroglia_python-0.6.17/src/neuroglia/hosting/web.py +1017 -0
  70. neuroglia_python-0.6.17/src/neuroglia/integration/__init__.py +181 -0
  71. neuroglia_python-0.6.17/src/neuroglia/integration/cache_repository.py +569 -0
  72. neuroglia_python-0.6.17/src/neuroglia/integration/http_service_client.py +574 -0
  73. neuroglia_python-0.6.17/src/neuroglia/mapping/mapper.py +525 -0
  74. neuroglia_python-0.6.17/src/neuroglia/mediation/__init__.py +376 -0
  75. neuroglia_python-0.6.17/src/neuroglia/mediation/behaviors/domain_event_cloudevent_behavior.py +145 -0
  76. neuroglia_python-0.6.17/src/neuroglia/mediation/behaviors/domain_event_dispatching_middleware.py +94 -0
  77. neuroglia_python-0.6.17/src/neuroglia/mediation/mediator.py +1424 -0
  78. neuroglia_python-0.6.17/src/neuroglia/mediation/metrics_middleware.py +250 -0
  79. neuroglia_python-0.6.17/src/neuroglia/mediation/pipeline_behavior.py +124 -0
  80. neuroglia_python-0.6.17/src/neuroglia/mediation/simple.py +513 -0
  81. neuroglia_python-0.6.17/src/neuroglia/mediation/tracing_middleware.py +197 -0
  82. neuroglia_python-0.6.17/src/neuroglia/mvc/__init__.py +45 -0
  83. neuroglia_python-0.6.17/src/neuroglia/mvc/controller_base.py +217 -0
  84. neuroglia_python-0.6.17/src/neuroglia/observability/__init__.py +115 -0
  85. neuroglia_python-0.6.17/src/neuroglia/observability/framework.py +266 -0
  86. neuroglia_python-0.6.17/src/neuroglia/observability/logging.py +242 -0
  87. neuroglia_python-0.6.17/src/neuroglia/observability/metrics.py +328 -0
  88. neuroglia_python-0.6.17/src/neuroglia/observability/otel_sdk.py +563 -0
  89. neuroglia_python-0.6.17/src/neuroglia/observability/settings.py +245 -0
  90. neuroglia_python-0.6.17/src/neuroglia/observability/tracing.py +257 -0
  91. neuroglia_python-0.6.17/src/neuroglia/reactive/rx_async.py +23 -0
  92. neuroglia_python-0.6.17/src/neuroglia/serialization/__init__.py +55 -0
  93. neuroglia_python-0.6.17/src/neuroglia/serialization/abstractions.py +142 -0
  94. neuroglia_python-0.6.17/src/neuroglia/serialization/aggregate_serializer.py +410 -0
  95. neuroglia_python-0.6.17/src/neuroglia/serialization/json.py +786 -0
  96. neuroglia_python-0.6.17/src/neuroglia/utils/__init__.py +73 -0
  97. neuroglia_python-0.6.17/src/neuroglia/utils/camel_model.py +205 -0
  98. neuroglia_python-0.6.17/src/neuroglia/utils/case_conversion.py +279 -0
  99. neuroglia_python-0.6.17/src/neuroglia/validation/__init__.py +111 -0
  100. neuroglia_python-0.6.17/src/neuroglia/validation/business_rules.py +372 -0
  101. neuroglia_python-0.6.17/src/neuroglia/validation/exceptions.py +140 -0
  102. neuroglia_python-0.6.17/src/neuroglia/validation/validators.py +315 -0
  103. neuroglia_python-0.1.8/PKG-INFO +0 -282
  104. neuroglia_python-0.1.8/README.md +0 -249
  105. neuroglia_python-0.1.8/pyproject.toml +0 -46
  106. neuroglia_python-0.1.8/src/neuroglia/core/operation_result.py +0 -11
  107. neuroglia_python-0.1.8/src/neuroglia/core/problem_details.py +0 -25
  108. neuroglia_python-0.1.8/src/neuroglia/data/abstractions.py +0 -124
  109. neuroglia_python-0.1.8/src/neuroglia/data/infrastructure/abstractions.py +0 -78
  110. neuroglia_python-0.1.8/src/neuroglia/data/infrastructure/event_sourcing/abstractions.py +0 -146
  111. neuroglia_python-0.1.8/src/neuroglia/data/infrastructure/event_sourcing/event_sourcing_repository.py +0 -77
  112. neuroglia_python-0.1.8/src/neuroglia/data/infrastructure/event_sourcing/event_store/event_store.py +0 -182
  113. neuroglia_python-0.1.8/src/neuroglia/data/infrastructure/event_sourcing/read_model_reconciliator.py +0 -62
  114. neuroglia_python-0.1.8/src/neuroglia/data/infrastructure/memory/memory_repository.py +0 -29
  115. neuroglia_python-0.1.8/src/neuroglia/data/infrastructure/mongo/__init__.py +0 -12
  116. neuroglia_python-0.1.8/src/neuroglia/data/queries/generic/get_by_id_query.py +0 -30
  117. neuroglia_python-0.1.8/src/neuroglia/data/queries/generic/list_query.py +0 -23
  118. neuroglia_python-0.1.8/src/neuroglia/data/queryable.py +0 -175
  119. neuroglia_python-0.1.8/src/neuroglia/dependency_injection/__init__.py +0 -1
  120. neuroglia_python-0.1.8/src/neuroglia/dependency_injection/service_provider.py +0 -341
  121. neuroglia_python-0.1.8/src/neuroglia/eventing/__init__.py +0 -11
  122. neuroglia_python-0.1.8/src/neuroglia/eventing/cloud_events/__init__.py +0 -1
  123. neuroglia_python-0.1.8/src/neuroglia/eventing/cloud_events/cloud_event.py +0 -83
  124. neuroglia_python-0.1.8/src/neuroglia/eventing/cloud_events/decorators.py +0 -5
  125. neuroglia_python-0.1.8/src/neuroglia/hosting/__init__.py +0 -14
  126. neuroglia_python-0.1.8/src/neuroglia/hosting/abstractions.py +0 -141
  127. neuroglia_python-0.1.8/src/neuroglia/hosting/web.py +0 -87
  128. neuroglia_python-0.1.8/src/neuroglia/integration/__init__.py +0 -11
  129. neuroglia_python-0.1.8/src/neuroglia/mapping/mapper.py +0 -238
  130. neuroglia_python-0.1.8/src/neuroglia/mediation/__init__.py +0 -1
  131. neuroglia_python-0.1.8/src/neuroglia/mediation/mediator.py +0 -182
  132. neuroglia_python-0.1.8/src/neuroglia/mvc/__init__.py +0 -11
  133. neuroglia_python-0.1.8/src/neuroglia/mvc/controller_base.py +0 -72
  134. neuroglia_python-0.1.8/src/neuroglia/reactive/rx_async.py +0 -16
  135. neuroglia_python-0.1.8/src/neuroglia/serialization/__init__.py +0 -14
  136. neuroglia_python-0.1.8/src/neuroglia/serialization/abstractions.py +0 -30
  137. neuroglia_python-0.1.8/src/neuroglia/serialization/json.py +0 -212
  138. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/LICENSE +0 -0
  139. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/core/module_loader.py +0 -0
  140. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/infrastructure/event_sourcing/__init__.py +0 -0
  141. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/infrastructure/event_sourcing/event_store/__init__.py +0 -0
  142. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/infrastructure/memory/__init__.py +0 -0
  143. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/infrastructure/resources/__init__.py +0 -0
  144. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/queries/generic/__init__.py +0 -0
  145. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/resources/serializers/__init__.py +0 -0
  146. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/eventing/cloud_events/infrastructure/cloud_event_bus.py +0 -0
  147. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/expressions/__init__.py +0 -0
  148. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/expressions/javascript_expression_translator.py +0 -0
  149. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/integration/models.py +0 -0
  150. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/logging/__init__.py +0 -0
  151. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/logging/logger.py +0 -0
  152. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/mapping/__init__.py +0 -0
  153. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/py.typed +0 -0
  154. {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/reactive/__init__.py +0 -0
@@ -0,0 +1,513 @@
1
+ Metadata-Version: 2.4
2
+ Name: neuroglia-python
3
+ Version: 0.6.17
4
+ Summary: Port from .NET to Python of the Neuroglia Framework
5
+ License: Apache
6
+ License-File: LICENSE
7
+ Author: Charles d'Avernas
8
+ Author-email: charles.davernas@neuroglia.io
9
+ Requires-Python: >=3.9,<4.0
10
+ Classifier: License :: Other/Proprietary License
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3.9
13
+ Classifier: Programming Language :: Python :: 3.10
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Classifier: Programming Language :: Python :: 3.14
18
+ Provides-Extra: all
19
+ Provides-Extra: aws
20
+ Provides-Extra: etcd
21
+ Provides-Extra: eventstore
22
+ Provides-Extra: mongodb
23
+ Provides-Extra: redis
24
+ Requires-Dist: annotated-types (>=0.7.0,<0.8.0)
25
+ Requires-Dist: apscheduler (>=3.11.0,<4.0.0)
26
+ Requires-Dist: boto3 (>=1.40.64,<2.0.0) ; extra == "aws" or extra == "all"
27
+ Requires-Dist: classy-fastapi (>=0.6.1,<0.7.0)
28
+ Requires-Dist: email-validator (>=2.2.0,<3.0.0)
29
+ Requires-Dist: esdbclient (>=1.1.1,<2.0.0) ; extra == "eventstore" or extra == "all"
30
+ Requires-Dist: etcd3-py (>=0.1.6,<0.2.0) ; extra == "etcd" or extra == "all"
31
+ Requires-Dist: fastapi (>=0.115.5,<0.116.0)
32
+ Requires-Dist: grpcio (>=1.68.1,<2.0.0)
33
+ Requires-Dist: httpx (>=0.27.2,<0.28.0)
34
+ Requires-Dist: itsdangerous (>=2.2.0,<3.0.0)
35
+ Requires-Dist: jinja2 (>=3.1.4,<4.0.0)
36
+ Requires-Dist: motor (>=3.6.0,<4.0.0) ; extra == "mongodb" or extra == "all"
37
+ Requires-Dist: multipledispatch (>=1.0.0,<2.0.0)
38
+ Requires-Dist: opentelemetry-api (>=1.28.2,<2.0.0)
39
+ Requires-Dist: opentelemetry-exporter-otlp-proto-grpc (>=1.28.2,<2.0.0)
40
+ Requires-Dist: opentelemetry-exporter-otlp-proto-http (>=1.28.2,<2.0.0)
41
+ Requires-Dist: opentelemetry-exporter-prometheus (>=0.49b2,<0.50)
42
+ Requires-Dist: opentelemetry-instrumentation (>=0.49b2,<0.50)
43
+ Requires-Dist: opentelemetry-instrumentation-fastapi (>=0.49b2,<0.50)
44
+ Requires-Dist: opentelemetry-instrumentation-httpx (>=0.49b2,<0.50)
45
+ Requires-Dist: opentelemetry-instrumentation-logging (>=0.49b2,<0.50)
46
+ Requires-Dist: opentelemetry-instrumentation-system-metrics (>=0.49b2,<0.50)
47
+ Requires-Dist: opentelemetry-sdk (>=1.28.2,<2.0.0)
48
+ Requires-Dist: passlib[bcrypt] (>=1.7.4,<2.0.0)
49
+ Requires-Dist: prometheus-client (>=0.21.0,<0.22.0)
50
+ Requires-Dist: protobuf (>=5.0,<6.0) ; extra == "etcd" or extra == "all"
51
+ Requires-Dist: pydantic-settings (>=2.6.1,<3.0.0)
52
+ Requires-Dist: pydantic[email] (>=2.10.3,<3.0.0)
53
+ Requires-Dist: pyjwt (>=2.10.1,<3.0.0)
54
+ Requires-Dist: pymongo (>=4.10.1,<5.0.0) ; extra == "mongodb" or extra == "all"
55
+ Requires-Dist: python-dotenv (>=1.0.1,<2.0.0)
56
+ Requires-Dist: python-multipart (>=0.0.17,<0.0.18)
57
+ Requires-Dist: redis (>=5.2.0,<6.0.0) ; extra == "redis" or extra == "all"
58
+ Requires-Dist: rx (>=3.2.0,<4.0.0)
59
+ Requires-Dist: typing-extensions (>=4.12.2,<5.0.0)
60
+ Requires-Dist: uvicorn (>=0.32.1,<0.33.0)
61
+ Description-Content-Type: text/markdown
62
+
63
+ # Neuroglia Python Framework
64
+
65
+ [![PyPI version](https://badge.fury.io/py/neuroglia-python.svg?v=2)](https://badge.fury.io/py/neuroglia-python)
66
+ [![Python Version](https://img.shields.io/badge/python-3.9%2B-blue.svg)](https://www.python.org/downloads/)
67
+ [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
68
+ [![Documentation](https://img.shields.io/badge/docs-latest-brightgreen.svg)](https://bvandewe.github.io/pyneuro/)
69
+ [![Changelog](https://img.shields.io/badge/changelog-Keep%20a%20Changelog-E05735.svg)](https://github.com/bvandewe/pyneuro/blob/main/CHANGELOG.md)
70
+ [![Poetry](https://img.shields.io/endpoint?url=https://python-poetry.org/badge/v0.json)](https://python-poetry.org/)
71
+ [![Docker](https://img.shields.io/badge/docker-ready-2496ED.svg?logo=docker&logoColor=white)](https://www.docker.com/)
72
+ [![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit)
73
+ [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
74
+ [![FastAPI](https://img.shields.io/badge/FastAPI-0.116%2B-009688.svg?logo=fastapi)](https://fastapi.tiangolo.com/)
75
+ [![GitHub](https://img.shields.io/github/stars/bvandewe/pyneuro?style=social)](https://github.com/bvandewe/pyneuro)
76
+
77
+ Neuroglia is a lightweight, opinionated framework built on top of [FastAPI](https://fastapi.tiangolo.com/) that provides a comprehensive set of tools and patterns for building clean, maintainable, and scalable microservices. It enforces architectural best practices and provides out-of-the-box implementations of common patterns.
78
+
79
+ 📚 **Read the full documentation at [bvandewe.github.io/pyneuro/](https://bvandewe.github.io/pyneuro/)** 📚
80
+
81
+ ## Why Neuroglia?
82
+
83
+ **Choose Neuroglia for complex, domain-driven microservices that need to be maintained for years to come.**
84
+
85
+ ### 🎯 The Philosophy
86
+
87
+ Neuroglia believes that **software architecture matters more than speed of initial development**. While you can build APIs quickly with vanilla FastAPI or Django, Neuroglia is designed for applications that will:
88
+
89
+ - **Scale in complexity** over time with changing business requirements
90
+ - **Be maintained by teams** with varying levels of domain expertise
91
+ - **Evolve and adapt** without accumulating technical debt
92
+ - **Integrate seamlessly** with complex enterprise ecosystems
93
+
94
+ ### 🏗️ When to Choose Neuroglia
95
+
96
+ | **Choose Neuroglia When** | **Choose Alternatives When** |
97
+ | -------------------------------------------------------------------- | --------------------------------------------- |
98
+ | ✅ Building **domain-rich applications** with complex business logic | ❌ Creating simple CRUD APIs or prototypes |
99
+ | ✅ **Long-term maintenance** is a primary concern | ❌ You need something working "yesterday" |
100
+ | ✅ Your team values **architectural consistency** | ❌ Framework learning curve is a blocker |
101
+ | ✅ You need **enterprise patterns** (CQRS, DDD, Event Sourcing) | ❌ Simple request-response patterns suffice |
102
+ | ✅ **Multiple developers** will work on the codebase | ❌ Solo development or small, simple projects |
103
+ | ✅ Integration with **event-driven architectures** | ❌ Monolithic, database-first applications |
104
+
105
+ ### 🚀 The Neuroglia Advantage
106
+
107
+ **Compared to vanilla FastAPI:**
108
+
109
+ - **Enforced Structure**: No more "how should I organize this?" - clear architectural layers
110
+ - **Built-in Patterns**: CQRS, dependency injection, and event handling out of the box
111
+ - **Enterprise Ready**: Designed for complex domains, not just API endpoints
112
+
113
+ **Compared to Django:**
114
+
115
+ - **Microservice Native**: Built for distributed systems, not monolithic web apps
116
+ - **Domain-Driven**: Business logic lives in the domain layer, not mixed with web concerns
117
+ - **Modern Async**: Full async support without retrofitting legacy patterns
118
+
119
+ **Compared to Spring Boot (Java):**
120
+
121
+ - **Python Simplicity**: All the enterprise patterns without Java's verbosity
122
+ - **Lightweight**: No heavy application server - just the patterns you need
123
+ - **Developer Experience**: Pythonic APIs with comprehensive tooling
124
+
125
+ ### 💡 Real-World Scenarios
126
+
127
+ **Perfect for:**
128
+
129
+ - 🏦 **Financial Services**: Complex domain rules, audit trails, event sourcing
130
+ - 🏥 **Healthcare Systems**: HIPAA compliance, complex workflows, integration needs
131
+ - 🏭 **Manufacturing**: Resource management, real-time monitoring, process orchestration
132
+ - 🛒 **E-commerce Platforms**: Order processing, inventory management, payment flows
133
+ - 🎯 **SaaS Products**: Multi-tenant architectures, feature flags, usage analytics
134
+
135
+ **Not ideal for:**
136
+
137
+ - 📝 Simple content management systems
138
+ - 🔗 Basic API proxies or data transformation services
139
+ - 📱 Mobile app backends with minimal business logic
140
+ - 🧪 Proof-of-concept or throwaway prototypes
141
+
142
+ ### 🎨 The Developer Experience
143
+
144
+ Neuroglia optimizes for **code that tells a story**:
145
+
146
+ ```python
147
+ # Your business logic is clear and testable
148
+ class PlaceOrderHandler(CommandHandler[PlaceOrderCommand, OperationResult[OrderDto]]):
149
+ async def handle_async(self, command: PlaceOrderCommand) -> OperationResult[OrderDto]:
150
+ # Domain logic is explicit and isolated
151
+ order = Order(command.customer_id, command.items)
152
+ await self.repository.save_async(order)
153
+ return self.created(self.mapper.map(order, OrderDto))
154
+
155
+ # Infrastructure concerns are separated
156
+ class OrdersController(ControllerBase):
157
+ @post("/orders", response_model=OrderDto)
158
+ async def place_order(self, command: PlaceOrderCommand) -> OrderDto:
159
+ return await self.mediator.execute_async(command)
160
+ ```
161
+
162
+ **The result?** Code that's easy to understand, test, and evolve - even years later.
163
+
164
+ ## 🚀 Key Features
165
+
166
+ - **🏗️ Clean Architecture**: Enforces separation of concerns with clearly defined layers (API, Application, Domain, Integration)
167
+ - **💉 Dependency Injection**: Lightweight container with automatic service discovery and registration
168
+ - **🎯 CQRS & Mediation**: Command Query Responsibility Segregation with built-in mediator pattern
169
+ - **🏛️ State-Based Persistence**: Alternative to event sourcing with automatic domain event dispatching
170
+ - **🔧 Pipeline Behaviors**: Cross-cutting concerns like validation, caching, and transactions
171
+ - **📡 Event-Driven Architecture**: Native support for CloudEvents, event sourcing, and reactive programming
172
+ - **🎯 Resource Oriented Architecture**: Declarative resource management with watchers, controllers, and reconciliation loops
173
+ - **🔌 MVC Controllers**: Class-based API controllers with automatic discovery and OpenAPI generation
174
+ - **🗄️ Repository Pattern**: Flexible data access layer with support for MongoDB, Event Store, and in-memory repositories
175
+ - **📊 Object Mapping**: Bidirectional mapping between domain models and DTOs
176
+ - **⚡ Reactive Programming**: Built-in support for RxPy and asynchronous event handling
177
+ - **🔧 12-Factor Compliance**: Implements all [12-Factor App](https://12factor.net) principles
178
+ - **📝 Rich Serialization**: JSON serialization with advanced features
179
+
180
+ ## 🎯 Architecture Overview
181
+
182
+ Neuroglia promotes a clean, layered architecture that separates concerns and makes your code more maintainable:
183
+
184
+ ```text
185
+ src/
186
+ ├── api/ # 🌐 API Layer (Controllers, DTOs, Routes)
187
+ ├── application/ # 💼 Application Layer (Commands, Queries, Handlers, Services)
188
+ ├── domain/ # 🏛️ Domain Layer (Entities, Value Objects, Business Rules)
189
+ └── integration/ # 🔌 Integration Layer (External APIs, Repositories, Infrastructure)
190
+ ```
191
+
192
+ ## 📚 Documentation
193
+
194
+ **[📖 Complete Documentation](https://bvandewe.github.io/pyneuro/)**
195
+
196
+ ### Quick Links
197
+
198
+ - **[🚀 Getting Started](docs/getting-started.md)** - Set up your first Neuroglia application
199
+ - **[🏗️ Architecture Guide](docs/patterns/clean-architecture.md)** - Understanding the framework's architecture
200
+ - **[💉 Dependency Injection](docs/patterns/dependency-injection.md)** - Service container and DI patterns
201
+ - **[🎯 CQRS & Mediation](docs/patterns/cqrs.md)** - Command and Query handling
202
+ - **[🗄️ Persistence Patterns](docs/patterns/persistence-patterns.md)** - Domain events with state persistence
203
+ - **[🔧 Pipeline Behaviors](docs/patterns/pipeline-behaviors.md)** - Cross-cutting concerns and middleware
204
+ - **[🎯 Resource Oriented Architecture](docs/patterns/resource-oriented-architecture.md)** - Declarative resource management patterns
205
+ - **[🔌 MVC Controllers](docs/features/mvc-controllers.md)** - Building REST APIs
206
+ - **[🗄️ Data Access](docs/features/data-access.md)** - Repository pattern and data persistence
207
+ - **[📡 Event Handling](docs/patterns/event-driven.md)** - CloudEvents and reactive programming
208
+ - **[📊 Object Mapping](docs/features/object-mapping.md)** - Mapping between different object types
209
+ - **[🔭 Observability](docs/features/observability.md)** - OpenTelemetry integration and monitoring
210
+
211
+ ### Sample Applications
212
+
213
+ Learn by example with complete sample applications:
214
+
215
+ - **[🍕 Mario's Pizzeria](https://bvandewe.github.io/pyneuro/mario-pizzeria/)** - Complete pizzeria management system with UI, authentication, and observability
216
+ - **[🏦 OpenBank](https://bvandewe.github.io/pyneuro/samples/openbank/)** - Event-sourced banking domain with CQRS and EventStoreDB
217
+ - **[🧪 Lab Resource Manager](https://bvandewe.github.io/pyneuro/samples/lab-resource-manager/)** - Resource Oriented Architecture with watchers and reconciliation
218
+ - **[🖥️ Desktop Controller](https://bvandewe.github.io/pyneuro/samples/desktop_controller/)** - Remote desktop management API
219
+ - **[🚪 API Gateway](https://bvandewe.github.io/pyneuro/samples/api_gateway/)** - Microservice gateway with authentication
220
+
221
+ ## 🐳 Quick Start with Docker
222
+
223
+ The fastest way to explore Neuroglia is through our sample applications with Docker:
224
+
225
+ ### Prerequisites
226
+
227
+ - Docker and Docker Compose installed
228
+ - Git (to clone the repository)
229
+
230
+ ### Get Started in 3 Steps
231
+
232
+ ```bash
233
+ # 1. Clone the repository
234
+ git clone https://github.com/bvandewe/pyneuro.git
235
+ cd pyneuro
236
+
237
+ # 2. Start Mario's Pizzeria (includes shared infrastructure)
238
+ ./mario-pizzeria start
239
+
240
+ # 3. Access the application
241
+ # 🍕 Application: http://localhost:8080
242
+ # 📖 API Docs: http://localhost:8080/api/docs
243
+ # 🔐 Keycloak: http://localhost:8090 (admin/admin)
244
+ ```
245
+
246
+ ### Available Sample Applications
247
+
248
+ Each sample comes with its own CLI tool for easy management:
249
+
250
+ ```bash
251
+ # Mario's Pizzeria (State-based persistence + UI)
252
+ ./mario-pizzeria start
253
+ ./mario-pizzeria stop
254
+ ./mario-pizzeria logs
255
+
256
+ # OpenBank (Event Sourcing with EventStoreDB)
257
+ ./openbank start
258
+ ./openbank stop
259
+ ./openbank logs
260
+
261
+ # Simple UI Demo (Authentication patterns)
262
+ ./simple-ui start
263
+ ./simple-ui stop
264
+ ./simple-ui logs
265
+ ```
266
+
267
+ ### Shared Infrastructure
268
+
269
+ All samples share common infrastructure services:
270
+
271
+ - **�️ MongoDB**: Database (port 27017)
272
+ - **� MongoDB Express**: Database UI (port 8081)
273
+ - **🔐 Keycloak**: Authentication (port 8090)
274
+ - **🎬 Event Player**: Event visualization (port 8085)
275
+ - **📊 Grafana**: Dashboards (port 3001)
276
+ - **📈 Prometheus**: Metrics (port 9090)
277
+ - **📝 Loki**: Logs aggregation
278
+ - **🔍 Tempo**: Distributed tracing (port 3200)
279
+
280
+ The shared infrastructure starts automatically with your first sample application.
281
+
282
+ ### Service Ports
283
+
284
+ | Sample | Port | Debug Port | Description |
285
+ | ---------------- | ---- | ---------- | ------------------------------------- |
286
+ | Mario's Pizzeria | 8080 | 5678 | Full-featured pizzeria management |
287
+ | OpenBank | 8899 | 5699 | Event-sourced banking with EventStore |
288
+ | Simple UI | 8082 | 5680 | Authentication patterns demo |
289
+ | EventStoreDB | 2113 | - | Event sourcing database (OpenBank) |
290
+ | MongoDB Express | 8081 | - | Database admin UI |
291
+ | Keycloak | 8090 | - | SSO/OAuth2 server |
292
+ | Event Player | 8085 | - | CloudEvents visualization |
293
+ | Grafana | 3001 | - | Observability dashboards |
294
+ | Prometheus | 9090 | - | Metrics collection |
295
+ | Tempo | 3200 | - | Trace visualization |
296
+
297
+ ### Test Credentials
298
+
299
+ The samples come with pre-configured test users:
300
+
301
+ ```
302
+ Admin: admin / admin123
303
+ Manager: manager / manager123
304
+ Chef: chef / chef123
305
+ Driver: driver / driver123
306
+ Customer: customer / customer123
307
+ ```
308
+
309
+ ### Learn More
310
+
311
+ For detailed deployment documentation, see:
312
+
313
+ - **[🚀 Getting Started Guide](https://bvandewe.github.io/pyneuro/getting-started/)** - Complete setup walkthrough
314
+ - **[🐳 Docker Architecture](deployment/docker-compose/DOCKER_COMPOSE_ARCHITECTURE.md)** - Infrastructure details
315
+ - **[🍕 Mario's Pizzeria Tutorial](https://bvandewe.github.io/pyneuro/guides/mario-pizzeria-tutorial/)** - Step-by-step guide
316
+ - **[🏦 OpenBank Guide](https://bvandewe.github.io/pyneuro/samples/openbank/)** - Event sourcing patterns
317
+
318
+ ## 🔧 Quick Start
319
+
320
+ ```bash
321
+ # Install from PyPI
322
+ pip install neuroglia-python
323
+
324
+ # Or install from source
325
+ git clone <repository-url>
326
+ cd pyneuro
327
+ pip install -e .
328
+ ```
329
+
330
+ Create your first application:
331
+
332
+ ```python
333
+ from neuroglia.hosting.web import WebApplicationBuilder
334
+
335
+ # Create and configure the application
336
+ builder = WebApplicationBuilder()
337
+ builder.add_controllers(["api.controllers"])
338
+
339
+ # Build and run
340
+ app = builder.build()
341
+ app.use_controllers()
342
+ app.run()
343
+ ```
344
+
345
+ ## 🏗️ Framework Components
346
+
347
+ | Component | Purpose | Documentation |
348
+ | ---------------------------------- | ------------------------------------- | --------------------------------------------------------- |
349
+ | **Dependency Injection** | Service container and registration | [📖 DI](docs/patterns/dependency-injection.md) |
350
+ | **Hosting** | Web application hosting and lifecycle | [📖 Hosting](docs/features/hosting.md) |
351
+ | **MVC** | Controllers and routing | [📖 MVC](docs/features/mvc-controllers.md) |
352
+ | **Mediation** | CQRS, commands, queries, events | [📖 CQRS](docs/patterns/cqrs.md) |
353
+ | **Persistence** | Domain events with state persistence | [📖 Persistence](docs/patterns/persistence-patterns.md) |
354
+ | **Pipeline Behaviors** | Cross-cutting concerns, middleware | [📖 Behaviors](docs/patterns/pipeline-behaviors.md) |
355
+ | **Resource Oriented Architecture** | Watchers, controllers, reconciliation | [📖 ROA](docs/patterns/resource-oriented-architecture.md) |
356
+ | **Data** | Repository pattern, event sourcing | [📖 Data](docs/features/data-access.md) |
357
+ | **Eventing** | CloudEvents, pub/sub, reactive | [📖 Events](docs/patterns/event-driven.md) |
358
+ | **Mapping** | Object-to-object mapping | [📖 Mapping](docs/features/object-mapping.md) |
359
+ | **Serialization** | JSON and other serialization | [📖 Serialization](docs/features/serialization.md) |
360
+ | **Observability** | OpenTelemetry, tracing, metrics | [📖 Observability](docs/features/observability.md) |
361
+
362
+ ## 📋 Requirements
363
+
364
+ - Python 3.9+
365
+ - FastAPI
366
+ - Pydantic
367
+ - RxPy (for reactive features)
368
+ - Motor (for MongoDB support)
369
+ - Additional dependencies based on features used
370
+
371
+ ## 🧪 Testing
372
+
373
+ Neuroglia includes a comprehensive test suite covering all framework features with both unit and integration tests.
374
+
375
+ ### Running Tests
376
+
377
+ #### Run All Tests
378
+
379
+ ```bash
380
+ # Run the complete test suite
381
+ pytest
382
+
383
+ # Run with coverage report
384
+ pytest --cov=neuroglia --cov-report=html --cov-report=term
385
+
386
+ # Run in parallel for faster execution
387
+ pytest -n auto
388
+ ```
389
+
390
+ #### Run Specific Test Categories
391
+
392
+ ```bash
393
+ # Run only unit tests
394
+ pytest tests/unit/
395
+
396
+ # Run only integration tests
397
+ pytest tests/integration/
398
+
399
+ # Run tests by marker
400
+ pytest -m "unit"
401
+ pytest -m "integration"
402
+ pytest -m "slow"
403
+ ```
404
+
405
+ #### Run Feature-Specific Tests
406
+
407
+ ```bash
408
+ # Test dependency injection
409
+ pytest tests/unit/test_dependency_injection.py
410
+
411
+ # Test CQRS and mediation
412
+ pytest tests/unit/test_cqrs_mediation.py
413
+
414
+ # Test data access layer
415
+ pytest tests/unit/test_data_access.py
416
+
417
+ # Test object mapping
418
+ pytest tests/unit/test_mapping.py
419
+
420
+ # Run integration tests
421
+ pytest tests/integration/test_full_framework.py
422
+ ```
423
+
424
+ ### Test Coverage
425
+
426
+ Our test suite provides comprehensive coverage of the framework:
427
+
428
+ - **Unit Tests**: >95% coverage for core framework components
429
+ - **Integration Tests**: End-to-end workflow validation
430
+ - **Performance Tests**: Load testing for critical paths
431
+ - **Sample Application Tests**: Real-world usage scenarios
432
+
433
+ ### Test Organization
434
+
435
+ ```text
436
+ tests/
437
+ ├── unit/ # 🔬 Unit tests for individual components
438
+ ├── integration/ # 🔗 Integration tests for workflows
439
+ ├── fixtures/ # 🛠️ Shared test fixtures and utilities
440
+ └── conftest.py # ⚙️ pytest configuration
441
+ ```
442
+
443
+ ### What's Tested
444
+
445
+ - Basic dependency injection service registration and resolution
446
+ - CQRS command and query handling through the mediator
447
+ - Object mapping between different types
448
+ - Repository pattern with various backend implementations
449
+ - Full framework integration workflows
450
+
451
+ ### Test Fixtures
452
+
453
+ We provide comprehensive test fixtures for:
454
+
455
+ - Dependency injection container setup
456
+ - Sample services and repositories
457
+ - Mock data and test entities
458
+ - Configuration and settings
459
+
460
+ ### Known Test Limitations
461
+
462
+ - Some dependency injection features (like strict service lifetimes) may have implementation-specific behavior
463
+ - MongoDB integration tests require a running MongoDB instance
464
+ - Event Store tests require EventStoreDB connection
465
+
466
+ ### Adding Tests
467
+
468
+ When contributing, please include tests for new features:
469
+
470
+ ```python
471
+ import pytest
472
+ from neuroglia.dependency_injection import ServiceCollection
473
+
474
+ class TestNewFeature:
475
+
476
+ @pytest.mark.unit
477
+ def test_my_unit_feature(self):
478
+ """Test individual component"""
479
+ result = self.service.do_something()
480
+ assert result == expected_value
481
+ ```
482
+
483
+ ## 🤝 Contributing
484
+
485
+ We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.
486
+
487
+ ## 📄 License
488
+
489
+ This project is licensed under the Apache License 2.0 - see the [LICENSE](LICENSE) file for details.
490
+
491
+ ## 📖 Documentation
492
+
493
+ Complete documentation is available at [https://bvandewe.github.io/pyneuro/](https://bvandewe.github.io/pyneuro/)
494
+
495
+ ## Disclaimer
496
+
497
+ This project was the opportunity for me (cdavernas) to learn Python while porting some of the concepts and services of the .NET version of the Neuroglia Framework
498
+
499
+ ## Packaging
500
+
501
+ ```sh
502
+ # Set `package-mode = true` in pyproject.toml
503
+ # Set the version tag in pyproject.toml
504
+ # Commit changes
505
+ # Create API Token in pypi.org...
506
+ # Configure credentials for pypi registry:
507
+ poetry config pypi-token.pypi {pypi-....mytoken}
508
+ # Build package locally
509
+ poetry build
510
+ # Publish package to pypi.org:
511
+ poetry publish
512
+ ```
513
+