neuroglia-python 0.7.6__tar.gz → 0.7.7__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 (120) hide show
  1. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/PKG-INFO +1 -1
  2. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/pyproject.toml +1 -1
  3. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/__init__.py +1 -1
  4. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/serialization/json.py +41 -3
  5. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/LICENSE +0 -0
  6. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/README.md +0 -0
  7. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/application/__init__.py +0 -0
  8. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/application/background_scheduler.py +0 -0
  9. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/coordination/__init__.py +0 -0
  10. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/coordination/abstractions.py +0 -0
  11. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/coordination/leader_election.py +0 -0
  12. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/coordination/redis_backend.py +0 -0
  13. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/core/__init__.py +0 -0
  14. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/core/module_loader.py +0 -0
  15. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/core/operation_result.py +0 -0
  16. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/core/problem_details.py +0 -0
  17. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/core/type_extensions.py +0 -0
  18. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/core/type_finder.py +0 -0
  19. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/core/type_registry.py +0 -0
  20. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/__init__.py +0 -0
  21. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/abstractions.py +0 -0
  22. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/exceptions.py +0 -0
  23. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/infrastructure/__init__.py +0 -0
  24. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/infrastructure/abstractions.py +0 -0
  25. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/infrastructure/event_sourcing/__init__.py +0 -0
  26. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/infrastructure/event_sourcing/abstractions.py +0 -0
  27. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/infrastructure/event_sourcing/event_sourcing_repository.py +0 -0
  28. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/infrastructure/event_sourcing/event_store/__init__.py +0 -0
  29. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/infrastructure/event_sourcing/event_store/event_store.py +0 -0
  30. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/infrastructure/event_sourcing/read_model_reconciliator.py +0 -0
  31. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/infrastructure/filesystem/__init__.py +0 -0
  32. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/infrastructure/filesystem/filesystem_repository.py +0 -0
  33. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/infrastructure/memory/__init__.py +0 -0
  34. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/infrastructure/memory/memory_repository.py +0 -0
  35. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/infrastructure/mongo/__init__.py +0 -0
  36. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/infrastructure/mongo/enhanced_mongo_repository.py +0 -0
  37. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/infrastructure/mongo/mongo_repository.py +0 -0
  38. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/infrastructure/mongo/motor_query.py +0 -0
  39. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/infrastructure/mongo/motor_repository.py +0 -0
  40. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/infrastructure/mongo/serialization_helper.py +0 -0
  41. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/infrastructure/mongo/typed_mongo_query.py +0 -0
  42. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/infrastructure/resources/__init__.py +0 -0
  43. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/infrastructure/resources/in_memory_storage_backend.py +0 -0
  44. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/infrastructure/resources/postgres_resource_store.py +0 -0
  45. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/infrastructure/resources/redis_resource_store.py +0 -0
  46. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/infrastructure/resources/resource_repository.py +0 -0
  47. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/infrastructure/tracing_mixin.py +0 -0
  48. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/queries/generic/__init__.py +0 -0
  49. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/queries/generic/get_by_id_query.py +0 -0
  50. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/queries/generic/list_query.py +0 -0
  51. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/queryable.py +0 -0
  52. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/resources/__init__.py +0 -0
  53. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/resources/abstractions.py +0 -0
  54. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/resources/controller.py +0 -0
  55. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/resources/serializers/__init__.py +0 -0
  56. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/resources/serializers/xml_serializer.py +0 -0
  57. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/resources/serializers/yaml_serializer.py +0 -0
  58. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/resources/state_machine.py +0 -0
  59. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/resources/watcher.py +0 -0
  60. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/data/unit_of_work.py +0 -0
  61. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/dependency_injection/__init__.py +0 -0
  62. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/dependency_injection/service_provider.py +0 -0
  63. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/dependency_injection/service_provider_backup.py +0 -0
  64. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/eventing/__init__.py +0 -0
  65. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/eventing/cloud_events/__init__.py +0 -0
  66. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/eventing/cloud_events/cloud_event.py +0 -0
  67. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/eventing/cloud_events/decorators.py +0 -0
  68. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/eventing/cloud_events/infrastructure/__init__.py +0 -0
  69. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/eventing/cloud_events/infrastructure/cloud_event_bus.py +0 -0
  70. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/eventing/cloud_events/infrastructure/cloud_event_ingestor.py +0 -0
  71. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/eventing/cloud_events/infrastructure/cloud_event_middleware.py +0 -0
  72. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/eventing/cloud_events/infrastructure/cloud_event_publisher.py +0 -0
  73. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/eventing/tracing.py +0 -0
  74. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/expressions/__init__.py +0 -0
  75. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/expressions/javascript_expression_translator.py +0 -0
  76. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/extensions/cqrs_metrics_extensions.py +0 -0
  77. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/extensions/mediator_extensions.py +0 -0
  78. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/extensions/state_persistence_extensions.py +0 -0
  79. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/hosting/__init__.py +0 -0
  80. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/hosting/abstractions.py +0 -0
  81. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/hosting/configuration/data_access_layer.py +0 -0
  82. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/hosting/web.py +0 -0
  83. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/integration/__init__.py +0 -0
  84. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/integration/cache_repository.py +0 -0
  85. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/integration/http_service_client.py +0 -0
  86. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/integration/models.py +0 -0
  87. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/logging/__init__.py +0 -0
  88. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/logging/logger.py +0 -0
  89. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/mapping/__init__.py +0 -0
  90. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/mapping/mapper.py +0 -0
  91. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/mediation/__init__.py +0 -0
  92. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/mediation/behaviors/domain_event_cloudevent_behavior.py +0 -0
  93. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/mediation/behaviors/domain_event_dispatching_middleware.py +0 -0
  94. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/mediation/mediator.py +0 -0
  95. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/mediation/metrics_middleware.py +0 -0
  96. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/mediation/pipeline_behavior.py +0 -0
  97. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/mediation/simple.py +0 -0
  98. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/mediation/tracing_middleware.py +0 -0
  99. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/mvc/__init__.py +0 -0
  100. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/mvc/controller_base.py +0 -0
  101. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/observability/__init__.py +0 -0
  102. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/observability/framework.py +0 -0
  103. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/observability/logging.py +0 -0
  104. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/observability/metrics.py +0 -0
  105. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/observability/otel_sdk.py +0 -0
  106. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/observability/settings.py +0 -0
  107. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/observability/tracing.py +0 -0
  108. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/py.typed +0 -0
  109. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/reactive/__init__.py +0 -0
  110. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/reactive/rx_async.py +0 -0
  111. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/serialization/__init__.py +0 -0
  112. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/serialization/abstractions.py +0 -0
  113. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/serialization/aggregate_serializer.py +0 -0
  114. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/utils/__init__.py +0 -0
  115. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/utils/camel_model.py +0 -0
  116. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/utils/case_conversion.py +0 -0
  117. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/validation/__init__.py +0 -0
  118. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/validation/business_rules.py +0 -0
  119. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/src/neuroglia/validation/exceptions.py +0 -0
  120. {neuroglia_python-0.7.6 → neuroglia_python-0.7.7}/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.6
