sincpro-framework 3.24.2__tar.gz → 3.26.0__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.
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/PKG-INFO +2 -2
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/pyproject.toml +2 -2
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/__init__.py +7 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/domain/exceptions.py +13 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/failures/__init__.py +20 -1
- sincpro_framework-3.26.0/sincpro_framework/common/failures/problem.py +288 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/domain/keys.py +3 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/__init__.py +14 -2
- sincpro_framework-3.26.0/sincpro_framework/data_layer/object_storage/adapters/http_source.py +172 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/adapters/local.py +30 -5
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/adapters/s3_compatible.py +46 -21
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/domain/exceptions.py +32 -1
- sincpro_framework-3.26.0/sincpro_framework/data_layer/object_storage/domain/fetch.py +18 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/domain/object_store.py +63 -7
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/entrypoint/object_storage.py +72 -9
- sincpro_framework-3.26.0/sincpro_framework/data_layer/object_storage/services/__init__.py +3 -0
- sincpro_framework-3.26.0/sincpro_framework/data_layer/object_storage/services/contents.py +88 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/services/objects.py +15 -69
- sincpro_framework-3.26.0/sincpro_framework/data_layer/object_storage/services/transfers.py +159 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/domain/custom_fields.py +11 -8
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/model_introspection.py +6 -4
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/__init__.py +13 -2
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/__init__.py +1 -3
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/entity.py +9 -7
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/entity_meta.py +21 -26
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/exceptions.py +11 -0
- sincpro_framework-3.26.0/sincpro_framework/ddd/exchange_rates.py +58 -0
- sincpro_framework-3.26.0/sincpro_framework/ddd/iso_4217.py +46 -0
- sincpro_framework-3.26.0/sincpro_framework/ddd/money.py +504 -0
- sincpro_framework-3.26.0/sincpro_framework/ddd/multi_currency.py +253 -0
- sincpro_framework-3.26.0/sincpro_framework/ddd/multi_language.py +137 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/query.py +69 -16
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/__init__.py +7 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/fastapi/problems.py +54 -147
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/fastapi/wire.py +28 -8
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/grpc/wire.py +10 -27
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/mcp/__init__.py +1 -1
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/mcp/mcp.py +60 -10
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/rest/routing.py +17 -45
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/rest/serving.py +27 -9
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/rpc/errors.py +49 -42
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/rpc/serving.py +38 -7
- sincpro_framework-3.26.0/sincpro_framework/entrypoints/domain/exceptions.py +29 -0
- sincpro_framework-3.26.0/sincpro_framework/entrypoints/domain/readiness.py +38 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/entrypoint/fastapi.py +8 -4
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/entrypoint/grpc.py +8 -5
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/entrypoint/mcp.py +2 -2
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/entrypoint/rest.py +6 -2
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/entrypoint/rpc.py +21 -9
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/services/gateway.py +9 -2
- sincpro_framework-3.26.0/sincpro_framework/entrypoints/services/readiness.py +148 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/field_paths.py +15 -3
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/entrypoint/facade.py +8 -6
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/__init__.py +3 -1
- sincpro_framework-3.26.0/sincpro_framework/runtime/testing/contracts/exchange_rates.py +52 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/contracts/object_store.py +20 -1
- sincpro_framework-3.24.2/sincpro_framework/data_layer/object_storage/services/__init__.py +0 -2
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/LICENSE.md +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/README.md +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/aio/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/aio/bus.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/aio/bus.pyi +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/adapters/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/adapters/api_key_provider.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/adapters/role_permissions.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/adapters/service_token_provider.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/adapters/static_provider.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/domain/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/domain/identity.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/domain/permissions.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/domain/provider.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/entrypoint/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/entrypoint/access_control.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/entrypoint/asgi.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/entrypoint/security.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/infrastructure/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/infrastructure/security_context.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/services/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/services/guard.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus.pyi +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/events.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/incomes/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/incomes/events.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/incomes/incomes.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/incomes/listeners.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/incomes/mixins/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/incomes/mixins/bus_incomes.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/interceptors/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/interceptors/interceptor.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/interceptors/mixins/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/interceptors/mixins/bus_interceptors.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/listeners.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/outcomes/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/outcomes/events.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/outcomes/listeners.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/outcomes/mixins/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/outcomes/mixins/bus_outcomes.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/outcomes/outcomes.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/circuit_breaker/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/circuit_breaker/circuit_breaker.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/aws/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/aws/clients.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/failures/classification.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/ids/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/ids/uuid7.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/naming/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/naming/case.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/naming/registered_name.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/ordering/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/ordering/placement.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/reads/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/reads/noting.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/serialization/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/serialization/values.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/transport/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/transport/grpc.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/conf/sincpro_framework_conf.yml +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/adapters/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/adapters/codecs.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/adapters/entries.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/adapters/propagation.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/adapters/stores.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/domain/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/domain/codec.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/domain/drafts.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/domain/exceptions.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/domain/execution.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/domain/level.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/domain/node.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/domain/owner.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/domain/providers.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/domain/sessions.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/domain/store.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/domain/travel.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/entrypoint/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/entrypoint/bus.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/entrypoint/bus_context.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/entrypoint/bus_store.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/entrypoint/executions.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/entrypoint/facade.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/entrypoint/propagation.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/entrypoint/providers.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/entrypoint/resolution.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/entrypoint/scopes.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/entrypoint/threads.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/infrastructure/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/infrastructure/closed_scopes.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/infrastructure/distributed.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/infrastructure/outage.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/infrastructure/shared.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/infrastructure/travel.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/infrastructure/tree.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/services/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/services/drafts.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/services/executions.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/services/nodes.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/services/propagation.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/services/providers.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/services/sessions.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/adapters/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/adapters/eviction.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/adapters/json_codec.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/adapters/key_value_records.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/adapters/keys.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/adapters/observers.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/domain/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/domain/codec.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/domain/eviction.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/domain/exceptions.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/domain/failure.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/domain/freshness.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/domain/idempotency_records.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/domain/idempotent_command.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/domain/observer.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/domain/policies.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/domain/validation.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/entrypoint/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/entrypoint/bus_caching.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/entrypoint/facades.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/infrastructure/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/infrastructure/clock.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/infrastructure/flight.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/services/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/services/cache.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/services/idempotency.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/services/query_caching.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/data_analysis/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/data_analysis/arrow.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/data_analysis/cache.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/data_analysis/frame.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/exceptions.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/adapters/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/adapters/in_memory.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/adapters/manifest.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/domain/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/domain/context_migrations.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/domain/engine.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/domain/exceptions.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/domain/status.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/domain/step.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/entrypoint/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/entrypoint/command_line.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/entrypoint/orchestrator.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/infrastructure/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/infrastructure/step_ids.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/services/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/services/authoring.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/services/moves.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/services/system.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/services/timeline.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/adapters/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/adapters/in_memory.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/domain/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/domain/publication.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/entrypoint/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/services/ids.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/services/publications.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/adapters/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/adapters/migrations/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/adapters/migrations/engine.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/adapters/migrations/environment/env.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/adapters/migrations/environment/script.py.mako +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/adapters/numbering.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/adapters/runtime_use_cases.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/domain/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/domain/consolidation.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/domain/relations.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/domain/transaction.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/aggregate_repository.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/idempotency_records.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/mapping.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/repository.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/template_table/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/template_table/archive.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/template_table/audit.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/template_table/entity.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/template_table/events.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/template_table/idempotency.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/template_table/numbering.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/template_table/properties.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/template_table/runtime_use_cases.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/infrastructure/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/infrastructure/change_tracking.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/infrastructure/database.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/infrastructure/engine_errors.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/infrastructure/flushing.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/infrastructure/in_place_changes.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/infrastructure/mapping_registry.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/infrastructure/observability.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/infrastructure/read_tracking.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/infrastructure/transaction_hooks.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/infrastructure/transaction_opening.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/infrastructure/unit_in_play.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/aggregation.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/cache_invalidation.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/cascade.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/data_mapper.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/event_mapping.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/extension_mapping.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/extension_typing.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/extension_writing.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/relation_resolver.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/sql_translator.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/upsert.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/workflows/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/workflows/reading.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/workflows/repository_state.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/workflows/unit_of_work.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/workflows/writing.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/repositories/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/repositories/memory_numbering.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/repositories/memory_repository.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/repositories/memory_unit.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/adapters/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/adapters/dynamodb.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/adapters/in_memory.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/adapters/memcached.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/adapters/redis.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/domain/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/domain/exceptions.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/domain/key_value.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/domain/lease.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/infrastructure/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/infrastructure/client.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/services/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/services/bypass.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/services/leases.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/domain/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/domain/criteria.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/domain/expression.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/domain/grouping.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/domain/pagination.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/domain/resolution.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/domain/sort.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/domain/strict.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/domain/values.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/entrypoint/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/entrypoint/aggregation.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/entrypoint/evaluation.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/entrypoint/resolution.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/services/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/services/axes.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/services/comparison.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/services/dynamic_values.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/services/evaluation.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/services/reading.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/editing/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/editing/drafts.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/editing/editing.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/editing/edits.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/editing/preview.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/computed.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/derivations.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/entity_collection.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/extensions.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/mixins/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/mixins/archivable.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/mixins/audited.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/mixins/event_sourced.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/presentation.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/relations.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/utils/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/utils/annotations.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/events/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/events/domain_event.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/events/mixins/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/events/mixins/change_tracking.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/events/mixins/deliverable.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/reads/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/reads/defaults.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/reads/reads.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/repositories/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/repositories/aggregate_repository.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/repositories/capabilities.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/repositories/fingerprint.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/repositories/hooks.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/repositories/mixins/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/repositories/mixins/change_tracking.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/repositories/numbering.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/repositories/repository.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/value_object.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/dependencies.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/aws_lambda/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/aws_lambda/sqs.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/adapters/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/adapters/clocks.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/adapters/in_memory_runs.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/adapters/key_value_runs.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/domain/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/domain/clock.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/domain/cron.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/domain/runs.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/domain/schedule.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/gateway/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/gateway/gateway.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/gateway/process.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/registry.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/fastapi/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/fastapi/calling.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/fastapi/exceptions.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/grpc/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/grpc/client.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/grpc/exceptions.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/grpc/naming.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/grpc/proto.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/mcp/auth.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/mcp/exceptions.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/mcp/wire.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/queue/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/queue/channels.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/queue/flavours.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/queue/inbox.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/queue/sqs.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/queue/verdicts.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/queue/wire.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/rest/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/rest/exceptions.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/rest/openapi.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/rpc/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/rpc/exceptions.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/rpc/jrpc.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/rpc/wire.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/domain/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/domain/bindings.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/domain/layers.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/domain/packed.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/domain/surface.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/entrypoint/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/entrypoint/aws_lambda.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/entrypoint/decorators.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/entrypoint/queue.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/entrypoint/workers.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/infrastructure/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/infrastructure/http.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/infrastructure/json_schema.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/infrastructure/registry.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/services/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/services/catalog.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/services/scalar_execution.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/error_handler.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/adapters/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/adapters/aws/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/adapters/aws/attributes.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/adapters/aws/queues.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/adapters/background_queue.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/adapters/faststream/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/adapters/faststream/queue.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/adapters/repository_queue.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/adapters/sync_queue.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/domain/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/domain/broker.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/domain/envelope.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/domain/failure.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/domain/queue.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/domain/relay.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/domain/subscribes.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/entrypoint/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/entrypoint/publisher.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/entrypoint/relay.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/entrypoint/subscriber.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/services/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/services/dispatch.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/services/publication.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/services/relaying.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/exceptions.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/introspection/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/introspection/inspector.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/introspection/operations.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ioc.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/api.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/correlation.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/domain.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/errors/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/errors/record_error.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/errors/setup.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/failure.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/http.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/adapters/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/adapters/in_memory.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/adapters/otel.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/adapters/prometheus.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/domain/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/domain/bus_observability.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/domain/declarations.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/domain/instruments.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/domain/naming.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/domain/recorder.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/entrypoint/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/infrastructure/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/infrastructure/active.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/infrastructure/registry.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/services/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/services/declaring.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/services/labels.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/services/measuring.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/services/outcomes.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/services/recording.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/testing.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/mixins/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/mixins/bus_observability.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/otlp.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/registry.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/tracing/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/tracing/attributes.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/tracing/propagation.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/tracing/setup.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/tracing/span_context.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/tracing/span_error.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/tracing/span_execution.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/pipelines/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/pipelines/domain/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/pipelines/domain/exceptions.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/pipelines/domain/reads.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/pipelines/domain/recipe.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/pipelines/domain/run.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/pipelines/entrypoint/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/pipelines/entrypoint/bus_pipelines.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/pipelines/entrypoint/pipeline.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/pipelines/entrypoint/reads.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/pipelines/services/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/pipelines/services/recorder.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/pipelines/services/runs.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/py.typed +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/registry.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/adapters/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/adapters/grpc.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/adapters/http.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/domain/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/domain/address.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/domain/exceptions.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/domain/failure_codec.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/domain/payload.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/domain/transport.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/entrypoint/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/entrypoint/grpc.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/entrypoint/host_process.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/entrypoint/hosted_context.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/entrypoint/hosts.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/entrypoint/http.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/infrastructure/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/infrastructure/configuration.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/services/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/services/hosted_execution.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/services/transports.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/runtime_use_cases/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/runtime_use_cases/domain.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/runtime_use_cases/exceptions.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/runtime_use_cases/in_memory.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/runtime_use_cases/loading.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/runtime_use_cases/registry.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/analysis/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/analysis/architecture.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/analysis/function_order.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/analysis/settings_scope.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/contracts/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/contracts/auth_provider.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/contracts/caching_strategies.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/contracts/computed_fields.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/contracts/extension.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/contracts/idempotency_records.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/contracts/key_value_store.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/doubles/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/doubles/auth.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/doubles/clock.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/doubles/context.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/doubles/dependencies.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/doubles/events.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/exceptions.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/adapters/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/adapters/aws.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/adapters/environment.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/adapters/yaml_file.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/domain/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/domain/config.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/domain/description.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/entrypoint/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/entrypoint/building.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/services/__init__.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/services/building.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/services/description.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/services/resolution.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/sincpro_abstractions.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/sincpro_abstractions.pyi +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/sincpro_conf.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/sincpro_logger.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/use_bus.py +0 -0
- {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/use_bus.pyi +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sincpro-framework
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.26.0
|
|
4
4
|
Summary: Sincpro framework to use DDD, Clean architecture, Hexagonal architecture
|
|
5
5
|
License: MIT
|
|
6
6
|
License-File: LICENSE.md
|
|
@@ -34,7 +34,7 @@ Requires-Dist: boto3 (>=1.35) ; extra == "aws"
|
|
|
34
34
|
Requires-Dist: dependency-injector (>=4.49.1,<5.0.0)
|
|
35
35
|
Requires-Dist: duckdb-engine (>=0.17.0,<0.18.0) ; extra == "duckdb"
|
|
36
36
|
Requires-Dist: fastapi (>=0.115) ; extra == "fastapi"
|
|
37
|
-
Requires-Dist: fastmcp (>=3.4.10,<
|
|
37
|
+
Requires-Dist: fastmcp (>=3.4.10,<5) ; extra == "mcp"
|
|
38
38
|
Requires-Dist: faststream (>=0.7,<0.8) ; extra == "faststream"
|
|
39
39
|
Requires-Dist: grpcio (>=1.60) ; extra == "grpc"
|
|
40
40
|
Requires-Dist: grpcio-health-checking (>=1.60) ; extra == "grpc"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "sincpro-framework"
|
|
3
|
-
version = "3.
|
|
3
|
+
version = "3.26.0"
|
|
4
4
|
description = "Sincpro framework to use DDD, Clean architecture, Hexagonal architecture"
|
|
5
5
|
authors = ["Gutierrez Andres <andru1236@gmail.com>"]
|
|
6
6
|
readme = "README.md"
|
|
@@ -23,7 +23,7 @@ opentelemetry-sdk = {version = ">=1.45.1", optional = true}
|
|
|
23
23
|
opentelemetry-exporter-otlp-proto-grpc = {version = ">=1.45.1", optional = true}
|
|
24
24
|
opentelemetry-exporter-otlp-proto-http = {version = ">=1.45.1", optional = true}
|
|
25
25
|
sentry-sdk = {version = ">=2.0", optional = true}
|
|
26
|
-
fastmcp = {version = ">=3.4.10,<
|
|
26
|
+
fastmcp = {version = ">=3.4.10,<5", optional = true}
|
|
27
27
|
starlette = {version = ">=1.0", optional = true}
|
|
28
28
|
fastapi = {version = ">=0.115", optional = true}
|
|
29
29
|
grpcio = {version = ">=1.60", optional = true}
|
|
@@ -13,12 +13,16 @@ around it: context, persistence, events, caching, observability and transports.
|
|
|
13
13
|
|
|
14
14
|
@cache.ttl(timedelta(minutes=5)) the service's cache, beside every bus's own
|
|
15
15
|
|
|
16
|
+
problem_of(error) a failure as every wire tells it — kind, reason,
|
|
17
|
+
status, what to do next — for a route of one's own
|
|
18
|
+
|
|
16
19
|
The top level holds what nearly every project imports; each component has its own package
|
|
17
20
|
(`sincpro_framework.context` — where `store_context_in` lives —, `.ddd`, `.pipelines`,
|
|
18
21
|
`.data_layer.store`, `.data_layer.caching`, …).
|
|
19
22
|
"""
|
|
20
23
|
|
|
21
24
|
from .bus_pipeline.interceptors import CallNext, Interceptor
|
|
25
|
+
from .common.failures import NextStep, Problem, problem_of
|
|
22
26
|
from .data_layer.caching.entrypoint.facades import cache, idempotency
|
|
23
27
|
from .exceptions import (
|
|
24
28
|
ClientError,
|
|
@@ -51,8 +55,10 @@ __all__ = [
|
|
|
51
55
|
"FailureKind",
|
|
52
56
|
"FrameworkError",
|
|
53
57
|
"Interceptor",
|
|
58
|
+
"NextStep",
|
|
54
59
|
"OutcomeUnknownError",
|
|
55
60
|
"Preview",
|
|
61
|
+
"Problem",
|
|
56
62
|
"ProgrammingError",
|
|
57
63
|
"ServiceUnavailableError",
|
|
58
64
|
"Feature",
|
|
@@ -60,6 +66,7 @@ __all__ = [
|
|
|
60
66
|
"cache",
|
|
61
67
|
"idempotency",
|
|
62
68
|
"logger",
|
|
69
|
+
"problem_of",
|
|
63
70
|
"TypeDTO",
|
|
64
71
|
"TypeDTOResponse",
|
|
65
72
|
]
|
{sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/domain/exceptions.py
RENAMED
|
@@ -10,6 +10,7 @@ each — authenticate again. `PermissionDenied`, not `PermissionError`: Python's
|
|
|
10
10
|
|
|
11
11
|
from typing import Any
|
|
12
12
|
|
|
13
|
+
from sincpro_framework.common.failures.problem import Problem
|
|
13
14
|
from sincpro_framework.exceptions import ClientError, FailureKind, ProgrammingError
|
|
14
15
|
|
|
15
16
|
|
|
@@ -39,6 +40,18 @@ class AuthError(ClientError):
|
|
|
39
40
|
"""
|
|
40
41
|
return {"kind": self.failure_kind.value, "reason": self.reason}
|
|
41
42
|
|
|
43
|
+
def refine_problem(self, problem: Problem) -> Problem:
|
|
44
|
+
"""The problem of a refusal: its reason as what the caller reads, its own HTTP status, and
|
|
45
|
+
what else the refusal says — a `step_up`, a missing `requirement` — as extensions."""
|
|
46
|
+
said = {
|
|
47
|
+
name: value
|
|
48
|
+
for name, value in self.refusal_body().items()
|
|
49
|
+
if name not in ("kind", "reason")
|
|
50
|
+
}
|
|
51
|
+
return problem.model_copy(
|
|
52
|
+
update={"detail": self.reason, "status": self.http_status, "extensions": said}
|
|
53
|
+
)
|
|
54
|
+
|
|
42
55
|
|
|
43
56
|
class Unauthenticated(AuthError):
|
|
44
57
|
"""Who is calling is not known well enough. `step_up` names what the caller has to come back
|
{sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/failures/__init__.py
RENAMED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""How every wire tells its caller what kind of failure an error is (`FailureKind`, in the core
|
|
2
|
-
`exceptions`): the classification,
|
|
2
|
+
`exceptions`): the classification, how long to wait before a retry, and the `Problem` every wire
|
|
3
|
+
draws — what happened and what to do next."""
|
|
3
4
|
|
|
4
5
|
from sincpro_framework.common.failures.classification import (
|
|
5
6
|
DEFAULT_RETRY_AFTER,
|
|
@@ -12,10 +13,28 @@ from sincpro_framework.common.failures.classification import (
|
|
|
12
13
|
retry_after,
|
|
13
14
|
said_to_the_caller,
|
|
14
15
|
)
|
|
16
|
+
from sincpro_framework.common.failures.problem import (
|
|
17
|
+
HTTP_STATUS_OF,
|
|
18
|
+
NEXT_STEP_OF,
|
|
19
|
+
TITLE_OF,
|
|
20
|
+
FieldError,
|
|
21
|
+
NextStep,
|
|
22
|
+
Problem,
|
|
23
|
+
pointer,
|
|
24
|
+
problem_of,
|
|
25
|
+
)
|
|
15
26
|
from sincpro_framework.exceptions import FailureKind
|
|
16
27
|
|
|
17
28
|
__all__ = [
|
|
18
29
|
"DEFAULT_RETRY_AFTER",
|
|
30
|
+
"FieldError",
|
|
31
|
+
"HTTP_STATUS_OF",
|
|
32
|
+
"NEXT_STEP_OF",
|
|
33
|
+
"NextStep",
|
|
34
|
+
"Problem",
|
|
35
|
+
"TITLE_OF",
|
|
36
|
+
"pointer",
|
|
37
|
+
"problem_of",
|
|
19
38
|
"PERMANENT",
|
|
20
39
|
"RETRYABLE",
|
|
21
40
|
"failure_reason",
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
"""`Problem`: one failure as every wire tells it — its kind, a stable reason, what the caller reads,
|
|
2
|
+
and **what to do next** — built once (`problem_of`) and drawn by each wire in its own encoding:
|
|
3
|
+
RFC 9457 on REST, an error's `data` on JSON-RPC, `google.rpc.Status` on gRPC, a tool error on MCP.
|
|
4
|
+
|
|
5
|
+
problem_of(InvoiceNotFound("invoice F-9 does not exist"))
|
|
6
|
+
-> Problem(kind=not_found, reason="INVOICE_NOT_FOUND", title="Not found", status=404,
|
|
7
|
+
detail="invoice F-9 does not exist", next_step=do_not_retry,
|
|
8
|
+
guidance="What the request names does not exist: …", retryable=False)
|
|
9
|
+
|
|
10
|
+
Context: the defaults are the kind's — its title, its HTTP status, its next step and guidance
|
|
11
|
+
(`NEXT_STEP_OF`). An error changes what it means without any table to edit:
|
|
12
|
+
|
|
13
|
+
class InvoiceNotFound(ClientError):
|
|
14
|
+
failure_kind = FailureKind.NOT_FOUND what kind it is
|
|
15
|
+
next_step = NextStep.FIX_REQUEST what the caller does
|
|
16
|
+
guidance = "Check the invoice number on the printed copy."
|
|
17
|
+
|
|
18
|
+
def refine_problem(self, problem: Problem) -> Problem: anything else
|
|
19
|
+
return problem.model_copy(update={"extensions": {"number": self.number}})
|
|
20
|
+
|
|
21
|
+
An error a project does not own (a library's) is translated into one of its own by an error
|
|
22
|
+
handler of the bus — the one place a project maps a failure. Nothing of a failure that is not
|
|
23
|
+
written for the caller (`said_to_the_caller`) is told: no detail, its kind as its reason.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
from collections.abc import Iterable, Mapping, Sequence
|
|
27
|
+
from datetime import timedelta
|
|
28
|
+
from enum import StrEnum
|
|
29
|
+
from typing import Any
|
|
30
|
+
|
|
31
|
+
from pydantic import ConfigDict, ValidationError
|
|
32
|
+
|
|
33
|
+
from sincpro_framework import exceptions
|
|
34
|
+
from sincpro_framework.common.failures.classification import (
|
|
35
|
+
failure_reason,
|
|
36
|
+
refined_failure_kind,
|
|
37
|
+
retry_after,
|
|
38
|
+
said_to_the_caller,
|
|
39
|
+
)
|
|
40
|
+
from sincpro_framework.sincpro_abstractions import DataTransferObject
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class NextStep(StrEnum):
|
|
44
|
+
"""What a caller — a person, a client, an agent — does after a failure."""
|
|
45
|
+
|
|
46
|
+
FIX_REQUEST = "fix_request"
|
|
47
|
+
"""Correct what was sent, then send it again."""
|
|
48
|
+
AUTHENTICATE = "authenticate"
|
|
49
|
+
"""Get a credential, or a fresh one, then send it again."""
|
|
50
|
+
ASK_FOR_ACCESS = "ask_for_access"
|
|
51
|
+
"""Do not retry: whoever calls may not do this until someone grants it."""
|
|
52
|
+
DO_NOT_RETRY = "do_not_retry"
|
|
53
|
+
"""The same request fails the same way: show the answer and stop."""
|
|
54
|
+
REFRESH_AND_RETRY = "refresh_and_retry"
|
|
55
|
+
"""Read what changed, then send the request again on what was read."""
|
|
56
|
+
RETRY_LATER = "retry_later"
|
|
57
|
+
"""Send the same request again after `retry_after`."""
|
|
58
|
+
VERIFY_THEN_RETRY = "verify_then_retry"
|
|
59
|
+
"""It may have run: check whether it did before sending it again — or send it again with the
|
|
60
|
+
same idempotency key."""
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
NEXT_STEP_OF: Mapping[exceptions.FailureKind, tuple[NextStep, str]] = {
|
|
64
|
+
exceptions.FailureKind.INVALID: (
|
|
65
|
+
NextStep.FIX_REQUEST,
|
|
66
|
+
"The request does not fit what the use case takes: correct the fields named and send "
|
|
67
|
+
"it again.",
|
|
68
|
+
),
|
|
69
|
+
exceptions.FailureKind.UNAUTHENTICATED: (
|
|
70
|
+
NextStep.AUTHENTICATE,
|
|
71
|
+
"Who is calling is not known: authenticate, or renew the credential, and send it again.",
|
|
72
|
+
),
|
|
73
|
+
exceptions.FailureKind.PERMISSION_DENIED: (
|
|
74
|
+
NextStep.ASK_FOR_ACCESS,
|
|
75
|
+
"The caller may not do this: retrying will not help until the access is granted.",
|
|
76
|
+
),
|
|
77
|
+
exceptions.FailureKind.NOT_FOUND: (
|
|
78
|
+
NextStep.DO_NOT_RETRY,
|
|
79
|
+
"What the request names does not exist: check the identifier; the same request "
|
|
80
|
+
"fails the same way.",
|
|
81
|
+
),
|
|
82
|
+
exceptions.FailureKind.CONFLICT: (
|
|
83
|
+
NextStep.REFRESH_AND_RETRY,
|
|
84
|
+
"Someone else wrote first: read the current state, then send the request again on it.",
|
|
85
|
+
),
|
|
86
|
+
exceptions.FailureKind.IN_PROGRESS: (
|
|
87
|
+
NextStep.RETRY_LATER,
|
|
88
|
+
"The same request is still running: wait `retry_after`, then ask again for its answer.",
|
|
89
|
+
),
|
|
90
|
+
exceptions.FailureKind.KEY_REUSED: (
|
|
91
|
+
NextStep.FIX_REQUEST,
|
|
92
|
+
"The idempotency key was used for another request: a new request needs a new key.",
|
|
93
|
+
),
|
|
94
|
+
exceptions.FailureKind.DOMAIN: (
|
|
95
|
+
NextStep.DO_NOT_RETRY,
|
|
96
|
+
"A business rule refused the request: show the answer; the same request is refused "
|
|
97
|
+
"the same way.",
|
|
98
|
+
),
|
|
99
|
+
exceptions.FailureKind.EXHAUSTED: (
|
|
100
|
+
NextStep.RETRY_LATER,
|
|
101
|
+
"A limit was reached: wait `retry_after`, then send the same request again.",
|
|
102
|
+
),
|
|
103
|
+
exceptions.FailureKind.UNAVAILABLE: (
|
|
104
|
+
NextStep.RETRY_LATER,
|
|
105
|
+
"Something the call needs is down for now: wait `retry_after`, then send the same "
|
|
106
|
+
"request again.",
|
|
107
|
+
),
|
|
108
|
+
exceptions.FailureKind.UNKNOWN_OUTCOME: (
|
|
109
|
+
NextStep.VERIFY_THEN_RETRY,
|
|
110
|
+
"The request was sent and no answer came back — it may have run: check before sending "
|
|
111
|
+
"it again, or send it with the same idempotency key.",
|
|
112
|
+
),
|
|
113
|
+
exceptions.FailureKind.INTERNAL: (
|
|
114
|
+
NextStep.RETRY_LATER,
|
|
115
|
+
"The service failed on its side: try again later, and report it with the trace if it "
|
|
116
|
+
"keeps failing.",
|
|
117
|
+
),
|
|
118
|
+
}
|
|
119
|
+
"""What a caller does after each kind of failure, and why — the default an error may change."""
|
|
120
|
+
|
|
121
|
+
TITLE_OF: Mapping[exceptions.FailureKind, str] = {
|
|
122
|
+
exceptions.FailureKind.INVALID: "The request does not validate",
|
|
123
|
+
exceptions.FailureKind.UNAUTHENTICATED: "Who is calling is not known",
|
|
124
|
+
exceptions.FailureKind.PERMISSION_DENIED: "Not allowed",
|
|
125
|
+
exceptions.FailureKind.NOT_FOUND: "Not found",
|
|
126
|
+
exceptions.FailureKind.CONFLICT: "The write collided",
|
|
127
|
+
exceptions.FailureKind.IN_PROGRESS: "The same request is still running",
|
|
128
|
+
exceptions.FailureKind.KEY_REUSED: "The idempotency key was used for another request",
|
|
129
|
+
exceptions.FailureKind.DOMAIN: "The domain refused the request",
|
|
130
|
+
exceptions.FailureKind.EXHAUSTED: "Too many requests",
|
|
131
|
+
exceptions.FailureKind.UNAVAILABLE: "Unavailable for now",
|
|
132
|
+
exceptions.FailureKind.UNKNOWN_OUTCOME: "It may have run — verify before retrying",
|
|
133
|
+
exceptions.FailureKind.INTERNAL: "Internal error",
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
HTTP_STATUS_OF: Mapping[exceptions.FailureKind, int] = {
|
|
137
|
+
exceptions.FailureKind.INVALID: 422,
|
|
138
|
+
exceptions.FailureKind.UNAUTHENTICATED: 401,
|
|
139
|
+
exceptions.FailureKind.PERMISSION_DENIED: 403,
|
|
140
|
+
exceptions.FailureKind.NOT_FOUND: 404,
|
|
141
|
+
exceptions.FailureKind.CONFLICT: 409,
|
|
142
|
+
exceptions.FailureKind.IN_PROGRESS: 409,
|
|
143
|
+
exceptions.FailureKind.KEY_REUSED: 422,
|
|
144
|
+
exceptions.FailureKind.DOMAIN: 422,
|
|
145
|
+
exceptions.FailureKind.EXHAUSTED: 429,
|
|
146
|
+
exceptions.FailureKind.UNAVAILABLE: 503,
|
|
147
|
+
exceptions.FailureKind.UNKNOWN_OUTCOME: 504,
|
|
148
|
+
exceptions.FailureKind.INTERNAL: 500,
|
|
149
|
+
}
|
|
150
|
+
"""The HTTP status of each kind — the one REST answers, and any route of a project's own."""
|
|
151
|
+
|
|
152
|
+
RETRYABLE_STEPS = frozenset({NextStep.RETRY_LATER, NextStep.REFRESH_AND_RETRY})
|
|
153
|
+
"""The next steps that send the request again without changing it by hand."""
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def pointer(location: Sequence[Any]) -> str:
|
|
157
|
+
"""A validation error's location as a JSON pointer into the DTO (RFC 6901) — where the value
|
|
158
|
+
came from (`body`, `query`, …) dropped, `~` and `/` escaped.
|
|
159
|
+
|
|
160
|
+
pointer(("body", "lines", 0, "amount")) -> "#/lines/0/amount"
|
|
161
|
+
"""
|
|
162
|
+
parts = list(location)
|
|
163
|
+
if parts and parts[0] in ("body", "query", "path", "header", "cookie"):
|
|
164
|
+
parts = parts[1:]
|
|
165
|
+
return "#/" + "/".join(str(one).replace("~", "~0").replace("/", "~1") for one in parts)
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
class FieldError(DataTransferObject):
|
|
169
|
+
"""One field the request got wrong — `pointer` addresses it in the DTO (`#/total`)."""
|
|
170
|
+
|
|
171
|
+
pointer: str
|
|
172
|
+
detail: str
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
class Problem(DataTransferObject):
|
|
176
|
+
"""One failure, as every wire tells it — as JSON, `retry_after` is a number of seconds, as
|
|
177
|
+
the `Retry-After` header says it."""
|
|
178
|
+
|
|
179
|
+
model_config = ConfigDict(ser_json_timedelta="float")
|
|
180
|
+
|
|
181
|
+
kind: exceptions.FailureKind
|
|
182
|
+
"""What kind of failure — the same word on every wire."""
|
|
183
|
+
reason: str
|
|
184
|
+
"""UPPER_SNAKE, stable: what a client switches on — never the text."""
|
|
185
|
+
title: str
|
|
186
|
+
status: int
|
|
187
|
+
"""Its HTTP status — what REST answers, and what a route of a project's own answers."""
|
|
188
|
+
detail: str | None = None
|
|
189
|
+
"""What the caller reads of this failure — `None` when nothing of it is the caller's."""
|
|
190
|
+
next_step: NextStep
|
|
191
|
+
guidance: str
|
|
192
|
+
"""What to do next, in words — for a person or an agent reading it."""
|
|
193
|
+
retryable: bool
|
|
194
|
+
"""Whether sending the request again, as it is or on a fresh read, may succeed."""
|
|
195
|
+
retry_after: timedelta | None = None
|
|
196
|
+
"""How long to wait first — `None` when waiting does not help."""
|
|
197
|
+
errors: list[FieldError] = []
|
|
198
|
+
"""The fields of the request that did not validate."""
|
|
199
|
+
extensions: dict[str, Any] = {}
|
|
200
|
+
"""What the error chose to disclose besides — a missing permission, a step-up, a limit."""
|
|
201
|
+
|
|
202
|
+
@classmethod
|
|
203
|
+
def for_kind(
|
|
204
|
+
cls,
|
|
205
|
+
kind: exceptions.FailureKind,
|
|
206
|
+
reason: str | None = None,
|
|
207
|
+
detail: str | None = None,
|
|
208
|
+
errors: Iterable[FieldError] = (),
|
|
209
|
+
**extensions: Any,
|
|
210
|
+
) -> "Problem":
|
|
211
|
+
"""A problem of `kind` with its defaults — title, status, next step, guidance — and what
|
|
212
|
+
is given; what an entrypoint answers for a failure no error raised (a body that does not
|
|
213
|
+
parse, a route that does not exist).
|
|
214
|
+
|
|
215
|
+
Problem.for_kind(FailureKind.INVALID, "UNREADABLE", "the body is not JSON")
|
|
216
|
+
"""
|
|
217
|
+
step, guidance = NEXT_STEP_OF[kind]
|
|
218
|
+
return cls(
|
|
219
|
+
kind=kind,
|
|
220
|
+
reason=reason or kind.value.upper(),
|
|
221
|
+
title=TITLE_OF[kind],
|
|
222
|
+
status=HTTP_STATUS_OF[kind],
|
|
223
|
+
detail=detail,
|
|
224
|
+
next_step=step,
|
|
225
|
+
guidance=guidance,
|
|
226
|
+
retryable=step in RETRYABLE_STEPS,
|
|
227
|
+
errors=list(errors),
|
|
228
|
+
extensions=extensions,
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
def body(self) -> dict[str, Any]:
|
|
232
|
+
"""The problem as JSON, as RFC 9457 lays it out: its members and, beside them, what its
|
|
233
|
+
error disclosed (`extensions`) — a member with nothing to say left out.
|
|
234
|
+
|
|
235
|
+
Problem.for_kind(FailureKind.INVALID, "UNREADABLE", "not JSON").body()
|
|
236
|
+
-> {"kind": "invalid", "reason": "UNREADABLE", "title": "…", "status": 422,
|
|
237
|
+
"detail": "not JSON", "next_step": "fix_request", "guidance": "…",
|
|
238
|
+
"retryable": False}
|
|
239
|
+
"""
|
|
240
|
+
told = {**self.model_dump(mode="json", exclude={"extensions"}), **self.extensions}
|
|
241
|
+
return {
|
|
242
|
+
name: value for name, value in told.items() if value not in (None, [], {}, "")
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def problem_of(error: Exception) -> Problem:
|
|
247
|
+
"""The problem every wire answers `error` with.
|
|
248
|
+
|
|
249
|
+
problem_of(InvoiceNotFound("invoice F-9 does not exist"))
|
|
250
|
+
-> Problem(kind=not_found, reason="INVOICE_NOT_FOUND", status=404,
|
|
251
|
+
detail="invoice F-9 does not exist", next_step=do_not_retry, …)
|
|
252
|
+
problem_of(RuntimeError("postgres://admin:pw@db"))
|
|
253
|
+
-> Problem(kind=internal, reason="INTERNAL", status=500, detail=None, …)
|
|
254
|
+
|
|
255
|
+
1. The kind (`refined_failure_kind`) gives the defaults (`Problem.for_kind`); the reason is
|
|
256
|
+
the error's class when the caller may read the error, its kind otherwise.
|
|
257
|
+
2. What the caller reads is the error's message only when it was written for the caller.
|
|
258
|
+
3. A request that did not validate names each field; a retryable kind says how long to wait.
|
|
259
|
+
4. The error's `next_step` and `guidance`, when it declares them, take the kind's place.
|
|
260
|
+
Final: the error's `refine_problem(problem)`, when it has one, changes anything else — what
|
|
261
|
+
it answers is the problem when it is one.
|
|
262
|
+
"""
|
|
263
|
+
kind = refined_failure_kind(error)
|
|
264
|
+
errors = (
|
|
265
|
+
[
|
|
266
|
+
FieldError(pointer=pointer(one.get("loc", ())), detail=str(one.get("msg", "")))
|
|
267
|
+
for one in error.errors(include_url=False)
|
|
268
|
+
]
|
|
269
|
+
if isinstance(error, ValidationError)
|
|
270
|
+
else []
|
|
271
|
+
)
|
|
272
|
+
problem = Problem.for_kind(
|
|
273
|
+
kind, failure_reason(error, kind), said_to_the_caller(error), errors
|
|
274
|
+
)
|
|
275
|
+
step = getattr(error, "next_step", None)
|
|
276
|
+
step = step if isinstance(step, NextStep) else problem.next_step
|
|
277
|
+
guidance = getattr(error, "guidance", None)
|
|
278
|
+
problem = problem.model_copy(
|
|
279
|
+
update={
|
|
280
|
+
"retry_after": retry_after(error, kind),
|
|
281
|
+
"next_step": step,
|
|
282
|
+
"retryable": step in RETRYABLE_STEPS,
|
|
283
|
+
"guidance": guidance if isinstance(guidance, str) else problem.guidance,
|
|
284
|
+
}
|
|
285
|
+
)
|
|
286
|
+
refine = getattr(error, "refine_problem", None)
|
|
287
|
+
refined = refine(problem) if callable(refine) else problem
|
|
288
|
+
return refined if isinstance(refined, Problem) else problem
|
{sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/domain/keys.py
RENAMED
|
@@ -30,6 +30,9 @@ class ContextKey(StrEnum):
|
|
|
30
30
|
EXECUTION_ID = "execution_id"
|
|
31
31
|
CAUSATION_ID = "causation_id"
|
|
32
32
|
CORRELATION_ID = "correlation_id"
|
|
33
|
+
LANG = "lang"
|
|
34
|
+
"""The language of the call, a BCP 47 tag (`es-BO`) — what a `MultiLanguage` and a message
|
|
35
|
+
are read in."""
|
|
33
36
|
PIPELINE_CONTEXT = "SINCPRO_PIPELINE_CONTEXT"
|
|
34
37
|
"""The run a pipeline's steps belong to — `{"pipeline": …, "run_id": …}` on the node of its
|
|
35
38
|
execution, so a run at the same time is another branch; in the store, the namespace of every
|
|
@@ -7,11 +7,15 @@ entrypoint's, and `ObjectStorage` is injected as any adapter.
|
|
|
7
7
|
billing.add_dependency("storage", ObjectStorage(S3CompatibleObjectStore("documents", boto3_client), secret))
|
|
8
8
|
|
|
9
9
|
self.storage.put("exports/invoices.csv", data, "text/csv")
|
|
10
|
+
self.storage.get("exports/invoices.csv") whole, to process it
|
|
11
|
+
self.storage.stream("exports/invoices.csv") by parts, to pass it on
|
|
12
|
+
self.storage.fetch(url, "inbox/scan.pdf", max_bytes=50 * MB) a URL's bytes into the store
|
|
10
13
|
published = self.storage.publish("exports/invoices.csv", Access.READ, timedelta(hours=1), max_uses=1)
|
|
11
14
|
self.storage.redeem(published.id, Access.READ) the entrypoint, when the id comes back
|
|
12
15
|
|
|
13
|
-
domain/ ObjectStore (the port), ObjectRef, StoredObject, Access, Publication, Grant, Refusal;
|
|
14
|
-
ObjectNotFound, ObjectAlreadyExists, PublicationRefused
|
|
16
|
+
domain/ ObjectStore (the port), ObjectRef, StoredObject, ObjectStream, Access, Publication, Grant, Refusal;
|
|
17
|
+
ObjectNotFound, ObjectAlreadyExists, PublicationRefused, FetchRefused, FetchFailed,
|
|
18
|
+
FetchRefusal
|
|
15
19
|
adapters/ InMemoryObjectStore, LocalObjectStore, S3CompatibleObjectStore
|
|
16
20
|
entrypoint/ ObjectStorage, the facade a project injects
|
|
17
21
|
"""
|
|
@@ -22,14 +26,18 @@ from sincpro_framework.data_layer.object_storage.adapters.s3_compatible import (
|
|
|
22
26
|
S3CompatibleObjectStore,
|
|
23
27
|
)
|
|
24
28
|
from sincpro_framework.data_layer.object_storage.domain.exceptions import (
|
|
29
|
+
FetchFailed,
|
|
30
|
+
FetchRefused,
|
|
25
31
|
ObjectAlreadyExists,
|
|
26
32
|
ObjectNotFound,
|
|
27
33
|
PublicationRefused,
|
|
28
34
|
)
|
|
35
|
+
from sincpro_framework.data_layer.object_storage.domain.fetch import FetchRefusal
|
|
29
36
|
from sincpro_framework.data_layer.object_storage.domain.object_store import (
|
|
30
37
|
Access,
|
|
31
38
|
ObjectRef,
|
|
32
39
|
ObjectStore,
|
|
40
|
+
ObjectStream,
|
|
33
41
|
StoredObject,
|
|
34
42
|
)
|
|
35
43
|
from sincpro_framework.data_layer.object_storage.domain.publication import (
|
|
@@ -43,6 +51,9 @@ from sincpro_framework.data_layer.object_storage.entrypoint.object_storage impor
|
|
|
43
51
|
|
|
44
52
|
__all__ = [
|
|
45
53
|
"Access",
|
|
54
|
+
"FetchFailed",
|
|
55
|
+
"FetchRefusal",
|
|
56
|
+
"FetchRefused",
|
|
46
57
|
"Grant",
|
|
47
58
|
"InMemoryObjectStore",
|
|
48
59
|
"LocalObjectStore",
|
|
@@ -51,6 +62,7 @@ __all__ = [
|
|
|
51
62
|
"ObjectRef",
|
|
52
63
|
"ObjectStorage",
|
|
53
64
|
"ObjectStore",
|
|
65
|
+
"ObjectStream",
|
|
54
66
|
"Publication",
|
|
55
67
|
"PublicationRefused",
|
|
56
68
|
"Refusal",
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"""`HttpSource`: the bytes of a URL as its server sends them, read by a store — the standard library's
|
|
2
|
+
`urllib`, a redirect followed only when told and each hop judged, the bytes counted against a size
|
|
3
|
+
and a time as they come.
|
|
4
|
+
|
|
5
|
+
body = HttpSource().open("https://cdn.acme.bo/scan.pdf", timedelta(seconds=30), {}, False,
|
|
6
|
+
judged, max_bytes=50 * MB)
|
|
7
|
+
body.content_type -> "application/pdf"
|
|
8
|
+
store.put(key, io.BufferedReader(body), …) read to its end, or refused on the way
|
|
9
|
+
|
|
10
|
+
Context: what `urllib` raises is said in object storage's words — a redirect not followed or a
|
|
11
|
+
client error (4xx) is `FetchRefused`, a server error (5xx), a host that cannot be reached or a time
|
|
12
|
+
run out is `FetchFailed` — so the service judges a fetch without knowing HTTP. A refusal raised
|
|
13
|
+
while a store reads is also kept on the body (`refusal`): a store that wraps what its reader raised
|
|
14
|
+
(a bucket's `ExternalServiceError`) is seen through.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
import io
|
|
18
|
+
import time
|
|
19
|
+
import urllib.error
|
|
20
|
+
import urllib.request
|
|
21
|
+
from collections.abc import Callable, Mapping
|
|
22
|
+
from datetime import timedelta
|
|
23
|
+
from typing import Any
|
|
24
|
+
|
|
25
|
+
from sincpro_framework.data_layer.object_storage.domain.exceptions import (
|
|
26
|
+
FetchFailed,
|
|
27
|
+
FetchRefused,
|
|
28
|
+
)
|
|
29
|
+
from sincpro_framework.data_layer.object_storage.domain.fetch import FetchRefusal
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class Redirects(urllib.request.HTTPRedirectHandler):
|
|
33
|
+
"""A redirect followed only when told, each new URL judged first."""
|
|
34
|
+
|
|
35
|
+
def __init__(self, follow: bool, judged: Callable[[str], None]) -> None:
|
|
36
|
+
"""`follow` the redirects or not; `judged` raises for a URL the fetch does not take."""
|
|
37
|
+
super().__init__()
|
|
38
|
+
self.follow = follow
|
|
39
|
+
self.judged = judged
|
|
40
|
+
|
|
41
|
+
def redirect_request(
|
|
42
|
+
self,
|
|
43
|
+
req: urllib.request.Request,
|
|
44
|
+
fp: Any,
|
|
45
|
+
code: int,
|
|
46
|
+
msg: str,
|
|
47
|
+
headers: Any,
|
|
48
|
+
newurl: str,
|
|
49
|
+
) -> urllib.request.Request | None:
|
|
50
|
+
"""The request to the new URL once it is judged — none when redirects are not followed,
|
|
51
|
+
which `urllib` answers as the redirect's own `HTTPError`."""
|
|
52
|
+
if not self.follow:
|
|
53
|
+
return None
|
|
54
|
+
self.judged(newurl)
|
|
55
|
+
return super().redirect_request(req, fp, code, msg, headers, newurl)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class HttpBody(io.RawIOBase):
|
|
59
|
+
"""A URL's bytes as they come, refused past `max_bytes` or once its time ran out."""
|
|
60
|
+
|
|
61
|
+
def __init__(
|
|
62
|
+
self, response: Any, url: str, max_bytes: int | None, deadline: float
|
|
63
|
+
) -> None:
|
|
64
|
+
"""`response` the server's, of `url`; `deadline` on `time.monotonic()`."""
|
|
65
|
+
super().__init__()
|
|
66
|
+
self.response = response
|
|
67
|
+
self.url = url
|
|
68
|
+
self.max_bytes = max_bytes
|
|
69
|
+
self.deadline = deadline
|
|
70
|
+
self.received = 0
|
|
71
|
+
self.refusal: FetchRefused | FetchFailed | None = None
|
|
72
|
+
self.content_type: str | None = response.headers.get("Content-Type")
|
|
73
|
+
|
|
74
|
+
def readable(self) -> bool:
|
|
75
|
+
return True
|
|
76
|
+
|
|
77
|
+
def readinto(self, buffer: Any) -> int:
|
|
78
|
+
"""The next bytes into `buffer` — `0` at the end.
|
|
79
|
+
|
|
80
|
+
1. Past its deadline: `FetchFailed`.
|
|
81
|
+
2. What has arrived, up to the buffer's size — never waiting for it to fill, so the
|
|
82
|
+
deadline is judged between every part a slow server sends; a connection that fails
|
|
83
|
+
or times out while reading: `FetchFailed`.
|
|
84
|
+
3. Past `max_bytes`: `FetchRefused` (`TOO_LARGE`).
|
|
85
|
+
Final: what was read; a refusal is kept in `refusal` before it is raised.
|
|
86
|
+
"""
|
|
87
|
+
if time.monotonic() > self.deadline:
|
|
88
|
+
self.refusal = FetchFailed(self.url, f"{self.url} did not send its bytes in time")
|
|
89
|
+
raise self.refusal
|
|
90
|
+
view = memoryview(buffer).cast("B")
|
|
91
|
+
try:
|
|
92
|
+
part = self.response.read1(len(view))
|
|
93
|
+
except OSError as error:
|
|
94
|
+
self.refusal = FetchFailed(self.url, f"{self.url} could not be read: {error}")
|
|
95
|
+
raise self.refusal from error
|
|
96
|
+
read = len(part)
|
|
97
|
+
view[:read] = part
|
|
98
|
+
self.received += read
|
|
99
|
+
if self.max_bytes is not None and self.received > self.max_bytes:
|
|
100
|
+
self.refusal = FetchRefused(
|
|
101
|
+
FetchRefusal.TOO_LARGE,
|
|
102
|
+
self.url,
|
|
103
|
+
f"{self.url} sends more than {self.max_bytes} bytes",
|
|
104
|
+
)
|
|
105
|
+
raise self.refusal
|
|
106
|
+
return read
|
|
107
|
+
|
|
108
|
+
def close(self) -> None:
|
|
109
|
+
"""Close the server's response with it."""
|
|
110
|
+
if not self.closed:
|
|
111
|
+
self.response.close()
|
|
112
|
+
super().close()
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class HttpSource:
|
|
116
|
+
"""URLs opened with the standard library."""
|
|
117
|
+
|
|
118
|
+
def open(
|
|
119
|
+
self,
|
|
120
|
+
url: str,
|
|
121
|
+
timeout: timedelta,
|
|
122
|
+
headers: Mapping[str, str],
|
|
123
|
+
follow_redirects: bool,
|
|
124
|
+
judged: Callable[[str], None],
|
|
125
|
+
max_bytes: int | None = None,
|
|
126
|
+
) -> HttpBody:
|
|
127
|
+
"""The body of `url`, asked with `headers`, for a store to read — within `timeout` in
|
|
128
|
+
all, each read of the connection too.
|
|
129
|
+
|
|
130
|
+
1. Opened with `follow_redirects`, each redirect's URL `judged` first.
|
|
131
|
+
2. A redirect not followed or a client error (4xx): `FetchRefused`; a server error
|
|
132
|
+
(5xx), a host not reached, a time run out: `FetchFailed`.
|
|
133
|
+
3. A `Content-Length` past `max_bytes`: `FetchRefused` before a byte is read.
|
|
134
|
+
Final: the body, counted against `max_bytes` and the time left as it is read.
|
|
135
|
+
"""
|
|
136
|
+
deadline = time.monotonic() + timeout.total_seconds()
|
|
137
|
+
opener = urllib.request.build_opener(Redirects(follow_redirects, judged))
|
|
138
|
+
try:
|
|
139
|
+
response = opener.open(
|
|
140
|
+
urllib.request.Request(url, headers=dict(headers)),
|
|
141
|
+
timeout=timeout.total_seconds(),
|
|
142
|
+
)
|
|
143
|
+
except urllib.error.HTTPError as error:
|
|
144
|
+
error.close()
|
|
145
|
+
if 300 <= error.code < 400:
|
|
146
|
+
raise FetchRefused(
|
|
147
|
+
FetchRefusal.REDIRECTED,
|
|
148
|
+
url,
|
|
149
|
+
f"{url} answered a redirect ({error.code}) to {error.headers.get('Location')}",
|
|
150
|
+
error.code,
|
|
151
|
+
) from error
|
|
152
|
+
if error.code < 500:
|
|
153
|
+
raise FetchRefused(
|
|
154
|
+
FetchRefusal.ANSWERED, url, f"{url} answered {error.code}", error.code
|
|
155
|
+
) from error
|
|
156
|
+
raise FetchFailed(url, f"{url} answered {error.code}", error.code) from error
|
|
157
|
+
except (urllib.error.URLError, OSError) as error:
|
|
158
|
+
raise FetchFailed(url, f"{url} could not be reached: {error}") from error
|
|
159
|
+
declared = response.headers.get("Content-Length")
|
|
160
|
+
if (
|
|
161
|
+
max_bytes is not None
|
|
162
|
+
and declared
|
|
163
|
+
and declared.isdigit()
|
|
164
|
+
and int(declared) > max_bytes
|
|
165
|
+
):
|
|
166
|
+
response.close()
|
|
167
|
+
raise FetchRefused(
|
|
168
|
+
FetchRefusal.TOO_LARGE,
|
|
169
|
+
url,
|
|
170
|
+
f"{url} sends {declared} bytes, more than {max_bytes}",
|
|
171
|
+
)
|
|
172
|
+
return HttpBody(response, url, max_bytes, deadline)
|