hexcore 10.2.0__tar.gz → 10.3.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.
- {hexcore-10.2.0/hexcore.egg-info → hexcore-10.3.0}/PKG-INFO +5 -1
- hexcore-10.3.0/hexcore/darwin/plugins/drbac/__init__.py +293 -0
- hexcore-10.3.0/hexcore/darwin/plugins/drbac/cache.py +68 -0
- hexcore-10.3.0/hexcore/darwin/plugins/drbac/conditions.py +850 -0
- hexcore-10.3.0/hexcore/darwin/plugins/drbac/domain.py +307 -0
- hexcore-10.3.0/hexcore/darwin/plugins/drbac/orms/__init__.py +7 -0
- hexcore-10.3.0/hexcore/darwin/plugins/drbac/orms/beanie/__init__.py +5 -0
- hexcore-10.3.0/hexcore/darwin/plugins/drbac/orms/beanie/repository.py +351 -0
- hexcore-10.3.0/hexcore/darwin/plugins/drbac/orms/sqlalchemy/__init__.py +6 -0
- hexcore-10.3.0/hexcore/darwin/plugins/drbac/orms/sqlalchemy/models.py +81 -0
- hexcore-10.3.0/hexcore/darwin/plugins/drbac/orms/sqlalchemy/models_mixins.py +175 -0
- hexcore-10.3.0/hexcore/darwin/plugins/drbac/orms/sqlalchemy/repository.py +378 -0
- hexcore-10.3.0/hexcore/darwin/plugins/drbac/pdp.py +398 -0
- hexcore-10.3.0/hexcore/darwin/plugins/drbac/pip.py +109 -0
- hexcore-10.3.0/hexcore/darwin/plugins/drbac/predicates.py +136 -0
- hexcore-10.3.0/hexcore/darwin/plugins/drbac/provider.py +34 -0
- hexcore-10.3.0/hexcore/darwin/plugins/drbac/router.py +444 -0
- hexcore-10.3.0/hexcore/darwin/plugins/drbac/service.py +266 -0
- hexcore-10.3.0/hexcore/darwin/plugins/rbac/__init__.py +378 -0
- hexcore-10.3.0/hexcore/darwin/plugins/rbac/cache.py +145 -0
- hexcore-10.3.0/hexcore/darwin/plugins/rbac/cli.py +153 -0
- hexcore-10.3.0/hexcore/darwin/plugins/rbac/domain.py +346 -0
- hexcore-10.3.0/hexcore/darwin/plugins/rbac/matcher.py +95 -0
- hexcore-10.3.0/hexcore/darwin/plugins/rbac/orms/__init__.py +13 -0
- hexcore-10.3.0/hexcore/darwin/plugins/rbac/orms/beanie/__init__.py +6 -0
- hexcore-10.3.0/hexcore/darwin/plugins/rbac/orms/beanie/repository.py +413 -0
- hexcore-10.3.0/hexcore/darwin/plugins/rbac/orms/sqlalchemy/__init__.py +7 -0
- hexcore-10.3.0/hexcore/darwin/plugins/rbac/orms/sqlalchemy/models.py +114 -0
- hexcore-10.3.0/hexcore/darwin/plugins/rbac/orms/sqlalchemy/models_mixins.py +261 -0
- hexcore-10.3.0/hexcore/darwin/plugins/rbac/orms/sqlalchemy/repository.py +482 -0
- hexcore-10.3.0/hexcore/darwin/plugins/rbac/provider.py +146 -0
- hexcore-10.3.0/hexcore/darwin/plugins/rbac/resolver.py +86 -0
- hexcore-10.3.0/hexcore/darwin/plugins/rbac/router.py +293 -0
- hexcore-10.3.0/hexcore/darwin/plugins/rbac/service.py +460 -0
- {hexcore-10.2.0 → hexcore-10.3.0/hexcore.egg-info}/PKG-INFO +5 -1
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore.egg-info/SOURCES.txt +39 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore.egg-info/requires.txt +6 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/pyproject.toml +12 -1
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_backend_neutrality.py +18 -4
- hexcore-10.3.0/tests/test_darwin_drbac_conditions.py +412 -0
- hexcore-10.3.0/tests/test_darwin_drbac_pdp.py +449 -0
- hexcore-10.3.0/tests/test_darwin_drbac_router.py +370 -0
- hexcore-10.3.0/tests/test_darwin_drbac_service.py +470 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_plugin_decoupling.py +2 -0
- hexcore-10.3.0/tests/test_darwin_rbac.py +438 -0
- hexcore-10.3.0/tests/test_darwin_rbac_service.py +518 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_schema_registration.py +13 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_optional_dependencies.py +69 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/LICENSE +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/MANIFEST.in +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/README.md +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/__main__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/_deprecation.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/application/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/application/cqrs/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/application/cqrs/adapters.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/application/cqrs/config.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/application/cqrs/factory.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/application/cqrs/in_memory_buses.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/application/cqrs/pipeline.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/application/cqrs/registry.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/application/cqrs/scheduler.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/application/dtos/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/application/dtos/base.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/application/dtos/cursor.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/application/dtos/errors.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/application/dtos/query.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/application/eventsourcing/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/application/eventsourcing/config.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/application/eventsourcing/factory.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/application/eventsourcing/projector.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/application/eventsourcing/relay.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/application/eventsourcing/repository.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/application/use_cases/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/application/use_cases/base.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/application/use_cases/query.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/capabilities.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/config.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/cqrs.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/cqrs.pyi +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/__init__.pyi +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/application/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/application/authorization.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/application/authz_middleware.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/application/commands.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/application/config.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/application/container.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/application/hooks.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/application/plugins.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/application/services.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/domain/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/domain/authorization.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/domain/context.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/domain/entities.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/domain/events.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/domain/exceptions.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/domain/permissions.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/domain/plugins.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/domain/ports.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/domain/value_objects.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/api/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/api/authorization.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/api/dependencies.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/api/middlewares.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/api/routers.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/cli.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/clock.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/envelope.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/hashing.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/keys.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/lifespan.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/orms/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/orms/beanie/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/orms/beanie/documents.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/orms/beanie/repositories.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/orms/beanie/schema.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/orms/selection.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/orms/sqlalchemy/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/orms/sqlalchemy/models.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/orms/sqlalchemy/models_mixins.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/orms/sqlalchemy/registry.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/orms/sqlalchemy/repositories.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/orms/sqlalchemy/schema.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/revocation.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/secretbox.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/tokens.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/infrastructure/transports.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/impersonate/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/impersonate/commands.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/impersonate/domain.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/impersonate/router.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/impersonate/service.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/magic_link/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/magic_link/commands.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/magic_link/router.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/oauth/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/oauth/domain.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/oauth/http.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/oauth/orms/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/oauth/orms/beanie/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/oauth/orms/beanie/repository.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/oauth/orms/sqlalchemy/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/oauth/orms/sqlalchemy/models.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/oauth/orms/sqlalchemy/models_mixins.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/oauth/orms/sqlalchemy/repository.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/oauth/providers.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/oauth/router.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/oauth/service.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/organization/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/organization/domain.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/organization/orms/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/organization/orms/beanie/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/organization/orms/beanie/repository.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/organization/orms/sqlalchemy/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/organization/orms/sqlalchemy/models.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/organization/orms/sqlalchemy/models_mixins.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/organization/orms/sqlalchemy/repository.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/organization/router.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/organization/service.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/passkey/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/passkey/domain.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/passkey/orms/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/passkey/orms/beanie/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/passkey/orms/beanie/repository.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/passkey/orms/sqlalchemy/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/passkey/orms/sqlalchemy/models.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/passkey/orms/sqlalchemy/models_mixins.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/passkey/orms/sqlalchemy/repository.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/passkey/router.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/passkey/service.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/passkey/webauthn_adapter.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/storage.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/two_factor/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/two_factor/commands.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/two_factor/crypto.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/two_factor/domain.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/two_factor/orms/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/two_factor/orms/beanie/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/two_factor/orms/beanie/repository.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/two_factor/orms/sqlalchemy/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/two_factor/orms/sqlalchemy/models.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/two_factor/orms/sqlalchemy/models_mixins.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/two_factor/orms/sqlalchemy/repository.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/two_factor/router.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/two_factor/service.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/plugins/two_factor/totp.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/testing/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/testing/fakes.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/testing/fixtures.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/darwin/testing/helpers.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/auth/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/auth/permissions.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/auth/value_objects.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/base.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/cqrs/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/cqrs/buses.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/cqrs/commands.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/cqrs/context.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/cqrs/cron.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/cqrs/decorators.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/cqrs/dispatch.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/cqrs/envelope.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/cqrs/exceptions.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/cqrs/handlers.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/cqrs/middleware.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/cqrs/queries.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/cqrs/resolution.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/cqrs/serializer.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/cqrs/task_queues.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/events.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/eventsourcing/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/eventsourcing/aggregate.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/eventsourcing/exceptions.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/eventsourcing/projections.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/eventsourcing/snapshots.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/eventsourcing/store.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/eventsourcing/stored.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/exceptions.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/repositories.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/services.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/domain/uow.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/eventsourcing.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/eventsourcing.pyi +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/fastapi.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/fastapi.pyi +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/api/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/api/app.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/api/cqrs.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/api/eventsourcing.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/api/exception_handlers.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/api/health.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/api/lifespan.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/api/middlewares.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/api/rate_limit.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/api/routing.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/api/streaming.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/api/utils.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/cache/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/cache/cache_backends/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/cache/cache_backends/memory.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/cache/cache_backends/redis.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/cli.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/cqrs/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/cqrs/cron_sql.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/cqrs/middlewares.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/cqrs/postgres_bus.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/cqrs/postgres_lock.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/cqrs/procrastinate.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/cqrs/pydantic_serializer.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/cqrs/rabbitmq.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/cqrs/redis_bus.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/cqrs/redis_lock.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/events/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/events/events_backends/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/events/events_backends/memory.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/eventsourcing/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/eventsourcing/beanie_documents.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/eventsourcing/beanie_store.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/eventsourcing/memory.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/eventsourcing/redis_store.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/eventsourcing/sqlalchemy_models.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/eventsourcing/sqlalchemy_models_mixins.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/eventsourcing/sqlalchemy_store.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/repositories/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/repositories/_beanie_impl.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/repositories/_sqlalchemy_impl.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/repositories/base.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/repositories/decorators.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/repositories/implementations.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/repositories/orms/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/repositories/orms/beanie/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/repositories/orms/beanie/utils.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/repositories/orms/sqlalchemy/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/repositories/orms/sqlalchemy/session.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/repositories/orms/sqlalchemy/utils.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/repositories/utils.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/task_queues/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/task_queues/celery_adapter.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/task_queues/procrastinate_adapter.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/uow/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/uow/decorators.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/uow/helpers.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/uow/scopes.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/workers/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/workers/consumer.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/workers/rabbitmq_worker.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/infrastructure/workers/runner.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/py.typed +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/sql.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/sql.pyi +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/testing/__init__.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/testing/fakes.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/testing/fixtures.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/testing/helpers.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/testing/repositories.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore/types.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore.egg-info/dependency_links.txt +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore.egg-info/entry_points.txt +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/hexcore.egg-info/top_level.txt +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/setup.cfg +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_alembic_metadata_completeness.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_anclas_del_repo.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_api_app_and_lifespan.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_api_cqrs_providers.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_api_exception_handlers.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_api_health.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_api_middlewares_and_routing.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_api_rate_limit.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_api_streaming.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_basic.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_beanie_query_utils.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_celery_event_loop.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_config_cors_security.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_config_loading.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_consumer_optional_event_bus.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_cqrs.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_cqrs_envelope.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_cqrs_factory.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_cqrs_middlewares.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_cron_sql.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_authorization_engine.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_authorization_http.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_beanie.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_cli.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_container.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_context.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_custom_plugin.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_envelope.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_facade_and_events.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_flows.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_hashing.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_http.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_impersonate.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_magic_link.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_models.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_oauth.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_openapi.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_organization.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_passkey.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_permissions.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_plugins.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_principals.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_production_defaults.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_repositories.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_revocation.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_storage_selection.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_tokens.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_two_factor.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_username.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_darwin_value_objects.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_deprecations.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_documentation_examples.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_domain_base_contract.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_domain_service_query.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_dotted_resolution.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_event_dispatch_mro.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_eventsourcing_aggregate.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_eventsourcing_beanie.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_eventsourcing_config.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_eventsourcing_ports.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_eventsourcing_projections.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_eventsourcing_redis.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_eventsourcing_relay.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_eventsourcing_repository.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_eventsourcing_snapshot_checkpoint.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_eventsourcing_sql_schema.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_eventsourcing_store_contract.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_eventsourcing_uow_integration.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_facades.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_handler_registry.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_infrastructure_query_path.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_lock_error_policy.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_packaging.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_postgres_bus.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_postgres_lock.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_query_cursor_and_endpoint.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_query_field_validation.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_rabbitmq_bus.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_redis_bus.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_redis_lock.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_repositories_utils.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_scheduler.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_scheduler_catchup.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_smart_routing.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_sql_naming_convention.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_sql_session_layer.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_task_queues_adapters.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_testing_kit.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_testing_utilities.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_typing_gate.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_uow_session_regression.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_use_cases_query.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_worker_bus_integration.py +0 -0
- {hexcore-10.2.0 → hexcore-10.3.0}/tests/test_worker_runner.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: hexcore
|
|
3
|
-
Version: 10.
|
|
3
|
+
Version: 10.3.0
|
|
4
4
|
Summary: Reusable core for Python projects with hexagonal architecture, DDD, CQRS and background tasks. Ships the abstractions and the infrastructure: SQL session layer, FastAPI factories, worker runner, dynamic cron and identity.
|
|
5
5
|
Author-email: "David Latosefki (Indroic)" <indroic@outlook.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -71,6 +71,10 @@ Requires-Dist: hexcore[darwin]; extra == "darwin-passkey"
|
|
|
71
71
|
Requires-Dist: webauthn>=2.0.0; extra == "darwin-passkey"
|
|
72
72
|
Provides-Extra: darwin-organization
|
|
73
73
|
Requires-Dist: hexcore[darwin]; extra == "darwin-organization"
|
|
74
|
+
Provides-Extra: darwin-rbac
|
|
75
|
+
Requires-Dist: hexcore[darwin]; extra == "darwin-rbac"
|
|
76
|
+
Provides-Extra: darwin-drbac
|
|
77
|
+
Requires-Dist: hexcore[darwin]; extra == "darwin-drbac"
|
|
74
78
|
Provides-Extra: all
|
|
75
79
|
Requires-Dist: fastapi>=0.116.1; extra == "all"
|
|
76
80
|
Requires-Dist: redis>=6.4.0; extra == "all"
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
"""
|
|
2
|
+
`drbac`: autorización contextual sobre `rbac`.
|
|
3
|
+
|
|
4
|
+
Fase F5 del plan de rbac/drbac: acá aparece `DrbacPlugin`, que junta el lenguaje de condiciones
|
|
5
|
+
y el registro de predicados de la Fase F4 con persistencia, el PDP (`pdp.py`), el PIP
|
|
6
|
+
(`pip.py`) y un `AuthorizationProvider` que se enchufa al mismo `AuthorizationEngine` que
|
|
7
|
+
`rbac`.
|
|
8
|
+
|
|
9
|
+
**`requires = ("rbac",)`**: DRBAC extiende RBAC, no lo reemplaza — los roles siguen siendo la
|
|
10
|
+
base, y DRBAC agrega condiciones, scope jerárquico y bindings de rol contextuales con
|
|
11
|
+
vencimiento. Eso sí, **ningún módulo de este plugin importa nada de `rbac`** (ver el docstring
|
|
12
|
+
de `domain.RoleBinding`): `requires` sólo ordena el registro, la integración real —expandir un
|
|
13
|
+
`role_name` contextual a sus permisos— la cablea el consumidor con `role_permissions`.
|
|
14
|
+
|
|
15
|
+
Requiere `[darwin]`, `[api]` y, según el backend, `[darwin-sqlalchemy]` o `[darwin-beanie]`.
|
|
16
|
+
|
|
17
|
+
Uso::
|
|
18
|
+
|
|
19
|
+
from hexcore.darwin import PluginRegistry, configure_identity
|
|
20
|
+
from hexcore.darwin.plugins.rbac import RbacPlugin
|
|
21
|
+
from hexcore.darwin.plugins.drbac import DrbacPlugin
|
|
22
|
+
|
|
23
|
+
rbac = RbacPlugin()
|
|
24
|
+
drbac = DrbacPlugin(role_permissions=rbac.service().permission_keys_for_role_name)
|
|
25
|
+
configure_identity(
|
|
26
|
+
IdentityConfig(),
|
|
27
|
+
plugins=PluginRegistry([rbac, drbac]),
|
|
28
|
+
principals=rbac.principal_resolver(),
|
|
29
|
+
)
|
|
30
|
+
"""
|
|
31
|
+
from __future__ import annotations
|
|
32
|
+
|
|
33
|
+
import threading
|
|
34
|
+
import typing as t
|
|
35
|
+
from dataclasses import dataclass
|
|
36
|
+
|
|
37
|
+
from hexcore.darwin.domain.plugins import DarwinPlugin
|
|
38
|
+
from hexcore.darwin.plugins.drbac.domain import (
|
|
39
|
+
DRBAC_EXCEPTION_STATUS_MAP,
|
|
40
|
+
GLOBAL_SCOPE,
|
|
41
|
+
AbstractDrbacAuthzVersionRepository,
|
|
42
|
+
AbstractDrbacPolicyRepository,
|
|
43
|
+
AbstractDrbacRoleBindingRepository,
|
|
44
|
+
DrbacAuthorizationChangedEvent,
|
|
45
|
+
DrbacError,
|
|
46
|
+
Policy,
|
|
47
|
+
PolicyAlreadyExistsError,
|
|
48
|
+
PolicyNotFoundError,
|
|
49
|
+
RoleBinding,
|
|
50
|
+
RoleBindingNotFoundError,
|
|
51
|
+
Rule,
|
|
52
|
+
scope_chain,
|
|
53
|
+
)
|
|
54
|
+
from hexcore.darwin.plugins.drbac.pdp import EvaluationLimits, RolePermissionsResolver
|
|
55
|
+
from hexcore.darwin.plugins.drbac.pip import PolicyInformationPoint, ResourceAttributeResolver
|
|
56
|
+
from hexcore.darwin.plugins.drbac.predicates import PredicateRegistry
|
|
57
|
+
|
|
58
|
+
if t.TYPE_CHECKING:
|
|
59
|
+
# Sólo para el checker: en runtime los resuelve el `__getattr__` de abajo. Mismo patrón que
|
|
60
|
+
# `rbac` y que `organization`.
|
|
61
|
+
from hexcore.darwin.plugins.drbac.orms.sqlalchemy.models_mixins import (
|
|
62
|
+
DrbacAuthzVersionMixin as DrbacAuthzVersionMixin,
|
|
63
|
+
DrbacPolicyMixin as DrbacPolicyMixin,
|
|
64
|
+
DrbacRoleBindingMixin as DrbacRoleBindingMixin,
|
|
65
|
+
DrbacRuleMixin as DrbacRuleMixin,
|
|
66
|
+
)
|
|
67
|
+
from hexcore.darwin.domain.authorization import AuthorizationProvider
|
|
68
|
+
from hexcore.darwin.plugins.drbac.pdp import PolicyDecisionPoint
|
|
69
|
+
from hexcore.darwin.plugins.drbac.provider import DrbacAuthorizationProvider
|
|
70
|
+
from hexcore.darwin.plugins.drbac.service import DrbacService
|
|
71
|
+
|
|
72
|
+
__all__ = [
|
|
73
|
+
"GLOBAL_SCOPE",
|
|
74
|
+
"scope_chain",
|
|
75
|
+
"Rule",
|
|
76
|
+
"Policy",
|
|
77
|
+
"RoleBinding",
|
|
78
|
+
"AbstractDrbacPolicyRepository",
|
|
79
|
+
"AbstractDrbacRoleBindingRepository",
|
|
80
|
+
"AbstractDrbacAuthzVersionRepository",
|
|
81
|
+
"DrbacAuthorizationChangedEvent",
|
|
82
|
+
"DrbacError",
|
|
83
|
+
"PolicyNotFoundError",
|
|
84
|
+
"PolicyAlreadyExistsError",
|
|
85
|
+
"RoleBindingNotFoundError",
|
|
86
|
+
"DRBAC_EXCEPTION_STATUS_MAP",
|
|
87
|
+
"EvaluationLimits",
|
|
88
|
+
"RolePermissionsResolver",
|
|
89
|
+
"ResourceAttributeResolver",
|
|
90
|
+
"PolicyInformationPoint",
|
|
91
|
+
"PredicateRegistry",
|
|
92
|
+
"DrbacPolicyMixin",
|
|
93
|
+
"DrbacRuleMixin",
|
|
94
|
+
"DrbacRoleBindingMixin",
|
|
95
|
+
"DrbacAuthzVersionMixin",
|
|
96
|
+
"DrbacPlugin",
|
|
97
|
+
"get_drbac_service",
|
|
98
|
+
]
|
|
99
|
+
|
|
100
|
+
_MIXINS = (
|
|
101
|
+
"DrbacPolicyMixin",
|
|
102
|
+
"DrbacRuleMixin",
|
|
103
|
+
"DrbacRoleBindingMixin",
|
|
104
|
+
"DrbacAuthzVersionMixin",
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
@dataclass
|
|
109
|
+
class _Repos:
|
|
110
|
+
"""Los tres repositorios ya resueltos, compartidos entre `service()` y `pdp()`."""
|
|
111
|
+
|
|
112
|
+
policies: AbstractDrbacPolicyRepository
|
|
113
|
+
bindings: AbstractDrbacRoleBindingRepository
|
|
114
|
+
versions: AbstractDrbacAuthzVersionRepository
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
class DrbacPlugin(DarwinPlugin):
|
|
118
|
+
"""
|
|
119
|
+
El plugin de autorización contextual.
|
|
120
|
+
|
|
121
|
+
Args:
|
|
122
|
+
resolvers: Los `ResourceAttributeResolver` del PIP, por `resource.type`.
|
|
123
|
+
predicates: El `PredicateRegistry` a usar. Por default, `default_predicate_registry()`
|
|
124
|
+
— el compartido del proceso.
|
|
125
|
+
role_permissions: Cómo expandir un `RoleBinding.role_name` contextual a sus permisos.
|
|
126
|
+
`None` (default): los bindings siguen visibles en `subject.roles` para que una
|
|
127
|
+
condición los use, pero no conceden nada por sí solos. Ver el docstring de
|
|
128
|
+
`pdp.RolePermissionsResolver`.
|
|
129
|
+
limits: Los presupuestos de tamaño y tiempo de una decisión.
|
|
130
|
+
include_router: Si aporta su router.
|
|
131
|
+
"""
|
|
132
|
+
|
|
133
|
+
name = "drbac"
|
|
134
|
+
#: Los roles son la base; DRBAC restringe o amplía condicionalmente lo que RBAC ya concede.
|
|
135
|
+
requires = ("rbac",)
|
|
136
|
+
#: Después de `rbac` (70), antes de `organization` (80).
|
|
137
|
+
priority = 75
|
|
138
|
+
|
|
139
|
+
contributed_tables = (
|
|
140
|
+
"DrbacPolicyMixin",
|
|
141
|
+
"DrbacRuleMixin",
|
|
142
|
+
"DrbacRoleBindingMixin",
|
|
143
|
+
"DrbacAuthzVersionMixin",
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
def __init__(
|
|
147
|
+
self,
|
|
148
|
+
*,
|
|
149
|
+
resolvers: t.Mapping[str, ResourceAttributeResolver] | None = None,
|
|
150
|
+
predicates: PredicateRegistry | None = None,
|
|
151
|
+
role_permissions: RolePermissionsResolver | None = None,
|
|
152
|
+
limits: EvaluationLimits = EvaluationLimits(),
|
|
153
|
+
policy_repository: AbstractDrbacPolicyRepository | None = None,
|
|
154
|
+
role_binding_repository: AbstractDrbacRoleBindingRepository | None = None,
|
|
155
|
+
version_repository: AbstractDrbacAuthzVersionRepository | None = None,
|
|
156
|
+
include_router: bool = True,
|
|
157
|
+
) -> None:
|
|
158
|
+
self._resolvers = resolvers
|
|
159
|
+
self._predicates = predicates
|
|
160
|
+
self._role_permissions = role_permissions
|
|
161
|
+
self._limits = limits
|
|
162
|
+
self._policies = policy_repository
|
|
163
|
+
self._bindings = role_binding_repository
|
|
164
|
+
self._versions = version_repository
|
|
165
|
+
self._include_router = include_router
|
|
166
|
+
|
|
167
|
+
self._lock = threading.RLock()
|
|
168
|
+
self._repos: _Repos | None = None
|
|
169
|
+
self._service: "DrbacService | None" = None
|
|
170
|
+
self._pdp: "PolicyDecisionPoint | None" = None
|
|
171
|
+
self._provider: "DrbacAuthorizationProvider | None" = None
|
|
172
|
+
|
|
173
|
+
# ── Componentes, perezosos y cacheados ────────────────────────────────────
|
|
174
|
+
def _resolved_repos(self) -> _Repos:
|
|
175
|
+
with self._lock:
|
|
176
|
+
if self._repos is None:
|
|
177
|
+
from hexcore.darwin.plugins.storage import plugin_repositories
|
|
178
|
+
|
|
179
|
+
modulo = plugin_repositories("drbac")
|
|
180
|
+
self._repos = _Repos(
|
|
181
|
+
policies=self._policies or modulo.PolicyRepository(),
|
|
182
|
+
bindings=self._bindings or modulo.RoleBindingRepository(),
|
|
183
|
+
versions=self._versions or modulo.AuthzVersionRepository(),
|
|
184
|
+
)
|
|
185
|
+
return self._repos
|
|
186
|
+
|
|
187
|
+
def service(self) -> "DrbacService":
|
|
188
|
+
"""El servicio, construido perezosamente desde el contenedor de identidad. Mismo
|
|
189
|
+
criterio que `RbacPlugin.service`."""
|
|
190
|
+
with self._lock:
|
|
191
|
+
if self._service is None:
|
|
192
|
+
from hexcore.darwin.application.container import get_identity_container
|
|
193
|
+
from hexcore.darwin.plugins.drbac.service import DrbacService
|
|
194
|
+
|
|
195
|
+
contenedor = get_identity_container()
|
|
196
|
+
repos = self._resolved_repos()
|
|
197
|
+
self._service = DrbacService(
|
|
198
|
+
policies=repos.policies,
|
|
199
|
+
bindings=repos.bindings,
|
|
200
|
+
versions=repos.versions,
|
|
201
|
+
clock=contenedor.clock(),
|
|
202
|
+
events=contenedor.events(),
|
|
203
|
+
)
|
|
204
|
+
return self._service
|
|
205
|
+
|
|
206
|
+
def pdp(self) -> "PolicyDecisionPoint":
|
|
207
|
+
with self._lock:
|
|
208
|
+
if self._pdp is None:
|
|
209
|
+
from hexcore.darwin.plugins.drbac.pdp import PolicyDecisionPoint
|
|
210
|
+
|
|
211
|
+
repos = self._resolved_repos()
|
|
212
|
+
self._pdp = PolicyDecisionPoint(
|
|
213
|
+
policies=repos.policies,
|
|
214
|
+
bindings=repos.bindings,
|
|
215
|
+
versions=repos.versions,
|
|
216
|
+
pip=PolicyInformationPoint(resolvers=self._resolvers),
|
|
217
|
+
predicates=self._predicates,
|
|
218
|
+
role_permissions=self._role_permissions,
|
|
219
|
+
limits=self._limits,
|
|
220
|
+
)
|
|
221
|
+
return self._pdp
|
|
222
|
+
|
|
223
|
+
def reset(self) -> None:
|
|
224
|
+
"""Descarta lo cacheado. Para los tests."""
|
|
225
|
+
with self._lock:
|
|
226
|
+
self._repos = None
|
|
227
|
+
self._service = None
|
|
228
|
+
self._pdp = None
|
|
229
|
+
self._provider = None
|
|
230
|
+
|
|
231
|
+
# ── Lo que aporta ─────────────────────────────────────────────────────────
|
|
232
|
+
def authorization_providers(self) -> t.Sequence["AuthorizationProvider"]:
|
|
233
|
+
with self._lock:
|
|
234
|
+
if self._provider is None:
|
|
235
|
+
from hexcore.darwin.plugins.drbac.provider import DrbacAuthorizationProvider
|
|
236
|
+
|
|
237
|
+
self._provider = DrbacAuthorizationProvider(pdp=self.pdp())
|
|
238
|
+
return [self._provider]
|
|
239
|
+
|
|
240
|
+
def tables(self) -> t.Mapping[str, type]:
|
|
241
|
+
from hexcore.darwin.plugins.drbac.orms.sqlalchemy.models_mixins import (
|
|
242
|
+
DrbacAuthzVersionMixin,
|
|
243
|
+
DrbacPolicyMixin,
|
|
244
|
+
DrbacRoleBindingMixin,
|
|
245
|
+
DrbacRuleMixin,
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
return {
|
|
249
|
+
"DrbacPolicyMixin": DrbacPolicyMixin,
|
|
250
|
+
"DrbacRuleMixin": DrbacRuleMixin,
|
|
251
|
+
"DrbacRoleBindingMixin": DrbacRoleBindingMixin,
|
|
252
|
+
"DrbacAuthzVersionMixin": DrbacAuthzVersionMixin,
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
def exception_status_map(self) -> t.Mapping[type[Exception], int]:
|
|
256
|
+
return DRBAC_EXCEPTION_STATUS_MAP
|
|
257
|
+
|
|
258
|
+
def routers(self) -> t.Sequence[t.Any]:
|
|
259
|
+
if not self._include_router:
|
|
260
|
+
return ()
|
|
261
|
+
|
|
262
|
+
from hexcore.darwin.plugins.drbac.router import build_drbac_router
|
|
263
|
+
|
|
264
|
+
return [build_drbac_router()]
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
def get_drbac_service() -> "DrbacService":
|
|
268
|
+
"""
|
|
269
|
+
El servicio del plugin registrado en este despliegue.
|
|
270
|
+
|
|
271
|
+
Raises:
|
|
272
|
+
RuntimeError: el plugin no está registrado, con la remediación copiable.
|
|
273
|
+
"""
|
|
274
|
+
from hexcore.darwin.application.container import get_identity_container
|
|
275
|
+
|
|
276
|
+
plugin = get_identity_container().plugins.get(DrbacPlugin.name)
|
|
277
|
+
if not isinstance(plugin, DrbacPlugin):
|
|
278
|
+
raise RuntimeError(
|
|
279
|
+
"El plugin 'drbac' no está registrado en este despliegue.\n\n"
|
|
280
|
+
" from hexcore.darwin import PluginRegistry, configure_identity\n"
|
|
281
|
+
" from hexcore.darwin.plugins.drbac import DrbacPlugin\n\n"
|
|
282
|
+
" configure_identity(config, plugins=PluginRegistry([RbacPlugin(), DrbacPlugin()]))"
|
|
283
|
+
)
|
|
284
|
+
return plugin.service()
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
def __getattr__(name: str) -> t.Any:
|
|
288
|
+
"""Los cuatro mixins, perezosos: importarlos arrastra sqlalchemy. Ver `rbac`."""
|
|
289
|
+
if name in _MIXINS:
|
|
290
|
+
from hexcore.darwin.plugins.drbac.orms.sqlalchemy import models_mixins
|
|
291
|
+
|
|
292
|
+
return getattr(models_mixins, name)
|
|
293
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"""
|
|
2
|
+
`PolicySetCache`: las reglas ya compiladas de un scope, versionadas.
|
|
3
|
+
|
|
4
|
+
**Sólo LRU de proceso, a diferencia de `rbac.cache.PermissionMatrixCache`.** Lo que se cachea
|
|
5
|
+
acá no es un dato serializable como un `CompiledPermissionSet` (exactos + prefijos, JSON-safe):
|
|
6
|
+
es una tupla de reglas **ya compiladas a closures Python** (`conditions.compile_condition`), y
|
|
7
|
+
una closure no cruza a Redis. Compartir esta cache entre workers obligaría a volver a compilar
|
|
8
|
+
del lado del que la recibe de todos modos, así que no hay nada que ganar agregando una capa de
|
|
9
|
+
red — cada worker compila una vez y listo.
|
|
10
|
+
|
|
11
|
+
**La clave lleva la versión adentro**, igual que `PermissionMatrixCache`: subir
|
|
12
|
+
`AbstractDrbacAuthzVersionRepository` para un scope deja la clave vieja huérfana, y el LRU la
|
|
13
|
+
desaloja sola con el tiempo. No hace falta invalidar nada a mano.
|
|
14
|
+
"""
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import typing as t
|
|
18
|
+
from collections import OrderedDict
|
|
19
|
+
|
|
20
|
+
if t.TYPE_CHECKING:
|
|
21
|
+
from hexcore.darwin.plugins.drbac.pdp import CompiledRule
|
|
22
|
+
|
|
23
|
+
__all__ = ["PolicySetCache"]
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class PolicySetCache:
|
|
27
|
+
"""
|
|
28
|
+
Uso::
|
|
29
|
+
|
|
30
|
+
cache = PolicySetCache(max_local=2048)
|
|
31
|
+
|
|
32
|
+
reglas = await cache.get_or_compute(
|
|
33
|
+
scope_key, version, compute=lambda: pdp._compilar_capa(scope_key),
|
|
34
|
+
)
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
def __init__(self, *, max_local: int = 4096) -> None:
|
|
38
|
+
self._max_local = max_local
|
|
39
|
+
self._local: OrderedDict[str, tuple["CompiledRule", ...]] = OrderedDict()
|
|
40
|
+
|
|
41
|
+
@staticmethod
|
|
42
|
+
def _clave(scope_key: str, version: int) -> str:
|
|
43
|
+
return f"darwin:drbac:{scope_key}:v{version}"
|
|
44
|
+
|
|
45
|
+
async def get_or_compute(
|
|
46
|
+
self,
|
|
47
|
+
scope_key: str,
|
|
48
|
+
version: int,
|
|
49
|
+
*,
|
|
50
|
+
compute: t.Callable[[], t.Awaitable[tuple["CompiledRule", ...]]],
|
|
51
|
+
) -> tuple["CompiledRule", ...]:
|
|
52
|
+
clave = self._clave(scope_key, version)
|
|
53
|
+
|
|
54
|
+
en_lru = self._local.get(clave)
|
|
55
|
+
if en_lru is not None:
|
|
56
|
+
self._local.move_to_end(clave)
|
|
57
|
+
return en_lru
|
|
58
|
+
|
|
59
|
+
compiladas = await compute()
|
|
60
|
+
self._local[clave] = compiladas
|
|
61
|
+
self._local.move_to_end(clave)
|
|
62
|
+
while len(self._local) > self._max_local:
|
|
63
|
+
self._local.popitem(last=False)
|
|
64
|
+
return compiladas
|
|
65
|
+
|
|
66
|
+
def clear_local(self) -> None:
|
|
67
|
+
"""Vacía el LRU. Para tests."""
|
|
68
|
+
self._local.clear()
|