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.
- neuroglia_python-0.6.17/PKG-INFO +513 -0
- neuroglia_python-0.6.17/README.md +450 -0
- neuroglia_python-0.6.17/pyproject.toml +97 -0
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/__init__.py +214 -38
- neuroglia_python-0.6.17/src/neuroglia/application/__init__.py +33 -0
- neuroglia_python-0.6.17/src/neuroglia/application/background_scheduler.py +475 -0
- neuroglia_python-0.6.17/src/neuroglia/coordination/__init__.py +17 -0
- neuroglia_python-0.6.17/src/neuroglia/coordination/abstractions.py +69 -0
- neuroglia_python-0.6.17/src/neuroglia/coordination/leader_election.py +221 -0
- neuroglia_python-0.6.17/src/neuroglia/coordination/redis_backend.py +117 -0
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/core/__init__.py +2 -1
- neuroglia_python-0.6.17/src/neuroglia/core/operation_result.py +269 -0
- neuroglia_python-0.6.17/src/neuroglia/core/problem_details.py +148 -0
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/core/type_extensions.py +28 -12
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/core/type_finder.py +12 -5
- neuroglia_python-0.6.17/src/neuroglia/core/type_registry.py +143 -0
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/__init__.py +19 -12
- neuroglia_python-0.6.17/src/neuroglia/data/abstractions.py +348 -0
- neuroglia_python-0.6.17/src/neuroglia/data/exceptions.py +113 -0
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/infrastructure/__init__.py +24 -12
- neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/abstractions.py +307 -0
- neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/event_sourcing/abstractions.py +210 -0
- neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/event_sourcing/event_sourcing_repository.py +266 -0
- neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/event_sourcing/event_store/event_store.py +371 -0
- neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/event_sourcing/read_model_reconciliator.py +89 -0
- neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/filesystem/__init__.py +5 -0
- neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/filesystem/filesystem_repository.py +308 -0
- neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/memory/memory_repository.py +86 -0
- neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/mongo/__init__.py +85 -0
- neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/mongo/enhanced_mongo_repository.py +353 -0
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/infrastructure/mongo/mongo_repository.py +168 -91
- neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/mongo/motor_repository.py +770 -0
- neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/mongo/serialization_helper.py +229 -0
- neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/mongo/typed_mongo_query.py +320 -0
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/infrastructure/resources/in_memory_storage_backend.py +17 -19
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/infrastructure/resources/postgres_resource_store.py +37 -36
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/infrastructure/resources/redis_resource_store.py +25 -23
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/infrastructure/resources/resource_repository.py +99 -59
- neuroglia_python-0.6.17/src/neuroglia/data/infrastructure/tracing_mixin.py +408 -0
- neuroglia_python-0.6.17/src/neuroglia/data/queries/generic/get_by_id_query.py +81 -0
- neuroglia_python-0.6.17/src/neuroglia/data/queries/generic/list_query.py +70 -0
- neuroglia_python-0.6.17/src/neuroglia/data/queryable.py +295 -0
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/resources/__init__.py +18 -26
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/resources/abstractions.py +135 -51
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/resources/controller.py +150 -104
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/resources/serializers/xml_serializer.py +45 -45
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/resources/serializers/yaml_serializer.py +35 -35
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/resources/state_machine.py +48 -47
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/resources/watcher.py +140 -101
- neuroglia_python-0.6.17/src/neuroglia/data/unit_of_work.py +256 -0
- neuroglia_python-0.6.17/src/neuroglia/dependency_injection/__init__.py +54 -0
- neuroglia_python-0.6.17/src/neuroglia/dependency_injection/service_provider.py +939 -0
- neuroglia_python-0.6.17/src/neuroglia/dependency_injection/service_provider_backup.py +850 -0
- neuroglia_python-0.6.17/src/neuroglia/eventing/__init__.py +71 -0
- neuroglia_python-0.6.17/src/neuroglia/eventing/cloud_events/__init__.py +3 -0
- neuroglia_python-0.6.17/src/neuroglia/eventing/cloud_events/cloud_event.py +257 -0
- neuroglia_python-0.6.17/src/neuroglia/eventing/cloud_events/decorators.py +89 -0
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/eventing/cloud_events/infrastructure/__init__.py +2 -0
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/eventing/cloud_events/infrastructure/cloud_event_ingestor.py +14 -7
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/eventing/cloud_events/infrastructure/cloud_event_middleware.py +4 -2
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/eventing/cloud_events/infrastructure/cloud_event_publisher.py +38 -25
- neuroglia_python-0.6.17/src/neuroglia/eventing/tracing.py +176 -0
- neuroglia_python-0.6.17/src/neuroglia/extensions/cqrs_metrics_extensions.py +98 -0
- neuroglia_python-0.6.17/src/neuroglia/extensions/mediator_extensions.py +72 -0
- neuroglia_python-0.6.17/src/neuroglia/extensions/state_persistence_extensions.py +288 -0
- neuroglia_python-0.6.17/src/neuroglia/hosting/__init__.py +109 -0
- neuroglia_python-0.6.17/src/neuroglia/hosting/abstractions.py +169 -0
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/hosting/configuration/data_access_layer.py +30 -23
- neuroglia_python-0.6.17/src/neuroglia/hosting/web.py +1017 -0
- neuroglia_python-0.6.17/src/neuroglia/integration/__init__.py +181 -0
- neuroglia_python-0.6.17/src/neuroglia/integration/cache_repository.py +569 -0
- neuroglia_python-0.6.17/src/neuroglia/integration/http_service_client.py +574 -0
- neuroglia_python-0.6.17/src/neuroglia/mapping/mapper.py +525 -0
- neuroglia_python-0.6.17/src/neuroglia/mediation/__init__.py +376 -0
- neuroglia_python-0.6.17/src/neuroglia/mediation/behaviors/domain_event_cloudevent_behavior.py +145 -0
- neuroglia_python-0.6.17/src/neuroglia/mediation/behaviors/domain_event_dispatching_middleware.py +94 -0
- neuroglia_python-0.6.17/src/neuroglia/mediation/mediator.py +1424 -0
- neuroglia_python-0.6.17/src/neuroglia/mediation/metrics_middleware.py +250 -0
- neuroglia_python-0.6.17/src/neuroglia/mediation/pipeline_behavior.py +124 -0
- neuroglia_python-0.6.17/src/neuroglia/mediation/simple.py +513 -0
- neuroglia_python-0.6.17/src/neuroglia/mediation/tracing_middleware.py +197 -0
- neuroglia_python-0.6.17/src/neuroglia/mvc/__init__.py +45 -0
- neuroglia_python-0.6.17/src/neuroglia/mvc/controller_base.py +217 -0
- neuroglia_python-0.6.17/src/neuroglia/observability/__init__.py +115 -0
- neuroglia_python-0.6.17/src/neuroglia/observability/framework.py +266 -0
- neuroglia_python-0.6.17/src/neuroglia/observability/logging.py +242 -0
- neuroglia_python-0.6.17/src/neuroglia/observability/metrics.py +328 -0
- neuroglia_python-0.6.17/src/neuroglia/observability/otel_sdk.py +563 -0
- neuroglia_python-0.6.17/src/neuroglia/observability/settings.py +245 -0
- neuroglia_python-0.6.17/src/neuroglia/observability/tracing.py +257 -0
- neuroglia_python-0.6.17/src/neuroglia/reactive/rx_async.py +23 -0
- neuroglia_python-0.6.17/src/neuroglia/serialization/__init__.py +55 -0
- neuroglia_python-0.6.17/src/neuroglia/serialization/abstractions.py +142 -0
- neuroglia_python-0.6.17/src/neuroglia/serialization/aggregate_serializer.py +410 -0
- neuroglia_python-0.6.17/src/neuroglia/serialization/json.py +786 -0
- neuroglia_python-0.6.17/src/neuroglia/utils/__init__.py +73 -0
- neuroglia_python-0.6.17/src/neuroglia/utils/camel_model.py +205 -0
- neuroglia_python-0.6.17/src/neuroglia/utils/case_conversion.py +279 -0
- neuroglia_python-0.6.17/src/neuroglia/validation/__init__.py +111 -0
- neuroglia_python-0.6.17/src/neuroglia/validation/business_rules.py +372 -0
- neuroglia_python-0.6.17/src/neuroglia/validation/exceptions.py +140 -0
- neuroglia_python-0.6.17/src/neuroglia/validation/validators.py +315 -0
- neuroglia_python-0.1.8/PKG-INFO +0 -282
- neuroglia_python-0.1.8/README.md +0 -249
- neuroglia_python-0.1.8/pyproject.toml +0 -46
- neuroglia_python-0.1.8/src/neuroglia/core/operation_result.py +0 -11
- neuroglia_python-0.1.8/src/neuroglia/core/problem_details.py +0 -25
- neuroglia_python-0.1.8/src/neuroglia/data/abstractions.py +0 -124
- neuroglia_python-0.1.8/src/neuroglia/data/infrastructure/abstractions.py +0 -78
- neuroglia_python-0.1.8/src/neuroglia/data/infrastructure/event_sourcing/abstractions.py +0 -146
- neuroglia_python-0.1.8/src/neuroglia/data/infrastructure/event_sourcing/event_sourcing_repository.py +0 -77
- neuroglia_python-0.1.8/src/neuroglia/data/infrastructure/event_sourcing/event_store/event_store.py +0 -182
- neuroglia_python-0.1.8/src/neuroglia/data/infrastructure/event_sourcing/read_model_reconciliator.py +0 -62
- neuroglia_python-0.1.8/src/neuroglia/data/infrastructure/memory/memory_repository.py +0 -29
- neuroglia_python-0.1.8/src/neuroglia/data/infrastructure/mongo/__init__.py +0 -12
- neuroglia_python-0.1.8/src/neuroglia/data/queries/generic/get_by_id_query.py +0 -30
- neuroglia_python-0.1.8/src/neuroglia/data/queries/generic/list_query.py +0 -23
- neuroglia_python-0.1.8/src/neuroglia/data/queryable.py +0 -175
- neuroglia_python-0.1.8/src/neuroglia/dependency_injection/__init__.py +0 -1
- neuroglia_python-0.1.8/src/neuroglia/dependency_injection/service_provider.py +0 -341
- neuroglia_python-0.1.8/src/neuroglia/eventing/__init__.py +0 -11
- neuroglia_python-0.1.8/src/neuroglia/eventing/cloud_events/__init__.py +0 -1
- neuroglia_python-0.1.8/src/neuroglia/eventing/cloud_events/cloud_event.py +0 -83
- neuroglia_python-0.1.8/src/neuroglia/eventing/cloud_events/decorators.py +0 -5
- neuroglia_python-0.1.8/src/neuroglia/hosting/__init__.py +0 -14
- neuroglia_python-0.1.8/src/neuroglia/hosting/abstractions.py +0 -141
- neuroglia_python-0.1.8/src/neuroglia/hosting/web.py +0 -87
- neuroglia_python-0.1.8/src/neuroglia/integration/__init__.py +0 -11
- neuroglia_python-0.1.8/src/neuroglia/mapping/mapper.py +0 -238
- neuroglia_python-0.1.8/src/neuroglia/mediation/__init__.py +0 -1
- neuroglia_python-0.1.8/src/neuroglia/mediation/mediator.py +0 -182
- neuroglia_python-0.1.8/src/neuroglia/mvc/__init__.py +0 -11
- neuroglia_python-0.1.8/src/neuroglia/mvc/controller_base.py +0 -72
- neuroglia_python-0.1.8/src/neuroglia/reactive/rx_async.py +0 -16
- neuroglia_python-0.1.8/src/neuroglia/serialization/__init__.py +0 -14
- neuroglia_python-0.1.8/src/neuroglia/serialization/abstractions.py +0 -30
- neuroglia_python-0.1.8/src/neuroglia/serialization/json.py +0 -212
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/LICENSE +0 -0
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/core/module_loader.py +0 -0
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/infrastructure/event_sourcing/__init__.py +0 -0
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/infrastructure/event_sourcing/event_store/__init__.py +0 -0
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/infrastructure/memory/__init__.py +0 -0
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/infrastructure/resources/__init__.py +0 -0
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/queries/generic/__init__.py +0 -0
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/data/resources/serializers/__init__.py +0 -0
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/eventing/cloud_events/infrastructure/cloud_event_bus.py +0 -0
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/expressions/__init__.py +0 -0
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/expressions/javascript_expression_translator.py +0 -0
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/integration/models.py +0 -0
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/logging/__init__.py +0 -0
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/logging/logger.py +0 -0
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/mapping/__init__.py +0 -0
- {neuroglia_python-0.1.8 → neuroglia_python-0.6.17}/src/neuroglia/py.typed +0 -0
- {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
|
+
[](https://badge.fury.io/py/neuroglia-python)
|
|
66
|
+
[](https://www.python.org/downloads/)
|
|
67
|
+
[](https://opensource.org/licenses/Apache-2.0)
|
|
68
|
+
[](https://bvandewe.github.io/pyneuro/)
|
|
69
|
+
[](https://github.com/bvandewe/pyneuro/blob/main/CHANGELOG.md)
|
|
70
|
+
[](https://python-poetry.org/)
|
|
71
|
+
[](https://www.docker.com/)
|
|
72
|
+
[](https://github.com/pre-commit/pre-commit)
|
|
73
|
+
[](https://github.com/psf/black)
|
|
74
|
+
[](https://fastapi.tiangolo.com/)
|
|
75
|
+
[](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
|
+
|