neuroglia-python 0.7.8__tar.gz → 0.7.10__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.7.8 → neuroglia_python-0.7.10}/PKG-INFO +3 -3
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/pyproject.toml +3 -3
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/__init__.py +1 -1
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/serialization/json.py +52 -1
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/LICENSE +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/README.md +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/application/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/application/background_scheduler.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/coordination/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/coordination/abstractions.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/coordination/leader_election.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/coordination/redis_backend.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/core/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/core/module_loader.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/core/operation_result.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/core/problem_details.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/core/type_extensions.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/core/type_finder.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/core/type_registry.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/abstractions.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/exceptions.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/infrastructure/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/infrastructure/abstractions.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/infrastructure/event_sourcing/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/infrastructure/event_sourcing/abstractions.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/infrastructure/event_sourcing/event_sourcing_repository.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/infrastructure/event_sourcing/event_store/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/infrastructure/event_sourcing/event_store/event_store.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/infrastructure/event_sourcing/read_model_reconciliator.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/infrastructure/filesystem/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/infrastructure/filesystem/filesystem_repository.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/infrastructure/memory/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/infrastructure/memory/memory_repository.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/infrastructure/mongo/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/infrastructure/mongo/enhanced_mongo_repository.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/infrastructure/mongo/mongo_repository.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/infrastructure/mongo/motor_query.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/infrastructure/mongo/motor_repository.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/infrastructure/mongo/serialization_helper.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/infrastructure/mongo/typed_mongo_query.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/infrastructure/resources/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/infrastructure/resources/in_memory_storage_backend.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/infrastructure/resources/postgres_resource_store.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/infrastructure/resources/redis_resource_store.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/infrastructure/resources/resource_repository.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/infrastructure/tracing_mixin.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/queries/generic/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/queries/generic/get_by_id_query.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/queries/generic/list_query.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/queryable.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/resources/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/resources/abstractions.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/resources/controller.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/resources/serializers/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/resources/serializers/xml_serializer.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/resources/serializers/yaml_serializer.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/resources/state_machine.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/resources/watcher.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/unit_of_work.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/dependency_injection/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/dependency_injection/service_provider.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/dependency_injection/service_provider_backup.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/eventing/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/eventing/cloud_events/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/eventing/cloud_events/cloud_event.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/eventing/cloud_events/decorators.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/eventing/cloud_events/infrastructure/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/eventing/cloud_events/infrastructure/cloud_event_bus.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/eventing/cloud_events/infrastructure/cloud_event_ingestor.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/eventing/cloud_events/infrastructure/cloud_event_middleware.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/eventing/cloud_events/infrastructure/cloud_event_publisher.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/eventing/tracing.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/expressions/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/expressions/javascript_expression_translator.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/extensions/cqrs_metrics_extensions.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/extensions/mediator_extensions.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/extensions/state_persistence_extensions.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/hosting/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/hosting/abstractions.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/hosting/configuration/data_access_layer.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/hosting/web.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/integration/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/integration/cache_repository.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/integration/http_service_client.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/integration/models.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/logging/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/logging/logger.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/mapping/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/mapping/mapper.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/mediation/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/mediation/behaviors/domain_event_cloudevent_behavior.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/mediation/behaviors/domain_event_dispatching_middleware.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/mediation/mediator.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/mediation/metrics_middleware.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/mediation/pipeline_behavior.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/mediation/simple.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/mediation/tracing_middleware.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/mvc/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/mvc/controller_base.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/observability/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/observability/framework.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/observability/logging.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/observability/metrics.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/observability/otel_sdk.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/observability/settings.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/observability/tracing.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/py.typed +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/reactive/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/reactive/rx_async.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/serialization/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/serialization/abstractions.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/serialization/aggregate_serializer.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/utils/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/utils/camel_model.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/utils/case_conversion.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/validation/__init__.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/validation/business_rules.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/validation/exceptions.py +0 -0
- {neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/validation/validators.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: neuroglia-python
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.10
|
|
4
4
|
Summary: Port from .NET to Python of the Neuroglia Framework
|
|
5
5
|
License: Apache
|
|
6
6
|
License-File: LICENSE
|
|
@@ -50,7 +50,7 @@ Requires-Dist: passlib[bcrypt] (==1.7.4)
|
|
|
50
50
|
Requires-Dist: prometheus-client (==0.21.0)
|
|
51
51
|
Requires-Dist: protobuf (==6.33.1) ; extra == "etcd" or extra == "all"
|
|
52
52
|
Requires-Dist: pydantic-settings (==2.6.1)
|
|
53
|
-
Requires-Dist: pydantic[email] (==2.
|
|
53
|
+
Requires-Dist: pydantic[email] (==2.11.0)
|
|
54
54
|
Requires-Dist: pyjwt (==2.10.1)
|
|
55
55
|
Requires-Dist: pymongo (==4.15.4) ; extra == "mongodb" or extra == "all"
|
|
56
56
|
Requires-Dist: python-dotenv (==1.0.1)
|
|
@@ -58,7 +58,7 @@ Requires-Dist: python-multipart (==0.0.17)
|
|
|
58
58
|
Requires-Dist: redis (==5.2.0) ; extra == "redis" or extra == "all"
|
|
59
59
|
Requires-Dist: rx (==3.2.0)
|
|
60
60
|
Requires-Dist: typing-extensions (==4.12.2)
|
|
61
|
-
Requires-Dist: uvicorn (==0.
|
|
61
|
+
Requires-Dist: uvicorn (==0.35.0)
|
|
62
62
|
Description-Content-Type: text/markdown
|
|
63
63
|
|
|
64
64
|
# Neuroglia Python Framework
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "neuroglia-python"
|
|
3
|
-
version = "0.7.
|
|
3
|
+
version = "0.7.10"
|
|
4
4
|
description = "Port from .NET to Python of the Neuroglia Framework"
|
|
5
5
|
authors = ["Charles d'Avernas <charles.davernas@neuroglia.io>", "Bruno van de Werve <bvandewe@gmail.com>"]
|
|
6
6
|
license = "Apache"
|
|
@@ -21,7 +21,7 @@ pydantic-settings = "2.6.1"
|
|
|
21
21
|
python-dotenv = "1.0.1"
|
|
22
22
|
typing-extensions = "4.12.2"
|
|
23
23
|
rx = { version = "3.2.0" }
|
|
24
|
-
uvicorn = { version = "0.
|
|
24
|
+
uvicorn = { version = "0.35.0" }
|
|
25
25
|
httpx = { version = "0.27.2" }
|
|
26
26
|
grpcio = { version = "1.76.0" }
|
|
27
27
|
h11 = { version = "0.16.0" } # Security fix for CVE-2025-43859
|
|
@@ -35,7 +35,7 @@ itsdangerous = "2.2.0"
|
|
|
35
35
|
# Core dependencies
|
|
36
36
|
protobuf = "6.33.1" # Pinned for compatibility with kurrentdbclient, OpenTelemetry, and etcd3-py
|
|
37
37
|
apscheduler = "3.11.0"
|
|
38
|
-
pydantic = {extras = ["email"], version = "2.
|
|
38
|
+
pydantic = {extras = ["email"], version = "2.11.0"}
|
|
39
39
|
email-validator = "2.2.0"
|
|
40
40
|
jinja2 = "3.1.4"
|
|
41
41
|
|
|
@@ -445,6 +445,10 @@ class JsonSerializer(TextSerializer):
|
|
|
445
445
|
|
|
446
446
|
def _deserialize_object(self, data: dict, expected_type: type) -> Any:
|
|
447
447
|
"""Deserialize a dictionary into an object using type annotations."""
|
|
448
|
+
# Handle Pydantic BaseModel types using model_validate for proper initialization
|
|
449
|
+
if self._is_pydantic_model(expected_type):
|
|
450
|
+
return expected_type.model_validate(data)
|
|
451
|
+
|
|
448
452
|
fields = {}
|
|
449
453
|
|
|
450
454
|
# Collect all type annotations from the class hierarchy
|
|
@@ -733,6 +737,10 @@ class JsonSerializer(TextSerializer):
|
|
|
733
737
|
object.__setattr__(instance, key, val)
|
|
734
738
|
return instance
|
|
735
739
|
|
|
740
|
+
# Handle Pydantic BaseModel deserialization
|
|
741
|
+
if self._is_pydantic_model(expected_type):
|
|
742
|
+
return expected_type.model_validate(value)
|
|
743
|
+
|
|
736
744
|
origin_expected = get_origin(expected_type)
|
|
737
745
|
if expected_type == dict or origin_expected is dict:
|
|
738
746
|
# If the expected type is a plain dict, we need to deserialize each value in the dict.
|
|
@@ -770,20 +778,41 @@ class JsonSerializer(TextSerializer):
|
|
|
770
778
|
# Check if the item should be a dataclass instance
|
|
771
779
|
if isinstance(v, dict) and is_dataclass(item_type):
|
|
772
780
|
# Deserialize dict to dataclass using proper field deserialization
|
|
781
|
+
# Use get_type_hints() to properly resolve type annotations (e.g., dict[str, Any])
|
|
782
|
+
try:
|
|
783
|
+
dataclass_type_hints = get_type_hints(item_type)
|
|
784
|
+
except (NameError, TypeError, AttributeError):
|
|
785
|
+
dataclass_type_hints = {field.name: field.type for field in fields(item_type)}
|
|
786
|
+
except Exception:
|
|
787
|
+
dataclass_type_hints = {field.name: field.type for field in fields(item_type)}
|
|
773
788
|
field_dict = {}
|
|
774
789
|
for field in fields(item_type):
|
|
775
790
|
if field.name in v:
|
|
776
|
-
field_type = field.type
|
|
791
|
+
field_type = dataclass_type_hints.get(field.name, field.type)
|
|
777
792
|
if isinstance(field_type, str):
|
|
778
793
|
field_dict[field.name] = v[field.name]
|
|
779
794
|
else:
|
|
780
795
|
field_value = self._deserialize_nested(v[field.name], field_type)
|
|
781
796
|
field_dict[field.name] = field_value
|
|
797
|
+
# Ensure Optional fields missing from the payload are explicitly populated
|
|
798
|
+
for field in fields(item_type):
|
|
799
|
+
if field.name in field_dict:
|
|
800
|
+
continue
|
|
801
|
+
resolved_type = dataclass_type_hints.get(field.name, field.type)
|
|
802
|
+
if field.default is not MISSING:
|
|
803
|
+
field_dict[field.name] = field.default
|
|
804
|
+
elif field.default_factory is not MISSING: # type: ignore[attr-defined]
|
|
805
|
+
field_dict[field.name] = field.default_factory() # type: ignore[attr-defined]
|
|
806
|
+
elif self._is_optional_type(resolved_type):
|
|
807
|
+
field_dict[field.name] = None
|
|
782
808
|
# Create instance and set fields (works for frozen and non-frozen dataclasses)
|
|
783
809
|
item_instance: Any = object.__new__(cast(type, item_type))
|
|
784
810
|
for key, val in field_dict.items():
|
|
785
811
|
object.__setattr__(item_instance, key, val)
|
|
786
812
|
values.append(item_instance)
|
|
813
|
+
elif isinstance(v, dict) and self._is_pydantic_model(item_type):
|
|
814
|
+
# Use Pydantic's model_validate for proper model initialization
|
|
815
|
+
values.append(item_type.model_validate(v))
|
|
787
816
|
else:
|
|
788
817
|
# For non-dataclass types, use regular deserialization
|
|
789
818
|
deserialized = self._deserialize_nested(v, item_type)
|
|
@@ -842,6 +871,28 @@ class JsonSerializer(TextSerializer):
|
|
|
842
871
|
return any(arg is type(None) for arg in get_args(annotation))
|
|
843
872
|
return False
|
|
844
873
|
|
|
874
|
+
def _is_pydantic_model(self, cls: Any) -> bool:
|
|
875
|
+
"""
|
|
876
|
+
Check if a type is a Pydantic BaseModel subclass.
|
|
877
|
+
|
|
878
|
+
Uses duck typing to avoid hard dependency on Pydantic being installed.
|
|
879
|
+
Pydantic v2 models have a `model_validate` classmethod that accepts dict data.
|
|
880
|
+
|
|
881
|
+
Args:
|
|
882
|
+
cls: The type to check
|
|
883
|
+
|
|
884
|
+
Returns:
|
|
885
|
+
True if the type appears to be a Pydantic BaseModel, False otherwise
|
|
886
|
+
"""
|
|
887
|
+
if not isinstance(cls, type):
|
|
888
|
+
return False
|
|
889
|
+
# Check for Pydantic v2 model_validate method (preferred detection)
|
|
890
|
+
if hasattr(cls, "model_validate") and callable(getattr(cls, "model_validate", None)):
|
|
891
|
+
# Additional check: Pydantic models also have model_fields
|
|
892
|
+
if hasattr(cls, "model_fields"):
|
|
893
|
+
return True
|
|
894
|
+
return False
|
|
895
|
+
|
|
845
896
|
@staticmethod
|
|
846
897
|
def configure(builder: "ApplicationBuilderBase", modules: Optional[list[str]] = None) -> "ApplicationBuilderBase":
|
|
847
898
|
"""
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/application/background_scheduler.py
RENAMED
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/coordination/abstractions.py
RENAMED
|
File without changes
|
{neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/coordination/leader_election.py
RENAMED
|
File without changes
|
{neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/coordination/redis_backend.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/infrastructure/__init__.py
RENAMED
|
File without changes
|
{neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/infrastructure/abstractions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/queries/generic/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/queries/generic/list_query.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/resources/abstractions.py
RENAMED
|
File without changes
|
{neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/resources/controller.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/data/resources/state_machine.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/dependency_injection/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/eventing/cloud_events/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/eventing/cloud_events/decorators.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/extensions/mediator_extensions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/integration/cache_repository.py
RENAMED
|
File without changes
|
{neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/integration/http_service_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/mediation/metrics_middleware.py
RENAMED
|
File without changes
|
{neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/mediation/pipeline_behavior.py
RENAMED
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/mediation/tracing_middleware.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/serialization/abstractions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.7.8 → neuroglia_python-0.7.10}/src/neuroglia/validation/business_rules.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|