3
+ Version: 0.7.7
4
4
  Summary: Port from .NET to Python of the Neuroglia Framework
5
5
  License: Apache
6
6
  License-File: LICENSE
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "neuroglia-python"
3
- version = "0.7.6"
3
+ version = "0.7.7"
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"
@@ -62,7 +62,7 @@ __all__ = [
62
62
  ]
63
63
 
64
64
  # Framework metadata
65
- __version__ = "0.7.6"
65
+ __version__ = "0.7.7"
66
66
  __author__ = "Neuroglia Team"
67
67
  __email__ = "team@neuroglia.io"
68
68
  __license__ = "Apache"
@@ -502,12 +502,14 @@ class JsonSerializer(TextSerializer):
502
502
  return datetime.fromisoformat(value.replace("Z", "+00:00"))
503
503
 
504
504
  # Try to detect decimal/money fields by name patterns
505
- if any(pattern in field_name.lower() for pattern in ["price", "cost", "amount", "total", "fee"]):
505
+ # Only match when the field name ENDS with the pattern to avoid false positives
506
+ # from nested paths like "input_schema_properties_price_type"
507
+ if self._is_monetary_field(field_name) and self._looks_like_decimal(value):
506
508
  try:
507
- from decimal import Decimal
509
+ from decimal import Decimal, InvalidOperation
508
510
 
509
511
  return Decimal(value)
510
- except (ValueError, TypeError):
512
+ except (ValueError, TypeError, InvalidOperation):
511
513
  pass
512
514
 
513
515
  # Try to find matching enum types in the target class
@@ -524,6 +526,32 @@ class JsonSerializer(TextSerializer):
524
526
 
525
527
  return value
526
528
 
529
+ # Monetary field patterns for decimal detection
530
+ _MONETARY_PATTERNS: tuple[str, ...] = ("price", "cost", "amount", "total", "fee", "balance", "rate", "tax")
531
+
532
+ def _is_monetary_field(self, field_name: str) -> bool:
533
+ """
534
+ Check if field name represents a monetary/decimal field.
535
+ Only matches when the field name ENDS with a monetary pattern to avoid
536
+ false positives from nested paths like 'input_schema_properties_price_type'.
537
+ """
538
+ field_name_lower = field_name.lower()
539
+ # Split by underscore and check if the last part is a monetary pattern
540
+ parts = field_name_lower.split("_")
541
+ last_part = parts[-1] if parts else ""
542
+ return last_part in self._MONETARY_PATTERNS
543
+
544
+ def _looks_like_decimal(self, value: str) -> bool:
545
+ """
546
+ Check if a string value looks like a valid decimal number.
547
+ This prevents attempting Decimal conversion on arbitrary strings.
548
+ """
549
+ import re
550
+
551
+ # Match optional negative sign, digits, optional decimal point with more digits
552
+ # Also match scientific notation like "1.5e-10"
553
+ return bool(re.match(r"^-?\d+\.?\d*(?:[eE][+-]?\d+)?$", value.strip()))
554
+
527
555
  def _is_datetime_string(self, value: str) -> bool:
528
556
  """Check if a string looks like an ISO datetime."""
529
557
  try:
@@ -585,6 +613,16 @@ class JsonSerializer(TextSerializer):
585
613
  if isinstance(expected_type, str):
586
614
  return value
587
615
 
616
+ # Handle typing.Any - return value as-is for primitives, recursively process containers
617
+ if expected_type is Any:
618
+ if isinstance(value, dict):
619
+ return {k: self._deserialize_nested(v, Any) for k, v in value.items()}
620
+ elif isinstance(value, list):
621
+ return [self._deserialize_nested(item, Any) for item in value]
622
+ else:
623
+ # For primitives (str, int, float, bool, etc.), return as-is
624
+ return value
625
+
588
626
  origin_type = get_origin(expected_type)
589
627
  if origin_type is not None:
590
628
  # This is a generic type (e.g., Optional[SomeType], List[SomeType])