diff --git a/.gitignore b/.gitignore index d49fa9905..733b192c2 100755 --- a/.gitignore +++ b/.gitignore @@ -65,3 +65,4 @@ dashboards backend/mappings.db +backend/tasks.db diff --git a/backend/src/api/routes/mappings.py b/backend/src/api/routes/mappings.py index f6976a63c..60b10c05e 100644 --- a/backend/src/api/routes/mappings.py +++ b/backend/src/api/routes/mappings.py @@ -13,6 +13,7 @@ from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from typing import List, Optional +from ...core.logger import belief_scope from ...dependencies import get_config_manager from ...core.database import get_db from ...models.mapping import DatabaseMapping diff --git a/backend/src/api/routes/migration.py b/backend/src/api/routes/migration.py index 9e0fcf4b1..12e050cae 100644 --- a/backend/src/api/routes/migration.py +++ b/backend/src/api/routes/migration.py @@ -10,6 +10,7 @@ from typing import List, Dict from ...dependencies import get_config_manager, get_task_manager from ...models.dashboard import DashboardMetadata, DashboardSelection from ...core.superset_client import SupersetClient +from ...core.logger import belief_scope router = APIRouter(prefix="/api", tags=["migration"]) @@ -21,7 +22,8 @@ router = APIRouter(prefix="/api", tags=["migration"]) # @RETURN: List[DashboardMetadata] @router.get("/environments/{env_id}/dashboards", response_model=List[DashboardMetadata]) async def get_dashboards(env_id: str, config_manager=Depends(get_config_manager)): - environments = config_manager.get_environments() + with belief_scope("get_dashboards", f"env_id={env_id}"): + environments = config_manager.get_environments() env = next((e for e in environments if e.id == env_id), None) if not env: raise HTTPException(status_code=404, detail="Environment not found") @@ -39,8 +41,9 @@ async def get_dashboards(env_id: str, config_manager=Depends(get_config_manager) # @RETURN: Dict - {"task_id": str, "message": str} @router.post("/migration/execute") async def execute_migration(selection: DashboardSelection, config_manager=Depends(get_config_manager), task_manager=Depends(get_task_manager)): - # Validate environments exist - environments = config_manager.get_environments() + with belief_scope("execute_migration"): + # Validate environments exist + environments = config_manager.get_environments() env_ids = {e.id for e in environments} if selection.source_env_id not in env_ids or selection.target_env_id not in env_ids: raise HTTPException(status_code=400, detail="Invalid source or target environment") diff --git a/frontend/index.html b/frontend/index.html deleted file mode 100755 index 7d082ee41..000000000 --- a/frontend/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - frontend - - -
- - - diff --git a/frontend/jsconfig.json b/frontend/jsconfig.json index c7a0b107a..ed7b5f1f9 100755 --- a/frontend/jsconfig.json +++ b/frontend/jsconfig.json @@ -1,4 +1,5 @@ { + "extends": "./.svelte-kit/tsconfig.json", "compilerOptions": { "moduleResolution": "bundler", "target": "ESNext", diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte deleted file mode 100755 index b733b61a1..000000000 --- a/frontend/src/App.svelte +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - -
-
- - -
- -
- {#if $currentPage === 'settings'} - - {:else if $selectedTask} - - - {:else if $selectedPlugin} -

{$selectedPlugin.name}

- - - {:else} - - {/if} -
-
- - - diff --git a/frontend/src/main.js b/frontend/src/main.js deleted file mode 100755 index 2afa121e3..000000000 --- a/frontend/src/main.js +++ /dev/null @@ -1,18 +0,0 @@ -// [DEF:main:Module] -// @SEMANTICS: entrypoint, svelte, init -// @PURPOSE: Entry point for the Svelte application. -// @LAYER: UI-Entry - -import './app.css' -import App from './App.svelte' - -// [DEF:app_instance:Data] -// @PURPOSE: Initialized Svelte app instance. -const app = new App({ - target: document.getElementById('app'), - props: {} -}) -// [/DEF:app_instance:Data] - -export default app -// [/DEF:main:Module] diff --git a/semantics/reports/semantic_report_20260122_175153.md b/semantics/reports/semantic_report_20260122_175153.md new file mode 100644 index 000000000..a339a30c0 --- /dev/null +++ b/semantics/reports/semantic_report_20260122_175153.md @@ -0,0 +1,103 @@ +# Semantic Compliance Report + +**Generated At:** 2026-01-22T17:51:53.374174 +**Global Compliance Score:** 97.7% +**Scanned Files:** 80 + +## Critical Parsing Errors +- 🔴 backend/delete_running_tasks.py:8 Function 'delete_running_tasks' implementation found without matching [DEF:delete_running_tasks:Function] contract. +- 🔴 backend/src/core/logger.py:200 Function 'decorator' implementation found without matching [DEF:decorator:Function] contract. +- 🔴 backend/src/core/logger.py:201 Function 'wrapper' implementation found without matching [DEF:wrapper:Function] contract. +- 🔴 backend/src/core/utils/fileio.py:486 Mismatched closing anchor. Expected [/DEF:InvalidZipFormatError:Class], found [/DEF:backend.core.utils.fileio:Module]. +- 🔴 backend/src/core/utils/network.py:24 Function '__init__' implementation found without matching [DEF:__init__:Function] contract. +- 🔴 backend/src/core/utils/network.py:30 Function '__init__' implementation found without matching [DEF:__init__:Function] contract. +- 🔴 backend/src/core/utils/network.py:35 Function '__init__' implementation found without matching [DEF:__init__:Function] contract. +- 🔴 backend/src/core/utils/network.py:40 Function '__init__' implementation found without matching [DEF:__init__:Function] contract. +- 🔴 backend/src/core/utils/network.py:45 Function '__init__' implementation found without matching [DEF:__init__:Function] contract. +- 🔴 backend/src/core/utils/network.py:286 Mismatched closing anchor. Expected [/DEF:NetworkError:Class], found [/DEF:backend.core.utils.network:Module]. +- 🔴 backend/tests/test_models.py:21 Mismatched closing anchor. Expected [/DEF:test_environment_model:Function], found [/DEF:test_superset_config_url_normalization:Function]. +- 🔴 backend/tests/test_models.py:23 Mismatched closing anchor. Expected [/DEF:test_environment_model:Function], found [/DEF:test_superset_config_invalid_url:Function]. + +## File Compliance Status +| File | Score | Issues | +|------|-------|--------| +| backend/tests/test_models.py | 🔴 0% | [test_environment_model] Unclosed Anchor at end of file (started line 5)
[test_environment_model] Unclosed Anchor: [DEF:test_environment_model:Function] started at line 5 | +| backend/src/core/superset_client.py | 🟡 67% | [headers] Missing Mandatory Tag: @PRE
[headers] Missing Mandatory Tag: @POST
[headers] Missing Mandatory Tag: @PRE
[headers] Missing Mandatory Tag: @POST
[headers] Missing Mandatory Tag: @PRE
[headers] Missing Mandatory Tag: @POST
[get_dashboards] Missing Mandatory Tag: @PRE
[get_dashboards] Missing Mandatory Tag: @POST
[get_dashboards] Missing Mandatory Tag: @PRE
[get_dashboards] Missing Mandatory Tag: @POST
[get_dashboards] Missing Mandatory Tag: @PRE
[get_dashboards] Missing Mandatory Tag: @POST
[get_dashboards_summary] Missing Mandatory Tag: @PRE
[get_dashboards_summary] Missing Mandatory Tag: @POST
[get_dashboards_summary] Missing Mandatory Tag: @PRE
[get_dashboards_summary] Missing Mandatory Tag: @POST
[get_dashboards_summary] Missing Mandatory Tag: @PRE
[get_dashboards_summary] Missing Mandatory Tag: @POST
[export_dashboard] Missing Mandatory Tag: @PRE
[export_dashboard] Missing Mandatory Tag: @POST
[export_dashboard] Missing Mandatory Tag: @PRE
[export_dashboard] Missing Mandatory Tag: @POST
[export_dashboard] Missing Mandatory Tag: @PRE
[export_dashboard] Missing Mandatory Tag: @POST
[import_dashboard] Missing Mandatory Tag: @PRE
[import_dashboard] Missing Mandatory Tag: @POST
[import_dashboard] Missing Mandatory Tag: @PRE
[import_dashboard] Missing Mandatory Tag: @POST
[import_dashboard] Missing Mandatory Tag: @PRE
[import_dashboard] Missing Mandatory Tag: @POST
[delete_dashboard] Missing Mandatory Tag: @PRE
[delete_dashboard] Missing Mandatory Tag: @POST
[delete_dashboard] Missing Mandatory Tag: @PRE
[delete_dashboard] Missing Mandatory Tag: @POST
[delete_dashboard] Missing Mandatory Tag: @PRE
[delete_dashboard] Missing Mandatory Tag: @POST
[get_datasets] Missing Mandatory Tag: @PRE
[get_datasets] Missing Mandatory Tag: @POST
[get_datasets] Missing Mandatory Tag: @PRE
[get_datasets] Missing Mandatory Tag: @POST
[get_datasets] Missing Mandatory Tag: @PRE
[get_datasets] Missing Mandatory Tag: @POST
[get_dataset] Missing Mandatory Tag: @PRE
[get_dataset] Missing Mandatory Tag: @POST
[get_dataset] Missing Mandatory Tag: @PRE
[get_dataset] Missing Mandatory Tag: @POST
[get_dataset] Missing Mandatory Tag: @PRE
[get_dataset] Missing Mandatory Tag: @POST
[update_dataset] Missing Mandatory Tag: @PRE
[update_dataset] Missing Mandatory Tag: @POST
[update_dataset] Missing Mandatory Tag: @PRE
[update_dataset] Missing Mandatory Tag: @POST
[update_dataset] Missing Mandatory Tag: @PRE
[update_dataset] Missing Mandatory Tag: @POST
[get_databases] Missing Mandatory Tag: @PRE
[get_databases] Missing Mandatory Tag: @POST
[get_databases] Missing Mandatory Tag: @PRE
[get_databases] Missing Mandatory Tag: @POST
[get_databases] Missing Mandatory Tag: @PRE
[get_databases] Missing Mandatory Tag: @POST
[get_database] Missing Mandatory Tag: @PRE
[get_database] Missing Mandatory Tag: @POST
[get_database] Missing Mandatory Tag: @PRE
[get_database] Missing Mandatory Tag: @POST
[get_database] Missing Mandatory Tag: @PRE
[get_database] Missing Mandatory Tag: @POST
[get_databases_summary] Missing Mandatory Tag: @PRE
[get_databases_summary] Missing Mandatory Tag: @POST
[get_databases_summary] Missing Mandatory Tag: @PRE
[get_databases_summary] Missing Mandatory Tag: @POST
[get_databases_summary] Missing Mandatory Tag: @PRE
[get_databases_summary] Missing Mandatory Tag: @POST
[get_database_by_uuid] Missing Mandatory Tag: @PRE
[get_database_by_uuid] Missing Mandatory Tag: @POST
[get_database_by_uuid] Missing Mandatory Tag: @PRE
[get_database_by_uuid] Missing Mandatory Tag: @POST
[get_database_by_uuid] Missing Mandatory Tag: @PRE
[get_database_by_uuid] Missing Mandatory Tag: @POST
[_resolve_target_id_for_delete] Missing Mandatory Tag: @PURPOSE
[_resolve_target_id_for_delete] Missing Mandatory Tag: @PRE
[_resolve_target_id_for_delete] Missing Mandatory Tag: @POST
[_resolve_target_id_for_delete] Missing Mandatory Tag: @PURPOSE
[_resolve_target_id_for_delete] Missing Mandatory Tag: @PRE
[_resolve_target_id_for_delete] Missing Mandatory Tag: @POST
[_resolve_target_id_for_delete] Missing Mandatory Tag: @PURPOSE
[_resolve_target_id_for_delete] Missing Mandatory Tag: @PRE
[_resolve_target_id_for_delete] Missing Mandatory Tag: @POST
[_do_import] Missing Mandatory Tag: @PURPOSE
[_do_import] Missing Mandatory Tag: @PRE
[_do_import] Missing Mandatory Tag: @POST
[_do_import] Missing Mandatory Tag: @PURPOSE
[_do_import] Missing Mandatory Tag: @PRE
[_do_import] Missing Mandatory Tag: @POST
[_do_import] Missing Mandatory Tag: @PURPOSE
[_do_import] Missing Mandatory Tag: @PRE
[_do_import] Missing Mandatory Tag: @POST
[_validate_export_response] Missing Mandatory Tag: @PURPOSE
[_validate_export_response] Missing Mandatory Tag: @PRE
[_validate_export_response] Missing Mandatory Tag: @POST
[_validate_export_response] Missing Mandatory Tag: @PURPOSE
[_validate_export_response] Missing Mandatory Tag: @PRE
[_validate_export_response] Missing Mandatory Tag: @POST
[_validate_export_response] Missing Mandatory Tag: @PURPOSE
[_validate_export_response] Missing Mandatory Tag: @PRE
[_validate_export_response] Missing Mandatory Tag: @POST
[_resolve_export_filename] Missing Mandatory Tag: @PURPOSE
[_resolve_export_filename] Missing Mandatory Tag: @PRE
[_resolve_export_filename] Missing Mandatory Tag: @POST
[_resolve_export_filename] Missing Mandatory Tag: @PURPOSE
[_resolve_export_filename] Missing Mandatory Tag: @PRE
[_resolve_export_filename] Missing Mandatory Tag: @POST
[_resolve_export_filename] Missing Mandatory Tag: @PURPOSE
[_resolve_export_filename] Missing Mandatory Tag: @PRE
[_resolve_export_filename] Missing Mandatory Tag: @POST
[_validate_query_params] Missing Mandatory Tag: @PURPOSE
[_validate_query_params] Missing Mandatory Tag: @PRE
[_validate_query_params] Missing Mandatory Tag: @POST
[_validate_query_params] Missing Mandatory Tag: @PURPOSE
[_validate_query_params] Missing Mandatory Tag: @PRE
[_validate_query_params] Missing Mandatory Tag: @POST
[_validate_query_params] Missing Mandatory Tag: @PURPOSE
[_validate_query_params] Missing Mandatory Tag: @PRE
[_validate_query_params] Missing Mandatory Tag: @POST
[_fetch_total_object_count] Missing Mandatory Tag: @PURPOSE
[_fetch_total_object_count] Missing Mandatory Tag: @PRE
[_fetch_total_object_count] Missing Mandatory Tag: @POST
[_fetch_total_object_count] Missing Mandatory Tag: @PURPOSE
[_fetch_total_object_count] Missing Mandatory Tag: @PRE
[_fetch_total_object_count] Missing Mandatory Tag: @POST
[_fetch_total_object_count] Missing Mandatory Tag: @PURPOSE
[_fetch_total_object_count] Missing Mandatory Tag: @PRE
[_fetch_total_object_count] Missing Mandatory Tag: @POST
[_fetch_all_pages] Missing Mandatory Tag: @PURPOSE
[_fetch_all_pages] Missing Mandatory Tag: @PRE
[_fetch_all_pages] Missing Mandatory Tag: @POST
[_fetch_all_pages] Missing Mandatory Tag: @PURPOSE
[_fetch_all_pages] Missing Mandatory Tag: @PRE
[_fetch_all_pages] Missing Mandatory Tag: @POST
[_fetch_all_pages] Missing Mandatory Tag: @PURPOSE
[_fetch_all_pages] Missing Mandatory Tag: @PRE
[_fetch_all_pages] Missing Mandatory Tag: @POST
[_validate_import_file] Missing Mandatory Tag: @PURPOSE
[_validate_import_file] Missing Mandatory Tag: @PRE
[_validate_import_file] Missing Mandatory Tag: @POST
[_validate_import_file] Missing Mandatory Tag: @PURPOSE
[_validate_import_file] Missing Mandatory Tag: @PRE
[_validate_import_file] Missing Mandatory Tag: @POST
[_validate_import_file] Missing Mandatory Tag: @PURPOSE
[_validate_import_file] Missing Mandatory Tag: @PRE
[_validate_import_file] Missing Mandatory Tag: @POST | +| backend/src/core/utils/network.py | 🟡 67% | [backend.core.utils.network] Unclosed Anchor at end of file (started line 1)
[backend.core.utils.network] Unclosed Anchor: [DEF:backend.core.utils.network:Module] started at line 1
[SupersetAPIError] Unclosed Anchor at end of file (started line 22)
[SupersetAPIError] Unclosed Anchor: [DEF:SupersetAPIError:Class] started at line 22
[SupersetAPIError] Missing Mandatory Tag: @PURPOSE
[SupersetAPIError] Unclosed Anchor: [DEF:SupersetAPIError:Class] started at line 22
[SupersetAPIError] Missing Mandatory Tag: @PURPOSE
[AuthenticationError] Unclosed Anchor at end of file (started line 28)
[AuthenticationError] Unclosed Anchor: [DEF:AuthenticationError:Class] started at line 28
[AuthenticationError] Missing Mandatory Tag: @PURPOSE
[AuthenticationError] Unclosed Anchor: [DEF:AuthenticationError:Class] started at line 28
[AuthenticationError] Missing Mandatory Tag: @PURPOSE
[AuthenticationError] Unclosed Anchor: [DEF:AuthenticationError:Class] started at line 28
[AuthenticationError] Missing Mandatory Tag: @PURPOSE
[PermissionDeniedError] Unclosed Anchor at end of file (started line 33)
[PermissionDeniedError] Unclosed Anchor: [DEF:PermissionDeniedError:Class] started at line 33
[PermissionDeniedError] Missing Mandatory Tag: @PURPOSE
[PermissionDeniedError] Unclosed Anchor: [DEF:PermissionDeniedError:Class] started at line 33
[PermissionDeniedError] Missing Mandatory Tag: @PURPOSE
[PermissionDeniedError] Unclosed Anchor: [DEF:PermissionDeniedError:Class] started at line 33
[PermissionDeniedError] Missing Mandatory Tag: @PURPOSE
[PermissionDeniedError] Unclosed Anchor: [DEF:PermissionDeniedError:Class] started at line 33
[PermissionDeniedError] Missing Mandatory Tag: @PURPOSE
[DashboardNotFoundError] Unclosed Anchor at end of file (started line 38)
[DashboardNotFoundError] Unclosed Anchor: [DEF:DashboardNotFoundError:Class] started at line 38
[DashboardNotFoundError] Missing Mandatory Tag: @PURPOSE
[DashboardNotFoundError] Unclosed Anchor: [DEF:DashboardNotFoundError:Class] started at line 38
[DashboardNotFoundError] Missing Mandatory Tag: @PURPOSE
[DashboardNotFoundError] Unclosed Anchor: [DEF:DashboardNotFoundError:Class] started at line 38
[DashboardNotFoundError] Missing Mandatory Tag: @PURPOSE
[DashboardNotFoundError] Unclosed Anchor: [DEF:DashboardNotFoundError:Class] started at line 38
[DashboardNotFoundError] Missing Mandatory Tag: @PURPOSE
[DashboardNotFoundError] Unclosed Anchor: [DEF:DashboardNotFoundError:Class] started at line 38
[DashboardNotFoundError] Missing Mandatory Tag: @PURPOSE
[NetworkError] Unclosed Anchor at end of file (started line 43)
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 43
[NetworkError] Missing Mandatory Tag: @PURPOSE
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 43
[NetworkError] Missing Mandatory Tag: @PURPOSE
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 43
[NetworkError] Missing Mandatory Tag: @PURPOSE
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 43
[NetworkError] Missing Mandatory Tag: @PURPOSE
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 43
[NetworkError] Missing Mandatory Tag: @PURPOSE
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 43
[NetworkError] Missing Mandatory Tag: @PURPOSE | +| backend/src/core/utils/fileio.py | 🟡 88% | [backend.core.utils.fileio] Unclosed Anchor at end of file (started line 1)
[backend.core.utils.fileio] Unclosed Anchor: [DEF:backend.core.utils.fileio:Module] started at line 1
[InvalidZipFormatError] Unclosed Anchor at end of file (started line 26)
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 26
[InvalidZipFormatError] Missing Mandatory Tag: @PURPOSE
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 26
[InvalidZipFormatError] Missing Mandatory Tag: @PURPOSE
[replacer] Missing Belief State Logging: Function should use belief_scope context manager.
[replacer] Missing Belief State Logging: Function should use belief_scope context manager.
[replacer] Missing Belief State Logging: Function should use belief_scope context manager.
[replacer] Missing Belief State Logging: Function should use belief_scope context manager. | +| backend/src/core/logger.py | 🟡 97% | [format] Missing Belief State Logging: Function should use belief_scope context manager.
[format] Missing Belief State Logging: Function should use belief_scope context manager.
[format] Missing Belief State Logging: Function should use belief_scope context manager.
[belief_scope] Missing Belief State Logging: Function should use belief_scope context manager.
[belief_scope] Missing Belief State Logging: Function should use belief_scope context manager.
[configure_logger] Missing Belief State Logging: Function should use belief_scope context manager.
[configure_logger] Missing Belief State Logging: Function should use belief_scope context manager.
[__init__] Missing Belief State Logging: Function should use belief_scope context manager.
[__init__] Missing Belief State Logging: Function should use belief_scope context manager.
[__init__] Missing Belief State Logging: Function should use belief_scope context manager.
[emit] Missing Belief State Logging: Function should use belief_scope context manager.
[emit] Missing Belief State Logging: Function should use belief_scope context manager.
[emit] Missing Belief State Logging: Function should use belief_scope context manager.
[get_recent_logs] Missing Belief State Logging: Function should use belief_scope context manager.
[get_recent_logs] Missing Belief State Logging: Function should use belief_scope context manager.
[get_recent_logs] Missing Belief State Logging: Function should use belief_scope context manager.
[believed] Missing Mandatory Tag: @PRE
[believed] Missing Mandatory Tag: @POST
[believed] Missing Mandatory Tag: @PRE
[believed] Missing Mandatory Tag: @POST
[believed] Missing Mandatory Tag: @PRE
[believed] Missing Mandatory Tag: @POST | +| backend/src/core/utils/dataset_mapper.py | 🟡 97% | [__init__] Missing Mandatory Tag: @PRE
[__init__] Missing Belief State Logging: Function should use belief_scope context manager.
[__init__] Missing Mandatory Tag: @PRE
[__init__] Missing Belief State Logging: Function should use belief_scope context manager.
[__init__] Missing Mandatory Tag: @PRE
[__init__] Missing Belief State Logging: Function should use belief_scope context manager. | +| generate_semantic_map.py | 🟢 100% | [__init__] Missing Belief State Logging: Function should use belief_scope context manager.
[__init__] Missing Belief State Logging: Function should use belief_scope context manager.
[__enter__] Missing Belief State Logging: Function should use belief_scope context manager.
[__enter__] Missing Belief State Logging: Function should use belief_scope context manager.
[__exit__] Missing Belief State Logging: Function should use belief_scope context manager.
[__exit__] Missing Belief State Logging: Function should use belief_scope context manager. | +| frontend/src/main.js | 🟢 100% | OK | +| frontend/src/App.svelte | 🟢 100% | OK | +| frontend/src/lib/stores.js | 🟢 100% | OK | +| frontend/src/lib/toasts.js | 🟢 100% | OK | +| frontend/src/lib/api.js | 🟢 100% | OK | +| frontend/src/routes/+page.svelte | 🟢 100% | OK | +| frontend/src/routes/+page.ts | 🟢 100% | OK | +| frontend/src/routes/tasks/+page.svelte | 🟢 100% | OK | +| frontend/src/routes/migration/+page.svelte | 🟢 100% | OK | +| frontend/src/routes/migration/mappings/+page.svelte | 🟢 100% | OK | +| frontend/src/routes/tools/search/+page.svelte | 🟢 100% | OK | +| frontend/src/routes/tools/mapper/+page.svelte | 🟢 100% | OK | +| frontend/src/routes/tools/debug/+page.svelte | 🟢 100% | OK | +| frontend/src/routes/settings/+page.svelte | 🟢 100% | OK | +| frontend/src/routes/settings/+page.ts | 🟢 100% | OK | +| frontend/src/routes/settings/connections/+page.svelte | 🟢 100% | OK | +| frontend/src/pages/Dashboard.svelte | 🟢 100% | OK | +| frontend/src/pages/Settings.svelte | 🟢 100% | OK | +| frontend/src/services/connectionService.js | 🟢 100% | OK | +| frontend/src/services/toolsService.js | 🟢 100% | OK | +| frontend/src/services/taskService.js | 🟢 100% | OK | +| frontend/src/components/PasswordPrompt.svelte | 🟢 100% | OK | +| frontend/src/components/MappingTable.svelte | 🟢 100% | OK | +| frontend/src/components/TaskLogViewer.svelte | 🟢 100% | OK | +| frontend/src/components/Footer.svelte | 🟢 100% | OK | +| frontend/src/components/MissingMappingModal.svelte | 🟢 100% | OK | +| frontend/src/components/DashboardGrid.svelte | 🟢 100% | OK | +| frontend/src/components/Navbar.svelte | 🟢 100% | OK | +| frontend/src/components/TaskHistory.svelte | 🟢 100% | OK | +| frontend/src/components/Toast.svelte | 🟢 100% | OK | +| frontend/src/components/TaskRunner.svelte | 🟢 100% | OK | +| frontend/src/components/TaskList.svelte | 🟢 100% | OK | +| frontend/src/components/DynamicForm.svelte | 🟢 100% | OK | +| frontend/src/components/EnvSelector.svelte | 🟢 100% | OK | +| frontend/src/components/tools/ConnectionForm.svelte | 🟢 100% | OK | +| frontend/src/components/tools/ConnectionList.svelte | 🟢 100% | OK | +| frontend/src/components/tools/MapperTool.svelte | 🟢 100% | OK | +| frontend/src/components/tools/DebugTool.svelte | 🟢 100% | OK | +| frontend/src/components/tools/SearchTool.svelte | 🟢 100% | OK | +| backend/src/app.py | 🟢 100% | OK | +| backend/src/dependencies.py | 🟢 100% | OK | +| backend/src/core/config_manager.py | 🟢 100% | OK | +| backend/src/core/scheduler.py | 🟢 100% | OK | +| backend/src/core/config_models.py | 🟢 100% | OK | +| backend/src/core/database.py | 🟢 100% | OK | +| backend/src/core/plugin_loader.py | 🟢 100% | OK | +| backend/src/core/migration_engine.py | 🟢 100% | [_transform_yaml] Missing Belief State Logging: Function should use belief_scope context manager.
[_transform_yaml] Missing Belief State Logging: Function should use belief_scope context manager.
[_transform_yaml] Missing Belief State Logging: Function should use belief_scope context manager. | +| backend/src/core/plugin_base.py | 🟢 100% | OK | +| backend/src/core/utils/matching.py | 🟢 100% | [suggest_mappings] Missing Belief State Logging: Function should use belief_scope context manager.
[suggest_mappings] Missing Belief State Logging: Function should use belief_scope context manager. | +| backend/src/core/task_manager/persistence.py | 🟢 100% | OK | +| backend/src/core/task_manager/manager.py | 🟢 100% | OK | +| backend/src/core/task_manager/models.py | 🟢 100% | [__init__] Missing Belief State Logging: Function should use belief_scope context manager.
[__init__] Missing Belief State Logging: Function should use belief_scope context manager.
[__init__] Missing Belief State Logging: Function should use belief_scope context manager. | +| backend/src/core/task_manager/cleanup.py | 🟢 100% | [__init__] Missing Belief State Logging: Function should use belief_scope context manager.
[__init__] Missing Belief State Logging: Function should use belief_scope context manager.
[__init__] Missing Belief State Logging: Function should use belief_scope context manager. | +| backend/src/core/task_manager/__init__.py | 🟢 100% | OK | +| backend/src/api/auth.py | 🟢 100% | [get_current_user] Missing Belief State Logging: Function should use belief_scope context manager.
[get_current_user] Missing Belief State Logging: Function should use belief_scope context manager. | +| backend/src/api/routes/connections.py | 🟢 100% | OK | +| backend/src/api/routes/environments.py | 🟢 100% | OK | +| backend/src/api/routes/migration.py | 🟢 100% | [get_dashboards] Missing Belief State Logging: Function should use belief_scope context manager.
[get_dashboards] Missing Belief State Logging: Function should use belief_scope context manager.
[execute_migration] Missing Belief State Logging: Function should use belief_scope context manager.
[execute_migration] Missing Belief State Logging: Function should use belief_scope context manager. | +| backend/src/api/routes/plugins.py | 🟢 100% | OK | +| backend/src/api/routes/mappings.py | 🟢 100% | OK | +| backend/src/api/routes/settings.py | 🟢 100% | OK | +| backend/src/api/routes/tasks.py | 🟢 100% | OK | +| backend/src/models/task.py | 🟢 100% | OK | +| backend/src/models/connection.py | 🟢 100% | OK | +| backend/src/models/mapping.py | 🟢 100% | OK | +| backend/src/models/dashboard.py | 🟢 100% | OK | +| backend/src/services/mapping_service.py | 🟢 100% | OK | +| backend/src/plugins/backup.py | 🟢 100% | OK | +| backend/src/plugins/debug.py | 🟢 100% | OK | +| backend/src/plugins/search.py | 🟢 100% | OK | +| backend/src/plugins/mapper.py | 🟢 100% | OK | +| backend/src/plugins/migration.py | 🟢 100% | OK | +| backend/tests/test_logger.py | 🟢 100% | OK | diff --git a/specs/012-remove-superset-tool/spec.md b/specs/012-remove-superset-tool/spec.md index 2d7756c22..7c11eae6e 100644 --- a/specs/012-remove-superset-tool/spec.md +++ b/specs/012-remove-superset-tool/spec.md @@ -2,7 +2,7 @@ **Feature Branch**: `012-remove-superset-tool` **Created**: 2026-01-22 -**Status**: Draft +**Status**: Completed **Input**: User description: "нужен рефакторинг бека - я хочу исключить модуль superset_tool, пусть останется только backend" ## Clarifications diff --git a/specs/project_map.md b/specs/project_map.md index 4d5af6c83..1b70aa91b 100644 --- a/specs/project_map.md +++ b/specs/project_map.md @@ -51,350 +51,6 @@ - 📝 Generates the token-optimized project map. - ƒ **_write_entity_md** (`Function`) - 📝 Recursive helper to write entity tree to Markdown. -- 📦 **migration_script** (`Module`) - - 📝 Предоставляет интерактивный CLI для миграции дашбордов Superset между окружениями с возможностью восстановления после ошибок. - - 🏗️ Layer: App - - 🔗 DEPENDS_ON -> `superset_tool.client` - - 🔗 DEPENDS_ON -> `superset_tool.utils` - - ℂ **Migration** (`Class`) - - 📝 Инкапсулирует логику интерактивной миграции дашбордов с возможностью «удалить‑и‑перезаписать» при ошибке импорта. - - ƒ **__init__** (`Function`) - - 📝 Инициализирует сервис миграции, настраивает логгер и начальные состояния. - - ƒ **run** (`Function`) - - 📝 Точка входа – последовательный запуск всех шагов миграции. - - 🔗 CALLS -> `self.ask_delete_on_failure` - - 🔗 CALLS -> `self.select_environments` - - 🔗 CALLS -> `self.select_dashboards` - - 🔗 CALLS -> `self.confirm_db_config_replacement` - - 🔗 CALLS -> `self.execute_migration` - - ƒ **ask_delete_on_failure** (`Function`) - - 📝 Запрашивает у пользователя, следует ли удалять дашборд при ошибке импорта. - - 🔗 CALLS -> `yesno` - - ƒ **select_environments** (`Function`) - - 📝 Позволяет пользователю выбрать исходное и целевое окружения Superset. - - 🔗 CALLS -> `setup_clients` - - 🔗 CALLS -> `menu` - - ƒ **select_dashboards** (`Function`) - - 📝 Позволяет пользователю выбрать набор дашбордов для миграции. - - 🔗 CALLS -> `self.from_c.get_dashboards` - - 🔗 CALLS -> `checklist` - - ƒ **confirm_db_config_replacement** (`Function`) - - 📝 Запрашивает у пользователя, требуется ли заменить имена БД в YAML-файлах. - - 🔗 CALLS -> `yesno` - - 🔗 CALLS -> `self._select_databases` - - ƒ **_select_databases** (`Function`) - - 📝 Позволяет пользователю выбрать исходную и целевую БД через API. - - 🔗 CALLS -> `self.from_c.get_databases` - - 🔗 CALLS -> `self.to_c.get_databases` - - 🔗 CALLS -> `self.from_c.get_database` - - 🔗 CALLS -> `self.to_c.get_database` - - 🔗 CALLS -> `menu` - - ƒ **_batch_delete_by_ids** (`Function`) - - 📝 Удаляет набор дашбордов по их ID единым запросом. - - 🔗 CALLS -> `self.to_c.network.request` - - ƒ **execute_migration** (`Function`) - - 📝 Выполняет экспорт-импорт дашбордов, обрабатывает ошибки и, при необходимости, выполняет процедуру восстановления. - - 🔗 CALLS -> `self.from_c.export_dashboard` - - 🔗 CALLS -> `create_temp_file` - - 🔗 CALLS -> `update_yamls` - - 🔗 CALLS -> `create_dashboard_export` - - 🔗 CALLS -> `self.to_c.import_dashboard` - - 🔗 CALLS -> `self._batch_delete_by_ids` -- 📦 **superset_tool.exceptions** (`Module`) - - 📝 Определяет иерархию пользовательских исключений для всего инструмента, обеспечивая единую точку обработки ошибок. - - 🏗️ Layer: Infra - - ℂ **SupersetToolError** (`Class`) - - 📝 Базовый класс для всех ошибок, генерируемых инструментом. - - 🔗 INHERITS_FROM -> `Exception` - - ƒ **__init__** (`Function`) - - 📝 Initializes the base tool error. - - ℂ **AuthenticationError** (`Class`) - - 📝 Ошибки, связанные с аутентификацией или авторизацией. - - 🔗 INHERITS_FROM -> `SupersetToolError` - - ƒ **__init__** (`Function`) - - 📝 Initializes an authentication error. - - ℂ **PermissionDeniedError** (`Class`) - - 📝 Ошибка, возникающая при отказе в доступе к ресурсу. - - 🔗 INHERITS_FROM -> `AuthenticationError` - - ƒ **__init__** (`Function`) - - 📝 Initializes a permission denied error. - - ℂ **SupersetAPIError** (`Class`) - - 📝 Общие ошибки при взаимодействии с Superset API. - - 🔗 INHERITS_FROM -> `SupersetToolError` - - ƒ **__init__** (`Function`) - - 📝 Initializes a Superset API error. - - ℂ **ExportError** (`Class`) - - 📝 Ошибки, специфичные для операций экспорта. - - 🔗 INHERITS_FROM -> `SupersetAPIError` - - ƒ **__init__** (`Function`) - - 📝 Initializes an export error. - - ℂ **DashboardNotFoundError** (`Class`) - - 📝 Ошибка, когда запрошенный дашборд или ресурс не найден (404). - - 🔗 INHERITS_FROM -> `SupersetAPIError` - - ƒ **__init__** (`Function`) - - 📝 Initializes a dashboard not found error. - - ℂ **DatasetNotFoundError** (`Class`) - - 📝 Ошибка, когда запрашиваемый набор данных не существует (404). - - 🔗 INHERITS_FROM -> `SupersetAPIError` - - ƒ **__init__** (`Function`) - - 📝 Initializes a dataset not found error. - - ℂ **InvalidZipFormatError** (`Class`) - - 📝 Ошибка, указывающая на некорректный формат или содержимое ZIP-архива. - - 🔗 INHERITS_FROM -> `SupersetToolError` - - ƒ **__init__** (`Function`) - - 📝 Initializes an invalid ZIP format error. - - ℂ **NetworkError** (`Class`) - - 📝 Ошибки, связанные с сетевым соединением. - - 🔗 INHERITS_FROM -> `SupersetToolError` - - ƒ **__init__** (`Function`) - - 📝 Initializes a network error. - - ℂ **FileOperationError** (`Class`) - - 📝 Общие ошибки файловых операций (I/O). - - 🔗 INHERITS_FROM -> `SupersetToolError` - - ℂ **InvalidFileStructureError** (`Class`) - - 📝 Ошибка, указывающая на некорректную структуру файлов или директорий. - - 🔗 INHERITS_FROM -> `FileOperationError` - - ℂ **ConfigurationError** (`Class`) - - 📝 Ошибки, связанные с неверной конфигурацией инструмента. - - 🔗 INHERITS_FROM -> `SupersetToolError` -- 📦 **superset_tool.models** (`Module`) - - 📝 Определяет Pydantic-модели для конфигурации инструмента, обеспечивая валидацию данных. - - 🏗️ Layer: Infra - - 🔗 DEPENDS_ON -> `pydantic` - - 🔗 DEPENDS_ON -> `superset_tool.utils.logger` - - ℂ **SupersetConfig** (`Class`) - - 📝 Модель конфигурации для подключения к одному экземпляру Superset API. - - 🔗 INHERITS_FROM -> `pydantic.BaseModel` - - ƒ **validate_auth** (`Function`) - - 📝 Проверяет, что словарь `auth` содержит все необходимые для аутентификации поля. - - ƒ **normalize_base_url** (`Function`) - - 📝 Нормализует `base_url`, добавляя `/api/v1`, если он отсутствует. - - ℂ **DatabaseConfig** (`Class`) - - 📝 Модель для параметров трансформации баз данных при миграции дашбордов. - - 🔗 INHERITS_FROM -> `pydantic.BaseModel` - - ƒ **validate_config** (`Function`) - - 📝 Проверяет, что словарь `database_config` содержит ключи 'old' и 'new'. -- 📦 **superset_tool.client** (`Module`) - - 📝 Предоставляет высокоуровневый клиент для взаимодействия с Superset REST API, инкапсулируя логику запросов, обработку ошибок и пагинацию. - - 🏗️ Layer: Domain - - 🔗 DEPENDS_ON -> `superset_tool.models` - - 🔗 DEPENDS_ON -> `superset_tool.exceptions` - - 🔗 DEPENDS_ON -> `superset_tool.utils` - - ℂ **SupersetClient** (`Class`) - - 📝 Класс-обёртка над Superset REST API, предоставляющий методы для работы с дашбордами и датасетами. - - ƒ **__init__** (`Function`) - - 📝 Инициализирует клиент, проверяет конфигурацию и создает сетевой клиент. - - ƒ **_validate_config** (`Function`) - - 📝 Проверяет, что переданный объект конфигурации имеет корректный тип. - - ƒ **headers** (`Function`) - - 📝 Возвращает базовые HTTP-заголовки, используемые сетевым клиентом. - - ƒ **get_dashboards** (`Function`) - - 📝 Получает полный список дашбордов, автоматически обрабатывая пагинацию. - - 🔗 CALLS -> `self._fetch_total_object_count` - - 🔗 CALLS -> `self._fetch_all_pages` - - ƒ **export_dashboard** (`Function`) - - 📝 Экспортирует дашборд в виде ZIP-архива. - - 🔗 CALLS -> `self.network.request` - - ƒ **import_dashboard** (`Function`) - - 📝 Импортирует дашборд из ZIP-файла с возможностью автоматического удаления и повторной попытки при ошибке. - - 🔗 CALLS -> `self._do_import` - - 🔗 CALLS -> `self.delete_dashboard` - - 🔗 CALLS -> `self.get_dashboards` - - ƒ **_resolve_target_id_for_delete** (`Function`) - - 📝 Определяет ID дашборда для удаления, используя ID или slug. - - ƒ **_do_import** (`Function`) - - 📝 Выполняет один запрос на импорт без обработки исключений. - - ƒ **delete_dashboard** (`Function`) - - 📝 Удаляет дашборд по его ID или slug. - - 🔗 CALLS -> `self.network.request` - - ƒ **_extract_dashboard_id_from_zip** (`Function`) - - 📝 Извлекает ID дашборда из `metadata.yaml` внутри ZIP-архива. - - ƒ **_extract_dashboard_slug_from_zip** (`Function`) - - 📝 Извлекает slug дашборда из `metadata.yaml` внутри ZIP-архива. - - ƒ **_validate_export_response** (`Function`) - - 📝 Проверяет, что HTTP-ответ на экспорт является валидным ZIP-архивом. - - ƒ **_resolve_export_filename** (`Function`) - - 📝 Определяет имя файла для экспорта из заголовков или генерирует его. - - ƒ **_validate_query_params** (`Function`) - - 📝 Формирует корректный набор параметров запроса с пагинацией. - - ƒ **_fetch_total_object_count** (`Function`) - - 📝 Получает общее количество объектов по указанному эндпоинту для пагинации. - - ƒ **_fetch_all_pages** (`Function`) - - 📝 Итерируется по всем страницам пагинированного API и собирает все данные. - - ƒ **_validate_import_file** (`Function`) - - 📝 Проверяет, что файл существует, является ZIP-архивом и содержит `metadata.yaml`. - - ƒ **get_datasets** (`Function`) - - 📝 Получает полный список датасетов, автоматически обрабатывая пагинацию. - - 🔗 CALLS -> `self._fetch_total_object_count` - - 🔗 CALLS -> `self._fetch_all_pages` - - ƒ **get_databases** (`Function`) - - 📝 Получает полный список баз данных, автоматически обрабатывая пагинацию. - - 🔗 CALLS -> `self._fetch_total_object_count` - - 🔗 CALLS -> `self._fetch_all_pages` - - ƒ **get_dataset** (`Function`) - - 📝 Получает информацию о конкретном датасете по его ID. - - 🔗 CALLS -> `self.network.request` - - ƒ **get_database** (`Function`) - - 📝 Получает информацию о конкретной базе данных по её ID. - - 🔗 CALLS -> `self.network.request` - - ƒ **update_dataset** (`Function`) - - 📝 Обновляет данные датасета по его ID. - - 🔗 CALLS -> `self.network.request` -- 📦 **superset_tool** (`Module`) - - 📝 Root package for superset_tool. - - 🏗️ Layer: Domain -- 📦 **superset_tool.utils.init_clients** (`Module`) - - 📝 Централизованно инициализирует клиенты Superset для различных окружений (DEV, PROD, SBX, PREPROD), используя `keyring` для безопасного доступа к паролям. - - 🏗️ Layer: Infra - - 🔗 DEPENDS_ON -> `superset_tool.models` - - 🔗 DEPENDS_ON -> `superset_tool.client` - - 🔗 DEPENDS_ON -> `keyring` - - ƒ **setup_clients** (`Function`) - - 📝 Инициализирует и возвращает словарь клиентов `SupersetClient`. -- 📦 **superset_tool.utils.logger** (`Module`) - - 📝 Предоставляет универсальную обёртку над стандартным `logging.Logger` для унифицированного создания и управления логгерами с выводом в консоль и/или файл. - - 🏗️ Layer: Infra - - ƒ **belief_scope** (`Function`) - - 📝 Context manager for belief state logging to maintain execution coherence. - - ℂ **SupersetLogger** (`Class`) - - 📝 Обёртка над `logging.Logger`, которая упрощает конфигурацию и использование логгеров. - - ƒ **__init__** (`Function`) - - 📝 Конфигурирует и инициализирует логгер, добавляя обработчики для файла и/или консоли. - - ƒ **_log** (`Function`) - - 📝 (Helper) Универсальный метод для вызова соответствующего уровня логирования. - - ƒ **info** (`Function`) - - 📝 Записывает сообщение уровня INFO. - - ƒ **debug** (`Function`) - - 📝 Записывает сообщение уровня DEBUG. - - ƒ **warning** (`Function`) - - 📝 Записывает сообщение уровня WARNING. - - ƒ **error** (`Function`) - - 📝 Записывает сообщение уровня ERROR. - - ƒ **critical** (`Function`) - - 📝 Записывает сообщение уровня CRITICAL. - - ƒ **exception** (`Function`) - - 📝 Записывает сообщение уровня ERROR вместе с трассировкой стека текущего исключения. - - 📦 **belief_scope** (`Method`) - - 📝 Instance method wrapper for belief_scope context manager. -- 📦 **superset_tool.utils.fileio** (`Module`) - - 📝 Предоставляет набор утилит для управления файловыми операциями, включая работу с временными файлами, архивами ZIP, файлами YAML и очистку директорий. - - 🏗️ Layer: Infra - - 🔗 DEPENDS_ON -> `superset_tool.exceptions` - - 🔗 DEPENDS_ON -> `superset_tool.utils.logger` - - 🔗 DEPENDS_ON -> `pyyaml` - - ƒ **create_temp_file** (`Function`) - - 📝 Контекстный менеджер для создания временного файла или директории с гарантированным удалением. - - ƒ **remove_empty_directories** (`Function`) - - 📝 Рекурсивно удаляет все пустые поддиректории, начиная с указанного пути. - - ƒ **read_dashboard_from_disk** (`Function`) - - 📝 Читает бинарное содержимое файла с диска. - - ƒ **calculate_crc32** (`Function`) - - 📝 Вычисляет контрольную сумму CRC32 для файла. - - 📦 **RetentionPolicy** (`DataClass`) - - 📝 Определяет политику хранения для архивов (ежедневные, еженедельные, ежемесячные). - - ƒ **archive_exports** (`Function`) - - 📝 Управляет архивом экспортированных файлов, применяя политику хранения и дедупликацию. - - 🔗 CALLS -> `apply_retention_policy` - - 🔗 CALLS -> `calculate_crc32` - - ƒ **apply_retention_policy** (`Function`) - - 📝 (Helper) Применяет политику хранения к списку файлов, возвращая те, что нужно сохранить. - - ƒ **save_and_unpack_dashboard** (`Function`) - - 📝 Сохраняет бинарное содержимое ZIP-архива на диск и опционально распаковывает его. - - ƒ **update_yamls** (`Function`) - - 📝 Обновляет конфигурации в YAML-файлах, заменяя значения или применяя regex. - - 🔗 CALLS -> `_update_yaml_file` - - ƒ **_update_yaml_file** (`Function`) - - 📝 (Helper) Обновляет один YAML файл. - - ƒ **replacer** (`Function`) - - 📝 Функция замены, сохраняющая кавычки если они были. - - ƒ **create_dashboard_export** (`Function`) - - 📝 Создает ZIP-архив из указанных исходных путей. - - ƒ **sanitize_filename** (`Function`) - - 📝 Очищает строку от символов, недопустимых в именах файлов. - - ƒ **get_filename_from_headers** (`Function`) - - 📝 Извлекает имя файла из HTTP заголовка 'Content-Disposition'. - - ƒ **consolidate_archive_folders** (`Function`) - - 📝 Консолидирует директории архивов на основе общего слага в имени. -- 📦 **superset_tool.utils.network** (`Module`) - - 📝 Инкапсулирует низкоуровневую HTTP-логику для взаимодействия с Superset API, включая аутентификацию, управление сессией, retry-логику и обработку ошибок. - - 🏗️ Layer: Infra - - 🔗 DEPENDS_ON -> `superset_tool.exceptions` - - 🔗 DEPENDS_ON -> `superset_tool.utils.logger` - - 🔗 DEPENDS_ON -> `requests` - - ℂ **APIClient** (`Class`) - - 📝 Инкапсулирует HTTP-логику для работы с API, включая сессии, аутентификацию, и обработку запросов. - - ƒ **__init__** (`Function`) - - 📝 Инициализирует API клиент с конфигурацией, сессией и логгером. - - ƒ **_init_session** (`Function`) - - 📝 Создает и настраивает `requests.Session` с retry-логикой. - - ƒ **authenticate** (`Function`) - - 📝 Выполняет аутентификацию в Superset API и получает access и CSRF токены. - - ƒ **headers** (`Function`) - - 📝 Возвращает HTTP-заголовки для аутентифицированных запросов. - - ƒ **request** (`Function`) - - 📝 Выполняет универсальный HTTP-запрос к API. - - ƒ **_handle_http_error** (`Function`) - - 📝 (Helper) Преобразует HTTP ошибки в кастомные исключения. - - ƒ **_handle_network_error** (`Function`) - - 📝 (Helper) Преобразует сетевые ошибки в `NetworkError`. - - ƒ **upload_file** (`Function`) - - 📝 Загружает файл на сервер через multipart/form-data. - - ƒ **_perform_upload** (`Function`) - - 📝 (Helper) Выполняет POST запрос с файлом. - - ƒ **fetch_paginated_count** (`Function`) - - 📝 Получает общее количество элементов для пагинации. - - ƒ **fetch_paginated_data** (`Function`) - - 📝 Автоматически собирает данные со всех страниц пагинированного эндпоинта. -- 📦 **superset_tool.utils.whiptail_fallback** (`Module`) - - 📝 Предоставляет плотный консольный UI-fallback для интерактивных диалогов, имитируя `whiptail` для систем, где он недоступен. - - 🏗️ Layer: UI - - ƒ **menu** (`Function`) - - 📝 Отображает меню выбора и возвращает выбранный элемент. - - ƒ **checklist** (`Function`) - - 📝 Отображает список с возможностью множественного выбора. - - ƒ **yesno** (`Function`) - - 📝 Задает вопрос с ответом да/нет. - - ƒ **msgbox** (`Function`) - - 📝 Отображает информационное сообщение. - - ƒ **inputbox** (`Function`) - - 📝 Запрашивает у пользователя текстовый ввод. - - ℂ **_ConsoleGauge** (`Class`) - - 📝 Контекстный менеджер для имитации `whiptail gauge` в консоли. - - ƒ **__init__** (`Function`) - - 📝 Initializes the gauge. - - ƒ **__enter__** (`Function`) - - 📝 Enters the context. - - ƒ **__exit__** (`Function`) - - 📝 Exits the context. - - ƒ **set_text** (`Function`) - - 📝 Sets the gauge text. - - ƒ **set_percent** (`Function`) - - 📝 Sets the gauge percentage. - - ƒ **gauge** (`Function`) - - 📝 Создает и возвращает экземпляр `_ConsoleGauge`. -- 📦 **superset_tool.utils.dataset_mapper** (`Module`) - - 📝 Этот модуль отвечает за обновление метаданных (verbose_map) в датасетах Superset, извлекая их из PostgreSQL или XLSX-файлов. - - 🏗️ Layer: Domain - - 🔗 DEPENDS_ON -> `superset_tool.client` - - 🔗 DEPENDS_ON -> `pandas` - - 🔗 DEPENDS_ON -> `psycopg2` - - ℂ **DatasetMapper** (`Class`) - - 📝 Класс для меппинга и обновления verbose_map в датасетах Superset. - - ƒ **__init__** (`Function`) - - 📝 Initializes the mapper. - - ƒ **get_postgres_comments** (`Function`) - - 📝 Извлекает комментарии к колонкам из системного каталога PostgreSQL. - - ƒ **load_excel_mappings** (`Function`) - - 📝 Загружает меппинги 'column_name' -> 'column_comment' из XLSX файла. - - ƒ **run_mapping** (`Function`) - - 📝 Основная функция для выполнения меппинга и обновления verbose_map датасета в Superset. - - 🔗 CALLS -> `self.get_postgres_comments` - - 🔗 CALLS -> `self.load_excel_mappings` - - 🔗 CALLS -> `superset_client.get_dataset` - - 🔗 CALLS -> `superset_client.update_dataset` -- 📦 **superset_tool.utils** (`Module`) - - 📝 Utility package for superset_tool. - - 🏗️ Layer: Infra - 📦 **main** (`Module`) - 📝 Entry point for the Svelte application. - 🏗️ Layer: UI-Entry @@ -454,14 +110,17 @@ - 📝 Handles task creation from dynamic form submission. - ƒ **load** (`Function`) - 📝 Loads initial plugin data for the dashboard. -- ƒ **loadInitialData** (`Function`) - - 📝 Loads tasks and environments on page initialization. -- ƒ **refreshTasks** (`Function`) - - 📝 Periodically refreshes the task list. -- ƒ **handleSelectTask** (`Function`) - - 📝 Updates the selected task ID when a task is clicked. -- ƒ **handleRunBackup** (`Function`) - - 📝 Triggers a manual backup task for the selected environment. +- 🧩 **TaskManagementPage** (`Component`) + - 📝 Page for managing and monitoring tasks. + - 🏗️ Layer: Page + - ƒ **loadInitialData** (`Function`) + - 📝 Loads tasks and environments on page initialization. + - ƒ **refreshTasks** (`Function`) + - 📝 Periodically refreshes the task list. + - ƒ **handleSelectTask** (`Function`) + - 📝 Updates the selected task ID when a task is clicked. + - ƒ **handleRunBackup** (`Function`) + - 📝 Triggers a manual backup task for the selected environment. - 🧩 **MigrationDashboard** (`Component`) - 📝 Main dashboard for configuring and starting migrations. - 🏗️ Layer: Page @@ -579,7 +238,7 @@ - ƒ **getSuggestion** (`Function`) - 📝 Finds a suggestion for a source database. - 🧩 **TaskLogViewer** (`Component`) - - 📝 Displays detailed logs for a specific task in a modal. + - 📝 Displays detailed logs for a specific task in a modal or inline. - 🏗️ Layer: UI - ƒ **fetchLogs** (`Function`) - 📝 Fetches logs for the current task. @@ -745,21 +404,48 @@ - ƒ **get_scheduler_service** (`Function`) - 📝 Dependency injector for the SchedulerService. - 📦 **backend.src.core.superset_client** (`Module`) - - 📝 Extends the base SupersetClient with database-specific metadata fetching. + - 📝 Предоставляет высокоуровневый клиент для взаимодействия с Superset REST API, инкапсулируя логику запросов, обработку ошибок и пагинацию. - 🏗️ Layer: Core - - 🔗 INHERITS_FROM -> `superset_tool.client.SupersetClient` - ℂ **SupersetClient** (`Class`) - - 📝 Extended SupersetClient for migration-specific operations. + - 📝 Класс-обёртка над Superset REST API, предоставляющий методы для работы с дашбордами и датасетами. + - ƒ **__init__** (`Function`) + - 📝 Инициализирует клиент, проверяет конфигурацию и создает сетевой клиент. + - ƒ **authenticate** (`Function`) + - 📝 Authenticates the client using the configured credentials. + - ƒ **headers** (`Function`) + - 📝 Возвращает базовые HTTP-заголовки, используемые сетевым клиентом. + - ƒ **get_dashboards** (`Function`) + - 📝 Получает полный список дашбордов, автоматически обрабатывая пагинацию. + - ƒ **get_dashboards_summary** (`Function`) + - 📝 Fetches dashboard metadata optimized for the grid. + - ƒ **export_dashboard** (`Function`) + - 📝 Экспортирует дашборд в виде ZIP-архива. + - ƒ **import_dashboard** (`Function`) + - 📝 Импортирует дашборд из ZIP-файла. + - ƒ **delete_dashboard** (`Function`) + - 📝 Удаляет дашборд по его ID или slug. + - ƒ **get_datasets** (`Function`) + - 📝 Получает полный список датасетов, автоматически обрабатывая пагинацию. + - ƒ **get_dataset** (`Function`) + - 📝 Получает информацию о конкретном датасете по его ID. + - ƒ **update_dataset** (`Function`) + - 📝 Обновляет данные датасета по его ID. + - ƒ **get_databases** (`Function`) + - 📝 Получает полный список баз данных. + - ƒ **get_database** (`Function`) + - 📝 Получает информацию о конкретной базе данных по её ID. - ƒ **get_databases_summary** (`Function`) - 📝 Fetch a summary of databases including uuid, name, and engine. - ƒ **get_database_by_uuid** (`Function`) - 📝 Find a database by its UUID. - - ƒ **get_dashboards_summary** (`Function`) - - 📝 Fetches dashboard metadata optimized for the grid. - - ƒ **get_dataset** (`Function`) - - 📝 Fetch full dataset structure including columns and metrics. - - ƒ **update_dataset** (`Function`) - - 📝 Update dataset metadata. + - ƒ **_resolve_target_id_for_delete** (`Function`) + - ƒ **_do_import** (`Function`) + - ƒ **_validate_export_response** (`Function`) + - ƒ **_resolve_export_filename** (`Function`) + - ƒ **_validate_query_params** (`Function`) + - ƒ **_fetch_total_object_count** (`Function`) + - ƒ **_fetch_all_pages** (`Function`) + - ƒ **_validate_import_file** (`Function`) - 📦 **ConfigManagerModule** (`Module`) - 📝 Manages application configuration, including loading/saving to JSON and CRUD for environments. - 🏗️ Layer: Core @@ -785,6 +471,8 @@ - 📝 Returns the list of configured environments. - ƒ **has_environments** (`Function`) - 📝 Checks if at least one environment is configured. + - ƒ **get_environment** (`Function`) + - 📝 Returns a single environment by ID. - ƒ **add_environment** (`Function`) - 📝 Adds a new environment to the configuration. - ƒ **update_environment** (`Function`) @@ -862,6 +550,8 @@ - 📝 Returns a list of recent log entries from the buffer. - 📦 **Logger** (`Global`) - 📝 The global logger instance for the application, configured with both a console handler and the custom WebSocket handler. + - ƒ **believed** (`Function`) + - 📝 A decorator that wraps a function in a belief scope. - ℂ **PluginLoader** (`Class`) - 📝 Scans a specified directory for Python modules, dynamically loads them, and registers any classes that are valid implementations of the PluginBase interface. - 🏗️ Layer: Core @@ -907,12 +597,76 @@ - ℂ **PluginConfig** (`Class`) - 📝 A Pydantic model used to represent the validated configuration and metadata of a loaded plugin. This object is what gets exposed to the API layer. - 🏗️ Layer: Core +- 📦 **backend.core.utils.fileio** (`Module`) + - 📝 Предоставляет набор утилит для управления файловыми операциями, включая работу с временными файлами, архивами ZIP, файлами YAML и очистку директорий. + - 🏗️ Layer: Infra + - 🔗 DEPENDS_ON -> `backend.src.core.logger` + - 🔗 DEPENDS_ON -> `pyyaml` + - ℂ **InvalidZipFormatError** (`Class`) + - ƒ **create_temp_file** (`Function`) + - 📝 Контекстный менеджер для создания временного файла или директории с гарантированным удалением. + - ƒ **remove_empty_directories** (`Function`) + - 📝 Рекурсивно удаляет все пустые поддиректории, начиная с указанного пути. + - ƒ **read_dashboard_from_disk** (`Function`) + - 📝 Читает бинарное содержимое файла с диска. + - ƒ **calculate_crc32** (`Function`) + - 📝 Вычисляет контрольную сумму CRC32 для файла. + - 📦 **RetentionPolicy** (`DataClass`) + - 📝 Определяет политику хранения для архивов (ежедневные, еженедельные, ежемесячные). + - ƒ **archive_exports** (`Function`) + - 📝 Управляет архивом экспортированных файлов, применяя политику хранения и дедупликацию. + - 🔗 CALLS -> `apply_retention_policy` + - 🔗 CALLS -> `calculate_crc32` + - ƒ **apply_retention_policy** (`Function`) + - 📝 (Helper) Применяет политику хранения к списку файлов, возвращая те, что нужно сохранить. + - ƒ **save_and_unpack_dashboard** (`Function`) + - 📝 Сохраняет бинарное содержимое ZIP-архива на диск и опционально распаковывает его. + - ƒ **update_yamls** (`Function`) + - 📝 Обновляет конфигурации в YAML-файлах, заменяя значения или применяя regex. + - 🔗 CALLS -> `_update_yaml_file` + - ƒ **_update_yaml_file** (`Function`) + - 📝 (Helper) Обновляет один YAML файл. + - ƒ **create_dashboard_export** (`Function`) + - 📝 Создает ZIP-архив из указанных исходных путей. + - ƒ **sanitize_filename** (`Function`) + - 📝 Очищает строку от символов, недопустимых в именах файлов. + - ƒ **get_filename_from_headers** (`Function`) + - 📝 Извлекает имя файла из HTTP заголовка 'Content-Disposition'. + - ƒ **consolidate_archive_folders** (`Function`) + - 📝 Консолидирует директории архивов на основе общего слага в имени. +- 📦 **backend.core.utils.network** (`Module`) + - 📝 Инкапсулирует низкоуровневую HTTP-логику для взаимодействия с Superset API, включая аутентификацию, управление сессией, retry-логику и обработку ошибок. + - 🏗️ Layer: Infra + - 🔗 DEPENDS_ON -> `backend.src.core.logger` + - 🔗 DEPENDS_ON -> `requests` + - ℂ **SupersetAPIError** (`Class`) + - ℂ **AuthenticationError** (`Class`) - 📦 **backend.src.core.utils.matching** (`Module`) - 📝 Provides utility functions for fuzzy matching database names. - 🏗️ Layer: Core - 🔗 DEPENDS_ON -> `rapidfuzz` - ƒ **suggest_mappings** (`Function`) - 📝 Suggests mappings between source and target databases using fuzzy matching. +- 📦 **backend.core.utils.dataset_mapper** (`Module`) + - 📝 Этот модуль отвечает за обновление метаданных (verbose_map) в датасетах Superset, извлекая их из PostgreSQL или XLSX-файлов. + - 🏗️ Layer: Domain + - 🔗 DEPENDS_ON -> `backend.core.superset_client` + - 🔗 DEPENDS_ON -> `pandas` + - 🔗 DEPENDS_ON -> `psycopg2` + - ℂ **DatasetMapper** (`Class`) + - 📝 Класс для меппинга и обновления verbose_map в датасетах Superset. + - ƒ **__init__** (`Function`) + - 📝 Initializes the mapper. + - ƒ **get_postgres_comments** (`Function`) + - 📝 Извлекает комментарии к колонкам из системного каталога PostgreSQL. + - ƒ **load_excel_mappings** (`Function`) + - 📝 Загружает меппинги 'column_name' -> 'column_comment' из XLSX файла. + - ƒ **run_mapping** (`Function`) + - 📝 Основная функция для выполнения меппинга и обновления verbose_map датасета в Superset. + - 🔗 CALLS -> `self.get_postgres_comments` + - 🔗 CALLS -> `self.load_excel_mappings` + - 🔗 CALLS -> `superset_client.get_dataset` + - 🔗 CALLS -> `superset_client.update_dataset` - 📦 **TaskPersistenceModule** (`Module`) - 📝 Handles the persistence of tasks using SQLAlchemy and the tasks.db database. - 🏗️ Layer: Core @@ -1228,10 +982,8 @@ - 📝 Returns the JSON schema for migration plugin parameters. - ƒ **execute** (`Function`) - 📝 Executes the dashboard migration logic. -- ƒ **test_superset_config_url_normalization** (`Function`) - - 📝 Tests that SupersetConfig correctly normalizes the base URL. -- ƒ **test_superset_config_invalid_url** (`Function`) - - 📝 Tests that SupersetConfig raises ValueError for invalid URLs. +- ƒ **test_environment_model** (`Function`) + - 📝 Tests that Environment model correctly stores values. - ƒ **test_belief_scope_logs_entry_action_exit** (`Function`) - 📝 Test that belief_scope generates [ID][Entry], [ID][Action], and [ID][Exit] logs. - ƒ **test_belief_scope_error_handling** (`Function`)