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`)