quadkit-testing 0.0.42__tar.gz → 0.0.44__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.
- quadkit_testing-0.0.44/.gitignore +24 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/PKG-INFO +6 -22
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/README.md +3 -3
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/pyproject.toml +3 -26
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/__init__.py +1 -1
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/flags.py +1 -1
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fakes/__init__.py +1 -1
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/generators_contract.py +33 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/integration/probes.py +15 -11
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/lib/admin_helpers.py +2 -2
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_subpackage_exports.py +31 -0
- quadkit_testing-0.0.42/.gitignore +0 -214
- quadkit_testing-0.0.42/docs/ARCHITECTURE.md +0 -571
- quadkit_testing-0.0.42/docs/COMPLIANCE.md +0 -123
- quadkit_testing-0.0.42/docs/CONFIGURATION.md +0 -52
- quadkit_testing-0.0.42/docs/GUIDE.md +0 -191
- quadkit_testing-0.0.42/docs/HOWTOS.md +0 -220
- quadkit_testing-0.0.42/docs/QUICKSTART.md +0 -66
- quadkit_testing-0.0.42/docs/TROUBLESHOOTING.md +0 -174
- quadkit_testing-0.0.42/src/quadkit/testing/clients/auth/__init__.py +0 -64
- quadkit_testing-0.0.42/src/quadkit/testing/clients/auth/bed.py +0 -115
- quadkit_testing-0.0.42/src/quadkit/testing/clients/auth/client.py +0 -22
- quadkit_testing-0.0.42/src/quadkit/testing/clients/auth/fixtures/__init__.py +0 -134
- quadkit_testing-0.0.42/src/quadkit/testing/clients/auth/fixtures/_async.py +0 -30
- quadkit_testing-0.0.42/src/quadkit/testing/clients/auth/fixtures/beds.py +0 -36
- quadkit_testing-0.0.42/src/quadkit/testing/clients/auth/fixtures/mocks.py +0 -82
- quadkit_testing-0.0.42/src/quadkit/testing/clients/auth/fixtures/tokens.py +0 -196
- quadkit_testing-0.0.42/src/quadkit/testing/clients/auth/fixtures/users.py +0 -239
- quadkit_testing-0.0.42/src/quadkit/testing/clients/auth/test_client.py +0 -157
- quadkit_testing-0.0.42/src/quadkit/testing/clients/auth/types.py +0 -141
- quadkit_testing-0.0.42/src/quadkit/testing/clients/cache/__init__.py +0 -101
- quadkit_testing-0.0.42/src/quadkit/testing/clients/cache/bed.py +0 -114
- quadkit_testing-0.0.42/src/quadkit/testing/clients/cache/client.py +0 -16
- quadkit_testing-0.0.42/src/quadkit/testing/clients/cache/client_core.py +0 -275
- quadkit_testing-0.0.42/src/quadkit/testing/clients/cache/data.py +0 -60
- quadkit_testing-0.0.42/src/quadkit/testing/clients/cache/fixtures/__init__.py +0 -143
- quadkit_testing-0.0.42/src/quadkit/testing/clients/cache/fixtures/_async.py +0 -30
- quadkit_testing-0.0.42/src/quadkit/testing/clients/cache/fixtures/beds.py +0 -57
- quadkit_testing-0.0.42/src/quadkit/testing/clients/cache/fixtures/data.py +0 -173
- quadkit_testing-0.0.42/src/quadkit/testing/clients/cache/fixtures/lifecycle.py +0 -219
- quadkit_testing-0.0.42/src/quadkit/testing/clients/cache/fixtures/scenarios.py +0 -65
- quadkit_testing-0.0.42/src/quadkit/testing/clients/events/__init__.py +0 -111
- quadkit_testing-0.0.42/src/quadkit/testing/clients/events/client.py +0 -26
- quadkit_testing-0.0.42/src/quadkit/testing/clients/events/components/__init__.py +0 -17
- quadkit_testing-0.0.42/src/quadkit/testing/clients/events/components/command_client.py +0 -159
- quadkit_testing-0.0.42/src/quadkit/testing/clients/events/components/event_client.py +0 -227
- quadkit_testing-0.0.42/src/quadkit/testing/clients/events/components/query_client.py +0 -159
- quadkit_testing-0.0.42/src/quadkit/testing/clients/events/components/test_bed.py +0 -116
- quadkit_testing-0.0.42/src/quadkit/testing/clients/events/components/test_data.py +0 -195
- quadkit_testing-0.0.42/src/quadkit/testing/clients/events/fixtures/__init__.py +0 -262
- quadkit_testing-0.0.42/src/quadkit/testing/clients/events/fixtures/_async.py +0 -34
- quadkit_testing-0.0.42/src/quadkit/testing/clients/events/fixtures/beds.py +0 -121
- quadkit_testing-0.0.42/src/quadkit/testing/clients/events/fixtures/data.py +0 -219
- quadkit_testing-0.0.42/src/quadkit/testing/clients/events/fixtures/handlers.py +0 -169
- quadkit_testing-0.0.42/src/quadkit/testing/clients/events/fixtures/models.py +0 -139
- quadkit_testing-0.0.42/src/quadkit/testing/clients/events/fixtures/scenarios.py +0 -52
- quadkit_testing-0.0.42/src/quadkit/testing/clients/events/py.typed +0 -0
- quadkit_testing-0.0.42/src/quadkit/testing/clients/search/__init__.py +0 -40
- quadkit_testing-0.0.42/src/quadkit/testing/clients/search/client.py +0 -431
- quadkit_testing-0.0.42/src/quadkit/testing/clients/search/fixtures.py +0 -63
- quadkit_testing-0.0.42/src/quadkit/testing/clients/search/py.typed +0 -0
- quadkit_testing-0.0.42/src/quadkit/testing/clients/storage/__init__.py +0 -11
- quadkit_testing-0.0.42/src/quadkit/testing/clients/storage/fixtures.py +0 -81
- quadkit_testing-0.0.42/src/quadkit/testing/clients/storage/mocks.py +0 -41
- quadkit_testing-0.0.42/src/quadkit/testing/clients/storage/py.typed +0 -0
- quadkit_testing-0.0.42/src/quadkit/testing/clients/tasks/__init__.py +0 -23
- quadkit_testing-0.0.42/src/quadkit/testing/clients/tasks/bed.py +0 -122
- quadkit_testing-0.0.42/src/quadkit/testing/clients/tasks/client.py +0 -149
- quadkit_testing-0.0.42/src/quadkit/testing/clients/tasks/data.py +0 -88
- quadkit_testing-0.0.42/src/quadkit/testing/clients/tasks/mocks.py +0 -306
- quadkit_testing-0.0.42/src/quadkit/testing/clients/tasks/py.typed +0 -0
- quadkit_testing-0.0.42/src/quadkit/testing/clients/ui/__init__.py +0 -7
- quadkit_testing-0.0.42/src/quadkit/testing/clients/ui/core.py +0 -106
- quadkit_testing-0.0.42/src/quadkit/testing/clients/web/py.typed +0 -0
- quadkit_testing-0.0.42/src/quadkit/testing/fakes/secrets.py +0 -14
- quadkit_testing-0.0.42/src/quadkit/testing/fixtures/ai.py +0 -190
- quadkit_testing-0.0.42/src/quadkit/testing/fixtures/py.typed +0 -0
- quadkit_testing-0.0.42/src/quadkit/testing/fixtures/tasks.py +0 -57
- quadkit_testing-0.0.42/src/quadkit/testing/harness/environment.py +0 -249
- quadkit_testing-0.0.42/src/quadkit/testing/py.typed +0 -0
- quadkit_testing-0.0.42/tests/integration/test_ai_client.py +0 -290
- quadkit_testing-0.0.42/tests/integration/test_bed.py +0 -380
- quadkit_testing-0.0.42/tests/unit/test_cache_client_fixtures.py +0 -234
- quadkit_testing-0.0.42/tests/unit/test_cache_clients.py +0 -313
- quadkit_testing-0.0.42/tests/unit/test_command_query_test_clients.py +0 -215
- quadkit_testing-0.0.42/tests/unit/test_compliance_suites.py +0 -354
- quadkit_testing-0.0.42/tests/unit/test_event_test_client.py +0 -210
- quadkit_testing-0.0.42/tests/unit/test_fakes_observability.py +0 -136
- quadkit_testing-0.0.42/tests/unit/test_fixture_modules.py +0 -418
- quadkit_testing-0.0.42/tests/unit/test_harness_container.py +0 -172
- quadkit_testing-0.0.42/tests/unit/test_integration_environment.py +0 -319
- quadkit_testing-0.0.42/tests/unit/test_round33_hardening.py +0 -79
- quadkit_testing-0.0.42/tests/unit/test_tasks_clients.py +0 -290
- quadkit_testing-0.0.42/tests/unit/test_testing_stack_scenario.py +0 -332
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/LICENSE +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/NOTICE +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/py.typed +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/README.md +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/__init__.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/_lazy_exports.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/clients/ai/__init__.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/clients/ai/bed.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/clients/ai/client.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/clients/ai/data.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/clients/db/__init__.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/clients/db/bed.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/clients/db/client.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/clients/web/__init__.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/clients/web/bed.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/clients/web/client.py +0 -0
- {quadkit_testing-0.0.42/src/quadkit/testing/clients/auth → quadkit_testing-0.0.44/src/quadkit/testing/clients/web}/py.typed +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/clock.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/audit.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/blob_store.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/cache.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/database.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/distributed_lock.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/event_bus.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/middleware.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/notification.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/queue_backend.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/repository.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/search.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/secrets.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/task_queue.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/vector_store.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/webhook.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/config.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/constants.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/decorators.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/di/__init__.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/events.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/exceptions.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fakes/audit.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fakes/buses.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fakes/cache.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fakes/clock.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fakes/config.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fakes/events.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fakes/governance.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fakes/lifecycle.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fakes/logging.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fakes/monitoring.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fakes/redis.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fakes/tracing.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fixtures/__init__.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fixtures/bed.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fixtures/container.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fixtures/containers.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fixtures/core.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fixtures/db.py +0 -0
- {quadkit_testing-0.0.42/src/quadkit/testing/clients/cache → quadkit_testing-0.0.44/src/quadkit/testing/fixtures}/py.typed +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fixtures/web.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/generators.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/harness/__init__.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/harness/container.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/harness/decorators.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/harness/overrides.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/harness/testbed.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/hooks.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/integration/__init__.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/integration/cleanup.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/integration/config.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/integration/fixtures.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/integration/markers.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/lib/__init__.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/lib/assertions.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/lib/async_helper.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/lib/factory.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/lib/smoke.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/lib/snapshots.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/lib/stubs.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/__init__.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/audit.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/blob_store.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/cache.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/config/__init__.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/config/models.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/constants.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/cqrs.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/di/__init__.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/di/provider.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/event_bus.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/exceptions.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/lock.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/notification.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/outbox.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/queue.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/repository.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/search.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/uow.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/mocks/__init__.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/mocks/base.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/mocks/test_provider.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/module.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/plugins/__init__.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/plugins/pytest/__init__.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/plugins/pytest/plugin.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/protocols.py +0 -0
- {quadkit_testing-0.0.42/src/quadkit/testing/clients/events/components → quadkit_testing-0.0.44/src/quadkit/testing}/py.typed +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/testkit/__init__.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/testkit/assertions.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/testkit/environment.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/testkit/fakes.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/testkit/fixtures.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/types.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/websocket/__init__.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/websocket/client.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/workflow/__init__.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/workflow/harness.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/__snapshots__/test_snapshot_function.json +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/conftest.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/integration/test_web_client.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/test_package_structure_p1.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/__snapshots__/test_snapshot_function.json +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/_integration_helpers.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/conftest.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_ai_client_budget.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_ai_clients.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_app_testbed.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_app_testbed_from_factory_overrides.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_assertion_helpers.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_async_helper.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_container.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_container_bind.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_container_factory_auto_registration.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_container_try_resolve.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_db_clients.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_db_transaction_fixture.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_environment_lifecycle.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_exceptions.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_factory.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_fake_audit.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_fake_event_bus_ordering.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_fake_tracer.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_fakes.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_fakes_cluster.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_fakes_lifecycle.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_generators_util.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_harness_testkit.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_integration_cleanup.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_integration_cluster.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_integration_fixtures.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_integration_probes.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_lib_admin_client.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_lib_async_helpers.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_lib_helpers.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_memory_backends.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_memory_cqrs.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_memory_event_bus.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_memory_lock.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_memory_outbox.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_memory_repository.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_mocks.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_mocks_cluster.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_override_context_manager_revert.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_plugin.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_public_exports.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_pytest_plugin_fixtures.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_service_probe_connectivity.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_small_modules.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_smoke.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_snapshot_asserter_create_compare.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_snapshots.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_stubs.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_test_environment.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_test_environment_facade.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_test_environment_overrides.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_testing_constants.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_testing_module.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_testing_utils.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_testkit_surface.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_utilities.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_web_clients.py +0 -0
- {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_workflow_websocket_plugins.py +0 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Generated public-repository ignore rules.
|
|
2
|
+
# Private monorepo paths are intentionally not referenced here.
|
|
3
|
+
|
|
4
|
+
__pycache__/
|
|
5
|
+
*.py[cod]
|
|
6
|
+
*.so
|
|
7
|
+
*.egg-info/
|
|
8
|
+
.venv/
|
|
9
|
+
venv/
|
|
10
|
+
.env
|
|
11
|
+
.env.*
|
|
12
|
+
!.env.example
|
|
13
|
+
.pytest_cache/
|
|
14
|
+
.ruff_cache/
|
|
15
|
+
.mypy_cache/
|
|
16
|
+
.coverage
|
|
17
|
+
coverage.xml
|
|
18
|
+
htmlcov/
|
|
19
|
+
build/
|
|
20
|
+
dist/
|
|
21
|
+
*.log
|
|
22
|
+
.DS_Store
|
|
23
|
+
.idea/
|
|
24
|
+
.vscode/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: quadkit-testing
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.44
|
|
4
4
|
Summary: Centralized testing infrastructure for Quadkit Framework - Fixtures, factories, and utilities
|
|
5
5
|
Project-URL: Homepage, https://dbtinoy-.github.io/quadkit/
|
|
6
6
|
Project-URL: Repository, https://github.com/dbtinoy-/quadkit
|
|
@@ -32,23 +32,9 @@ Requires-Dist: pytest-mock<4,>=3.10.0
|
|
|
32
32
|
Requires-Dist: pytest<10,>=8.0.0
|
|
33
33
|
Requires-Dist: quadkit-contracts>=0.0.2
|
|
34
34
|
Requires-Dist: quadkit>=0.0.2
|
|
35
|
-
Provides-Extra: all
|
|
36
|
-
Requires-Dist: aiosqlite<1,>=0.19.0; extra == 'all'
|
|
37
|
-
Requires-Dist: asyncpg<1,>=0.29.0; extra == 'all'
|
|
38
|
-
Requires-Dist: httpx2<3,>=2.0.0; extra == 'all'
|
|
39
|
-
Requires-Dist: httpx<1,>=0.26.0; extra == 'all'
|
|
40
|
-
Requires-Dist: quadkit-auth>=0.0.2; extra == 'all'
|
|
41
|
-
Requires-Dist: quadkit-cache>=0.0.2; extra == 'all'
|
|
42
|
-
Requires-Dist: quadkit-storage>=0.0.2; extra == 'all'
|
|
43
|
-
Requires-Dist: starlette<2,>=0.28.0; extra == 'all'
|
|
44
|
-
Provides-Extra: auth
|
|
45
|
-
Requires-Dist: quadkit-auth>=0.0.2; extra == 'auth'
|
|
46
|
-
Provides-Extra: cache
|
|
47
|
-
Requires-Dist: quadkit-cache>=0.0.2; extra == 'cache'
|
|
48
35
|
Provides-Extra: db
|
|
49
|
-
Requires-Dist: aiosqlite
|
|
50
|
-
Requires-Dist: asyncpg
|
|
51
|
-
Requires-Dist: quadkit-sql>=0.0.2; extra == 'db'
|
|
36
|
+
Requires-Dist: aiosqlite>=0.19.0; extra == 'db'
|
|
37
|
+
Requires-Dist: asyncpg>=0.29.0; extra == 'db'
|
|
52
38
|
Provides-Extra: dev
|
|
53
39
|
Requires-Dist: black<27,>=23.0.0; extra == 'dev'
|
|
54
40
|
Requires-Dist: mypy<3,>=1.0.0; extra == 'dev'
|
|
@@ -62,8 +48,6 @@ Requires-Dist: motor<4,>=3.3.0; extra == 'integration'
|
|
|
62
48
|
Requires-Dist: neo4j<7,>=5.18.0; extra == 'integration'
|
|
63
49
|
Requires-Dist: qdrant-client<2,>=1.9.0; extra == 'integration'
|
|
64
50
|
Requires-Dist: redis<9,>=5.0.0; extra == 'integration'
|
|
65
|
-
Provides-Extra: storage
|
|
66
|
-
Requires-Dist: quadkit-storage>=0.0.2; extra == 'storage'
|
|
67
51
|
Provides-Extra: web
|
|
68
52
|
Requires-Dist: httpx2<3,>=2.0.0; extra == 'web'
|
|
69
53
|
Requires-Dist: httpx<1,>=0.26.0; extra == 'web'
|
|
@@ -250,10 +234,10 @@ vulnerabilities privately per [SECURITY.md](https://github.com/dbtinoy-/quadkit/
|
|
|
250
234
|
|
|
251
235
|
## Stability
|
|
252
236
|
|
|
253
|
-
Version `0.0.
|
|
237
|
+
Version `0.0.44` in the `0.x` series, released in lockstep with the
|
|
254
238
|
other four distributions; APIs may change between minor versions until
|
|
255
|
-
1.0 — pin an exact version (`quadkit-testing==0.0.
|
|
256
|
-
(`>=0.0.
|
|
239
|
+
1.0 — pin an exact version (`quadkit-testing==0.0.44`) or a tight range
|
|
240
|
+
(`>=0.0.44,<0.1.0`). Full policy:
|
|
257
241
|
[stability and compatibility](https://dbtinoy-.github.io/quadkit/reference/stability/).
|
|
258
242
|
|
|
259
243
|
## Links
|
|
@@ -178,10 +178,10 @@ vulnerabilities privately per [SECURITY.md](https://github.com/dbtinoy-/quadkit/
|
|
|
178
178
|
|
|
179
179
|
## Stability
|
|
180
180
|
|
|
181
|
-
Version `0.0.
|
|
181
|
+
Version `0.0.44` in the `0.x` series, released in lockstep with the
|
|
182
182
|
other four distributions; APIs may change between minor versions until
|
|
183
|
-
1.0 — pin an exact version (`quadkit-testing==0.0.
|
|
184
|
-
(`>=0.0.
|
|
183
|
+
1.0 — pin an exact version (`quadkit-testing==0.0.44`) or a tight range
|
|
184
|
+
(`>=0.0.44,<0.1.0`). Full policy:
|
|
185
185
|
[stability and compatibility](https://dbtinoy-.github.io/quadkit/reference/stability/).
|
|
186
186
|
|
|
187
187
|
## Links
|
|
@@ -6,7 +6,7 @@ build-backend = "hatchling.build"
|
|
|
6
6
|
|
|
7
7
|
[project]
|
|
8
8
|
name = "quadkit-testing"
|
|
9
|
-
version = "0.0.
|
|
9
|
+
version = "0.0.44"
|
|
10
10
|
description = "Centralized testing infrastructure for Quadkit Framework - Fixtures, factories, and utilities"
|
|
11
11
|
readme = "README.md"
|
|
12
12
|
requires-python = ">=3.11"
|
|
@@ -53,39 +53,19 @@ text = "Apache-2.0"
|
|
|
53
53
|
|
|
54
54
|
[project.optional-dependencies]
|
|
55
55
|
db = [
|
|
56
|
-
"aiosqlite>=0.19.0
|
|
57
|
-
"asyncpg>=0.29.0
|
|
58
|
-
"quadkit-sql>=0.0.2",
|
|
56
|
+
"aiosqlite>=0.19.0",
|
|
57
|
+
"asyncpg>=0.29.0",
|
|
59
58
|
]
|
|
60
59
|
web = [
|
|
61
60
|
"httpx>=0.26.0,<1",
|
|
62
61
|
"httpx2>=2.0.0,<3",
|
|
63
62
|
"starlette>=0.28.0,<2",
|
|
64
63
|
]
|
|
65
|
-
auth = [
|
|
66
|
-
"quadkit-auth>=0.0.2",
|
|
67
|
-
]
|
|
68
|
-
cache = [
|
|
69
|
-
"quadkit-cache>=0.0.2",
|
|
70
|
-
]
|
|
71
|
-
storage = [
|
|
72
|
-
"quadkit-storage>=0.0.2",
|
|
73
|
-
]
|
|
74
64
|
dev = [
|
|
75
65
|
"black>=23.0.0,<27",
|
|
76
66
|
"ruff>=0.16.4,<1",
|
|
77
67
|
"mypy>=1.0.0,<3",
|
|
78
68
|
]
|
|
79
|
-
all = [
|
|
80
|
-
"aiosqlite>=0.19.0,<1",
|
|
81
|
-
"asyncpg>=0.29.0,<1",
|
|
82
|
-
"httpx>=0.26.0,<1",
|
|
83
|
-
"httpx2>=2.0.0,<3",
|
|
84
|
-
"starlette>=0.28.0,<2",
|
|
85
|
-
"quadkit-auth>=0.0.2",
|
|
86
|
-
"quadkit-cache>=0.0.2",
|
|
87
|
-
"quadkit-storage>=0.0.2",
|
|
88
|
-
]
|
|
89
69
|
integration = [
|
|
90
70
|
"asyncpg>=0.29.0,<1",
|
|
91
71
|
"aiosqlite>=0.19.0,<1",
|
|
@@ -184,9 +164,6 @@ workspace = true
|
|
|
184
164
|
[tool.uv.sources.quadkit-contracts]
|
|
185
165
|
workspace = true
|
|
186
166
|
|
|
187
|
-
[tool.uv.sources.quadkit-secrets]
|
|
188
|
-
workspace = true
|
|
189
|
-
|
|
190
167
|
[tool.uv.sources.quadkit-sql]
|
|
191
168
|
workspace = true
|
|
192
169
|
|
{quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/__init__.py
RENAMED
|
@@ -8,7 +8,7 @@ method, and pytest runs the contract checks::
|
|
|
8
8
|
return RedisCacheBackend("redis://localhost:6379/15")
|
|
9
9
|
|
|
10
10
|
Every suite named in `__all__` is importable; the secret-store suite ships only
|
|
11
|
-
with the optional `
|
|
11
|
+
with the optional `the optional provider` extra, so accessing it without that extra
|
|
12
12
|
raises `AttributeError` instead of failing at import time.
|
|
13
13
|
"""
|
|
14
14
|
|
|
@@ -23,7 +23,7 @@ import pytest
|
|
|
23
23
|
def _flag_not_found_error() -> type[Exception]:
|
|
24
24
|
"""Return the optional provider exception without a static private import."""
|
|
25
25
|
try:
|
|
26
|
-
module = import_module("
|
|
26
|
+
module = import_module("the optional provider module")
|
|
27
27
|
# The attribute ships only with a feature-provider install.
|
|
28
28
|
return cast("type[Exception]", getattr(module, "FlagNotFoundError")) # noqa: B009
|
|
29
29
|
except (ImportError, AttributeError):
|
|
@@ -25,7 +25,7 @@ _LAZY_IMPORTS: Final[dict[str, tuple[str, str]]] = {
|
|
|
25
25
|
),
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
# Re-exports the production memory backend owned by ``
|
|
28
|
+
# Re-exports the production memory backend owned by ``the optional provider``, which
|
|
29
29
|
# is not part of the published set.
|
|
30
30
|
_OPTIONAL_MODULES: Final[frozenset[str]] = frozenset({"quadkit.testing.fakes.secrets"})
|
|
31
31
|
|
{quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/generators_contract.py
RENAMED
|
@@ -8,6 +8,30 @@ from pathlib import Path
|
|
|
8
8
|
from typing import Any
|
|
9
9
|
|
|
10
10
|
|
|
11
|
+
def _assert_marker_convention(py_path: Path, text: str) -> None:
|
|
12
|
+
"""Enforce the generated-stub marker convention on one rendered ``.py``.
|
|
13
|
+
|
|
14
|
+
Generated stubs pair ``# @INTENT: <goal>`` directly above ``# @TODO:
|
|
15
|
+
<action>`` and never ship a bare ``# TODO:`` (the ``@`` prefix keeps both
|
|
16
|
+
greppable). See ``docs/09-27-2026/GENERATED_CODE_MARKERS.md``.
|
|
17
|
+
"""
|
|
18
|
+
lines = text.splitlines()
|
|
19
|
+
for i, line in enumerate(lines):
|
|
20
|
+
stripped = line.strip()
|
|
21
|
+
if stripped.startswith("# TODO"):
|
|
22
|
+
raise AssertionError(
|
|
23
|
+
f"{py_path}: bare '# TODO' in generated code must be '# @TODO' "
|
|
24
|
+
f"-> {line!r}"
|
|
25
|
+
)
|
|
26
|
+
if stripped.startswith("# @TODO:"):
|
|
27
|
+
prev = lines[i - 1].strip() if i > 0 else ""
|
|
28
|
+
if not prev.startswith("# @INTENT:"):
|
|
29
|
+
raise AssertionError(
|
|
30
|
+
f"{py_path}: '# @TODO' at line {i + 1} is not preceded by "
|
|
31
|
+
f"a '# @INTENT:' line (found {prev!r})"
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
|
|
11
35
|
def assert_contributor_generators_render(
|
|
12
36
|
contributor: Any,
|
|
13
37
|
*,
|
|
@@ -77,6 +101,15 @@ def assert_contributor_generators_render(
|
|
|
77
101
|
f"(created={len(created)}, overwritten={len(overwritten)}, "
|
|
78
102
|
f"staged={len(staged)})"
|
|
79
103
|
)
|
|
104
|
+
|
|
105
|
+
# Every rendered Python stub must follow the @INTENT/@TODO marker
|
|
106
|
+
# convention — a single gate so a new generator (or a template at a
|
|
107
|
+
# deeper package nesting) cannot reintroduce a bare ``# TODO``.
|
|
108
|
+
for py_file in out.rglob("*.py"):
|
|
109
|
+
if "__pycache__" in py_file.parts:
|
|
110
|
+
continue
|
|
111
|
+
_assert_marker_convention(py_file, py_file.read_text(encoding="utf-8"))
|
|
112
|
+
|
|
80
113
|
exercised += 1
|
|
81
114
|
return exercised
|
|
82
115
|
|
|
@@ -51,7 +51,7 @@ class ServiceProbe:
|
|
|
51
51
|
await client.close()
|
|
52
52
|
return True
|
|
53
53
|
except Exception as e: # noqa: BLE001
|
|
54
|
-
logger.debug("probe_failed",
|
|
54
|
+
logger.debug("probe_failed", dependency="redis", url=url, error=str(e))
|
|
55
55
|
return False
|
|
56
56
|
|
|
57
57
|
@staticmethod
|
|
@@ -66,7 +66,7 @@ class ServiceProbe:
|
|
|
66
66
|
await conn.close()
|
|
67
67
|
return True
|
|
68
68
|
except Exception as e: # noqa: BLE001
|
|
69
|
-
logger.debug("probe_failed",
|
|
69
|
+
logger.debug("probe_failed", dependency="postgres", dsn=dsn, error=str(e))
|
|
70
70
|
return False
|
|
71
71
|
|
|
72
72
|
@staticmethod
|
|
@@ -79,7 +79,9 @@ class ServiceProbe:
|
|
|
79
79
|
response = await client.get(url)
|
|
80
80
|
return response.status_code == 200
|
|
81
81
|
except Exception as e: # noqa: BLE001
|
|
82
|
-
logger.debug(
|
|
82
|
+
logger.debug(
|
|
83
|
+
"probe_failed", dependency="elasticsearch", url=url, error=str(e)
|
|
84
|
+
)
|
|
83
85
|
return False
|
|
84
86
|
|
|
85
87
|
@staticmethod
|
|
@@ -94,7 +96,7 @@ class ServiceProbe:
|
|
|
94
96
|
await connection.close()
|
|
95
97
|
return True
|
|
96
98
|
except Exception as e: # noqa: BLE001
|
|
97
|
-
logger.debug("probe_failed",
|
|
99
|
+
logger.debug("probe_failed", dependency="rabbitmq", url=url, error=str(e))
|
|
98
100
|
return False
|
|
99
101
|
|
|
100
102
|
@staticmethod
|
|
@@ -107,7 +109,9 @@ class ServiceProbe:
|
|
|
107
109
|
response = await client.get(f"{url}/health")
|
|
108
110
|
return response.status_code == 200
|
|
109
111
|
except Exception as e: # noqa: BLE001
|
|
110
|
-
logger.debug(
|
|
112
|
+
logger.debug(
|
|
113
|
+
"probe_failed", dependency="meilisearch", url=url, error=str(e)
|
|
114
|
+
)
|
|
111
115
|
return False
|
|
112
116
|
|
|
113
117
|
@staticmethod
|
|
@@ -125,7 +129,7 @@ class ServiceProbe:
|
|
|
125
129
|
return True
|
|
126
130
|
except Exception as e: # noqa: BLE001
|
|
127
131
|
logger.debug(
|
|
128
|
-
"probe_failed",
|
|
132
|
+
"probe_failed", dependency="smtp", host=host, port=port, error=str(e)
|
|
129
133
|
)
|
|
130
134
|
return False
|
|
131
135
|
|
|
@@ -152,7 +156,7 @@ class ServiceProbe:
|
|
|
152
156
|
return True
|
|
153
157
|
except Exception as e: # noqa: BLE001
|
|
154
158
|
logger.debug(
|
|
155
|
-
"probe_failed",
|
|
159
|
+
"probe_failed", dependency="kafka", bootstrap=bootstrap, error=str(e)
|
|
156
160
|
)
|
|
157
161
|
return False
|
|
158
162
|
|
|
@@ -179,7 +183,7 @@ class ServiceProbe:
|
|
|
179
183
|
return True
|
|
180
184
|
except Exception as e: # noqa: BLE001
|
|
181
185
|
logger.debug(
|
|
182
|
-
"probe_failed",
|
|
186
|
+
"probe_failed", dependency="minio", endpoint=endpoint, error=str(e)
|
|
183
187
|
)
|
|
184
188
|
return False
|
|
185
189
|
|
|
@@ -207,7 +211,7 @@ class ServiceProbe:
|
|
|
207
211
|
await writer.wait_closed()
|
|
208
212
|
return True
|
|
209
213
|
except Exception as e: # noqa: BLE001
|
|
210
|
-
logger.debug("probe_failed",
|
|
214
|
+
logger.debug("probe_failed", dependency="mongodb", dsn=dsn, error=str(e))
|
|
211
215
|
return False
|
|
212
216
|
|
|
213
217
|
@staticmethod
|
|
@@ -234,7 +238,7 @@ class ServiceProbe:
|
|
|
234
238
|
await writer.wait_closed()
|
|
235
239
|
return True
|
|
236
240
|
except Exception as e: # noqa: BLE001
|
|
237
|
-
logger.debug("probe_failed",
|
|
241
|
+
logger.debug("probe_failed", dependency="qdrant", url=url, error=str(e))
|
|
238
242
|
return False
|
|
239
243
|
|
|
240
244
|
@staticmethod
|
|
@@ -261,5 +265,5 @@ class ServiceProbe:
|
|
|
261
265
|
await writer.wait_closed()
|
|
262
266
|
return True
|
|
263
267
|
except Exception as e: # noqa: BLE001
|
|
264
|
-
logger.debug("probe_failed",
|
|
268
|
+
logger.debug("probe_failed", dependency="neo4j", url=url, error=str(e))
|
|
265
269
|
return False
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""Admin-specific test helpers for
|
|
1
|
+
"""Admin-specific test helpers for the optional provider tests."""
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
@@ -42,7 +42,7 @@ class AdminResponse:
|
|
|
42
42
|
|
|
43
43
|
|
|
44
44
|
class AdminTestClient:
|
|
45
|
-
"""Test client with helpers for
|
|
45
|
+
"""Test client with helpers for the optional provider endpoints.
|
|
46
46
|
|
|
47
47
|
Wraps a Starlette ``TestClient`` (or any httpx-compatible sync client)
|
|
48
48
|
and provides assertion helpers and convenience methods for CRUD operations.
|
|
@@ -18,6 +18,8 @@ from typing import Any
|
|
|
18
18
|
|
|
19
19
|
import pytest
|
|
20
20
|
|
|
21
|
+
from quadkit.testing._lazy_exports import module_shipped
|
|
22
|
+
|
|
21
23
|
|
|
22
24
|
def get_public_members(module: Any) -> set[str]:
|
|
23
25
|
"""Get all public member names from a module (not starting with _)."""
|
|
@@ -45,6 +47,29 @@ def get_public_defined_members(module: Any) -> set[str]:
|
|
|
45
47
|
return defined
|
|
46
48
|
|
|
47
49
|
|
|
50
|
+
def optional_module_absent(subpackage: Any, export_name: str) -> bool:
|
|
51
|
+
"""Whether an export belongs to an optional module this installation omits.
|
|
52
|
+
|
|
53
|
+
A facade keeps the names of an absent optional module in ``__all__`` so the
|
|
54
|
+
declared surface stays truthful, and ``resolve_export`` answers an access
|
|
55
|
+
with ``AttributeError``. That is the designed outcome for a name whose
|
|
56
|
+
module is not part of the installation, so it is not an export failure.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
subpackage: Facade module holding ``_LAZY_IMPORTS`` and ``__all__``.
|
|
60
|
+
export_name: One name from that facade's ``__all__``.
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
Whether the name's module is an optional one that is not shipped here.
|
|
64
|
+
"""
|
|
65
|
+
table = getattr(subpackage, "_LAZY_IMPORTS", None)
|
|
66
|
+
entry = table.get(export_name) if table is not None else None
|
|
67
|
+
if entry is None:
|
|
68
|
+
return False
|
|
69
|
+
optional = getattr(subpackage, "_OPTIONAL_MODULES", frozenset())
|
|
70
|
+
return entry[0] in optional and not module_shipped(entry[0])
|
|
71
|
+
|
|
72
|
+
|
|
48
73
|
class TestComplianceSubpackageExports:
|
|
49
74
|
"""Test that compliance subpackage exports all public APIs."""
|
|
50
75
|
|
|
@@ -185,6 +210,8 @@ class TestFixturesSubpackageExports:
|
|
|
185
210
|
from quadkit.testing import fixtures
|
|
186
211
|
|
|
187
212
|
for export_name in fixtures.__all__:
|
|
213
|
+
if optional_module_absent(fixtures, export_name):
|
|
214
|
+
continue
|
|
188
215
|
assert hasattr(fixtures, export_name), (
|
|
189
216
|
f"fixtures.{export_name} not accessible but listed in __all__"
|
|
190
217
|
)
|
|
@@ -196,6 +223,8 @@ class TestFixturesSubpackageExports:
|
|
|
196
223
|
from quadkit.testing import fixtures
|
|
197
224
|
|
|
198
225
|
for export_name in fixtures.__all__:
|
|
226
|
+
if optional_module_absent(fixtures, export_name):
|
|
227
|
+
continue
|
|
199
228
|
obj = getattr(fixtures, export_name)
|
|
200
229
|
# Fixtures are callables, some might be test utilities
|
|
201
230
|
assert callable(obj) or inspect.isclass(obj), (
|
|
@@ -250,6 +279,8 @@ class TestAllSubpackagesConsistency:
|
|
|
250
279
|
|
|
251
280
|
for subpackage in [compliance, fixtures, memory]:
|
|
252
281
|
for export_name in subpackage.__all__:
|
|
282
|
+
if optional_module_absent(subpackage, export_name):
|
|
283
|
+
continue
|
|
253
284
|
try:
|
|
254
285
|
obj = getattr(subpackage, export_name)
|
|
255
286
|
assert obj is not None, (
|
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
*
|
|
2
|
-
!tests/
|
|
3
|
-
!tests/**
|
|
4
|
-
!README.md
|
|
5
|
-
!AGENTS.md
|
|
6
|
-
!DEVELOPMENT.md
|
|
7
|
-
!QUICKGUIDE.md
|
|
8
|
-
!MILESTONE*.md
|
|
9
|
-
!TESTS*.md
|
|
10
|
-
!CHANGELOG.md
|
|
11
|
-
!AUDIT*.md
|
|
12
|
-
!REF*.md
|
|
13
|
-
!AUDIT*.json
|
|
14
|
-
!LICENSE
|
|
15
|
-
!LICENSE-MIT.txt
|
|
16
|
-
!NOTICE
|
|
17
|
-
!TRADEMARK.md
|
|
18
|
-
!conftest.py
|
|
19
|
-
!CONTRIBUTING.md
|
|
20
|
-
!CODE_OF_CONDUCT.md
|
|
21
|
-
!SECURITY.md
|
|
22
|
-
!GOVERNANCE.md
|
|
23
|
-
!pyproject.toml
|
|
24
|
-
!uv.lock
|
|
25
|
-
!docker-compose.yml
|
|
26
|
-
!.env.example
|
|
27
|
-
!.env.full.example
|
|
28
|
-
!.importlinter
|
|
29
|
-
!.superpowers/
|
|
30
|
-
!.superpowers/**
|
|
31
|
-
!.gitattributes
|
|
32
|
-
!.editorconfig
|
|
33
|
-
!Makefile
|
|
34
|
-
!docker-compose.test.yml
|
|
35
|
-
!quadkit.yaml.example
|
|
36
|
-
!.github/
|
|
37
|
-
!.github/workflows/
|
|
38
|
-
!.github/workflows/**
|
|
39
|
-
!.github/dependabot.yml
|
|
40
|
-
!.devcontainer/
|
|
41
|
-
!.devcontainer/**
|
|
42
|
-
!tools/
|
|
43
|
-
!tools/**
|
|
44
|
-
!*example.yaml
|
|
45
|
-
|
|
46
|
-
# Quadkit Packages
|
|
47
|
-
!quadkit*/
|
|
48
|
-
!quadkit*/pyproject.toml
|
|
49
|
-
!quadkit*/CHANGELOG.md
|
|
50
|
-
!quadkit*/README.md
|
|
51
|
-
!quadkit*/alembic.ini
|
|
52
|
-
!quadkit*/mypy.ini
|
|
53
|
-
!quadkit*/*.yaml.example
|
|
54
|
-
!quadkit*/src/
|
|
55
|
-
!quadkit*/src/**
|
|
56
|
-
!quadkit*/docs/
|
|
57
|
-
!quadkit*/docs/**
|
|
58
|
-
!quadkit*/tests/
|
|
59
|
-
!quadkit*/tests/**
|
|
60
|
-
|
|
61
|
-
# Keep quadkit docs
|
|
62
|
-
!/docs/
|
|
63
|
-
!docs/**
|
|
64
|
-
|
|
65
|
-
# Session / cutover plans at the repo root
|
|
66
|
-
!plans/
|
|
67
|
-
!plans/**
|
|
68
|
-
|
|
69
|
-
# Keep example files for README examples
|
|
70
|
-
!/examples/
|
|
71
|
-
!/examples/**
|
|
72
|
-
|
|
73
|
-
# Re-ignore these AFTER negations (last match wins)
|
|
74
|
-
*.tape
|
|
75
|
-
examples/*/runs/
|
|
76
|
-
__pycache__/
|
|
77
|
-
*.pyc
|
|
78
|
-
*.pyo
|
|
79
|
-
*.egg-info/
|
|
80
|
-
dist/
|
|
81
|
-
build/
|
|
82
|
-
.eggs/
|
|
83
|
-
*.egg
|
|
84
|
-
.pytest_cache/
|
|
85
|
-
.mypy_cache/
|
|
86
|
-
.ruff_cache/
|
|
87
|
-
htmlcov/
|
|
88
|
-
.coverage
|
|
89
|
-
coverage.xml
|
|
90
|
-
test.db
|
|
91
|
-
!quadkit*/tests/fixtures/test.db
|
|
92
|
-
*.log
|
|
93
|
-
*.tmp
|
|
94
|
-
|
|
95
|
-
# Company-specific files (keep private, do not commit)
|
|
96
|
-
.company/
|
|
97
|
-
COMPANY_*.md
|
|
98
|
-
company-config/
|
|
99
|
-
internal-docs/
|
|
100
|
-
# Editor swap files
|
|
101
|
-
*.swp
|
|
102
|
-
|
|
103
|
-
!core/
|
|
104
|
-
!packages/
|
|
105
|
-
!core/quadkit*/
|
|
106
|
-
!packages/quadkit*/
|
|
107
|
-
!core/quadkit*/pyproject.toml
|
|
108
|
-
!packages/quadkit*/pyproject.toml
|
|
109
|
-
!core/quadkit*/CHANGELOG.md
|
|
110
|
-
!packages/quadkit*/CHANGELOG.md
|
|
111
|
-
!core/quadkit*/README.md
|
|
112
|
-
!packages/quadkit*/README.md
|
|
113
|
-
!core/quadkit*/alembic.ini
|
|
114
|
-
!packages/quadkit*/alembic.ini
|
|
115
|
-
!core/quadkit*/mypy.ini
|
|
116
|
-
!packages/quadkit*/mypy.ini
|
|
117
|
-
!core/quadkit*/*.yaml.example
|
|
118
|
-
!packages/quadkit*/*.yaml.example
|
|
119
|
-
!core/quadkit*/src/
|
|
120
|
-
!core/quadkit*/src/**
|
|
121
|
-
!packages/quadkit*/src/
|
|
122
|
-
!packages/quadkit*/src/**
|
|
123
|
-
!core/quadkit*/tests/
|
|
124
|
-
!core/quadkit*/tests/**
|
|
125
|
-
!packages/quadkit*/tests/
|
|
126
|
-
!packages/quadkit*/tests/**
|
|
127
|
-
!core/quadkit*/docs/
|
|
128
|
-
!core/quadkit*/docs/**
|
|
129
|
-
!packages/quadkit*/docs/
|
|
130
|
-
!packages/quadkit*/docs/**
|
|
131
|
-
|
|
132
|
-
# dev/
|
|
133
|
-
!dev/
|
|
134
|
-
!dev/**
|
|
135
|
-
|
|
136
|
-
# Admin dev playground (committed dev asset; local SQLite files stay ignored)
|
|
137
|
-
!packages/quadkit-admin/playground/
|
|
138
|
-
!packages/quadkit-admin/playground/serve.py
|
|
139
|
-
|
|
140
|
-
# gatewai apps
|
|
141
|
-
!apps/
|
|
142
|
-
!apps/**
|
|
143
|
-
!apps/gatewai/
|
|
144
|
-
!apps/gatewai/**
|
|
145
|
-
apps/**/node_modules/
|
|
146
|
-
apps/**/dist/
|
|
147
|
-
apps/**/__pycache__/
|
|
148
|
-
apps/**/*.pyc
|
|
149
|
-
apps/**/*.db
|
|
150
|
-
apps/**/*.db-wal
|
|
151
|
-
apps/**/*.db-shm
|
|
152
|
-
apps/**/.env
|
|
153
|
-
apps/**/.env.*
|
|
154
|
-
!apps/**/.env.example
|
|
155
|
-
!apps/**/.env.full.example
|
|
156
|
-
|
|
157
|
-
# Piccolina — nested app tracked in this monorepo (standalone .git removed).
|
|
158
|
-
# Keep marketing packages and deployment secrets out of the tree.
|
|
159
|
-
apps/piccolina/piccolina-marketing/
|
|
160
|
-
apps/piccolina/piccolina-marketing-plans/
|
|
161
|
-
apps/piccolina/secrets/
|
|
162
|
-
apps/piccolina/**/secrets/
|
|
163
|
-
apps/piccolina/**/*.pem
|
|
164
|
-
apps/piccolina/**/*.key
|
|
165
|
-
apps/piccolina/**/.venv/
|
|
166
|
-
apps/piccolina/**/node_modules/
|
|
167
|
-
apps/piccolina/**/__pycache__/
|
|
168
|
-
apps/piccolina/**/*.pyc
|
|
169
|
-
apps/piccolina/**/*.pbf
|
|
170
|
-
apps/piccolina/**/.open-next/
|
|
171
|
-
apps/piccolina/**/storage/
|
|
172
|
-
apps/piccolina/**/.deploy-host
|
|
173
|
-
|
|
174
|
-
# Re-exclude private content under the tiered paths.
|
|
175
|
-
# MUST come after the !...docs/** negations above — last match wins.
|
|
176
|
-
core/quadkit*/docs/plans/
|
|
177
|
-
packages/quadkit*/docs/plans/
|
|
178
|
-
core/quadkit*/docs/**/
|
|
179
|
-
packages/quadkit*/docs/**/
|
|
180
|
-
|
|
181
|
-
# Re-exclude tooling artifacts under the tiered paths
|
|
182
|
-
__pycache__/
|
|
183
|
-
*.pyc
|
|
184
|
-
*.pyo
|
|
185
|
-
*.egg-info/
|
|
186
|
-
.pytest_cache/
|
|
187
|
-
.mypy_cache/
|
|
188
|
-
.ruff_cache/
|
|
189
|
-
htmlcov/
|
|
190
|
-
.coverage
|
|
191
|
-
coverage.xml
|
|
192
|
-
test.db
|
|
193
|
-
*.tmp
|
|
194
|
-
*.log
|
|
195
|
-
!core/quadkit*/tests/fixtures/test.db
|
|
196
|
-
!packages/quadkit*/tests/fixtures/test.db
|
|
197
|
-
|
|
198
|
-
# Allow the generated example gifs to be tracked (README hero images).
|
|
199
|
-
!core/quadkit*/docs/gifs/
|
|
200
|
-
!core/quadkit*/docs/gifs/**
|
|
201
|
-
!packages/*/quadkit*/docs/gifs/
|
|
202
|
-
!packages/*/quadkit*/docs/gifs/**
|
|
203
|
-
examples/*/screenshot.png
|
|
204
|
-
!banner*
|
|
205
|
-
apps/quadkit-playground/**/node_modules/
|
|
206
|
-
apps/quadkit-playground/**/dist/
|
|
207
|
-
apps/quadkit-playground/**/__pycache__/
|
|
208
|
-
apps/quadkit-playground/**/*.pyc
|
|
209
|
-
apps/quadkit-playground/**/*.db
|
|
210
|
-
apps/quadkit-playground/**/*.db-wal
|
|
211
|
-
apps/quadkit-playground/**/*.db-shm
|
|
212
|
-
apps/quadkit-playground/projects/
|
|
213
|
-
apps/quadkit-playground/quadkit/
|
|
214
|
-
docs/superpowers/
|