aegis-stack 0.2.0rc2__py3-none-any.whl
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.
- aegis/__init__.py +5 -0
- aegis/__main__.py +51 -0
- aegis/cli/__init__.py +6 -0
- aegis/cli/callbacks.py +114 -0
- aegis/cli/interactive.py +611 -0
- aegis/cli/utils.py +70 -0
- aegis/cli/validators.py +34 -0
- aegis/commands/__init__.py +6 -0
- aegis/commands/add.py +353 -0
- aegis/commands/add_service.py +332 -0
- aegis/commands/components.py +35 -0
- aegis/commands/init.py +370 -0
- aegis/commands/remove.py +227 -0
- aegis/commands/services.py +52 -0
- aegis/commands/update.py +252 -0
- aegis/commands/version.py +12 -0
- aegis/config/__init__.py +1 -0
- aegis/config/shared_files.py +136 -0
- aegis/core/CLAUDE.md +377 -0
- aegis/core/__init__.py +6 -0
- aegis/core/component_files.py +228 -0
- aegis/core/component_utils.py +220 -0
- aegis/core/components.py +127 -0
- aegis/core/copier_manager.py +315 -0
- aegis/core/copier_updater.py +475 -0
- aegis/core/dependency_resolver.py +119 -0
- aegis/core/manual_updater.py +554 -0
- aegis/core/post_gen_tasks.py +547 -0
- aegis/core/service_resolver.py +261 -0
- aegis/core/services.py +157 -0
- aegis/core/template_generator.py +266 -0
- aegis/core/version_compatibility.py +259 -0
- aegis/templates/CLAUDE.md +591 -0
- aegis/templates/cookiecutter-aegis-project/cookiecutter.json +39 -0
- aegis/templates/cookiecutter-aegis-project/hooks/post_gen_project.py +214 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/.dockerignore +71 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/.env.example.j2 +130 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/.gitignore +131 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/Dockerfile +53 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/Makefile +236 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/README.md.j2 +196 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/alembic/alembic.ini.j2 +111 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/alembic/env.py.j2 +91 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/alembic/script.py.mako +25 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/alembic/versions/001_initial_auth.py.j2 +51 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/__init__.py +5 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/__init__.py +6 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/ai.py.j2 +700 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/ai_rendering.py +361 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/auth.py.j2 +253 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/health.py.j2 +419 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/load_test.py.j2 +656 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/main.py.j2 +65 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/marko_terminal_renderer.py +489 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/tasks.py.j2 +328 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/{% if cookiecutter.include_scheduler == /"yes/" %}tasks.py{% endif %}" +340 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/__init__.py +0 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/__init__.py +0 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/ai/__init__.py +8 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/ai/router.py +329 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/auth/__init__.py +1 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/auth/router.py +64 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/deps.py +58 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/health.py +163 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/models.py.j2 +280 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/routing.py.j2 +32 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/scheduler.py.j2 +121 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/worker.py.j2 +478 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/hooks.py +144 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/main.py +31 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/middleware/__init__.py +1 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/middleware/cors.py +20 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/shutdown/__init__.py +1 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/shutdown/cleanup.py +14 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/startup/__init__.py +1 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/startup/component_health.py.j2 +418 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/startup/database_init.py.j2 +83 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/__init__.py +5 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/controls/__init__.py +27 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/controls/table.py +78 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/controls/text.py +142 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/__init__.py.j2 +47 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/ai_card.py +287 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/auth_card.py +198 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/base_card.py +256 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/card_factory.py +227 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/card_utils.py +333 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/database_card.py +420 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/fastapi_card.py +328 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/flet_card.py +267 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/redis_card.py +322 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/scheduler_card.py +352 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/services_card.py +233 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/worker_card.py +684 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/main.py.j2 +653 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/theme.py +48 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/scheduler/__init__.py +1 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/scheduler/main.py.j2 +156 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/CLAUDE.md.j2 +213 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/__init__.py +6 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/constants.py.j2 +30 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/pools.py +97 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/queues/__init__.py +1 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/queues/load_test.py +55 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/queues/media.py +49 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/queues/system.py +44 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/registry.py +139 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/tasks/__init__.py +120 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/tasks/load_tasks.py +507 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/tasks/simple_system_tasks.py +33 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/tasks/system_tasks.py +281 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/core/config.py.j2 +178 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/core/constants.py +58 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/core/db.py.j2 +176 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/core/log.py +92 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/core/security.py +62 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/entrypoints/__init__.py +1 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/entrypoints/webserver.py +40 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/entrypoints/{% if cookiecutter.include_scheduler == /"yes/" %}scheduler.py{% endif %}" +21 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/integrations/__init__.py +0 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/integrations/main.py +62 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/models/__init__.py +1 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/models/user.py +44 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/py.typed +0 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/__init__.py +1 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/ai/__init__.py +8 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/ai/config.py +130 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/ai/conversation.py +213 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/ai/health.py +96 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/ai/models.py +229 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/ai/providers.py +370 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/ai/service.py +388 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/auth/__init__.py +1 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/auth/auth_service.py +41 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/auth/health.py +164 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/auth/user_service.py +83 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/backend/middleware_inspector.py.j2 +223 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/backend/models.py.j2 +70 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/backend/route_inspector.py.j2 +155 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/load_test.py +679 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/load_test_models.py +266 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/scheduler/__init__.py.j2 +21 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/scheduler/models.py.j2 +119 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/scheduler/scheduled_task_manager.py.j2 +273 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/scheduler/task_monitor.py.j2 +189 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/shared/__init__.py +15 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/shared/models.py +26 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/system/__init__.py +52 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/system/alerts.py +94 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/system/backup.py.j2 +119 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/system/health.py.j2 +1333 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/system/models.py +243 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/system/ui.py +52 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/assets/aegis-manifesto-dark.png +0 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/assets/aegis-manifesto-square-backup.png +0 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/assets/aegis-manifesto.png +0 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/.dockerignore +71 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/.env.example.j2 +64 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/.gitignore +131 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/Dockerfile +53 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/Makefile +211 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/README.md.j2 +172 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/docker-compose.yml.j2 +78 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/mkdocs.yml.j2 +62 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/pyproject.toml.j2 +120 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/uv.lock +1673 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/docker-compose.yml.j2 +200 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/docs/api.md +191 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/docs/components/scheduler.md +0 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/docs/components/scheduler.md.j2 +621 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/docs/development.md +215 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/docs/health.md +240 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/docs/javascripts/mermaid-config.js +62 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/docs/stylesheets/mermaid.css +95 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/mkdocs.yml.j2 +62 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/pyproject.toml.j2 +131 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/scripts/entrypoint.sh +87 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/scripts/entrypoint.sh.j2 +93 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/scripts/gen_docs.py +16 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/api/__init__.py +1 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/api/test_auth_endpoints.py.j2 +307 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/api/test_health_endpoints.py.j2 +262 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/api/test_scheduler_endpoints.py.j2 +214 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/api/test_worker_endpoints.py.j2 +165 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/cli/test_ai_rendering.py +427 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/cli/test_conversation_memory.py +465 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/components/test_scheduler.py +43 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/conftest.py.j2 +195 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/__init__.py +1 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/ai/__init__.py +1 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/ai/conftest.py +78 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/ai/test_health.py +157 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/ai/test_models.py +164 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/ai/test_service.py +198 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_auth_integration.py.j2 +528 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_component_integration.py.j2 +387 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_conversation_persistence.py +342 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_health_logic.py.j2 +663 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_load_test_models.py +619 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_load_test_service.py +603 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_middleware_inspector.py.j2 +248 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_scheduled_task_manager.py.j2 +292 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_system_service.py +98 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_worker_health_registration.py.j2 +257 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/test_core.py +49 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/uv.lock +1673 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/.copier-answers.yml.jinja +21 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/.dockerignore +71 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/.env.example.jinja +130 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/.gitignore +131 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/Dockerfile +53 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/Makefile.jinja +236 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/README.md.jinja +196 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/alembic/alembic.ini.jinja +111 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/alembic/env.py.jinja +91 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/alembic/script.py.mako +25 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/alembic/versions/001_initial_auth.py.jinja +51 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/__init__.py.jinja +5 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/__init__.py.jinja +6 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/ai.py.jinja +700 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/ai_rendering.py +360 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/auth.py.jinja +253 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/health.py.jinja +419 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/load_test.py.jinja +656 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/main.py.jinja +65 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/marko_terminal_renderer.py +489 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/tasks.py.jinja +328 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/__init__.py +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/__init__.py +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/ai/__init__.py +8 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/ai/router.py +329 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/auth/__init__.py +1 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/auth/router.py +64 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/deps.py +58 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/health.py.jinja +163 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/models.py.jinja +280 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/routing.py.jinja +32 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/scheduler.py.jinja +121 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/worker.py.jinja +478 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/hooks.py +144 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/main.py +31 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/middleware/__init__.py +1 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/middleware/cors.py +20 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/shutdown/__init__.py +1 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/shutdown/cleanup.py +14 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/startup/__init__.py +1 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/startup/component_health.py.jinja +418 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/startup/database_init.py.jinja +83 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/__init__.py +5 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/__init__.py +27 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/table.py +78 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/text.py +142 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/__init__.py.jinja +47 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/ai_card.py +287 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/auth_card.py +198 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/base_card.py +256 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/card_factory.py +227 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/card_utils.py +333 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/database_card.py +420 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/fastapi_card.py +328 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/flet_card.py +267 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/redis_card.py +322 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/scheduler_card.py +352 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/services_card.py +233 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/worker_card.py +684 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/main.py.jinja +653 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/theme.py +48 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/scheduler/__init__.py +1 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/scheduler/main.py.jinja +156 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/CLAUDE.md.jinja +213 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/__init__.py +6 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/constants.py.jinja +30 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/pools.py +97 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/queues/__init__.py +1 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/queues/load_test.py +55 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/queues/media.py +49 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/queues/system.py +44 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/registry.py +139 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/tasks/__init__.py +120 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/tasks/load_tasks.py +507 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/tasks/simple_system_tasks.py +33 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/tasks/system_tasks.py +281 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/core/config.py.jinja +178 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/core/constants.py +58 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/core/db.py.jinja +176 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/core/log.py +92 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/core/security.py +62 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/entrypoints/__init__.py +1 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/entrypoints/scheduler.py.jinja +21 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/entrypoints/webserver.py +39 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/integrations/__init__.py +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/integrations/main.py +61 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/models/__init__.py +1 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/models/user.py +44 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/py.typed +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/__init__.py +1 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/__init__.py +8 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/config.py +130 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/conversation.py +213 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/health.py +96 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/models.py +229 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/providers.py.jinja +370 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/service.py +387 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/auth/__init__.py +1 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/auth/auth_service.py +40 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/auth/health.py +162 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/auth/user_service.py +82 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/backend/middleware_inspector.py.jinja +223 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/backend/models.py.jinja +70 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/backend/route_inspector.py.jinja +155 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/load_test.py +678 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/load_test_models.py +265 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/scheduler/__init__.py.jinja +21 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/scheduler/models.py.jinja +119 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/scheduler/scheduled_task_manager.py.jinja +273 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/scheduler/task_monitor.py.jinja +189 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/shared/__init__.py +15 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/shared/models.py +26 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/__init__.py +52 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/alerts.py +94 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/backup.py.jinja +119 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/health.py.jinja +1333 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/models.py +243 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/ui.py +52 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57223!aegis-manifesto.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57224!aegis-manifesto-dark.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57225!aegis-manifesto-square-backup.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57533!aegis-manifesto.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57534!aegis-manifesto-dark.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57538!aegis-manifesto-square-backup.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57897!aegis-manifesto.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57898!aegis-manifesto-dark.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57904!aegis-manifesto-square-backup.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!58315!aegis-manifesto.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!58316!aegis-manifesto-dark.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!58324!aegis-manifesto-square-backup.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!58837!aegis-manifesto.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!58838!aegis-manifesto-dark.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!58849!aegis-manifesto-square-backup.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/aegis-manifesto-dark.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/aegis-manifesto-square-backup.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/aegis-manifesto.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/clean-validation/.env.example.jinja +64 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/clean-validation/README.md.jinja +172 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/clean-validation/docker-compose.yml.jinja +78 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/clean-validation/mkdocs.yml.jinja +62 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/clean-validation/pyproject.toml.jinja +120 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/docker-compose.yml.jinja +200 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/docs/api.md.jinja +191 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/docs/components/scheduler.md +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/docs/components/scheduler.md.jinja +621 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/docs/development.md.jinja +215 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/docs/health.md.jinja +240 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/docs/javascripts/mermaid-config.js +62 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/docs/stylesheets/mermaid.css +95 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/mkdocs.yml.jinja +62 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/pyproject.toml.jinja +131 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/scripts/entrypoint.sh +87 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/scripts/entrypoint.sh.jinja +93 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/scripts/gen_docs.py +16 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/__init__.py +1 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_auth_endpoints.py.jinja +307 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_health_endpoints.py.jinja +262 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_scheduler_endpoints.py.jinja +214 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_worker_endpoints.py.jinja +165 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/cli/test_ai_rendering.py +427 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/cli/test_conversation_memory.py +465 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/components/test_scheduler.py +43 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/conftest.py.jinja +195 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/__init__.py +1 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/__init__.py +1 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/conftest.py +78 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/test_health.py +157 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/test_models.py +164 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/test_service.py +198 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_auth_integration.py.jinja +528 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_component_integration.py.jinja +387 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_conversation_persistence.py +342 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_health_logic.py.jinja +663 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_load_test_models.py +619 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_load_test_service.py +603 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_middleware_inspector.py.jinja +248 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_scheduled_task_manager.py.jinja +292 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_system_service.py +98 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_worker_health_registration.py.jinja +257 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/test_core.py +49 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/uv.lock +1673 -0
- aegis_stack-0.2.0rc2.dist-info/METADATA +165 -0
- aegis_stack-0.2.0rc2.dist-info/RECORD +392 -0
- aegis_stack-0.2.0rc2.dist-info/WHEEL +4 -0
- aegis_stack-0.2.0rc2.dist-info/entry_points.txt +3 -0
- aegis_stack-0.2.0rc2.dist-info/licenses/LICENSE +21 -0
aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/Makefile
ADDED
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# clean-validation - Aegis Stack Project
|
|
2
|
+
# Developer-friendly commands for Docker workflow
|
|
3
|
+
|
|
4
|
+
#=============================================================================
|
|
5
|
+
# CORE DOCKER COMMANDS
|
|
6
|
+
#=============================================================================
|
|
7
|
+
|
|
8
|
+
build: ## Build all Docker images (safe, sequential)
|
|
9
|
+
@echo "🔨 Building Docker images..."
|
|
10
|
+
@docker compose build
|
|
11
|
+
|
|
12
|
+
serve: ## Run all services (assumes images are built)
|
|
13
|
+
@echo "🚀 Starting services... (Press Ctrl+C to stop)"
|
|
14
|
+
@docker compose --profile dev up
|
|
15
|
+
|
|
16
|
+
serve-bg: ## Run all services in background
|
|
17
|
+
@echo "🚀 Starting services in background..."
|
|
18
|
+
@docker compose --profile dev up -d
|
|
19
|
+
|
|
20
|
+
stop: ## Gracefully stop all services
|
|
21
|
+
@echo "⏹️ Stopping services..."
|
|
22
|
+
@docker compose --profile dev down
|
|
23
|
+
|
|
24
|
+
clean: ## Nuclear cleanup - remove containers, networks, and images
|
|
25
|
+
@echo "🧹 Nuclear cleanup - removing everything..."
|
|
26
|
+
@docker compose down --remove-orphans --volumes --rmi all 2>/dev/null || true
|
|
27
|
+
@docker system prune -f
|
|
28
|
+
|
|
29
|
+
#=============================================================================
|
|
30
|
+
# DEVELOPER WORKFLOW COMMANDS (the ones you'll actually use)
|
|
31
|
+
#=============================================================================
|
|
32
|
+
|
|
33
|
+
rebuild: build serve ## Build images and start services
|
|
34
|
+
|
|
35
|
+
refresh: clean build serve ## Nuclear reset - clean everything and rebuild
|
|
36
|
+
|
|
37
|
+
restart: stop serve ## Quick restart (no rebuild)
|
|
38
|
+
|
|
39
|
+
#=============================================================================
|
|
40
|
+
# DEBUGGING AND LOGS
|
|
41
|
+
#=============================================================================
|
|
42
|
+
|
|
43
|
+
logs: ## Follow logs from all services
|
|
44
|
+
@echo "📋 Following all service logs..."
|
|
45
|
+
@docker compose logs -f
|
|
46
|
+
|
|
47
|
+
logs-web: ## Follow webserver logs only
|
|
48
|
+
@echo "📋 Following webserver logs..."
|
|
49
|
+
@docker compose logs -f webserver
|
|
50
|
+
|
|
51
|
+
logs-worker: ## Follow worker logs only
|
|
52
|
+
@echo "📋 Following worker logs..."
|
|
53
|
+
@docker compose logs -f worker-system worker-load-test
|
|
54
|
+
|
|
55
|
+
logs-redis: ## Follow Redis logs only
|
|
56
|
+
@echo "📋 Following Redis logs..."
|
|
57
|
+
@docker compose logs -f redis
|
|
58
|
+
|
|
59
|
+
logs-scheduler: ## Follow scheduler logs only
|
|
60
|
+
@echo "📋 Following scheduler logs..."
|
|
61
|
+
@docker compose logs -f scheduler
|
|
62
|
+
|
|
63
|
+
shell: ## Open shell in webserver container
|
|
64
|
+
@echo "🐚 Opening shell in webserver container..."
|
|
65
|
+
@docker compose exec webserver /bin/bash
|
|
66
|
+
|
|
67
|
+
shell-worker: ## Open shell in worker container
|
|
68
|
+
@echo "🐚 Opening shell in worker container..."
|
|
69
|
+
@docker compose exec worker-system /bin/bash
|
|
70
|
+
|
|
71
|
+
ps: ## Show running containers
|
|
72
|
+
@echo "📊 Docker containers status:"
|
|
73
|
+
@docker compose ps
|
|
74
|
+
|
|
75
|
+
#=============================================================================
|
|
76
|
+
# REDIS DEBUGGING
|
|
77
|
+
#=============================================================================
|
|
78
|
+
|
|
79
|
+
redis-cli: ## Connect to Redis CLI
|
|
80
|
+
@echo "🔧 Connecting to Redis CLI..."
|
|
81
|
+
@docker compose exec redis redis-cli
|
|
82
|
+
|
|
83
|
+
redis-stats: ## Show Redis memory and stats
|
|
84
|
+
@echo "📊 Redis statistics:"
|
|
85
|
+
@docker compose exec redis redis-cli info memory
|
|
86
|
+
|
|
87
|
+
redis-keys: ## Show all Redis keys
|
|
88
|
+
@echo "🔑 Redis keys:"
|
|
89
|
+
@docker compose exec redis redis-cli keys "*"
|
|
90
|
+
|
|
91
|
+
redis-reset: ## Clear all Redis data
|
|
92
|
+
@echo "🔄 Clearing all Redis data..."
|
|
93
|
+
@docker compose exec redis redis-cli flushall
|
|
94
|
+
|
|
95
|
+
#=============================================================================
|
|
96
|
+
# HEALTH AND TESTING
|
|
97
|
+
#=============================================================================
|
|
98
|
+
|
|
99
|
+
health: ## Check system health status
|
|
100
|
+
@echo "🩺 Checking system health..."
|
|
101
|
+
@uv run clean-validation health status
|
|
102
|
+
|
|
103
|
+
health-detailed: ## Detailed system health information
|
|
104
|
+
@echo "🩺 Detailed system health..."
|
|
105
|
+
@uv run clean-validation health status --detailed
|
|
106
|
+
|
|
107
|
+
health-json: ## System health as JSON
|
|
108
|
+
@uv run clean-validation health status --json
|
|
109
|
+
|
|
110
|
+
health-probe: ## Health probe (exits 1 if unhealthy)
|
|
111
|
+
@uv run clean-validation health probe
|
|
112
|
+
|
|
113
|
+
test: ## Run tests locally
|
|
114
|
+
@echo "🧪 Running tests..."
|
|
115
|
+
@uv run pytest
|
|
116
|
+
|
|
117
|
+
test-verbose: ## Run tests with verbose output
|
|
118
|
+
@echo "🧪 Running tests (verbose)..."
|
|
119
|
+
@uv run pytest -v
|
|
120
|
+
|
|
121
|
+
#=============================================================================
|
|
122
|
+
# CODE QUALITY (local development tools)
|
|
123
|
+
#=============================================================================
|
|
124
|
+
|
|
125
|
+
lint: ## Check code style with ruff
|
|
126
|
+
@echo "🔍 Running linting..."
|
|
127
|
+
@uv run ruff check .
|
|
128
|
+
|
|
129
|
+
fix: ## Auto-fix linting and formatting issues
|
|
130
|
+
@echo "🔧 Auto-fixing code issues..."
|
|
131
|
+
@uv run ruff check . --fix
|
|
132
|
+
@uv run ruff format .
|
|
133
|
+
|
|
134
|
+
format: ## Format code with ruff
|
|
135
|
+
@echo "💄 Formatting code..."
|
|
136
|
+
@uv run ruff format .
|
|
137
|
+
|
|
138
|
+
typecheck: ## Run type checking with mypy
|
|
139
|
+
@echo "🔍 Running type checking..."
|
|
140
|
+
@uv run mypy app/ --no-error-summary
|
|
141
|
+
|
|
142
|
+
check: lint typecheck test ## Run all code quality checks
|
|
143
|
+
@echo "✅ All checks completed successfully!"
|
|
144
|
+
|
|
145
|
+
#=============================================================================
|
|
146
|
+
# PROJECT MANAGEMENT
|
|
147
|
+
#=============================================================================
|
|
148
|
+
|
|
149
|
+
install: ## Install/sync dependencies with uv
|
|
150
|
+
@echo "📦 Installing dependencies..."
|
|
151
|
+
@uv sync --all-extras
|
|
152
|
+
|
|
153
|
+
deps-update: ## Update dependencies
|
|
154
|
+
@echo "📦 Updating dependencies..."
|
|
155
|
+
@uv sync --upgrade
|
|
156
|
+
|
|
157
|
+
clean-cache: ## Clean Python cache files
|
|
158
|
+
@echo "🧹 Cleaning Python cache files..."
|
|
159
|
+
@find . -type d -name "__pycache__" -exec rm -rf {} +
|
|
160
|
+
@find . -type f -name "*.pyc" -delete
|
|
161
|
+
|
|
162
|
+
#=============================================================================
|
|
163
|
+
# DOCUMENTATION
|
|
164
|
+
#=============================================================================
|
|
165
|
+
|
|
166
|
+
docs-serve: ## Serve documentation locally (http://localhost:8001)
|
|
167
|
+
@echo "📚 Serving documentation on http://localhost:8001"
|
|
168
|
+
@uv run mkdocs serve --dev-addr 0.0.0.0:8001
|
|
169
|
+
|
|
170
|
+
docs-build: ## Build static documentation
|
|
171
|
+
@echo "📚 Building documentation..."
|
|
172
|
+
@uv run mkdocs build
|
|
173
|
+
|
|
174
|
+
#=============================================================================
|
|
175
|
+
# WORKER DEBUGGING (arq)
|
|
176
|
+
#=============================================================================
|
|
177
|
+
|
|
178
|
+
worker-test: ## Test workers in burst mode (process and exit)
|
|
179
|
+
@echo "🧪 Testing system worker in burst mode..."
|
|
180
|
+
@uv run python -m arq app.components.worker.queues.system.WorkerSettings --burst
|
|
181
|
+
|
|
182
|
+
#=============================================================================
|
|
183
|
+
# HELP AND INFO
|
|
184
|
+
#=============================================================================
|
|
185
|
+
|
|
186
|
+
status: ## Show current system status
|
|
187
|
+
@echo "📊 Current system status:"
|
|
188
|
+
@echo
|
|
189
|
+
@echo "🐳 Docker containers:"
|
|
190
|
+
@docker compose ps || echo "No containers running"
|
|
191
|
+
@echo
|
|
192
|
+
@echo "📦 Dependencies:"
|
|
193
|
+
@uv pip list | head -20 || echo "Dependencies not installed"
|
|
194
|
+
|
|
195
|
+
help: ## Show this help message
|
|
196
|
+
@echo "clean-validation development commands:"
|
|
197
|
+
@echo
|
|
198
|
+
@echo "🚀 WORKFLOW COMMANDS (start here):"
|
|
199
|
+
@echo " make refresh - Nuclear reset (clean + build + serve)"
|
|
200
|
+
@echo " make rebuild - Build and serve"
|
|
201
|
+
@echo " make restart - Quick restart"
|
|
202
|
+
@echo
|
|
203
|
+
@echo "🔧 CORE COMMANDS:"
|
|
204
|
+
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
|
|
205
|
+
@echo
|
|
206
|
+
@echo "💡 TIP: Use 'make refresh' when everything is broken!"
|
|
207
|
+
|
|
208
|
+
.PHONY: build serve stop clean rebuild refresh restart logs logs-web logs-worker logs-redis logs-scheduler shell shell-worker ps redis-cli redis-stats redis-keys redis-reset health health-detailed health-json health-probe test test-verbose lint fix format typecheck check install deps-update clean-cache docs-serve docs-build worker-test status help
|
|
209
|
+
|
|
210
|
+
# Default target - show help
|
|
211
|
+
.DEFAULT_GOAL := help
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# clean-validation 🛡️
|
|
2
|
+
|
|
3
|
+
A production-ready async Python application built with Aegis Stack
|
|
4
|
+
|
|
5
|
+
## Components
|
|
6
|
+
|
|
7
|
+
This Aegis Stack project includes the following components:
|
|
8
|
+
|
|
9
|
+
- **✅ Backend**: FastAPI-based async web server
|
|
10
|
+
- **✅ Frontend**: Flet-based Python UI framework
|
|
11
|
+
- **✅ Scheduler**: APScheduler-based async task scheduling
|
|
12
|
+
- **✅ Database**: SQLite database with SQLModel ORM
|
|
13
|
+
|
|
14
|
+
## Getting Started
|
|
15
|
+
|
|
16
|
+
### Prerequisites
|
|
17
|
+
|
|
18
|
+
- Python 3.11+
|
|
19
|
+
- [uv](https://docs.astral.sh/uv/) (recommended) or pip
|
|
20
|
+
|
|
21
|
+
### Installation
|
|
22
|
+
|
|
23
|
+
1. **Install dependencies:**
|
|
24
|
+
```bash
|
|
25
|
+
uv sync # Core dependencies only
|
|
26
|
+
# Or for development: uv sync --all-extras (includes testing, linting, docs)
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
2. **Activate virtual environment:**
|
|
30
|
+
```bash
|
|
31
|
+
source .venv/bin/activate
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
3. **Set up environment:**
|
|
35
|
+
```bash
|
|
36
|
+
cp .env.example .env
|
|
37
|
+
# Edit .env with your configuration
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
4. **Set up database:**
|
|
41
|
+
```bash
|
|
42
|
+
# Create data directory for SQLite database
|
|
43
|
+
mkdir -p data
|
|
44
|
+
|
|
45
|
+
# Database will be created automatically on first run
|
|
46
|
+
# Default location: data/app.db
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
5. **Run the application:**
|
|
50
|
+
```bash
|
|
51
|
+
make server
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
The application will be available at `http://127.0.0.1:8000`.
|
|
55
|
+
|
|
56
|
+
## Development
|
|
57
|
+
|
|
58
|
+
### Running Tests
|
|
59
|
+
```bash
|
|
60
|
+
make test
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Code Quality
|
|
64
|
+
```bash
|
|
65
|
+
make check # Run linting, type checking, and tests
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### CLI Commands
|
|
69
|
+
|
|
70
|
+
Your project gets its own CLI command **automatically installed** when first used - no setup required! 🎉
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
# Health monitoring (auto-installs CLI if needed)
|
|
74
|
+
make health # Basic health check
|
|
75
|
+
make health-detailed # Detailed component status
|
|
76
|
+
make health-json # JSON output for scripts
|
|
77
|
+
make health-quick # Quick healthy/unhealthy check
|
|
78
|
+
|
|
79
|
+
# Direct CLI usage (after first make command)
|
|
80
|
+
clean-validation health check # Basic health check
|
|
81
|
+
clean-validation health check --detailed # Detailed component status
|
|
82
|
+
clean-validation health check --json # JSON output for scripts
|
|
83
|
+
clean-validation health quick # Quick healthy/unhealthy check
|
|
84
|
+
|
|
85
|
+
# Explore all commands
|
|
86
|
+
clean-validation --help # See all available commands
|
|
87
|
+
clean-validation health --help # See health subcommand options
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**Environment Issues?** If CLI commands don't work:
|
|
91
|
+
```bash
|
|
92
|
+
# Ensure you're in the project's virtual environment
|
|
93
|
+
unset VIRTUAL_ENV # Clear Docker contamination
|
|
94
|
+
source .venv/bin/activate # Activate local venv
|
|
95
|
+
make health # This will auto-install CLI
|
|
96
|
+
# Or manually: make install-cli
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Documentation
|
|
100
|
+
```bash
|
|
101
|
+
make docs-serve # Serve docs at http://localhost:8001/clean-validation/
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Docker
|
|
105
|
+
|
|
106
|
+
### Development
|
|
107
|
+
```bash
|
|
108
|
+
docker compose --profile dev up
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Production
|
|
112
|
+
```bash
|
|
113
|
+
docker compose --profile prod up
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Configuration
|
|
117
|
+
|
|
118
|
+
### Database Settings
|
|
119
|
+
|
|
120
|
+
The database component uses SQLite with the following default configuration:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
# Environment variables (add to .env file)
|
|
124
|
+
DATABASE_URL=sqlite:///data/app.db # Database file location
|
|
125
|
+
DATABASE_ENGINE_ECHO=false # Enable SQL query logging
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Database Usage
|
|
129
|
+
|
|
130
|
+
```python
|
|
131
|
+
from app.core.db import db_session
|
|
132
|
+
from sqlmodel import SQLModel, Field, select
|
|
133
|
+
|
|
134
|
+
# Define a model
|
|
135
|
+
class User(SQLModel, table=True):
|
|
136
|
+
id: int | None = Field(default=None, primary_key=True)
|
|
137
|
+
name: str
|
|
138
|
+
email: str
|
|
139
|
+
|
|
140
|
+
# Use the database
|
|
141
|
+
with db_session() as session:
|
|
142
|
+
user = User(name="John Doe", email="john@example.com")
|
|
143
|
+
session.add(user)
|
|
144
|
+
# Auto-committed by context manager
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## Project Structure
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
clean-validation/
|
|
151
|
+
├── app/ # Application code
|
|
152
|
+
│ ├── components/ # Component implementations
|
|
153
|
+
│ │ ├── backend/ # FastAPI backend
|
|
154
|
+
│ │ └── frontend/ # Flet frontend
|
|
155
|
+
│ │ └── scheduler/ # APScheduler background tasks
|
|
156
|
+
│ ├── cli/ # CLI commands and health monitoring
|
|
157
|
+
│ ├── core/ # Core utilities
|
|
158
|
+
│ │ ├── config.py # Environment-dependent configuration
|
|
159
|
+
│ │ ├── constants.py # Immutable constants (12-Factor App)
|
|
160
|
+
│ │ ├── db.py # Database connection and session management
|
|
161
|
+
│ │ └── log.py # Structured logging
|
|
162
|
+
│ ├── entrypoints/ # Execution entry points
|
|
163
|
+
│ ├── integrations/ # App composition layer
|
|
164
|
+
├── tests/ # Test suite
|
|
165
|
+
├── docs/ # Documentation
|
|
166
|
+
├── docker-compose.yml # Docker services
|
|
167
|
+
└── pyproject.toml # Project configuration
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
Generated with [Aegis Stack](https://github.com/lbedner/aegis-stack) 🛡️
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
|
|
2
|
+
x-app: &app
|
|
3
|
+
image: ${AEGIS_STACK_TAG:-aegis-stack:latest}
|
|
4
|
+
build:
|
|
5
|
+
context: .
|
|
6
|
+
args:
|
|
7
|
+
- AEGIS_STACK_VERSION=${AEGIS_STACK_VERSION:-dev}
|
|
8
|
+
- PORT=${PORT:-8000}
|
|
9
|
+
env_file:
|
|
10
|
+
- ${AEGIS_STACK_ENV_FILE:-.env}
|
|
11
|
+
volumes:
|
|
12
|
+
- .:/code
|
|
13
|
+
# Exclude .venv to prevent host/container virtual environment conflicts
|
|
14
|
+
- /code/.venv
|
|
15
|
+
environment:
|
|
16
|
+
# Docker container marker for entrypoint script
|
|
17
|
+
- DOCKER_CONTAINER=1
|
|
18
|
+
- PORT=${PORT:-8000}
|
|
19
|
+
labels:
|
|
20
|
+
logging: "aegis-stack"
|
|
21
|
+
|
|
22
|
+
services:
|
|
23
|
+
# DEVELOPMENT PROFILE
|
|
24
|
+
|
|
25
|
+
webserver:
|
|
26
|
+
<<: *app
|
|
27
|
+
command:
|
|
28
|
+
- webserver
|
|
29
|
+
ports:
|
|
30
|
+
- "${PORT:-8000}:${PORT:-8000}"
|
|
31
|
+
healthcheck:
|
|
32
|
+
test: ["CMD", "curl", "-f", "http://localhost:${PORT:-8000}/health/"]
|
|
33
|
+
interval: 30s
|
|
34
|
+
timeout: 10s
|
|
35
|
+
retries: 3
|
|
36
|
+
start_period: 40s
|
|
37
|
+
restart: unless-stopped
|
|
38
|
+
deploy:
|
|
39
|
+
resources:
|
|
40
|
+
limits:
|
|
41
|
+
memory: 512M
|
|
42
|
+
cpus: '0.5'
|
|
43
|
+
reservations:
|
|
44
|
+
memory: 256M
|
|
45
|
+
cpus: '0.25'
|
|
46
|
+
profiles:
|
|
47
|
+
- dev
|
|
48
|
+
# Scheduler service (runs scheduler tasks independently)
|
|
49
|
+
scheduler:
|
|
50
|
+
<<: *app
|
|
51
|
+
command:
|
|
52
|
+
- scheduler
|
|
53
|
+
restart: unless-stopped
|
|
54
|
+
deploy:
|
|
55
|
+
resources:
|
|
56
|
+
limits:
|
|
57
|
+
memory: 256M
|
|
58
|
+
cpus: '0.25'
|
|
59
|
+
reservations:
|
|
60
|
+
memory: 128M
|
|
61
|
+
cpus: '0.1'
|
|
62
|
+
profiles:
|
|
63
|
+
- dev
|
|
64
|
+
- prod
|
|
65
|
+
|
|
66
|
+
# TEST PROFILE
|
|
67
|
+
|
|
68
|
+
test_runner:
|
|
69
|
+
<<: *app
|
|
70
|
+
command:
|
|
71
|
+
- test
|
|
72
|
+
env_file:
|
|
73
|
+
- ${AEGIS_STACK_ENV_FILE:-.env}
|
|
74
|
+
profiles:
|
|
75
|
+
- test
|
|
76
|
+
|
|
77
|
+
volumes:
|
|
78
|
+
aegis-data:
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# mkdocs.yml
|
|
2
|
+
site_name: clean-validation
|
|
3
|
+
site_description: A production-ready async Python application built with Aegis Stack
|
|
4
|
+
site_author: Your Name
|
|
5
|
+
site_url: https://your-username.github.io/clean-validation/
|
|
6
|
+
|
|
7
|
+
theme:
|
|
8
|
+
name: material
|
|
9
|
+
palette:
|
|
10
|
+
# Palette toggle for light vs dark mode
|
|
11
|
+
- scheme: default
|
|
12
|
+
toggle:
|
|
13
|
+
icon: material/brightness-7
|
|
14
|
+
name: Switch to dark mode
|
|
15
|
+
- scheme: slate
|
|
16
|
+
toggle:
|
|
17
|
+
icon: material/brightness-4
|
|
18
|
+
name: Switch to light mode
|
|
19
|
+
features:
|
|
20
|
+
- navigation.tabs
|
|
21
|
+
- navigation.top
|
|
22
|
+
- search.highlight
|
|
23
|
+
- search.suggest
|
|
24
|
+
- content.code.copy
|
|
25
|
+
|
|
26
|
+
# Navigation structure
|
|
27
|
+
nav:
|
|
28
|
+
- Home: index.md
|
|
29
|
+
- Development: development.md
|
|
30
|
+
- API Reference: api.md
|
|
31
|
+
- Health Monitoring: health.md
|
|
32
|
+
- Components:
|
|
33
|
+
- Scheduler: components/scheduler.md
|
|
34
|
+
|
|
35
|
+
# Plugins
|
|
36
|
+
plugins:
|
|
37
|
+
- gen-files:
|
|
38
|
+
scripts:
|
|
39
|
+
- scripts/gen_docs.py
|
|
40
|
+
- search
|
|
41
|
+
- mkdocstrings:
|
|
42
|
+
handlers:
|
|
43
|
+
python:
|
|
44
|
+
options:
|
|
45
|
+
show_root_heading: true
|
|
46
|
+
show_source: true
|
|
47
|
+
|
|
48
|
+
# Markdown extensions
|
|
49
|
+
markdown_extensions:
|
|
50
|
+
- pymdownx.superfences:
|
|
51
|
+
custom_fences:
|
|
52
|
+
- name: mermaid
|
|
53
|
+
class: mermaid
|
|
54
|
+
format: !!python/name:pymdownx.superfences.fence_code_format
|
|
55
|
+
|
|
56
|
+
# Additional configuration for Mermaid dark mode support
|
|
57
|
+
extra_javascript:
|
|
58
|
+
- https://unpkg.com/mermaid@10.6.0/dist/mermaid.min.js
|
|
59
|
+
- javascripts/mermaid-config.js
|
|
60
|
+
|
|
61
|
+
extra_css:
|
|
62
|
+
- stylesheets/mermaid.css
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "clean-validation"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "A production-ready async Python application built with Aegis Stack"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.11"
|
|
7
|
+
authors = [
|
|
8
|
+
{name = "Your Name", email = "your.email@example.com"}
|
|
9
|
+
]
|
|
10
|
+
|
|
11
|
+
dependencies = [
|
|
12
|
+
"fastapi==0.116.1",
|
|
13
|
+
"flet[all]==0.28.3",
|
|
14
|
+
"uvicorn==0.35.0",
|
|
15
|
+
"structlog==25.4.0",
|
|
16
|
+
"pydantic-settings==2.10.1",
|
|
17
|
+
"typer==0.16.0",
|
|
18
|
+
# Pin click to avoid yanked versions (typer dependency)
|
|
19
|
+
"click==8.2.1",
|
|
20
|
+
# Rich CLI formatting
|
|
21
|
+
"rich==14.1.0",
|
|
22
|
+
# HTTP client for CLI API calls
|
|
23
|
+
"httpx==0.28.1",
|
|
24
|
+
# System monitoring
|
|
25
|
+
"psutil==7.0.0",
|
|
26
|
+
"apscheduler==3.10.4",
|
|
27
|
+
"sqlmodel>=0.0.14",
|
|
28
|
+
"sqlalchemy>=2.0.0",
|
|
29
|
+
"aiosqlite>=0.19.0",
|
|
30
|
+
"greenlet>=1.1.0",
|
|
31
|
+
]
|
|
32
|
+
|
|
33
|
+
[project.scripts]
|
|
34
|
+
clean-validation = "app.cli.main:main"
|
|
35
|
+
|
|
36
|
+
[project.optional-dependencies]
|
|
37
|
+
dev = [
|
|
38
|
+
"pytest==8.4.1",
|
|
39
|
+
"pytest-asyncio==1.1.0",
|
|
40
|
+
"ruff==0.12.7",
|
|
41
|
+
"mypy==1.17.1",
|
|
42
|
+
"types-psutil==7.0.0.20250801",
|
|
43
|
+
"pre-commit==4.2.0",
|
|
44
|
+
"pip-audit==2.9.0",
|
|
45
|
+
]
|
|
46
|
+
docs = [
|
|
47
|
+
"mkdocs==1.6.1",
|
|
48
|
+
"mkdocs-material==9.6.16",
|
|
49
|
+
"mkdocstrings[python]==0.30.0",
|
|
50
|
+
"mkdocs-gen-files==0.5.0",
|
|
51
|
+
"pymdown-extensions==10.16.1",
|
|
52
|
+
]
|
|
53
|
+
|
|
54
|
+
[build-system]
|
|
55
|
+
requires = ["hatchling"]
|
|
56
|
+
build-backend = "hatchling.build"
|
|
57
|
+
|
|
58
|
+
[tool.hatch.build.targets.wheel]
|
|
59
|
+
packages = ["app"]
|
|
60
|
+
|
|
61
|
+
[tool.ruff]
|
|
62
|
+
line-length = 88
|
|
63
|
+
target-version = "py311"
|
|
64
|
+
|
|
65
|
+
[tool.ruff.lint]
|
|
66
|
+
select = ["E", "F", "I", "N", "W", "UP"] # Added UP for pyupgrade (modern Python syntax)
|
|
67
|
+
ignore = []
|
|
68
|
+
fixable = ["ALL"]
|
|
69
|
+
unfixable = []
|
|
70
|
+
|
|
71
|
+
[tool.ruff.format]
|
|
72
|
+
quote-style = "double"
|
|
73
|
+
indent-style = "space"
|
|
74
|
+
skip-magic-trailing-comma = false
|
|
75
|
+
line-ending = "auto"
|
|
76
|
+
|
|
77
|
+
[tool.ruff.lint.isort]
|
|
78
|
+
force-single-line = false
|
|
79
|
+
force-sort-within-sections = true
|
|
80
|
+
known-first-party = ["app"]
|
|
81
|
+
|
|
82
|
+
[tool.mypy]
|
|
83
|
+
python_version = "3.11"
|
|
84
|
+
strict = true
|
|
85
|
+
plugins = ["pydantic.mypy"]
|
|
86
|
+
|
|
87
|
+
[[tool.mypy.overrides]]
|
|
88
|
+
module = "flet.*"
|
|
89
|
+
ignore_missing_imports = true
|
|
90
|
+
|
|
91
|
+
[[tool.mypy.overrides]]
|
|
92
|
+
module = "apscheduler.*"
|
|
93
|
+
ignore_missing_imports = true
|
|
94
|
+
|
|
95
|
+
[[tool.mypy.overrides]]
|
|
96
|
+
module = "sqlmodel.*"
|
|
97
|
+
ignore_missing_imports = true
|
|
98
|
+
|
|
99
|
+
# Ignore imports for future components that may not exist yet
|
|
100
|
+
[[tool.mypy.overrides]]
|
|
101
|
+
module = "app.components.database.main"
|
|
102
|
+
ignore_missing_imports = true
|
|
103
|
+
|
|
104
|
+
[[tool.mypy.overrides]]
|
|
105
|
+
module = "app.components.cache.main"
|
|
106
|
+
ignore_missing_imports = true
|
|
107
|
+
|
|
108
|
+
[[tool.mypy.overrides]]
|
|
109
|
+
module = "app.components.worker.*"
|
|
110
|
+
ignore_missing_imports = true
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
[tool.pytest.ini_options]
|
|
114
|
+
asyncio_mode = "auto"
|
|
115
|
+
testpaths = ["tests"]
|
|
116
|
+
|
|
117
|
+
[dependency-groups]
|
|
118
|
+
dev = [
|
|
119
|
+
"httpx>=0.28.1",
|
|
120
|
+
]
|