diff --git a/backend/src/api/auth.py b/backend/src/api/auth.py index 5d50a5c..d7cde07 100755 --- a/backend/src/api/auth.py +++ b/backend/src/api/auth.py @@ -31,6 +31,12 @@ oauth2_scheme = OAuth2AuthorizationCodeBearer( tokenUrl="https://your-adfs-server/adfs/oauth2/token", ) +# [DEF:get_current_user:Function] +# @PURPOSE: Dependency to get the current user from the ADFS token. +# @PARAM: token (str) - The OAuth2 bearer token. +# @PRE: token should be provided via Authorization header. +# @POST: Returns user details if authenticated, else raises 401. +# @RETURN: Dict[str, str] - User information. async def get_current_user(token: str = Depends(oauth2_scheme)): """ Dependency to get the current user from the ADFS token. @@ -49,4 +55,5 @@ async def get_current_user(token: str = Depends(oauth2_scheme)): ) # A real implementation would return a user object. return {"placeholder_user": "user@example.com"} +# [/DEF:get_current_user:Function] # [/DEF:AuthModule:Module] \ No newline at end of file diff --git a/backend/src/api/routes/environments.py b/backend/src/api/routes/environments.py index eb7eb8e..6a0b8de 100644 --- a/backend/src/api/routes/environments.py +++ b/backend/src/api/routes/environments.py @@ -43,10 +43,13 @@ class DatabaseResponse(BaseModel): # [DEF:get_environments:Function] # @PURPOSE: List all configured environments. +# @PRE: config_manager is injected via Depends. +# @POST: Returns a list of EnvironmentResponse objects. # @RETURN: List[EnvironmentResponse] @router.get("", response_model=List[EnvironmentResponse]) async def get_environments(config_manager=Depends(get_config_manager)): - envs = config_manager.get_environments() + with belief_scope("get_environments"): + envs = config_manager.get_environments() # Ensure envs is a list if not isinstance(envs, list): envs = [] @@ -65,6 +68,8 @@ async def get_environments(config_manager=Depends(get_config_manager)): # [DEF:update_environment_schedule:Function] # @PURPOSE: Update backup schedule for an environment. +# @PRE: Environment id exists, schedule is valid ScheduleSchema. +# @POST: Backup schedule updated and scheduler reloaded. # @PARAM: id (str) - The environment ID. # @PARAM: schedule (ScheduleSchema) - The new schedule. @router.put("/{id}/schedule") @@ -74,7 +79,8 @@ async def update_environment_schedule( config_manager=Depends(get_config_manager), scheduler_service=Depends(get_scheduler_service) ): - envs = config_manager.get_environments() + with belief_scope("update_environment_schedule", f"id={id}"): + envs = config_manager.get_environments() env = next((e for e in envs if e.id == id), None) if not env: raise HTTPException(status_code=404, detail="Environment not found") @@ -93,11 +99,14 @@ async def update_environment_schedule( # [DEF:get_environment_databases:Function] # @PURPOSE: Fetch the list of databases from a specific environment. +# @PRE: Environment id exists. +# @POST: Returns a list of database summaries from the environment. # @PARAM: id (str) - The environment ID. # @RETURN: List[Dict] - List of databases. @router.get("/{id}/databases") async def get_environment_databases(id: str, config_manager=Depends(get_config_manager)): - envs = config_manager.get_environments() + with belief_scope("get_environment_databases", f"id={id}"): + envs = config_manager.get_environments() env = next((e for e in envs if e.id == id), None) if not env: raise HTTPException(status_code=404, detail="Environment not found") diff --git a/backend/src/api/routes/mappings.py b/backend/src/api/routes/mappings.py index 4eab93b..2580d9e 100644 --- a/backend/src/api/routes/mappings.py +++ b/backend/src/api/routes/mappings.py @@ -53,13 +53,16 @@ class SuggestRequest(BaseModel): # [DEF:get_mappings:Function] # @PURPOSE: List all saved database mappings. +# @PRE: db session is injected. +# @POST: Returns filtered list of DatabaseMapping records. @router.get("", response_model=List[MappingResponse]) async def get_mappings( source_env_id: Optional[str] = None, target_env_id: Optional[str] = None, db: Session = Depends(get_db) ): - query = db.query(DatabaseMapping) + with belief_scope("get_mappings"): + query = db.query(DatabaseMapping) if source_env_id: query = query.filter(DatabaseMapping.source_env_id == source_env_id) if target_env_id: @@ -69,42 +72,48 @@ async def get_mappings( # [DEF:create_mapping:Function] # @PURPOSE: Create or update a database mapping. +# @PRE: mapping is valid MappingCreate, db session is injected. +# @POST: DatabaseMapping created or updated in database. @router.post("", response_model=MappingResponse) async def create_mapping(mapping: MappingCreate, db: Session = Depends(get_db)): - # Check if mapping already exists - existing = db.query(DatabaseMapping).filter( - DatabaseMapping.source_env_id == mapping.source_env_id, - DatabaseMapping.target_env_id == mapping.target_env_id, - DatabaseMapping.source_db_uuid == mapping.source_db_uuid - ).first() - - if existing: - existing.target_db_uuid = mapping.target_db_uuid - existing.target_db_name = mapping.target_db_name + with belief_scope("create_mapping"): + # Check if mapping already exists + existing = db.query(DatabaseMapping).filter( + DatabaseMapping.source_env_id == mapping.source_env_id, + DatabaseMapping.target_env_id == mapping.target_env_id, + DatabaseMapping.source_db_uuid == mapping.source_db_uuid + ).first() + + if existing: + existing.target_db_uuid = mapping.target_db_uuid + existing.target_db_name = mapping.target_db_name + db.commit() + db.refresh(existing) + return existing + + new_mapping = DatabaseMapping(**mapping.dict()) + db.add(new_mapping) db.commit() - db.refresh(existing) - return existing - - new_mapping = DatabaseMapping(**mapping.dict()) - db.add(new_mapping) - db.commit() - db.refresh(new_mapping) - return new_mapping + db.refresh(new_mapping) + return new_mapping # [/DEF:create_mapping:Function] # [DEF:suggest_mappings_api:Function] # @PURPOSE: Get suggested mappings based on fuzzy matching. +# @PRE: request is valid SuggestRequest, config_manager is injected. +# @POST: Returns mapping suggestions. @router.post("/suggest") async def suggest_mappings_api( request: SuggestRequest, config_manager=Depends(get_config_manager) ): - from backend.src.services.mapping_service import MappingService - service = MappingService(config_manager) - try: - return await service.get_suggestions(request.source_env_id, request.target_env_id) - except Exception as e: - raise HTTPException(status_code=500, detail=str(e)) + with belief_scope("suggest_mappings_api"): + from backend.src.services.mapping_service import MappingService + service = MappingService(config_manager) + try: + return await service.get_suggestions(request.source_env_id, request.target_env_id) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) # [/DEF:suggest_mappings_api:Function] # [/DEF:backend.src.api.routes.mappings:Module] diff --git a/backend/src/api/routes/plugins.py b/backend/src/api/routes/plugins.py index c992771..f47e853 100755 --- a/backend/src/api/routes/plugins.py +++ b/backend/src/api/routes/plugins.py @@ -11,12 +11,19 @@ from ...dependencies import get_plugin_loader router = APIRouter() +# [DEF:list_plugins:Function] +# @PURPOSE: Retrieve a list of all available plugins. +# @PRE: plugin_loader is injected via Depends. +# @POST: Returns a list of PluginConfig objects. +# @RETURN: List[PluginConfig] - List of registered plugins. @router.get("", response_model=List[PluginConfig]) async def list_plugins( plugin_loader = Depends(get_plugin_loader) ): - """ - Retrieve a list of all available plugins. - """ - return plugin_loader.get_all_plugin_configs() + with belief_scope("list_plugins"): + """ + Retrieve a list of all available plugins. + """ + return plugin_loader.get_all_plugin_configs() +# [/DEF:list_plugins:Function] # [/DEF:PluginsRouter:Module] \ No newline at end of file diff --git a/backend/src/api/routes/settings.py b/backend/src/api/routes/settings.py index 1367426..d79c497 100755 --- a/backend/src/api/routes/settings.py +++ b/backend/src/api/routes/settings.py @@ -15,7 +15,7 @@ from typing import List from ...core.config_models import AppConfig, Environment, GlobalSettings from ...dependencies import get_config_manager from ...core.config_manager import ConfigManager -from ...core.logger import logger +from ...core.logger import logger, belief_scope from ...core.superset_client import SupersetClient from superset_tool.models import SupersetConfig import os @@ -25,10 +25,13 @@ router = APIRouter() # [DEF:get_settings:Function] # @PURPOSE: Retrieves all application settings. +# @PRE: Config manager is available. +# @POST: Returns masked AppConfig. # @RETURN: AppConfig - The current configuration. @router.get("/", response_model=AppConfig) async def get_settings(config_manager: ConfigManager = Depends(get_config_manager)): - logger.info("[get_settings][Entry] Fetching all settings") + with belief_scope("get_settings"): + logger.info("[get_settings][Entry] Fetching all settings") config = config_manager.get_config().copy(deep=True) # Mask passwords for env in config.environments: @@ -39,29 +42,37 @@ async def get_settings(config_manager: ConfigManager = Depends(get_config_manage # [DEF:update_global_settings:Function] # @PURPOSE: Updates global application settings. +# @PRE: New settings are provided. +# @POST: Global settings are updated. # @PARAM: settings (GlobalSettings) - The new global settings. # @RETURN: GlobalSettings - The updated settings. @router.patch("/global", response_model=GlobalSettings) async def update_global_settings( - settings: GlobalSettings, + settings: GlobalSettings, config_manager: ConfigManager = Depends(get_config_manager) ): - logger.info("[update_global_settings][Entry] Updating global settings") + with belief_scope("update_global_settings"): + logger.info("[update_global_settings][Entry] Updating global settings") config_manager.update_global_settings(settings) return settings # [/DEF:update_global_settings:Function] # [DEF:get_environments:Function] # @PURPOSE: Lists all configured Superset environments. +# @PRE: Config manager is available. +# @POST: Returns list of environments. # @RETURN: List[Environment] - List of environments. @router.get("/environments", response_model=List[Environment]) async def get_environments(config_manager: ConfigManager = Depends(get_config_manager)): - logger.info("[get_environments][Entry] Fetching environments") + with belief_scope("get_environments"): + logger.info("[get_environments][Entry] Fetching environments") return config_manager.get_environments() # [/DEF:get_environments:Function] # [DEF:add_environment:Function] # @PURPOSE: Adds a new Superset environment. +# @PRE: Environment data is valid and reachable. +# @POST: Environment is added to config. # @PARAM: env (Environment) - The environment to add. # @RETURN: Environment - The added environment. @router.post("/environments", response_model=Environment) @@ -69,7 +80,8 @@ async def add_environment( env: Environment, config_manager: ConfigManager = Depends(get_config_manager) ): - logger.info(f"[add_environment][Entry] Adding environment {env.id}") + with belief_scope("add_environment"): + logger.info(f"[add_environment][Entry] Adding environment {env.id}") # Validate connection before adding try: @@ -95,16 +107,19 @@ async def add_environment( # [DEF:update_environment:Function] # @PURPOSE: Updates an existing Superset environment. +# @PRE: ID and valid environment data are provided. +# @POST: Environment is updated in config. # @PARAM: id (str) - The ID of the environment to update. # @PARAM: env (Environment) - The updated environment data. # @RETURN: Environment - The updated environment. @router.put("/environments/{id}", response_model=Environment) async def update_environment( - id: str, - env: Environment, + id: str, + env: Environment, config_manager: ConfigManager = Depends(get_config_manager) ): - logger.info(f"[update_environment][Entry] Updating environment {id}") + with belief_scope("update_environment"): + logger.info(f"[update_environment][Entry] Updating environment {id}") # If password is masked, we need the real one for validation env_to_validate = env.copy(deep=True) @@ -138,19 +153,24 @@ async def update_environment( # [DEF:delete_environment:Function] # @PURPOSE: Deletes a Superset environment. +# @PRE: ID is provided. +# @POST: Environment is removed from config. # @PARAM: id (str) - The ID of the environment to delete. @router.delete("/environments/{id}") async def delete_environment( - id: str, + id: str, config_manager: ConfigManager = Depends(get_config_manager) ): - logger.info(f"[delete_environment][Entry] Deleting environment {id}") + with belief_scope("delete_environment"): + logger.info(f"[delete_environment][Entry] Deleting environment {id}") config_manager.delete_environment(id) return {"message": f"Environment {id} deleted"} # [/DEF:delete_environment:Function] # [DEF:test_environment_connection:Function] # @PURPOSE: Tests the connection to a Superset environment. +# @PRE: ID is provided. +# @POST: Returns success or error status. # @PARAM: id (str) - The ID of the environment to test. # @RETURN: dict - Success message or error. @router.post("/environments/{id}/test") @@ -158,7 +178,8 @@ async def test_environment_connection( id: str, config_manager: ConfigManager = Depends(get_config_manager) ): - logger.info(f"[test_environment_connection][Entry] Testing environment {id}") + with belief_scope("test_environment_connection"): + logger.info(f"[test_environment_connection][Entry] Testing environment {id}") # Find environment env = next((e for e in config_manager.get_environments() if e.id == id), None) @@ -194,6 +215,8 @@ async def test_environment_connection( # [DEF:validate_backup_path:Function] # @PURPOSE: Validates if a backup path exists and is writable. +# @PRE: Path is provided in path_data. +# @POST: Returns success or error status. # @PARAM: path (str) - The path to validate. # @RETURN: dict - Validation result. @router.post("/validate-path") @@ -201,11 +224,12 @@ async def validate_backup_path( path_data: dict, config_manager: ConfigManager = Depends(get_config_manager) ): - path = path_data.get("path") - if not path: - raise HTTPException(status_code=400, detail="Path is required") - - logger.info(f"[validate_backup_path][Entry] Validating path: {path}") + with belief_scope("validate_backup_path"): + path = path_data.get("path") + if not path: + raise HTTPException(status_code=400, detail="Path is required") + + logger.info(f"[validate_backup_path][Entry] Validating path: {path}") valid, message = config_manager.validate_path(path) diff --git a/backend/src/api/routes/tasks.py b/backend/src/api/routes/tasks.py index e9cb456..006c76a 100755 --- a/backend/src/api/routes/tasks.py +++ b/backend/src/api/routes/tasks.py @@ -6,6 +6,7 @@ from typing import List, Dict, Any, Optional from fastapi import APIRouter, Depends, HTTPException, status from pydantic import BaseModel +from ...core.logger import belief_scope from ...core.task_manager import TaskManager, Task, TaskStatus, LogEntry from ...dependencies import get_task_manager @@ -23,6 +24,13 @@ class ResumeTaskRequest(BaseModel): passwords: Dict[str, str] @router.post("", response_model=Task, status_code=status.HTTP_201_CREATED) +# [DEF:create_task:Function] +# @PURPOSE: Create and start a new task for a given plugin. +# @PARAM: request (CreateTaskRequest) - The request body containing plugin_id and params. +# @PARAM: task_manager (TaskManager) - The task manager instance. +# @PRE: plugin_id must exist and params must be valid for that plugin. +# @POST: A new task is created and started. +# @RETURN: Task - The created task instance. async def create_task( request: CreateTaskRequest, task_manager: TaskManager = Depends(get_task_manager) @@ -30,16 +38,27 @@ async def create_task( """ Create and start a new task for a given plugin. """ - try: - task = await task_manager.create_task( - plugin_id=request.plugin_id, - params=request.params - ) - return task - except ValueError as e: - raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=str(e)) + with belief_scope("create_task"): + try: + task = await task_manager.create_task( + plugin_id=request.plugin_id, + params=request.params + ) + return task + except ValueError as e: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=str(e)) +# [/DEF:create_task:Function] @router.get("", response_model=List[Task]) +# [DEF:list_tasks:Function] +# @PURPOSE: Retrieve a list of tasks with pagination and optional status filter. +# @PARAM: limit (int) - Maximum number of tasks to return. +# @PARAM: offset (int) - Number of tasks to skip. +# @PARAM: status (Optional[TaskStatus]) - Filter by task status. +# @PARAM: task_manager (TaskManager) - The task manager instance. +# @PRE: task_manager must be available. +# @POST: Returns a list of tasks. +# @RETURN: List[Task] - List of tasks. async def list_tasks( limit: int = 10, offset: int = 0, @@ -49,9 +68,18 @@ async def list_tasks( """ Retrieve a list of tasks with pagination and optional status filter. """ - return task_manager.get_tasks(limit=limit, offset=offset, status=status) + with belief_scope("list_tasks"): + return task_manager.get_tasks(limit=limit, offset=offset, status=status) +# [/DEF:list_tasks:Function] @router.get("/{task_id}", response_model=Task) +# [DEF:get_task:Function] +# @PURPOSE: Retrieve the details of a specific task. +# @PARAM: task_id (str) - The unique identifier of the task. +# @PARAM: task_manager (TaskManager) - The task manager instance. +# @PRE: task_id must exist. +# @POST: Returns task details or raises 404. +# @RETURN: Task - The task details. async def get_task( task_id: str, task_manager: TaskManager = Depends(get_task_manager) @@ -59,12 +87,21 @@ async def get_task( """ Retrieve the details of a specific task. """ - task = task_manager.get_task(task_id) - if not task: - raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Task not found") - return task + with belief_scope("get_task"): + task = task_manager.get_task(task_id) + if not task: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Task not found") + return task +# [/DEF:get_task:Function] @router.get("/{task_id}/logs", response_model=List[LogEntry]) +# [DEF:get_task_logs:Function] +# @PURPOSE: Retrieve logs for a specific task. +# @PARAM: task_id (str) - The unique identifier of the task. +# @PARAM: task_manager (TaskManager) - The task manager instance. +# @PRE: task_id must exist. +# @POST: Returns a list of log entries or raises 404. +# @RETURN: List[LogEntry] - List of log entries. async def get_task_logs( task_id: str, task_manager: TaskManager = Depends(get_task_manager) @@ -72,12 +109,22 @@ async def get_task_logs( """ Retrieve logs for a specific task. """ - task = task_manager.get_task(task_id) - if not task: - raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Task not found") - return task_manager.get_task_logs(task_id) + with belief_scope("get_task_logs"): + task = task_manager.get_task(task_id) + if not task: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Task not found") + return task_manager.get_task_logs(task_id) +# [/DEF:get_task_logs:Function] @router.post("/{task_id}/resolve", response_model=Task) +# [DEF:resolve_task:Function] +# @PURPOSE: Resolve a task that is awaiting mapping. +# @PARAM: task_id (str) - The unique identifier of the task. +# @PARAM: request (ResolveTaskRequest) - The resolution parameters. +# @PARAM: task_manager (TaskManager) - The task manager instance. +# @PRE: task must be in AWAITING_MAPPING status. +# @POST: Task is resolved and resumes execution. +# @RETURN: Task - The updated task object. async def resolve_task( task_id: str, request: ResolveTaskRequest, @@ -86,13 +133,23 @@ async def resolve_task( """ Resolve a task that is awaiting mapping. """ - try: - await task_manager.resolve_task(task_id, request.resolution_params) - return task_manager.get_task(task_id) - except ValueError as e: - raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e)) + with belief_scope("resolve_task"): + try: + await task_manager.resolve_task(task_id, request.resolution_params) + return task_manager.get_task(task_id) + except ValueError as e: + raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e)) +# [/DEF:resolve_task:Function] @router.post("/{task_id}/resume", response_model=Task) +# [DEF:resume_task:Function] +# @PURPOSE: Resume a task that is awaiting input (e.g., passwords). +# @PARAM: task_id (str) - The unique identifier of the task. +# @PARAM: request (ResumeTaskRequest) - The input (passwords). +# @PARAM: task_manager (TaskManager) - The task manager instance. +# @PRE: task must be in AWAITING_INPUT status. +# @POST: Task resumes execution with provided input. +# @RETURN: Task - The updated task object. async def resume_task( task_id: str, request: ResumeTaskRequest, @@ -101,13 +158,21 @@ async def resume_task( """ Resume a task that is awaiting input (e.g., passwords). """ - try: - task_manager.resume_task_with_password(task_id, request.passwords) - return task_manager.get_task(task_id) - except ValueError as e: - raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e)) + with belief_scope("resume_task"): + try: + task_manager.resume_task_with_password(task_id, request.passwords) + return task_manager.get_task(task_id) + except ValueError as e: + raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e)) +# [/DEF:resume_task:Function] @router.delete("", status_code=status.HTTP_204_NO_CONTENT) +# [DEF:clear_tasks:Function] +# @PURPOSE: Clear tasks matching the status filter. +# @PARAM: status (Optional[TaskStatus]) - Filter by task status. +# @PARAM: task_manager (TaskManager) - The task manager instance. +# @PRE: task_manager is available. +# @POST: Tasks are removed from memory/persistence. async def clear_tasks( status: Optional[TaskStatus] = None, task_manager: TaskManager = Depends(get_task_manager) @@ -115,6 +180,8 @@ async def clear_tasks( """ Clear tasks matching the status filter. If no filter, clears all non-running tasks. """ - task_manager.clear_tasks(status) - return + with belief_scope("clear_tasks", f"status={status}"): + task_manager.clear_tasks(status) + return +# [/DEF:clear_tasks:Function] # [/DEF:TasksRouter:Module] \ No newline at end of file diff --git a/backend/src/app.py b/backend/src/app.py index bad8139..0b64842 100755 --- a/backend/src/app.py +++ b/backend/src/app.py @@ -19,7 +19,7 @@ import asyncio import os from .dependencies import get_task_manager, get_scheduler_service -from .core.logger import logger +from .core.logger import logger, belief_scope from .api.routes import plugins, tasks, settings, environments, mappings, migration, connections from .core.database import init_db @@ -33,17 +33,29 @@ app = FastAPI( ) # [/DEF:App:Global] +# [DEF:startup_event:Function] +# @PURPOSE: Handles application startup tasks, such as starting the scheduler. +# @PRE: None. +# @POST: Scheduler is started. # Startup event @app.on_event("startup") async def startup_event(): - scheduler = get_scheduler_service() + with belief_scope("startup_event"): + scheduler = get_scheduler_service() scheduler.start() +# [/DEF:startup_event:Function] +# [DEF:shutdown_event:Function] +# @PURPOSE: Handles application shutdown tasks, such as stopping the scheduler. +# @PRE: None. +# @POST: Scheduler is stopped. # Shutdown event @app.on_event("shutdown") async def shutdown_event(): - scheduler = get_scheduler_service() + with belief_scope("shutdown_event"): + scheduler = get_scheduler_service() scheduler.stop() +# [/DEF:shutdown_event:Function] # Configure CORS app.add_middleware( @@ -55,12 +67,20 @@ app.add_middleware( ) +# [DEF:log_requests:Function] +# @PURPOSE: Middleware to log incoming HTTP requests and their response status. +# @PRE: request is a FastAPI Request object. +# @POST: Logs request and response details. +# @PARAM: request (Request) - The incoming request object. +# @PARAM: call_next (Callable) - The next middleware or route handler. @app.middleware("http") async def log_requests(request: Request, call_next): - logger.info(f"[DEBUG] Incoming request: {request.method} {request.url.path}") - response = await call_next(request) - logger.info(f"[DEBUG] Response status: {response.status_code} for {request.url.path}") - return response + with belief_scope("log_requests", f"{request.method} {request.url.path}"): + logger.info(f"[DEBUG] Incoming request: {request.method} {request.url.path}") + response = await call_next(request) + logger.info(f"[DEBUG] Response status: {response.status_code} for {request.url.path}") + return response +# [/DEF:log_requests:Function] # Include API routes app.include_router(plugins.router, prefix="/api/plugins", tags=["Plugins"]) @@ -71,12 +91,14 @@ app.include_router(environments.router, prefix="/api/environments", tags=["Envir app.include_router(mappings.router) app.include_router(migration.router) -# [DEF:WebSocketEndpoint:Endpoint] -# @SEMANTICS: websocket, logs, streaming, real-time -# @PURPOSE: Provides a WebSocket endpoint for clients to connect to and receive real-time log entries for a specific task. +# [DEF:websocket_endpoint:Function] +# @PURPOSE: Provides a WebSocket endpoint for real-time log streaming of a task. +# @PRE: task_id must be a valid task ID. +# @POST: WebSocket connection is managed and logs are streamed until disconnect. @app.websocket("/ws/logs/{task_id}") async def websocket_endpoint(websocket: WebSocket, task_id: str): - await websocket.accept() + with belief_scope("websocket_endpoint", f"task_id={task_id}"): + await websocket.accept() logger.info(f"WebSocket connection accepted for task {task_id}") task_manager = get_task_manager() queue = await task_manager.subscribe_logs(task_id) @@ -126,7 +148,7 @@ async def websocket_endpoint(websocket: WebSocket, task_id: str): logger.error(f"WebSocket error for task {task_id}: {e}") finally: task_manager.unsubscribe_logs(task_id, queue) -# [/DEF:WebSocketEndpoint:Endpoint] +# [/DEF:websocket_endpoint:Function] # [DEF:StaticFiles:Mount] # @SEMANTICS: static, frontend, spa @@ -136,24 +158,32 @@ if frontend_path.exists(): app.mount("/_app", StaticFiles(directory=str(frontend_path / "_app")), name="static") # Serve other static files from the root of build directory + # [DEF:serve_spa:Function] + # @PURPOSE: Serves frontend static files or index.html for SPA routing. + # @PRE: file_path is requested by the client. + # @POST: Returns the requested file or index.html as a fallback. @app.get("/{file_path:path}") async def serve_spa(file_path: str): - # Don't serve SPA for API routes that fell through - if file_path.startswith("api/"): - raise HTTPException(status_code=404, detail="API endpoint not found") - - full_path = frontend_path / file_path - if full_path.is_file(): - return FileResponse(str(full_path)) - # Fallback to index.html for SPA routing - return FileResponse(str(frontend_path / "index.html")) + with belief_scope("serve_spa", f"path={file_path}"): + # Don't serve SPA for API routes that fell through + if file_path.startswith("api/"): + raise HTTPException(status_code=404, detail="API endpoint not found") + + full_path = frontend_path / file_path + if full_path.is_file(): + return FileResponse(str(full_path)) + # Fallback to index.html for SPA routing + return FileResponse(str(frontend_path / "index.html")) + # [/DEF:serve_spa:Function] else: - # [DEF:RootEndpoint:Endpoint] - # @SEMANTICS: root, healthcheck - # @PURPOSE: A simple root endpoint to confirm that the API is running. + # [DEF:read_root:Function] + # @PURPOSE: A simple root endpoint to confirm that the API is running when frontend is missing. + # @PRE: None. + # @POST: Returns a JSON message indicating API status. @app.get("/") async def read_root(): - return {"message": "Superset Tools API is running (Frontend build not found)"} -# [/DEF:RootEndpoint:Endpoint] + with belief_scope("read_root"): + return {"message": "Superset Tools API is running (Frontend build not found)"} + # [/DEF:read_root:Function] # [/DEF:StaticFiles:Mount] # [/DEF:AppModule:Module] diff --git a/backend/src/core/config_manager.py b/backend/src/core/config_manager.py index 03dd343..26856a5 100755 --- a/backend/src/core/config_manager.py +++ b/backend/src/core/config_manager.py @@ -30,30 +30,33 @@ class ConfigManager: # @POST: self.config is an instance of AppConfig # @PARAM: config_path (str) - Path to the configuration file. def __init__(self, config_path: str = "config.json"): - # 1. Runtime check of @PRE - assert isinstance(config_path, str) and config_path, "config_path must be a non-empty string" - - logger.info(f"[ConfigManager][Entry] Initializing with {config_path}") - - # 2. Logic implementation - self.config_path = Path(config_path) - self.config: AppConfig = self._load_config() + with belief_scope("__init__"): + # 1. Runtime check of @PRE + assert isinstance(config_path, str) and config_path, "config_path must be a non-empty string" + + logger.info(f"[ConfigManager][Entry] Initializing with {config_path}") + + # 2. Logic implementation + self.config_path = Path(config_path) + self.config: AppConfig = self._load_config() - # Configure logger with loaded settings - configure_logger(self.config.settings.logging) + # Configure logger with loaded settings + configure_logger(self.config.settings.logging) - # 3. Runtime check of @POST - assert isinstance(self.config, AppConfig), "self.config must be an instance of AppConfig" + # 3. Runtime check of @POST + assert isinstance(self.config, AppConfig), "self.config must be an instance of AppConfig" - logger.info(f"[ConfigManager][Exit] Initialized") + logger.info(f"[ConfigManager][Exit] Initialized") # [/DEF:__init__:Function] # [DEF:_load_config:Function] # @PURPOSE: Loads the configuration from disk or creates a default one. + # @PRE: self.config_path is set. # @POST: isinstance(return, AppConfig) # @RETURN: AppConfig - The loaded or default configuration. def _load_config(self) -> AppConfig: - logger.debug(f"[_load_config][Entry] Loading from {self.config_path}") + with belief_scope("_load_config"): + logger.debug(f"[_load_config][Entry] Loading from {self.config_path}") if not self.config_path.exists(): logger.info(f"[_load_config][Action] Config file not found. Creating default.") @@ -83,9 +86,11 @@ class ConfigManager: # [DEF:_save_config_to_disk:Function] # @PURPOSE: Saves the provided configuration object to disk. # @PRE: isinstance(config, AppConfig) + # @POST: Configuration saved to disk. # @PARAM: config (AppConfig) - The configuration to save. def _save_config_to_disk(self, config: AppConfig): - logger.debug(f"[_save_config_to_disk][Entry] Saving to {self.config_path}") + with belief_scope("_save_config_to_disk"): + logger.debug(f"[_save_config_to_disk][Entry] Saving to {self.config_path}") # 1. Runtime check of @PRE assert isinstance(config, AppConfig), "config must be an instance of AppConfig" @@ -101,23 +106,31 @@ class ConfigManager: # [DEF:save:Function] # @PURPOSE: Saves the current configuration state to disk. + # @PRE: self.config is set. + # @POST: self._save_config_to_disk called. def save(self): - self._save_config_to_disk(self.config) + with belief_scope("save"): + self._save_config_to_disk(self.config) # [/DEF:save:Function] # [DEF:get_config:Function] # @PURPOSE: Returns the current configuration. + # @PRE: self.config is set. + # @POST: Returns self.config. # @RETURN: AppConfig - The current configuration. def get_config(self) -> AppConfig: - return self.config + with belief_scope("get_config"): + return self.config # [/DEF:get_config:Function] # [DEF:update_global_settings:Function] # @PURPOSE: Updates the global settings and persists the change. # @PRE: isinstance(settings, GlobalSettings) + # @POST: self.config.settings updated and saved. # @PARAM: settings (GlobalSettings) - The new global settings. def update_global_settings(self, settings: GlobalSettings): - logger.info(f"[update_global_settings][Entry] Updating settings") + with belief_scope("update_global_settings"): + logger.info(f"[update_global_settings][Entry] Updating settings") # 1. Runtime check of @PRE assert isinstance(settings, GlobalSettings), "settings must be an instance of GlobalSettings" @@ -134,10 +147,13 @@ class ConfigManager: # [DEF:validate_path:Function] # @PURPOSE: Validates if a path exists and is writable. + # @PRE: path is a string. + # @POST: Returns (bool, str) status. # @PARAM: path (str) - The path to validate. # @RETURN: tuple (bool, str) - (is_valid, message) def validate_path(self, path: str) -> tuple[bool, str]: - p = os.path.abspath(path) + with belief_scope("validate_path"): + p = os.path.abspath(path) if not os.path.exists(p): try: os.makedirs(p, exist_ok=True) @@ -152,24 +168,32 @@ class ConfigManager: # [DEF:get_environments:Function] # @PURPOSE: Returns the list of configured environments. + # @PRE: self.config is set. + # @POST: Returns list of environments. # @RETURN: List[Environment] - List of environments. def get_environments(self) -> List[Environment]: - return self.config.environments + with belief_scope("get_environments"): + return self.config.environments # [/DEF:get_environments:Function] # [DEF:has_environments:Function] # @PURPOSE: Checks if at least one environment is configured. + # @PRE: self.config is set. + # @POST: Returns boolean indicating if environments exist. # @RETURN: bool - True if at least one environment exists. def has_environments(self) -> bool: - return len(self.config.environments) > 0 + with belief_scope("has_environments"): + return len(self.config.environments) > 0 # [/DEF:has_environments:Function] # [DEF:add_environment:Function] # @PURPOSE: Adds a new environment to the configuration. # @PRE: isinstance(env, Environment) + # @POST: Environment added or updated in self.config.environments. # @PARAM: env (Environment) - The environment to add. def add_environment(self, env: Environment): - logger.info(f"[add_environment][Entry] Adding environment {env.id}") + with belief_scope("add_environment"): + logger.info(f"[add_environment][Entry] Adding environment {env.id}") # 1. Runtime check of @PRE assert isinstance(env, Environment), "env must be an instance of Environment" @@ -186,11 +210,13 @@ class ConfigManager: # [DEF:update_environment:Function] # @PURPOSE: Updates an existing environment. # @PRE: isinstance(env_id, str) and len(env_id) > 0 and isinstance(updated_env, Environment) + # @POST: Returns True if environment was found and updated. # @PARAM: env_id (str) - The ID of the environment to update. # @PARAM: updated_env (Environment) - The updated environment data. # @RETURN: bool - True if updated, False otherwise. def update_environment(self, env_id: str, updated_env: Environment) -> bool: - logger.info(f"[update_environment][Entry] Updating {env_id}") + with belief_scope("update_environment"): + logger.info(f"[update_environment][Entry] Updating {env_id}") # 1. Runtime check of @PRE assert env_id and isinstance(env_id, str), "env_id must be a non-empty string" @@ -215,9 +241,11 @@ class ConfigManager: # [DEF:delete_environment:Function] # @PURPOSE: Deletes an environment by ID. # @PRE: isinstance(env_id, str) and len(env_id) > 0 + # @POST: Environment removed from self.config.environments if it existed. # @PARAM: env_id (str) - The ID of the environment to delete. def delete_environment(self, env_id: str): - logger.info(f"[delete_environment][Entry] Deleting {env_id}") + with belief_scope("delete_environment"): + logger.info(f"[delete_environment][Entry] Deleting {env_id}") # 1. Runtime check of @PRE assert env_id and isinstance(env_id, str), "env_id must be a non-empty string" diff --git a/backend/src/core/database.py b/backend/src/core/database.py index a532368..681c6e4 100644 --- a/backend/src/core/database.py +++ b/backend/src/core/database.py @@ -46,33 +46,40 @@ TasksSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=tasks_e # [DEF:init_db:Function] # @PURPOSE: Initializes the database by creating all tables. +# @PRE: engine and tasks_engine are initialized. +# @POST: Database tables created. def init_db(): - Base.metadata.create_all(bind=engine) - Base.metadata.create_all(bind=tasks_engine) + with belief_scope("init_db"): + Base.metadata.create_all(bind=engine) + Base.metadata.create_all(bind=tasks_engine) # [/DEF:init_db:Function] # [DEF:get_db:Function] # @PURPOSE: Dependency for getting a database session. +# @PRE: SessionLocal is initialized. # @POST: Session is closed after use. # @RETURN: Generator[Session, None, None] def get_db(): - db = SessionLocal() - try: - yield db - finally: - db.close() + with belief_scope("get_db"): + db = SessionLocal() + try: + yield db + finally: + db.close() # [/DEF:get_db:Function] # [DEF:get_tasks_db:Function] # @PURPOSE: Dependency for getting a tasks database session. +# @PRE: TasksSessionLocal is initialized. # @POST: Session is closed after use. # @RETURN: Generator[Session, None, None] def get_tasks_db(): - db = TasksSessionLocal() - try: - yield db - finally: - db.close() + with belief_scope("get_tasks_db"): + db = TasksSessionLocal() + try: + yield db + finally: + db.close() # [/DEF:get_tasks_db:Function] # [/DEF:backend.src.core.database:Module] diff --git a/backend/src/core/logger.py b/backend/src/core/logger.py index c18e701..cb0ef82 100755 --- a/backend/src/core/logger.py +++ b/backend/src/core/logger.py @@ -22,12 +22,19 @@ _enable_belief_state = True # [DEF:BeliefFormatter:Class] # @PURPOSE: Custom logging formatter that adds belief state prefixes to log messages. class BeliefFormatter(logging.Formatter): + # [DEF:format:Function] + # @PURPOSE: Formats the log record, adding belief state context if available. + # @PRE: record is a logging.LogRecord. + # @POST: Returns formatted string. + # @PARAM: record (logging.LogRecord) - The log record to format. + # @RETURN: str - The formatted log message. def format(self, record): msg = super().format(record) anchor_id = getattr(_belief_state, 'anchor_id', None) if anchor_id: msg = f"[{anchor_id}][Action] {msg}" return msg + # [/DEF:format:Function] # [/DEF:BeliefFormatter:Class] # Re-using LogEntry from task_manager for consistency @@ -42,8 +49,12 @@ class LogEntry(BaseModel): # [/DEF:LogEntry:Class] -# [DEF:BeliefScope:Function] +# [DEF:belief_scope:Function] # @PURPOSE: Context manager for structured Belief State logging. +# @PARAM: anchor_id (str) - The identifier for the current semantic block. +# @PARAM: message (str) - Optional entry message. +# @PRE: anchor_id must be provided. +# @POST: Thread-local belief state is updated and entry/exit logs are generated. @contextmanager def belief_scope(anchor_id: str, message: str = ""): # Log Entry if enabled @@ -71,9 +82,9 @@ def belief_scope(anchor_id: str, message: str = ""): # Restore old anchor _belief_state.anchor_id = old_anchor -# [/DEF:BeliefScope:Function] +# [/DEF:belief_scope:Function] -# [DEF:ConfigureLogger:Function] +# [DEF:configure_logger:Function] # @PURPOSE: Configures the logger with the provided logging settings. # @PRE: config is a valid LoggingConfig instance. # @POST: Logger level, handlers, and belief state flag are updated. @@ -115,7 +126,7 @@ def configure_logger(config): handler.setFormatter(BeliefFormatter( '[%(asctime)s][%(levelname)s][%(name)s] %(message)s' )) -# [/DEF:ConfigureLogger:Function] +# [/DEF:configure_logger:Function] # [DEF:WebSocketLogHandler:Class] # @SEMANTICS: logging, handler, websocket, buffer @@ -125,38 +136,59 @@ class WebSocketLogHandler(logging.Handler): A logging handler that stores log records and can be extended to send them over WebSockets. """ + # [DEF:__init__:Function] + # @PURPOSE: Initializes the handler with a fixed-capacity buffer. + # @PRE: capacity is an integer. + # @POST: Instance initialized with empty deque. + # @PARAM: capacity (int) - Maximum number of logs to keep in memory. def __init__(self, capacity: int = 1000): - super().__init__() - self.log_buffer: deque[LogEntry] = deque(maxlen=capacity) + with belief_scope("WebSocketLogHandler.__init__"): + super().__init__() + self.log_buffer: deque[LogEntry] = deque(maxlen=capacity) # In a real implementation, you'd have a way to manage active WebSocket connections # e.g., self.active_connections: Set[WebSocket] = set() + # [/DEF:__init__:Function] + # [DEF:emit:Function] + # @PURPOSE: Captures a log record, formats it, and stores it in the buffer. + # @PRE: record is a logging.LogRecord. + # @POST: Log is added to the log_buffer. + # @PARAM: record (logging.LogRecord) - The log record to emit. def emit(self, record: logging.LogRecord): - try: - log_entry = LogEntry( - level=record.levelname, - message=self.format(record), - context={ - "name": record.name, - "pathname": record.pathname, - "lineno": record.lineno, - "funcName": record.funcName, - "process": record.process, - "thread": record.thread, - } - ) - self.log_buffer.append(log_entry) - # Here you would typically send the log_entry to all active WebSocket connections - # for real-time streaming to the frontend. - # Example: for ws in self.active_connections: await ws.send_json(log_entry.dict()) - except Exception: - self.handleError(record) + with belief_scope("WebSocketLogHandler.emit"): + try: + log_entry = LogEntry( + level=record.levelname, + message=self.format(record), + context={ + "name": record.name, + "pathname": record.pathname, + "lineno": record.lineno, + "funcName": record.funcName, + "process": record.process, + "thread": record.thread, + } + ) + self.log_buffer.append(log_entry) + # Here you would typically send the log_entry to all active WebSocket connections + # for real-time streaming to the frontend. + # Example: for ws in self.active_connections: await ws.send_json(log_entry.dict()) + except Exception: + self.handleError(record) + # [/DEF:emit:Function] + # [DEF:get_recent_logs:Function] + # @PURPOSE: Returns a list of recent log entries from the buffer. + # @PRE: None. + # @POST: Returns list of LogEntry objects. + # @RETURN: List[LogEntry] - List of buffered log entries. def get_recent_logs(self) -> List[LogEntry]: - """ - Returns a list of recent log entries from the buffer. - """ - return list(self.log_buffer) + with belief_scope("WebSocketLogHandler.get_recent_logs"): + """ + Returns a list of recent log entries from the buffer. + """ + return list(self.log_buffer) + # [/DEF:get_recent_logs:Function] # [/DEF:WebSocketLogHandler:Class] diff --git a/backend/src/core/migration_engine.py b/backend/src/core/migration_engine.py index 67eebb5..f186149 100644 --- a/backend/src/core/migration_engine.py +++ b/backend/src/core/migration_engine.py @@ -23,12 +23,14 @@ import yaml # @PURPOSE: Engine for transforming Superset export ZIPs. class MigrationEngine: - # [DEF:MigrationEngine.transform_zip:Function] + # [DEF:transform_zip:Function] # @PURPOSE: Extracts ZIP, replaces database UUIDs in YAMLs, and re-packages. # @PARAM: zip_path (str) - Path to the source ZIP file. # @PARAM: output_path (str) - Path where the transformed ZIP will be saved. # @PARAM: db_mapping (Dict[str, str]) - Mapping of source UUID to target UUID. # @PARAM: strip_databases (bool) - Whether to remove the databases directory from the archive. + # @PRE: zip_path must point to a valid Superset export archive. + # @POST: Transformed archive is saved to output_path. # @RETURN: bool - True if successful. def transform_zip(self, zip_path: str, output_path: str, db_mapping: Dict[str, str], strip_databases: bool = True) -> bool: """ @@ -73,10 +75,14 @@ class MigrationEngine: except Exception as e: logger.error(f"[MigrationEngine.transform_zip][Coherence:Failed] Error transforming ZIP: {e}") return False - # [/DEF:MigrationEngine.transform_zip:Function] + # [/DEF:transform_zip:Function] - # [DEF:MigrationEngine._transform_yaml:Function] + # [DEF:_transform_yaml:Function] # @PURPOSE: Replaces database_uuid in a single YAML file. + # @PARAM: file_path (Path) - Path to the YAML file. + # @PARAM: db_mapping (Dict[str, str]) - UUID mapping dictionary. + # @PRE: file_path must exist and be readable. + # @POST: File is modified in-place if source UUID matches mapping. def _transform_yaml(self, file_path: Path, db_mapping: Dict[str, str]): with open(file_path, 'r') as f: data = yaml.safe_load(f) @@ -91,7 +97,7 @@ class MigrationEngine: data['database_uuid'] = db_mapping[source_uuid] with open(file_path, 'w') as f: yaml.dump(data, f) - # [/DEF:MigrationEngine._transform_yaml:Function] + # [/DEF:_transform_yaml:Function] # [/DEF:MigrationEngine:Class] diff --git a/backend/src/core/plugin_base.py b/backend/src/core/plugin_base.py index 64431f6..64a4d85 100755 --- a/backend/src/core/plugin_base.py +++ b/backend/src/core/plugin_base.py @@ -1,5 +1,6 @@ from abc import ABC, abstractmethod from typing import Dict, Any +from .logger import belief_scope from pydantic import BaseModel, Field @@ -17,43 +18,86 @@ class PluginBase(ABC): @property @abstractmethod + # [DEF:id:Function] + # @PURPOSE: Returns the unique identifier for the plugin. + # @PRE: Plugin instance exists. + # @POST: Returns string ID. + # @RETURN: str - Plugin ID. def id(self) -> str: """A unique identifier for the plugin.""" - pass + with belief_scope("id"): + pass + # [/DEF:id:Function] @property @abstractmethod + # [DEF:name:Function] + # @PURPOSE: Returns the human-readable name of the plugin. + # @PRE: Plugin instance exists. + # @POST: Returns string name. + # @RETURN: str - Plugin name. def name(self) -> str: """A human-readable name for the plugin.""" - pass + with belief_scope("name"): + pass + # [/DEF:name:Function] @property @abstractmethod + # [DEF:description:Function] + # @PURPOSE: Returns a brief description of the plugin. + # @PRE: Plugin instance exists. + # @POST: Returns string description. + # @RETURN: str - Plugin description. def description(self) -> str: """A brief description of what the plugin does.""" - pass + with belief_scope("description"): + pass + # [/DEF:description:Function] @property @abstractmethod + # [DEF:version:Function] + # @PURPOSE: Returns the version of the plugin. + # @PRE: Plugin instance exists. + # @POST: Returns string version. + # @RETURN: str - Plugin version. def version(self) -> str: """The version of the plugin.""" - pass + with belief_scope("version"): + pass + # [/DEF:version:Function] @abstractmethod + # [DEF:get_schema:Function] + # @PURPOSE: Returns the JSON schema for the plugin's input parameters. + # @PRE: Plugin instance exists. + # @POST: Returns dict schema. + # @RETURN: Dict[str, Any] - JSON schema. def get_schema(self) -> Dict[str, Any]: """ Returns the JSON schema for the plugin's input parameters. This schema will be used to generate the frontend form. """ - pass + with belief_scope("get_schema"): + pass + # [/DEF:get_schema:Function] @abstractmethod + # [DEF:execute:Function] + # @PURPOSE: Executes the plugin's core logic. + # @PARAM: params (Dict[str, Any]) - Validated input parameters. + # @PRE: params must be a dictionary. + # @POST: Plugin execution is completed. async def execute(self, params: Dict[str, Any]): + with belief_scope("execute"): + pass """ Executes the plugin's logic. The `params` argument will be validated against the schema returned by `get_schema()`. """ pass + # [/DEF:execute:Function] # [/DEF:PluginBase:Class] # [DEF:PluginConfig:Class] diff --git a/backend/src/core/plugin_loader.py b/backend/src/core/plugin_loader.py index b9cecb7..b8bec97 100755 --- a/backend/src/core/plugin_loader.py +++ b/backend/src/core/plugin_loader.py @@ -4,6 +4,7 @@ import sys # Added this line from typing import Dict, Type, List, Optional from .plugin_base import PluginBase, PluginConfig from jsonschema import validate +from .logger import belief_scope # [DEF:PluginLoader:Class] # @SEMANTICS: plugin, loader, dynamic, import @@ -16,22 +17,28 @@ class PluginLoader: that inherit from PluginBase. """ - # [DEF:PluginLoader.__init__:Function] + # [DEF:__init__:Function] # @PURPOSE: Initializes the PluginLoader with a directory to scan. + # @PRE: plugin_dir is a valid directory path. + # @POST: Plugins are loaded and registered. # @PARAM: plugin_dir (str) - The directory containing plugin modules. def __init__(self, plugin_dir: str): - self.plugin_dir = plugin_dir - self._plugins: Dict[str, PluginBase] = {} - self._plugin_configs: Dict[str, PluginConfig] = {} - self._load_plugins() - # [/DEF:PluginLoader.__init__:Function] + with belief_scope("__init__"): + self.plugin_dir = plugin_dir + self._plugins: Dict[str, PluginBase] = {} + self._plugin_configs: Dict[str, PluginConfig] = {} + self._load_plugins() + # [/DEF:__init__:Function] - # [DEF:PluginLoader._load_plugins:Function] + # [DEF:_load_plugins:Function] # @PURPOSE: Scans the plugin directory and loads all valid plugins. + # @PRE: plugin_dir exists or can be created. + # @POST: _load_module is called for each .py file. def _load_plugins(self): - """ - Scans the plugin directory, imports modules, and registers valid plugins. - """ + with belief_scope("_load_plugins"): + """ + Scans the plugin directory, imports modules, and registers valid plugins. + """ if not os.path.exists(self.plugin_dir): os.makedirs(self.plugin_dir) @@ -47,16 +54,19 @@ class PluginLoader: module_name = filename[:-3] file_path = os.path.join(self.plugin_dir, filename) self._load_module(module_name, file_path) - # [/DEF:PluginLoader._load_plugins:Function] + # [/DEF:_load_plugins:Function] - # [DEF:PluginLoader._load_module:Function] + # [DEF:_load_module:Function] # @PURPOSE: Loads a single Python module and discovers PluginBase implementations. + # @PRE: module_name and file_path are valid. + # @POST: Plugin classes are instantiated and registered. # @PARAM: module_name (str) - The name of the module. # @PARAM: file_path (str) - The path to the module file. def _load_module(self, module_name: str, file_path: str): - """ - Loads a single Python module and extracts PluginBase subclasses. - """ + with belief_scope("_load_module"): + """ + Loads a single Python module and extracts PluginBase subclasses. + """ # Try to determine the correct package prefix based on how the app is running # For standalone execution, we need to handle the import differently if __name__ == "__main__" or "test" in __name__: @@ -94,15 +104,18 @@ class PluginLoader: self._register_plugin(plugin_instance) except Exception as e: print(f"Error instantiating plugin {attribute_name} in {module_name}: {e}") # Replace with proper logging - # [/DEF:PluginLoader._load_module:Function] + # [/DEF:_load_module:Function] - # [DEF:PluginLoader._register_plugin:Function] + # [DEF:_register_plugin:Function] # @PURPOSE: Registers a PluginBase instance and its configuration. + # @PRE: plugin_instance is a valid implementation of PluginBase. + # @POST: Plugin is added to _plugins and _plugin_configs. # @PARAM: plugin_instance (PluginBase) - The plugin instance to register. def _register_plugin(self, plugin_instance: PluginBase): - """ - Registers a valid plugin instance. - """ + with belief_scope("_register_plugin"): + """ + Registers a valid plugin instance. + """ plugin_id = plugin_instance.id if plugin_id in self._plugins: print(f"Warning: Duplicate plugin ID '{plugin_id}' found. Skipping.") # Replace with proper logging @@ -131,39 +144,48 @@ class PluginLoader: except Exception as e: from ..core.logger import logger logger.error(f"Error validating plugin '{plugin_instance.name}' (ID: {plugin_id}): {e}") - # [/DEF:PluginLoader._register_plugin:Function] + # [/DEF:_register_plugin:Function] - # [DEF:PluginLoader.get_plugin:Function] + # [DEF:get_plugin:Function] # @PURPOSE: Retrieves a loaded plugin instance by its ID. + # @PRE: plugin_id is a string. + # @POST: Returns plugin instance or None. # @PARAM: plugin_id (str) - The unique identifier of the plugin. # @RETURN: Optional[PluginBase] - The plugin instance if found, otherwise None. def get_plugin(self, plugin_id: str) -> Optional[PluginBase]: - """ - Returns a loaded plugin instance by its ID. - """ + with belief_scope("get_plugin"): + """ + Returns a loaded plugin instance by its ID. + """ return self._plugins.get(plugin_id) - # [/DEF:PluginLoader.get_plugin:Function] + # [/DEF:get_plugin:Function] - # [DEF:PluginLoader.get_all_plugin_configs:Function] + # [DEF:get_all_plugin_configs:Function] # @PURPOSE: Returns a list of all registered plugin configurations. + # @PRE: None. + # @POST: Returns list of all PluginConfig objects. # @RETURN: List[PluginConfig] - A list of plugin configurations. def get_all_plugin_configs(self) -> List[PluginConfig]: - """ - Returns a list of all loaded plugin configurations. - """ + with belief_scope("get_all_plugin_configs"): + """ + Returns a list of all loaded plugin configurations. + """ return list(self._plugin_configs.values()) - # [/DEF:PluginLoader.get_all_plugin_configs:Function] + # [/DEF:get_all_plugin_configs:Function] - # [DEF:PluginLoader.has_plugin:Function] + # [DEF:has_plugin:Function] # @PURPOSE: Checks if a plugin with the given ID is registered. + # @PRE: plugin_id is a string. + # @POST: Returns True if plugin exists. # @PARAM: plugin_id (str) - The unique identifier of the plugin. # @RETURN: bool - True if the plugin is registered, False otherwise. def has_plugin(self, plugin_id: str) -> bool: - """ - Checks if a plugin with the given ID is loaded. - """ + with belief_scope("has_plugin"): + """ + Checks if a plugin with the given ID is loaded. + """ return plugin_id in self._plugins - # [/DEF:PluginLoader.has_plugin:Function] + # [/DEF:has_plugin:Function] # [/DEF:PluginLoader:Class] \ No newline at end of file diff --git a/backend/src/core/scheduler.py b/backend/src/core/scheduler.py index 7dd2ffe..d43c819 100644 --- a/backend/src/core/scheduler.py +++ b/backend/src/core/scheduler.py @@ -17,34 +17,45 @@ import asyncio # @SEMANTICS: scheduler, service, apscheduler # @PURPOSE: Provides a service to manage scheduled backup tasks. class SchedulerService: + # [DEF:__init__:Function] + # @PURPOSE: Initializes the scheduler service with task and config managers. + # @PRE: task_manager and config_manager must be provided. + # @POST: Scheduler instance is created but not started. def __init__(self, task_manager, config_manager: ConfigManager): with belief_scope("SchedulerService.__init__"): self.task_manager = task_manager self.config_manager = config_manager self.scheduler = BackgroundScheduler() self.loop = asyncio.get_event_loop() + # [/DEF:__init__:Function] - # [DEF:SchedulerService.start:Function] + # [DEF:start:Function] # @PURPOSE: Starts the background scheduler and loads initial schedules. + # @PRE: Scheduler should be initialized. + # @POST: Scheduler is running and schedules are loaded. def start(self): with belief_scope("SchedulerService.start"): if not self.scheduler.running: self.scheduler.start() logger.info("Scheduler started.") self.load_schedules() - # [/DEF:SchedulerService.start:Function] + # [/DEF:start:Function] - # [DEF:SchedulerService.stop:Function] + # [DEF:stop:Function] # @PURPOSE: Stops the background scheduler. + # @PRE: Scheduler should be running. + # @POST: Scheduler is shut down. def stop(self): with belief_scope("SchedulerService.stop"): if self.scheduler.running: self.scheduler.shutdown() logger.info("Scheduler stopped.") - # [/DEF:SchedulerService.stop:Function] + # [/DEF:stop:Function] - # [DEF:SchedulerService.load_schedules:Function] + # [DEF:load_schedules:Function] # @PURPOSE: Loads backup schedules from configuration and registers them. + # @PRE: config_manager must have valid configuration. + # @POST: All enabled backup jobs are added to the scheduler. def load_schedules(self): with belief_scope("SchedulerService.load_schedules"): # Clear existing jobs @@ -54,12 +65,14 @@ class SchedulerService: for env in config.environments: if env.backup_schedule and env.backup_schedule.enabled: self.add_backup_job(env.id, env.backup_schedule.cron_expression) - # [/DEF:SchedulerService.load_schedules:Function] + # [/DEF:load_schedules:Function] - # [DEF:SchedulerService.add_backup_job:Function] + # [DEF:add_backup_job:Function] # @PURPOSE: Adds a scheduled backup job for an environment. - # @PARAM: env_id (str) - The ID of the environment. - # @PARAM: cron_expression (str) - The cron expression for the schedule. + # @PRE: env_id and cron_expression must be valid strings. + # @POST: A new job is added to the scheduler or replaced if it already exists. + # @PARAM: env_id (str) - The ID of the environment. + # @PARAM: cron_expression (str) - The cron expression for the schedule. def add_backup_job(self, env_id: str, cron_expression: str): with belief_scope("SchedulerService.add_backup_job", f"env_id={env_id}, cron={cron_expression}"): job_id = f"backup_{env_id}" @@ -74,11 +87,13 @@ class SchedulerService: logger.info(f"Scheduled backup job added for environment {env_id}: {cron_expression}") except Exception as e: logger.error(f"Failed to add backup job for environment {env_id}: {e}") - # [/DEF:SchedulerService.add_backup_job:Function] + # [/DEF:add_backup_job:Function] - # [DEF:SchedulerService._trigger_backup:Function] + # [DEF:_trigger_backup:Function] # @PURPOSE: Triggered by the scheduler to start a backup task. - # @PARAM: env_id (str) - The ID of the environment. + # @PRE: env_id must be a valid environment ID. + # @POST: A new backup task is created in the task manager if not already running. + # @PARAM: env_id (str) - The ID of the environment. def _trigger_backup(self, env_id: str): with belief_scope("SchedulerService._trigger_backup", f"env_id={env_id}"): logger.info(f"Triggering scheduled backup for environment {env_id}") @@ -98,7 +113,7 @@ class SchedulerService: self.task_manager.create_task("superset-backup", {"environment_id": env_id}), self.loop ) - # [/DEF:SchedulerService._trigger_backup:Function] + # [/DEF:_trigger_backup:Function] # [/DEF:SchedulerService:Class] # [/DEF:SchedulerModule:Module] \ No newline at end of file diff --git a/backend/src/core/superset_client.py b/backend/src/core/superset_client.py index 564aeb0..ebf15dd 100644 --- a/backend/src/core/superset_client.py +++ b/backend/src/core/superset_client.py @@ -9,6 +9,7 @@ # [SECTION: IMPORTS] from typing import List, Dict, Optional, Tuple +from backend.src.core.logger import belief_scope from superset_tool.client import SupersetClient as BaseSupersetClient from superset_tool.models import SupersetConfig # [/SECTION] @@ -17,88 +18,101 @@ from superset_tool.models import SupersetConfig # @PURPOSE: Extended SupersetClient for migration-specific operations. class SupersetClient(BaseSupersetClient): - # [DEF:SupersetClient.get_databases_summary:Function] + # [DEF:get_databases_summary:Function] # @PURPOSE: Fetch a summary of databases including uuid, name, and engine. - # @POST: Returns a list of database dictionaries with 'engine' field. - # @RETURN: List[Dict] - Summary of databases. + # @PRE: self.network must be initialized and authenticated. + # @POST: Returns a list of database dictionaries with 'engine' field. + # @RETURN: List[Dict] - Summary of databases. def get_databases_summary(self) -> List[Dict]: - """ - Fetch a summary of databases including uuid, name, and engine. - """ - query = { - "columns": ["uuid", "database_name", "backend"] - } - _, databases = self.get_databases(query=query) - - # Map 'backend' to 'engine' for consistency with contracts - for db in databases: - db['engine'] = db.pop('backend', None) + with belief_scope("SupersetClient.get_databases_summary"): + """ + Fetch a summary of databases including uuid, name, and engine. + """ + query = { + "columns": ["uuid", "database_name", "backend"] + } + _, databases = self.get_databases(query=query) - return databases - # [/DEF:SupersetClient.get_databases_summary:Function] + # Map 'backend' to 'engine' for consistency with contracts + for db in databases: + db['engine'] = db.pop('backend', None) + + return databases + # [/DEF:get_databases_summary:Function] - # [DEF:SupersetClient.get_database_by_uuid:Function] + # [DEF:get_database_by_uuid:Function] # @PURPOSE: Find a database by its UUID. - # @PARAM: db_uuid (str) - The UUID of the database. - # @RETURN: Optional[Dict] - Database info if found, else None. + # @PRE: db_uuid must be a string. + # @POST: Returns database metadata if found. + # @PARAM: db_uuid (str) - The UUID of the database. + # @RETURN: Optional[Dict] - Database info if found, else None. def get_database_by_uuid(self, db_uuid: str) -> Optional[Dict]: - """ - Find a database by its UUID. - """ - query = { - "filters": [{"col": "uuid", "op": "eq", "value": db_uuid}] - } - _, databases = self.get_databases(query=query) - return databases[0] if databases else None - # [/DEF:SupersetClient.get_database_by_uuid:Function] + with belief_scope("SupersetClient.get_database_by_uuid", f"uuid={db_uuid}"): + """ + Find a database by its UUID. + """ + query = { + "filters": [{"col": "uuid", "op": "eq", "value": db_uuid}] + } + _, databases = self.get_databases(query=query) + return databases[0] if databases else None + # [/DEF:get_database_by_uuid:Function] - # [DEF:SupersetClient.get_dashboards_summary:Function] + # [DEF:get_dashboards_summary:Function] # @PURPOSE: Fetches dashboard metadata optimized for the grid. - # @POST: Returns a list of dashboard dictionaries. - # @RETURN: List[Dict] + # @PRE: self.network must be authenticated. + # @POST: Returns a list of dashboard dictionaries mapped to the grid schema. + # @RETURN: List[Dict] def get_dashboards_summary(self) -> List[Dict]: - """ - Fetches dashboard metadata optimized for the grid. - Returns a list of dictionaries mapped to DashboardMetadata fields. - """ - query = { - "columns": ["id", "dashboard_title", "changed_on_utc", "published"] - } - _, dashboards = self.get_dashboards(query=query) + with belief_scope("SupersetClient.get_dashboards_summary"): + """ + Fetches dashboard metadata optimized for the grid. + Returns a list of dictionaries mapped to DashboardMetadata fields. + """ + query = { + "columns": ["id", "dashboard_title", "changed_on_utc", "published"] + } + _, dashboards = self.get_dashboards(query=query) - # Map fields to DashboardMetadata schema - result = [] - for dash in dashboards: - result.append({ - "id": dash.get("id"), - "title": dash.get("dashboard_title"), - "last_modified": dash.get("changed_on_utc"), - "status": "published" if dash.get("published") else "draft" - }) - return result - # [/DEF:SupersetClient.get_dashboards_summary:Function] + # Map fields to DashboardMetadata schema + result = [] + for dash in dashboards: + result.append({ + "id": dash.get("id"), + "title": dash.get("dashboard_title"), + "last_modified": dash.get("changed_on_utc"), + "status": "published" if dash.get("published") else "draft" + }) + return result + # [/DEF:get_dashboards_summary:Function] - # [DEF:SupersetClient.get_dataset:Function] + # [DEF:get_dataset:Function] # @PURPOSE: Fetch full dataset structure including columns and metrics. - # @PARAM: dataset_id (int) - The ID of the dataset. - # @RETURN: Dict - The dataset metadata. + # @PRE: dataset_id must be a valid integer. + # @POST: Returns full dataset metadata from Superset API. + # @PARAM: dataset_id (int) - The ID of the dataset. + # @RETURN: Dict - The dataset metadata. def get_dataset(self, dataset_id: int) -> Dict: - """ - Fetch full dataset structure. - """ - return self.network.get(f"/api/v1/dataset/{dataset_id}").json() - # [/DEF:SupersetClient.get_dataset:Function] + with belief_scope("SupersetClient.get_dataset", f"id={dataset_id}"): + """ + Fetch full dataset structure. + """ + return self.network.get(f"/api/v1/dataset/{dataset_id}").json() + # [/DEF:get_dataset:Function] - # [DEF:SupersetClient.update_dataset:Function] + # [DEF:update_dataset:Function] # @PURPOSE: Update dataset metadata. - # @PARAM: dataset_id (int) - The ID of the dataset. - # @PARAM: data (Dict) - The payload for update. + # @PRE: dataset_id must be valid, data must be a valid Superset dataset payload. + # @POST: Dataset is updated in Superset. + # @PARAM: dataset_id (int) - The ID of the dataset. + # @PARAM: data (Dict) - The payload for update. def update_dataset(self, dataset_id: int, data: Dict): - """ - Update dataset metadata. - """ - self.network.put(f"/api/v1/dataset/{dataset_id}", json=data) - # [/DEF:SupersetClient.update_dataset:Function] + with belief_scope("SupersetClient.update_dataset", f"id={dataset_id}"): + """ + Update dataset metadata. + """ + self.network.put(f"/api/v1/dataset/{dataset_id}", json=data) + # [/DEF:update_dataset:Function] # [/DEF:SupersetClient:Class] diff --git a/backend/src/core/task_manager/manager.py b/backend/src/core/task_manager/manager.py index c66db5c..391854f 100644 --- a/backend/src/core/task_manager/manager.py +++ b/backend/src/core/task_manager/manager.py @@ -186,17 +186,23 @@ class TaskManager: # [DEF:get_task:Function] # @PURPOSE: Retrieves a task by its ID. + # @PRE: task_id is a string. + # @POST: Returns Task object or None. # @PARAM: task_id (str) - ID of the task. # @RETURN: Optional[Task] - The task or None. def get_task(self, task_id: str) -> Optional[Task]: - return self.tasks.get(task_id) + with belief_scope("TaskManager.get_task", f"task_id={task_id}"): + return self.tasks.get(task_id) # [/DEF:get_task:Function] # [DEF:get_all_tasks:Function] # @PURPOSE: Retrieves all registered tasks. + # @PRE: None. + # @POST: Returns list of all Task objects. # @RETURN: List[Task] - All tasks. def get_all_tasks(self) -> List[Task]: - return list(self.tasks.values()) + with belief_scope("TaskManager.get_all_tasks"): + return list(self.tasks.values()) # [/DEF:get_all_tasks:Function] # [DEF:get_tasks:Function] @@ -208,7 +214,8 @@ class TaskManager: # @PARAM: status (Optional[TaskStatus]) - Filter by task status. # @RETURN: List[Task] - List of tasks matching criteria. def get_tasks(self, limit: int = 10, offset: int = 0, status: Optional[TaskStatus] = None) -> List[Task]: - tasks = list(self.tasks.values()) + with belief_scope("TaskManager.get_tasks"): + tasks = list(self.tasks.values()) if status: tasks = [t for t in tasks if t.status == status] # Sort by start_time descending (most recent first) @@ -218,11 +225,14 @@ class TaskManager: # [DEF:get_task_logs:Function] # @PURPOSE: Retrieves logs for a specific task. + # @PRE: task_id is a string. + # @POST: Returns list of LogEntry objects. # @PARAM: task_id (str) - ID of the task. # @RETURN: List[LogEntry] - List of log entries. def get_task_logs(self, task_id: str) -> List[LogEntry]: - task = self.tasks.get(task_id) - return task.logs if task else [] + with belief_scope("TaskManager.get_task_logs", f"task_id={task_id}"): + task = self.tasks.get(task_id) + return task.logs if task else [] # [/DEF:get_task_logs:Function] # [DEF:_add_log:Function] @@ -234,51 +244,61 @@ class TaskManager: # @PARAM: message (str) - Log message. # @PARAM: context (Optional[Dict]) - Log context. def _add_log(self, task_id: str, level: str, message: str, context: Optional[Dict[str, Any]] = None): - task = self.tasks.get(task_id) - if not task: - return + with belief_scope("TaskManager._add_log", f"task_id={task_id}"): + task = self.tasks.get(task_id) + if not task: + return - log_entry = LogEntry(level=level, message=message, context=context) - task.logs.append(log_entry) - self.persistence_service.persist_task(task) + log_entry = LogEntry(level=level, message=message, context=context) + task.logs.append(log_entry) + self.persistence_service.persist_task(task) - # Notify subscribers - if task_id in self.subscribers: - for queue in self.subscribers[task_id]: - self.loop.call_soon_threadsafe(queue.put_nowait, log_entry) + # Notify subscribers + if task_id in self.subscribers: + for queue in self.subscribers[task_id]: + self.loop.call_soon_threadsafe(queue.put_nowait, log_entry) # [/DEF:_add_log:Function] # [DEF:subscribe_logs:Function] # @PURPOSE: Subscribes to real-time logs for a task. + # @PRE: task_id is a string. + # @POST: Returns an asyncio.Queue for log entries. # @PARAM: task_id (str) - ID of the task. # @RETURN: asyncio.Queue - Queue for log entries. async def subscribe_logs(self, task_id: str) -> asyncio.Queue: - queue = asyncio.Queue() - if task_id not in self.subscribers: - self.subscribers[task_id] = [] - self.subscribers[task_id].append(queue) - return queue + with belief_scope("TaskManager.subscribe_logs", f"task_id={task_id}"): + queue = asyncio.Queue() + if task_id not in self.subscribers: + self.subscribers[task_id] = [] + self.subscribers[task_id].append(queue) + return queue # [/DEF:subscribe_logs:Function] # [DEF:unsubscribe_logs:Function] # @PURPOSE: Unsubscribes from real-time logs for a task. + # @PRE: task_id is a string, queue is asyncio.Queue. + # @POST: Queue removed from subscribers. # @PARAM: task_id (str) - ID of the task. # @PARAM: queue (asyncio.Queue) - Queue to remove. def unsubscribe_logs(self, task_id: str, queue: asyncio.Queue): - if task_id in self.subscribers: - if queue in self.subscribers[task_id]: - self.subscribers[task_id].remove(queue) - if not self.subscribers[task_id]: - del self.subscribers[task_id] + with belief_scope("TaskManager.unsubscribe_logs", f"task_id={task_id}"): + if task_id in self.subscribers: + if queue in self.subscribers[task_id]: + self.subscribers[task_id].remove(queue) + if not self.subscribers[task_id]: + del self.subscribers[task_id] # [/DEF:unsubscribe_logs:Function] # [DEF:load_persisted_tasks:Function] # @PURPOSE: Load persisted tasks using persistence service. + # @PRE: None. + # @POST: Persisted tasks loaded into self.tasks. def load_persisted_tasks(self) -> None: - loaded_tasks = self.persistence_service.load_tasks(limit=100) - for task in loaded_tasks: - if task.id not in self.tasks: - self.tasks[task.id] = task + with belief_scope("TaskManager.load_persisted_tasks"): + loaded_tasks = self.persistence_service.load_tasks(limit=100) + for task in loaded_tasks: + if task.id not in self.tasks: + self.tasks[task.id] = task # [/DEF:load_persisted_tasks:Function] # [DEF:await_input:Function] @@ -334,6 +354,8 @@ class TaskManager: # [DEF:clear_tasks:Function] # @PURPOSE: Clears tasks based on status filter. + # @PRE: status is Optional[TaskStatus]. + # @POST: Tasks matching filter (or all non-active) cleared from registry and database. # @PARAM: status (Optional[TaskStatus]) - Filter by task status. # @RETURN: int - Number of tasks cleared. def clear_tasks(self, status: Optional[TaskStatus] = None) -> int: diff --git a/backend/src/core/task_manager/persistence.py b/backend/src/core/task_manager/persistence.py index d1f0cfd..b3c4284 100644 --- a/backend/src/core/task_manager/persistence.py +++ b/backend/src/core/task_manager/persistence.py @@ -26,12 +26,15 @@ class TaskPersistenceService: # @PRE: None. # @POST: Service is ready. def __init__(self): - # We use TasksSessionLocal from database.py - pass + with belief_scope("TaskPersistenceService.__init__"): + # We use TasksSessionLocal from database.py + pass # [/DEF:__init__:Function] # [DEF:persist_task:Function] # @PURPOSE: Persists or updates a single task in the database. + # @PRE: isinstance(task, Task) + # @POST: Task record created or updated in database. # @PARAM: task (Task) - The task object to persist. def persist_task(self, task: Task) -> None: with belief_scope("TaskPersistenceService.persist_task", f"task_id={task.id}"): @@ -75,14 +78,19 @@ class TaskPersistenceService: # [DEF:persist_tasks:Function] # @PURPOSE: Persists multiple tasks. + # @PRE: isinstance(tasks, list) + # @POST: All tasks in list are persisted. # @PARAM: tasks (List[Task]) - The list of tasks to persist. def persist_tasks(self, tasks: List[Task]) -> None: - for task in tasks: - self.persist_task(task) + with belief_scope("TaskPersistenceService.persist_tasks"): + for task in tasks: + self.persist_task(task) # [/DEF:persist_tasks:Function] # [DEF:load_tasks:Function] # @PURPOSE: Loads tasks from the database. + # @PRE: limit is an integer. + # @POST: Returns list of Task objects. # @PARAM: limit (int) - Max tasks to load. # @PARAM: status (Optional[TaskStatus]) - Filter by status. # @RETURN: List[Task] - The loaded tasks. @@ -128,6 +136,8 @@ class TaskPersistenceService: # [DEF:delete_tasks:Function] # @PURPOSE: Deletes specific tasks from the database. + # @PRE: task_ids is a list of strings. + # @POST: Specified task records deleted from database. # @PARAM: task_ids (List[str]) - List of task IDs to delete. def delete_tasks(self, task_ids: List[str]) -> None: if not task_ids: diff --git a/backend/src/dependencies.py b/backend/src/dependencies.py index 14c3cd5..ee4ead1 100755 --- a/backend/src/dependencies.py +++ b/backend/src/dependencies.py @@ -10,6 +10,7 @@ from .core.task_manager import TaskManager from .core.config_manager import ConfigManager from .core.scheduler import SchedulerService from .core.database import init_db +from .core.logger import logger, belief_scope # Initialize singletons # Use absolute path relative to this file to ensure plugins are found regardless of CWD @@ -20,13 +21,20 @@ config_manager = ConfigManager(config_path=str(config_path)) # Initialize database before any other services that might use it init_db() +# [DEF:get_config_manager:Function] +# @PURPOSE: Dependency injector for the ConfigManager. +# @PRE: Global config_manager must be initialized. +# @POST: Returns shared ConfigManager instance. +# @RETURN: ConfigManager - The shared config manager instance. def get_config_manager() -> ConfigManager: """Dependency injector for the ConfigManager.""" - return config_manager + with belief_scope("get_config_manager"): + return config_manager +# [/DEF:get_config_manager:Function] plugin_dir = Path(__file__).parent / "plugins" + plugin_loader = PluginLoader(plugin_dir=str(plugin_dir)) -from .core.logger import logger logger.info(f"PluginLoader initialized with directory: {plugin_dir}") logger.info(f"Available plugins: {[config.name for config in plugin_loader.get_all_plugin_configs()]}") @@ -36,15 +44,37 @@ logger.info("TaskManager initialized") scheduler_service = SchedulerService(task_manager, config_manager) logger.info("SchedulerService initialized") +# [DEF:get_plugin_loader:Function] +# @PURPOSE: Dependency injector for the PluginLoader. +# @PRE: Global plugin_loader must be initialized. +# @POST: Returns shared PluginLoader instance. +# @RETURN: PluginLoader - The shared plugin loader instance. def get_plugin_loader() -> PluginLoader: """Dependency injector for the PluginLoader.""" - return plugin_loader + with belief_scope("get_plugin_loader"): + return plugin_loader +# [/DEF:get_plugin_loader:Function] +# [DEF:get_task_manager:Function] +# @PURPOSE: Dependency injector for the TaskManager. +# @PRE: Global task_manager must be initialized. +# @POST: Returns shared TaskManager instance. +# @RETURN: TaskManager - The shared task manager instance. def get_task_manager() -> TaskManager: """Dependency injector for the TaskManager.""" - return task_manager + with belief_scope("get_task_manager"): + return task_manager +# [/DEF:get_task_manager:Function] +# [DEF:get_scheduler_service:Function] +# @PURPOSE: Dependency injector for the SchedulerService. +# @PRE: Global scheduler_service must be initialized. +# @POST: Returns shared SchedulerService instance. +# @RETURN: SchedulerService - The shared scheduler service instance. def get_scheduler_service() -> SchedulerService: """Dependency injector for the SchedulerService.""" - return scheduler_service + with belief_scope("get_scheduler_service"): + return scheduler_service +# [/DEF:get_scheduler_service:Function] + # [/DEF:Dependencies:Module] \ No newline at end of file diff --git a/backend/src/plugins/backup.py b/backend/src/plugins/backup.py index 098b260..fef1a33 100755 --- a/backend/src/plugins/backup.py +++ b/backend/src/plugins/backup.py @@ -11,6 +11,7 @@ from pathlib import Path from requests.exceptions import RequestException from ..core.plugin_base import PluginBase +from ..core.logger import belief_scope from superset_tool.client import SupersetClient from superset_tool.exceptions import SupersetAPIError from superset_tool.utils.logger import SupersetLogger @@ -33,24 +34,58 @@ class BackupPlugin(PluginBase): """ @property + # [DEF:id:Function] + # @PURPOSE: Returns the unique identifier for the backup plugin. + # @PRE: Plugin instance exists. + # @POST: Returns string ID. + # @RETURN: str - "superset-backup" def id(self) -> str: - return "superset-backup" + with belief_scope("id"): + return "superset-backup" + # [/DEF:id:Function] @property + # [DEF:name:Function] + # @PURPOSE: Returns the human-readable name of the backup plugin. + # @PRE: Plugin instance exists. + # @POST: Returns string name. + # @RETURN: str - Plugin name. def name(self) -> str: - return "Superset Dashboard Backup" + with belief_scope("name"): + return "Superset Dashboard Backup" + # [/DEF:name:Function] @property + # [DEF:description:Function] + # @PURPOSE: Returns a description of the backup plugin. + # @PRE: Plugin instance exists. + # @POST: Returns string description. + # @RETURN: str - Plugin description. def description(self) -> str: - return "Backs up all dashboards from a Superset instance." + with belief_scope("description"): + return "Backs up all dashboards from a Superset instance." + # [/DEF:description:Function] @property + # [DEF:version:Function] + # @PURPOSE: Returns the version of the backup plugin. + # @PRE: Plugin instance exists. + # @POST: Returns string version. + # @RETURN: str - "1.0.0" def version(self) -> str: - return "1.0.0" + with belief_scope("version"): + return "1.0.0" + # [/DEF:version:Function] + # [DEF:get_schema:Function] + # @PURPOSE: Returns the JSON schema for backup plugin parameters. + # @PRE: Plugin instance exists. + # @POST: Returns dictionary schema. + # @RETURN: Dict[str, Any] - JSON schema. def get_schema(self) -> Dict[str, Any]: - config_manager = get_config_manager() - envs = [e.name for e in config_manager.get_environments()] + with belief_scope("get_schema"): + config_manager = get_config_manager() + envs = [e.name for e in config_manager.get_environments()] default_path = config_manager.get_config().settings.backup_path return { @@ -71,79 +106,87 @@ class BackupPlugin(PluginBase): }, "required": ["env", "backup_path"], } + # [/DEF:get_schema:Function] + # [DEF:execute:Function] + # @PURPOSE: Executes the dashboard backup logic. + # @PARAM: params (Dict[str, Any]) - Backup parameters (env, backup_path). + # @PRE: Target environment must be configured. params must be a dictionary. + # @POST: All dashboards are exported and archived. async def execute(self, params: Dict[str, Any]): - config_manager = get_config_manager() - env_id = params.get("environment_id") - - # Resolve environment name if environment_id is provided - if env_id: - env_config = next((e for e in config_manager.get_environments() if e.id == env_id), None) - if env_config: - params["env"] = env_config.name - - env = params.get("env") - if not env: - raise KeyError("env") - - backup_path_str = params.get("backup_path") or config_manager.get_config().settings.backup_path - backup_path = Path(backup_path_str) - - logger = SupersetLogger(log_dir=backup_path / "Logs", console=True) - logger.info(f"[BackupPlugin][Entry] Starting backup for {env}.") - - try: + with belief_scope("execute"): config_manager = get_config_manager() - if not config_manager.has_environments(): - raise ValueError("No Superset environments configured. Please add an environment in Settings.") + env_id = params.get("environment_id") + + # Resolve environment name if environment_id is provided + if env_id: + env_config = next((e for e in config_manager.get_environments() if e.id == env_id), None) + if env_config: + params["env"] = env_config.name + + env = params.get("env") + if not env: + raise KeyError("env") + + backup_path_str = params.get("backup_path") or config_manager.get_config().settings.backup_path + backup_path = Path(backup_path_str) + + logger = SupersetLogger(log_dir=backup_path / "Logs", console=True) + logger.info(f"[BackupPlugin][Entry] Starting backup for {env}.") + + try: + config_manager = get_config_manager() + if not config_manager.has_environments(): + raise ValueError("No Superset environments configured. Please add an environment in Settings.") + + clients = setup_clients(logger, custom_envs=config_manager.get_environments()) + client = clients.get(env) - clients = setup_clients(logger, custom_envs=config_manager.get_environments()) - client = clients.get(env) - - if not client: - raise ValueError(f"Environment '{env}' not found in configuration.") - - dashboard_count, dashboard_meta = client.get_dashboards() - logger.info(f"[BackupPlugin][Progress] Found {dashboard_count} dashboards to export in {env}.") + if not client: + raise ValueError(f"Environment '{env}' not found in configuration.") + + dashboard_count, dashboard_meta = client.get_dashboards() + logger.info(f"[BackupPlugin][Progress] Found {dashboard_count} dashboards to export in {env}.") - if dashboard_count == 0: - logger.info("[BackupPlugin][Exit] No dashboards to back up.") - return + if dashboard_count == 0: + logger.info("[BackupPlugin][Exit] No dashboards to back up.") + return - for db in dashboard_meta: - dashboard_id = db.get('id') - dashboard_title = db.get('dashboard_title', 'Unknown Dashboard') - if not dashboard_id: - continue + for db in dashboard_meta: + dashboard_id = db.get('id') + dashboard_title = db.get('dashboard_title', 'Unknown Dashboard') + if not dashboard_id: + continue - try: - dashboard_base_dir_name = sanitize_filename(f"{dashboard_title}") - dashboard_dir = backup_path / env.upper() / dashboard_base_dir_name - dashboard_dir.mkdir(parents=True, exist_ok=True) + try: + dashboard_base_dir_name = sanitize_filename(f"{dashboard_title}") + dashboard_dir = backup_path / env.upper() / dashboard_base_dir_name + dashboard_dir.mkdir(parents=True, exist_ok=True) - zip_content, filename = client.export_dashboard(dashboard_id) + zip_content, filename = client.export_dashboard(dashboard_id) - save_and_unpack_dashboard( - zip_content=zip_content, - original_filename=filename, - output_dir=dashboard_dir, - unpack=False, - logger=logger - ) + save_and_unpack_dashboard( + zip_content=zip_content, + original_filename=filename, + output_dir=dashboard_dir, + unpack=False, + logger=logger + ) - archive_exports(str(dashboard_dir), policy=RetentionPolicy(), logger=logger) + archive_exports(str(dashboard_dir), policy=RetentionPolicy(), logger=logger) - except (SupersetAPIError, RequestException, IOError, OSError) as db_error: - logger.error(f"[BackupPlugin][Failure] Failed to export dashboard {dashboard_title} (ID: {dashboard_id}): {db_error}", exc_info=True) - continue - - consolidate_archive_folders(backup_path / env.upper(), logger=logger) - remove_empty_directories(str(backup_path / env.upper()), logger=logger) + except (SupersetAPIError, RequestException, IOError, OSError) as db_error: + logger.error(f"[BackupPlugin][Failure] Failed to export dashboard {dashboard_title} (ID: {dashboard_id}): {db_error}", exc_info=True) + continue + + consolidate_archive_folders(backup_path / env.upper(), logger=logger) + remove_empty_directories(str(backup_path / env.upper()), logger=logger) - logger.info(f"[BackupPlugin][CoherenceCheck:Passed] Backup logic completed for {env}.") + logger.info(f"[BackupPlugin][CoherenceCheck:Passed] Backup logic completed for {env}.") - except (RequestException, IOError, KeyError) as e: - logger.critical(f"[BackupPlugin][Failure] Fatal error during backup for {env}: {e}", exc_info=True) - raise e + except (RequestException, IOError, KeyError) as e: + logger.critical(f"[BackupPlugin][Failure] Fatal error during backup for {env}: {e}", exc_info=True) + raise e + # [/DEF:execute:Function] # [/DEF:BackupPlugin:Class] # [/DEF:BackupPlugin:Module] \ No newline at end of file diff --git a/backend/src/plugins/debug.py b/backend/src/plugins/debug.py index 688630a..5394f2f 100644 --- a/backend/src/plugins/debug.py +++ b/backend/src/plugins/debug.py @@ -20,25 +20,57 @@ class DebugPlugin(PluginBase): """ @property + # [DEF:id:Function] + # @PURPOSE: Returns the unique identifier for the debug plugin. + # @PRE: Plugin instance exists. + # @POST: Returns string ID. + # @RETURN: str - "system-debug" def id(self) -> str: - return "system-debug" + with belief_scope("id"): + return "system-debug" + # [/DEF:id:Function] @property + # [DEF:name:Function] + # @PURPOSE: Returns the human-readable name of the debug plugin. + # @PRE: Plugin instance exists. + # @POST: Returns string name. + # @RETURN: str - Plugin name. def name(self) -> str: - return "System Debug" + with belief_scope("name"): + return "System Debug" + # [/DEF:name:Function] @property + # [DEF:description:Function] + # @PURPOSE: Returns a description of the debug plugin. + # @PRE: Plugin instance exists. + # @POST: Returns string description. + # @RETURN: str - Plugin description. def description(self) -> str: - return "Run system diagnostics and debug Superset API responses." + with belief_scope("description"): + return "Run system diagnostics and debug Superset API responses." + # [/DEF:description:Function] @property + # [DEF:version:Function] + # @PURPOSE: Returns the version of the debug plugin. + # @PRE: Plugin instance exists. + # @POST: Returns string version. + # @RETURN: str - "1.0.0" def version(self) -> str: - return "1.0.0" + with belief_scope("version"): + return "1.0.0" + # [/DEF:version:Function] - # [DEF:DebugPlugin.get_schema:Function] + # [DEF:get_schema:Function] # @PURPOSE: Returns the JSON schema for the debug plugin parameters. + # @PRE: Plugin instance exists. + # @POST: Returns dictionary schema. + # @RETURN: Dict[str, Any] - JSON schema. def get_schema(self) -> Dict[str, Any]: - return { + with belief_scope("get_schema"): + return { "type": "object", "properties": { "action": { @@ -70,12 +102,16 @@ class DebugPlugin(PluginBase): }, "required": ["action"] } - # [/DEF:DebugPlugin.get_schema:Function] + # [/DEF:get_schema:Function] - # [DEF:DebugPlugin.execute:Function] + # [DEF:execute:Function] # @PURPOSE: Executes the debug logic. + # @PARAM: params (Dict[str, Any]) - Debug parameters. + # @PRE: action must be provided in params. + # @POST: Debug action is executed and results returned. + # @RETURN: Dict[str, Any] - Execution results. async def execute(self, params: Dict[str, Any]) -> Dict[str, Any]: - with belief_scope("DebugPlugin.execute", f"params={params}"): + with belief_scope("execute"): action = params.get("action") if action == "test-db-api": @@ -84,16 +120,17 @@ class DebugPlugin(PluginBase): return await self._get_dataset_structure(params) else: raise ValueError(f"Unknown action: {action}") - # [/DEF:DebugPlugin.execute:Function] + # [/DEF:execute:Function] - # [DEF:DebugPlugin._test_db_api:Function] + # [DEF:_test_db_api:Function] # @PURPOSE: Tests database API connectivity for source and target environments. - # @PRE: source_env and target_env params exist. + # @PRE: source_env and target_env params exist in params. # @POST: Returns DB counts for both envs. # @PARAM: params (Dict) - Plugin parameters. # @RETURN: Dict - Comparison results. async def _test_db_api(self, params: Dict[str, Any]) -> Dict[str, Any]: - source_env_name = params.get("source_env") + with belief_scope("_test_db_api"): + source_env_name = params.get("source_env") target_env_name = params.get("target_env") if not source_env_name or not target_env_name: @@ -117,16 +154,17 @@ class DebugPlugin(PluginBase): } return results - # [/DEF:DebugPlugin._test_db_api:Function] + # [/DEF:_test_db_api:Function] - # [DEF:DebugPlugin._get_dataset_structure:Function] + # [DEF:_get_dataset_structure:Function] # @PURPOSE: Retrieves the structure of a dataset. - # @PRE: env and dataset_id params exist. + # @PRE: env and dataset_id params exist in params. # @POST: Returns dataset JSON structure. # @PARAM: params (Dict) - Plugin parameters. # @RETURN: Dict - Dataset structure. async def _get_dataset_structure(self, params: Dict[str, Any]) -> Dict[str, Any]: - env_name = params.get("env") + with belief_scope("_get_dataset_structure"): + env_name = params.get("env") dataset_id = params.get("dataset_id") if not env_name or dataset_id is None: @@ -143,7 +181,7 @@ class DebugPlugin(PluginBase): dataset_response = client.get_dataset(dataset_id) return dataset_response.get('result') or {} - # [/DEF:DebugPlugin._get_dataset_structure:Function] + # [/DEF:_get_dataset_structure:Function] # [/DEF:DebugPlugin:Class] # [/DEF:DebugPluginModule:Module] \ No newline at end of file diff --git a/backend/src/plugins/mapper.py b/backend/src/plugins/mapper.py index d2bdc17..6103d1e 100644 --- a/backend/src/plugins/mapper.py +++ b/backend/src/plugins/mapper.py @@ -24,25 +24,57 @@ class MapperPlugin(PluginBase): """ @property + # [DEF:id:Function] + # @PURPOSE: Returns the unique identifier for the mapper plugin. + # @PRE: Plugin instance exists. + # @POST: Returns string ID. + # @RETURN: str - "dataset-mapper" def id(self) -> str: - return "dataset-mapper" + with belief_scope("id"): + return "dataset-mapper" + # [/DEF:id:Function] @property + # [DEF:name:Function] + # @PURPOSE: Returns the human-readable name of the mapper plugin. + # @PRE: Plugin instance exists. + # @POST: Returns string name. + # @RETURN: str - Plugin name. def name(self) -> str: - return "Dataset Mapper" + with belief_scope("name"): + return "Dataset Mapper" + # [/DEF:name:Function] @property + # [DEF:description:Function] + # @PURPOSE: Returns a description of the mapper plugin. + # @PRE: Plugin instance exists. + # @POST: Returns string description. + # @RETURN: str - Plugin description. def description(self) -> str: - return "Map dataset column verbose names using PostgreSQL comments or Excel files." + with belief_scope("description"): + return "Map dataset column verbose names using PostgreSQL comments or Excel files." + # [/DEF:description:Function] @property + # [DEF:version:Function] + # @PURPOSE: Returns the version of the mapper plugin. + # @PRE: Plugin instance exists. + # @POST: Returns string version. + # @RETURN: str - "1.0.0" def version(self) -> str: - return "1.0.0" + with belief_scope("version"): + return "1.0.0" + # [/DEF:version:Function] - # [DEF:MapperPlugin.get_schema:Function] + # [DEF:get_schema:Function] # @PURPOSE: Returns the JSON schema for the mapper plugin parameters. + # @PRE: Plugin instance exists. + # @POST: Returns dictionary schema. + # @RETURN: Dict[str, Any] - JSON schema. def get_schema(self) -> Dict[str, Any]: - return { + with belief_scope("get_schema"): + return { "type": "object", "properties": { "env": { @@ -85,14 +117,16 @@ class MapperPlugin(PluginBase): }, "required": ["env", "dataset_id", "source"] } - # [/DEF:MapperPlugin.get_schema:Function] + # [/DEF:get_schema:Function] - # [DEF:MapperPlugin.execute:Function] + # [DEF:execute:Function] # @PURPOSE: Executes the dataset mapping logic. - # @PRE: Params contain valid 'env', 'dataset_id', and 'source'. + # @PARAM: params (Dict[str, Any]) - Mapping parameters. + # @PRE: Params contain valid 'env', 'dataset_id', and 'source'. params must be a dictionary. # @POST: Updates the dataset in Superset. + # @RETURN: Dict[str, Any] - Execution status. async def execute(self, params: Dict[str, Any]) -> Dict[str, Any]: - with belief_scope("MapperPlugin.execute", f"params={params}"): + with belief_scope("execute"): env_name = params.get("env") dataset_id = params.get("dataset_id") source = params.get("source") @@ -158,7 +192,7 @@ class MapperPlugin(PluginBase): except Exception as e: logger.error(f"[MapperPlugin.execute][Failure] Mapping failed: {e}") raise - # [/DEF:MapperPlugin.execute:Function] + # [/DEF:execute:Function] # [/DEF:MapperPlugin:Class] # [/DEF:MapperPluginModule:Module] \ No newline at end of file diff --git a/backend/src/plugins/migration.py b/backend/src/plugins/migration.py index ff08d47..0af7e30 100755 --- a/backend/src/plugins/migration.py +++ b/backend/src/plugins/migration.py @@ -12,6 +12,7 @@ import zipfile import re from ..core.plugin_base import PluginBase +from ..core.logger import belief_scope from superset_tool.client import SupersetClient from superset_tool.utils.init_clients import setup_clients from superset_tool.utils.fileio import create_temp_file, update_yamls, create_dashboard_export @@ -29,23 +30,57 @@ class MigrationPlugin(PluginBase): """ @property + # [DEF:id:Function] + # @PURPOSE: Returns the unique identifier for the migration plugin. + # @PRE: None. + # @POST: Returns "superset-migration". + # @RETURN: str - "superset-migration" def id(self) -> str: - return "superset-migration" + with belief_scope("id"): + return "superset-migration" + # [/DEF:id:Function] @property + # [DEF:name:Function] + # @PURPOSE: Returns the human-readable name of the migration plugin. + # @PRE: None. + # @POST: Returns the plugin name. + # @RETURN: str - Plugin name. def name(self) -> str: - return "Superset Dashboard Migration" + with belief_scope("name"): + return "Superset Dashboard Migration" + # [/DEF:name:Function] @property + # [DEF:description:Function] + # @PURPOSE: Returns a description of the migration plugin. + # @PRE: None. + # @POST: Returns the plugin description. + # @RETURN: str - Plugin description. def description(self) -> str: - return "Migrates dashboards between Superset environments." + with belief_scope("description"): + return "Migrates dashboards between Superset environments." + # [/DEF:description:Function] @property + # [DEF:version:Function] + # @PURPOSE: Returns the version of the migration plugin. + # @PRE: None. + # @POST: Returns "1.0.0". + # @RETURN: str - "1.0.0" def version(self) -> str: - return "1.0.0" + with belief_scope("version"): + return "1.0.0" + # [/DEF:version:Function] + # [DEF:get_schema:Function] + # @PURPOSE: Returns the JSON schema for migration plugin parameters. + # @PRE: Config manager is available. + # @POST: Returns a valid JSON schema dictionary. + # @RETURN: Dict[str, Any] - JSON schema. def get_schema(self) -> Dict[str, Any]: - config_manager = get_config_manager() + with belief_scope("get_schema"): + config_manager = get_config_manager() envs = [e.name for e in config_manager.get_environments()] return { @@ -87,11 +122,18 @@ class MigrationPlugin(PluginBase): }, "required": ["from_env", "to_env", "dashboard_regex"], } + # [/DEF:get_schema:Function] + # [DEF:execute:Function] + # @PURPOSE: Executes the dashboard migration logic. + # @PARAM: params (Dict[str, Any]) - Migration parameters. + # @PRE: Source and target environments must be configured. + # @POST: Selected dashboards are migrated. async def execute(self, params: Dict[str, Any]): - source_env_id = params.get("source_env_id") - target_env_id = params.get("target_env_id") - selected_ids = params.get("selected_ids") + with belief_scope("MigrationPlugin.execute"): + source_env_id = params.get("source_env_id") + target_env_id = params.get("target_env_id") + selected_ids = params.get("selected_ids") # Legacy support or alternative params from_env_name = params.get("from_env") @@ -109,29 +151,77 @@ class MigrationPlugin(PluginBase): tm = get_task_manager() class TaskLoggerProxy(SupersetLogger): + # [DEF:__init__:Function] + # @PURPOSE: Initializes the proxy logger. + # @PRE: None. + # @POST: Instance is initialized. def __init__(self): - # Initialize parent with dummy values since we override methods - super().__init__(console=False) + with belief_scope("__init__"): + # Initialize parent with dummy values since we override methods + super().__init__(console=False) + # [/DEF:__init__:Function] + # [DEF:debug:Function] + # @PURPOSE: Logs a debug message to the task manager. + # @PRE: msg is a string. + # @POST: Log is added to task manager if task_id exists. def debug(self, msg, *args, extra=None, **kwargs): - if task_id: tm._add_log(task_id, "DEBUG", msg, extra or {}) + with belief_scope("debug"): + if task_id: tm._add_log(task_id, "DEBUG", msg, extra or {}) + # [/DEF:debug:Function] + + # [DEF:info:Function] + # @PURPOSE: Logs an info message to the task manager. + # @PRE: msg is a string. + # @POST: Log is added to task manager if task_id exists. def info(self, msg, *args, extra=None, **kwargs): - if task_id: tm._add_log(task_id, "INFO", msg, extra or {}) + with belief_scope("info"): + if task_id: tm._add_log(task_id, "INFO", msg, extra or {}) + # [/DEF:info:Function] + + # [DEF:warning:Function] + # @PURPOSE: Logs a warning message to the task manager. + # @PRE: msg is a string. + # @POST: Log is added to task manager if task_id exists. def warning(self, msg, *args, extra=None, **kwargs): - if task_id: tm._add_log(task_id, "WARNING", msg, extra or {}) + with belief_scope("warning"): + if task_id: tm._add_log(task_id, "WARNING", msg, extra or {}) + # [/DEF:warning:Function] + + # [DEF:error:Function] + # @PURPOSE: Logs an error message to the task manager. + # @PRE: msg is a string. + # @POST: Log is added to task manager if task_id exists. def error(self, msg, *args, extra=None, **kwargs): - if task_id: tm._add_log(task_id, "ERROR", msg, extra or {}) + with belief_scope("error"): + if task_id: tm._add_log(task_id, "ERROR", msg, extra or {}) + # [/DEF:error:Function] + + # [DEF:critical:Function] + # @PURPOSE: Logs a critical message to the task manager. + # @PRE: msg is a string. + # @POST: Log is added to task manager if task_id exists. def critical(self, msg, *args, extra=None, **kwargs): - if task_id: tm._add_log(task_id, "ERROR", msg, extra or {}) + with belief_scope("critical"): + if task_id: tm._add_log(task_id, "ERROR", msg, extra or {}) + # [/DEF:critical:Function] + + # [DEF:exception:Function] + # @PURPOSE: Logs an exception message to the task manager. + # @PRE: msg is a string. + # @POST: Log is added to task manager if task_id exists. def exception(self, msg, *args, **kwargs): - if task_id: tm._add_log(task_id, "ERROR", msg, {"exception": True}) + with belief_scope("exception"): + if task_id: tm._add_log(task_id, "ERROR", msg, {"exception": True}) + # [/DEF:exception:Function] logger = TaskLoggerProxy() logger.info(f"[MigrationPlugin][Entry] Starting migration task.") logger.info(f"[MigrationPlugin][Action] Params: {params}") try: - config_manager = get_config_manager() + with belief_scope("execute"): + config_manager = get_config_manager() environments = config_manager.get_environments() # Resolve environments @@ -289,12 +379,12 @@ class MigrationPlugin(PluginBase): continue logger.error(f"[MigrationPlugin][Failure] Failed to migrate dashboard {title}: {exc}", exc_info=True) - # [/DEF:MigrationPlugin.execute:Action] - logger.info("[MigrationPlugin][Exit] Migration finished.") - + logger.info("[MigrationPlugin][Exit] Migration finished.") except Exception as e: logger.critical(f"[MigrationPlugin][Failure] Fatal error during migration: {e}", exc_info=True) raise e + # [/DEF:MigrationPlugin.execute:Action] + # [/DEF:execute:Function] # [/DEF:MigrationPlugin:Class] # [/DEF:MigrationPlugin:Module] \ No newline at end of file diff --git a/backend/src/plugins/search.py b/backend/src/plugins/search.py index 44b9fdd..9a39949 100644 --- a/backend/src/plugins/search.py +++ b/backend/src/plugins/search.py @@ -21,25 +21,57 @@ class SearchPlugin(PluginBase): """ @property + # [DEF:id:Function] + # @PURPOSE: Returns the unique identifier for the search plugin. + # @PRE: Plugin instance exists. + # @POST: Returns string ID. + # @RETURN: str - "search-datasets" def id(self) -> str: - return "search-datasets" + with belief_scope("id"): + return "search-datasets" + # [/DEF:id:Function] @property + # [DEF:name:Function] + # @PURPOSE: Returns the human-readable name of the search plugin. + # @PRE: Plugin instance exists. + # @POST: Returns string name. + # @RETURN: str - Plugin name. def name(self) -> str: - return "Search Datasets" + with belief_scope("name"): + return "Search Datasets" + # [/DEF:name:Function] @property + # [DEF:description:Function] + # @PURPOSE: Returns a description of the search plugin. + # @PRE: Plugin instance exists. + # @POST: Returns string description. + # @RETURN: str - Plugin description. def description(self) -> str: - return "Search for text patterns across all datasets in a specific environment." + with belief_scope("description"): + return "Search for text patterns across all datasets in a specific environment." + # [/DEF:description:Function] @property + # [DEF:version:Function] + # @PURPOSE: Returns the version of the search plugin. + # @PRE: Plugin instance exists. + # @POST: Returns string version. + # @RETURN: str - "1.0.0" def version(self) -> str: - return "1.0.0" + with belief_scope("version"): + return "1.0.0" + # [/DEF:version:Function] - # [DEF:SearchPlugin.get_schema:Function] + # [DEF:get_schema:Function] # @PURPOSE: Returns the JSON schema for the search plugin parameters. + # @PRE: Plugin instance exists. + # @POST: Returns dictionary schema. + # @RETURN: Dict[str, Any] - JSON schema. def get_schema(self) -> Dict[str, Any]: - return { + with belief_scope("get_schema"): + return { "type": "object", "properties": { "env": { @@ -55,12 +87,14 @@ class SearchPlugin(PluginBase): }, "required": ["env", "query"] } - # [/DEF:SearchPlugin.get_schema:Function] + # [/DEF:get_schema:Function] - # [DEF:SearchPlugin.execute:Function] + # [DEF:execute:Function] # @PURPOSE: Executes the dataset search logic. + # @PARAM: params (Dict[str, Any]) - Search parameters. # @PRE: Params contain valid 'env' and 'query'. # @POST: Returns a dictionary with count and results list. + # @RETURN: Dict[str, Any] - Search results. async def execute(self, params: Dict[str, Any]) -> Dict[str, Any]: with belief_scope("SearchPlugin.execute", f"params={params}"): env_name = params.get("env") @@ -124,38 +158,45 @@ class SearchPlugin(PluginBase): except Exception as e: logger.error(f"[SearchPlugin.execute][Failure] Error during search: {e}") raise - # [/DEF:SearchPlugin.execute:Function] + # [/DEF:execute:Function] - # [DEF:SearchPlugin._get_context:Function] + # [DEF:_get_context:Function] # @PURPOSE: Extracts a small context around the match for display. + # @PARAM: text (str) - The full text to extract context from. + # @PARAM: match_text (str) - The matched text pattern. + # @PARAM: context_lines (int) - Number of lines of context to include. + # @PRE: text and match_text must be strings. + # @POST: Returns context string. + # @RETURN: str - Extracted context. def _get_context(self, text: str, match_text: str, context_lines: int = 1) -> str: """ Extracts a small context around the match for display. """ - if not match_text: - return text[:100] + "..." if len(text) > 100 else text + with belief_scope("_get_context"): + if not match_text: + return text[:100] + "..." if len(text) > 100 else text - lines = text.splitlines() + lines = text.splitlines() match_line_index = -1 for i, line in enumerate(lines): if match_text in line: match_line_index = i break - if match_line_index != -1: - start = max(0, match_line_index - context_lines) - end = min(len(lines), match_line_index + context_lines + 1) - context = [] - for i in range(start, end): - line_content = lines[i] - if i == match_line_index: - context.append(f"==> {line_content}") - else: - context.append(f" {line_content}") - return "\n".join(context) - - return text[:100] + "..." if len(text) > 100 else text - # [/DEF:SearchPlugin._get_context:Function] + if match_line_index != -1: + start = max(0, match_line_index - context_lines) + end = min(len(lines), match_line_index + context_lines + 1) + context = [] + for i in range(start, end): + line_content = lines[i] + if i == match_line_index: + context.append(f"==> {line_content}") + else: + context.append(f" {line_content}") + return "\n".join(context) + + return text[:100] + "..." if len(text) > 100 else text + # [/DEF:_get_context:Function] # [/DEF:SearchPlugin:Class] # [/DEF:SearchPluginModule:Module] \ No newline at end of file diff --git a/backend/src/services/mapping_service.py b/backend/src/services/mapping_service.py index 754acad..0bf08d8 100644 --- a/backend/src/services/mapping_service.py +++ b/backend/src/services/mapping_service.py @@ -10,6 +10,7 @@ # [SECTION: IMPORTS] from typing import List, Dict +from backend.src.core.logger import belief_scope from backend.src.core.superset_client import SupersetClient from backend.src.core.utils.matching import suggest_mappings from superset_tool.models import SupersetConfig @@ -19,50 +20,62 @@ from superset_tool.models import SupersetConfig # @PURPOSE: Service for handling database mapping logic. class MappingService: - # [DEF:MappingService.__init__:Function] + # [DEF:__init__:Function] # @PURPOSE: Initializes the mapping service with a config manager. + # @PRE: config_manager is provided. + # @PARAM: config_manager (ConfigManager) - The configuration manager. + # @POST: Service is initialized. def __init__(self, config_manager): - self.config_manager = config_manager - # [/DEF:MappingService.__init__:Function] + with belief_scope("MappingService.__init__"): + self.config_manager = config_manager + # [/DEF:__init__:Function] - # [DEF:MappingService._get_client:Function] + # [DEF:_get_client:Function] # @PURPOSE: Helper to get an initialized SupersetClient for an environment. + # @PARAM: env_id (str) - The ID of the environment. + # @PRE: environment must exist in config. + # @POST: Returns an initialized SupersetClient. + # @RETURN: SupersetClient - Initialized client. def _get_client(self, env_id: str) -> SupersetClient: - envs = self.config_manager.get_environments() - env = next((e for e in envs if e.id == env_id), None) - if not env: - raise ValueError(f"Environment {env_id} not found") - - superset_config = SupersetConfig( - env=env.name, - base_url=env.url, - auth={ - "provider": "db", - "username": env.username, - "password": env.password, - "refresh": "false" - } - ) - return SupersetClient(superset_config) - # [/DEF:MappingService._get_client:Function] + with belief_scope("MappingService._get_client", f"env_id={env_id}"): + envs = self.config_manager.get_environments() + env = next((e for e in envs if e.id == env_id), None) + if not env: + raise ValueError(f"Environment {env_id} not found") + + superset_config = SupersetConfig( + env=env.name, + base_url=env.url, + auth={ + "provider": "db", + "username": env.username, + "password": env.password, + "refresh": "false" + } + ) + return SupersetClient(superset_config) + # [/DEF:_get_client:Function] - # [DEF:MappingService.get_suggestions:Function] + # [DEF:get_suggestions:Function] # @PURPOSE: Fetches databases from both environments and returns fuzzy matching suggestions. # @PARAM: source_env_id (str) - Source environment ID. # @PARAM: target_env_id (str) - Target environment ID. + # @PRE: Both environments must be accessible. + # @POST: Returns fuzzy-matched database suggestions. # @RETURN: List[Dict] - Suggested mappings. async def get_suggestions(self, source_env_id: str, target_env_id: str) -> List[Dict]: - """ - Get suggested mappings between two environments. - """ - source_client = self._get_client(source_env_id) - target_client = self._get_client(target_env_id) - - source_dbs = source_client.get_databases_summary() - target_dbs = target_client.get_databases_summary() - - return suggest_mappings(source_dbs, target_dbs) - # [/DEF:MappingService.get_suggestions:Function] + with belief_scope("MappingService.get_suggestions", f"source={source_env_id}, target={target_env_id}"): + """ + Get suggested mappings between two environments. + """ + source_client = self._get_client(source_env_id) + target_client = self._get_client(target_env_id) + + source_dbs = source_client.get_databases_summary() + target_dbs = target_client.get_databases_summary() + + return suggest_mappings(source_dbs, target_dbs) + # [/DEF:get_suggestions:Function] # [/DEF:MappingService:Class] diff --git a/backend/tests/test_logger.py b/backend/tests/test_logger.py index 44b29ec..857b9f6 100644 --- a/backend/tests/test_logger.py +++ b/backend/tests/test_logger.py @@ -2,6 +2,10 @@ import pytest from backend.src.core.logger import belief_scope, logger +# [DEF:test_belief_scope_logs_entry_action_exit:Function] +# @PURPOSE: Test that belief_scope generates [ID][Entry], [ID][Action], and [ID][Exit] logs. +# @PRE: belief_scope is available. caplog fixture is used. +# @POST: Logs are verified to contain Entry, Action, and Exit tags. def test_belief_scope_logs_entry_action_exit(caplog): """Test that belief_scope generates [ID][Entry], [ID][Action], and [ID][Exit] logs.""" caplog.set_level("INFO") @@ -15,8 +19,13 @@ def test_belief_scope_logs_entry_action_exit(caplog): assert any("[TestFunction][Entry]" in msg for msg in log_messages), "Entry log not found" assert any("[TestFunction][Action] Doing something important" in msg for msg in log_messages), "Action log not found" assert any("[TestFunction][Exit]" in msg for msg in log_messages), "Exit log not found" +# [/DEF:test_belief_scope_logs_entry_action_exit:Function] +# [DEF:test_belief_scope_error_handling:Function] +# @PURPOSE: Test that belief_scope logs Coherence:Failed on exception. +# @PRE: belief_scope is available. caplog fixture is used. +# @POST: Logs are verified to contain Coherence:Failed tag. def test_belief_scope_error_handling(caplog): """Test that belief_scope logs Coherence:Failed on exception.""" caplog.set_level("INFO") @@ -30,8 +39,13 @@ def test_belief_scope_error_handling(caplog): assert any("[FailingFunction][Entry]" in msg for msg in log_messages), "Entry log not found" assert any("[FailingFunction][Coherence:Failed]" in msg for msg in log_messages), "Failed coherence log not found" # Exit should not be logged on failure +# [/DEF:test_belief_scope_error_handling:Function] +# [DEF:test_belief_scope_success_coherence:Function] +# @PURPOSE: Test that belief_scope logs Coherence:OK on success. +# @PRE: belief_scope is available. caplog fixture is used. +# @POST: Logs are verified to contain Coherence:OK tag. def test_belief_scope_success_coherence(caplog): """Test that belief_scope logs Coherence:OK on success.""" caplog.set_level("INFO") @@ -41,4 +55,5 @@ def test_belief_scope_success_coherence(caplog): log_messages = [record.message for record in caplog.records] - assert any("[SuccessFunction][Coherence:OK]" in msg for msg in log_messages), "Success coherence log not found" \ No newline at end of file + assert any("[SuccessFunction][Coherence:OK]" in msg for msg in log_messages), "Success coherence log not found" +# [/DEF:test_belief_scope_success_coherence:Function] \ No newline at end of file diff --git a/backend/tests/test_models.py b/backend/tests/test_models.py index 511fc27..4974435 100644 --- a/backend/tests/test_models.py +++ b/backend/tests/test_models.py @@ -1,49 +1,62 @@ import pytest from superset_tool.models import SupersetConfig +from superset_tool.utils.logger import belief_scope +# [DEF:test_superset_config_url_normalization:Function] +# @PURPOSE: Tests that SupersetConfig correctly normalizes the base URL. +# @PRE: SupersetConfig class is available. +# @POST: URL normalization is verified. def test_superset_config_url_normalization(): - auth = { - "provider": "db", - "username": "admin", - "password": "password", - "refresh": "token" - } - - # Test with /api/v1 already present - config = SupersetConfig( - env="dev", - base_url="http://localhost:8088/api/v1", - auth=auth - ) - assert config.base_url == "http://localhost:8088/api/v1" - - # Test without /api/v1 - config = SupersetConfig( - env="dev", - base_url="http://localhost:8088", - auth=auth - ) - assert config.base_url == "http://localhost:8088/api/v1" - - # Test with trailing slash - config = SupersetConfig( - env="dev", - base_url="http://localhost:8088/", - auth=auth - ) - assert config.base_url == "http://localhost:8088/api/v1" - -def test_superset_config_invalid_url(): - auth = { - "provider": "db", - "username": "admin", - "password": "password", - "refresh": "token" - } - - with pytest.raises(ValueError, match="Must start with http:// or https://"): - SupersetConfig( + with belief_scope("test_superset_config_url_normalization"): + auth = { + "provider": "db", + "username": "admin", + "password": "password", + "refresh": "token" + } + + # Test with /api/v1 already present + config = SupersetConfig( env="dev", - base_url="localhost:8088", + base_url="http://localhost:8088/api/v1", auth=auth ) + assert config.base_url == "http://localhost:8088/api/v1" + + # Test without /api/v1 + config = SupersetConfig( + env="dev", + base_url="http://localhost:8088", + auth=auth + ) + assert config.base_url == "http://localhost:8088/api/v1" + + # Test with trailing slash + config = SupersetConfig( + env="dev", + base_url="http://localhost:8088/", + auth=auth + ) + assert config.base_url == "http://localhost:8088/api/v1" +# [/DEF:test_superset_config_url_normalization:Function] + +# [DEF:test_superset_config_invalid_url:Function] +# @PURPOSE: Tests that SupersetConfig raises ValueError for invalid URLs. +# @PRE: SupersetConfig class is available. +# @POST: ValueError is raised for invalid URLs. +def test_superset_config_invalid_url(): + with belief_scope("test_superset_config_invalid_url"): + auth = { + "provider": "db", + "username": "admin", + "password": "password", + "refresh": "token" + } + + with pytest.raises(ValueError, match="Must start with http:// or https://"): + SupersetConfig( + env="dev", + base_url="localhost:8088", + auth=auth + ) +# [/DEF:test_superset_config_invalid_url:Function] diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte index 38a2a32..b733b61 100755 --- a/frontend/src/App.svelte +++ b/frontend/src/App.svelte @@ -24,6 +24,8 @@ // [DEF:handleFormSubmit:Function] /** * @purpose Handles form submission for task creation. + * @pre event.detail contains form parameters. + * @post Task is created and selectedTask is updated. * @param {CustomEvent} event - The submit event from DynamicForm. */ async function handleFormSubmit(event) { @@ -44,6 +46,8 @@ // [DEF:navigate:Function] /** * @purpose Changes the current page and resets state. + * @pre Target page name is provided. + * @post currentPage store is updated and selection state is reset. * @param {string} page - Target page name. */ function navigate(page) { diff --git a/frontend/src/components/DashboardGrid.svelte b/frontend/src/components/DashboardGrid.svelte index e0f0735..485987e 100644 --- a/frontend/src/components/DashboardGrid.svelte +++ b/frontend/src/components/DashboardGrid.svelte @@ -61,6 +61,8 @@ // [DEF:handleSort:Function] // @PURPOSE: Toggles sort direction or changes sort column. + // @PRE: column name is provided. + // @POST: sortColumn and sortDirection state updated. function handleSort(column: keyof DashboardMetadata) { if (sortColumn === column) { sortDirection = sortDirection === "asc" ? "desc" : "asc"; @@ -73,6 +75,8 @@ // [DEF:handleSelectionChange:Function] // @PURPOSE: Handles individual checkbox changes. + // @PRE: dashboard ID and checked status provided. + // @POST: selectedIds array updated and selectionChanged event dispatched. function handleSelectionChange(id: number, checked: boolean) { let newSelected = [...selectedIds]; if (checked) { @@ -87,6 +91,8 @@ // [DEF:handleSelectAll:Function] // @PURPOSE: Handles select all checkbox. + // @PRE: checked status provided. + // @POST: selectedIds array updated for all paginated items and event dispatched. function handleSelectAll(checked: boolean) { let newSelected = [...selectedIds]; if (checked) { @@ -105,6 +111,8 @@ // [DEF:goToPage:Function] // @PURPOSE: Changes current page. + // @PRE: page index is provided. + // @POST: currentPage state updated if within valid range. function goToPage(page: number) { if (page >= 0 && page < totalPages) { currentPage = page; diff --git a/frontend/src/components/DynamicForm.svelte b/frontend/src/components/DynamicForm.svelte index 98754d5..63c7c62 100755 --- a/frontend/src/components/DynamicForm.svelte +++ b/frontend/src/components/DynamicForm.svelte @@ -23,6 +23,8 @@ // [DEF:handleSubmit:Function] /** * @purpose Dispatches the submit event with the form data. + * @pre formData contains user input. + * @post 'submit' event is dispatched with formData. */ function handleSubmit() { console.log("[DynamicForm][Action] Submitting form data.", { formData }); @@ -33,6 +35,8 @@ // [DEF:initializeForm:Function] /** * @purpose Initialize form data with default values from the schema. + * @pre schema is provided and contains properties. + * @post formData is initialized with default values or empty strings. */ function initializeForm() { if (schema && schema.properties) { diff --git a/frontend/src/components/EnvSelector.svelte b/frontend/src/components/EnvSelector.svelte index 2f3e696..82307fc 100644 --- a/frontend/src/components/EnvSelector.svelte +++ b/frontend/src/components/EnvSelector.svelte @@ -24,6 +24,8 @@ // [DEF:handleSelect:Function] /** * @purpose Dispatches the selection change event. + * @pre event.target must be an HTMLSelectElement. + * @post selectedId is updated and 'change' event is dispatched. * @param {Event} event - The change event from the select element. */ function handleSelect(event: Event) { diff --git a/frontend/src/components/MappingTable.svelte b/frontend/src/components/MappingTable.svelte index 806c4a0..98ac3b0 100644 --- a/frontend/src/components/MappingTable.svelte +++ b/frontend/src/components/MappingTable.svelte @@ -25,6 +25,8 @@ // [DEF:updateMapping:Function] /** * @purpose Updates a mapping for a specific source database. + * @pre sourceUuid and targetUuid are provided. + * @post 'update' event is dispatched. */ function updateMapping(sourceUuid: string, targetUuid: string) { dispatch('update', { sourceUuid, targetUuid }); @@ -34,6 +36,8 @@ // [DEF:getSuggestion:Function] /** * @purpose Finds a suggestion for a source database. + * @pre sourceUuid is provided. + * @post Returns matching suggestion object or undefined. */ function getSuggestion(sourceUuid: string) { return suggestions.find(s => s.source_db_uuid === sourceUuid); diff --git a/frontend/src/components/MissingMappingModal.svelte b/frontend/src/components/MissingMappingModal.svelte index 9853352..f493847 100644 --- a/frontend/src/components/MissingMappingModal.svelte +++ b/frontend/src/components/MissingMappingModal.svelte @@ -25,6 +25,8 @@ // [DEF:resolve:Function] // @PURPOSE: Dispatches the resolution event with the selected mapping. + // @PRE: selectedTargetUuid must be set. + // @POST: 'resolve' event is dispatched and modal is hidden. function resolve() { if (!selectedTargetUuid) return; dispatch('resolve', { @@ -38,6 +40,8 @@ // [DEF:cancel:Function] // @PURPOSE: Cancels the mapping resolution modal. + // @PRE: Modal is open. + // @POST: 'cancel' event is dispatched and modal is hidden. function cancel() { dispatch('cancel'); show = false; diff --git a/frontend/src/components/PasswordPrompt.svelte b/frontend/src/components/PasswordPrompt.svelte index 4e13c9e..a09a655 100644 --- a/frontend/src/components/PasswordPrompt.svelte +++ b/frontend/src/components/PasswordPrompt.svelte @@ -20,6 +20,8 @@ // [DEF:handleSubmit:Function] // @PURPOSE: Validates and dispatches the passwords to resume the task. + // @PRE: All database passwords must be entered. + // @POST: 'resume' event is dispatched with passwords. function handleSubmit() { if (submitting) return; @@ -38,6 +40,8 @@ // [DEF:handleCancel:Function] // @PURPOSE: Cancels the password prompt. + // @PRE: Modal is open. + // @POST: 'cancel' event is dispatched and show is set to false. function handleCancel() { dispatch('cancel'); show = false; diff --git a/frontend/src/components/TaskHistory.svelte b/frontend/src/components/TaskHistory.svelte index f3f5193..1753283 100644 --- a/frontend/src/components/TaskHistory.svelte +++ b/frontend/src/components/TaskHistory.svelte @@ -17,6 +17,8 @@ // [DEF:fetchTasks:Function] // @PURPOSE: Fetches the list of recent tasks from the API. + // @PRE: None. + // @POST: tasks array is updated and selectedTask status synchronized. async function fetchTasks() { try { const res = await fetch('/api/tasks?limit=10'); @@ -47,6 +49,8 @@ // [DEF:clearTasks:Function] // @PURPOSE: Clears tasks from the history, optionally filtered by status. + // @PRE: User confirms deletion via prompt. + // @POST: Tasks are deleted from backend and list is re-fetched. async function clearTasks(status = null) { if (!confirm('Are you sure you want to clear tasks?')) return; try { @@ -66,6 +70,8 @@ // [DEF:selectTask:Function] // @PURPOSE: Selects a task and fetches its full details. + // @PRE: task object is provided. + // @POST: selectedTask store is updated with full task details. async function selectTask(task) { try { // Fetch the full task details (including logs) before setting it as selected @@ -86,6 +92,8 @@ // [DEF:getStatusColor:Function] // @PURPOSE: Returns the CSS color class for a given task status. + // @PRE: status string is provided. + // @POST: Returns tailwind color class string. function getStatusColor(status) { switch (status) { case 'SUCCESS': return 'bg-green-100 text-green-800'; @@ -100,6 +108,8 @@ // [DEF:onMount:Function] // @PURPOSE: Initializes the component by fetching tasks and starting polling. + // @PRE: Component is mounting. + // @POST: Tasks are fetched and 5s polling interval is started. onMount(() => { fetchTasks(); interval = setInterval(fetchTasks, 5000); // Poll every 5s @@ -108,6 +118,8 @@ // [DEF:onDestroy:Function] // @PURPOSE: Cleans up the polling interval when the component is destroyed. + // @PRE: Component is being destroyed. + // @POST: Polling interval is cleared. onDestroy(() => { clearInterval(interval); }); diff --git a/frontend/src/components/TaskList.svelte b/frontend/src/components/TaskList.svelte index d89c2fe..bf9a05f 100644 --- a/frontend/src/components/TaskList.svelte +++ b/frontend/src/components/TaskList.svelte @@ -17,6 +17,8 @@ // [DEF:getStatusColor:Function] // @PURPOSE: Returns the CSS color class for a given task status. + // @PRE: status string is provided. + // @POST: Returns tailwind color class string. function getStatusColor(status: string) { switch (status) { case 'SUCCESS': return 'bg-green-100 text-green-800'; @@ -32,6 +34,8 @@ // [DEF:formatTime:Function] // @PURPOSE: Formats a date string using date-fns. + // @PRE: dateStr is a valid date string or null. + // @POST: Returns human-readable relative time string. function formatTime(dateStr: string | null) { if (!dateStr) return 'N/A'; try { @@ -44,6 +48,8 @@ // [DEF:handleTaskClick:Function] // @PURPOSE: Dispatches a select event when a task is clicked. + // @PRE: taskId is provided. + // @POST: 'select' event is dispatched with task ID. function handleTaskClick(taskId: string) { dispatch('select', { id: taskId }); } diff --git a/frontend/src/components/TaskLogViewer.svelte b/frontend/src/components/TaskLogViewer.svelte index e820b99..ec4718a 100644 --- a/frontend/src/components/TaskLogViewer.svelte +++ b/frontend/src/components/TaskLogViewer.svelte @@ -24,6 +24,8 @@ // [DEF:fetchLogs:Function] // @PURPOSE: Fetches logs for the current task. + // @PRE: taskId must be set. + // @POST: logs array is updated with data from taskService. async function fetchLogs() { if (!taskId) return; try { @@ -41,6 +43,8 @@ // [DEF:scrollToBottom:Function] // @PURPOSE: Scrolls the log container to the bottom. + // @PRE: logContainer element must be bound. + // @POST: logContainer scrollTop is set to scrollHeight. function scrollToBottom() { if (logContainer) { setTimeout(() => { @@ -52,6 +56,8 @@ // [DEF:handleScroll:Function] // @PURPOSE: Updates auto-scroll preference based on scroll position. + // @PRE: logContainer scroll event fired. + // @POST: autoScroll boolean is updated. function handleScroll() { if (!logContainer) return; // If user scrolls up, disable auto-scroll @@ -63,6 +69,8 @@ // [DEF:close:Function] // @PURPOSE: Closes the log viewer modal. + // @PRE: Modal is open. + // @POST: Modal is closed and close event is dispatched. function close() { dispatch('close'); show = false; @@ -71,6 +79,8 @@ // [DEF:getLogLevelColor:Function] // @PURPOSE: Returns the CSS color class for a given log level. + // @PRE: level string is provided. + // @POST: Returns tailwind color class string. function getLogLevelColor(level) { switch (level) { case 'INFO': return 'text-blue-600'; @@ -99,6 +109,8 @@ // [DEF:onDestroy:Function] // @PURPOSE: Cleans up the polling interval. + // @PRE: Component is being destroyed. + // @POST: Polling interval is cleared. onDestroy(() => { if (interval) clearInterval(interval); }); diff --git a/frontend/src/components/TaskRunner.svelte b/frontend/src/components/TaskRunner.svelte index 2b20186..a1852ec 100755 --- a/frontend/src/components/TaskRunner.svelte +++ b/frontend/src/components/TaskRunner.svelte @@ -38,6 +38,8 @@ // [DEF:connect:Function] /** * @purpose Establishes WebSocket connection with exponential backoff. + * @pre selectedTask must be set in the store. + * @post WebSocket instance created and listeners attached. */ function connect() { const task = get(selectedTask); @@ -131,6 +133,8 @@ // [DEF:fetchTargetDatabases:Function] // @PURPOSE: Fetches the list of databases in the target environment. + // @PRE: task must be selected and have a target environment parameter. + // @POST: targetDatabases array is populated with database objects. async function fetchTargetDatabases() { const task = get(selectedTask); if (!task || !task.params.to_env) return; @@ -153,6 +157,8 @@ // [DEF:handleMappingResolve:Function] // @PURPOSE: Handles the resolution of a missing database mapping. + // @PRE: event.detail contains sourceDbUuid, targetDbUuid, and targetDbName. + // @POST: Mapping is saved and task is resumed. async function handleMappingResolve(event) { const task = get(selectedTask); const { sourceDbUuid, targetDbUuid, targetDbName } = event.detail; @@ -196,6 +202,8 @@ // [DEF:handlePasswordResume:Function] // @PURPOSE: Handles the submission of database passwords to resume a task. + // @PRE: event.detail contains passwords dictionary. + // @POST: Task resume endpoint is called with passwords. async function handlePasswordResume(event) { const task = get(selectedTask); const { passwords } = event.detail; @@ -218,6 +226,8 @@ // [DEF:startDataTimeout:Function] // @PURPOSE: Starts a timeout to detect when the log stream has stalled. + // @PRE: None. + // @POST: dataTimeout is set to check connection status after 5s. function startDataTimeout() { waitingForData = false; dataTimeout = setTimeout(() => { @@ -230,6 +240,8 @@ // [DEF:resetDataTimeout:Function] // @PURPOSE: Resets the data stall timeout. + // @PRE: dataTimeout must be active. + // @POST: dataTimeout is cleared and restarted. function resetDataTimeout() { clearTimeout(dataTimeout); waitingForData = false; @@ -239,6 +251,8 @@ // [DEF:onMount:Function] // @PURPOSE: Initializes the component and subscribes to task selection changes. + // @PRE: Svelte component is mounting. + // @POST: Store subscription is created and returned for cleanup. onMount(() => { // Subscribe to selectedTask changes const unsubscribe = selectedTask.subscribe(task => { @@ -267,6 +281,8 @@ // [DEF:onDestroy:Function] /** * @purpose Close WebSocket connection when the component is destroyed. + * @pre Component is being destroyed. + * @post WebSocket is closed and timeouts are cleared. */ onDestroy(() => { clearTimeout(reconnectTimeout); diff --git a/frontend/src/components/tools/ConnectionForm.svelte b/frontend/src/components/tools/ConnectionForm.svelte index 496b683..80befdd 100644 --- a/frontend/src/components/tools/ConnectionForm.svelte +++ b/frontend/src/components/tools/ConnectionForm.svelte @@ -25,6 +25,8 @@ // [DEF:handleSubmit:Function] // @PURPOSE: Submits the connection form to the backend. + // @PRE: All required fields (name, host, database, username, password) must be filled. + // @POST: A new connection is created via the connection service and a success event is dispatched. async function handleSubmit() { if (!name || !host || !database || !username || !password) { addToast('Please fill in all required fields', 'warning'); @@ -47,6 +49,11 @@ } // [/DEF:handleSubmit:Function] + // [DEF:resetForm:Function] + /* @PURPOSE: Resets the connection form fields to their default values. + @PRE: None. + @POST: All form input variables are reset. + */ function resetForm() { name = ''; host = ''; @@ -55,6 +62,7 @@ username = ''; password = ''; } + // [/DEF:resetForm:Function] diff --git a/frontend/src/components/tools/ConnectionList.svelte b/frontend/src/components/tools/ConnectionList.svelte index 2c9f710..6e02624 100644 --- a/frontend/src/components/tools/ConnectionList.svelte +++ b/frontend/src/components/tools/ConnectionList.svelte @@ -19,6 +19,8 @@ // [DEF:fetchConnections:Function] // @PURPOSE: Fetches the list of connections from the backend. + // @PRE: None. + // @POST: connections array is populated. async function fetchConnections() { isLoading = true; try { @@ -33,6 +35,8 @@ // [DEF:handleDelete:Function] // @PURPOSE: Deletes a connection configuration. + // @PRE: id is provided and user confirms deletion. + // @POST: Connection is deleted from backend and list is reloaded. async function handleDelete(id) { if (!confirm('Are you sure you want to delete this connection?')) return; diff --git a/frontend/src/components/tools/MapperTool.svelte b/frontend/src/components/tools/MapperTool.svelte index ba1842e..6fbc242 100644 --- a/frontend/src/components/tools/MapperTool.svelte +++ b/frontend/src/components/tools/MapperTool.svelte @@ -28,6 +28,8 @@ // [DEF:fetchData:Function] // @PURPOSE: Fetches environments and saved connections. + // @PRE: None. + // @POST: envs and connections arrays are populated. async function fetchData() { try { const envsRes = await fetch('/api/environments'); @@ -41,6 +43,8 @@ // [DEF:handleRunMapper:Function] // @PURPOSE: Triggers the MapperPlugin task. + // @PRE: selectedEnv and datasetId are set; source-specific fields are valid. + // @POST: Mapper task is started and selectedTask is updated. async function handleRunMapper() { if (!selectedEnv || !datasetId) { addToast('Please fill in required fields', 'warning'); diff --git a/frontend/src/components/tools/SearchTool.svelte b/frontend/src/components/tools/SearchTool.svelte index 06db1db..a5f8020 100644 --- a/frontend/src/components/tools/SearchTool.svelte +++ b/frontend/src/components/tools/SearchTool.svelte @@ -22,6 +22,8 @@ // [DEF:fetchEnvironments:Function] // @PURPOSE: Fetches the list of available environments. + // @PRE: None. + // @POST: envs array is populated. async function fetchEnvironments() { try { const res = await fetch('/api/environments'); @@ -34,6 +36,8 @@ // [DEF:handleSearch:Function] // @PURPOSE: Triggers the SearchPlugin task. + // @PRE: selectedEnv and searchQuery must be set. + // @POST: Task is started and polling begins. async function handleSearch() { if (!selectedEnv || !searchQuery) { addToast('Please select environment and enter query', 'warning'); @@ -61,6 +65,8 @@ // [DEF:startPolling:Function] // @PURPOSE: Polls for task completion and results. + // @PRE: taskId is provided. + // @POST: pollInterval is set and results are updated on success. function startPolling(taskId) { if (pollInterval) clearInterval(pollInterval); diff --git a/frontend/src/lib/api.js b/frontend/src/lib/api.js index 37cb39e..c0ea128 100755 --- a/frontend/src/lib/api.js +++ b/frontend/src/lib/api.js @@ -10,6 +10,8 @@ const API_BASE_URL = '/api'; // [DEF:getWsUrl:Function] // @PURPOSE: Returns the WebSocket URL for a specific task, with fallback logic. +// @PRE: taskId is provided. +// @POST: Returns valid WebSocket URL string. // @PARAM: taskId (string) - The ID of the task. // @RETURN: string - The WebSocket URL. export const getWsUrl = (taskId) => { @@ -25,6 +27,8 @@ export const getWsUrl = (taskId) => { // [DEF:fetchApi:Function] // @PURPOSE: Generic GET request wrapper. +// @PRE: endpoint string is provided. +// @POST: Returns Promise resolving to JSON data or throws on error. // @PARAM: endpoint (string) - API endpoint. // @RETURN: Promise - JSON response. async function fetchApi(endpoint) { @@ -45,6 +49,8 @@ async function fetchApi(endpoint) { // [DEF:postApi:Function] // @PURPOSE: Generic POST request wrapper. +// @PRE: endpoint and body are provided. +// @POST: Returns Promise resolving to JSON data or throws on error. // @PARAM: endpoint (string) - API endpoint. // @PARAM: body (object) - Request payload. // @RETURN: Promise - JSON response. @@ -72,6 +78,8 @@ async function postApi(endpoint, body) { // [DEF:requestApi:Function] // @PURPOSE: Generic request wrapper. +// @PRE: endpoint and method are provided. +// @POST: Returns Promise resolving to JSON data or throws on error. async function requestApi(endpoint, method = 'GET', body = null) { try { console.log(`[api.requestApi][Action] ${method} to context={{'endpoint': '${endpoint}'}}`); diff --git a/frontend/src/lib/stores.js b/frontend/src/lib/stores.js index 19cea65..b35fe48 100755 --- a/frontend/src/lib/stores.js +++ b/frontend/src/lib/stores.js @@ -38,6 +38,8 @@ export const taskLogs = writable([]); // [DEF:fetchPlugins:Function] // @PURPOSE: Fetches plugins from the API and updates the plugins store. +// @PRE: None. +// @POST: plugins store is updated with data from the API. export async function fetchPlugins() { try { console.log("[stores.fetchPlugins][Action] Fetching plugins."); @@ -52,6 +54,8 @@ export async function fetchPlugins() { // [DEF:fetchTasks:Function] // @PURPOSE: Fetches tasks from the API and updates the tasks store. +// @PRE: None. +// @POST: tasks store is updated with data from the API. export async function fetchTasks() { try { console.log("[stores.fetchTasks][Action] Fetching tasks."); diff --git a/frontend/src/lib/toasts.js b/frontend/src/lib/toasts.js index f67baf4..68262ca 100755 --- a/frontend/src/lib/toasts.js +++ b/frontend/src/lib/toasts.js @@ -12,6 +12,8 @@ export const toasts = writable([]); // [DEF:addToast:Function] // @PURPOSE: Adds a new toast message. +// @PRE: message string is provided. +// @POST: New toast is added to the store and scheduled for removal. // @PARAM: message (string) - The message text. // @PARAM: type (string) - The type of toast (info, success, error). // @PARAM: duration (number) - Duration in ms before the toast is removed. @@ -25,6 +27,8 @@ export function addToast(message, type = 'info', duration = 3000) { // [DEF:removeToast:Function] // @PURPOSE: Removes a toast message by ID. +// @PRE: id is provided. +// @POST: Toast is removed from the store. // @PARAM: id (string) - The ID of the toast to remove. function removeToast(id) { console.log(`[toasts.removeToast][Action] Removing toast context={{'id': '${id}'}}`); diff --git a/frontend/src/pages/Dashboard.svelte b/frontend/src/pages/Dashboard.svelte index de2a020..e6c6a80 100755 --- a/frontend/src/pages/Dashboard.svelte +++ b/frontend/src/pages/Dashboard.svelte @@ -17,6 +17,8 @@ // [DEF:onMount:Function] /** * @purpose Fetch plugins when the component mounts. + * @pre Component is mounting. + * @post plugins store is populated with available tools. */ onMount(async () => { console.log("[Dashboard][Entry] Component mounted, fetching plugins."); @@ -27,6 +29,8 @@ // [DEF:selectPlugin:Function] /** * @purpose Selects a plugin to display its form. + * @pre plugin object is provided. + * @post selectedPlugin store is updated. * @param {Object} plugin - The plugin object to select. */ function selectPlugin(plugin) { diff --git a/frontend/src/pages/Settings.svelte b/frontend/src/pages/Settings.svelte index 88d93a4..ae74096 100755 --- a/frontend/src/pages/Settings.svelte +++ b/frontend/src/pages/Settings.svelte @@ -50,6 +50,8 @@ // [DEF:loadSettings:Function] /** * @purpose Loads settings from the backend. + * @pre Component mounted or refresh requested. + * @post settings object is populated with backend data. */ async function loadSettings() { try { @@ -67,6 +69,8 @@ // [DEF:handleSaveGlobal:Function] /** * @purpose Saves global settings to the backend. + * @pre settings.settings contains valid configuration. + * @post Backend global settings are updated. */ async function handleSaveGlobal() { try { @@ -84,6 +88,8 @@ // [DEF:handleAddOrUpdateEnv:Function] /** * @purpose Adds or updates an environment. + * @pre newEnv contains valid environment details. + * @post Environment list is updated on backend and reloaded locally. */ async function handleAddOrUpdateEnv() { try { @@ -108,6 +114,8 @@ // [DEF:handleDeleteEnv:Function] /** * @purpose Deletes an environment. + * @pre id of environment to delete is provided. + * @post Environment is removed from backend and list is reloaded. * @param {string} id - The ID of the environment to delete. */ async function handleDeleteEnv(id) { @@ -129,6 +137,8 @@ // [DEF:handleTestEnv:Function] /** * @purpose Tests the connection to an environment. + * @pre Environment ID is valid. + * @post Connection test result is displayed via toast. * @param {string} id - The ID of the environment to test. */ async function handleTestEnv(id) { @@ -152,6 +162,8 @@ // [DEF:editEnv:Function] /** * @purpose Sets the form to edit an existing environment. + * @pre env object is provided. + * @post newEnv is populated with env data and editingEnvId is set. * @param {Object} env - The environment object to edit. */ function editEnv(env) { @@ -163,6 +175,8 @@ // [DEF:resetEnvForm:Function] /** * @purpose Resets the environment form. + * @pre None. + * @post newEnv is reset to initial state and editingEnvId is cleared. */ function resetEnvForm() { newEnv = { diff --git a/frontend/src/routes/+page.svelte b/frontend/src/routes/+page.svelte index 98be373..759719b 100644 --- a/frontend/src/routes/+page.svelte +++ b/frontend/src/routes/+page.svelte @@ -14,6 +14,11 @@ pluginsStore.set(data.plugins); } + // [DEF:selectPlugin:Function] + /* @PURPOSE: Handles plugin selection and navigation. + @PRE: plugin object must be provided. + @POST: Navigates to migration or sets selectedPlugin store. + */ function selectPlugin(plugin) { console.log(`[Dashboard][Action] Selecting plugin: ${plugin.id}`); if (plugin.id === 'superset-migration') { @@ -22,7 +27,13 @@ selectedPlugin.set(plugin); } } + // [/DEF:selectPlugin:Function] + // [DEF:handleFormSubmit:Function] + /* @PURPOSE: Handles task creation from dynamic form submission. + @PRE: event.detail must contain task parameters. + @POST: Task is created via API and selectedTask store is updated. + */ async function handleFormSubmit(event) { console.log("[App.handleFormSubmit][Action] Handling form submission for task creation."); const params = event.detail; @@ -36,6 +47,7 @@ console.error(`[App.handleFormSubmit][Coherence:Failed] Task creation failed error=${error}`); } } + // [/DEF:handleFormSubmit:Function]
diff --git a/frontend/src/routes/+page.ts b/frontend/src/routes/+page.ts index 9750392..b3f3c86 100644 --- a/frontend/src/routes/+page.ts +++ b/frontend/src/routes/+page.ts @@ -1,5 +1,10 @@ import { api } from '../lib/api'; +// [DEF:load:Function] +/* @PURPOSE: Loads initial plugin data for the dashboard. + @PRE: None. + @POST: Returns an object with plugins or an error message. +*/ /** @type {import('./$types').PageLoad} */ export async function load() { try { @@ -15,3 +20,4 @@ export async function load() { }; } } +// [/DEF:load:Function] diff --git a/frontend/src/routes/migration/+page.svelte b/frontend/src/routes/migration/+page.svelte index 1e0caf0..0b48acb 100644 --- a/frontend/src/routes/migration/+page.svelte +++ b/frontend/src/routes/migration/+page.svelte @@ -51,6 +51,7 @@ // [DEF:fetchEnvironments:Function] /** * @purpose Fetches the list of environments from the API. + * @pre None. * @post environments state is updated. */ async function fetchEnvironments() { @@ -69,6 +70,7 @@ // [DEF:fetchDashboards:Function] /** * @purpose Fetches dashboards for the selected source environment. + * @pre envId is a valid environment ID. * @param envId The environment ID. * @post dashboards state is updated. */ @@ -93,6 +95,8 @@ // [DEF:fetchDatabases:Function] /** * @purpose Fetches databases from both environments and gets suggestions. + * @pre sourceEnvId and targetEnvId must be set. + * @post sourceDatabases, targetDatabases, mappings, and suggestions are updated. */ async function fetchDatabases() { if (!sourceEnvId || !targetEnvId) return; @@ -128,6 +132,8 @@ // [DEF:handleMappingUpdate:Function] /** * @purpose Saves a mapping to the backend. + * @pre event.detail contains sourceUuid and targetUuid. + * @post Mapping is saved and local mappings list is updated. */ async function handleMappingUpdate(event: CustomEvent) { const { sourceUuid, targetUuid } = event.detail; @@ -162,6 +168,8 @@ // [DEF:handleViewLogs:Function] // @PURPOSE: Opens the log viewer for a specific task. + // @PRE: event.detail contains task object. + // @POST: logViewer state updated and showLogViewer set to true. function handleViewLogs(event: CustomEvent) { const task = event.detail; logViewerTaskId = task.id; @@ -172,6 +180,8 @@ // [DEF:handlePasswordPrompt:Function] // @PURPOSE: Reactive logic to show password prompt when a task is awaiting input. + // @PRE: selectedTask status is AWAITING_INPUT. + // @POST: showPasswordPrompt set to true with request data. // This is triggered by TaskRunner or TaskHistory when a task needs input // For now, we rely on the WebSocket or manual check. // Ideally, TaskHistory or TaskRunner emits an event when input is needed. @@ -194,6 +204,8 @@ // [DEF:handleResumeMigration:Function] // @PURPOSE: Resumes a migration task with provided passwords. + // @PRE: event.detail contains passwords. + // @POST: resumeTask is called and showPasswordPrompt is hidden on success. async function handleResumeMigration(event: CustomEvent) { if (!$selectedTask) return; @@ -214,6 +226,7 @@ /** * @purpose Starts the migration process. * @pre sourceEnvId and targetEnvId must be set and different. + * @post Migration task is started and selectedTask is updated. */ async function startMigration() { if (!sourceEnvId || !targetEnvId) { diff --git a/frontend/src/routes/migration/mappings/+page.svelte b/frontend/src/routes/migration/mappings/+page.svelte index 6274362..e106351 100644 --- a/frontend/src/routes/migration/mappings/+page.svelte +++ b/frontend/src/routes/migration/mappings/+page.svelte @@ -32,6 +32,8 @@ // [DEF:fetchEnvironments:Function] // @PURPOSE: Fetches the list of environments. + // @PRE: None. + // @POST: environments array is populated. async function fetchEnvironments() { try { const response = await fetch('/api/environments'); @@ -50,6 +52,8 @@ // [DEF:fetchDatabases:Function] /** * @purpose Fetches databases from both environments and gets suggestions. + * @pre sourceEnvId and targetEnvId must be set. + * @post sourceDatabases, targetDatabases, mappings, and suggestions are updated. */ async function fetchDatabases() { if (!sourceEnvId || !targetEnvId) return; @@ -86,6 +90,8 @@ // [DEF:handleUpdate:Function] /** * @purpose Saves a mapping to the backend. + * @pre event.detail contains sourceUuid and targetUuid. + * @post Mapping is saved and local mappings list is updated. */ async function handleUpdate(event: CustomEvent) { const { sourceUuid, targetUuid } = event.detail; diff --git a/frontend/src/routes/settings/+page.svelte b/frontend/src/routes/settings/+page.svelte index 80d5529..79f2da9 100644 --- a/frontend/src/routes/settings/+page.svelte +++ b/frontend/src/routes/settings/+page.svelte @@ -21,6 +21,11 @@ let editingEnvId = null; + // [DEF:handleSaveGlobal:Function] + /* @PURPOSE: Saves global application settings. + @PRE: settings.settings must contain valid configuration. + @POST: Global settings are updated via API. + */ async function handleSaveGlobal() { try { console.log("[Settings.handleSaveGlobal][Action] Saving global settings."); @@ -32,7 +37,13 @@ addToast('Failed to save global settings', 'error'); } } + // [/DEF:handleSaveGlobal:Function] + // [DEF:handleAddOrUpdateEnv:Function] + /* @PURPOSE: Adds a new environment or updates an existing one. + @PRE: newEnv must contain valid environment details. + @POST: Environment is saved and page is reloaded to reflect changes. + */ async function handleAddOrUpdateEnv() { try { console.log(`[Settings.handleAddOrUpdateEnv][Action] ${editingEnvId ? 'Updating' : 'Adding'} environment.`); @@ -54,7 +65,13 @@ addToast('Failed to save environment', 'error'); } } + // [/DEF:handleAddOrUpdateEnv:Function] + // [DEF:handleDeleteEnv:Function] + /* @PURPOSE: Deletes a Superset environment. + @PRE: id must be a valid environment ID. + @POST: Environment is removed and page is reloaded. + */ async function handleDeleteEnv(id) { if (confirm('Are you sure you want to delete this environment?')) { try { @@ -69,7 +86,13 @@ } } } + // [/DEF:handleDeleteEnv:Function] + // [DEF:handleTestEnv:Function] + /* @PURPOSE: Tests the connection to a Superset environment. + @PRE: id must be a valid environment ID. + @POST: Displays success or error toast based on connection result. + */ async function handleTestEnv(id) { try { console.log(`[Settings.handleTestEnv][Action] Testing environment: ${id}`); @@ -86,12 +109,24 @@ addToast('Failed to test connection', 'error'); } } + // [/DEF:handleTestEnv:Function] + // [DEF:editEnv:Function] + /* @PURPOSE: Populates the environment form for editing. + @PRE: env object must be provided. + @POST: newEnv and editingEnvId are updated. + */ function editEnv(env) { newEnv = { ...env }; editingEnvId = env.id; } + // [/DEF:editEnv:Function] + // [DEF:resetEnvForm:Function] + /* @PURPOSE: Resets the environment creation/edit form to default state. + @PRE: None. + @POST: newEnv is cleared and editingEnvId is set to null. + */ function resetEnvForm() { newEnv = { id: '', @@ -103,6 +138,7 @@ }; editingEnvId = null; } + // [/DEF:resetEnvForm:Function]
diff --git a/frontend/src/routes/settings/+page.ts b/frontend/src/routes/settings/+page.ts index 91f7849..0ffa558 100644 --- a/frontend/src/routes/settings/+page.ts +++ b/frontend/src/routes/settings/+page.ts @@ -1,5 +1,10 @@ import { api } from '../../lib/api'; +// [DEF:load:Function] +/* @PURPOSE: Loads application settings and environment list. + @PRE: API must be reachable. + @POST: Returns settings object or default values on error. +*/ /** @type {import('./$types').PageLoad} */ export async function load() { try { @@ -21,3 +26,4 @@ export async function load() { }; } } +// [/DEF:load:Function] diff --git a/frontend/src/routes/settings/connections/+page.svelte b/frontend/src/routes/settings/connections/+page.svelte index 7be1098..5742a9b 100644 --- a/frontend/src/routes/settings/connections/+page.svelte +++ b/frontend/src/routes/settings/connections/+page.svelte @@ -10,11 +10,17 @@ let listComponent; + // [DEF:handleSuccess:Function] + /* @PURPOSE: Refreshes the connection list after a successful creation. + @PRE: listComponent must be bound. + @POST: Triggers the fetchConnections method on the list component. + */ function handleSuccess() { if (listComponent) { listComponent.fetchConnections(); } } + // [/DEF:handleSuccess:Function]
diff --git a/frontend/src/routes/tasks/+page.svelte b/frontend/src/routes/tasks/+page.svelte index 1377a7d..4e909bd 100644 --- a/frontend/src/routes/tasks/+page.svelte +++ b/frontend/src/routes/tasks/+page.svelte @@ -13,6 +13,11 @@ let showBackupModal = false; let selectedEnvId = ''; + // [DEF:loadInitialData:Function] + /* @PURPOSE: Loads tasks and environments on page initialization. + @PRE: API must be reachable. + @POST: tasks and environments variables are populated. + */ async function loadInitialData() { try { loading = true; @@ -28,7 +33,13 @@ loading = false; } } + // [/DEF:loadInitialData:Function] + // [DEF:refreshTasks:Function] + /* @PURPOSE: Periodically refreshes the task list. + @PRE: API must be reachable. + @POST: tasks variable is updated if data is valid. + */ async function refreshTasks() { try { const data = await getTasks(); @@ -40,11 +51,23 @@ console.error('Failed to refresh tasks:', error); } } + // [/DEF:refreshTasks:Function] + // [DEF:handleSelectTask:Function] + /* @PURPOSE: Updates the selected task ID when a task is clicked. + @PRE: event.detail.id must be provided. + @POST: selectedTaskId is updated. + */ function handleSelectTask(event) { selectedTaskId = event.detail.id; } + // [/DEF:handleSelectTask:Function] + // [DEF:handleRunBackup:Function] + /* @PURPOSE: Triggers a manual backup task for the selected environment. + @PRE: selectedEnvId must not be empty. + @POST: Backup task is created and task list is refreshed. + */ async function handleRunBackup() { if (!selectedEnvId) { addToast('Please select an environment', 'error'); @@ -61,6 +84,7 @@ console.error('Failed to start backup:', error); } } + // [/DEF:handleRunBackup:Function] onMount(() => { loadInitialData(); diff --git a/frontend/src/services/connectionService.js b/frontend/src/services/connectionService.js index 9562ed1..0540589 100644 --- a/frontend/src/services/connectionService.js +++ b/frontend/src/services/connectionService.js @@ -4,6 +4,11 @@ const API_BASE = '/api/settings/connections'; +// [DEF:getConnections:Function] +/* @PURPOSE: Fetch a list of saved connections. + @PRE: None. + @POST: Returns a promise resolving to an array of connections. +*/ /** * Fetch a list of saved connections. * @returns {Promise} List of connections. @@ -15,7 +20,13 @@ export async function getConnections() { } return await response.json(); } +// [/DEF:getConnections:Function] +// [DEF:createConnection:Function] +/* @PURPOSE: Create a new connection configuration. + @PRE: connectionData must be a valid object. + @POST: Returns a promise resolving to the created connection. +*/ /** * Create a new connection configuration. * @param {Object} connectionData - The connection data. @@ -36,7 +47,13 @@ export async function createConnection(connectionData) { } return await response.json(); } +// [/DEF:createConnection:Function] +// [DEF:deleteConnection:Function] +/* @PURPOSE: Delete a connection configuration. + @PRE: connectionId must be a valid string. + @POST: Returns a promise that resolves when deletion is complete. +*/ /** * Delete a connection configuration. * @param {string} connectionId - The ID of the connection to delete. @@ -49,4 +66,5 @@ export async function deleteConnection(connectionId) { if (!response.ok) { throw new Error(`Failed to delete connection: ${response.statusText}`); } -} \ No newline at end of file +} +// [/DEF:deleteConnection:Function] \ No newline at end of file diff --git a/frontend/src/services/taskService.js b/frontend/src/services/taskService.js index 220685f..7284450 100644 --- a/frontend/src/services/taskService.js +++ b/frontend/src/services/taskService.js @@ -4,6 +4,11 @@ const API_BASE = '/api/tasks'; +// [DEF:getTasks:Function] +/* @PURPOSE: Fetch a list of tasks with pagination and optional status filter. + @PRE: limit and offset are numbers. + @POST: Returns a promise resolving to a list of tasks. +*/ /** * Fetch a list of tasks with pagination and optional status filter. * @param {number} limit - Maximum number of tasks to return. @@ -26,7 +31,13 @@ export async function getTasks(limit = 10, offset = 0, status = null) { } return await response.json(); } +// [/DEF:getTasks:Function] +// [DEF:getTask:Function] +/* @PURPOSE: Fetch details for a specific task. + @PRE: taskId must be provided. + @POST: Returns a promise resolving to task details. +*/ /** * Fetch details for a specific task. * @param {string} taskId - The ID of the task. @@ -39,7 +50,13 @@ export async function getTask(taskId) { } return await response.json(); } +// [/DEF:getTask:Function] +// [DEF:getTaskLogs:Function] +/* @PURPOSE: Fetch logs for a specific task. + @PRE: taskId must be provided. + @POST: Returns a promise resolving to a list of log entries. +*/ /** * Fetch logs for a specific task. * @param {string} taskId - The ID of the task. @@ -55,7 +72,13 @@ export async function getTaskLogs(taskId) { const task = await getTask(taskId); return task.logs || []; } +// [/DEF:getTaskLogs:Function] +// [DEF:resumeTask:Function] +/* @PURPOSE: Resume a task that is awaiting input (e.g., passwords). + @PRE: taskId and passwords must be provided. + @POST: Returns a promise resolving to the updated task object. +*/ /** * Resume a task that is awaiting input (e.g., passwords). * @param {string} taskId - The ID of the task. @@ -77,7 +100,13 @@ export async function resumeTask(taskId, passwords) { } return await response.json(); } +// [/DEF:resumeTask:Function] +// [DEF:resolveTask:Function] +/* @PURPOSE: Resolve a task that is awaiting mapping. + @PRE: taskId and resolutionParams must be provided. + @POST: Returns a promise resolving to the updated task object. +*/ /** * Resolve a task that is awaiting mapping. * @param {string} taskId - The ID of the task. @@ -99,7 +128,13 @@ export async function resolveTask(taskId, resolutionParams) { } return await response.json(); } +// [/DEF:resolveTask:Function] +// [DEF:clearTasks:Function] +/* @PURPOSE: Clear tasks based on status. + @PRE: status is a string or null. + @POST: Returns a promise that resolves when tasks are cleared. +*/ /** * Clear tasks based on status. * @param {string|null} status - Filter by task status (optional). @@ -117,4 +152,5 @@ export async function clearTasks(status = null) { if (!response.ok) { throw new Error(`Failed to clear tasks: ${response.statusText}`); } -} \ No newline at end of file +} +// [/DEF:clearTasks:Function] \ No newline at end of file diff --git a/frontend/src/services/toolsService.js b/frontend/src/services/toolsService.js index d45378d..33946e4 100644 --- a/frontend/src/services/toolsService.js +++ b/frontend/src/services/toolsService.js @@ -4,6 +4,11 @@ const API_BASE = '/api/tasks'; +// [DEF:runTask:Function] +/* @PURPOSE: Start a new task for a given plugin. + @PRE: pluginId and params must be provided. + @POST: Returns a promise resolving to the task instance. +*/ /** * Start a new task for a given plugin. * @param {string} pluginId - The ID of the plugin to run. @@ -25,7 +30,13 @@ export async function runTask(pluginId, params) { } return await response.json(); } +// [/DEF:runTask:Function] +// [DEF:getTaskStatus:Function] +/* @PURPOSE: Fetch details for a specific task (to poll status or get result). + @PRE: taskId must be provided. + @POST: Returns a promise resolving to task details. +*/ /** * Fetch details for a specific task (to poll status or get result). * @param {string} taskId - The ID of the task. @@ -37,4 +48,5 @@ export async function getTaskStatus(taskId) { throw new Error(`Failed to fetch task ${taskId}: ${response.statusText}`); } return await response.json(); -} \ No newline at end of file +} +// [/DEF:getTaskStatus:Function] \ No newline at end of file diff --git a/generate_semantic_map.py b/generate_semantic_map.py index df572d7..4438f7a 100644 --- a/generate_semantic_map.py +++ b/generate_semantic_map.py @@ -18,9 +18,29 @@ from typing import Dict, List, Optional, Any, Pattern, Tuple, Set # Mock belief_scope for the script itself to avoid import issues class belief_scope: - def __init__(self, name): self.name = name - def __enter__(self): return self - def __exit__(self, *args): pass + # [DEF:__init__:Function] + # @PURPOSE: Mock init. + # @PRE: name is a string. + # @POST: Instance initialized. + def __init__(self, name): + self.name = name + # [/DEF:__init__:Function] + + # [DEF:__enter__:Function] + # @PURPOSE: Mock enter. + # @PRE: Instance initialized. + # @POST: Returns self. + def __enter__(self): + return self + # [/DEF:__enter__:Function] + + # [DEF:__exit__:Function] + # @PURPOSE: Mock exit. + # @PRE: Context entered. + # @POST: Context exited. + def __exit__(self, *args): + pass + # [/DEF:__exit__:Function] # [/SECTION] # [SECTION: CONFIGURATION] @@ -162,7 +182,7 @@ def get_patterns(lang: str) -> Dict[str, Pattern]: "tag": re.compile(r"#\s*@(?P[A-Z_]+):\s*(?P.*)"), "relation": re.compile(r"#\s*@RELATION:\s*(?P\w+)\s*->\s*(?P.*)"), "func_def": re.compile(r"^\s*(async\s+)?def\s+(?P\w+)"), - "belief_scope": re.compile(r"with\s+belief_scope\("), + "belief_scope": re.compile(r"with\s+(\w+\.)?belief_scope\("), } else: return { @@ -180,124 +200,127 @@ def get_patterns(lang: str) -> Dict[str, Pattern]: # [DEF:parse_file:Function] # @PURPOSE: Parses a single file to extract semantic entities. +# @PRE: full_path, rel_path, lang are valid strings. +# @POST: Returns extracted entities and list of issues. # @PARAM: full_path - Absolute path to file. # @PARAM: rel_path - Relative path from project root. # @PARAM: lang - Language identifier. # @RETURN: Tuple[List[SemanticEntity], List[str]] - Entities found and global issues. def parse_file(full_path: str, rel_path: str, lang: str) -> Tuple[List[SemanticEntity], List[str]]: - issues: List[str] = [] - try: - with open(full_path, 'r', encoding='utf-8') as f: - lines = f.readlines() - except Exception as e: - return [], [f"Could not read file {rel_path}: {e}"] + with belief_scope("parse_file"): + issues: List[str] = [] + try: + with open(full_path, 'r', encoding='utf-8') as f: + lines = f.readlines() + except Exception as e: + return [], [f"Could not read file {rel_path}: {e}"] - stack: List[SemanticEntity] = [] - file_entities: List[SemanticEntity] = [] - patterns = get_patterns(lang) + stack: List[SemanticEntity] = [] + file_entities: List[SemanticEntity] = [] + patterns = get_patterns(lang) - for i, line in enumerate(lines): - lineno = i + 1 - line = line.strip() - - # 1. Check for Anchor Start - match_start = None - if lang == "python": - match_start = patterns["anchor_start"].search(line) - else: - match_start = patterns["html_anchor_start"].search(line) or patterns["js_anchor_start"].search(line) - - if match_start: - name = match_start.group("name") - type_ = match_start.group("type") - entity = SemanticEntity(name, type_, lineno, rel_path) + for i, line in enumerate(lines): + lineno = i + 1 + line = line.strip() - if stack: - parent = stack[-1] - parent.children.append(entity) - entity.parent = parent - else: - file_entities.append(entity) - - stack.append(entity) - continue - - # 2. Check for Anchor End - match_end = None - if lang == "python": - match_end = patterns["anchor_end"].search(line) - else: - match_end = patterns["html_anchor_end"].search(line) or patterns["js_anchor_end"].search(line) - - if match_end: - name = match_end.group("name") - type_ = match_end.group("type") - - if not stack: - issues.append(f"{rel_path}:{lineno} Found closing anchor [/DEF:{name}:{type_}] without opening anchor.") - continue - - top = stack[-1] - if top.name == name and top.type == type_: - top.end_line = lineno - stack.pop() - else: - issues.append(f"{rel_path}:{lineno} Mismatched closing anchor. Expected [/DEF:{top.name}:{top.type}], found [/DEF:{name}:{type_}].") - continue - - # 3. Check for Naked Functions (Missing Contracts) - if "func_def" in patterns: - match_func = patterns["func_def"].search(line) - if match_func: - func_name = match_func.group("name") - is_covered = False - if stack: - current = stack[-1] - # Check if we are inside a Function anchor that matches the name - if current.type == "Function" and current.name == func_name: - is_covered = True - - if not is_covered: - issues.append(f"{rel_path}:{lineno} Function '{func_name}' implementation found without matching [DEF:{func_name}:Function] contract.") - - # 4. Check for Tags/Relations - if stack: - current = stack[-1] - - match_rel = patterns["relation"].search(line) - if match_rel: - current.relations.append({ - "type": match_rel.group("type"), - "target": match_rel.group("target") - }) - continue - - match_tag = None + # 1. Check for Anchor Start + match_start = None if lang == "python": - match_tag = patterns["tag"].search(line) - elif lang == "svelte_js": - match_tag = patterns["html_tag"].search(line) - if not match_tag and ("/*" in line or "*" in line or "//" in line): - match_tag = patterns["jsdoc_tag"].search(line) + match_start = patterns["anchor_start"].search(line) + else: + match_start = patterns["html_anchor_start"].search(line) or patterns["js_anchor_start"].search(line) - if match_tag: - tag_name = match_tag.group("tag").upper() - tag_value = match_tag.group("value").strip() - current.tags[tag_name] = tag_value + if match_start: + name = match_start.group("name") + type_ = match_start.group("type") + entity = SemanticEntity(name, type_, lineno, rel_path) + + if stack: + parent = stack[-1] + parent.children.append(entity) + entity.parent = parent + else: + file_entities.append(entity) + + stack.append(entity) + continue - # Check for belief scope in implementation - if lang == "python" and "belief_scope" in patterns: - if patterns["belief_scope"].search(line): - current.has_belief_scope = True + # 2. Check for Anchor End + match_end = None + if lang == "python": + match_end = patterns["anchor_end"].search(line) + else: + match_end = patterns["html_anchor_end"].search(line) or patterns["js_anchor_end"].search(line) - # End of file check - if stack: - for unclosed in stack: - unclosed.compliance_issues.append(f"Unclosed Anchor at end of file (started line {unclosed.start_line})") - if unclosed.parent is None and unclosed not in file_entities: - file_entities.append(unclosed) + if match_end: + name = match_end.group("name") + type_ = match_end.group("type") + + if not stack: + issues.append(f"{rel_path}:{lineno} Found closing anchor [/DEF:{name}:{type_}] without opening anchor.") + continue + + top = stack[-1] + if top.name == name and top.type == type_: + top.end_line = lineno + stack.pop() + else: + issues.append(f"{rel_path}:{lineno} Mismatched closing anchor. Expected [/DEF:{top.name}:{top.type}], found [/DEF:{name}:{type_}].") + continue - return file_entities, issues + # 3. Check for Naked Functions (Missing Contracts) + if "func_def" in patterns: + match_func = patterns["func_def"].search(line) + if match_func: + func_name = match_func.group("name") + is_covered = False + if stack: + current = stack[-1] + # Check if we are inside a Function anchor that matches the name + if current.type == "Function" and current.name == func_name: + is_covered = True + + if not is_covered: + issues.append(f"{rel_path}:{lineno} Function '{func_name}' implementation found without matching [DEF:{func_name}:Function] contract.") + + # 4. Check for Tags/Relations + if stack: + current = stack[-1] + + match_rel = patterns["relation"].search(line) + if match_rel: + current.relations.append({ + "type": match_rel.group("type"), + "target": match_rel.group("target") + }) + continue + + match_tag = None + if lang == "python": + match_tag = patterns["tag"].search(line) + elif lang == "svelte_js": + match_tag = patterns["html_tag"].search(line) + if not match_tag and ("/*" in line or "*" in line or "//" in line): + match_tag = patterns["jsdoc_tag"].search(line) + + if match_tag: + tag_name = match_tag.group("tag").upper() + tag_value = match_tag.group("value").strip() + current.tags[tag_name] = tag_value + + # Check for belief scope in implementation + if lang == "python" and "belief_scope" in patterns: + if patterns["belief_scope"].search(line): + current.has_belief_scope = True + + # End of file check + if stack: + for unclosed in stack: + unclosed.compliance_issues.append(f"Unclosed Anchor at end of file (started line {unclosed.start_line})") + if unclosed.parent is None and unclosed not in file_entities: + file_entities.append(unclosed) + + return file_entities, issues # [/DEF:parse_file:Function] @@ -309,26 +332,30 @@ class SemanticMapGenerator: # @PRE: root_dir is a valid path string. # @POST: Generator instance is ready. def __init__(self, root_dir: str): - self.root_dir = root_dir - self.entities: List[SemanticEntity] = [] - self.file_scores: Dict[str, float] = {} - self.global_issues: List[str] = [] - self.ignored_patterns = self._load_gitignore() + with belief_scope("__init__"): + self.root_dir = root_dir + self.entities: List[SemanticEntity] = [] + self.file_scores: Dict[str, float] = {} + self.global_issues: List[str] = [] + self.ignored_patterns = self._load_gitignore() # [/DEF:__init__:Function] # [DEF:_load_gitignore:Function] # @PURPOSE: Loads patterns from .gitignore file. + # @PRE: .gitignore exists in root_dir. + # @POST: Returns set of ignore patterns. # @RETURN: Set of patterns to ignore. def _load_gitignore(self) -> Set[str]: - patterns = set() - ignore_file = os.path.join(self.root_dir, ".gitignore") - if os.path.exists(ignore_file): - with open(ignore_file, 'r') as f: - for line in f: - line = line.strip() - if line and not line.startswith("#"): - patterns.add(line) - return patterns + with belief_scope("_load_gitignore"): + patterns = set() + ignore_file = os.path.join(self.root_dir, ".gitignore") + if os.path.exists(ignore_file): + with open(ignore_file, 'r') as f: + for line in f: + line = line.strip() + if line and not line.startswith("#"): + patterns.add(line) + return patterns # [/DEF:_load_gitignore:Function] # [DEF:_is_ignored:Function] @@ -338,39 +365,40 @@ class SemanticMapGenerator: # @PARAM: rel_path (str) - Path relative to root. # @RETURN: bool - True if ignored. def _is_ignored(self, rel_path: str) -> bool: - # Normalize path for matching - rel_path = rel_path.replace(os.sep, '/') + with belief_scope("_is_ignored"): + # Normalize path for matching + rel_path = rel_path.replace(os.sep, '/') - # Check hardcoded defaults - parts = rel_path.split('/') - for part in parts: - if part in IGNORE_DIRS: - return True - - if os.path.basename(rel_path) in IGNORE_FILES: - return True - - # Check gitignore patterns - for pattern in self.ignored_patterns: - # Handle directory patterns like 'node_modules/' - if pattern.endswith('/'): - dir_pattern = pattern.rstrip('/') - if rel_path == dir_pattern or rel_path.startswith(pattern): + # Check hardcoded defaults + parts = rel_path.split('/') + for part in parts: + if part in IGNORE_DIRS: return True - # Check for patterns in frontend/ or backend/ - if rel_path.startswith("frontend/") and fnmatch.fnmatch(rel_path[9:], pattern): - return True - if rel_path.startswith("backend/") and fnmatch.fnmatch(rel_path[8:], pattern): + if os.path.basename(rel_path) in IGNORE_FILES: return True - # Use fnmatch for glob patterns - if fnmatch.fnmatch(rel_path, pattern) or \ - fnmatch.fnmatch(os.path.basename(rel_path), pattern) or \ - any(fnmatch.fnmatch(part, pattern) for part in parts): - return True - - return False + # Check gitignore patterns + for pattern in self.ignored_patterns: + # Handle directory patterns like 'node_modules/' + if pattern.endswith('/'): + dir_pattern = pattern.rstrip('/') + if rel_path == dir_pattern or rel_path.startswith(pattern): + return True + + # Check for patterns in frontend/ or backend/ + if rel_path.startswith("frontend/") and fnmatch.fnmatch(rel_path[9:], pattern): + return True + if rel_path.startswith("backend/") and fnmatch.fnmatch(rel_path[8:], pattern): + return True + + # Use fnmatch for glob patterns + if fnmatch.fnmatch(rel_path, pattern) or \ + fnmatch.fnmatch(os.path.basename(rel_path), pattern) or \ + any(fnmatch.fnmatch(part, pattern) for part in parts): + return True + + return False # [/DEF:_is_ignored:Function] # [DEF:run:Function] @@ -380,10 +408,11 @@ class SemanticMapGenerator: # @RELATION: CALLS -> _walk_and_parse # @RELATION: CALLS -> _generate_artifacts def run(self): - print(f"Starting Semantic Map Generation in {self.root_dir}...") - self._walk_and_parse() - self._generate_artifacts() - print("Done.") + with belief_scope("run"): + print(f"Starting Semantic Map Generation in {self.root_dir}...") + self._walk_and_parse() + self._generate_artifacts() + print("Done.") # [/DEF:run:Function] # [DEF:_walk_and_parse:Function] @@ -391,29 +420,30 @@ class SemanticMapGenerator: # @PRE: root_dir exists. # @POST: All files are scanned and entities extracted. def _walk_and_parse(self): - for root, dirs, files in os.walk(self.root_dir): - # Optimization: don't enter ignored directories - dirs[:] = [d for d in dirs if not self._is_ignored(os.path.relpath(os.path.join(root, d), self.root_dir) + "/")] - - for file in files: - file_path = os.path.join(root, file) - rel_path = os.path.relpath(file_path, self.root_dir) + with belief_scope("_walk_and_parse"): + for root, dirs, files in os.walk(self.root_dir): + # Optimization: don't enter ignored directories + dirs[:] = [d for d in dirs if not self._is_ignored(os.path.relpath(os.path.join(root, d), self.root_dir) + "/")] - if self._is_ignored(rel_path): - continue - - lang = None - if file.endswith(".py"): - lang = "python" - elif file.endswith((".svelte", ".js", ".ts")): - lang = "svelte_js" - - if lang: - entities, issues = parse_file(file_path, rel_path, lang) - self.global_issues.extend(issues) + for file in files: + file_path = os.path.join(root, file) + rel_path = os.path.relpath(file_path, self.root_dir) - if entities: - self._process_file_results(rel_path, entities) + if self._is_ignored(rel_path): + continue + + lang = None + if file.endswith(".py"): + lang = "python" + elif file.endswith((".svelte", ".js", ".ts")): + lang = "svelte_js" + + if lang: + entities, issues = parse_file(file_path, rel_path, lang) + self.global_issues.extend(issues) + + if entities: + self._process_file_results(rel_path, entities) # [/DEF:_walk_and_parse:Function] # [DEF:_process_file_results:Function] @@ -421,26 +451,28 @@ class SemanticMapGenerator: # @PRE: Entities have been parsed from the file. # @POST: File score is calculated and issues collected. def _process_file_results(self, rel_path: str, entities: List[SemanticEntity]): - total_score = 0 - count = 0 - - # [DEF:validate_recursive:Function] - # @PURPOSE: Recursively validates a list of entities. - # @PRE: ent_list is a list of SemanticEntity objects. - # @POST: All entities and their children are validated. - def validate_recursive(ent_list): - nonlocal total_score, count - for e in ent_list: - e.validate() - total_score += e.get_score() - count += 1 - validate_recursive(e.children) - # [/DEF:validate_recursive:Function] + with belief_scope("_process_file_results"): + total_score = 0 + count = 0 + + # [DEF:validate_recursive:Function] + # @PURPOSE: Recursively validates a list of entities. + # @PRE: ent_list is a list of SemanticEntity objects. + # @POST: All entities and their children are validated. + def validate_recursive(ent_list): + with belief_scope("validate_recursive"): + nonlocal total_score, count + for e in ent_list: + e.validate() + total_score += e.get_score() + count += 1 + validate_recursive(e.children) + # [/DEF:validate_recursive:Function] - validate_recursive(entities) - - self.entities.extend(entities) - self.file_scores[rel_path] = (total_score / count) if count > 0 else 0.0 + validate_recursive(entities) + + self.entities.extend(entities) + self.file_scores[rel_path] = (total_score / count) if count > 0 else 0.0 # [/DEF:_process_file_results:Function] # [DEF:_generate_artifacts:Function] @@ -448,23 +480,24 @@ class SemanticMapGenerator: # @PRE: Parsing and validation are complete. # @POST: JSON and Markdown artifacts are written to disk. def _generate_artifacts(self): - # 1. Full JSON Map - full_map = { - "project_root": self.root_dir, - "generated_at": datetime.datetime.now().isoformat(), - "modules": [e.to_dict() for e in self.entities] - } - - os.makedirs(os.path.dirname(OUTPUT_JSON), exist_ok=True) - with open(OUTPUT_JSON, 'w', encoding='utf-8') as f: - json.dump(full_map, f, indent=2) - print(f"Generated {OUTPUT_JSON}") + with belief_scope("_generate_artifacts"): + # 1. Full JSON Map + full_map = { + "project_root": self.root_dir, + "generated_at": datetime.datetime.now().isoformat(), + "modules": [e.to_dict() for e in self.entities] + } + + os.makedirs(os.path.dirname(OUTPUT_JSON), exist_ok=True) + with open(OUTPUT_JSON, 'w', encoding='utf-8') as f: + json.dump(full_map, f, indent=2) + print(f"Generated {OUTPUT_JSON}") - # 2. Compliance Report - self._generate_report() + # 2. Compliance Report + self._generate_report() - # 3. Compressed Map (Markdown) - self._generate_compressed_map() + # 3. Compressed Map (Markdown) + self._generate_compressed_map() # [/DEF:_generate_artifacts:Function] # [DEF:_generate_report:Function] @@ -472,40 +505,41 @@ class SemanticMapGenerator: # @PRE: File scores and issues are available. # @POST: Markdown report is created in reports directory. def _generate_report(self): - timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") - report_path = os.path.join(REPORTS_DIR, f"semantic_report_{timestamp}.md") - os.makedirs(REPORTS_DIR, exist_ok=True) + with belief_scope("_generate_report"): + timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") + report_path = os.path.join(REPORTS_DIR, f"semantic_report_{timestamp}.md") + os.makedirs(REPORTS_DIR, exist_ok=True) - total_files = len(self.file_scores) - avg_score = sum(self.file_scores.values()) / total_files if total_files > 0 else 0 - - with open(report_path, 'w', encoding='utf-8') as f: - f.write(f"# Semantic Compliance Report\n\n") - f.write(f"**Generated At:** {datetime.datetime.now().isoformat()}\n") - f.write(f"**Global Compliance Score:** {avg_score:.1%}\n") - f.write(f"**Scanned Files:** {total_files}\n\n") - - if self.global_issues: - f.write("## Critical Parsing Errors\n") - for issue in self.global_issues: - f.write(f"- 🔴 {issue}\n") - f.write("\n") - - f.write("## File Compliance Status\n") - f.write("| File | Score | Issues |\n") - f.write("|------|-------|--------|\n") + total_files = len(self.file_scores) + avg_score = sum(self.file_scores.values()) / total_files if total_files > 0 else 0 - sorted_files = sorted(self.file_scores.items(), key=lambda x: x[1]) - - for file_path, score in sorted_files: - issues = [] - self._collect_issues(self.entities, file_path, issues) + with open(report_path, 'w', encoding='utf-8') as f: + f.write(f"# Semantic Compliance Report\n\n") + f.write(f"**Generated At:** {datetime.datetime.now().isoformat()}\n") + f.write(f"**Global Compliance Score:** {avg_score:.1%}\n") + f.write(f"**Scanned Files:** {total_files}\n\n") + + if self.global_issues: + f.write("## Critical Parsing Errors\n") + for issue in self.global_issues: + f.write(f"- 🔴 {issue}\n") + f.write("\n") + + f.write("## File Compliance Status\n") + f.write("| File | Score | Issues |\n") + f.write("|------|-------|--------|\n") - status_icon = "🟢" if score == 1.0 else "🟡" if score > 0.5 else "🔴" - issue_text = "
".join(issues) if issues else "OK" - f.write(f"| {file_path} | {status_icon} {score:.0%} | {issue_text} |\n") + sorted_files = sorted(self.file_scores.items(), key=lambda x: x[1]) + + for file_path, score in sorted_files: + issues = [] + self._collect_issues(self.entities, file_path, issues) + + status_icon = "🟢" if score == 1.0 else "🟡" if score > 0.5 else "🔴" + issue_text = "
".join(issues) if issues else "OK" + f.write(f"| {file_path} | {status_icon} {score:.0%} | {issue_text} |\n") - print(f"Generated {report_path}") + print(f"Generated {report_path}") # [/DEF:_generate_report:Function] # [DEF:_collect_issues:Function] @@ -513,10 +547,11 @@ class SemanticMapGenerator: # @PRE: entities list and file_path are valid. # @POST: issues list is populated with compliance issues. def _collect_issues(self, entities: List[SemanticEntity], file_path: str, issues: List[str]): - for e in entities: - if e.file_path == file_path: - issues.extend([f"[{e.name}] {i}" for i in e.compliance_issues]) - self._collect_issues(e.children, file_path, issues) + with belief_scope("_collect_issues"): + for e in entities: + if e.file_path == file_path: + issues.extend([f"[{e.name}] {i}" for i in e.compliance_issues]) + self._collect_issues(e.children, file_path, issues) # [/DEF:_collect_issues:Function] # [DEF:_generate_compressed_map:Function] @@ -524,16 +559,17 @@ class SemanticMapGenerator: # @PRE: Entities have been processed. # @POST: Markdown project map is written. def _generate_compressed_map(self): - os.makedirs(os.path.dirname(OUTPUT_COMPRESSED_MD), exist_ok=True) + with belief_scope("_generate_compressed_map"): + os.makedirs(os.path.dirname(OUTPUT_COMPRESSED_MD), exist_ok=True) - with open(OUTPUT_COMPRESSED_MD, 'w', encoding='utf-8') as f: - f.write("# Project Semantic Map\n\n") - f.write("> Compressed view for AI Context. Generated automatically.\n\n") - - for entity in self.entities: - self._write_entity_md(f, entity, level=0) + with open(OUTPUT_COMPRESSED_MD, 'w', encoding='utf-8') as f: + f.write("# Project Semantic Map\n\n") + f.write("> Compressed view for AI Context. Generated automatically.\n\n") + + for entity in self.entities: + self._write_entity_md(f, entity, level=0) - print(f"Generated {OUTPUT_COMPRESSED_MD}") + print(f"Generated {OUTPUT_COMPRESSED_MD}") # [/DEF:_generate_compressed_map:Function] # [DEF:_write_entity_md:Function] @@ -541,30 +577,31 @@ class SemanticMapGenerator: # @PRE: f is an open file handle, entity is valid. # @POST: Entity details are written to the file. def _write_entity_md(self, f, entity: SemanticEntity, level: int): - indent = " " * level + with belief_scope("_write_entity_md"): + indent = " " * level - icon = "📦" - if entity.type == "Component": icon = "🧩" - elif entity.type == "Function": icon = "ƒ" - elif entity.type == "Class": icon = "ℂ" - - f.write(f"{indent}- {icon} **{entity.name}** (`{entity.type}`)\n") - - purpose = entity.tags.get("PURPOSE") or entity.tags.get("purpose") - layer = entity.tags.get("LAYER") or entity.tags.get("layer") - - if purpose: - f.write(f"{indent} - 📝 {purpose}\n") - if layer: - f.write(f"{indent} - 🏗️ Layer: {layer}\n") + icon = "📦" + if entity.type == "Component": icon = "🧩" + elif entity.type == "Function": icon = "ƒ" + elif entity.type == "Class": icon = "ℂ" - for rel in entity.relations: - if rel['type'] in ['DEPENDS_ON', 'CALLS', 'INHERITS_FROM']: - f.write(f"{indent} - 🔗 {rel['type']} -> `{rel['target']}`\n") + f.write(f"{indent}- {icon} **{entity.name}** (`{entity.type}`)\n") + + purpose = entity.tags.get("PURPOSE") or entity.tags.get("purpose") + layer = entity.tags.get("LAYER") or entity.tags.get("layer") + + if purpose: + f.write(f"{indent} - 📝 {purpose}\n") + if layer: + f.write(f"{indent} - 🏗️ Layer: {layer}\n") + + for rel in entity.relations: + if rel['type'] in ['DEPENDS_ON', 'CALLS', 'INHERITS_FROM']: + f.write(f"{indent} - 🔗 {rel['type']} -> `{rel['target']}`\n") - if level < 2: - for child in entity.children: - self._write_entity_md(f, child, level + 1) + if level < 2: + for child in entity.children: + self._write_entity_md(f, child, level + 1) # [/DEF:_write_entity_md:Function] # [/DEF:SemanticMapGenerator:Class] diff --git a/migration_script.py b/migration_script.py index 3ecf06a..968c9c0 100755 --- a/migration_script.py +++ b/migration_script.py @@ -60,7 +60,8 @@ class Migration: # @RELATION: CALLS -> self.confirm_db_config_replacement # @RELATION: CALLS -> self.execute_migration def run(self) -> None: - self.logger.info("[run][Entry] Запуск скрипта миграции.") + with self.logger.belief_scope("Migration.run"): + self.logger.info("[run][Entry] Запуск скрипта миграции.") self.ask_delete_on_failure() self.select_environments() self.select_dashboards() @@ -71,16 +72,18 @@ class Migration: # [DEF:ask_delete_on_failure:Function] # @PURPOSE: Запрашивает у пользователя, следует ли удалять дашборд при ошибке импорта. + # @PRE: None. # @POST: `self.enable_delete_on_failure` установлен. # @RELATION: CALLS -> yesno def ask_delete_on_failure(self) -> None: - self.enable_delete_on_failure = yesno( + with self.logger.belief_scope("Migration.ask_delete_on_failure"): + self.enable_delete_on_failure = yesno( "Поведение при ошибке импорта", "Если импорт завершится ошибкой, удалить существующий дашборд и попытаться импортировать заново?", ) - self.logger.info( - "[ask_delete_on_failure][State] Delete-on-failure = %s", - self.enable_delete_on_failure, + self.logger.info( + "[ask_delete_on_failure][State] Delete-on-failure = %s", + self.enable_delete_on_failure, ) # [/DEF:ask_delete_on_failure:Function] @@ -91,38 +94,39 @@ class Migration: # @RELATION: CALLS -> setup_clients # @RELATION: CALLS -> menu def select_environments(self) -> None: - self.logger.info("[select_environments][Entry] Шаг 1/5: Выбор окружений.") - try: - all_clients = setup_clients(self.logger) - available_envs = list(all_clients.keys()) - except Exception as e: - self.logger.error("[select_environments][Failure] %s", e, exc_info=True) - msgbox("Ошибка", "Не удалось инициализировать клиенты.") - return + with self.logger.belief_scope("Migration.select_environments"): + self.logger.info("[select_environments][Entry] Шаг 1/5: Выбор окружений.") + try: + all_clients = setup_clients(self.logger) + available_envs = list(all_clients.keys()) + except Exception as e: + self.logger.error("[select_environments][Failure] %s", e, exc_info=True) + msgbox("Ошибка", "Не удалось инициализировать клиенты.") + return - rc, from_env_name = menu( - title="Выбор окружения", - prompt="Исходное окружение:", - choices=available_envs, - ) - if rc != 0 or from_env_name is None: - self.logger.info("[select_environments][State] Source environment selection cancelled.") - return - self.from_c = all_clients[from_env_name] - self.logger.info("[select_environments][State] from = %s", from_env_name) + rc, from_env_name = menu( + title="Выбор окружения", + prompt="Исходное окружение:", + choices=available_envs, + ) + if rc != 0 or from_env_name is None: + self.logger.info("[select_environments][State] Source environment selection cancelled.") + return + self.from_c = all_clients[from_env_name] + self.logger.info("[select_environments][State] from = %s", from_env_name) - available_envs.remove(from_env_name) - rc, to_env_name = menu( - title="Выбор окружения", - prompt="Целевое окружение:", - choices=available_envs, - ) - if rc != 0 or to_env_name is None: - self.logger.info("[select_environments][State] Target environment selection cancelled.") - return - self.to_c = all_clients[to_env_name] - self.logger.info("[select_environments][State] to = %s", to_env_name) - self.logger.info("[select_environments][Exit] Шаг 1 завершён.") + available_envs.remove(from_env_name) + rc, to_env_name = menu( + title="Выбор окружения", + prompt="Целевое окружение:", + choices=available_envs, + ) + if rc != 0 or to_env_name is None: + self.logger.info("[select_environments][State] Target environment selection cancelled.") + return + self.to_c = all_clients[to_env_name] + self.logger.info("[select_environments][State] to = %s", to_env_name) + self.logger.info("[select_environments][Exit] Шаг 1 завершён.") # [/DEF:select_environments:Function] # [DEF:select_dashboards:Function] @@ -132,93 +136,97 @@ class Migration: # @RELATION: CALLS -> self.from_c.get_dashboards # @RELATION: CALLS -> checklist def select_dashboards(self) -> None: - self.logger.info("[select_dashboards][Entry] Шаг 2/5: Выбор дашбордов.") - if self.from_c is None: - self.logger.error("[select_dashboards][Failure] Source client not initialized.") - msgbox("Ошибка", "Исходное окружение не выбрано.") - return - try: - _, all_dashboards = self.from_c.get_dashboards() - if not all_dashboards: - self.logger.warning("[select_dashboards][State] No dashboards.") - msgbox("Информация", "В исходном окружении нет дашбордов.") + with self.logger.belief_scope("Migration.select_dashboards"): + self.logger.info("[select_dashboards][Entry] Шаг 2/5: Выбор дашбордов.") + if self.from_c is None: + self.logger.error("[select_dashboards][Failure] Source client not initialized.") + msgbox("Ошибка", "Исходное окружение не выбрано.") return - - rc, regex = inputbox("Поиск", "Введите регулярное выражение для поиска дашбордов:") - if rc != 0: - return - # Ensure regex is a string and perform case‑insensitive search - regex_str = str(regex) - filtered_dashboards = [ - d for d in all_dashboards if re.search(regex_str, d["dashboard_title"], re.IGNORECASE) - ] - - options = [("ALL", "Все дашборды")] + [ - (str(d["id"]), d["dashboard_title"]) for d in filtered_dashboards - ] - - rc, selected = checklist( - title="Выбор дашбордов", - prompt="Отметьте нужные дашборды (введите номера):", - options=options, - ) - if rc != 0: - return - - if "ALL" in selected: - self.dashboards_to_migrate = filtered_dashboards - else: - self.dashboards_to_migrate = [ - d for d in filtered_dashboards if str(d["id"]) in selected + try: + _, all_dashboards = self.from_c.get_dashboards() + if not all_dashboards: + self.logger.warning("[select_dashboards][State] No dashboards.") + msgbox("Информация", "В исходном окружении нет дашбордов.") + return + + rc, regex = inputbox("Поиск", "Введите регулярное выражение для поиска дашбордов:") + if rc != 0: + return + # Ensure regex is a string and perform case‑insensitive search + regex_str = str(regex) + filtered_dashboards = [ + d for d in all_dashboards if re.search(regex_str, d["dashboard_title"], re.IGNORECASE) ] - - self.logger.info( - "[select_dashboards][State] Выбрано %d дашбордов.", - len(self.dashboards_to_migrate), - ) - except Exception as e: - self.logger.error("[select_dashboards][Failure] %s", e, exc_info=True) - msgbox("Ошибка", "Не удалось получить список дашбордов.") - self.logger.info("[select_dashboards][Exit] Шаг 2 завершён.") + + options = [("ALL", "Все дашборды")] + [ + (str(d["id"]), d["dashboard_title"]) for d in filtered_dashboards + ] + + rc, selected = checklist( + title="Выбор дашбордов", + prompt="Отметьте нужные дашборды (введите номера):", + options=options, + ) + if rc != 0: + return + + if "ALL" in selected: + self.dashboards_to_migrate = filtered_dashboards + else: + self.dashboards_to_migrate = [ + d for d in filtered_dashboards if str(d["id"]) in selected + ] + + self.logger.info( + "[select_dashboards][State] Выбрано %d дашбордов.", + len(self.dashboards_to_migrate), + ) + except Exception as e: + self.logger.error("[select_dashboards][Failure] %s", e, exc_info=True) + msgbox("Ошибка", "Не удалось получить список дашбордов.") + self.logger.info("[select_dashboards][Exit] Шаг 2 завершён.") # [/DEF:select_dashboards:Function] # [DEF:confirm_db_config_replacement:Function] # @PURPOSE: Запрашивает у пользователя, требуется ли заменить имена БД в YAML-файлах. + # @PRE: None. # @POST: `self.db_config_replacement` либо `None`, либо заполнен. # @RELATION: CALLS -> yesno # @RELATION: CALLS -> self._select_databases def confirm_db_config_replacement(self) -> None: - if yesno("Замена БД", "Заменить конфигурацию БД в YAML‑файлах?"): - old_db, new_db = self._select_databases() - if not old_db or not new_db: - self.logger.info("[confirm_db_config_replacement][State] Selection cancelled.") - return - print(f"old_db: {old_db}") - old_result = old_db.get("result", {}) - new_result = new_db.get("result", {}) + with self.logger.belief_scope("Migration.confirm_db_config_replacement"): + if yesno("Замена БД", "Заменить конфигурацию БД в YAML‑файлах?"): + old_db, new_db = self._select_databases() + if not old_db or not new_db: + self.logger.info("[confirm_db_config_replacement][State] Selection cancelled.") + return + print(f"old_db: {old_db}") + old_result = old_db.get("result", {}) + new_result = new_db.get("result", {}) - self.db_config_replacement = { - "old": { - "database_name": old_result.get("database_name"), - "uuid": old_result.get("uuid"), - "database_uuid": old_result.get("uuid"), - "id": str(old_db.get("id")) - }, - "new": { - "database_name": new_result.get("database_name"), - "uuid": new_result.get("uuid"), - "database_uuid": new_result.get("uuid"), - "id": str(new_db.get("id")) + self.db_config_replacement = { + "old": { + "database_name": old_result.get("database_name"), + "uuid": old_result.get("uuid"), + "database_uuid": old_result.get("uuid"), + "id": str(old_db.get("id")) + }, + "new": { + "database_name": new_result.get("database_name"), + "uuid": new_result.get("uuid"), + "database_uuid": new_result.get("uuid"), + "id": str(new_db.get("id")) + } } - } - - self.logger.info("[confirm_db_config_replacement][State] Replacement set: %s", self.db_config_replacement) - else: - self.logger.info("[confirm_db_config_replacement][State] Skipped.") + + self.logger.info("[confirm_db_config_replacement][State] Replacement set: %s", self.db_config_replacement) + else: + self.logger.info("[confirm_db_config_replacement][State] Skipped.") # [/DEF:confirm_db_config_replacement:Function] # [DEF:_select_databases:Function] # @PURPOSE: Позволяет пользователю выбрать исходную и целевую БД через API. + # @PRE: Clients are initialized. # @POST: Возвращает кортеж (старая БД, новая БД) или (None, None) при отмене. # @RELATION: CALLS -> self.from_c.get_databases # @RELATION: CALLS -> self.to_c.get_databases @@ -226,74 +234,75 @@ class Migration: # @RELATION: CALLS -> self.to_c.get_database # @RELATION: CALLS -> menu def _select_databases(self) -> Tuple[Optional[Dict], Optional[Dict]]: - self.logger.info("[_select_databases][Entry] Selecting databases from both environments.") + with self.logger.belief_scope("Migration._select_databases"): + self.logger.info("[_select_databases][Entry] Selecting databases from both environments.") - if self.from_c is None or self.to_c is None: - self.logger.error("[_select_databases][Failure] Source or target client not initialized.") - msgbox("Ошибка", "Исходное или целевое окружение не выбрано.") - return None, None + if self.from_c is None or self.to_c is None: + self.logger.error("[_select_databases][Failure] Source or target client not initialized.") + msgbox("Ошибка", "Исходное или целевое окружение не выбрано.") + return None, None - # Получаем список БД из обоих окружений - try: - _, from_dbs = self.from_c.get_databases() - _, to_dbs = self.to_c.get_databases() - except Exception as e: - self.logger.error("[_select_databases][Failure] Failed to fetch databases: %s", e) - msgbox("Ошибка", "Не удалось получить список баз данных.") - return None, None - - # Формируем список для выбора - # По Swagger документации, в ответе API поле называется "database_name" - from_choices = [] - for db in from_dbs: - db_name = db.get("database_name", "Без имени") - from_choices.append((str(db["id"]), f"{db_name} (ID: {db['id']})")) + # Получаем список БД из обоих окружений + try: + _, from_dbs = self.from_c.get_databases() + _, to_dbs = self.to_c.get_databases() + except Exception as e: + self.logger.error("[_select_databases][Failure] Failed to fetch databases: %s", e) + msgbox("Ошибка", "Не удалось получить список баз данных.") + return None, None - to_choices = [] - for db in to_dbs: - db_name = db.get("database_name", "Без имени") - to_choices.append((str(db["id"]), f"{db_name} (ID: {db['id']})")) - - # Показываем список БД для исходного окружения - rc, from_sel = menu( - title="Выбор исходной БД", - prompt="Выберите исходную БД:", - choices=[f"{name}" for id, name in from_choices] - ) - if rc != 0: - return None, None - - # Определяем выбранную БД - from_db_id = from_choices[[choice[1] for choice in from_choices].index(from_sel)][0] - # Получаем полную информацию о выбранной БД из исходного окружения - try: - from_db = self.from_c.get_database(int(from_db_id)) - except Exception as e: - self.logger.error("[_select_databases][Failure] Failed to fetch database details: %s", e) - msgbox("Ошибка", "Не удалось получить информацию о выбранной базе данных.") - return None, None - - # Показываем список БД для целевого окружения - rc, to_sel = menu( - title="Выбор целевой БД", - prompt="Выберите целевую БД:", - choices=[f"{name}" for id, name in to_choices] - ) - if rc != 0: - return None, None - - # Определяем выбранную БД - to_db_id = to_choices[[choice[1] for choice in to_choices].index(to_sel)][0] - # Получаем полную информацию о выбранной БД из целевого окружения - try: - to_db = self.to_c.get_database(int(to_db_id)) - except Exception as e: - self.logger.error("[_select_databases][Failure] Failed to fetch database details: %s", e) - msgbox("Ошибка", "Не удалось получить информацию о выбранной базе данных.") - return None, None - - self.logger.info("[_select_databases][Exit] Selected databases: %s -> %s", from_db.get("database_name", "Без имени"), to_db.get("database_name", "Без имени")) - return from_db, to_db + # Формируем список для выбора + # По Swagger документации, в ответе API поле называется "database_name" + from_choices = [] + for db in from_dbs: + db_name = db.get("database_name", "Без имени") + from_choices.append((str(db["id"]), f"{db_name} (ID: {db['id']})")) + + to_choices = [] + for db in to_dbs: + db_name = db.get("database_name", "Без имени") + to_choices.append((str(db["id"]), f"{db_name} (ID: {db['id']})")) + + # Показываем список БД для исходного окружения + rc, from_sel = menu( + title="Выбор исходной БД", + prompt="Выберите исходную БД:", + choices=[f"{name}" for id, name in from_choices] + ) + if rc != 0: + return None, None + + # Определяем выбранную БД + from_db_id = from_choices[[choice[1] for choice in from_choices].index(from_sel)][0] + # Получаем полную информацию о выбранной БД из исходного окружения + try: + from_db = self.from_c.get_database(int(from_db_id)) + except Exception as e: + self.logger.error("[_select_databases][Failure] Failed to fetch database details: %s", e) + msgbox("Ошибка", "Не удалось получить информацию о выбранной базе данных.") + return None, None + + # Показываем список БД для целевого окружения + rc, to_sel = menu( + title="Выбор целевой БД", + prompt="Выберите целевую БД:", + choices=[f"{name}" for id, name in to_choices] + ) + if rc != 0: + return None, None + + # Определяем выбранную БД + to_db_id = to_choices[[choice[1] for choice in to_choices].index(to_sel)][0] + # Получаем полную информацию о выбранной БД из целевого окружения + try: + to_db = self.to_c.get_database(int(to_db_id)) + except Exception as e: + self.logger.error("[_select_databases][Failure] Failed to fetch database details: %s", e) + msgbox("Ошибка", "Не удалось получить информацию о выбранной базе данных.") + return None, None + + self.logger.info("[_select_databases][Exit] Selected databases: %s -> %s", from_db.get("database_name", "Без имени"), to_db.get("database_name", "Без имени")) + return from_db, to_db # [/DEF:_select_databases:Function] # [DEF:_batch_delete_by_ids:Function] @@ -303,23 +312,24 @@ class Migration: # @RELATION: CALLS -> self.to_c.network.request # @PARAM: ids (List[int]) - Список ID дашбордов для удаления. def _batch_delete_by_ids(self, ids: List[int]) -> None: - if not ids: - self.logger.debug("[_batch_delete_by_ids][Skip] Empty ID list – nothing to delete.") - return + with self.logger.belief_scope("Migration._batch_delete_by_ids", f"ids={ids}"): + if not ids: + self.logger.debug("[_batch_delete_by_ids][Skip] Empty ID list – nothing to delete.") + return - if self.to_c is None: - self.logger.error("[_batch_delete_by_ids][Failure] Target client not initialized.") - msgbox("Ошибка", "Целевое окружение не выбрано.") - return + if self.to_c is None: + self.logger.error("[_batch_delete_by_ids][Failure] Target client not initialized.") + msgbox("Ошибка", "Целевое окружение не выбрано.") + return - self.logger.info("[_batch_delete_by_ids][Entry] Deleting dashboards IDs: %s", ids) - q_param = json.dumps(ids) - response = self.to_c.network.request(method="DELETE", endpoint="/dashboard/", params={"q": q_param}) - - if isinstance(response, dict) and response.get("result", True) is False: - self.logger.warning("[_batch_delete_by_ids][Warning] Unexpected delete response: %s", response) - else: - self.logger.info("[_batch_delete_by_ids][Success] Delete request completed.") + self.logger.info("[_batch_delete_by_ids][Entry] Deleting dashboards IDs: %s", ids) + q_param = json.dumps(ids) + response = self.to_c.network.request(method="DELETE", endpoint="/dashboard/", params={"q": q_param}) + + if isinstance(response, dict) and response.get("result", True) is False: + self.logger.warning("[_batch_delete_by_ids][Warning] Unexpected delete response: %s", response) + else: + self.logger.info("[_batch_delete_by_ids][Success] Delete request completed.") # [/DEF:_batch_delete_by_ids:Function] # [DEF:execute_migration:Function] @@ -333,65 +343,66 @@ class Migration: # @RELATION: CALLS -> self.to_c.import_dashboard # @RELATION: CALLS -> self._batch_delete_by_ids def execute_migration(self) -> None: - if not self.dashboards_to_migrate: - self.logger.warning("[execute_migration][Skip] No dashboards to migrate.") - msgbox("Информация", "Нет дашбордов для миграции.") - return + with self.logger.belief_scope("Migration.execute_migration"): + if not self.dashboards_to_migrate: + self.logger.warning("[execute_migration][Skip] No dashboards to migrate.") + msgbox("Информация", "Нет дашбордов для миграции.") + return - if self.from_c is None or self.to_c is None: - self.logger.error("[execute_migration][Failure] Source or target client not initialized.") - msgbox("Ошибка", "Исходное или целевое окружение не выбрано.") - return + if self.from_c is None or self.to_c is None: + self.logger.error("[execute_migration][Failure] Source or target client not initialized.") + msgbox("Ошибка", "Исходное или целевое окружение не выбрано.") + return - total = len(self.dashboards_to_migrate) - self.logger.info("[execute_migration][Entry] Starting migration of %d dashboards.", total) - self.to_c.delete_before_reimport = self.enable_delete_on_failure + total = len(self.dashboards_to_migrate) + self.logger.info("[execute_migration][Entry] Starting migration of %d dashboards.", total) + self.to_c.delete_before_reimport = self.enable_delete_on_failure - with gauge("Миграция...", width=60, height=10) as g: - for i, dash in enumerate(self.dashboards_to_migrate): - dash_id, dash_slug, title = dash["id"], dash.get("slug"), dash["dashboard_title"] - g.set_text(f"Миграция: {title} ({i + 1}/{total})") - g.set_percent(int((i / total) * 100)) - exported_content = None # Initialize exported_content - try: - exported_content, _ = self.from_c.export_dashboard(dash_id) - with create_temp_file(content=exported_content, dry_run=True, suffix=".zip", logger=self.logger) as tmp_zip_path, \ - create_temp_file(suffix=".dir", logger=self.logger) as tmp_unpack_dir: + with gauge("Миграция...", width=60, height=10) as g: + for i, dash in enumerate(self.dashboards_to_migrate): + dash_id, dash_slug, title = dash["id"], dash.get("slug"), dash["dashboard_title"] + g.set_text(f"Миграция: {title} ({i + 1}/{total})") + g.set_percent(int((i / total) * 100)) + exported_content = None # Initialize exported_content + try: + exported_content, _ = self.from_c.export_dashboard(dash_id) + with create_temp_file(content=exported_content, dry_run=True, suffix=".zip", logger=self.logger) as tmp_zip_path, \ + create_temp_file(suffix=".dir", logger=self.logger) as tmp_unpack_dir: + + if not self.db_config_replacement: + self.to_c.import_dashboard(file_name=tmp_zip_path, dash_id=dash_id, dash_slug=dash_slug) + else: + with zipfile.ZipFile(tmp_zip_path, "r") as zip_ref: + zip_ref.extractall(tmp_unpack_dir) + + if self.db_config_replacement: + update_yamls(db_configs=[self.db_config_replacement], path=str(tmp_unpack_dir)) + + with create_temp_file(suffix=".zip", dry_run=True, logger=self.logger) as tmp_new_zip: + create_dashboard_export(zip_path=tmp_new_zip, source_paths=[str(p) for p in Path(tmp_unpack_dir).glob("**/*")]) + self.to_c.import_dashboard(file_name=tmp_new_zip, dash_id=dash_id, dash_slug=dash_slug) - if not self.db_config_replacement: - self.to_c.import_dashboard(file_name=tmp_zip_path, dash_id=dash_id, dash_slug=dash_slug) - else: - with zipfile.ZipFile(tmp_zip_path, "r") as zip_ref: - zip_ref.extractall(tmp_unpack_dir) - - if self.db_config_replacement: - update_yamls(db_configs=[self.db_config_replacement], path=str(tmp_unpack_dir)) - - with create_temp_file(suffix=".zip", dry_run=True, logger=self.logger) as tmp_new_zip: - create_dashboard_export(zip_path=tmp_new_zip, source_paths=[str(p) for p in Path(tmp_unpack_dir).glob("**/*")]) - self.to_c.import_dashboard(file_name=tmp_new_zip, dash_id=dash_id, dash_slug=dash_slug) - - self.logger.info("[execute_migration][Success] Dashboard %s imported.", title) - except Exception as exc: - self.logger.error("[execute_migration][Failure] %s", exc, exc_info=True) - self._failed_imports.append({"slug": dash_slug, "dash_id": dash_id, "zip_content": exported_content}) - msgbox("Ошибка", f"Не удалось мигрировать дашборд {title}.\n\n{exc}") - g.set_percent(100) + self.logger.info("[execute_migration][Success] Dashboard %s imported.", title) + except Exception as exc: + self.logger.error("[execute_migration][Failure] %s", exc, exc_info=True) + self._failed_imports.append({"slug": dash_slug, "dash_id": dash_id, "zip_content": exported_content}) + msgbox("Ошибка", f"Не удалось мигрировать дашборд {title}.\n\n{exc}") + g.set_percent(100) - if self.enable_delete_on_failure and self._failed_imports: - self.logger.info("[execute_migration][Recovery] %d dashboards failed. Starting recovery.", len(self._failed_imports)) - _, target_dashboards = self.to_c.get_dashboards() - slug_to_id = {d["slug"]: d["id"] for d in target_dashboards if "slug" in d and "id" in d} - ids_to_delete = [slug_to_id[f["slug"]] for f in self._failed_imports if f["slug"] in slug_to_id] - self._batch_delete_by_ids(ids_to_delete) + if self.enable_delete_on_failure and self._failed_imports: + self.logger.info("[execute_migration][Recovery] %d dashboards failed. Starting recovery.", len(self._failed_imports)) + _, target_dashboards = self.to_c.get_dashboards() + slug_to_id = {d["slug"]: d["id"] for d in target_dashboards if "slug" in d and "id" in d} + ids_to_delete = [slug_to_id[f["slug"]] for f in self._failed_imports if f["slug"] in slug_to_id] + self._batch_delete_by_ids(ids_to_delete) - for fail in self._failed_imports: - with create_temp_file(content=fail["zip_content"], suffix=".zip", logger=self.logger) as retry_zip: - self.to_c.import_dashboard(file_name=retry_zip, dash_id=fail["dash_id"], dash_slug=fail["slug"]) - self.logger.info("[execute_migration][Recovered] Dashboard slug '%s' re-imported.", fail["slug"]) + for fail in self._failed_imports: + with create_temp_file(content=fail["zip_content"], suffix=".zip", logger=self.logger) as retry_zip: + self.to_c.import_dashboard(file_name=retry_zip, dash_id=fail["dash_id"], dash_slug=fail["slug"]) + self.logger.info("[execute_migration][Recovered] Dashboard slug '%s' re-imported.", fail["slug"]) - self.logger.info("[execute_migration][Exit] Migration finished.") - msgbox("Информация", "Миграция завершена!") + self.logger.info("[execute_migration][Exit] Migration finished.") + msgbox("Ошибка" if self._failed_imports else "Информация", "Миграция завершена!") # [/DEF:execute_migration:Function] # [/DEF:Migration:Class] diff --git a/semantics/reports/semantic_report_20260101_162143.md b/semantics/reports/semantic_report_20260101_162143.md deleted file mode 100644 index 68d09e6..0000000 --- a/semantics/reports/semantic_report_20260101_162143.md +++ /dev/null @@ -1,81 +0,0 @@ -# Semantic Compliance Report - -**Generated At:** 2026-01-01T16:21:43.137362 -**Global Compliance Score:** 7.4% -**Scanned Files:** 68 - -## Critical Parsing Errors -- 🔴 backend/src/core/scheduler.py:98 Mismatched closing anchor. Expected [/DEF:SchedulerService._trigger_backup:Function], found [/DEF:SchedulerService:Class]. -- 🔴 backend/src/core/scheduler.py:99 Mismatched closing anchor. Expected [/DEF:SchedulerService._trigger_backup:Function], found [/DEF:SchedulerModule:Module]. - -## File Compliance Status -| File | Score | Issues | -|------|-------|--------| -| search_script.py | 🔴 0% | [search_script] Unclosed Anchor at end of file (started line 1)
[search_script] Unclosed Anchor: [DEF:search_script:Module] started at line 1
[search_datasets] Unclosed Anchor at end of file (started line 22)
[search_datasets] Unclosed Anchor: [DEF:search_datasets:Function] started at line 22
[search_datasets] Unclosed Anchor: [DEF:search_datasets:Function] started at line 22
[save_results_to_file] Unclosed Anchor at end of file (started line 81)
[save_results_to_file] Unclosed Anchor: [DEF:save_results_to_file:Function] started at line 81
[save_results_to_file] Unclosed Anchor: [DEF:save_results_to_file:Function] started at line 81
[save_results_to_file] Unclosed Anchor: [DEF:save_results_to_file:Function] started at line 81
[print_search_results] Unclosed Anchor at end of file (started line 104)
[print_search_results] Unclosed Anchor: [DEF:print_search_results:Function] started at line 104
[print_search_results] Unclosed Anchor: [DEF:print_search_results:Function] started at line 104
[print_search_results] Unclosed Anchor: [DEF:print_search_results:Function] started at line 104
[print_search_results] Unclosed Anchor: [DEF:print_search_results:Function] started at line 104
[main] Unclosed Anchor at end of file (started line 165)
[main] Unclosed Anchor: [DEF:main:Function] started at line 165
[main] Unclosed Anchor: [DEF:main:Function] started at line 165
[main] Unclosed Anchor: [DEF:main:Function] started at line 165
[main] Unclosed Anchor: [DEF:main:Function] started at line 165
[main] Unclosed Anchor: [DEF:main:Function] started at line 165 | -| get_dataset_structure.py | 🔴 0% | [get_dataset_structure] Unclosed Anchor at end of file (started line 1)
[get_dataset_structure] Unclosed Anchor: [DEF:get_dataset_structure:Module] started at line 1
[get_and_save_dataset] Unclosed Anchor at end of file (started line 18)
[get_and_save_dataset] Unclosed Anchor: [DEF:get_and_save_dataset:Function] started at line 18
[get_and_save_dataset] Unclosed Anchor: [DEF:get_and_save_dataset:Function] started at line 18 | -| debug_db_api.py | 🔴 0% | [debug_db_api] Unclosed Anchor at end of file (started line 1)
[debug_db_api] Unclosed Anchor: [DEF:debug_db_api:Module] started at line 1
[debug_database_api] Unclosed Anchor at end of file (started line 18)
[debug_database_api] Unclosed Anchor: [DEF:debug_database_api:Function] started at line 18
[debug_database_api] Unclosed Anchor: [DEF:debug_database_api:Function] started at line 18 | -| run_mapper.py | 🔴 0% | [run_mapper] Unclosed Anchor at end of file (started line 1)
[run_mapper] Unclosed Anchor: [DEF:run_mapper:Module] started at line 1
[main] Unclosed Anchor at end of file (started line 18)
[main] Unclosed Anchor: [DEF:main:Function] started at line 18
[main] Unclosed Anchor: [DEF:main:Function] started at line 18 | -| migration_script.py | 🔴 0% | [migration_script] Unclosed Anchor at end of file (started line 1)
[migration_script] Unclosed Anchor: [DEF:migration_script:Module] started at line 1
[Migration] Unclosed Anchor at end of file (started line 25)
[Migration] Unclosed Anchor: [DEF:Migration:Class] started at line 25
[Migration] Unclosed Anchor: [DEF:Migration:Class] started at line 25
[Migration.__init__] Unclosed Anchor at end of file (started line 33)
[Migration.__init__] Unclosed Anchor: [DEF:Migration.__init__:Function] started at line 33
[Migration.__init__] Unclosed Anchor: [DEF:Migration.__init__:Function] started at line 33
[Migration.__init__] Unclosed Anchor: [DEF:Migration.__init__:Function] started at line 33
[Migration.run] Unclosed Anchor at end of file (started line 52)
[Migration.run] Unclosed Anchor: [DEF:Migration.run:Function] started at line 52
[Migration.run] Unclosed Anchor: [DEF:Migration.run:Function] started at line 52
[Migration.run] Unclosed Anchor: [DEF:Migration.run:Function] started at line 52
[Migration.run] Unclosed Anchor: [DEF:Migration.run:Function] started at line 52
[Migration.ask_delete_on_failure] Unclosed Anchor at end of file (started line 71)
[Migration.ask_delete_on_failure] Unclosed Anchor: [DEF:Migration.ask_delete_on_failure:Function] started at line 71
[Migration.ask_delete_on_failure] Unclosed Anchor: [DEF:Migration.ask_delete_on_failure:Function] started at line 71
[Migration.ask_delete_on_failure] Unclosed Anchor: [DEF:Migration.ask_delete_on_failure:Function] started at line 71
[Migration.ask_delete_on_failure] Unclosed Anchor: [DEF:Migration.ask_delete_on_failure:Function] started at line 71
[Migration.ask_delete_on_failure] Unclosed Anchor: [DEF:Migration.ask_delete_on_failure:Function] started at line 71
[Migration.select_environments] Unclosed Anchor at end of file (started line 86)
[Migration.select_environments] Unclosed Anchor: [DEF:Migration.select_environments:Function] started at line 86
[Migration.select_environments] Unclosed Anchor: [DEF:Migration.select_environments:Function] started at line 86
[Migration.select_environments] Unclosed Anchor: [DEF:Migration.select_environments:Function] started at line 86
[Migration.select_environments] Unclosed Anchor: [DEF:Migration.select_environments:Function] started at line 86
[Migration.select_environments] Unclosed Anchor: [DEF:Migration.select_environments:Function] started at line 86
[Migration.select_environments] Unclosed Anchor: [DEF:Migration.select_environments:Function] started at line 86
[Migration.select_dashboards] Unclosed Anchor at end of file (started line 127)
[Migration.select_dashboards] Unclosed Anchor: [DEF:Migration.select_dashboards:Function] started at line 127
[Migration.select_dashboards] Unclosed Anchor: [DEF:Migration.select_dashboards:Function] started at line 127
[Migration.select_dashboards] Unclosed Anchor: [DEF:Migration.select_dashboards:Function] started at line 127
[Migration.select_dashboards] Unclosed Anchor: [DEF:Migration.select_dashboards:Function] started at line 127
[Migration.select_dashboards] Unclosed Anchor: [DEF:Migration.select_dashboards:Function] started at line 127
[Migration.select_dashboards] Unclosed Anchor: [DEF:Migration.select_dashboards:Function] started at line 127
[Migration.select_dashboards] Unclosed Anchor: [DEF:Migration.select_dashboards:Function] started at line 127
[Migration.confirm_db_config_replacement] Unclosed Anchor at end of file (started line 184)
[Migration.confirm_db_config_replacement] Unclosed Anchor: [DEF:Migration.confirm_db_config_replacement:Function] started at line 184
[Migration.confirm_db_config_replacement] Unclosed Anchor: [DEF:Migration.confirm_db_config_replacement:Function] started at line 184
[Migration.confirm_db_config_replacement] Unclosed Anchor: [DEF:Migration.confirm_db_config_replacement:Function] started at line 184
[Migration.confirm_db_config_replacement] Unclosed Anchor: [DEF:Migration.confirm_db_config_replacement:Function] started at line 184
[Migration.confirm_db_config_replacement] Unclosed Anchor: [DEF:Migration.confirm_db_config_replacement:Function] started at line 184
[Migration.confirm_db_config_replacement] Unclosed Anchor: [DEF:Migration.confirm_db_config_replacement:Function] started at line 184
[Migration.confirm_db_config_replacement] Unclosed Anchor: [DEF:Migration.confirm_db_config_replacement:Function] started at line 184
[Migration.confirm_db_config_replacement] Unclosed Anchor: [DEF:Migration.confirm_db_config_replacement:Function] started at line 184
[Migration._select_databases] Unclosed Anchor at end of file (started line 219)
[Migration._select_databases] Unclosed Anchor: [DEF:Migration._select_databases:Function] started at line 219
[Migration._select_databases] Unclosed Anchor: [DEF:Migration._select_databases:Function] started at line 219
[Migration._select_databases] Unclosed Anchor: [DEF:Migration._select_databases:Function] started at line 219
[Migration._select_databases] Unclosed Anchor: [DEF:Migration._select_databases:Function] started at line 219
[Migration._select_databases] Unclosed Anchor: [DEF:Migration._select_databases:Function] started at line 219
[Migration._select_databases] Unclosed Anchor: [DEF:Migration._select_databases:Function] started at line 219
[Migration._select_databases] Unclosed Anchor: [DEF:Migration._select_databases:Function] started at line 219
[Migration._select_databases] Unclosed Anchor: [DEF:Migration._select_databases:Function] started at line 219
[Migration._select_databases] Unclosed Anchor: [DEF:Migration._select_databases:Function] started at line 219
[Migration._batch_delete_by_ids] Unclosed Anchor at end of file (started line 298)
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration.execute_migration] Unclosed Anchor at end of file (started line 324)
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324 | -| backup_script.py | 🔴 0% | [backup_script] Unclosed Anchor at end of file (started line 1)
[backup_script] Unclosed Anchor: [DEF:backup_script:Module] started at line 1
[BackupConfig] Unclosed Anchor at end of file (started line 30)
[BackupConfig] Unclosed Anchor: [DEF:BackupConfig:DataClass] started at line 30
[BackupConfig] Unclosed Anchor: [DEF:BackupConfig:DataClass] started at line 30
[backup_dashboards] Unclosed Anchor at end of file (started line 41)
[backup_dashboards] Unclosed Anchor: [DEF:backup_dashboards:Function] started at line 41
[backup_dashboards] Unclosed Anchor: [DEF:backup_dashboards:Function] started at line 41
[backup_dashboards] Unclosed Anchor: [DEF:backup_dashboards:Function] started at line 41
[main] Unclosed Anchor at end of file (started line 116)
[main] Unclosed Anchor: [DEF:main:Function] started at line 116
[main] Unclosed Anchor: [DEF:main:Function] started at line 116
[main] Unclosed Anchor: [DEF:main:Function] started at line 116
[main] Unclosed Anchor: [DEF:main:Function] started at line 116 | -| superset_tool/exceptions.py | 🔴 0% | [superset_tool.exceptions] Unclosed Anchor at end of file (started line 1)
[superset_tool.exceptions] Unclosed Anchor: [DEF:superset_tool.exceptions:Module] started at line 1
[SupersetToolError] Unclosed Anchor at end of file (started line 11)
[SupersetToolError] Unclosed Anchor: [DEF:SupersetToolError:Class] started at line 11
[SupersetToolError] Unclosed Anchor: [DEF:SupersetToolError:Class] started at line 11
[AuthenticationError] Unclosed Anchor at end of file (started line 22)
[AuthenticationError] Unclosed Anchor: [DEF:AuthenticationError:Class] started at line 22
[AuthenticationError] Unclosed Anchor: [DEF:AuthenticationError:Class] started at line 22
[AuthenticationError] Unclosed Anchor: [DEF:AuthenticationError:Class] started at line 22
[PermissionDeniedError] Unclosed Anchor at end of file (started line 32)
[PermissionDeniedError] Unclosed Anchor: [DEF:PermissionDeniedError:Class] started at line 32
[PermissionDeniedError] Unclosed Anchor: [DEF:PermissionDeniedError:Class] started at line 32
[PermissionDeniedError] Unclosed Anchor: [DEF:PermissionDeniedError:Class] started at line 32
[PermissionDeniedError] Unclosed Anchor: [DEF:PermissionDeniedError:Class] started at line 32
[SupersetAPIError] Unclosed Anchor at end of file (started line 44)
[SupersetAPIError] Unclosed Anchor: [DEF:SupersetAPIError:Class] started at line 44
[SupersetAPIError] Unclosed Anchor: [DEF:SupersetAPIError:Class] started at line 44
[SupersetAPIError] Unclosed Anchor: [DEF:SupersetAPIError:Class] started at line 44
[SupersetAPIError] Unclosed Anchor: [DEF:SupersetAPIError:Class] started at line 44
[SupersetAPIError] Unclosed Anchor: [DEF:SupersetAPIError:Class] started at line 44
[ExportError] Unclosed Anchor at end of file (started line 54)
[ExportError] Unclosed Anchor: [DEF:ExportError:Class] started at line 54
[ExportError] Unclosed Anchor: [DEF:ExportError:Class] started at line 54
[ExportError] Unclosed Anchor: [DEF:ExportError:Class] started at line 54
[ExportError] Unclosed Anchor: [DEF:ExportError:Class] started at line 54
[ExportError] Unclosed Anchor: [DEF:ExportError:Class] started at line 54
[ExportError] Unclosed Anchor: [DEF:ExportError:Class] started at line 54
[DashboardNotFoundError] Unclosed Anchor at end of file (started line 64)
[DashboardNotFoundError] Unclosed Anchor: [DEF:DashboardNotFoundError:Class] started at line 64
[DashboardNotFoundError] Unclosed Anchor: [DEF:DashboardNotFoundError:Class] started at line 64
[DashboardNotFoundError] Unclosed Anchor: [DEF:DashboardNotFoundError:Class] started at line 64
[DashboardNotFoundError] Unclosed Anchor: [DEF:DashboardNotFoundError:Class] started at line 64
[DashboardNotFoundError] Unclosed Anchor: [DEF:DashboardNotFoundError:Class] started at line 64
[DashboardNotFoundError] Unclosed Anchor: [DEF:DashboardNotFoundError:Class] started at line 64
[DashboardNotFoundError] Unclosed Anchor: [DEF:DashboardNotFoundError:Class] started at line 64
[DatasetNotFoundError] Unclosed Anchor at end of file (started line 75)
[DatasetNotFoundError] Unclosed Anchor: [DEF:DatasetNotFoundError:Class] started at line 75
[DatasetNotFoundError] Unclosed Anchor: [DEF:DatasetNotFoundError:Class] started at line 75
[DatasetNotFoundError] Unclosed Anchor: [DEF:DatasetNotFoundError:Class] started at line 75
[DatasetNotFoundError] Unclosed Anchor: [DEF:DatasetNotFoundError:Class] started at line 75
[DatasetNotFoundError] Unclosed Anchor: [DEF:DatasetNotFoundError:Class] started at line 75
[DatasetNotFoundError] Unclosed Anchor: [DEF:DatasetNotFoundError:Class] started at line 75
[DatasetNotFoundError] Unclosed Anchor: [DEF:DatasetNotFoundError:Class] started at line 75
[DatasetNotFoundError] Unclosed Anchor: [DEF:DatasetNotFoundError:Class] started at line 75
[InvalidZipFormatError] Unclosed Anchor at end of file (started line 86)
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 86
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 86
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 86
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 86
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 86
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 86
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 86
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 86
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 86
[NetworkError] Unclosed Anchor at end of file (started line 97)
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[FileOperationError] Unclosed Anchor at end of file (started line 107)
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[InvalidFileStructureError] Unclosed Anchor at end of file (started line 114)
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[ConfigurationError] Unclosed Anchor at end of file (started line 121)
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121 | -| superset_tool/__init__.py | 🔴 0% | [superset_tool] Unclosed Anchor at end of file (started line 1)
[superset_tool] Unclosed Anchor: [DEF:superset_tool:Module] started at line 1 | -| superset_tool/client.py | 🔴 0% | [superset_tool.client] Unclosed Anchor at end of file (started line 1)
[superset_tool.client] Unclosed Anchor: [DEF:superset_tool.client:Module] started at line 1
[SupersetClient] Unclosed Anchor at end of file (started line 27)
[SupersetClient] Unclosed Anchor: [DEF:SupersetClient:Class] started at line 27
[SupersetClient] Unclosed Anchor: [DEF:SupersetClient:Class] started at line 27
[SupersetClient.__init__] Unclosed Anchor at end of file (started line 32)
[SupersetClient.__init__] Unclosed Anchor: [DEF:SupersetClient.__init__:Function] started at line 32
[SupersetClient.__init__] Unclosed Anchor: [DEF:SupersetClient.__init__:Function] started at line 32
[SupersetClient.__init__] Unclosed Anchor: [DEF:SupersetClient.__init__:Function] started at line 32
[SupersetClient._validate_config] Unclosed Anchor at end of file (started line 53)
[SupersetClient._validate_config] Unclosed Anchor: [DEF:SupersetClient._validate_config:Function] started at line 53
[SupersetClient._validate_config] Unclosed Anchor: [DEF:SupersetClient._validate_config:Function] started at line 53
[SupersetClient._validate_config] Unclosed Anchor: [DEF:SupersetClient._validate_config:Function] started at line 53
[SupersetClient._validate_config] Unclosed Anchor: [DEF:SupersetClient._validate_config:Function] started at line 53
[SupersetClient.headers] Unclosed Anchor at end of file (started line 67)
[SupersetClient.headers] Unclosed Anchor: [DEF:SupersetClient.headers:Function] started at line 67
[SupersetClient.headers] Unclosed Anchor: [DEF:SupersetClient.headers:Function] started at line 67
[SupersetClient.headers] Unclosed Anchor: [DEF:SupersetClient.headers:Function] started at line 67
[SupersetClient.headers] Unclosed Anchor: [DEF:SupersetClient.headers:Function] started at line 67
[SupersetClient.headers] Unclosed Anchor: [DEF:SupersetClient.headers:Function] started at line 67
[SupersetClient.get_dashboards] Unclosed Anchor at end of file (started line 74)
[SupersetClient.get_dashboards] Unclosed Anchor: [DEF:SupersetClient.get_dashboards:Function] started at line 74
[SupersetClient.get_dashboards] Unclosed Anchor: [DEF:SupersetClient.get_dashboards:Function] started at line 74
[SupersetClient.get_dashboards] Unclosed Anchor: [DEF:SupersetClient.get_dashboards:Function] started at line 74
[SupersetClient.get_dashboards] Unclosed Anchor: [DEF:SupersetClient.get_dashboards:Function] started at line 74
[SupersetClient.get_dashboards] Unclosed Anchor: [DEF:SupersetClient.get_dashboards:Function] started at line 74
[SupersetClient.get_dashboards] Unclosed Anchor: [DEF:SupersetClient.get_dashboards:Function] started at line 74
[SupersetClient.export_dashboard] Unclosed Anchor at end of file (started line 98)
[SupersetClient.export_dashboard] Unclosed Anchor: [DEF:SupersetClient.export_dashboard:Function] started at line 98
[SupersetClient.export_dashboard] Unclosed Anchor: [DEF:SupersetClient.export_dashboard:Function] started at line 98
[SupersetClient.export_dashboard] Unclosed Anchor: [DEF:SupersetClient.export_dashboard:Function] started at line 98
[SupersetClient.export_dashboard] Unclosed Anchor: [DEF:SupersetClient.export_dashboard:Function] started at line 98
[SupersetClient.export_dashboard] Unclosed Anchor: [DEF:SupersetClient.export_dashboard:Function] started at line 98
[SupersetClient.export_dashboard] Unclosed Anchor: [DEF:SupersetClient.export_dashboard:Function] started at line 98
[SupersetClient.export_dashboard] Unclosed Anchor: [DEF:SupersetClient.export_dashboard:Function] started at line 98
[SupersetClient.import_dashboard] Unclosed Anchor at end of file (started line 123)
[SupersetClient.import_dashboard] Unclosed Anchor: [DEF:SupersetClient.import_dashboard:Function] started at line 123
[SupersetClient.import_dashboard] Unclosed Anchor: [DEF:SupersetClient.import_dashboard:Function] started at line 123
[SupersetClient.import_dashboard] Unclosed Anchor: [DEF:SupersetClient.import_dashboard:Function] started at line 123
[SupersetClient.import_dashboard] Unclosed Anchor: [DEF:SupersetClient.import_dashboard:Function] started at line 123
[SupersetClient.import_dashboard] Unclosed Anchor: [DEF:SupersetClient.import_dashboard:Function] started at line 123
[SupersetClient.import_dashboard] Unclosed Anchor: [DEF:SupersetClient.import_dashboard:Function] started at line 123
[SupersetClient.import_dashboard] Unclosed Anchor: [DEF:SupersetClient.import_dashboard:Function] started at line 123
[SupersetClient.import_dashboard] Unclosed Anchor: [DEF:SupersetClient.import_dashboard:Function] started at line 123
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor at end of file (started line 157)
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor: [DEF:SupersetClient._resolve_target_id_for_delete:Function] started at line 157
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor: [DEF:SupersetClient._resolve_target_id_for_delete:Function] started at line 157
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor: [DEF:SupersetClient._resolve_target_id_for_delete:Function] started at line 157
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor: [DEF:SupersetClient._resolve_target_id_for_delete:Function] started at line 157
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor: [DEF:SupersetClient._resolve_target_id_for_delete:Function] started at line 157
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor: [DEF:SupersetClient._resolve_target_id_for_delete:Function] started at line 157
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor: [DEF:SupersetClient._resolve_target_id_for_delete:Function] started at line 157
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor: [DEF:SupersetClient._resolve_target_id_for_delete:Function] started at line 157
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor: [DEF:SupersetClient._resolve_target_id_for_delete:Function] started at line 157
[SupersetClient._do_import] Unclosed Anchor at end of file (started line 182)
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient.delete_dashboard] Unclosed Anchor at end of file (started line 205)
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor at end of file (started line 223)
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor at end of file (started line 246)
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._validate_export_response] Unclosed Anchor at end of file (started line 269)
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._resolve_export_filename] Unclosed Anchor at end of file (started line 285)
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._validate_query_params] Unclosed Anchor at end of file (started line 303)
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._fetch_total_object_count] Unclosed Anchor at end of file (started line 315)
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_all_pages] Unclosed Anchor at end of file (started line 331)
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._validate_import_file] Unclosed Anchor at end of file (started line 345)
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient.get_datasets] Unclosed Anchor at end of file (started line 361)
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_databases] Unclosed Anchor at end of file (started line 384)
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_dataset] Unclosed Anchor at end of file (started line 408)
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_database] Unclosed Anchor at end of file (started line 425)
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.update_dataset] Unclosed Anchor at end of file (started line 442)
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442 | -| superset_tool/models.py | 🔴 0% | [superset_tool.models] Unclosed Anchor at end of file (started line 1)
[superset_tool.models] Unclosed Anchor: [DEF:superset_tool.models:Module] started at line 1
[SupersetConfig] Unclosed Anchor at end of file (started line 17)
[SupersetConfig] Unclosed Anchor: [DEF:SupersetConfig:Class] started at line 17
[SupersetConfig] Unclosed Anchor: [DEF:SupersetConfig:Class] started at line 17
[SupersetConfig.validate_auth] Unclosed Anchor at end of file (started line 28)
[SupersetConfig.validate_auth] Unclosed Anchor: [DEF:SupersetConfig.validate_auth:Function] started at line 28
[SupersetConfig.validate_auth] Unclosed Anchor: [DEF:SupersetConfig.validate_auth:Function] started at line 28
[SupersetConfig.validate_auth] Unclosed Anchor: [DEF:SupersetConfig.validate_auth:Function] started at line 28
[SupersetConfig.normalize_base_url] Unclosed Anchor at end of file (started line 42)
[SupersetConfig.normalize_base_url] Unclosed Anchor: [DEF:SupersetConfig.normalize_base_url:Function] started at line 42
[SupersetConfig.normalize_base_url] Unclosed Anchor: [DEF:SupersetConfig.normalize_base_url:Function] started at line 42
[SupersetConfig.normalize_base_url] Unclosed Anchor: [DEF:SupersetConfig.normalize_base_url:Function] started at line 42
[SupersetConfig.normalize_base_url] Unclosed Anchor: [DEF:SupersetConfig.normalize_base_url:Function] started at line 42
[DatabaseConfig] Unclosed Anchor at end of file (started line 63)
[DatabaseConfig] Unclosed Anchor: [DEF:DatabaseConfig:Class] started at line 63
[DatabaseConfig] Unclosed Anchor: [DEF:DatabaseConfig:Class] started at line 63
[DatabaseConfig] Unclosed Anchor: [DEF:DatabaseConfig:Class] started at line 63
[DatabaseConfig] Unclosed Anchor: [DEF:DatabaseConfig:Class] started at line 63
[DatabaseConfig] Unclosed Anchor: [DEF:DatabaseConfig:Class] started at line 63
[DatabaseConfig.validate_config] Unclosed Anchor at end of file (started line 70)
[DatabaseConfig.validate_config] Unclosed Anchor: [DEF:DatabaseConfig.validate_config:Function] started at line 70
[DatabaseConfig.validate_config] Unclosed Anchor: [DEF:DatabaseConfig.validate_config:Function] started at line 70
[DatabaseConfig.validate_config] Unclosed Anchor: [DEF:DatabaseConfig.validate_config:Function] started at line 70
[DatabaseConfig.validate_config] Unclosed Anchor: [DEF:DatabaseConfig.validate_config:Function] started at line 70
[DatabaseConfig.validate_config] Unclosed Anchor: [DEF:DatabaseConfig.validate_config:Function] started at line 70
[DatabaseConfig.validate_config] Unclosed Anchor: [DEF:DatabaseConfig.validate_config:Function] started at line 70 | -| superset_tool/utils/logger.py | 🔴 0% | [superset_tool.utils.logger] Unclosed Anchor at end of file (started line 1)
[superset_tool.utils.logger] Unclosed Anchor: [DEF:superset_tool.utils.logger:Module] started at line 1
[SupersetLogger] Unclosed Anchor at end of file (started line 19)
[SupersetLogger] Unclosed Anchor: [DEF:SupersetLogger:Class] started at line 19
[SupersetLogger] Unclosed Anchor: [DEF:SupersetLogger:Class] started at line 19
[SupersetLogger.__init__] Unclosed Anchor at end of file (started line 23)
[SupersetLogger.__init__] Unclosed Anchor: [DEF:SupersetLogger.__init__:Function] started at line 23
[SupersetLogger.__init__] Unclosed Anchor: [DEF:SupersetLogger.__init__:Function] started at line 23
[SupersetLogger.__init__] Unclosed Anchor: [DEF:SupersetLogger.__init__:Function] started at line 23
[SupersetLogger._log] Unclosed Anchor at end of file (started line 58)
[SupersetLogger._log] Unclosed Anchor: [DEF:SupersetLogger._log:Function] started at line 58
[SupersetLogger._log] Unclosed Anchor: [DEF:SupersetLogger._log:Function] started at line 58
[SupersetLogger._log] Unclosed Anchor: [DEF:SupersetLogger._log:Function] started at line 58
[SupersetLogger._log] Unclosed Anchor: [DEF:SupersetLogger._log:Function] started at line 58
[SupersetLogger.info] Unclosed Anchor at end of file (started line 69)
[SupersetLogger.info] Unclosed Anchor: [DEF:SupersetLogger.info:Function] started at line 69
[SupersetLogger.info] Unclosed Anchor: [DEF:SupersetLogger.info:Function] started at line 69
[SupersetLogger.info] Unclosed Anchor: [DEF:SupersetLogger.info:Function] started at line 69
[SupersetLogger.info] Unclosed Anchor: [DEF:SupersetLogger.info:Function] started at line 69
[SupersetLogger.info] Unclosed Anchor: [DEF:SupersetLogger.info:Function] started at line 69
[SupersetLogger.debug] Unclosed Anchor at end of file (started line 75)
[SupersetLogger.debug] Unclosed Anchor: [DEF:SupersetLogger.debug:Function] started at line 75
[SupersetLogger.debug] Unclosed Anchor: [DEF:SupersetLogger.debug:Function] started at line 75
[SupersetLogger.debug] Unclosed Anchor: [DEF:SupersetLogger.debug:Function] started at line 75
[SupersetLogger.debug] Unclosed Anchor: [DEF:SupersetLogger.debug:Function] started at line 75
[SupersetLogger.debug] Unclosed Anchor: [DEF:SupersetLogger.debug:Function] started at line 75
[SupersetLogger.debug] Unclosed Anchor: [DEF:SupersetLogger.debug:Function] started at line 75
[SupersetLogger.warning] Unclosed Anchor at end of file (started line 81)
[SupersetLogger.warning] Unclosed Anchor: [DEF:SupersetLogger.warning:Function] started at line 81
[SupersetLogger.warning] Unclosed Anchor: [DEF:SupersetLogger.warning:Function] started at line 81
[SupersetLogger.warning] Unclosed Anchor: [DEF:SupersetLogger.warning:Function] started at line 81
[SupersetLogger.warning] Unclosed Anchor: [DEF:SupersetLogger.warning:Function] started at line 81
[SupersetLogger.warning] Unclosed Anchor: [DEF:SupersetLogger.warning:Function] started at line 81
[SupersetLogger.warning] Unclosed Anchor: [DEF:SupersetLogger.warning:Function] started at line 81
[SupersetLogger.warning] Unclosed Anchor: [DEF:SupersetLogger.warning:Function] started at line 81
[SupersetLogger.error] Unclosed Anchor at end of file (started line 87)
[SupersetLogger.error] Unclosed Anchor: [DEF:SupersetLogger.error:Function] started at line 87
[SupersetLogger.error] Unclosed Anchor: [DEF:SupersetLogger.error:Function] started at line 87
[SupersetLogger.error] Unclosed Anchor: [DEF:SupersetLogger.error:Function] started at line 87
[SupersetLogger.error] Unclosed Anchor: [DEF:SupersetLogger.error:Function] started at line 87
[SupersetLogger.error] Unclosed Anchor: [DEF:SupersetLogger.error:Function] started at line 87
[SupersetLogger.error] Unclosed Anchor: [DEF:SupersetLogger.error:Function] started at line 87
[SupersetLogger.error] Unclosed Anchor: [DEF:SupersetLogger.error:Function] started at line 87
[SupersetLogger.error] Unclosed Anchor: [DEF:SupersetLogger.error:Function] started at line 87
[SupersetLogger.critical] Unclosed Anchor at end of file (started line 93)
[SupersetLogger.critical] Unclosed Anchor: [DEF:SupersetLogger.critical:Function] started at line 93
[SupersetLogger.critical] Unclosed Anchor: [DEF:SupersetLogger.critical:Function] started at line 93
[SupersetLogger.critical] Unclosed Anchor: [DEF:SupersetLogger.critical:Function] started at line 93
[SupersetLogger.critical] Unclosed Anchor: [DEF:SupersetLogger.critical:Function] started at line 93
[SupersetLogger.critical] Unclosed Anchor: [DEF:SupersetLogger.critical:Function] started at line 93
[SupersetLogger.critical] Unclosed Anchor: [DEF:SupersetLogger.critical:Function] started at line 93
[SupersetLogger.critical] Unclosed Anchor: [DEF:SupersetLogger.critical:Function] started at line 93
[SupersetLogger.critical] Unclosed Anchor: [DEF:SupersetLogger.critical:Function] started at line 93
[SupersetLogger.critical] Unclosed Anchor: [DEF:SupersetLogger.critical:Function] started at line 93
[SupersetLogger.exception] Unclosed Anchor at end of file (started line 99)
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99 | -| superset_tool/utils/network.py | 🔴 0% | [superset_tool.utils.network] Unclosed Anchor at end of file (started line 1)
[superset_tool.utils.network] Unclosed Anchor: [DEF:superset_tool.utils.network:Module] started at line 1
[APIClient] Unclosed Anchor at end of file (started line 24)
[APIClient] Unclosed Anchor: [DEF:APIClient:Class] started at line 24
[APIClient] Unclosed Anchor: [DEF:APIClient:Class] started at line 24
[APIClient.__init__] Unclosed Anchor at end of file (started line 29)
[APIClient.__init__] Unclosed Anchor: [DEF:APIClient.__init__:Function] started at line 29
[APIClient.__init__] Unclosed Anchor: [DEF:APIClient.__init__:Function] started at line 29
[APIClient.__init__] Unclosed Anchor: [DEF:APIClient.__init__:Function] started at line 29
[APIClient._init_session] Unclosed Anchor at end of file (started line 47)
[APIClient._init_session] Unclosed Anchor: [DEF:APIClient._init_session:Function] started at line 47
[APIClient._init_session] Unclosed Anchor: [DEF:APIClient._init_session:Function] started at line 47
[APIClient._init_session] Unclosed Anchor: [DEF:APIClient._init_session:Function] started at line 47
[APIClient._init_session] Unclosed Anchor: [DEF:APIClient._init_session:Function] started at line 47
[APIClient.authenticate] Unclosed Anchor at end of file (started line 63)
[APIClient.authenticate] Unclosed Anchor: [DEF:APIClient.authenticate:Function] started at line 63
[APIClient.authenticate] Unclosed Anchor: [DEF:APIClient.authenticate:Function] started at line 63
[APIClient.authenticate] Unclosed Anchor: [DEF:APIClient.authenticate:Function] started at line 63
[APIClient.authenticate] Unclosed Anchor: [DEF:APIClient.authenticate:Function] started at line 63
[APIClient.authenticate] Unclosed Anchor: [DEF:APIClient.authenticate:Function] started at line 63
[APIClient.headers] Unclosed Anchor at end of file (started line 92)
[APIClient.headers] Unclosed Anchor: [DEF:APIClient.headers:Function] started at line 92
[APIClient.headers] Unclosed Anchor: [DEF:APIClient.headers:Function] started at line 92
[APIClient.headers] Unclosed Anchor: [DEF:APIClient.headers:Function] started at line 92
[APIClient.headers] Unclosed Anchor: [DEF:APIClient.headers:Function] started at line 92
[APIClient.headers] Unclosed Anchor: [DEF:APIClient.headers:Function] started at line 92
[APIClient.headers] Unclosed Anchor: [DEF:APIClient.headers:Function] started at line 92
[APIClient.request] Unclosed Anchor at end of file (started line 103)
[APIClient.request] Unclosed Anchor: [DEF:APIClient.request:Function] started at line 103
[APIClient.request] Unclosed Anchor: [DEF:APIClient.request:Function] started at line 103
[APIClient.request] Unclosed Anchor: [DEF:APIClient.request:Function] started at line 103
[APIClient.request] Unclosed Anchor: [DEF:APIClient.request:Function] started at line 103
[APIClient.request] Unclosed Anchor: [DEF:APIClient.request:Function] started at line 103
[APIClient.request] Unclosed Anchor: [DEF:APIClient.request:Function] started at line 103
[APIClient.request] Unclosed Anchor: [DEF:APIClient.request:Function] started at line 103
[APIClient._handle_http_error] Unclosed Anchor at end of file (started line 126)
[APIClient._handle_http_error] Unclosed Anchor: [DEF:APIClient._handle_http_error:Function] started at line 126
[APIClient._handle_http_error] Unclosed Anchor: [DEF:APIClient._handle_http_error:Function] started at line 126
[APIClient._handle_http_error] Unclosed Anchor: [DEF:APIClient._handle_http_error:Function] started at line 126
[APIClient._handle_http_error] Unclosed Anchor: [DEF:APIClient._handle_http_error:Function] started at line 126
[APIClient._handle_http_error] Unclosed Anchor: [DEF:APIClient._handle_http_error:Function] started at line 126
[APIClient._handle_http_error] Unclosed Anchor: [DEF:APIClient._handle_http_error:Function] started at line 126
[APIClient._handle_http_error] Unclosed Anchor: [DEF:APIClient._handle_http_error:Function] started at line 126
[APIClient._handle_http_error] Unclosed Anchor: [DEF:APIClient._handle_http_error:Function] started at line 126
[APIClient._handle_network_error] Unclosed Anchor at end of file (started line 138)
[APIClient._handle_network_error] Unclosed Anchor: [DEF:APIClient._handle_network_error:Function] started at line 138
[APIClient._handle_network_error] Unclosed Anchor: [DEF:APIClient._handle_network_error:Function] started at line 138
[APIClient._handle_network_error] Unclosed Anchor: [DEF:APIClient._handle_network_error:Function] started at line 138
[APIClient._handle_network_error] Unclosed Anchor: [DEF:APIClient._handle_network_error:Function] started at line 138
[APIClient._handle_network_error] Unclosed Anchor: [DEF:APIClient._handle_network_error:Function] started at line 138
[APIClient._handle_network_error] Unclosed Anchor: [DEF:APIClient._handle_network_error:Function] started at line 138
[APIClient._handle_network_error] Unclosed Anchor: [DEF:APIClient._handle_network_error:Function] started at line 138
[APIClient._handle_network_error] Unclosed Anchor: [DEF:APIClient._handle_network_error:Function] started at line 138
[APIClient._handle_network_error] Unclosed Anchor: [DEF:APIClient._handle_network_error:Function] started at line 138
[APIClient.upload_file] Unclosed Anchor at end of file (started line 149)
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient._perform_upload] Unclosed Anchor at end of file (started line 175)
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient.fetch_paginated_count] Unclosed Anchor at end of file (started line 201)
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_data] Unclosed Anchor at end of file (started line 212)
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212 | -| superset_tool/utils/whiptail_fallback.py | 🔴 0% | [superset_tool.utils.whiptail_fallback] Unclosed Anchor at end of file (started line 1)
[superset_tool.utils.whiptail_fallback] Unclosed Anchor: [DEF:superset_tool.utils.whiptail_fallback:Module] started at line 1
[menu] Unclosed Anchor at end of file (started line 13)
[menu] Unclosed Anchor: [DEF:menu:Function] started at line 13
[menu] Unclosed Anchor: [DEF:menu:Function] started at line 13
[checklist] Unclosed Anchor at end of file (started line 31)
[checklist] Unclosed Anchor: [DEF:checklist:Function] started at line 31
[checklist] Unclosed Anchor: [DEF:checklist:Function] started at line 31
[checklist] Unclosed Anchor: [DEF:checklist:Function] started at line 31
[yesno] Unclosed Anchor at end of file (started line 51)
[yesno] Unclosed Anchor: [DEF:yesno:Function] started at line 51
[yesno] Unclosed Anchor: [DEF:yesno:Function] started at line 51
[yesno] Unclosed Anchor: [DEF:yesno:Function] started at line 51
[yesno] Unclosed Anchor: [DEF:yesno:Function] started at line 51
[msgbox] Unclosed Anchor at end of file (started line 61)
[msgbox] Unclosed Anchor: [DEF:msgbox:Function] started at line 61
[msgbox] Unclosed Anchor: [DEF:msgbox:Function] started at line 61
[msgbox] Unclosed Anchor: [DEF:msgbox:Function] started at line 61
[msgbox] Unclosed Anchor: [DEF:msgbox:Function] started at line 61
[msgbox] Unclosed Anchor: [DEF:msgbox:Function] started at line 61
[inputbox] Unclosed Anchor at end of file (started line 69)
[inputbox] Unclosed Anchor: [DEF:inputbox:Function] started at line 69
[inputbox] Unclosed Anchor: [DEF:inputbox:Function] started at line 69
[inputbox] Unclosed Anchor: [DEF:inputbox:Function] started at line 69
[inputbox] Unclosed Anchor: [DEF:inputbox:Function] started at line 69
[inputbox] Unclosed Anchor: [DEF:inputbox:Function] started at line 69
[inputbox] Unclosed Anchor: [DEF:inputbox:Function] started at line 69
[_ConsoleGauge] Unclosed Anchor at end of file (started line 80)
[_ConsoleGauge] Unclosed Anchor: [DEF:_ConsoleGauge:Class] started at line 80
[_ConsoleGauge] Unclosed Anchor: [DEF:_ConsoleGauge:Class] started at line 80
[_ConsoleGauge] Unclosed Anchor: [DEF:_ConsoleGauge:Class] started at line 80
[_ConsoleGauge] Unclosed Anchor: [DEF:_ConsoleGauge:Class] started at line 80
[_ConsoleGauge] Unclosed Anchor: [DEF:_ConsoleGauge:Class] started at line 80
[_ConsoleGauge] Unclosed Anchor: [DEF:_ConsoleGauge:Class] started at line 80
[_ConsoleGauge] Unclosed Anchor: [DEF:_ConsoleGauge:Class] started at line 80
[gauge] Unclosed Anchor at end of file (started line 96)
[gauge] Unclosed Anchor: [DEF:gauge:Function] started at line 96
[gauge] Unclosed Anchor: [DEF:gauge:Function] started at line 96
[gauge] Unclosed Anchor: [DEF:gauge:Function] started at line 96
[gauge] Unclosed Anchor: [DEF:gauge:Function] started at line 96
[gauge] Unclosed Anchor: [DEF:gauge:Function] started at line 96
[gauge] Unclosed Anchor: [DEF:gauge:Function] started at line 96
[gauge] Unclosed Anchor: [DEF:gauge:Function] started at line 96
[gauge] Unclosed Anchor: [DEF:gauge:Function] started at line 96 | -| superset_tool/utils/dataset_mapper.py | 🔴 0% | [superset_tool.utils.dataset_mapper] Unclosed Anchor at end of file (started line 1)
[superset_tool.utils.dataset_mapper] Unclosed Anchor: [DEF:superset_tool.utils.dataset_mapper:Module] started at line 1
[DatasetMapper] Unclosed Anchor at end of file (started line 20)
[DatasetMapper] Unclosed Anchor: [DEF:DatasetMapper:Class] started at line 20
[DatasetMapper] Unclosed Anchor: [DEF:DatasetMapper:Class] started at line 20
[DatasetMapper.get_postgres_comments] Unclosed Anchor at end of file (started line 26)
[DatasetMapper.get_postgres_comments] Unclosed Anchor: [DEF:DatasetMapper.get_postgres_comments:Function] started at line 26
[DatasetMapper.get_postgres_comments] Unclosed Anchor: [DEF:DatasetMapper.get_postgres_comments:Function] started at line 26
[DatasetMapper.get_postgres_comments] Unclosed Anchor: [DEF:DatasetMapper.get_postgres_comments:Function] started at line 26
[DatasetMapper.load_excel_mappings] Unclosed Anchor at end of file (started line 90)
[DatasetMapper.load_excel_mappings] Unclosed Anchor: [DEF:DatasetMapper.load_excel_mappings:Function] started at line 90
[DatasetMapper.load_excel_mappings] Unclosed Anchor: [DEF:DatasetMapper.load_excel_mappings:Function] started at line 90
[DatasetMapper.load_excel_mappings] Unclosed Anchor: [DEF:DatasetMapper.load_excel_mappings:Function] started at line 90
[DatasetMapper.load_excel_mappings] Unclosed Anchor: [DEF:DatasetMapper.load_excel_mappings:Function] started at line 90
[DatasetMapper.run_mapping] Unclosed Anchor at end of file (started line 109)
[DatasetMapper.run_mapping] Unclosed Anchor: [DEF:DatasetMapper.run_mapping:Function] started at line 109
[DatasetMapper.run_mapping] Unclosed Anchor: [DEF:DatasetMapper.run_mapping:Function] started at line 109
[DatasetMapper.run_mapping] Unclosed Anchor: [DEF:DatasetMapper.run_mapping:Function] started at line 109
[DatasetMapper.run_mapping] Unclosed Anchor: [DEF:DatasetMapper.run_mapping:Function] started at line 109
[DatasetMapper.run_mapping] Unclosed Anchor: [DEF:DatasetMapper.run_mapping:Function] started at line 109 | -| superset_tool/utils/__init__.py | 🔴 0% | [superset_tool.utils] Unclosed Anchor at end of file (started line 1)
[superset_tool.utils] Unclosed Anchor: [DEF:superset_tool.utils:Module] started at line 1 | -| superset_tool/utils/init_clients.py | 🔴 0% | [superset_tool.utils.init_clients] Unclosed Anchor at end of file (started line 1)
[superset_tool.utils.init_clients] Unclosed Anchor: [DEF:superset_tool.utils.init_clients:Module] started at line 1
[setup_clients] Unclosed Anchor at end of file (started line 20)
[setup_clients] Unclosed Anchor: [DEF:setup_clients:Function] started at line 20
[setup_clients] Unclosed Anchor: [DEF:setup_clients:Function] started at line 20 | -| superset_tool/utils/fileio.py | 🔴 0% | [superset_tool.utils.fileio] Unclosed Anchor at end of file (started line 1)
[superset_tool.utils.fileio] Unclosed Anchor: [DEF:superset_tool.utils.fileio:Module] started at line 1
[create_temp_file] Unclosed Anchor at end of file (started line 29)
[create_temp_file] Unclosed Anchor: [DEF:create_temp_file:Function] started at line 29
[create_temp_file] Unclosed Anchor: [DEF:create_temp_file:Function] started at line 29
[remove_empty_directories] Unclosed Anchor at end of file (started line 69)
[remove_empty_directories] Unclosed Anchor: [DEF:remove_empty_directories:Function] started at line 69
[remove_empty_directories] Unclosed Anchor: [DEF:remove_empty_directories:Function] started at line 69
[remove_empty_directories] Unclosed Anchor: [DEF:remove_empty_directories:Function] started at line 69
[read_dashboard_from_disk] Unclosed Anchor at end of file (started line 93)
[read_dashboard_from_disk] Unclosed Anchor: [DEF:read_dashboard_from_disk:Function] started at line 93
[read_dashboard_from_disk] Unclosed Anchor: [DEF:read_dashboard_from_disk:Function] started at line 93
[read_dashboard_from_disk] Unclosed Anchor: [DEF:read_dashboard_from_disk:Function] started at line 93
[read_dashboard_from_disk] Unclosed Anchor: [DEF:read_dashboard_from_disk:Function] started at line 93
[calculate_crc32] Unclosed Anchor at end of file (started line 110)
[calculate_crc32] Unclosed Anchor: [DEF:calculate_crc32:Function] started at line 110
[calculate_crc32] Unclosed Anchor: [DEF:calculate_crc32:Function] started at line 110
[calculate_crc32] Unclosed Anchor: [DEF:calculate_crc32:Function] started at line 110
[calculate_crc32] Unclosed Anchor: [DEF:calculate_crc32:Function] started at line 110
[calculate_crc32] Unclosed Anchor: [DEF:calculate_crc32:Function] started at line 110
[RetentionPolicy] Unclosed Anchor at end of file (started line 121)
[RetentionPolicy] Unclosed Anchor: [DEF:RetentionPolicy:DataClass] started at line 121
[RetentionPolicy] Unclosed Anchor: [DEF:RetentionPolicy:DataClass] started at line 121
[RetentionPolicy] Unclosed Anchor: [DEF:RetentionPolicy:DataClass] started at line 121
[RetentionPolicy] Unclosed Anchor: [DEF:RetentionPolicy:DataClass] started at line 121
[RetentionPolicy] Unclosed Anchor: [DEF:RetentionPolicy:DataClass] started at line 121
[RetentionPolicy] Unclosed Anchor: [DEF:RetentionPolicy:DataClass] started at line 121
[archive_exports] Unclosed Anchor at end of file (started line 130)
[archive_exports] Unclosed Anchor: [DEF:archive_exports:Function] started at line 130
[archive_exports] Unclosed Anchor: [DEF:archive_exports:Function] started at line 130
[archive_exports] Unclosed Anchor: [DEF:archive_exports:Function] started at line 130
[archive_exports] Unclosed Anchor: [DEF:archive_exports:Function] started at line 130
[archive_exports] Unclosed Anchor: [DEF:archive_exports:Function] started at line 130
[archive_exports] Unclosed Anchor: [DEF:archive_exports:Function] started at line 130
[archive_exports] Unclosed Anchor: [DEF:archive_exports:Function] started at line 130
[apply_retention_policy] Unclosed Anchor at end of file (started line 212)
[apply_retention_policy] Unclosed Anchor: [DEF:apply_retention_policy:Function] started at line 212
[apply_retention_policy] Unclosed Anchor: [DEF:apply_retention_policy:Function] started at line 212
[apply_retention_policy] Unclosed Anchor: [DEF:apply_retention_policy:Function] started at line 212
[apply_retention_policy] Unclosed Anchor: [DEF:apply_retention_policy:Function] started at line 212
[apply_retention_policy] Unclosed Anchor: [DEF:apply_retention_policy:Function] started at line 212
[apply_retention_policy] Unclosed Anchor: [DEF:apply_retention_policy:Function] started at line 212
[apply_retention_policy] Unclosed Anchor: [DEF:apply_retention_policy:Function] started at line 212
[apply_retention_policy] Unclosed Anchor: [DEF:apply_retention_policy:Function] started at line 212
[save_and_unpack_dashboard] Unclosed Anchor at end of file (started line 245)
[save_and_unpack_dashboard] Unclosed Anchor: [DEF:save_and_unpack_dashboard:Function] started at line 245
[save_and_unpack_dashboard] Unclosed Anchor: [DEF:save_and_unpack_dashboard:Function] started at line 245
[save_and_unpack_dashboard] Unclosed Anchor: [DEF:save_and_unpack_dashboard:Function] started at line 245
[save_and_unpack_dashboard] Unclosed Anchor: [DEF:save_and_unpack_dashboard:Function] started at line 245
[save_and_unpack_dashboard] Unclosed Anchor: [DEF:save_and_unpack_dashboard:Function] started at line 245
[save_and_unpack_dashboard] Unclosed Anchor: [DEF:save_and_unpack_dashboard:Function] started at line 245
[save_and_unpack_dashboard] Unclosed Anchor: [DEF:save_and_unpack_dashboard:Function] started at line 245
[save_and_unpack_dashboard] Unclosed Anchor: [DEF:save_and_unpack_dashboard:Function] started at line 245
[save_and_unpack_dashboard] Unclosed Anchor: [DEF:save_and_unpack_dashboard:Function] started at line 245
[update_yamls] Unclosed Anchor at end of file (started line 275)
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[_update_yaml_file] Unclosed Anchor at end of file (started line 296)
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[create_dashboard_export] Unclosed Anchor at end of file (started line 357)
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[sanitize_filename] Unclosed Anchor at end of file (started line 384)
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[get_filename_from_headers] Unclosed Anchor at end of file (started line 392)
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[consolidate_archive_folders] Unclosed Anchor at end of file (started line 403)
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403 | -| frontend/src/App.svelte | 🔴 0% | [App] Unclosed Anchor at end of file (started line 1)
[App] Unclosed Anchor: [DEF:App:Component] started at line 1
[handleFormSubmit] Unclosed Anchor at end of file (started line 24)
[handleFormSubmit] Unclosed Anchor: [DEF:handleFormSubmit:Function] started at line 24
[handleFormSubmit] Unclosed Anchor: [DEF:handleFormSubmit:Function] started at line 24
[navigate] Unclosed Anchor at end of file (started line 44)
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44 | -| frontend/src/main.js | 🔴 0% | [main] Unclosed Anchor at end of file (started line 1)
[main] Unclosed Anchor: [DEF:main:Module] started at line 1
[app_instance] Unclosed Anchor at end of file (started line 9)
[app_instance] Unclosed Anchor: [DEF:app_instance:Data] started at line 9
[app_instance] Unclosed Anchor: [DEF:app_instance:Data] started at line 9 | -| frontend/src/components/DashboardGrid.svelte | 🔴 0% | [DashboardGrid] Unclosed Anchor at end of file (started line 1)
[DashboardGrid] Unclosed Anchor: [DEF:DashboardGrid:Component] started at line 1
[handleSort] Unclosed Anchor at end of file (started line 62)
[handleSort] Unclosed Anchor: [DEF:handleSort:Function] started at line 62
[handleSort] Unclosed Anchor: [DEF:handleSort:Function] started at line 62
[handleSelectionChange] Unclosed Anchor at end of file (started line 74)
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectAll] Unclosed Anchor at end of file (started line 88)
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[goToPage] Unclosed Anchor at end of file (started line 106)
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106 | -| frontend/src/components/TaskHistory.svelte | 🔴 0% | [TaskHistory] Unclosed Anchor at end of file (started line 1)
[TaskHistory] Unclosed Anchor: [DEF:TaskHistory:Component] started at line 1 | -| frontend/src/components/MappingTable.svelte | 🔴 0% | [MappingTable] Unclosed Anchor at end of file (started line 1)
[MappingTable] Unclosed Anchor: [DEF:MappingTable:Component] started at line 1
[updateMapping] Unclosed Anchor at end of file (started line 25)
[updateMapping] Unclosed Anchor: [DEF:updateMapping:Function] started at line 25
[updateMapping] Unclosed Anchor: [DEF:updateMapping:Function] started at line 25
[getSuggestion] Unclosed Anchor at end of file (started line 34)
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34 | -| frontend/src/components/EnvSelector.svelte | 🔴 0% | [EnvSelector] Unclosed Anchor at end of file (started line 1)
[EnvSelector] Unclosed Anchor: [DEF:EnvSelector:Component] started at line 1
[handleSelect] Unclosed Anchor at end of file (started line 24)
[handleSelect] Unclosed Anchor: [DEF:handleSelect:Function] started at line 24
[handleSelect] Unclosed Anchor: [DEF:handleSelect:Function] started at line 24 | -| frontend/src/components/TaskList.svelte | 🔴 0% | [TaskList] Unclosed Anchor at end of file (started line 1)
[TaskList] Unclosed Anchor: [DEF:TaskList:Component] started at line 1 | -| frontend/src/components/DynamicForm.svelte | 🔴 0% | [DynamicForm] Unclosed Anchor at end of file (started line 1)
[DynamicForm] Unclosed Anchor: [DEF:DynamicForm:Component] started at line 1
[handleSubmit] Unclosed Anchor at end of file (started line 23)
[handleSubmit] Unclosed Anchor: [DEF:handleSubmit:Function] started at line 23
[handleSubmit] Unclosed Anchor: [DEF:handleSubmit:Function] started at line 23
[initializeForm] Unclosed Anchor at end of file (started line 33)
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33 | -| frontend/src/components/TaskRunner.svelte | 🔴 0% | [TaskRunner] Unclosed Anchor at end of file (started line 1)
[TaskRunner] Unclosed Anchor: [DEF:TaskRunner:Component] started at line 1
[connect] Unclosed Anchor at end of file (started line 38)
[connect] Unclosed Anchor: [DEF:connect:Function] started at line 38
[connect] Unclosed Anchor: [DEF:connect:Function] started at line 38
[onMount] Unclosed Anchor at end of file (started line 225)
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onDestroy] Unclosed Anchor at end of file (started line 251)
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251 | -| frontend/src/components/TaskLogViewer.svelte | 🔴 0% | [TaskLogViewer] Unclosed Anchor at end of file (started line 1)
[TaskLogViewer] Unclosed Anchor: [DEF:TaskLogViewer:Component] started at line 1 | -| frontend/src/components/PasswordPrompt.svelte | 🔴 0% | [PasswordPrompt] Unclosed Anchor at end of file (started line 1)
[PasswordPrompt] Unclosed Anchor: [DEF:PasswordPrompt:Component] started at line 1 | -| frontend/src/components/MissingMappingModal.svelte | 🔴 0% | [MissingMappingModal] Unclosed Anchor at end of file (started line 1)
[MissingMappingModal] Unclosed Anchor: [DEF:MissingMappingModal:Component] started at line 1
[resolve] Unclosed Anchor at end of file (started line 26)
[resolve] Unclosed Anchor: [DEF:resolve:Function] started at line 26
[resolve] Missing Mandatory Tag: @PURPOSE
[resolve] Unclosed Anchor: [DEF:resolve:Function] started at line 26
[resolve] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor at end of file (started line 38)
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE | -| frontend/src/components/Toast.svelte | 🔴 0% | [Toast] Unclosed Anchor at end of file (started line 1)
[Toast] Unclosed Anchor: [DEF:Toast:Component] started at line 1 | -| frontend/src/pages/Settings.svelte | 🔴 0% | [Settings] Unclosed Anchor at end of file (started line 1)
[Settings] Unclosed Anchor: [DEF:Settings:Component] started at line 1
[loadSettings] Unclosed Anchor at end of file (started line 50)
[loadSettings] Unclosed Anchor: [DEF:loadSettings:Function] started at line 50
[loadSettings] Unclosed Anchor: [DEF:loadSettings:Function] started at line 50
[handleSaveGlobal] Unclosed Anchor at end of file (started line 67)
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleAddOrUpdateEnv] Unclosed Anchor at end of file (started line 84)
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleDeleteEnv] Unclosed Anchor at end of file (started line 108)
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleTestEnv] Unclosed Anchor at end of file (started line 129)
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[editEnv] Unclosed Anchor at end of file (started line 152)
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[resetEnvForm] Unclosed Anchor at end of file (started line 163)
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163 | -| frontend/src/pages/Dashboard.svelte | 🔴 0% | [Dashboard] Unclosed Anchor at end of file (started line 1)
[Dashboard] Unclosed Anchor: [DEF:Dashboard:Component] started at line 1
[onMount] Unclosed Anchor at end of file (started line 17)
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 17
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 17
[selectPlugin] Unclosed Anchor at end of file (started line 27)
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27 | -| frontend/src/lib/stores.js | 🔴 0% | [stores_module] Unclosed Anchor at end of file (started line 1)
[stores_module] Unclosed Anchor: [DEF:stores_module:Module] started at line 1
[plugins] Unclosed Anchor at end of file (started line 9)
[plugins] Unclosed Anchor: [DEF:plugins:Data] started at line 9
[plugins] Unclosed Anchor: [DEF:plugins:Data] started at line 9
[tasks] Unclosed Anchor at end of file (started line 13)
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[selectedPlugin] Unclosed Anchor at end of file (started line 17)
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedTask] Unclosed Anchor at end of file (started line 21)
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[currentPage] Unclosed Anchor at end of file (started line 25)
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[taskLogs] Unclosed Anchor at end of file (started line 29)
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[fetchPlugins] Unclosed Anchor at end of file (started line 33)
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchTasks] Unclosed Anchor at end of file (started line 47)
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47 | -| frontend/src/lib/toasts.js | 🔴 0% | [toasts_module] Unclosed Anchor at end of file (started line 1)
[toasts_module] Unclosed Anchor: [DEF:toasts_module:Module] started at line 1
[toasts] Unclosed Anchor at end of file (started line 8)
[toasts] Unclosed Anchor: [DEF:toasts:Data] started at line 8
[toasts] Unclosed Anchor: [DEF:toasts:Data] started at line 8
[addToast] Unclosed Anchor at end of file (started line 12)
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[removeToast] Unclosed Anchor at end of file (started line 25)
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25 | -| frontend/src/lib/api.js | 🔴 0% | [api_module] Unclosed Anchor at end of file (started line 1)
[api_module] Unclosed Anchor: [DEF:api_module:Module] started at line 1
[fetchApi] Unclosed Anchor at end of file (started line 26)
[fetchApi] Unclosed Anchor: [DEF:fetchApi:Function] started at line 26
[fetchApi] Unclosed Anchor: [DEF:fetchApi:Function] started at line 26
[postApi] Unclosed Anchor at end of file (started line 46)
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[requestApi] Unclosed Anchor at end of file (started line 73)
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[api] Unclosed Anchor at end of file (started line 100)
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100 | -| frontend/src/routes/migration/+page.svelte | 🔴 0% | [MigrationDashboard] Unclosed Anchor at end of file (started line 1)
[MigrationDashboard] Unclosed Anchor: [DEF:MigrationDashboard:Component] started at line 1
[fetchEnvironments] Unclosed Anchor at end of file (started line 51)
[fetchEnvironments] Unclosed Anchor: [DEF:fetchEnvironments:Function] started at line 51
[fetchEnvironments] Unclosed Anchor: [DEF:fetchEnvironments:Function] started at line 51
[fetchDashboards] Unclosed Anchor at end of file (started line 69)
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDatabases] Unclosed Anchor at end of file (started line 93)
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[handleMappingUpdate] Unclosed Anchor at end of file (started line 128)
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleViewLogs] Unclosed Anchor at end of file (started line 163)
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor at end of file (started line 172)
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[startMigration] Unclosed Anchor at end of file (started line 207)
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207 | -| frontend/src/routes/migration/mappings/+page.svelte | 🔴 0% | [MappingManagement] Unclosed Anchor at end of file (started line 1)
[MappingManagement] Unclosed Anchor: [DEF:MappingManagement:Component] started at line 1
[fetchDatabases] Unclosed Anchor at end of file (started line 47)
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 47
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 47
[handleUpdate] Unclosed Anchor at end of file (started line 83)
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83 | -| backend/src/dependencies.py | 🔴 0% | [Dependencies] Unclosed Anchor at end of file (started line 1)
[Dependencies] Unclosed Anchor: [DEF:Dependencies:Module] started at line 1 | -| backend/src/app.py | 🔴 0% | [AppModule] Unclosed Anchor at end of file (started line 1)
[AppModule] Unclosed Anchor: [DEF:AppModule:Module] started at line 1
[App] Unclosed Anchor at end of file (started line 26)
[App] Unclosed Anchor: [DEF:App:Global] started at line 26
[App] Unclosed Anchor: [DEF:App:Global] started at line 26
[WebSocketEndpoint] Unclosed Anchor at end of file (started line 72)
[WebSocketEndpoint] Unclosed Anchor: [DEF:WebSocketEndpoint:Endpoint] started at line 72
[WebSocketEndpoint] Unclosed Anchor: [DEF:WebSocketEndpoint:Endpoint] started at line 72
[WebSocketEndpoint] Unclosed Anchor: [DEF:WebSocketEndpoint:Endpoint] started at line 72
[StaticFiles] Unclosed Anchor at end of file (started line 130)
[StaticFiles] Unclosed Anchor: [DEF:StaticFiles:Mount] started at line 130
[StaticFiles] Unclosed Anchor: [DEF:StaticFiles:Mount] started at line 130
[StaticFiles] Unclosed Anchor: [DEF:StaticFiles:Mount] started at line 130
[StaticFiles] Unclosed Anchor: [DEF:StaticFiles:Mount] started at line 130
[RootEndpoint] Unclosed Anchor at end of file (started line 146)
[RootEndpoint] Unclosed Anchor: [DEF:RootEndpoint:Endpoint] started at line 146
[RootEndpoint] Unclosed Anchor: [DEF:RootEndpoint:Endpoint] started at line 146
[RootEndpoint] Unclosed Anchor: [DEF:RootEndpoint:Endpoint] started at line 146
[RootEndpoint] Unclosed Anchor: [DEF:RootEndpoint:Endpoint] started at line 146
[RootEndpoint] Unclosed Anchor: [DEF:RootEndpoint:Endpoint] started at line 146 | -| backend/src/models/mapping.py | 🔴 0% | [backend.src.models.mapping] Unclosed Anchor at end of file (started line 1)
[backend.src.models.mapping] Unclosed Anchor: [DEF:backend.src.models.mapping:Module] started at line 1
[MigrationStatus] Unclosed Anchor at end of file (started line 21)
[MigrationStatus] Unclosed Anchor: [DEF:MigrationStatus:Class] started at line 21
[MigrationStatus] Unclosed Anchor: [DEF:MigrationStatus:Class] started at line 21
[Environment] Unclosed Anchor at end of file (started line 31)
[Environment] Unclosed Anchor: [DEF:Environment:Class] started at line 31
[Environment] Unclosed Anchor: [DEF:Environment:Class] started at line 31
[Environment] Unclosed Anchor: [DEF:Environment:Class] started at line 31
[DatabaseMapping] Unclosed Anchor at end of file (started line 42)
[DatabaseMapping] Unclosed Anchor: [DEF:DatabaseMapping:Class] started at line 42
[DatabaseMapping] Unclosed Anchor: [DEF:DatabaseMapping:Class] started at line 42
[DatabaseMapping] Unclosed Anchor: [DEF:DatabaseMapping:Class] started at line 42
[DatabaseMapping] Unclosed Anchor: [DEF:DatabaseMapping:Class] started at line 42
[MigrationJob] Unclosed Anchor at end of file (started line 57)
[MigrationJob] Unclosed Anchor: [DEF:MigrationJob:Class] started at line 57
[MigrationJob] Unclosed Anchor: [DEF:MigrationJob:Class] started at line 57
[MigrationJob] Unclosed Anchor: [DEF:MigrationJob:Class] started at line 57
[MigrationJob] Unclosed Anchor: [DEF:MigrationJob:Class] started at line 57
[MigrationJob] Unclosed Anchor: [DEF:MigrationJob:Class] started at line 57 | -| backend/src/models/dashboard.py | 🔴 0% | [backend.src.models.dashboard] Unclosed Anchor at end of file (started line 1)
[backend.src.models.dashboard] Unclosed Anchor: [DEF:backend.src.models.dashboard:Module] started at line 1
[DashboardMetadata] Unclosed Anchor at end of file (started line 10)
[DashboardMetadata] Unclosed Anchor: [DEF:DashboardMetadata:Class] started at line 10
[DashboardMetadata] Unclosed Anchor: [DEF:DashboardMetadata:Class] started at line 10
[DashboardSelection] Unclosed Anchor at end of file (started line 19)
[DashboardSelection] Unclosed Anchor: [DEF:DashboardSelection:Class] started at line 19
[DashboardSelection] Unclosed Anchor: [DEF:DashboardSelection:Class] started at line 19
[DashboardSelection] Unclosed Anchor: [DEF:DashboardSelection:Class] started at line 19 | -| backend/src/models/task.py | 🔴 0% | [backend.src.models.task] Unclosed Anchor at end of file (started line 1)
[backend.src.models.task] Unclosed Anchor: [DEF:backend.src.models.task:Module] started at line 1
[TaskRecord] Unclosed Anchor at end of file (started line 17)
[TaskRecord] Unclosed Anchor: [DEF:TaskRecord:Class] started at line 17
[TaskRecord] Unclosed Anchor: [DEF:TaskRecord:Class] started at line 17 | -| backend/src/services/mapping_service.py | 🔴 0% | [backend.src.services.mapping_service] Unclosed Anchor at end of file (started line 1)
[backend.src.services.mapping_service] Unclosed Anchor: [DEF:backend.src.services.mapping_service:Module] started at line 1
[MappingService] Unclosed Anchor at end of file (started line 18)
[MappingService] Unclosed Anchor: [DEF:MappingService:Class] started at line 18
[MappingService] Unclosed Anchor: [DEF:MappingService:Class] started at line 18
[MappingService.__init__] Unclosed Anchor at end of file (started line 22)
[MappingService.__init__] Unclosed Anchor: [DEF:MappingService.__init__:Function] started at line 22
[MappingService.__init__] Missing Mandatory Tag: @PURPOSE
[MappingService.__init__] Unclosed Anchor: [DEF:MappingService.__init__:Function] started at line 22
[MappingService.__init__] Missing Mandatory Tag: @PURPOSE
[MappingService.__init__] Unclosed Anchor: [DEF:MappingService.__init__:Function] started at line 22
[MappingService.__init__] Missing Mandatory Tag: @PURPOSE
[MappingService._get_client] Unclosed Anchor at end of file (started line 26)
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService.get_suggestions] Unclosed Anchor at end of file (started line 46)
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46 | -| backend/src/core/config_manager.py | 🔴 0% | [ConfigManagerModule] Unclosed Anchor at end of file (started line 1)
[ConfigManagerModule] Unclosed Anchor: [DEF:ConfigManagerModule:Module] started at line 1
[ConfigManager] Unclosed Anchor at end of file (started line 22)
[ConfigManager] Unclosed Anchor: [DEF:ConfigManager:Class] started at line 22
[ConfigManager] Unclosed Anchor: [DEF:ConfigManager:Class] started at line 22
[__init__] Unclosed Anchor at end of file (started line 27)
[__init__] Unclosed Anchor: [DEF:__init__:Function] started at line 27
[__init__] Unclosed Anchor: [DEF:__init__:Function] started at line 27
[__init__] Unclosed Anchor: [DEF:__init__:Function] started at line 27
[_load_config] Unclosed Anchor at end of file (started line 51)
[_load_config] Unclosed Anchor: [DEF:_load_config:Function] started at line 51
[_load_config] Unclosed Anchor: [DEF:_load_config:Function] started at line 51
[_load_config] Unclosed Anchor: [DEF:_load_config:Function] started at line 51
[_load_config] Unclosed Anchor: [DEF:_load_config:Function] started at line 51
[_save_config_to_disk] Unclosed Anchor at end of file (started line 83)
[_save_config_to_disk] Unclosed Anchor: [DEF:_save_config_to_disk:Function] started at line 83
[_save_config_to_disk] Unclosed Anchor: [DEF:_save_config_to_disk:Function] started at line 83
[_save_config_to_disk] Unclosed Anchor: [DEF:_save_config_to_disk:Function] started at line 83
[_save_config_to_disk] Unclosed Anchor: [DEF:_save_config_to_disk:Function] started at line 83
[_save_config_to_disk] Unclosed Anchor: [DEF:_save_config_to_disk:Function] started at line 83
[save] Unclosed Anchor at end of file (started line 102)
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[get_config] Unclosed Anchor at end of file (started line 108)
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[update_global_settings] Unclosed Anchor at end of file (started line 115)
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[validate_path] Unclosed Anchor at end of file (started line 135)
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[get_environments] Unclosed Anchor at end of file (started line 153)
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[has_environments] Unclosed Anchor at end of file (started line 160)
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[add_environment] Unclosed Anchor at end of file (started line 167)
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[update_environment] Unclosed Anchor at end of file (started line 186)
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[delete_environment] Unclosed Anchor at end of file (started line 215)
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215 | -| backend/src/core/superset_client.py | 🔴 0% | [backend.src.core.superset_client] Unclosed Anchor at end of file (started line 1)
[backend.src.core.superset_client] Unclosed Anchor: [DEF:backend.src.core.superset_client:Module] started at line 1
[SupersetClient] Unclosed Anchor at end of file (started line 16)
[SupersetClient] Unclosed Anchor: [DEF:SupersetClient:Class] started at line 16
[SupersetClient] Unclosed Anchor: [DEF:SupersetClient:Class] started at line 16
[SupersetClient.get_databases_summary] Unclosed Anchor at end of file (started line 20)
[SupersetClient.get_databases_summary] Unclosed Anchor: [DEF:SupersetClient.get_databases_summary:Function] started at line 20
[SupersetClient.get_databases_summary] Unclosed Anchor: [DEF:SupersetClient.get_databases_summary:Function] started at line 20
[SupersetClient.get_databases_summary] Unclosed Anchor: [DEF:SupersetClient.get_databases_summary:Function] started at line 20
[SupersetClient.get_database_by_uuid] Unclosed Anchor at end of file (started line 40)
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_dashboards_summary] Unclosed Anchor at end of file (started line 55)
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55 | -| backend/src/core/migration_engine.py | 🔴 0% | [backend.src.core.migration_engine] Unclosed Anchor at end of file (started line 1)
[backend.src.core.migration_engine] Unclosed Anchor: [DEF:backend.src.core.migration_engine:Module] started at line 1
[MigrationEngine] Unclosed Anchor at end of file (started line 22)
[MigrationEngine] Unclosed Anchor: [DEF:MigrationEngine:Class] started at line 22
[MigrationEngine] Unclosed Anchor: [DEF:MigrationEngine:Class] started at line 22
[MigrationEngine.transform_zip] Unclosed Anchor at end of file (started line 26)
[MigrationEngine.transform_zip] Unclosed Anchor: [DEF:MigrationEngine.transform_zip:Function] started at line 26
[MigrationEngine.transform_zip] Unclosed Anchor: [DEF:MigrationEngine.transform_zip:Function] started at line 26
[MigrationEngine.transform_zip] Unclosed Anchor: [DEF:MigrationEngine.transform_zip:Function] started at line 26
[MigrationEngine._transform_yaml] Unclosed Anchor at end of file (started line 77)
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77 | -| backend/src/core/logger.py | 🔴 0% | [LoggerModule] Unclosed Anchor at end of file (started line 1)
[LoggerModule] Unclosed Anchor: [DEF:LoggerModule:Module] started at line 1
[BeliefFormatter] Unclosed Anchor at end of file (started line 22)
[BeliefFormatter] Unclosed Anchor: [DEF:BeliefFormatter:Class] started at line 22
[BeliefFormatter] Unclosed Anchor: [DEF:BeliefFormatter:Class] started at line 22
[LogEntry] Unclosed Anchor at end of file (started line 34)
[LogEntry] Unclosed Anchor: [DEF:LogEntry:Class] started at line 34
[LogEntry] Unclosed Anchor: [DEF:LogEntry:Class] started at line 34
[LogEntry] Unclosed Anchor: [DEF:LogEntry:Class] started at line 34
[BeliefScope] Unclosed Anchor at end of file (started line 45)
[BeliefScope] Unclosed Anchor: [DEF:BeliefScope:Function] started at line 45
[BeliefScope] Unclosed Anchor: [DEF:BeliefScope:Function] started at line 45
[BeliefScope] Unclosed Anchor: [DEF:BeliefScope:Function] started at line 45
[BeliefScope] Unclosed Anchor: [DEF:BeliefScope:Function] started at line 45
[ConfigureLogger] Unclosed Anchor at end of file (started line 76)
[ConfigureLogger] Unclosed Anchor: [DEF:ConfigureLogger:Function] started at line 76
[ConfigureLogger] Unclosed Anchor: [DEF:ConfigureLogger:Function] started at line 76
[ConfigureLogger] Unclosed Anchor: [DEF:ConfigureLogger:Function] started at line 76
[ConfigureLogger] Unclosed Anchor: [DEF:ConfigureLogger:Function] started at line 76
[ConfigureLogger] Unclosed Anchor: [DEF:ConfigureLogger:Function] started at line 76
[WebSocketLogHandler] Unclosed Anchor at end of file (started line 120)
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[Logger] Unclosed Anchor at end of file (started line 163)
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163 | -| backend/src/core/database.py | 🔴 0% | [backend.src.core.database] Unclosed Anchor at end of file (started line 1)
[backend.src.core.database] Unclosed Anchor: [DEF:backend.src.core.database:Module] started at line 1
[DATABASE_URL] Unclosed Anchor at end of file (started line 20)
[DATABASE_URL] Unclosed Anchor: [DEF:DATABASE_URL:Constant] started at line 20
[DATABASE_URL] Unclosed Anchor: [DEF:DATABASE_URL:Constant] started at line 20
[TASKS_DATABASE_URL] Unclosed Anchor at end of file (started line 24)
[TASKS_DATABASE_URL] Unclosed Anchor: [DEF:TASKS_DATABASE_URL:Constant] started at line 24
[TASKS_DATABASE_URL] Unclosed Anchor: [DEF:TASKS_DATABASE_URL:Constant] started at line 24
[TASKS_DATABASE_URL] Unclosed Anchor: [DEF:TASKS_DATABASE_URL:Constant] started at line 24
[engine] Unclosed Anchor at end of file (started line 28)
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28
[tasks_engine] Unclosed Anchor at end of file (started line 32)
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[SessionLocal] Unclosed Anchor at end of file (started line 36)
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor at end of file (started line 40)
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[init_db] Unclosed Anchor at end of file (started line 44)
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[get_db] Unclosed Anchor at end of file (started line 51)
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_tasks_db] Unclosed Anchor at end of file (started line 63)
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63 | -| backend/src/core/config_models.py | 🔴 0% | [ConfigModels] Unclosed Anchor at end of file (started line 1)
[ConfigModels] Unclosed Anchor: [DEF:ConfigModels:Module] started at line 1
[Schedule] Unclosed Anchor at end of file (started line 11)
[Schedule] Unclosed Anchor: [DEF:Schedule:DataClass] started at line 11
[Schedule] Unclosed Anchor: [DEF:Schedule:DataClass] started at line 11
[Environment] Unclosed Anchor at end of file (started line 18)
[Environment] Unclosed Anchor: [DEF:Environment:DataClass] started at line 18
[Environment] Unclosed Anchor: [DEF:Environment:DataClass] started at line 18
[Environment] Unclosed Anchor: [DEF:Environment:DataClass] started at line 18
[LoggingConfig] Unclosed Anchor at end of file (started line 30)
[LoggingConfig] Unclosed Anchor: [DEF:LoggingConfig:DataClass] started at line 30
[LoggingConfig] Unclosed Anchor: [DEF:LoggingConfig:DataClass] started at line 30
[LoggingConfig] Unclosed Anchor: [DEF:LoggingConfig:DataClass] started at line 30
[LoggingConfig] Unclosed Anchor: [DEF:LoggingConfig:DataClass] started at line 30
[GlobalSettings] Unclosed Anchor at end of file (started line 40)
[GlobalSettings] Unclosed Anchor: [DEF:GlobalSettings:DataClass] started at line 40
[GlobalSettings] Unclosed Anchor: [DEF:GlobalSettings:DataClass] started at line 40
[GlobalSettings] Unclosed Anchor: [DEF:GlobalSettings:DataClass] started at line 40
[GlobalSettings] Unclosed Anchor: [DEF:GlobalSettings:DataClass] started at line 40
[GlobalSettings] Unclosed Anchor: [DEF:GlobalSettings:DataClass] started at line 40
[AppConfig] Unclosed Anchor at end of file (started line 53)
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53 | -| backend/src/core/scheduler.py | 🔴 0% | [SchedulerModule] Unclosed Anchor at end of file (started line 1)
[SchedulerModule] Unclosed Anchor: [DEF:SchedulerModule:Module] started at line 1
[SchedulerService] Unclosed Anchor at end of file (started line 16)
[SchedulerService] Unclosed Anchor: [DEF:SchedulerService:Class] started at line 16
[SchedulerService] Unclosed Anchor: [DEF:SchedulerService:Class] started at line 16
[SchedulerService.start] Unclosed Anchor at end of file (started line 27)
[SchedulerService.start] Unclosed Anchor: [DEF:SchedulerService.start:Function] started at line 27
[SchedulerService.start] Unclosed Anchor: [DEF:SchedulerService.start:Function] started at line 27
[SchedulerService.start] Unclosed Anchor: [DEF:SchedulerService.start:Function] started at line 27
[SchedulerService.stop] Unclosed Anchor at end of file (started line 36)
[SchedulerService.stop] Unclosed Anchor: [DEF:SchedulerService.stop:Function] started at line 36
[SchedulerService.stop] Unclosed Anchor: [DEF:SchedulerService.stop:Function] started at line 36
[SchedulerService.stop] Unclosed Anchor: [DEF:SchedulerService.stop:Function] started at line 36
[SchedulerService.stop] Unclosed Anchor: [DEF:SchedulerService.stop:Function] started at line 36
[SchedulerService.load_schedules] Unclosed Anchor at end of file (started line 44)
[SchedulerService.load_schedules] Unclosed Anchor: [DEF:SchedulerService.load_schedules:Function] started at line 44
[SchedulerService.load_schedules] Unclosed Anchor: [DEF:SchedulerService.load_schedules:Function] started at line 44
[SchedulerService.load_schedules] Unclosed Anchor: [DEF:SchedulerService.load_schedules:Function] started at line 44
[SchedulerService.load_schedules] Unclosed Anchor: [DEF:SchedulerService.load_schedules:Function] started at line 44
[SchedulerService.load_schedules] Unclosed Anchor: [DEF:SchedulerService.load_schedules:Function] started at line 44
[SchedulerService.add_backup_job] Unclosed Anchor at end of file (started line 56)
[SchedulerService.add_backup_job] Unclosed Anchor: [DEF:SchedulerService.add_backup_job:Function] started at line 56
[SchedulerService.add_backup_job] Unclosed Anchor: [DEF:SchedulerService.add_backup_job:Function] started at line 56
[SchedulerService.add_backup_job] Unclosed Anchor: [DEF:SchedulerService.add_backup_job:Function] started at line 56
[SchedulerService.add_backup_job] Unclosed Anchor: [DEF:SchedulerService.add_backup_job:Function] started at line 56
[SchedulerService.add_backup_job] Unclosed Anchor: [DEF:SchedulerService.add_backup_job:Function] started at line 56
[SchedulerService.add_backup_job] Unclosed Anchor: [DEF:SchedulerService.add_backup_job:Function] started at line 56
[SchedulerService._trigger_backup] Unclosed Anchor at end of file (started line 75)
[SchedulerService._trigger_backup] Unclosed Anchor: [DEF:SchedulerService._trigger_backup:Function] started at line 75
[SchedulerService._trigger_backup] Unclosed Anchor: [DEF:SchedulerService._trigger_backup:Function] started at line 75
[SchedulerService._trigger_backup] Unclosed Anchor: [DEF:SchedulerService._trigger_backup:Function] started at line 75
[SchedulerService._trigger_backup] Unclosed Anchor: [DEF:SchedulerService._trigger_backup:Function] started at line 75
[SchedulerService._trigger_backup] Unclosed Anchor: [DEF:SchedulerService._trigger_backup:Function] started at line 75
[SchedulerService._trigger_backup] Unclosed Anchor: [DEF:SchedulerService._trigger_backup:Function] started at line 75
[SchedulerService._trigger_backup] Unclosed Anchor: [DEF:SchedulerService._trigger_backup:Function] started at line 75 | -| backend/src/core/plugin_loader.py | 🔴 0% | [PluginLoader] Unclosed Anchor at end of file (started line 8)
[PluginLoader] Unclosed Anchor: [DEF:PluginLoader:Class] started at line 8 | -| backend/src/core/plugin_base.py | 🔴 0% | [PluginBase] Unclosed Anchor at end of file (started line 6)
[PluginBase] Unclosed Anchor: [DEF:PluginBase:Class] started at line 6
[PluginConfig] Unclosed Anchor at end of file (started line 59)
[PluginConfig] Unclosed Anchor: [DEF:PluginConfig:Class] started at line 59
[PluginConfig] Unclosed Anchor: [DEF:PluginConfig:Class] started at line 59 | -| backend/src/core/utils/matching.py | 🔴 0% | [backend.src.core.utils.matching] Unclosed Anchor at end of file (started line 1)
[backend.src.core.utils.matching] Unclosed Anchor: [DEF:backend.src.core.utils.matching:Module] started at line 1
[suggest_mappings] Unclosed Anchor at end of file (started line 15)
[suggest_mappings] Unclosed Anchor: [DEF:suggest_mappings:Function] started at line 15
[suggest_mappings] Unclosed Anchor: [DEF:suggest_mappings:Function] started at line 15 | -| backend/src/core/task_manager/cleanup.py | 🔴 0% | [TaskCleanupModule] Unclosed Anchor at end of file (started line 1)
[TaskCleanupModule] Unclosed Anchor: [DEF:TaskCleanupModule:Module] started at line 1
[TaskCleanupService] Unclosed Anchor at end of file (started line 12)
[TaskCleanupService] Unclosed Anchor: [DEF:TaskCleanupService:Class] started at line 12
[TaskCleanupService] Unclosed Anchor: [DEF:TaskCleanupService:Class] started at line 12
[TaskCleanupService.run_cleanup] Unclosed Anchor at end of file (started line 19)
[TaskCleanupService.run_cleanup] Unclosed Anchor: [DEF:TaskCleanupService.run_cleanup:Function] started at line 19
[TaskCleanupService.run_cleanup] Unclosed Anchor: [DEF:TaskCleanupService.run_cleanup:Function] started at line 19
[TaskCleanupService.run_cleanup] Unclosed Anchor: [DEF:TaskCleanupService.run_cleanup:Function] started at line 19 | -| backend/src/plugins/backup.py | 🔴 0% | [BackupPlugin] Unclosed Anchor at end of file (started line 1)
[BackupPlugin] Unclosed Anchor: [DEF:BackupPlugin:Module] started at line 1 | -| backend/src/plugins/migration.py | 🔴 0% | [MigrationPlugin] Unclosed Anchor at end of file (started line 1)
[MigrationPlugin] Unclosed Anchor: [DEF:MigrationPlugin:Module] started at line 1
[MigrationPlugin.execute] Unclosed Anchor at end of file (started line 103)
[MigrationPlugin.execute] Unclosed Anchor: [DEF:MigrationPlugin.execute:Action] started at line 103
[MigrationPlugin.execute] Unclosed Anchor: [DEF:MigrationPlugin.execute:Action] started at line 103 | -| backend/src/api/auth.py | 🔴 0% | [AuthModule] Unclosed Anchor at end of file (started line 1)
[AuthModule] Unclosed Anchor: [DEF:AuthModule:Module] started at line 1 | -| backend/src/api/routes/settings.py | 🔴 0% | [SettingsRouter] Unclosed Anchor at end of file (started line 1)
[SettingsRouter] Unclosed Anchor: [DEF:SettingsRouter:Module] started at line 1
[get_settings] Unclosed Anchor at end of file (started line 26)
[get_settings] Unclosed Anchor: [DEF:get_settings:Function] started at line 26
[get_settings] Unclosed Anchor: [DEF:get_settings:Function] started at line 26
[update_global_settings] Unclosed Anchor at end of file (started line 40)
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 40
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 40
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 40
[get_environments] Unclosed Anchor at end of file (started line 54)
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 54
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 54
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 54
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 54
[add_environment] Unclosed Anchor at end of file (started line 63)
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 63
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 63
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 63
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 63
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 63
[update_environment] Unclosed Anchor at end of file (started line 96)
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[delete_environment] Unclosed Anchor at end of file (started line 139)
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[test_environment_connection] Unclosed Anchor at end of file (started line 152)
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[validate_backup_path] Unclosed Anchor at end of file (started line 195)
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195 | -| backend/src/api/routes/tasks.py | 🔴 0% | [TasksRouter] Unclosed Anchor at end of file (started line 1)
[TasksRouter] Unclosed Anchor: [DEF:TasksRouter:Module] started at line 1 | -| backend/src/api/routes/environments.py | 🔴 0% | [backend.src.api.routes.environments] Unclosed Anchor at end of file (started line 1)
[backend.src.api.routes.environments] Unclosed Anchor: [DEF:backend.src.api.routes.environments:Module] started at line 1
[ScheduleSchema] Unclosed Anchor at end of file (started line 23)
[ScheduleSchema] Unclosed Anchor: [DEF:ScheduleSchema:DataClass] started at line 23
[ScheduleSchema] Unclosed Anchor: [DEF:ScheduleSchema:DataClass] started at line 23
[EnvironmentResponse] Unclosed Anchor at end of file (started line 29)
[EnvironmentResponse] Unclosed Anchor: [DEF:EnvironmentResponse:DataClass] started at line 29
[EnvironmentResponse] Unclosed Anchor: [DEF:EnvironmentResponse:DataClass] started at line 29
[EnvironmentResponse] Unclosed Anchor: [DEF:EnvironmentResponse:DataClass] started at line 29
[DatabaseResponse] Unclosed Anchor at end of file (started line 37)
[DatabaseResponse] Unclosed Anchor: [DEF:DatabaseResponse:DataClass] started at line 37
[DatabaseResponse] Unclosed Anchor: [DEF:DatabaseResponse:DataClass] started at line 37
[DatabaseResponse] Unclosed Anchor: [DEF:DatabaseResponse:DataClass] started at line 37
[DatabaseResponse] Unclosed Anchor: [DEF:DatabaseResponse:DataClass] started at line 37
[get_environments] Unclosed Anchor at end of file (started line 44)
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 44
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 44
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 44
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 44
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 44
[update_environment_schedule] Unclosed Anchor at end of file (started line 66)
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[get_environment_databases] Unclosed Anchor at end of file (started line 94)
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94 | -| backend/src/api/routes/plugins.py | 🔴 0% | [PluginsRouter] Unclosed Anchor at end of file (started line 1)
[PluginsRouter] Unclosed Anchor: [DEF:PluginsRouter:Module] started at line 1 | -| backend/src/api/routes/migration.py | 🔴 0% | [backend.src.api.routes.migration] Unclosed Anchor at end of file (started line 1)
[backend.src.api.routes.migration] Unclosed Anchor: [DEF:backend.src.api.routes.migration:Module] started at line 1
[get_dashboards] Unclosed Anchor at end of file (started line 17)
[get_dashboards] Unclosed Anchor: [DEF:get_dashboards:Function] started at line 17
[get_dashboards] Unclosed Anchor: [DEF:get_dashboards:Function] started at line 17
[execute_migration] Unclosed Anchor at end of file (started line 42)
[execute_migration] Unclosed Anchor: [DEF:execute_migration:Function] started at line 42
[execute_migration] Unclosed Anchor: [DEF:execute_migration:Function] started at line 42
[execute_migration] Unclosed Anchor: [DEF:execute_migration:Function] started at line 42 | -| backend/src/api/routes/mappings.py | 🔴 0% | [backend.src.api.routes.mappings] Unclosed Anchor at end of file (started line 1)
[backend.src.api.routes.mappings] Unclosed Anchor: [DEF:backend.src.api.routes.mappings:Module] started at line 1
[MappingCreate] Unclosed Anchor at end of file (started line 24)
[MappingCreate] Unclosed Anchor: [DEF:MappingCreate:DataClass] started at line 24
[MappingCreate] Unclosed Anchor: [DEF:MappingCreate:DataClass] started at line 24
[MappingResponse] Unclosed Anchor at end of file (started line 34)
[MappingResponse] Unclosed Anchor: [DEF:MappingResponse:DataClass] started at line 34
[MappingResponse] Unclosed Anchor: [DEF:MappingResponse:DataClass] started at line 34
[MappingResponse] Unclosed Anchor: [DEF:MappingResponse:DataClass] started at line 34
[SuggestRequest] Unclosed Anchor at end of file (started line 48)
[SuggestRequest] Unclosed Anchor: [DEF:SuggestRequest:DataClass] started at line 48
[SuggestRequest] Unclosed Anchor: [DEF:SuggestRequest:DataClass] started at line 48
[SuggestRequest] Unclosed Anchor: [DEF:SuggestRequest:DataClass] started at line 48
[SuggestRequest] Unclosed Anchor: [DEF:SuggestRequest:DataClass] started at line 48
[get_mappings] Unclosed Anchor at end of file (started line 54)
[get_mappings] Unclosed Anchor: [DEF:get_mappings:Function] started at line 54
[get_mappings] Unclosed Anchor: [DEF:get_mappings:Function] started at line 54
[get_mappings] Unclosed Anchor: [DEF:get_mappings:Function] started at line 54
[get_mappings] Unclosed Anchor: [DEF:get_mappings:Function] started at line 54
[get_mappings] Unclosed Anchor: [DEF:get_mappings:Function] started at line 54
[create_mapping] Unclosed Anchor at end of file (started line 70)
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[suggest_mappings_api] Unclosed Anchor at end of file (started line 95)
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95 | -| generate_semantic_map.py | 🟢 100% | OK | -| backend/src/core/task_manager/manager.py | 🟢 100% | OK | -| backend/src/core/task_manager/__init__.py | 🟢 100% | OK | -| backend/src/core/task_manager/models.py | 🟢 100% | OK | -| backend/src/core/task_manager/persistence.py | 🟢 100% | OK | diff --git a/semantics/reports/semantic_report_20260101_162904.md b/semantics/reports/semantic_report_20260101_162904.md deleted file mode 100644 index 2357f31..0000000 --- a/semantics/reports/semantic_report_20260101_162904.md +++ /dev/null @@ -1,81 +0,0 @@ -# Semantic Compliance Report - -**Generated At:** 2026-01-01T16:29:04.928770 -**Global Compliance Score:** 13.4% -**Scanned Files:** 68 - -## Critical Parsing Errors -- 🔴 backend/src/core/scheduler.py:99 Mismatched closing anchor. Expected [/DEF:SchedulerService.add_backup_job:Function], found [/DEF:SchedulerService:Class]. -- 🔴 backend/src/core/scheduler.py:100 Mismatched closing anchor. Expected [/DEF:SchedulerService.add_backup_job:Function], found [/DEF:SchedulerModule:Module]. - -## File Compliance Status -| File | Score | Issues | -|------|-------|--------| -| migration_script.py | 🔴 0% | [migration_script] Unclosed Anchor at end of file (started line 1)
[migration_script] Unclosed Anchor: [DEF:migration_script:Module] started at line 1
[Migration] Unclosed Anchor at end of file (started line 25)
[Migration] Unclosed Anchor: [DEF:Migration:Class] started at line 25
[Migration] Unclosed Anchor: [DEF:Migration:Class] started at line 25
[Migration.__init__] Unclosed Anchor at end of file (started line 33)
[Migration.__init__] Unclosed Anchor: [DEF:Migration.__init__:Function] started at line 33
[Migration.__init__] Unclosed Anchor: [DEF:Migration.__init__:Function] started at line 33
[Migration.__init__] Unclosed Anchor: [DEF:Migration.__init__:Function] started at line 33
[Migration.run] Unclosed Anchor at end of file (started line 52)
[Migration.run] Unclosed Anchor: [DEF:Migration.run:Function] started at line 52
[Migration.run] Unclosed Anchor: [DEF:Migration.run:Function] started at line 52
[Migration.run] Unclosed Anchor: [DEF:Migration.run:Function] started at line 52
[Migration.run] Unclosed Anchor: [DEF:Migration.run:Function] started at line 52
[Migration.ask_delete_on_failure] Unclosed Anchor at end of file (started line 71)
[Migration.ask_delete_on_failure] Unclosed Anchor: [DEF:Migration.ask_delete_on_failure:Function] started at line 71
[Migration.ask_delete_on_failure] Unclosed Anchor: [DEF:Migration.ask_delete_on_failure:Function] started at line 71
[Migration.ask_delete_on_failure] Unclosed Anchor: [DEF:Migration.ask_delete_on_failure:Function] started at line 71
[Migration.ask_delete_on_failure] Unclosed Anchor: [DEF:Migration.ask_delete_on_failure:Function] started at line 71
[Migration.ask_delete_on_failure] Unclosed Anchor: [DEF:Migration.ask_delete_on_failure:Function] started at line 71
[Migration.select_environments] Unclosed Anchor at end of file (started line 86)
[Migration.select_environments] Unclosed Anchor: [DEF:Migration.select_environments:Function] started at line 86
[Migration.select_environments] Unclosed Anchor: [DEF:Migration.select_environments:Function] started at line 86
[Migration.select_environments] Unclosed Anchor: [DEF:Migration.select_environments:Function] started at line 86
[Migration.select_environments] Unclosed Anchor: [DEF:Migration.select_environments:Function] started at line 86
[Migration.select_environments] Unclosed Anchor: [DEF:Migration.select_environments:Function] started at line 86
[Migration.select_environments] Unclosed Anchor: [DEF:Migration.select_environments:Function] started at line 86
[Migration.select_dashboards] Unclosed Anchor at end of file (started line 127)
[Migration.select_dashboards] Unclosed Anchor: [DEF:Migration.select_dashboards:Function] started at line 127
[Migration.select_dashboards] Unclosed Anchor: [DEF:Migration.select_dashboards:Function] started at line 127
[Migration.select_dashboards] Unclosed Anchor: [DEF:Migration.select_dashboards:Function] started at line 127
[Migration.select_dashboards] Unclosed Anchor: [DEF:Migration.select_dashboards:Function] started at line 127
[Migration.select_dashboards] Unclosed Anchor: [DEF:Migration.select_dashboards:Function] started at line 127
[Migration.select_dashboards] Unclosed Anchor: [DEF:Migration.select_dashboards:Function] started at line 127
[Migration.select_dashboards] Unclosed Anchor: [DEF:Migration.select_dashboards:Function] started at line 127
[Migration.confirm_db_config_replacement] Unclosed Anchor at end of file (started line 184)
[Migration.confirm_db_config_replacement] Unclosed Anchor: [DEF:Migration.confirm_db_config_replacement:Function] started at line 184
[Migration.confirm_db_config_replacement] Unclosed Anchor: [DEF:Migration.confirm_db_config_replacement:Function] started at line 184
[Migration.confirm_db_config_replacement] Unclosed Anchor: [DEF:Migration.confirm_db_config_replacement:Function] started at line 184
[Migration.confirm_db_config_replacement] Unclosed Anchor: [DEF:Migration.confirm_db_config_replacement:Function] started at line 184
[Migration.confirm_db_config_replacement] Unclosed Anchor: [DEF:Migration.confirm_db_config_replacement:Function] started at line 184
[Migration.confirm_db_config_replacement] Unclosed Anchor: [DEF:Migration.confirm_db_config_replacement:Function] started at line 184
[Migration.confirm_db_config_replacement] Unclosed Anchor: [DEF:Migration.confirm_db_config_replacement:Function] started at line 184
[Migration.confirm_db_config_replacement] Unclosed Anchor: [DEF:Migration.confirm_db_config_replacement:Function] started at line 184
[Migration._select_databases] Unclosed Anchor at end of file (started line 219)
[Migration._select_databases] Unclosed Anchor: [DEF:Migration._select_databases:Function] started at line 219
[Migration._select_databases] Unclosed Anchor: [DEF:Migration._select_databases:Function] started at line 219
[Migration._select_databases] Unclosed Anchor: [DEF:Migration._select_databases:Function] started at line 219
[Migration._select_databases] Unclosed Anchor: [DEF:Migration._select_databases:Function] started at line 219
[Migration._select_databases] Unclosed Anchor: [DEF:Migration._select_databases:Function] started at line 219
[Migration._select_databases] Unclosed Anchor: [DEF:Migration._select_databases:Function] started at line 219
[Migration._select_databases] Unclosed Anchor: [DEF:Migration._select_databases:Function] started at line 219
[Migration._select_databases] Unclosed Anchor: [DEF:Migration._select_databases:Function] started at line 219
[Migration._select_databases] Unclosed Anchor: [DEF:Migration._select_databases:Function] started at line 219
[Migration._batch_delete_by_ids] Unclosed Anchor at end of file (started line 298)
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration.execute_migration] Unclosed Anchor at end of file (started line 324)
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324 | -| backup_script.py | 🔴 0% | [backup_script] Unclosed Anchor at end of file (started line 1)
[backup_script] Unclosed Anchor: [DEF:backup_script:Module] started at line 1
[BackupConfig] Unclosed Anchor at end of file (started line 30)
[BackupConfig] Unclosed Anchor: [DEF:BackupConfig:DataClass] started at line 30
[BackupConfig] Unclosed Anchor: [DEF:BackupConfig:DataClass] started at line 30
[backup_dashboards] Unclosed Anchor at end of file (started line 41)
[backup_dashboards] Unclosed Anchor: [DEF:backup_dashboards:Function] started at line 41
[backup_dashboards] Unclosed Anchor: [DEF:backup_dashboards:Function] started at line 41
[backup_dashboards] Unclosed Anchor: [DEF:backup_dashboards:Function] started at line 41
[main] Unclosed Anchor at end of file (started line 116)
[main] Unclosed Anchor: [DEF:main:Function] started at line 116
[main] Unclosed Anchor: [DEF:main:Function] started at line 116
[main] Unclosed Anchor: [DEF:main:Function] started at line 116
[main] Unclosed Anchor: [DEF:main:Function] started at line 116 | -| superset_tool/exceptions.py | 🔴 0% | [superset_tool.exceptions] Unclosed Anchor at end of file (started line 1)
[superset_tool.exceptions] Unclosed Anchor: [DEF:superset_tool.exceptions:Module] started at line 1
[SupersetToolError] Unclosed Anchor at end of file (started line 11)
[SupersetToolError] Unclosed Anchor: [DEF:SupersetToolError:Class] started at line 11
[SupersetToolError] Unclosed Anchor: [DEF:SupersetToolError:Class] started at line 11
[AuthenticationError] Unclosed Anchor at end of file (started line 22)
[AuthenticationError] Unclosed Anchor: [DEF:AuthenticationError:Class] started at line 22
[AuthenticationError] Unclosed Anchor: [DEF:AuthenticationError:Class] started at line 22
[AuthenticationError] Unclosed Anchor: [DEF:AuthenticationError:Class] started at line 22
[PermissionDeniedError] Unclosed Anchor at end of file (started line 32)
[PermissionDeniedError] Unclosed Anchor: [DEF:PermissionDeniedError:Class] started at line 32
[PermissionDeniedError] Unclosed Anchor: [DEF:PermissionDeniedError:Class] started at line 32
[PermissionDeniedError] Unclosed Anchor: [DEF:PermissionDeniedError:Class] started at line 32
[PermissionDeniedError] Unclosed Anchor: [DEF:PermissionDeniedError:Class] started at line 32
[SupersetAPIError] Unclosed Anchor at end of file (started line 44)
[SupersetAPIError] Unclosed Anchor: [DEF:SupersetAPIError:Class] started at line 44
[SupersetAPIError] Unclosed Anchor: [DEF:SupersetAPIError:Class] started at line 44
[SupersetAPIError] Unclosed Anchor: [DEF:SupersetAPIError:Class] started at line 44
[SupersetAPIError] Unclosed Anchor: [DEF:SupersetAPIError:Class] started at line 44
[SupersetAPIError] Unclosed Anchor: [DEF:SupersetAPIError:Class] started at line 44
[ExportError] Unclosed Anchor at end of file (started line 54)
[ExportError] Unclosed Anchor: [DEF:ExportError:Class] started at line 54
[ExportError] Unclosed Anchor: [DEF:ExportError:Class] started at line 54
[ExportError] Unclosed Anchor: [DEF:ExportError:Class] started at line 54
[ExportError] Unclosed Anchor: [DEF:ExportError:Class] started at line 54
[ExportError] Unclosed Anchor: [DEF:ExportError:Class] started at line 54
[ExportError] Unclosed Anchor: [DEF:ExportError:Class] started at line 54
[DashboardNotFoundError] Unclosed Anchor at end of file (started line 64)
[DashboardNotFoundError] Unclosed Anchor: [DEF:DashboardNotFoundError:Class] started at line 64
[DashboardNotFoundError] Unclosed Anchor: [DEF:DashboardNotFoundError:Class] started at line 64
[DashboardNotFoundError] Unclosed Anchor: [DEF:DashboardNotFoundError:Class] started at line 64
[DashboardNotFoundError] Unclosed Anchor: [DEF:DashboardNotFoundError:Class] started at line 64
[DashboardNotFoundError] Unclosed Anchor: [DEF:DashboardNotFoundError:Class] started at line 64
[DashboardNotFoundError] Unclosed Anchor: [DEF:DashboardNotFoundError:Class] started at line 64
[DashboardNotFoundError] Unclosed Anchor: [DEF:DashboardNotFoundError:Class] started at line 64
[DatasetNotFoundError] Unclosed Anchor at end of file (started line 75)
[DatasetNotFoundError] Unclosed Anchor: [DEF:DatasetNotFoundError:Class] started at line 75
[DatasetNotFoundError] Unclosed Anchor: [DEF:DatasetNotFoundError:Class] started at line 75
[DatasetNotFoundError] Unclosed Anchor: [DEF:DatasetNotFoundError:Class] started at line 75
[DatasetNotFoundError] Unclosed Anchor: [DEF:DatasetNotFoundError:Class] started at line 75
[DatasetNotFoundError] Unclosed Anchor: [DEF:DatasetNotFoundError:Class] started at line 75
[DatasetNotFoundError] Unclosed Anchor: [DEF:DatasetNotFoundError:Class] started at line 75
[DatasetNotFoundError] Unclosed Anchor: [DEF:DatasetNotFoundError:Class] started at line 75
[DatasetNotFoundError] Unclosed Anchor: [DEF:DatasetNotFoundError:Class] started at line 75
[InvalidZipFormatError] Unclosed Anchor at end of file (started line 86)
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 86
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 86
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 86
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 86
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 86
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 86
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 86
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 86
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 86
[NetworkError] Unclosed Anchor at end of file (started line 97)
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[FileOperationError] Unclosed Anchor at end of file (started line 107)
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[InvalidFileStructureError] Unclosed Anchor at end of file (started line 114)
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[ConfigurationError] Unclosed Anchor at end of file (started line 121)
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121 | -| superset_tool/__init__.py | 🔴 0% | [superset_tool] Unclosed Anchor at end of file (started line 1)
[superset_tool] Unclosed Anchor: [DEF:superset_tool:Module] started at line 1 | -| superset_tool/client.py | 🔴 0% | [superset_tool.client] Unclosed Anchor at end of file (started line 1)
[superset_tool.client] Unclosed Anchor: [DEF:superset_tool.client:Module] started at line 1
[SupersetClient] Unclosed Anchor at end of file (started line 27)
[SupersetClient] Unclosed Anchor: [DEF:SupersetClient:Class] started at line 27
[SupersetClient] Unclosed Anchor: [DEF:SupersetClient:Class] started at line 27
[SupersetClient.__init__] Unclosed Anchor at end of file (started line 32)
[SupersetClient.__init__] Unclosed Anchor: [DEF:SupersetClient.__init__:Function] started at line 32
[SupersetClient.__init__] Unclosed Anchor: [DEF:SupersetClient.__init__:Function] started at line 32
[SupersetClient.__init__] Unclosed Anchor: [DEF:SupersetClient.__init__:Function] started at line 32
[SupersetClient._validate_config] Unclosed Anchor at end of file (started line 53)
[SupersetClient._validate_config] Unclosed Anchor: [DEF:SupersetClient._validate_config:Function] started at line 53
[SupersetClient._validate_config] Unclosed Anchor: [DEF:SupersetClient._validate_config:Function] started at line 53
[SupersetClient._validate_config] Unclosed Anchor: [DEF:SupersetClient._validate_config:Function] started at line 53
[SupersetClient._validate_config] Unclosed Anchor: [DEF:SupersetClient._validate_config:Function] started at line 53
[SupersetClient.headers] Unclosed Anchor at end of file (started line 67)
[SupersetClient.headers] Unclosed Anchor: [DEF:SupersetClient.headers:Function] started at line 67
[SupersetClient.headers] Unclosed Anchor: [DEF:SupersetClient.headers:Function] started at line 67
[SupersetClient.headers] Unclosed Anchor: [DEF:SupersetClient.headers:Function] started at line 67
[SupersetClient.headers] Unclosed Anchor: [DEF:SupersetClient.headers:Function] started at line 67
[SupersetClient.headers] Unclosed Anchor: [DEF:SupersetClient.headers:Function] started at line 67
[SupersetClient.get_dashboards] Unclosed Anchor at end of file (started line 74)
[SupersetClient.get_dashboards] Unclosed Anchor: [DEF:SupersetClient.get_dashboards:Function] started at line 74
[SupersetClient.get_dashboards] Unclosed Anchor: [DEF:SupersetClient.get_dashboards:Function] started at line 74
[SupersetClient.get_dashboards] Unclosed Anchor: [DEF:SupersetClient.get_dashboards:Function] started at line 74
[SupersetClient.get_dashboards] Unclosed Anchor: [DEF:SupersetClient.get_dashboards:Function] started at line 74
[SupersetClient.get_dashboards] Unclosed Anchor: [DEF:SupersetClient.get_dashboards:Function] started at line 74
[SupersetClient.get_dashboards] Unclosed Anchor: [DEF:SupersetClient.get_dashboards:Function] started at line 74
[SupersetClient.export_dashboard] Unclosed Anchor at end of file (started line 98)
[SupersetClient.export_dashboard] Unclosed Anchor: [DEF:SupersetClient.export_dashboard:Function] started at line 98
[SupersetClient.export_dashboard] Unclosed Anchor: [DEF:SupersetClient.export_dashboard:Function] started at line 98
[SupersetClient.export_dashboard] Unclosed Anchor: [DEF:SupersetClient.export_dashboard:Function] started at line 98
[SupersetClient.export_dashboard] Unclosed Anchor: [DEF:SupersetClient.export_dashboard:Function] started at line 98
[SupersetClient.export_dashboard] Unclosed Anchor: [DEF:SupersetClient.export_dashboard:Function] started at line 98
[SupersetClient.export_dashboard] Unclosed Anchor: [DEF:SupersetClient.export_dashboard:Function] started at line 98
[SupersetClient.export_dashboard] Unclosed Anchor: [DEF:SupersetClient.export_dashboard:Function] started at line 98
[SupersetClient.import_dashboard] Unclosed Anchor at end of file (started line 123)
[SupersetClient.import_dashboard] Unclosed Anchor: [DEF:SupersetClient.import_dashboard:Function] started at line 123
[SupersetClient.import_dashboard] Unclosed Anchor: [DEF:SupersetClient.import_dashboard:Function] started at line 123
[SupersetClient.import_dashboard] Unclosed Anchor: [DEF:SupersetClient.import_dashboard:Function] started at line 123
[SupersetClient.import_dashboard] Unclosed Anchor: [DEF:SupersetClient.import_dashboard:Function] started at line 123
[SupersetClient.import_dashboard] Unclosed Anchor: [DEF:SupersetClient.import_dashboard:Function] started at line 123
[SupersetClient.import_dashboard] Unclosed Anchor: [DEF:SupersetClient.import_dashboard:Function] started at line 123
[SupersetClient.import_dashboard] Unclosed Anchor: [DEF:SupersetClient.import_dashboard:Function] started at line 123
[SupersetClient.import_dashboard] Unclosed Anchor: [DEF:SupersetClient.import_dashboard:Function] started at line 123
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor at end of file (started line 157)
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor: [DEF:SupersetClient._resolve_target_id_for_delete:Function] started at line 157
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor: [DEF:SupersetClient._resolve_target_id_for_delete:Function] started at line 157
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor: [DEF:SupersetClient._resolve_target_id_for_delete:Function] started at line 157
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor: [DEF:SupersetClient._resolve_target_id_for_delete:Function] started at line 157
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor: [DEF:SupersetClient._resolve_target_id_for_delete:Function] started at line 157
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor: [DEF:SupersetClient._resolve_target_id_for_delete:Function] started at line 157
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor: [DEF:SupersetClient._resolve_target_id_for_delete:Function] started at line 157
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor: [DEF:SupersetClient._resolve_target_id_for_delete:Function] started at line 157
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor: [DEF:SupersetClient._resolve_target_id_for_delete:Function] started at line 157
[SupersetClient._do_import] Unclosed Anchor at end of file (started line 182)
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient.delete_dashboard] Unclosed Anchor at end of file (started line 205)
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor at end of file (started line 223)
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor at end of file (started line 246)
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._validate_export_response] Unclosed Anchor at end of file (started line 269)
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._resolve_export_filename] Unclosed Anchor at end of file (started line 285)
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._validate_query_params] Unclosed Anchor at end of file (started line 303)
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._fetch_total_object_count] Unclosed Anchor at end of file (started line 315)
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_all_pages] Unclosed Anchor at end of file (started line 331)
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._validate_import_file] Unclosed Anchor at end of file (started line 345)
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient.get_datasets] Unclosed Anchor at end of file (started line 361)
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_databases] Unclosed Anchor at end of file (started line 384)
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_dataset] Unclosed Anchor at end of file (started line 408)
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_database] Unclosed Anchor at end of file (started line 425)
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.update_dataset] Unclosed Anchor at end of file (started line 442)
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442 | -| superset_tool/models.py | 🔴 0% | [superset_tool.models] Unclosed Anchor at end of file (started line 1)
[superset_tool.models] Unclosed Anchor: [DEF:superset_tool.models:Module] started at line 1
[SupersetConfig] Unclosed Anchor at end of file (started line 17)
[SupersetConfig] Unclosed Anchor: [DEF:SupersetConfig:Class] started at line 17
[SupersetConfig] Unclosed Anchor: [DEF:SupersetConfig:Class] started at line 17
[SupersetConfig.validate_auth] Unclosed Anchor at end of file (started line 28)
[SupersetConfig.validate_auth] Unclosed Anchor: [DEF:SupersetConfig.validate_auth:Function] started at line 28
[SupersetConfig.validate_auth] Unclosed Anchor: [DEF:SupersetConfig.validate_auth:Function] started at line 28
[SupersetConfig.validate_auth] Unclosed Anchor: [DEF:SupersetConfig.validate_auth:Function] started at line 28
[SupersetConfig.normalize_base_url] Unclosed Anchor at end of file (started line 42)
[SupersetConfig.normalize_base_url] Unclosed Anchor: [DEF:SupersetConfig.normalize_base_url:Function] started at line 42
[SupersetConfig.normalize_base_url] Unclosed Anchor: [DEF:SupersetConfig.normalize_base_url:Function] started at line 42
[SupersetConfig.normalize_base_url] Unclosed Anchor: [DEF:SupersetConfig.normalize_base_url:Function] started at line 42
[SupersetConfig.normalize_base_url] Unclosed Anchor: [DEF:SupersetConfig.normalize_base_url:Function] started at line 42
[DatabaseConfig] Unclosed Anchor at end of file (started line 63)
[DatabaseConfig] Unclosed Anchor: [DEF:DatabaseConfig:Class] started at line 63
[DatabaseConfig] Unclosed Anchor: [DEF:DatabaseConfig:Class] started at line 63
[DatabaseConfig] Unclosed Anchor: [DEF:DatabaseConfig:Class] started at line 63
[DatabaseConfig] Unclosed Anchor: [DEF:DatabaseConfig:Class] started at line 63
[DatabaseConfig] Unclosed Anchor: [DEF:DatabaseConfig:Class] started at line 63
[DatabaseConfig.validate_config] Unclosed Anchor at end of file (started line 70)
[DatabaseConfig.validate_config] Unclosed Anchor: [DEF:DatabaseConfig.validate_config:Function] started at line 70
[DatabaseConfig.validate_config] Unclosed Anchor: [DEF:DatabaseConfig.validate_config:Function] started at line 70
[DatabaseConfig.validate_config] Unclosed Anchor: [DEF:DatabaseConfig.validate_config:Function] started at line 70
[DatabaseConfig.validate_config] Unclosed Anchor: [DEF:DatabaseConfig.validate_config:Function] started at line 70
[DatabaseConfig.validate_config] Unclosed Anchor: [DEF:DatabaseConfig.validate_config:Function] started at line 70
[DatabaseConfig.validate_config] Unclosed Anchor: [DEF:DatabaseConfig.validate_config:Function] started at line 70 | -| superset_tool/utils/logger.py | 🔴 0% | [superset_tool.utils.logger] Unclosed Anchor at end of file (started line 1)
[superset_tool.utils.logger] Unclosed Anchor: [DEF:superset_tool.utils.logger:Module] started at line 1
[SupersetLogger] Unclosed Anchor at end of file (started line 19)
[SupersetLogger] Unclosed Anchor: [DEF:SupersetLogger:Class] started at line 19
[SupersetLogger] Unclosed Anchor: [DEF:SupersetLogger:Class] started at line 19
[SupersetLogger.__init__] Unclosed Anchor at end of file (started line 23)
[SupersetLogger.__init__] Unclosed Anchor: [DEF:SupersetLogger.__init__:Function] started at line 23
[SupersetLogger.__init__] Unclosed Anchor: [DEF:SupersetLogger.__init__:Function] started at line 23
[SupersetLogger.__init__] Unclosed Anchor: [DEF:SupersetLogger.__init__:Function] started at line 23
[SupersetLogger._log] Unclosed Anchor at end of file (started line 58)
[SupersetLogger._log] Unclosed Anchor: [DEF:SupersetLogger._log:Function] started at line 58
[SupersetLogger._log] Unclosed Anchor: [DEF:SupersetLogger._log:Function] started at line 58
[SupersetLogger._log] Unclosed Anchor: [DEF:SupersetLogger._log:Function] started at line 58
[SupersetLogger._log] Unclosed Anchor: [DEF:SupersetLogger._log:Function] started at line 58
[SupersetLogger.info] Unclosed Anchor at end of file (started line 69)
[SupersetLogger.info] Unclosed Anchor: [DEF:SupersetLogger.info:Function] started at line 69
[SupersetLogger.info] Unclosed Anchor: [DEF:SupersetLogger.info:Function] started at line 69
[SupersetLogger.info] Unclosed Anchor: [DEF:SupersetLogger.info:Function] started at line 69
[SupersetLogger.info] Unclosed Anchor: [DEF:SupersetLogger.info:Function] started at line 69
[SupersetLogger.info] Unclosed Anchor: [DEF:SupersetLogger.info:Function] started at line 69
[SupersetLogger.debug] Unclosed Anchor at end of file (started line 75)
[SupersetLogger.debug] Unclosed Anchor: [DEF:SupersetLogger.debug:Function] started at line 75
[SupersetLogger.debug] Unclosed Anchor: [DEF:SupersetLogger.debug:Function] started at line 75
[SupersetLogger.debug] Unclosed Anchor: [DEF:SupersetLogger.debug:Function] started at line 75
[SupersetLogger.debug] Unclosed Anchor: [DEF:SupersetLogger.debug:Function] started at line 75
[SupersetLogger.debug] Unclosed Anchor: [DEF:SupersetLogger.debug:Function] started at line 75
[SupersetLogger.debug] Unclosed Anchor: [DEF:SupersetLogger.debug:Function] started at line 75
[SupersetLogger.warning] Unclosed Anchor at end of file (started line 81)
[SupersetLogger.warning] Unclosed Anchor: [DEF:SupersetLogger.warning:Function] started at line 81
[SupersetLogger.warning] Unclosed Anchor: [DEF:SupersetLogger.warning:Function] started at line 81
[SupersetLogger.warning] Unclosed Anchor: [DEF:SupersetLogger.warning:Function] started at line 81
[SupersetLogger.warning] Unclosed Anchor: [DEF:SupersetLogger.warning:Function] started at line 81
[SupersetLogger.warning] Unclosed Anchor: [DEF:SupersetLogger.warning:Function] started at line 81
[SupersetLogger.warning] Unclosed Anchor: [DEF:SupersetLogger.warning:Function] started at line 81
[SupersetLogger.warning] Unclosed Anchor: [DEF:SupersetLogger.warning:Function] started at line 81
[SupersetLogger.error] Unclosed Anchor at end of file (started line 87)
[SupersetLogger.error] Unclosed Anchor: [DEF:SupersetLogger.error:Function] started at line 87
[SupersetLogger.error] Unclosed Anchor: [DEF:SupersetLogger.error:Function] started at line 87
[SupersetLogger.error] Unclosed Anchor: [DEF:SupersetLogger.error:Function] started at line 87
[SupersetLogger.error] Unclosed Anchor: [DEF:SupersetLogger.error:Function] started at line 87
[SupersetLogger.error] Unclosed Anchor: [DEF:SupersetLogger.error:Function] started at line 87
[SupersetLogger.error] Unclosed Anchor: [DEF:SupersetLogger.error:Function] started at line 87
[SupersetLogger.error] Unclosed Anchor: [DEF:SupersetLogger.error:Function] started at line 87
[SupersetLogger.error] Unclosed Anchor: [DEF:SupersetLogger.error:Function] started at line 87
[SupersetLogger.critical] Unclosed Anchor at end of file (started line 93)
[SupersetLogger.critical] Unclosed Anchor: [DEF:SupersetLogger.critical:Function] started at line 93
[SupersetLogger.critical] Unclosed Anchor: [DEF:SupersetLogger.critical:Function] started at line 93
[SupersetLogger.critical] Unclosed Anchor: [DEF:SupersetLogger.critical:Function] started at line 93
[SupersetLogger.critical] Unclosed Anchor: [DEF:SupersetLogger.critical:Function] started at line 93
[SupersetLogger.critical] Unclosed Anchor: [DEF:SupersetLogger.critical:Function] started at line 93
[SupersetLogger.critical] Unclosed Anchor: [DEF:SupersetLogger.critical:Function] started at line 93
[SupersetLogger.critical] Unclosed Anchor: [DEF:SupersetLogger.critical:Function] started at line 93
[SupersetLogger.critical] Unclosed Anchor: [DEF:SupersetLogger.critical:Function] started at line 93
[SupersetLogger.critical] Unclosed Anchor: [DEF:SupersetLogger.critical:Function] started at line 93
[SupersetLogger.exception] Unclosed Anchor at end of file (started line 99)
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99 | -| superset_tool/utils/network.py | 🔴 0% | [superset_tool.utils.network] Unclosed Anchor at end of file (started line 1)
[superset_tool.utils.network] Unclosed Anchor: [DEF:superset_tool.utils.network:Module] started at line 1
[APIClient] Unclosed Anchor at end of file (started line 24)
[APIClient] Unclosed Anchor: [DEF:APIClient:Class] started at line 24
[APIClient] Unclosed Anchor: [DEF:APIClient:Class] started at line 24
[APIClient.__init__] Unclosed Anchor at end of file (started line 29)
[APIClient.__init__] Unclosed Anchor: [DEF:APIClient.__init__:Function] started at line 29
[APIClient.__init__] Unclosed Anchor: [DEF:APIClient.__init__:Function] started at line 29
[APIClient.__init__] Unclosed Anchor: [DEF:APIClient.__init__:Function] started at line 29
[APIClient._init_session] Unclosed Anchor at end of file (started line 47)
[APIClient._init_session] Unclosed Anchor: [DEF:APIClient._init_session:Function] started at line 47
[APIClient._init_session] Unclosed Anchor: [DEF:APIClient._init_session:Function] started at line 47
[APIClient._init_session] Unclosed Anchor: [DEF:APIClient._init_session:Function] started at line 47
[APIClient._init_session] Unclosed Anchor: [DEF:APIClient._init_session:Function] started at line 47
[APIClient.authenticate] Unclosed Anchor at end of file (started line 63)
[APIClient.authenticate] Unclosed Anchor: [DEF:APIClient.authenticate:Function] started at line 63
[APIClient.authenticate] Unclosed Anchor: [DEF:APIClient.authenticate:Function] started at line 63
[APIClient.authenticate] Unclosed Anchor: [DEF:APIClient.authenticate:Function] started at line 63
[APIClient.authenticate] Unclosed Anchor: [DEF:APIClient.authenticate:Function] started at line 63
[APIClient.authenticate] Unclosed Anchor: [DEF:APIClient.authenticate:Function] started at line 63
[APIClient.headers] Unclosed Anchor at end of file (started line 92)
[APIClient.headers] Unclosed Anchor: [DEF:APIClient.headers:Function] started at line 92
[APIClient.headers] Unclosed Anchor: [DEF:APIClient.headers:Function] started at line 92
[APIClient.headers] Unclosed Anchor: [DEF:APIClient.headers:Function] started at line 92
[APIClient.headers] Unclosed Anchor: [DEF:APIClient.headers:Function] started at line 92
[APIClient.headers] Unclosed Anchor: [DEF:APIClient.headers:Function] started at line 92
[APIClient.headers] Unclosed Anchor: [DEF:APIClient.headers:Function] started at line 92
[APIClient.request] Unclosed Anchor at end of file (started line 103)
[APIClient.request] Unclosed Anchor: [DEF:APIClient.request:Function] started at line 103
[APIClient.request] Unclosed Anchor: [DEF:APIClient.request:Function] started at line 103
[APIClient.request] Unclosed Anchor: [DEF:APIClient.request:Function] started at line 103
[APIClient.request] Unclosed Anchor: [DEF:APIClient.request:Function] started at line 103
[APIClient.request] Unclosed Anchor: [DEF:APIClient.request:Function] started at line 103
[APIClient.request] Unclosed Anchor: [DEF:APIClient.request:Function] started at line 103
[APIClient.request] Unclosed Anchor: [DEF:APIClient.request:Function] started at line 103
[APIClient._handle_http_error] Unclosed Anchor at end of file (started line 126)
[APIClient._handle_http_error] Unclosed Anchor: [DEF:APIClient._handle_http_error:Function] started at line 126
[APIClient._handle_http_error] Unclosed Anchor: [DEF:APIClient._handle_http_error:Function] started at line 126
[APIClient._handle_http_error] Unclosed Anchor: [DEF:APIClient._handle_http_error:Function] started at line 126
[APIClient._handle_http_error] Unclosed Anchor: [DEF:APIClient._handle_http_error:Function] started at line 126
[APIClient._handle_http_error] Unclosed Anchor: [DEF:APIClient._handle_http_error:Function] started at line 126
[APIClient._handle_http_error] Unclosed Anchor: [DEF:APIClient._handle_http_error:Function] started at line 126
[APIClient._handle_http_error] Unclosed Anchor: [DEF:APIClient._handle_http_error:Function] started at line 126
[APIClient._handle_http_error] Unclosed Anchor: [DEF:APIClient._handle_http_error:Function] started at line 126
[APIClient._handle_network_error] Unclosed Anchor at end of file (started line 138)
[APIClient._handle_network_error] Unclosed Anchor: [DEF:APIClient._handle_network_error:Function] started at line 138
[APIClient._handle_network_error] Unclosed Anchor: [DEF:APIClient._handle_network_error:Function] started at line 138
[APIClient._handle_network_error] Unclosed Anchor: [DEF:APIClient._handle_network_error:Function] started at line 138
[APIClient._handle_network_error] Unclosed Anchor: [DEF:APIClient._handle_network_error:Function] started at line 138
[APIClient._handle_network_error] Unclosed Anchor: [DEF:APIClient._handle_network_error:Function] started at line 138
[APIClient._handle_network_error] Unclosed Anchor: [DEF:APIClient._handle_network_error:Function] started at line 138
[APIClient._handle_network_error] Unclosed Anchor: [DEF:APIClient._handle_network_error:Function] started at line 138
[APIClient._handle_network_error] Unclosed Anchor: [DEF:APIClient._handle_network_error:Function] started at line 138
[APIClient._handle_network_error] Unclosed Anchor: [DEF:APIClient._handle_network_error:Function] started at line 138
[APIClient.upload_file] Unclosed Anchor at end of file (started line 149)
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient._perform_upload] Unclosed Anchor at end of file (started line 175)
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient.fetch_paginated_count] Unclosed Anchor at end of file (started line 201)
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_data] Unclosed Anchor at end of file (started line 212)
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212 | -| superset_tool/utils/whiptail_fallback.py | 🔴 0% | [superset_tool.utils.whiptail_fallback] Unclosed Anchor at end of file (started line 1)
[superset_tool.utils.whiptail_fallback] Unclosed Anchor: [DEF:superset_tool.utils.whiptail_fallback:Module] started at line 1
[menu] Unclosed Anchor at end of file (started line 13)
[menu] Unclosed Anchor: [DEF:menu:Function] started at line 13
[menu] Unclosed Anchor: [DEF:menu:Function] started at line 13
[checklist] Unclosed Anchor at end of file (started line 31)
[checklist] Unclosed Anchor: [DEF:checklist:Function] started at line 31
[checklist] Unclosed Anchor: [DEF:checklist:Function] started at line 31
[checklist] Unclosed Anchor: [DEF:checklist:Function] started at line 31
[yesno] Unclosed Anchor at end of file (started line 51)
[yesno] Unclosed Anchor: [DEF:yesno:Function] started at line 51
[yesno] Unclosed Anchor: [DEF:yesno:Function] started at line 51
[yesno] Unclosed Anchor: [DEF:yesno:Function] started at line 51
[yesno] Unclosed Anchor: [DEF:yesno:Function] started at line 51
[msgbox] Unclosed Anchor at end of file (started line 61)
[msgbox] Unclosed Anchor: [DEF:msgbox:Function] started at line 61
[msgbox] Unclosed Anchor: [DEF:msgbox:Function] started at line 61
[msgbox] Unclosed Anchor: [DEF:msgbox:Function] started at line 61
[msgbox] Unclosed Anchor: [DEF:msgbox:Function] started at line 61
[msgbox] Unclosed Anchor: [DEF:msgbox:Function] started at line 61
[inputbox] Unclosed Anchor at end of file (started line 69)
[inputbox] Unclosed Anchor: [DEF:inputbox:Function] started at line 69
[inputbox] Unclosed Anchor: [DEF:inputbox:Function] started at line 69
[inputbox] Unclosed Anchor: [DEF:inputbox:Function] started at line 69
[inputbox] Unclosed Anchor: [DEF:inputbox:Function] started at line 69
[inputbox] Unclosed Anchor: [DEF:inputbox:Function] started at line 69
[inputbox] Unclosed Anchor: [DEF:inputbox:Function] started at line 69
[_ConsoleGauge] Unclosed Anchor at end of file (started line 80)
[_ConsoleGauge] Unclosed Anchor: [DEF:_ConsoleGauge:Class] started at line 80
[_ConsoleGauge] Unclosed Anchor: [DEF:_ConsoleGauge:Class] started at line 80
[_ConsoleGauge] Unclosed Anchor: [DEF:_ConsoleGauge:Class] started at line 80
[_ConsoleGauge] Unclosed Anchor: [DEF:_ConsoleGauge:Class] started at line 80
[_ConsoleGauge] Unclosed Anchor: [DEF:_ConsoleGauge:Class] started at line 80
[_ConsoleGauge] Unclosed Anchor: [DEF:_ConsoleGauge:Class] started at line 80
[_ConsoleGauge] Unclosed Anchor: [DEF:_ConsoleGauge:Class] started at line 80
[gauge] Unclosed Anchor at end of file (started line 96)
[gauge] Unclosed Anchor: [DEF:gauge:Function] started at line 96
[gauge] Unclosed Anchor: [DEF:gauge:Function] started at line 96
[gauge] Unclosed Anchor: [DEF:gauge:Function] started at line 96
[gauge] Unclosed Anchor: [DEF:gauge:Function] started at line 96
[gauge] Unclosed Anchor: [DEF:gauge:Function] started at line 96
[gauge] Unclosed Anchor: [DEF:gauge:Function] started at line 96
[gauge] Unclosed Anchor: [DEF:gauge:Function] started at line 96
[gauge] Unclosed Anchor: [DEF:gauge:Function] started at line 96 | -| superset_tool/utils/dataset_mapper.py | 🔴 0% | [superset_tool.utils.dataset_mapper] Unclosed Anchor at end of file (started line 1)
[superset_tool.utils.dataset_mapper] Unclosed Anchor: [DEF:superset_tool.utils.dataset_mapper:Module] started at line 1
[DatasetMapper] Unclosed Anchor at end of file (started line 20)
[DatasetMapper] Unclosed Anchor: [DEF:DatasetMapper:Class] started at line 20
[DatasetMapper] Unclosed Anchor: [DEF:DatasetMapper:Class] started at line 20
[DatasetMapper.get_postgres_comments] Unclosed Anchor at end of file (started line 26)
[DatasetMapper.get_postgres_comments] Unclosed Anchor: [DEF:DatasetMapper.get_postgres_comments:Function] started at line 26
[DatasetMapper.get_postgres_comments] Unclosed Anchor: [DEF:DatasetMapper.get_postgres_comments:Function] started at line 26
[DatasetMapper.get_postgres_comments] Unclosed Anchor: [DEF:DatasetMapper.get_postgres_comments:Function] started at line 26
[DatasetMapper.load_excel_mappings] Unclosed Anchor at end of file (started line 90)
[DatasetMapper.load_excel_mappings] Unclosed Anchor: [DEF:DatasetMapper.load_excel_mappings:Function] started at line 90
[DatasetMapper.load_excel_mappings] Unclosed Anchor: [DEF:DatasetMapper.load_excel_mappings:Function] started at line 90
[DatasetMapper.load_excel_mappings] Unclosed Anchor: [DEF:DatasetMapper.load_excel_mappings:Function] started at line 90
[DatasetMapper.load_excel_mappings] Unclosed Anchor: [DEF:DatasetMapper.load_excel_mappings:Function] started at line 90
[DatasetMapper.run_mapping] Unclosed Anchor at end of file (started line 109)
[DatasetMapper.run_mapping] Unclosed Anchor: [DEF:DatasetMapper.run_mapping:Function] started at line 109
[DatasetMapper.run_mapping] Unclosed Anchor: [DEF:DatasetMapper.run_mapping:Function] started at line 109
[DatasetMapper.run_mapping] Unclosed Anchor: [DEF:DatasetMapper.run_mapping:Function] started at line 109
[DatasetMapper.run_mapping] Unclosed Anchor: [DEF:DatasetMapper.run_mapping:Function] started at line 109
[DatasetMapper.run_mapping] Unclosed Anchor: [DEF:DatasetMapper.run_mapping:Function] started at line 109 | -| superset_tool/utils/__init__.py | 🔴 0% | [superset_tool.utils] Unclosed Anchor at end of file (started line 1)
[superset_tool.utils] Unclosed Anchor: [DEF:superset_tool.utils:Module] started at line 1 | -| superset_tool/utils/init_clients.py | 🔴 0% | [superset_tool.utils.init_clients] Unclosed Anchor at end of file (started line 1)
[superset_tool.utils.init_clients] Unclosed Anchor: [DEF:superset_tool.utils.init_clients:Module] started at line 1
[setup_clients] Unclosed Anchor at end of file (started line 20)
[setup_clients] Unclosed Anchor: [DEF:setup_clients:Function] started at line 20
[setup_clients] Unclosed Anchor: [DEF:setup_clients:Function] started at line 20 | -| superset_tool/utils/fileio.py | 🔴 0% | [superset_tool.utils.fileio] Unclosed Anchor at end of file (started line 1)
[superset_tool.utils.fileio] Unclosed Anchor: [DEF:superset_tool.utils.fileio:Module] started at line 1
[create_temp_file] Unclosed Anchor at end of file (started line 29)
[create_temp_file] Unclosed Anchor: [DEF:create_temp_file:Function] started at line 29
[create_temp_file] Unclosed Anchor: [DEF:create_temp_file:Function] started at line 29
[remove_empty_directories] Unclosed Anchor at end of file (started line 69)
[remove_empty_directories] Unclosed Anchor: [DEF:remove_empty_directories:Function] started at line 69
[remove_empty_directories] Unclosed Anchor: [DEF:remove_empty_directories:Function] started at line 69
[remove_empty_directories] Unclosed Anchor: [DEF:remove_empty_directories:Function] started at line 69
[read_dashboard_from_disk] Unclosed Anchor at end of file (started line 93)
[read_dashboard_from_disk] Unclosed Anchor: [DEF:read_dashboard_from_disk:Function] started at line 93
[read_dashboard_from_disk] Unclosed Anchor: [DEF:read_dashboard_from_disk:Function] started at line 93
[read_dashboard_from_disk] Unclosed Anchor: [DEF:read_dashboard_from_disk:Function] started at line 93
[read_dashboard_from_disk] Unclosed Anchor: [DEF:read_dashboard_from_disk:Function] started at line 93
[calculate_crc32] Unclosed Anchor at end of file (started line 110)
[calculate_crc32] Unclosed Anchor: [DEF:calculate_crc32:Function] started at line 110
[calculate_crc32] Unclosed Anchor: [DEF:calculate_crc32:Function] started at line 110
[calculate_crc32] Unclosed Anchor: [DEF:calculate_crc32:Function] started at line 110
[calculate_crc32] Unclosed Anchor: [DEF:calculate_crc32:Function] started at line 110
[calculate_crc32] Unclosed Anchor: [DEF:calculate_crc32:Function] started at line 110
[RetentionPolicy] Unclosed Anchor at end of file (started line 121)
[RetentionPolicy] Unclosed Anchor: [DEF:RetentionPolicy:DataClass] started at line 121
[RetentionPolicy] Unclosed Anchor: [DEF:RetentionPolicy:DataClass] started at line 121
[RetentionPolicy] Unclosed Anchor: [DEF:RetentionPolicy:DataClass] started at line 121
[RetentionPolicy] Unclosed Anchor: [DEF:RetentionPolicy:DataClass] started at line 121
[RetentionPolicy] Unclosed Anchor: [DEF:RetentionPolicy:DataClass] started at line 121
[RetentionPolicy] Unclosed Anchor: [DEF:RetentionPolicy:DataClass] started at line 121
[archive_exports] Unclosed Anchor at end of file (started line 130)
[archive_exports] Unclosed Anchor: [DEF:archive_exports:Function] started at line 130
[archive_exports] Unclosed Anchor: [DEF:archive_exports:Function] started at line 130
[archive_exports] Unclosed Anchor: [DEF:archive_exports:Function] started at line 130
[archive_exports] Unclosed Anchor: [DEF:archive_exports:Function] started at line 130
[archive_exports] Unclosed Anchor: [DEF:archive_exports:Function] started at line 130
[archive_exports] Unclosed Anchor: [DEF:archive_exports:Function] started at line 130
[archive_exports] Unclosed Anchor: [DEF:archive_exports:Function] started at line 130
[apply_retention_policy] Unclosed Anchor at end of file (started line 212)
[apply_retention_policy] Unclosed Anchor: [DEF:apply_retention_policy:Function] started at line 212
[apply_retention_policy] Unclosed Anchor: [DEF:apply_retention_policy:Function] started at line 212
[apply_retention_policy] Unclosed Anchor: [DEF:apply_retention_policy:Function] started at line 212
[apply_retention_policy] Unclosed Anchor: [DEF:apply_retention_policy:Function] started at line 212
[apply_retention_policy] Unclosed Anchor: [DEF:apply_retention_policy:Function] started at line 212
[apply_retention_policy] Unclosed Anchor: [DEF:apply_retention_policy:Function] started at line 212
[apply_retention_policy] Unclosed Anchor: [DEF:apply_retention_policy:Function] started at line 212
[apply_retention_policy] Unclosed Anchor: [DEF:apply_retention_policy:Function] started at line 212
[save_and_unpack_dashboard] Unclosed Anchor at end of file (started line 245)
[save_and_unpack_dashboard] Unclosed Anchor: [DEF:save_and_unpack_dashboard:Function] started at line 245
[save_and_unpack_dashboard] Unclosed Anchor: [DEF:save_and_unpack_dashboard:Function] started at line 245
[save_and_unpack_dashboard] Unclosed Anchor: [DEF:save_and_unpack_dashboard:Function] started at line 245
[save_and_unpack_dashboard] Unclosed Anchor: [DEF:save_and_unpack_dashboard:Function] started at line 245
[save_and_unpack_dashboard] Unclosed Anchor: [DEF:save_and_unpack_dashboard:Function] started at line 245
[save_and_unpack_dashboard] Unclosed Anchor: [DEF:save_and_unpack_dashboard:Function] started at line 245
[save_and_unpack_dashboard] Unclosed Anchor: [DEF:save_and_unpack_dashboard:Function] started at line 245
[save_and_unpack_dashboard] Unclosed Anchor: [DEF:save_and_unpack_dashboard:Function] started at line 245
[save_and_unpack_dashboard] Unclosed Anchor: [DEF:save_and_unpack_dashboard:Function] started at line 245
[update_yamls] Unclosed Anchor at end of file (started line 275)
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[_update_yaml_file] Unclosed Anchor at end of file (started line 296)
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[create_dashboard_export] Unclosed Anchor at end of file (started line 357)
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[sanitize_filename] Unclosed Anchor at end of file (started line 384)
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[get_filename_from_headers] Unclosed Anchor at end of file (started line 392)
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[consolidate_archive_folders] Unclosed Anchor at end of file (started line 403)
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403 | -| frontend/src/App.svelte | 🔴 0% | [App] Unclosed Anchor at end of file (started line 1)
[App] Unclosed Anchor: [DEF:App:Component] started at line 1
[handleFormSubmit] Unclosed Anchor at end of file (started line 24)
[handleFormSubmit] Unclosed Anchor: [DEF:handleFormSubmit:Function] started at line 24
[handleFormSubmit] Unclosed Anchor: [DEF:handleFormSubmit:Function] started at line 24
[navigate] Unclosed Anchor at end of file (started line 44)
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44 | -| frontend/src/main.js | 🔴 0% | [main] Unclosed Anchor at end of file (started line 1)
[main] Unclosed Anchor: [DEF:main:Module] started at line 1
[app_instance] Unclosed Anchor at end of file (started line 9)
[app_instance] Unclosed Anchor: [DEF:app_instance:Data] started at line 9
[app_instance] Unclosed Anchor: [DEF:app_instance:Data] started at line 9 | -| frontend/src/components/DashboardGrid.svelte | 🔴 0% | [DashboardGrid] Unclosed Anchor at end of file (started line 1)
[DashboardGrid] Unclosed Anchor: [DEF:DashboardGrid:Component] started at line 1
[handleSort] Unclosed Anchor at end of file (started line 62)
[handleSort] Unclosed Anchor: [DEF:handleSort:Function] started at line 62
[handleSort] Unclosed Anchor: [DEF:handleSort:Function] started at line 62
[handleSelectionChange] Unclosed Anchor at end of file (started line 74)
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectAll] Unclosed Anchor at end of file (started line 88)
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[goToPage] Unclosed Anchor at end of file (started line 106)
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106 | -| frontend/src/components/TaskHistory.svelte | 🔴 0% | [TaskHistory] Unclosed Anchor at end of file (started line 1)
[TaskHistory] Unclosed Anchor: [DEF:TaskHistory:Component] started at line 1 | -| frontend/src/components/MappingTable.svelte | 🔴 0% | [MappingTable] Unclosed Anchor at end of file (started line 1)
[MappingTable] Unclosed Anchor: [DEF:MappingTable:Component] started at line 1
[updateMapping] Unclosed Anchor at end of file (started line 25)
[updateMapping] Unclosed Anchor: [DEF:updateMapping:Function] started at line 25
[updateMapping] Unclosed Anchor: [DEF:updateMapping:Function] started at line 25
[getSuggestion] Unclosed Anchor at end of file (started line 34)
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34 | -| frontend/src/components/EnvSelector.svelte | 🔴 0% | [EnvSelector] Unclosed Anchor at end of file (started line 1)
[EnvSelector] Unclosed Anchor: [DEF:EnvSelector:Component] started at line 1
[handleSelect] Unclosed Anchor at end of file (started line 24)
[handleSelect] Unclosed Anchor: [DEF:handleSelect:Function] started at line 24
[handleSelect] Unclosed Anchor: [DEF:handleSelect:Function] started at line 24 | -| frontend/src/components/TaskList.svelte | 🔴 0% | [TaskList] Unclosed Anchor at end of file (started line 1)
[TaskList] Unclosed Anchor: [DEF:TaskList:Component] started at line 1 | -| frontend/src/components/DynamicForm.svelte | 🔴 0% | [DynamicForm] Unclosed Anchor at end of file (started line 1)
[DynamicForm] Unclosed Anchor: [DEF:DynamicForm:Component] started at line 1
[handleSubmit] Unclosed Anchor at end of file (started line 23)
[handleSubmit] Unclosed Anchor: [DEF:handleSubmit:Function] started at line 23
[handleSubmit] Unclosed Anchor: [DEF:handleSubmit:Function] started at line 23
[initializeForm] Unclosed Anchor at end of file (started line 33)
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33 | -| frontend/src/components/TaskRunner.svelte | 🔴 0% | [TaskRunner] Unclosed Anchor at end of file (started line 1)
[TaskRunner] Unclosed Anchor: [DEF:TaskRunner:Component] started at line 1
[connect] Unclosed Anchor at end of file (started line 38)
[connect] Unclosed Anchor: [DEF:connect:Function] started at line 38
[connect] Unclosed Anchor: [DEF:connect:Function] started at line 38
[onMount] Unclosed Anchor at end of file (started line 225)
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onDestroy] Unclosed Anchor at end of file (started line 251)
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251 | -| frontend/src/components/TaskLogViewer.svelte | 🔴 0% | [TaskLogViewer] Unclosed Anchor at end of file (started line 1)
[TaskLogViewer] Unclosed Anchor: [DEF:TaskLogViewer:Component] started at line 1 | -| frontend/src/components/PasswordPrompt.svelte | 🔴 0% | [PasswordPrompt] Unclosed Anchor at end of file (started line 1)
[PasswordPrompt] Unclosed Anchor: [DEF:PasswordPrompt:Component] started at line 1 | -| frontend/src/components/MissingMappingModal.svelte | 🔴 0% | [MissingMappingModal] Unclosed Anchor at end of file (started line 1)
[MissingMappingModal] Unclosed Anchor: [DEF:MissingMappingModal:Component] started at line 1
[resolve] Unclosed Anchor at end of file (started line 26)
[resolve] Unclosed Anchor: [DEF:resolve:Function] started at line 26
[resolve] Missing Mandatory Tag: @PURPOSE
[resolve] Unclosed Anchor: [DEF:resolve:Function] started at line 26
[resolve] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor at end of file (started line 38)
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE | -| frontend/src/components/Toast.svelte | 🔴 0% | [Toast] Unclosed Anchor at end of file (started line 1)
[Toast] Unclosed Anchor: [DEF:Toast:Component] started at line 1 | -| frontend/src/pages/Settings.svelte | 🔴 0% | [Settings] Unclosed Anchor at end of file (started line 1)
[Settings] Unclosed Anchor: [DEF:Settings:Component] started at line 1
[loadSettings] Unclosed Anchor at end of file (started line 50)
[loadSettings] Unclosed Anchor: [DEF:loadSettings:Function] started at line 50
[loadSettings] Unclosed Anchor: [DEF:loadSettings:Function] started at line 50
[handleSaveGlobal] Unclosed Anchor at end of file (started line 67)
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleAddOrUpdateEnv] Unclosed Anchor at end of file (started line 84)
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleDeleteEnv] Unclosed Anchor at end of file (started line 108)
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleTestEnv] Unclosed Anchor at end of file (started line 129)
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[editEnv] Unclosed Anchor at end of file (started line 152)
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[resetEnvForm] Unclosed Anchor at end of file (started line 163)
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163 | -| frontend/src/pages/Dashboard.svelte | 🔴 0% | [Dashboard] Unclosed Anchor at end of file (started line 1)
[Dashboard] Unclosed Anchor: [DEF:Dashboard:Component] started at line 1
[onMount] Unclosed Anchor at end of file (started line 17)
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 17
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 17
[selectPlugin] Unclosed Anchor at end of file (started line 27)
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27 | -| frontend/src/lib/stores.js | 🔴 0% | [stores_module] Unclosed Anchor at end of file (started line 1)
[stores_module] Unclosed Anchor: [DEF:stores_module:Module] started at line 1
[plugins] Unclosed Anchor at end of file (started line 9)
[plugins] Unclosed Anchor: [DEF:plugins:Data] started at line 9
[plugins] Unclosed Anchor: [DEF:plugins:Data] started at line 9
[tasks] Unclosed Anchor at end of file (started line 13)
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[selectedPlugin] Unclosed Anchor at end of file (started line 17)
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedTask] Unclosed Anchor at end of file (started line 21)
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[currentPage] Unclosed Anchor at end of file (started line 25)
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[taskLogs] Unclosed Anchor at end of file (started line 29)
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[fetchPlugins] Unclosed Anchor at end of file (started line 33)
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchTasks] Unclosed Anchor at end of file (started line 47)
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47 | -| frontend/src/lib/toasts.js | 🔴 0% | [toasts_module] Unclosed Anchor at end of file (started line 1)
[toasts_module] Unclosed Anchor: [DEF:toasts_module:Module] started at line 1
[toasts] Unclosed Anchor at end of file (started line 8)
[toasts] Unclosed Anchor: [DEF:toasts:Data] started at line 8
[toasts] Unclosed Anchor: [DEF:toasts:Data] started at line 8
[addToast] Unclosed Anchor at end of file (started line 12)
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[removeToast] Unclosed Anchor at end of file (started line 25)
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25 | -| frontend/src/lib/api.js | 🔴 0% | [api_module] Unclosed Anchor at end of file (started line 1)
[api_module] Unclosed Anchor: [DEF:api_module:Module] started at line 1
[fetchApi] Unclosed Anchor at end of file (started line 26)
[fetchApi] Unclosed Anchor: [DEF:fetchApi:Function] started at line 26
[fetchApi] Unclosed Anchor: [DEF:fetchApi:Function] started at line 26
[postApi] Unclosed Anchor at end of file (started line 46)
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[requestApi] Unclosed Anchor at end of file (started line 73)
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[api] Unclosed Anchor at end of file (started line 100)
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100 | -| frontend/src/routes/migration/+page.svelte | 🔴 0% | [MigrationDashboard] Unclosed Anchor at end of file (started line 1)
[MigrationDashboard] Unclosed Anchor: [DEF:MigrationDashboard:Component] started at line 1
[fetchEnvironments] Unclosed Anchor at end of file (started line 51)
[fetchEnvironments] Unclosed Anchor: [DEF:fetchEnvironments:Function] started at line 51
[fetchEnvironments] Unclosed Anchor: [DEF:fetchEnvironments:Function] started at line 51
[fetchDashboards] Unclosed Anchor at end of file (started line 69)
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDatabases] Unclosed Anchor at end of file (started line 93)
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[handleMappingUpdate] Unclosed Anchor at end of file (started line 128)
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleViewLogs] Unclosed Anchor at end of file (started line 163)
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor at end of file (started line 172)
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[startMigration] Unclosed Anchor at end of file (started line 207)
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207 | -| frontend/src/routes/migration/mappings/+page.svelte | 🔴 0% | [MappingManagement] Unclosed Anchor at end of file (started line 1)
[MappingManagement] Unclosed Anchor: [DEF:MappingManagement:Component] started at line 1
[fetchDatabases] Unclosed Anchor at end of file (started line 47)
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 47
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 47
[handleUpdate] Unclosed Anchor at end of file (started line 83)
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83 | -| backend/src/dependencies.py | 🔴 0% | [Dependencies] Unclosed Anchor at end of file (started line 1)
[Dependencies] Unclosed Anchor: [DEF:Dependencies:Module] started at line 1 | -| backend/src/app.py | 🔴 0% | [AppModule] Unclosed Anchor at end of file (started line 1)
[AppModule] Unclosed Anchor: [DEF:AppModule:Module] started at line 1
[App] Unclosed Anchor at end of file (started line 26)
[App] Unclosed Anchor: [DEF:App:Global] started at line 26
[App] Unclosed Anchor: [DEF:App:Global] started at line 26
[WebSocketEndpoint] Unclosed Anchor at end of file (started line 72)
[WebSocketEndpoint] Unclosed Anchor: [DEF:WebSocketEndpoint:Endpoint] started at line 72
[WebSocketEndpoint] Unclosed Anchor: [DEF:WebSocketEndpoint:Endpoint] started at line 72
[WebSocketEndpoint] Unclosed Anchor: [DEF:WebSocketEndpoint:Endpoint] started at line 72
[StaticFiles] Unclosed Anchor at end of file (started line 130)
[StaticFiles] Unclosed Anchor: [DEF:StaticFiles:Mount] started at line 130
[StaticFiles] Unclosed Anchor: [DEF:StaticFiles:Mount] started at line 130
[StaticFiles] Unclosed Anchor: [DEF:StaticFiles:Mount] started at line 130
[StaticFiles] Unclosed Anchor: [DEF:StaticFiles:Mount] started at line 130
[RootEndpoint] Unclosed Anchor at end of file (started line 146)
[RootEndpoint] Unclosed Anchor: [DEF:RootEndpoint:Endpoint] started at line 146
[RootEndpoint] Unclosed Anchor: [DEF:RootEndpoint:Endpoint] started at line 146
[RootEndpoint] Unclosed Anchor: [DEF:RootEndpoint:Endpoint] started at line 146
[RootEndpoint] Unclosed Anchor: [DEF:RootEndpoint:Endpoint] started at line 146
[RootEndpoint] Unclosed Anchor: [DEF:RootEndpoint:Endpoint] started at line 146 | -| backend/src/models/mapping.py | 🔴 0% | [backend.src.models.mapping] Unclosed Anchor at end of file (started line 1)
[backend.src.models.mapping] Unclosed Anchor: [DEF:backend.src.models.mapping:Module] started at line 1
[MigrationStatus] Unclosed Anchor at end of file (started line 21)
[MigrationStatus] Unclosed Anchor: [DEF:MigrationStatus:Class] started at line 21
[MigrationStatus] Unclosed Anchor: [DEF:MigrationStatus:Class] started at line 21
[Environment] Unclosed Anchor at end of file (started line 31)
[Environment] Unclosed Anchor: [DEF:Environment:Class] started at line 31
[Environment] Unclosed Anchor: [DEF:Environment:Class] started at line 31
[Environment] Unclosed Anchor: [DEF:Environment:Class] started at line 31
[DatabaseMapping] Unclosed Anchor at end of file (started line 42)
[DatabaseMapping] Unclosed Anchor: [DEF:DatabaseMapping:Class] started at line 42
[DatabaseMapping] Unclosed Anchor: [DEF:DatabaseMapping:Class] started at line 42
[DatabaseMapping] Unclosed Anchor: [DEF:DatabaseMapping:Class] started at line 42
[DatabaseMapping] Unclosed Anchor: [DEF:DatabaseMapping:Class] started at line 42
[MigrationJob] Unclosed Anchor at end of file (started line 57)
[MigrationJob] Unclosed Anchor: [DEF:MigrationJob:Class] started at line 57
[MigrationJob] Unclosed Anchor: [DEF:MigrationJob:Class] started at line 57
[MigrationJob] Unclosed Anchor: [DEF:MigrationJob:Class] started at line 57
[MigrationJob] Unclosed Anchor: [DEF:MigrationJob:Class] started at line 57
[MigrationJob] Unclosed Anchor: [DEF:MigrationJob:Class] started at line 57 | -| backend/src/models/dashboard.py | 🔴 0% | [backend.src.models.dashboard] Unclosed Anchor at end of file (started line 1)
[backend.src.models.dashboard] Unclosed Anchor: [DEF:backend.src.models.dashboard:Module] started at line 1
[DashboardMetadata] Unclosed Anchor at end of file (started line 10)
[DashboardMetadata] Unclosed Anchor: [DEF:DashboardMetadata:Class] started at line 10
[DashboardMetadata] Unclosed Anchor: [DEF:DashboardMetadata:Class] started at line 10
[DashboardSelection] Unclosed Anchor at end of file (started line 19)
[DashboardSelection] Unclosed Anchor: [DEF:DashboardSelection:Class] started at line 19
[DashboardSelection] Unclosed Anchor: [DEF:DashboardSelection:Class] started at line 19
[DashboardSelection] Unclosed Anchor: [DEF:DashboardSelection:Class] started at line 19 | -| backend/src/models/task.py | 🔴 0% | [backend.src.models.task] Unclosed Anchor at end of file (started line 1)
[backend.src.models.task] Unclosed Anchor: [DEF:backend.src.models.task:Module] started at line 1
[TaskRecord] Unclosed Anchor at end of file (started line 17)
[TaskRecord] Unclosed Anchor: [DEF:TaskRecord:Class] started at line 17
[TaskRecord] Unclosed Anchor: [DEF:TaskRecord:Class] started at line 17 | -| backend/src/services/mapping_service.py | 🔴 0% | [backend.src.services.mapping_service] Unclosed Anchor at end of file (started line 1)
[backend.src.services.mapping_service] Unclosed Anchor: [DEF:backend.src.services.mapping_service:Module] started at line 1
[MappingService] Unclosed Anchor at end of file (started line 18)
[MappingService] Unclosed Anchor: [DEF:MappingService:Class] started at line 18
[MappingService] Unclosed Anchor: [DEF:MappingService:Class] started at line 18
[MappingService.__init__] Unclosed Anchor at end of file (started line 22)
[MappingService.__init__] Unclosed Anchor: [DEF:MappingService.__init__:Function] started at line 22
[MappingService.__init__] Missing Mandatory Tag: @PURPOSE
[MappingService.__init__] Unclosed Anchor: [DEF:MappingService.__init__:Function] started at line 22
[MappingService.__init__] Missing Mandatory Tag: @PURPOSE
[MappingService.__init__] Unclosed Anchor: [DEF:MappingService.__init__:Function] started at line 22
[MappingService.__init__] Missing Mandatory Tag: @PURPOSE
[MappingService._get_client] Unclosed Anchor at end of file (started line 26)
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService.get_suggestions] Unclosed Anchor at end of file (started line 46)
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46 | -| backend/src/core/config_manager.py | 🔴 0% | [ConfigManagerModule] Unclosed Anchor at end of file (started line 1)
[ConfigManagerModule] Unclosed Anchor: [DEF:ConfigManagerModule:Module] started at line 1
[ConfigManager] Unclosed Anchor at end of file (started line 22)
[ConfigManager] Unclosed Anchor: [DEF:ConfigManager:Class] started at line 22
[ConfigManager] Unclosed Anchor: [DEF:ConfigManager:Class] started at line 22
[__init__] Unclosed Anchor at end of file (started line 27)
[__init__] Unclosed Anchor: [DEF:__init__:Function] started at line 27
[__init__] Unclosed Anchor: [DEF:__init__:Function] started at line 27
[__init__] Unclosed Anchor: [DEF:__init__:Function] started at line 27
[_load_config] Unclosed Anchor at end of file (started line 51)
[_load_config] Unclosed Anchor: [DEF:_load_config:Function] started at line 51
[_load_config] Unclosed Anchor: [DEF:_load_config:Function] started at line 51
[_load_config] Unclosed Anchor: [DEF:_load_config:Function] started at line 51
[_load_config] Unclosed Anchor: [DEF:_load_config:Function] started at line 51
[_save_config_to_disk] Unclosed Anchor at end of file (started line 83)
[_save_config_to_disk] Unclosed Anchor: [DEF:_save_config_to_disk:Function] started at line 83
[_save_config_to_disk] Unclosed Anchor: [DEF:_save_config_to_disk:Function] started at line 83
[_save_config_to_disk] Unclosed Anchor: [DEF:_save_config_to_disk:Function] started at line 83
[_save_config_to_disk] Unclosed Anchor: [DEF:_save_config_to_disk:Function] started at line 83
[_save_config_to_disk] Unclosed Anchor: [DEF:_save_config_to_disk:Function] started at line 83
[save] Unclosed Anchor at end of file (started line 102)
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[get_config] Unclosed Anchor at end of file (started line 108)
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[update_global_settings] Unclosed Anchor at end of file (started line 115)
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[validate_path] Unclosed Anchor at end of file (started line 135)
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[get_environments] Unclosed Anchor at end of file (started line 153)
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[has_environments] Unclosed Anchor at end of file (started line 160)
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[add_environment] Unclosed Anchor at end of file (started line 167)
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[update_environment] Unclosed Anchor at end of file (started line 186)
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[delete_environment] Unclosed Anchor at end of file (started line 215)
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215 | -| backend/src/core/superset_client.py | 🔴 0% | [backend.src.core.superset_client] Unclosed Anchor at end of file (started line 1)
[backend.src.core.superset_client] Unclosed Anchor: [DEF:backend.src.core.superset_client:Module] started at line 1
[SupersetClient] Unclosed Anchor at end of file (started line 16)
[SupersetClient] Unclosed Anchor: [DEF:SupersetClient:Class] started at line 16
[SupersetClient] Unclosed Anchor: [DEF:SupersetClient:Class] started at line 16
[SupersetClient.get_databases_summary] Unclosed Anchor at end of file (started line 20)
[SupersetClient.get_databases_summary] Unclosed Anchor: [DEF:SupersetClient.get_databases_summary:Function] started at line 20
[SupersetClient.get_databases_summary] Unclosed Anchor: [DEF:SupersetClient.get_databases_summary:Function] started at line 20
[SupersetClient.get_databases_summary] Unclosed Anchor: [DEF:SupersetClient.get_databases_summary:Function] started at line 20
[SupersetClient.get_database_by_uuid] Unclosed Anchor at end of file (started line 40)
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_dashboards_summary] Unclosed Anchor at end of file (started line 55)
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55 | -| backend/src/core/migration_engine.py | 🔴 0% | [backend.src.core.migration_engine] Unclosed Anchor at end of file (started line 1)
[backend.src.core.migration_engine] Unclosed Anchor: [DEF:backend.src.core.migration_engine:Module] started at line 1
[MigrationEngine] Unclosed Anchor at end of file (started line 22)
[MigrationEngine] Unclosed Anchor: [DEF:MigrationEngine:Class] started at line 22
[MigrationEngine] Unclosed Anchor: [DEF:MigrationEngine:Class] started at line 22
[MigrationEngine.transform_zip] Unclosed Anchor at end of file (started line 26)
[MigrationEngine.transform_zip] Unclosed Anchor: [DEF:MigrationEngine.transform_zip:Function] started at line 26
[MigrationEngine.transform_zip] Unclosed Anchor: [DEF:MigrationEngine.transform_zip:Function] started at line 26
[MigrationEngine.transform_zip] Unclosed Anchor: [DEF:MigrationEngine.transform_zip:Function] started at line 26
[MigrationEngine._transform_yaml] Unclosed Anchor at end of file (started line 77)
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77 | -| backend/src/core/logger.py | 🔴 0% | [LoggerModule] Unclosed Anchor at end of file (started line 1)
[LoggerModule] Unclosed Anchor: [DEF:LoggerModule:Module] started at line 1
[BeliefFormatter] Unclosed Anchor at end of file (started line 22)
[BeliefFormatter] Unclosed Anchor: [DEF:BeliefFormatter:Class] started at line 22
[BeliefFormatter] Unclosed Anchor: [DEF:BeliefFormatter:Class] started at line 22
[LogEntry] Unclosed Anchor at end of file (started line 34)
[LogEntry] Unclosed Anchor: [DEF:LogEntry:Class] started at line 34
[LogEntry] Unclosed Anchor: [DEF:LogEntry:Class] started at line 34
[LogEntry] Unclosed Anchor: [DEF:LogEntry:Class] started at line 34
[BeliefScope] Unclosed Anchor at end of file (started line 45)
[BeliefScope] Unclosed Anchor: [DEF:BeliefScope:Function] started at line 45
[BeliefScope] Unclosed Anchor: [DEF:BeliefScope:Function] started at line 45
[BeliefScope] Unclosed Anchor: [DEF:BeliefScope:Function] started at line 45
[BeliefScope] Unclosed Anchor: [DEF:BeliefScope:Function] started at line 45
[ConfigureLogger] Unclosed Anchor at end of file (started line 76)
[ConfigureLogger] Unclosed Anchor: [DEF:ConfigureLogger:Function] started at line 76
[ConfigureLogger] Unclosed Anchor: [DEF:ConfigureLogger:Function] started at line 76
[ConfigureLogger] Unclosed Anchor: [DEF:ConfigureLogger:Function] started at line 76
[ConfigureLogger] Unclosed Anchor: [DEF:ConfigureLogger:Function] started at line 76
[ConfigureLogger] Unclosed Anchor: [DEF:ConfigureLogger:Function] started at line 76
[WebSocketLogHandler] Unclosed Anchor at end of file (started line 120)
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[Logger] Unclosed Anchor at end of file (started line 163)
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163 | -| backend/src/core/database.py | 🔴 0% | [backend.src.core.database] Unclosed Anchor at end of file (started line 1)
[backend.src.core.database] Unclosed Anchor: [DEF:backend.src.core.database:Module] started at line 1
[DATABASE_URL] Unclosed Anchor at end of file (started line 20)
[DATABASE_URL] Unclosed Anchor: [DEF:DATABASE_URL:Constant] started at line 20
[DATABASE_URL] Unclosed Anchor: [DEF:DATABASE_URL:Constant] started at line 20
[TASKS_DATABASE_URL] Unclosed Anchor at end of file (started line 24)
[TASKS_DATABASE_URL] Unclosed Anchor: [DEF:TASKS_DATABASE_URL:Constant] started at line 24
[TASKS_DATABASE_URL] Unclosed Anchor: [DEF:TASKS_DATABASE_URL:Constant] started at line 24
[TASKS_DATABASE_URL] Unclosed Anchor: [DEF:TASKS_DATABASE_URL:Constant] started at line 24
[engine] Unclosed Anchor at end of file (started line 28)
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28
[tasks_engine] Unclosed Anchor at end of file (started line 32)
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[SessionLocal] Unclosed Anchor at end of file (started line 36)
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor at end of file (started line 40)
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[init_db] Unclosed Anchor at end of file (started line 44)
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[get_db] Unclosed Anchor at end of file (started line 51)
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_tasks_db] Unclosed Anchor at end of file (started line 63)
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63 | -| backend/src/core/config_models.py | 🔴 0% | [ConfigModels] Unclosed Anchor at end of file (started line 1)
[ConfigModels] Unclosed Anchor: [DEF:ConfigModels:Module] started at line 1
[Schedule] Unclosed Anchor at end of file (started line 11)
[Schedule] Unclosed Anchor: [DEF:Schedule:DataClass] started at line 11
[Schedule] Unclosed Anchor: [DEF:Schedule:DataClass] started at line 11
[Environment] Unclosed Anchor at end of file (started line 18)
[Environment] Unclosed Anchor: [DEF:Environment:DataClass] started at line 18
[Environment] Unclosed Anchor: [DEF:Environment:DataClass] started at line 18
[Environment] Unclosed Anchor: [DEF:Environment:DataClass] started at line 18
[LoggingConfig] Unclosed Anchor at end of file (started line 30)
[LoggingConfig] Unclosed Anchor: [DEF:LoggingConfig:DataClass] started at line 30
[LoggingConfig] Unclosed Anchor: [DEF:LoggingConfig:DataClass] started at line 30
[LoggingConfig] Unclosed Anchor: [DEF:LoggingConfig:DataClass] started at line 30
[LoggingConfig] Unclosed Anchor: [DEF:LoggingConfig:DataClass] started at line 30
[GlobalSettings] Unclosed Anchor at end of file (started line 40)
[GlobalSettings] Unclosed Anchor: [DEF:GlobalSettings:DataClass] started at line 40
[GlobalSettings] Unclosed Anchor: [DEF:GlobalSettings:DataClass] started at line 40
[GlobalSettings] Unclosed Anchor: [DEF:GlobalSettings:DataClass] started at line 40
[GlobalSettings] Unclosed Anchor: [DEF:GlobalSettings:DataClass] started at line 40
[GlobalSettings] Unclosed Anchor: [DEF:GlobalSettings:DataClass] started at line 40
[AppConfig] Unclosed Anchor at end of file (started line 53)
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53 | -| backend/src/core/plugin_loader.py | 🔴 0% | [PluginLoader] Unclosed Anchor at end of file (started line 8)
[PluginLoader] Unclosed Anchor: [DEF:PluginLoader:Class] started at line 8 | -| backend/src/core/plugin_base.py | 🔴 0% | [PluginBase] Unclosed Anchor at end of file (started line 6)
[PluginBase] Unclosed Anchor: [DEF:PluginBase:Class] started at line 6
[PluginConfig] Unclosed Anchor at end of file (started line 59)
[PluginConfig] Unclosed Anchor: [DEF:PluginConfig:Class] started at line 59
[PluginConfig] Unclosed Anchor: [DEF:PluginConfig:Class] started at line 59 | -| backend/src/core/utils/matching.py | 🔴 0% | [backend.src.core.utils.matching] Unclosed Anchor at end of file (started line 1)
[backend.src.core.utils.matching] Unclosed Anchor: [DEF:backend.src.core.utils.matching:Module] started at line 1
[suggest_mappings] Unclosed Anchor at end of file (started line 15)
[suggest_mappings] Unclosed Anchor: [DEF:suggest_mappings:Function] started at line 15
[suggest_mappings] Unclosed Anchor: [DEF:suggest_mappings:Function] started at line 15 | -| backend/src/core/task_manager/cleanup.py | 🔴 0% | [TaskCleanupModule] Unclosed Anchor at end of file (started line 1)
[TaskCleanupModule] Unclosed Anchor: [DEF:TaskCleanupModule:Module] started at line 1
[TaskCleanupService] Unclosed Anchor at end of file (started line 12)
[TaskCleanupService] Unclosed Anchor: [DEF:TaskCleanupService:Class] started at line 12
[TaskCleanupService] Unclosed Anchor: [DEF:TaskCleanupService:Class] started at line 12
[TaskCleanupService.run_cleanup] Unclosed Anchor at end of file (started line 19)
[TaskCleanupService.run_cleanup] Unclosed Anchor: [DEF:TaskCleanupService.run_cleanup:Function] started at line 19
[TaskCleanupService.run_cleanup] Unclosed Anchor: [DEF:TaskCleanupService.run_cleanup:Function] started at line 19
[TaskCleanupService.run_cleanup] Unclosed Anchor: [DEF:TaskCleanupService.run_cleanup:Function] started at line 19 | -| backend/src/plugins/backup.py | 🔴 0% | [BackupPlugin] Unclosed Anchor at end of file (started line 1)
[BackupPlugin] Unclosed Anchor: [DEF:BackupPlugin:Module] started at line 1 | -| backend/src/plugins/migration.py | 🔴 0% | [MigrationPlugin] Unclosed Anchor at end of file (started line 1)
[MigrationPlugin] Unclosed Anchor: [DEF:MigrationPlugin:Module] started at line 1
[MigrationPlugin.execute] Unclosed Anchor at end of file (started line 103)
[MigrationPlugin.execute] Unclosed Anchor: [DEF:MigrationPlugin.execute:Action] started at line 103
[MigrationPlugin.execute] Unclosed Anchor: [DEF:MigrationPlugin.execute:Action] started at line 103 | -| backend/src/api/auth.py | 🔴 0% | [AuthModule] Unclosed Anchor at end of file (started line 1)
[AuthModule] Unclosed Anchor: [DEF:AuthModule:Module] started at line 1 | -| backend/src/api/routes/settings.py | 🔴 0% | [SettingsRouter] Unclosed Anchor at end of file (started line 1)
[SettingsRouter] Unclosed Anchor: [DEF:SettingsRouter:Module] started at line 1
[get_settings] Unclosed Anchor at end of file (started line 26)
[get_settings] Unclosed Anchor: [DEF:get_settings:Function] started at line 26
[get_settings] Unclosed Anchor: [DEF:get_settings:Function] started at line 26
[update_global_settings] Unclosed Anchor at end of file (started line 40)
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 40
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 40
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 40
[get_environments] Unclosed Anchor at end of file (started line 54)
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 54
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 54
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 54
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 54
[add_environment] Unclosed Anchor at end of file (started line 63)
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 63
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 63
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 63
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 63
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 63
[update_environment] Unclosed Anchor at end of file (started line 96)
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[delete_environment] Unclosed Anchor at end of file (started line 139)
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[test_environment_connection] Unclosed Anchor at end of file (started line 152)
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[validate_backup_path] Unclosed Anchor at end of file (started line 195)
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195 | -| backend/src/api/routes/tasks.py | 🔴 0% | [TasksRouter] Unclosed Anchor at end of file (started line 1)
[TasksRouter] Unclosed Anchor: [DEF:TasksRouter:Module] started at line 1 | -| backend/src/api/routes/environments.py | 🔴 0% | [backend.src.api.routes.environments] Unclosed Anchor at end of file (started line 1)
[backend.src.api.routes.environments] Unclosed Anchor: [DEF:backend.src.api.routes.environments:Module] started at line 1
[ScheduleSchema] Unclosed Anchor at end of file (started line 23)
[ScheduleSchema] Unclosed Anchor: [DEF:ScheduleSchema:DataClass] started at line 23
[ScheduleSchema] Unclosed Anchor: [DEF:ScheduleSchema:DataClass] started at line 23
[EnvironmentResponse] Unclosed Anchor at end of file (started line 29)
[EnvironmentResponse] Unclosed Anchor: [DEF:EnvironmentResponse:DataClass] started at line 29
[EnvironmentResponse] Unclosed Anchor: [DEF:EnvironmentResponse:DataClass] started at line 29
[EnvironmentResponse] Unclosed Anchor: [DEF:EnvironmentResponse:DataClass] started at line 29
[DatabaseResponse] Unclosed Anchor at end of file (started line 37)
[DatabaseResponse] Unclosed Anchor: [DEF:DatabaseResponse:DataClass] started at line 37
[DatabaseResponse] Unclosed Anchor: [DEF:DatabaseResponse:DataClass] started at line 37
[DatabaseResponse] Unclosed Anchor: [DEF:DatabaseResponse:DataClass] started at line 37
[DatabaseResponse] Unclosed Anchor: [DEF:DatabaseResponse:DataClass] started at line 37
[get_environments] Unclosed Anchor at end of file (started line 44)
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 44
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 44
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 44
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 44
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 44
[update_environment_schedule] Unclosed Anchor at end of file (started line 66)
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[get_environment_databases] Unclosed Anchor at end of file (started line 94)
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94 | -| backend/src/api/routes/plugins.py | 🔴 0% | [PluginsRouter] Unclosed Anchor at end of file (started line 1)
[PluginsRouter] Unclosed Anchor: [DEF:PluginsRouter:Module] started at line 1 | -| backend/src/api/routes/migration.py | 🔴 0% | [backend.src.api.routes.migration] Unclosed Anchor at end of file (started line 1)
[backend.src.api.routes.migration] Unclosed Anchor: [DEF:backend.src.api.routes.migration:Module] started at line 1
[get_dashboards] Unclosed Anchor at end of file (started line 17)
[get_dashboards] Unclosed Anchor: [DEF:get_dashboards:Function] started at line 17
[get_dashboards] Unclosed Anchor: [DEF:get_dashboards:Function] started at line 17
[execute_migration] Unclosed Anchor at end of file (started line 42)
[execute_migration] Unclosed Anchor: [DEF:execute_migration:Function] started at line 42
[execute_migration] Unclosed Anchor: [DEF:execute_migration:Function] started at line 42
[execute_migration] Unclosed Anchor: [DEF:execute_migration:Function] started at line 42 | -| backend/src/api/routes/mappings.py | 🔴 0% | [backend.src.api.routes.mappings] Unclosed Anchor at end of file (started line 1)
[backend.src.api.routes.mappings] Unclosed Anchor: [DEF:backend.src.api.routes.mappings:Module] started at line 1
[MappingCreate] Unclosed Anchor at end of file (started line 24)
[MappingCreate] Unclosed Anchor: [DEF:MappingCreate:DataClass] started at line 24
[MappingCreate] Unclosed Anchor: [DEF:MappingCreate:DataClass] started at line 24
[MappingResponse] Unclosed Anchor at end of file (started line 34)
[MappingResponse] Unclosed Anchor: [DEF:MappingResponse:DataClass] started at line 34
[MappingResponse] Unclosed Anchor: [DEF:MappingResponse:DataClass] started at line 34
[MappingResponse] Unclosed Anchor: [DEF:MappingResponse:DataClass] started at line 34
[SuggestRequest] Unclosed Anchor at end of file (started line 48)
[SuggestRequest] Unclosed Anchor: [DEF:SuggestRequest:DataClass] started at line 48
[SuggestRequest] Unclosed Anchor: [DEF:SuggestRequest:DataClass] started at line 48
[SuggestRequest] Unclosed Anchor: [DEF:SuggestRequest:DataClass] started at line 48
[SuggestRequest] Unclosed Anchor: [DEF:SuggestRequest:DataClass] started at line 48
[get_mappings] Unclosed Anchor at end of file (started line 54)
[get_mappings] Unclosed Anchor: [DEF:get_mappings:Function] started at line 54
[get_mappings] Unclosed Anchor: [DEF:get_mappings:Function] started at line 54
[get_mappings] Unclosed Anchor: [DEF:get_mappings:Function] started at line 54
[get_mappings] Unclosed Anchor: [DEF:get_mappings:Function] started at line 54
[get_mappings] Unclosed Anchor: [DEF:get_mappings:Function] started at line 54
[create_mapping] Unclosed Anchor at end of file (started line 70)
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[suggest_mappings_api] Unclosed Anchor at end of file (started line 95)
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95 | -| backend/src/core/scheduler.py | 🔴 14% | [SchedulerModule] Unclosed Anchor at end of file (started line 1)
[SchedulerModule] Unclosed Anchor: [DEF:SchedulerModule:Module] started at line 1
[SchedulerService] Unclosed Anchor at end of file (started line 16)
[SchedulerService] Unclosed Anchor: [DEF:SchedulerService:Class] started at line 16
[SchedulerService] Unclosed Anchor: [DEF:SchedulerService:Class] started at line 16
[SchedulerService.start] Unclosed Anchor at end of file (started line 27)
[SchedulerService.start] Unclosed Anchor: [DEF:SchedulerService.start:Function] started at line 27
[SchedulerService.start] Unclosed Anchor: [DEF:SchedulerService.start:Function] started at line 27
[SchedulerService.start] Unclosed Anchor: [DEF:SchedulerService.start:Function] started at line 27
[SchedulerService.stop] Unclosed Anchor at end of file (started line 36)
[SchedulerService.stop] Unclosed Anchor: [DEF:SchedulerService.stop:Function] started at line 36
[SchedulerService.stop] Unclosed Anchor: [DEF:SchedulerService.stop:Function] started at line 36
[SchedulerService.stop] Unclosed Anchor: [DEF:SchedulerService.stop:Function] started at line 36
[SchedulerService.stop] Unclosed Anchor: [DEF:SchedulerService.stop:Function] started at line 36
[SchedulerService.load_schedules] Unclosed Anchor at end of file (started line 44)
[SchedulerService.load_schedules] Unclosed Anchor: [DEF:SchedulerService.load_schedules:Function] started at line 44
[SchedulerService.load_schedules] Unclosed Anchor: [DEF:SchedulerService.load_schedules:Function] started at line 44
[SchedulerService.load_schedules] Unclosed Anchor: [DEF:SchedulerService.load_schedules:Function] started at line 44
[SchedulerService.load_schedules] Unclosed Anchor: [DEF:SchedulerService.load_schedules:Function] started at line 44
[SchedulerService.load_schedules] Unclosed Anchor: [DEF:SchedulerService.load_schedules:Function] started at line 44
[SchedulerService.add_backup_job] Unclosed Anchor at end of file (started line 56)
[SchedulerService.add_backup_job] Unclosed Anchor: [DEF:SchedulerService.add_backup_job:Function] started at line 56
[SchedulerService.add_backup_job] Unclosed Anchor: [DEF:SchedulerService.add_backup_job:Function] started at line 56
[SchedulerService.add_backup_job] Unclosed Anchor: [DEF:SchedulerService.add_backup_job:Function] started at line 56
[SchedulerService.add_backup_job] Unclosed Anchor: [DEF:SchedulerService.add_backup_job:Function] started at line 56
[SchedulerService.add_backup_job] Unclosed Anchor: [DEF:SchedulerService.add_backup_job:Function] started at line 56
[SchedulerService.add_backup_job] Unclosed Anchor: [DEF:SchedulerService.add_backup_job:Function] started at line 56 | -| generate_semantic_map.py | 🟢 100% | OK | -| search_script.py | 🟢 100% | OK | -| get_dataset_structure.py | 🟢 100% | OK | -| debug_db_api.py | 🟢 100% | OK | -| run_mapper.py | 🟢 100% | OK | -| backend/src/core/task_manager/manager.py | 🟢 100% | OK | -| backend/src/core/task_manager/__init__.py | 🟢 100% | OK | -| backend/src/core/task_manager/models.py | 🟢 100% | OK | -| backend/src/core/task_manager/persistence.py | 🟢 100% | OK | diff --git a/semantics/reports/semantic_report_20260101_163047.md b/semantics/reports/semantic_report_20260101_163047.md deleted file mode 100644 index 3bb8370..0000000 --- a/semantics/reports/semantic_report_20260101_163047.md +++ /dev/null @@ -1,81 +0,0 @@ -# Semantic Compliance Report - -**Generated At:** 2026-01-01T16:30:47.469009 -**Global Compliance Score:** 13.7% -**Scanned Files:** 68 - -## Critical Parsing Errors -- 🔴 backend/src/core/scheduler.py:100 Mismatched closing anchor. Expected [/DEF:SchedulerService.load_schedules:Function], found [/DEF:SchedulerService:Class]. -- 🔴 backend/src/core/scheduler.py:101 Mismatched closing anchor. Expected [/DEF:SchedulerService.load_schedules:Function], found [/DEF:SchedulerModule:Module]. - -## File Compliance Status -| File | Score | Issues | -|------|-------|--------| -| migration_script.py | 🔴 0% | [migration_script] Unclosed Anchor at end of file (started line 1)
[migration_script] Unclosed Anchor: [DEF:migration_script:Module] started at line 1
[Migration] Unclosed Anchor at end of file (started line 25)
[Migration] Unclosed Anchor: [DEF:Migration:Class] started at line 25
[Migration] Unclosed Anchor: [DEF:Migration:Class] started at line 25
[Migration.__init__] Unclosed Anchor at end of file (started line 33)
[Migration.__init__] Unclosed Anchor: [DEF:Migration.__init__:Function] started at line 33
[Migration.__init__] Unclosed Anchor: [DEF:Migration.__init__:Function] started at line 33
[Migration.__init__] Unclosed Anchor: [DEF:Migration.__init__:Function] started at line 33
[Migration.run] Unclosed Anchor at end of file (started line 52)
[Migration.run] Unclosed Anchor: [DEF:Migration.run:Function] started at line 52
[Migration.run] Unclosed Anchor: [DEF:Migration.run:Function] started at line 52
[Migration.run] Unclosed Anchor: [DEF:Migration.run:Function] started at line 52
[Migration.run] Unclosed Anchor: [DEF:Migration.run:Function] started at line 52
[Migration.ask_delete_on_failure] Unclosed Anchor at end of file (started line 71)
[Migration.ask_delete_on_failure] Unclosed Anchor: [DEF:Migration.ask_delete_on_failure:Function] started at line 71
[Migration.ask_delete_on_failure] Unclosed Anchor: [DEF:Migration.ask_delete_on_failure:Function] started at line 71
[Migration.ask_delete_on_failure] Unclosed Anchor: [DEF:Migration.ask_delete_on_failure:Function] started at line 71
[Migration.ask_delete_on_failure] Unclosed Anchor: [DEF:Migration.ask_delete_on_failure:Function] started at line 71
[Migration.ask_delete_on_failure] Unclosed Anchor: [DEF:Migration.ask_delete_on_failure:Function] started at line 71
[Migration.select_environments] Unclosed Anchor at end of file (started line 86)
[Migration.select_environments] Unclosed Anchor: [DEF:Migration.select_environments:Function] started at line 86
[Migration.select_environments] Unclosed Anchor: [DEF:Migration.select_environments:Function] started at line 86
[Migration.select_environments] Unclosed Anchor: [DEF:Migration.select_environments:Function] started at line 86
[Migration.select_environments] Unclosed Anchor: [DEF:Migration.select_environments:Function] started at line 86
[Migration.select_environments] Unclosed Anchor: [DEF:Migration.select_environments:Function] started at line 86
[Migration.select_environments] Unclosed Anchor: [DEF:Migration.select_environments:Function] started at line 86
[Migration.select_dashboards] Unclosed Anchor at end of file (started line 127)
[Migration.select_dashboards] Unclosed Anchor: [DEF:Migration.select_dashboards:Function] started at line 127
[Migration.select_dashboards] Unclosed Anchor: [DEF:Migration.select_dashboards:Function] started at line 127
[Migration.select_dashboards] Unclosed Anchor: [DEF:Migration.select_dashboards:Function] started at line 127
[Migration.select_dashboards] Unclosed Anchor: [DEF:Migration.select_dashboards:Function] started at line 127
[Migration.select_dashboards] Unclosed Anchor: [DEF:Migration.select_dashboards:Function] started at line 127
[Migration.select_dashboards] Unclosed Anchor: [DEF:Migration.select_dashboards:Function] started at line 127
[Migration.select_dashboards] Unclosed Anchor: [DEF:Migration.select_dashboards:Function] started at line 127
[Migration.confirm_db_config_replacement] Unclosed Anchor at end of file (started line 184)
[Migration.confirm_db_config_replacement] Unclosed Anchor: [DEF:Migration.confirm_db_config_replacement:Function] started at line 184
[Migration.confirm_db_config_replacement] Unclosed Anchor: [DEF:Migration.confirm_db_config_replacement:Function] started at line 184
[Migration.confirm_db_config_replacement] Unclosed Anchor: [DEF:Migration.confirm_db_config_replacement:Function] started at line 184
[Migration.confirm_db_config_replacement] Unclosed Anchor: [DEF:Migration.confirm_db_config_replacement:Function] started at line 184
[Migration.confirm_db_config_replacement] Unclosed Anchor: [DEF:Migration.confirm_db_config_replacement:Function] started at line 184
[Migration.confirm_db_config_replacement] Unclosed Anchor: [DEF:Migration.confirm_db_config_replacement:Function] started at line 184
[Migration.confirm_db_config_replacement] Unclosed Anchor: [DEF:Migration.confirm_db_config_replacement:Function] started at line 184
[Migration.confirm_db_config_replacement] Unclosed Anchor: [DEF:Migration.confirm_db_config_replacement:Function] started at line 184
[Migration._select_databases] Unclosed Anchor at end of file (started line 219)
[Migration._select_databases] Unclosed Anchor: [DEF:Migration._select_databases:Function] started at line 219
[Migration._select_databases] Unclosed Anchor: [DEF:Migration._select_databases:Function] started at line 219
[Migration._select_databases] Unclosed Anchor: [DEF:Migration._select_databases:Function] started at line 219
[Migration._select_databases] Unclosed Anchor: [DEF:Migration._select_databases:Function] started at line 219
[Migration._select_databases] Unclosed Anchor: [DEF:Migration._select_databases:Function] started at line 219
[Migration._select_databases] Unclosed Anchor: [DEF:Migration._select_databases:Function] started at line 219
[Migration._select_databases] Unclosed Anchor: [DEF:Migration._select_databases:Function] started at line 219
[Migration._select_databases] Unclosed Anchor: [DEF:Migration._select_databases:Function] started at line 219
[Migration._select_databases] Unclosed Anchor: [DEF:Migration._select_databases:Function] started at line 219
[Migration._batch_delete_by_ids] Unclosed Anchor at end of file (started line 298)
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration._batch_delete_by_ids] Unclosed Anchor: [DEF:Migration._batch_delete_by_ids:Function] started at line 298
[Migration.execute_migration] Unclosed Anchor at end of file (started line 324)
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324
[Migration.execute_migration] Unclosed Anchor: [DEF:Migration.execute_migration:Function] started at line 324 | -| backup_script.py | 🔴 0% | [backup_script] Unclosed Anchor at end of file (started line 1)
[backup_script] Unclosed Anchor: [DEF:backup_script:Module] started at line 1
[BackupConfig] Unclosed Anchor at end of file (started line 30)
[BackupConfig] Unclosed Anchor: [DEF:BackupConfig:DataClass] started at line 30
[BackupConfig] Unclosed Anchor: [DEF:BackupConfig:DataClass] started at line 30
[backup_dashboards] Unclosed Anchor at end of file (started line 41)
[backup_dashboards] Unclosed Anchor: [DEF:backup_dashboards:Function] started at line 41
[backup_dashboards] Unclosed Anchor: [DEF:backup_dashboards:Function] started at line 41
[backup_dashboards] Unclosed Anchor: [DEF:backup_dashboards:Function] started at line 41
[main] Unclosed Anchor at end of file (started line 116)
[main] Unclosed Anchor: [DEF:main:Function] started at line 116
[main] Unclosed Anchor: [DEF:main:Function] started at line 116
[main] Unclosed Anchor: [DEF:main:Function] started at line 116
[main] Unclosed Anchor: [DEF:main:Function] started at line 116 | -| superset_tool/exceptions.py | 🔴 0% | [superset_tool.exceptions] Unclosed Anchor at end of file (started line 1)
[superset_tool.exceptions] Unclosed Anchor: [DEF:superset_tool.exceptions:Module] started at line 1
[SupersetToolError] Unclosed Anchor at end of file (started line 11)
[SupersetToolError] Unclosed Anchor: [DEF:SupersetToolError:Class] started at line 11
[SupersetToolError] Unclosed Anchor: [DEF:SupersetToolError:Class] started at line 11
[AuthenticationError] Unclosed Anchor at end of file (started line 22)
[AuthenticationError] Unclosed Anchor: [DEF:AuthenticationError:Class] started at line 22
[AuthenticationError] Unclosed Anchor: [DEF:AuthenticationError:Class] started at line 22
[AuthenticationError] Unclosed Anchor: [DEF:AuthenticationError:Class] started at line 22
[PermissionDeniedError] Unclosed Anchor at end of file (started line 32)
[PermissionDeniedError] Unclosed Anchor: [DEF:PermissionDeniedError:Class] started at line 32
[PermissionDeniedError] Unclosed Anchor: [DEF:PermissionDeniedError:Class] started at line 32
[PermissionDeniedError] Unclosed Anchor: [DEF:PermissionDeniedError:Class] started at line 32
[PermissionDeniedError] Unclosed Anchor: [DEF:PermissionDeniedError:Class] started at line 32
[SupersetAPIError] Unclosed Anchor at end of file (started line 44)
[SupersetAPIError] Unclosed Anchor: [DEF:SupersetAPIError:Class] started at line 44
[SupersetAPIError] Unclosed Anchor: [DEF:SupersetAPIError:Class] started at line 44
[SupersetAPIError] Unclosed Anchor: [DEF:SupersetAPIError:Class] started at line 44
[SupersetAPIError] Unclosed Anchor: [DEF:SupersetAPIError:Class] started at line 44
[SupersetAPIError] Unclosed Anchor: [DEF:SupersetAPIError:Class] started at line 44
[ExportError] Unclosed Anchor at end of file (started line 54)
[ExportError] Unclosed Anchor: [DEF:ExportError:Class] started at line 54
[ExportError] Unclosed Anchor: [DEF:ExportError:Class] started at line 54
[ExportError] Unclosed Anchor: [DEF:ExportError:Class] started at line 54
[ExportError] Unclosed Anchor: [DEF:ExportError:Class] started at line 54
[ExportError] Unclosed Anchor: [DEF:ExportError:Class] started at line 54
[ExportError] Unclosed Anchor: [DEF:ExportError:Class] started at line 54
[DashboardNotFoundError] Unclosed Anchor at end of file (started line 64)
[DashboardNotFoundError] Unclosed Anchor: [DEF:DashboardNotFoundError:Class] started at line 64
[DashboardNotFoundError] Unclosed Anchor: [DEF:DashboardNotFoundError:Class] started at line 64
[DashboardNotFoundError] Unclosed Anchor: [DEF:DashboardNotFoundError:Class] started at line 64
[DashboardNotFoundError] Unclosed Anchor: [DEF:DashboardNotFoundError:Class] started at line 64
[DashboardNotFoundError] Unclosed Anchor: [DEF:DashboardNotFoundError:Class] started at line 64
[DashboardNotFoundError] Unclosed Anchor: [DEF:DashboardNotFoundError:Class] started at line 64
[DashboardNotFoundError] Unclosed Anchor: [DEF:DashboardNotFoundError:Class] started at line 64
[DatasetNotFoundError] Unclosed Anchor at end of file (started line 75)
[DatasetNotFoundError] Unclosed Anchor: [DEF:DatasetNotFoundError:Class] started at line 75
[DatasetNotFoundError] Unclosed Anchor: [DEF:DatasetNotFoundError:Class] started at line 75
[DatasetNotFoundError] Unclosed Anchor: [DEF:DatasetNotFoundError:Class] started at line 75
[DatasetNotFoundError] Unclosed Anchor: [DEF:DatasetNotFoundError:Class] started at line 75
[DatasetNotFoundError] Unclosed Anchor: [DEF:DatasetNotFoundError:Class] started at line 75
[DatasetNotFoundError] Unclosed Anchor: [DEF:DatasetNotFoundError:Class] started at line 75
[DatasetNotFoundError] Unclosed Anchor: [DEF:DatasetNotFoundError:Class] started at line 75
[DatasetNotFoundError] Unclosed Anchor: [DEF:DatasetNotFoundError:Class] started at line 75
[InvalidZipFormatError] Unclosed Anchor at end of file (started line 86)
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 86
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 86
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 86
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 86
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 86
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 86
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 86
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 86
[InvalidZipFormatError] Unclosed Anchor: [DEF:InvalidZipFormatError:Class] started at line 86
[NetworkError] Unclosed Anchor at end of file (started line 97)
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[NetworkError] Unclosed Anchor: [DEF:NetworkError:Class] started at line 97
[FileOperationError] Unclosed Anchor at end of file (started line 107)
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[FileOperationError] Unclosed Anchor: [DEF:FileOperationError:Class] started at line 107
[InvalidFileStructureError] Unclosed Anchor at end of file (started line 114)
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[InvalidFileStructureError] Unclosed Anchor: [DEF:InvalidFileStructureError:Class] started at line 114
[ConfigurationError] Unclosed Anchor at end of file (started line 121)
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121
[ConfigurationError] Unclosed Anchor: [DEF:ConfigurationError:Class] started at line 121 | -| superset_tool/__init__.py | 🔴 0% | [superset_tool] Unclosed Anchor at end of file (started line 1)
[superset_tool] Unclosed Anchor: [DEF:superset_tool:Module] started at line 1 | -| superset_tool/client.py | 🔴 0% | [superset_tool.client] Unclosed Anchor at end of file (started line 1)
[superset_tool.client] Unclosed Anchor: [DEF:superset_tool.client:Module] started at line 1
[SupersetClient] Unclosed Anchor at end of file (started line 27)
[SupersetClient] Unclosed Anchor: [DEF:SupersetClient:Class] started at line 27
[SupersetClient] Unclosed Anchor: [DEF:SupersetClient:Class] started at line 27
[SupersetClient.__init__] Unclosed Anchor at end of file (started line 32)
[SupersetClient.__init__] Unclosed Anchor: [DEF:SupersetClient.__init__:Function] started at line 32
[SupersetClient.__init__] Unclosed Anchor: [DEF:SupersetClient.__init__:Function] started at line 32
[SupersetClient.__init__] Unclosed Anchor: [DEF:SupersetClient.__init__:Function] started at line 32
[SupersetClient._validate_config] Unclosed Anchor at end of file (started line 53)
[SupersetClient._validate_config] Unclosed Anchor: [DEF:SupersetClient._validate_config:Function] started at line 53
[SupersetClient._validate_config] Unclosed Anchor: [DEF:SupersetClient._validate_config:Function] started at line 53
[SupersetClient._validate_config] Unclosed Anchor: [DEF:SupersetClient._validate_config:Function] started at line 53
[SupersetClient._validate_config] Unclosed Anchor: [DEF:SupersetClient._validate_config:Function] started at line 53
[SupersetClient.headers] Unclosed Anchor at end of file (started line 67)
[SupersetClient.headers] Unclosed Anchor: [DEF:SupersetClient.headers:Function] started at line 67
[SupersetClient.headers] Unclosed Anchor: [DEF:SupersetClient.headers:Function] started at line 67
[SupersetClient.headers] Unclosed Anchor: [DEF:SupersetClient.headers:Function] started at line 67
[SupersetClient.headers] Unclosed Anchor: [DEF:SupersetClient.headers:Function] started at line 67
[SupersetClient.headers] Unclosed Anchor: [DEF:SupersetClient.headers:Function] started at line 67
[SupersetClient.get_dashboards] Unclosed Anchor at end of file (started line 74)
[SupersetClient.get_dashboards] Unclosed Anchor: [DEF:SupersetClient.get_dashboards:Function] started at line 74
[SupersetClient.get_dashboards] Unclosed Anchor: [DEF:SupersetClient.get_dashboards:Function] started at line 74
[SupersetClient.get_dashboards] Unclosed Anchor: [DEF:SupersetClient.get_dashboards:Function] started at line 74
[SupersetClient.get_dashboards] Unclosed Anchor: [DEF:SupersetClient.get_dashboards:Function] started at line 74
[SupersetClient.get_dashboards] Unclosed Anchor: [DEF:SupersetClient.get_dashboards:Function] started at line 74
[SupersetClient.get_dashboards] Unclosed Anchor: [DEF:SupersetClient.get_dashboards:Function] started at line 74
[SupersetClient.export_dashboard] Unclosed Anchor at end of file (started line 98)
[SupersetClient.export_dashboard] Unclosed Anchor: [DEF:SupersetClient.export_dashboard:Function] started at line 98
[SupersetClient.export_dashboard] Unclosed Anchor: [DEF:SupersetClient.export_dashboard:Function] started at line 98
[SupersetClient.export_dashboard] Unclosed Anchor: [DEF:SupersetClient.export_dashboard:Function] started at line 98
[SupersetClient.export_dashboard] Unclosed Anchor: [DEF:SupersetClient.export_dashboard:Function] started at line 98
[SupersetClient.export_dashboard] Unclosed Anchor: [DEF:SupersetClient.export_dashboard:Function] started at line 98
[SupersetClient.export_dashboard] Unclosed Anchor: [DEF:SupersetClient.export_dashboard:Function] started at line 98
[SupersetClient.export_dashboard] Unclosed Anchor: [DEF:SupersetClient.export_dashboard:Function] started at line 98
[SupersetClient.import_dashboard] Unclosed Anchor at end of file (started line 123)
[SupersetClient.import_dashboard] Unclosed Anchor: [DEF:SupersetClient.import_dashboard:Function] started at line 123
[SupersetClient.import_dashboard] Unclosed Anchor: [DEF:SupersetClient.import_dashboard:Function] started at line 123
[SupersetClient.import_dashboard] Unclosed Anchor: [DEF:SupersetClient.import_dashboard:Function] started at line 123
[SupersetClient.import_dashboard] Unclosed Anchor: [DEF:SupersetClient.import_dashboard:Function] started at line 123
[SupersetClient.import_dashboard] Unclosed Anchor: [DEF:SupersetClient.import_dashboard:Function] started at line 123
[SupersetClient.import_dashboard] Unclosed Anchor: [DEF:SupersetClient.import_dashboard:Function] started at line 123
[SupersetClient.import_dashboard] Unclosed Anchor: [DEF:SupersetClient.import_dashboard:Function] started at line 123
[SupersetClient.import_dashboard] Unclosed Anchor: [DEF:SupersetClient.import_dashboard:Function] started at line 123
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor at end of file (started line 157)
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor: [DEF:SupersetClient._resolve_target_id_for_delete:Function] started at line 157
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor: [DEF:SupersetClient._resolve_target_id_for_delete:Function] started at line 157
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor: [DEF:SupersetClient._resolve_target_id_for_delete:Function] started at line 157
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor: [DEF:SupersetClient._resolve_target_id_for_delete:Function] started at line 157
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor: [DEF:SupersetClient._resolve_target_id_for_delete:Function] started at line 157
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor: [DEF:SupersetClient._resolve_target_id_for_delete:Function] started at line 157
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor: [DEF:SupersetClient._resolve_target_id_for_delete:Function] started at line 157
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor: [DEF:SupersetClient._resolve_target_id_for_delete:Function] started at line 157
[SupersetClient._resolve_target_id_for_delete] Unclosed Anchor: [DEF:SupersetClient._resolve_target_id_for_delete:Function] started at line 157
[SupersetClient._do_import] Unclosed Anchor at end of file (started line 182)
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient._do_import] Unclosed Anchor: [DEF:SupersetClient._do_import:Function] started at line 182
[SupersetClient.delete_dashboard] Unclosed Anchor at end of file (started line 205)
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient.delete_dashboard] Unclosed Anchor: [DEF:SupersetClient.delete_dashboard:Function] started at line 205
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor at end of file (started line 223)
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_id_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_id_from_zip:Function] started at line 223
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor at end of file (started line 246)
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._extract_dashboard_slug_from_zip] Unclosed Anchor: [DEF:SupersetClient._extract_dashboard_slug_from_zip:Function] started at line 246
[SupersetClient._validate_export_response] Unclosed Anchor at end of file (started line 269)
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._validate_export_response] Unclosed Anchor: [DEF:SupersetClient._validate_export_response:Function] started at line 269
[SupersetClient._resolve_export_filename] Unclosed Anchor at end of file (started line 285)
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._resolve_export_filename] Unclosed Anchor: [DEF:SupersetClient._resolve_export_filename:Function] started at line 285
[SupersetClient._validate_query_params] Unclosed Anchor at end of file (started line 303)
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._validate_query_params] Unclosed Anchor: [DEF:SupersetClient._validate_query_params:Function] started at line 303
[SupersetClient._fetch_total_object_count] Unclosed Anchor at end of file (started line 315)
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_total_object_count] Unclosed Anchor: [DEF:SupersetClient._fetch_total_object_count:Function] started at line 315
[SupersetClient._fetch_all_pages] Unclosed Anchor at end of file (started line 331)
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._fetch_all_pages] Unclosed Anchor: [DEF:SupersetClient._fetch_all_pages:Function] started at line 331
[SupersetClient._validate_import_file] Unclosed Anchor at end of file (started line 345)
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient._validate_import_file] Unclosed Anchor: [DEF:SupersetClient._validate_import_file:Function] started at line 345
[SupersetClient.get_datasets] Unclosed Anchor at end of file (started line 361)
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_datasets] Unclosed Anchor: [DEF:SupersetClient.get_datasets:Function] started at line 361
[SupersetClient.get_databases] Unclosed Anchor at end of file (started line 384)
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_databases] Unclosed Anchor: [DEF:SupersetClient.get_databases:Function] started at line 384
[SupersetClient.get_dataset] Unclosed Anchor at end of file (started line 408)
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_dataset] Unclosed Anchor: [DEF:SupersetClient.get_dataset:Function] started at line 408
[SupersetClient.get_database] Unclosed Anchor at end of file (started line 425)
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.get_database] Unclosed Anchor: [DEF:SupersetClient.get_database:Function] started at line 425
[SupersetClient.update_dataset] Unclosed Anchor at end of file (started line 442)
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442
[SupersetClient.update_dataset] Unclosed Anchor: [DEF:SupersetClient.update_dataset:Function] started at line 442 | -| superset_tool/models.py | 🔴 0% | [superset_tool.models] Unclosed Anchor at end of file (started line 1)
[superset_tool.models] Unclosed Anchor: [DEF:superset_tool.models:Module] started at line 1
[SupersetConfig] Unclosed Anchor at end of file (started line 17)
[SupersetConfig] Unclosed Anchor: [DEF:SupersetConfig:Class] started at line 17
[SupersetConfig] Unclosed Anchor: [DEF:SupersetConfig:Class] started at line 17
[SupersetConfig.validate_auth] Unclosed Anchor at end of file (started line 28)
[SupersetConfig.validate_auth] Unclosed Anchor: [DEF:SupersetConfig.validate_auth:Function] started at line 28
[SupersetConfig.validate_auth] Unclosed Anchor: [DEF:SupersetConfig.validate_auth:Function] started at line 28
[SupersetConfig.validate_auth] Unclosed Anchor: [DEF:SupersetConfig.validate_auth:Function] started at line 28
[SupersetConfig.normalize_base_url] Unclosed Anchor at end of file (started line 42)
[SupersetConfig.normalize_base_url] Unclosed Anchor: [DEF:SupersetConfig.normalize_base_url:Function] started at line 42
[SupersetConfig.normalize_base_url] Unclosed Anchor: [DEF:SupersetConfig.normalize_base_url:Function] started at line 42
[SupersetConfig.normalize_base_url] Unclosed Anchor: [DEF:SupersetConfig.normalize_base_url:Function] started at line 42
[SupersetConfig.normalize_base_url] Unclosed Anchor: [DEF:SupersetConfig.normalize_base_url:Function] started at line 42
[DatabaseConfig] Unclosed Anchor at end of file (started line 63)
[DatabaseConfig] Unclosed Anchor: [DEF:DatabaseConfig:Class] started at line 63
[DatabaseConfig] Unclosed Anchor: [DEF:DatabaseConfig:Class] started at line 63
[DatabaseConfig] Unclosed Anchor: [DEF:DatabaseConfig:Class] started at line 63
[DatabaseConfig] Unclosed Anchor: [DEF:DatabaseConfig:Class] started at line 63
[DatabaseConfig] Unclosed Anchor: [DEF:DatabaseConfig:Class] started at line 63
[DatabaseConfig.validate_config] Unclosed Anchor at end of file (started line 70)
[DatabaseConfig.validate_config] Unclosed Anchor: [DEF:DatabaseConfig.validate_config:Function] started at line 70
[DatabaseConfig.validate_config] Unclosed Anchor: [DEF:DatabaseConfig.validate_config:Function] started at line 70
[DatabaseConfig.validate_config] Unclosed Anchor: [DEF:DatabaseConfig.validate_config:Function] started at line 70
[DatabaseConfig.validate_config] Unclosed Anchor: [DEF:DatabaseConfig.validate_config:Function] started at line 70
[DatabaseConfig.validate_config] Unclosed Anchor: [DEF:DatabaseConfig.validate_config:Function] started at line 70
[DatabaseConfig.validate_config] Unclosed Anchor: [DEF:DatabaseConfig.validate_config:Function] started at line 70 | -| superset_tool/utils/logger.py | 🔴 0% | [superset_tool.utils.logger] Unclosed Anchor at end of file (started line 1)
[superset_tool.utils.logger] Unclosed Anchor: [DEF:superset_tool.utils.logger:Module] started at line 1
[SupersetLogger] Unclosed Anchor at end of file (started line 19)
[SupersetLogger] Unclosed Anchor: [DEF:SupersetLogger:Class] started at line 19
[SupersetLogger] Unclosed Anchor: [DEF:SupersetLogger:Class] started at line 19
[SupersetLogger.__init__] Unclosed Anchor at end of file (started line 23)
[SupersetLogger.__init__] Unclosed Anchor: [DEF:SupersetLogger.__init__:Function] started at line 23
[SupersetLogger.__init__] Unclosed Anchor: [DEF:SupersetLogger.__init__:Function] started at line 23
[SupersetLogger.__init__] Unclosed Anchor: [DEF:SupersetLogger.__init__:Function] started at line 23
[SupersetLogger._log] Unclosed Anchor at end of file (started line 58)
[SupersetLogger._log] Unclosed Anchor: [DEF:SupersetLogger._log:Function] started at line 58
[SupersetLogger._log] Unclosed Anchor: [DEF:SupersetLogger._log:Function] started at line 58
[SupersetLogger._log] Unclosed Anchor: [DEF:SupersetLogger._log:Function] started at line 58
[SupersetLogger._log] Unclosed Anchor: [DEF:SupersetLogger._log:Function] started at line 58
[SupersetLogger.info] Unclosed Anchor at end of file (started line 69)
[SupersetLogger.info] Unclosed Anchor: [DEF:SupersetLogger.info:Function] started at line 69
[SupersetLogger.info] Unclosed Anchor: [DEF:SupersetLogger.info:Function] started at line 69
[SupersetLogger.info] Unclosed Anchor: [DEF:SupersetLogger.info:Function] started at line 69
[SupersetLogger.info] Unclosed Anchor: [DEF:SupersetLogger.info:Function] started at line 69
[SupersetLogger.info] Unclosed Anchor: [DEF:SupersetLogger.info:Function] started at line 69
[SupersetLogger.debug] Unclosed Anchor at end of file (started line 75)
[SupersetLogger.debug] Unclosed Anchor: [DEF:SupersetLogger.debug:Function] started at line 75
[SupersetLogger.debug] Unclosed Anchor: [DEF:SupersetLogger.debug:Function] started at line 75
[SupersetLogger.debug] Unclosed Anchor: [DEF:SupersetLogger.debug:Function] started at line 75
[SupersetLogger.debug] Unclosed Anchor: [DEF:SupersetLogger.debug:Function] started at line 75
[SupersetLogger.debug] Unclosed Anchor: [DEF:SupersetLogger.debug:Function] started at line 75
[SupersetLogger.debug] Unclosed Anchor: [DEF:SupersetLogger.debug:Function] started at line 75
[SupersetLogger.warning] Unclosed Anchor at end of file (started line 81)
[SupersetLogger.warning] Unclosed Anchor: [DEF:SupersetLogger.warning:Function] started at line 81
[SupersetLogger.warning] Unclosed Anchor: [DEF:SupersetLogger.warning:Function] started at line 81
[SupersetLogger.warning] Unclosed Anchor: [DEF:SupersetLogger.warning:Function] started at line 81
[SupersetLogger.warning] Unclosed Anchor: [DEF:SupersetLogger.warning:Function] started at line 81
[SupersetLogger.warning] Unclosed Anchor: [DEF:SupersetLogger.warning:Function] started at line 81
[SupersetLogger.warning] Unclosed Anchor: [DEF:SupersetLogger.warning:Function] started at line 81
[SupersetLogger.warning] Unclosed Anchor: [DEF:SupersetLogger.warning:Function] started at line 81
[SupersetLogger.error] Unclosed Anchor at end of file (started line 87)
[SupersetLogger.error] Unclosed Anchor: [DEF:SupersetLogger.error:Function] started at line 87
[SupersetLogger.error] Unclosed Anchor: [DEF:SupersetLogger.error:Function] started at line 87
[SupersetLogger.error] Unclosed Anchor: [DEF:SupersetLogger.error:Function] started at line 87
[SupersetLogger.error] Unclosed Anchor: [DEF:SupersetLogger.error:Function] started at line 87
[SupersetLogger.error] Unclosed Anchor: [DEF:SupersetLogger.error:Function] started at line 87
[SupersetLogger.error] Unclosed Anchor: [DEF:SupersetLogger.error:Function] started at line 87
[SupersetLogger.error] Unclosed Anchor: [DEF:SupersetLogger.error:Function] started at line 87
[SupersetLogger.error] Unclosed Anchor: [DEF:SupersetLogger.error:Function] started at line 87
[SupersetLogger.critical] Unclosed Anchor at end of file (started line 93)
[SupersetLogger.critical] Unclosed Anchor: [DEF:SupersetLogger.critical:Function] started at line 93
[SupersetLogger.critical] Unclosed Anchor: [DEF:SupersetLogger.critical:Function] started at line 93
[SupersetLogger.critical] Unclosed Anchor: [DEF:SupersetLogger.critical:Function] started at line 93
[SupersetLogger.critical] Unclosed Anchor: [DEF:SupersetLogger.critical:Function] started at line 93
[SupersetLogger.critical] Unclosed Anchor: [DEF:SupersetLogger.critical:Function] started at line 93
[SupersetLogger.critical] Unclosed Anchor: [DEF:SupersetLogger.critical:Function] started at line 93
[SupersetLogger.critical] Unclosed Anchor: [DEF:SupersetLogger.critical:Function] started at line 93
[SupersetLogger.critical] Unclosed Anchor: [DEF:SupersetLogger.critical:Function] started at line 93
[SupersetLogger.critical] Unclosed Anchor: [DEF:SupersetLogger.critical:Function] started at line 93
[SupersetLogger.exception] Unclosed Anchor at end of file (started line 99)
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99
[SupersetLogger.exception] Unclosed Anchor: [DEF:SupersetLogger.exception:Function] started at line 99 | -| superset_tool/utils/network.py | 🔴 0% | [superset_tool.utils.network] Unclosed Anchor at end of file (started line 1)
[superset_tool.utils.network] Unclosed Anchor: [DEF:superset_tool.utils.network:Module] started at line 1
[APIClient] Unclosed Anchor at end of file (started line 24)
[APIClient] Unclosed Anchor: [DEF:APIClient:Class] started at line 24
[APIClient] Unclosed Anchor: [DEF:APIClient:Class] started at line 24
[APIClient.__init__] Unclosed Anchor at end of file (started line 29)
[APIClient.__init__] Unclosed Anchor: [DEF:APIClient.__init__:Function] started at line 29
[APIClient.__init__] Unclosed Anchor: [DEF:APIClient.__init__:Function] started at line 29
[APIClient.__init__] Unclosed Anchor: [DEF:APIClient.__init__:Function] started at line 29
[APIClient._init_session] Unclosed Anchor at end of file (started line 47)
[APIClient._init_session] Unclosed Anchor: [DEF:APIClient._init_session:Function] started at line 47
[APIClient._init_session] Unclosed Anchor: [DEF:APIClient._init_session:Function] started at line 47
[APIClient._init_session] Unclosed Anchor: [DEF:APIClient._init_session:Function] started at line 47
[APIClient._init_session] Unclosed Anchor: [DEF:APIClient._init_session:Function] started at line 47
[APIClient.authenticate] Unclosed Anchor at end of file (started line 63)
[APIClient.authenticate] Unclosed Anchor: [DEF:APIClient.authenticate:Function] started at line 63
[APIClient.authenticate] Unclosed Anchor: [DEF:APIClient.authenticate:Function] started at line 63
[APIClient.authenticate] Unclosed Anchor: [DEF:APIClient.authenticate:Function] started at line 63
[APIClient.authenticate] Unclosed Anchor: [DEF:APIClient.authenticate:Function] started at line 63
[APIClient.authenticate] Unclosed Anchor: [DEF:APIClient.authenticate:Function] started at line 63
[APIClient.headers] Unclosed Anchor at end of file (started line 92)
[APIClient.headers] Unclosed Anchor: [DEF:APIClient.headers:Function] started at line 92
[APIClient.headers] Unclosed Anchor: [DEF:APIClient.headers:Function] started at line 92
[APIClient.headers] Unclosed Anchor: [DEF:APIClient.headers:Function] started at line 92
[APIClient.headers] Unclosed Anchor: [DEF:APIClient.headers:Function] started at line 92
[APIClient.headers] Unclosed Anchor: [DEF:APIClient.headers:Function] started at line 92
[APIClient.headers] Unclosed Anchor: [DEF:APIClient.headers:Function] started at line 92
[APIClient.request] Unclosed Anchor at end of file (started line 103)
[APIClient.request] Unclosed Anchor: [DEF:APIClient.request:Function] started at line 103
[APIClient.request] Unclosed Anchor: [DEF:APIClient.request:Function] started at line 103
[APIClient.request] Unclosed Anchor: [DEF:APIClient.request:Function] started at line 103
[APIClient.request] Unclosed Anchor: [DEF:APIClient.request:Function] started at line 103
[APIClient.request] Unclosed Anchor: [DEF:APIClient.request:Function] started at line 103
[APIClient.request] Unclosed Anchor: [DEF:APIClient.request:Function] started at line 103
[APIClient.request] Unclosed Anchor: [DEF:APIClient.request:Function] started at line 103
[APIClient._handle_http_error] Unclosed Anchor at end of file (started line 126)
[APIClient._handle_http_error] Unclosed Anchor: [DEF:APIClient._handle_http_error:Function] started at line 126
[APIClient._handle_http_error] Unclosed Anchor: [DEF:APIClient._handle_http_error:Function] started at line 126
[APIClient._handle_http_error] Unclosed Anchor: [DEF:APIClient._handle_http_error:Function] started at line 126
[APIClient._handle_http_error] Unclosed Anchor: [DEF:APIClient._handle_http_error:Function] started at line 126
[APIClient._handle_http_error] Unclosed Anchor: [DEF:APIClient._handle_http_error:Function] started at line 126
[APIClient._handle_http_error] Unclosed Anchor: [DEF:APIClient._handle_http_error:Function] started at line 126
[APIClient._handle_http_error] Unclosed Anchor: [DEF:APIClient._handle_http_error:Function] started at line 126
[APIClient._handle_http_error] Unclosed Anchor: [DEF:APIClient._handle_http_error:Function] started at line 126
[APIClient._handle_network_error] Unclosed Anchor at end of file (started line 138)
[APIClient._handle_network_error] Unclosed Anchor: [DEF:APIClient._handle_network_error:Function] started at line 138
[APIClient._handle_network_error] Unclosed Anchor: [DEF:APIClient._handle_network_error:Function] started at line 138
[APIClient._handle_network_error] Unclosed Anchor: [DEF:APIClient._handle_network_error:Function] started at line 138
[APIClient._handle_network_error] Unclosed Anchor: [DEF:APIClient._handle_network_error:Function] started at line 138
[APIClient._handle_network_error] Unclosed Anchor: [DEF:APIClient._handle_network_error:Function] started at line 138
[APIClient._handle_network_error] Unclosed Anchor: [DEF:APIClient._handle_network_error:Function] started at line 138
[APIClient._handle_network_error] Unclosed Anchor: [DEF:APIClient._handle_network_error:Function] started at line 138
[APIClient._handle_network_error] Unclosed Anchor: [DEF:APIClient._handle_network_error:Function] started at line 138
[APIClient._handle_network_error] Unclosed Anchor: [DEF:APIClient._handle_network_error:Function] started at line 138
[APIClient.upload_file] Unclosed Anchor at end of file (started line 149)
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient.upload_file] Unclosed Anchor: [DEF:APIClient.upload_file:Function] started at line 149
[APIClient._perform_upload] Unclosed Anchor at end of file (started line 175)
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient._perform_upload] Unclosed Anchor: [DEF:APIClient._perform_upload:Function] started at line 175
[APIClient.fetch_paginated_count] Unclosed Anchor at end of file (started line 201)
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_count] Unclosed Anchor: [DEF:APIClient.fetch_paginated_count:Function] started at line 201
[APIClient.fetch_paginated_data] Unclosed Anchor at end of file (started line 212)
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212
[APIClient.fetch_paginated_data] Unclosed Anchor: [DEF:APIClient.fetch_paginated_data:Function] started at line 212 | -| superset_tool/utils/whiptail_fallback.py | 🔴 0% | [superset_tool.utils.whiptail_fallback] Unclosed Anchor at end of file (started line 1)
[superset_tool.utils.whiptail_fallback] Unclosed Anchor: [DEF:superset_tool.utils.whiptail_fallback:Module] started at line 1
[menu] Unclosed Anchor at end of file (started line 13)
[menu] Unclosed Anchor: [DEF:menu:Function] started at line 13
[menu] Unclosed Anchor: [DEF:menu:Function] started at line 13
[checklist] Unclosed Anchor at end of file (started line 31)
[checklist] Unclosed Anchor: [DEF:checklist:Function] started at line 31
[checklist] Unclosed Anchor: [DEF:checklist:Function] started at line 31
[checklist] Unclosed Anchor: [DEF:checklist:Function] started at line 31
[yesno] Unclosed Anchor at end of file (started line 51)
[yesno] Unclosed Anchor: [DEF:yesno:Function] started at line 51
[yesno] Unclosed Anchor: [DEF:yesno:Function] started at line 51
[yesno] Unclosed Anchor: [DEF:yesno:Function] started at line 51
[yesno] Unclosed Anchor: [DEF:yesno:Function] started at line 51
[msgbox] Unclosed Anchor at end of file (started line 61)
[msgbox] Unclosed Anchor: [DEF:msgbox:Function] started at line 61
[msgbox] Unclosed Anchor: [DEF:msgbox:Function] started at line 61
[msgbox] Unclosed Anchor: [DEF:msgbox:Function] started at line 61
[msgbox] Unclosed Anchor: [DEF:msgbox:Function] started at line 61
[msgbox] Unclosed Anchor: [DEF:msgbox:Function] started at line 61
[inputbox] Unclosed Anchor at end of file (started line 69)
[inputbox] Unclosed Anchor: [DEF:inputbox:Function] started at line 69
[inputbox] Unclosed Anchor: [DEF:inputbox:Function] started at line 69
[inputbox] Unclosed Anchor: [DEF:inputbox:Function] started at line 69
[inputbox] Unclosed Anchor: [DEF:inputbox:Function] started at line 69
[inputbox] Unclosed Anchor: [DEF:inputbox:Function] started at line 69
[inputbox] Unclosed Anchor: [DEF:inputbox:Function] started at line 69
[_ConsoleGauge] Unclosed Anchor at end of file (started line 80)
[_ConsoleGauge] Unclosed Anchor: [DEF:_ConsoleGauge:Class] started at line 80
[_ConsoleGauge] Unclosed Anchor: [DEF:_ConsoleGauge:Class] started at line 80
[_ConsoleGauge] Unclosed Anchor: [DEF:_ConsoleGauge:Class] started at line 80
[_ConsoleGauge] Unclosed Anchor: [DEF:_ConsoleGauge:Class] started at line 80
[_ConsoleGauge] Unclosed Anchor: [DEF:_ConsoleGauge:Class] started at line 80
[_ConsoleGauge] Unclosed Anchor: [DEF:_ConsoleGauge:Class] started at line 80
[_ConsoleGauge] Unclosed Anchor: [DEF:_ConsoleGauge:Class] started at line 80
[gauge] Unclosed Anchor at end of file (started line 96)
[gauge] Unclosed Anchor: [DEF:gauge:Function] started at line 96
[gauge] Unclosed Anchor: [DEF:gauge:Function] started at line 96
[gauge] Unclosed Anchor: [DEF:gauge:Function] started at line 96
[gauge] Unclosed Anchor: [DEF:gauge:Function] started at line 96
[gauge] Unclosed Anchor: [DEF:gauge:Function] started at line 96
[gauge] Unclosed Anchor: [DEF:gauge:Function] started at line 96
[gauge] Unclosed Anchor: [DEF:gauge:Function] started at line 96
[gauge] Unclosed Anchor: [DEF:gauge:Function] started at line 96 | -| superset_tool/utils/dataset_mapper.py | 🔴 0% | [superset_tool.utils.dataset_mapper] Unclosed Anchor at end of file (started line 1)
[superset_tool.utils.dataset_mapper] Unclosed Anchor: [DEF:superset_tool.utils.dataset_mapper:Module] started at line 1
[DatasetMapper] Unclosed Anchor at end of file (started line 20)
[DatasetMapper] Unclosed Anchor: [DEF:DatasetMapper:Class] started at line 20
[DatasetMapper] Unclosed Anchor: [DEF:DatasetMapper:Class] started at line 20
[DatasetMapper.get_postgres_comments] Unclosed Anchor at end of file (started line 26)
[DatasetMapper.get_postgres_comments] Unclosed Anchor: [DEF:DatasetMapper.get_postgres_comments:Function] started at line 26
[DatasetMapper.get_postgres_comments] Unclosed Anchor: [DEF:DatasetMapper.get_postgres_comments:Function] started at line 26
[DatasetMapper.get_postgres_comments] Unclosed Anchor: [DEF:DatasetMapper.get_postgres_comments:Function] started at line 26
[DatasetMapper.load_excel_mappings] Unclosed Anchor at end of file (started line 90)
[DatasetMapper.load_excel_mappings] Unclosed Anchor: [DEF:DatasetMapper.load_excel_mappings:Function] started at line 90
[DatasetMapper.load_excel_mappings] Unclosed Anchor: [DEF:DatasetMapper.load_excel_mappings:Function] started at line 90
[DatasetMapper.load_excel_mappings] Unclosed Anchor: [DEF:DatasetMapper.load_excel_mappings:Function] started at line 90
[DatasetMapper.load_excel_mappings] Unclosed Anchor: [DEF:DatasetMapper.load_excel_mappings:Function] started at line 90
[DatasetMapper.run_mapping] Unclosed Anchor at end of file (started line 109)
[DatasetMapper.run_mapping] Unclosed Anchor: [DEF:DatasetMapper.run_mapping:Function] started at line 109
[DatasetMapper.run_mapping] Unclosed Anchor: [DEF:DatasetMapper.run_mapping:Function] started at line 109
[DatasetMapper.run_mapping] Unclosed Anchor: [DEF:DatasetMapper.run_mapping:Function] started at line 109
[DatasetMapper.run_mapping] Unclosed Anchor: [DEF:DatasetMapper.run_mapping:Function] started at line 109
[DatasetMapper.run_mapping] Unclosed Anchor: [DEF:DatasetMapper.run_mapping:Function] started at line 109 | -| superset_tool/utils/__init__.py | 🔴 0% | [superset_tool.utils] Unclosed Anchor at end of file (started line 1)
[superset_tool.utils] Unclosed Anchor: [DEF:superset_tool.utils:Module] started at line 1 | -| superset_tool/utils/init_clients.py | 🔴 0% | [superset_tool.utils.init_clients] Unclosed Anchor at end of file (started line 1)
[superset_tool.utils.init_clients] Unclosed Anchor: [DEF:superset_tool.utils.init_clients:Module] started at line 1
[setup_clients] Unclosed Anchor at end of file (started line 20)
[setup_clients] Unclosed Anchor: [DEF:setup_clients:Function] started at line 20
[setup_clients] Unclosed Anchor: [DEF:setup_clients:Function] started at line 20 | -| superset_tool/utils/fileio.py | 🔴 0% | [superset_tool.utils.fileio] Unclosed Anchor at end of file (started line 1)
[superset_tool.utils.fileio] Unclosed Anchor: [DEF:superset_tool.utils.fileio:Module] started at line 1
[create_temp_file] Unclosed Anchor at end of file (started line 29)
[create_temp_file] Unclosed Anchor: [DEF:create_temp_file:Function] started at line 29
[create_temp_file] Unclosed Anchor: [DEF:create_temp_file:Function] started at line 29
[remove_empty_directories] Unclosed Anchor at end of file (started line 69)
[remove_empty_directories] Unclosed Anchor: [DEF:remove_empty_directories:Function] started at line 69
[remove_empty_directories] Unclosed Anchor: [DEF:remove_empty_directories:Function] started at line 69
[remove_empty_directories] Unclosed Anchor: [DEF:remove_empty_directories:Function] started at line 69
[read_dashboard_from_disk] Unclosed Anchor at end of file (started line 93)
[read_dashboard_from_disk] Unclosed Anchor: [DEF:read_dashboard_from_disk:Function] started at line 93
[read_dashboard_from_disk] Unclosed Anchor: [DEF:read_dashboard_from_disk:Function] started at line 93
[read_dashboard_from_disk] Unclosed Anchor: [DEF:read_dashboard_from_disk:Function] started at line 93
[read_dashboard_from_disk] Unclosed Anchor: [DEF:read_dashboard_from_disk:Function] started at line 93
[calculate_crc32] Unclosed Anchor at end of file (started line 110)
[calculate_crc32] Unclosed Anchor: [DEF:calculate_crc32:Function] started at line 110
[calculate_crc32] Unclosed Anchor: [DEF:calculate_crc32:Function] started at line 110
[calculate_crc32] Unclosed Anchor: [DEF:calculate_crc32:Function] started at line 110
[calculate_crc32] Unclosed Anchor: [DEF:calculate_crc32:Function] started at line 110
[calculate_crc32] Unclosed Anchor: [DEF:calculate_crc32:Function] started at line 110
[RetentionPolicy] Unclosed Anchor at end of file (started line 121)
[RetentionPolicy] Unclosed Anchor: [DEF:RetentionPolicy:DataClass] started at line 121
[RetentionPolicy] Unclosed Anchor: [DEF:RetentionPolicy:DataClass] started at line 121
[RetentionPolicy] Unclosed Anchor: [DEF:RetentionPolicy:DataClass] started at line 121
[RetentionPolicy] Unclosed Anchor: [DEF:RetentionPolicy:DataClass] started at line 121
[RetentionPolicy] Unclosed Anchor: [DEF:RetentionPolicy:DataClass] started at line 121
[RetentionPolicy] Unclosed Anchor: [DEF:RetentionPolicy:DataClass] started at line 121
[archive_exports] Unclosed Anchor at end of file (started line 130)
[archive_exports] Unclosed Anchor: [DEF:archive_exports:Function] started at line 130
[archive_exports] Unclosed Anchor: [DEF:archive_exports:Function] started at line 130
[archive_exports] Unclosed Anchor: [DEF:archive_exports:Function] started at line 130
[archive_exports] Unclosed Anchor: [DEF:archive_exports:Function] started at line 130
[archive_exports] Unclosed Anchor: [DEF:archive_exports:Function] started at line 130
[archive_exports] Unclosed Anchor: [DEF:archive_exports:Function] started at line 130
[archive_exports] Unclosed Anchor: [DEF:archive_exports:Function] started at line 130
[apply_retention_policy] Unclosed Anchor at end of file (started line 212)
[apply_retention_policy] Unclosed Anchor: [DEF:apply_retention_policy:Function] started at line 212
[apply_retention_policy] Unclosed Anchor: [DEF:apply_retention_policy:Function] started at line 212
[apply_retention_policy] Unclosed Anchor: [DEF:apply_retention_policy:Function] started at line 212
[apply_retention_policy] Unclosed Anchor: [DEF:apply_retention_policy:Function] started at line 212
[apply_retention_policy] Unclosed Anchor: [DEF:apply_retention_policy:Function] started at line 212
[apply_retention_policy] Unclosed Anchor: [DEF:apply_retention_policy:Function] started at line 212
[apply_retention_policy] Unclosed Anchor: [DEF:apply_retention_policy:Function] started at line 212
[apply_retention_policy] Unclosed Anchor: [DEF:apply_retention_policy:Function] started at line 212
[save_and_unpack_dashboard] Unclosed Anchor at end of file (started line 245)
[save_and_unpack_dashboard] Unclosed Anchor: [DEF:save_and_unpack_dashboard:Function] started at line 245
[save_and_unpack_dashboard] Unclosed Anchor: [DEF:save_and_unpack_dashboard:Function] started at line 245
[save_and_unpack_dashboard] Unclosed Anchor: [DEF:save_and_unpack_dashboard:Function] started at line 245
[save_and_unpack_dashboard] Unclosed Anchor: [DEF:save_and_unpack_dashboard:Function] started at line 245
[save_and_unpack_dashboard] Unclosed Anchor: [DEF:save_and_unpack_dashboard:Function] started at line 245
[save_and_unpack_dashboard] Unclosed Anchor: [DEF:save_and_unpack_dashboard:Function] started at line 245
[save_and_unpack_dashboard] Unclosed Anchor: [DEF:save_and_unpack_dashboard:Function] started at line 245
[save_and_unpack_dashboard] Unclosed Anchor: [DEF:save_and_unpack_dashboard:Function] started at line 245
[save_and_unpack_dashboard] Unclosed Anchor: [DEF:save_and_unpack_dashboard:Function] started at line 245
[update_yamls] Unclosed Anchor at end of file (started line 275)
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[update_yamls] Unclosed Anchor: [DEF:update_yamls:Function] started at line 275
[_update_yaml_file] Unclosed Anchor at end of file (started line 296)
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[_update_yaml_file] Unclosed Anchor: [DEF:_update_yaml_file:Function] started at line 296
[create_dashboard_export] Unclosed Anchor at end of file (started line 357)
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[create_dashboard_export] Unclosed Anchor: [DEF:create_dashboard_export:Function] started at line 357
[sanitize_filename] Unclosed Anchor at end of file (started line 384)
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[sanitize_filename] Unclosed Anchor: [DEF:sanitize_filename:Function] started at line 384
[get_filename_from_headers] Unclosed Anchor at end of file (started line 392)
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[get_filename_from_headers] Unclosed Anchor: [DEF:get_filename_from_headers:Function] started at line 392
[consolidate_archive_folders] Unclosed Anchor at end of file (started line 403)
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403
[consolidate_archive_folders] Unclosed Anchor: [DEF:consolidate_archive_folders:Function] started at line 403 | -| frontend/src/App.svelte | 🔴 0% | [App] Unclosed Anchor at end of file (started line 1)
[App] Unclosed Anchor: [DEF:App:Component] started at line 1
[handleFormSubmit] Unclosed Anchor at end of file (started line 24)
[handleFormSubmit] Unclosed Anchor: [DEF:handleFormSubmit:Function] started at line 24
[handleFormSubmit] Unclosed Anchor: [DEF:handleFormSubmit:Function] started at line 24
[navigate] Unclosed Anchor at end of file (started line 44)
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44 | -| frontend/src/main.js | 🔴 0% | [main] Unclosed Anchor at end of file (started line 1)
[main] Unclosed Anchor: [DEF:main:Module] started at line 1
[app_instance] Unclosed Anchor at end of file (started line 9)
[app_instance] Unclosed Anchor: [DEF:app_instance:Data] started at line 9
[app_instance] Unclosed Anchor: [DEF:app_instance:Data] started at line 9 | -| frontend/src/components/DashboardGrid.svelte | 🔴 0% | [DashboardGrid] Unclosed Anchor at end of file (started line 1)
[DashboardGrid] Unclosed Anchor: [DEF:DashboardGrid:Component] started at line 1
[handleSort] Unclosed Anchor at end of file (started line 62)
[handleSort] Unclosed Anchor: [DEF:handleSort:Function] started at line 62
[handleSort] Unclosed Anchor: [DEF:handleSort:Function] started at line 62
[handleSelectionChange] Unclosed Anchor at end of file (started line 74)
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectAll] Unclosed Anchor at end of file (started line 88)
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[goToPage] Unclosed Anchor at end of file (started line 106)
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106 | -| frontend/src/components/TaskHistory.svelte | 🔴 0% | [TaskHistory] Unclosed Anchor at end of file (started line 1)
[TaskHistory] Unclosed Anchor: [DEF:TaskHistory:Component] started at line 1 | -| frontend/src/components/MappingTable.svelte | 🔴 0% | [MappingTable] Unclosed Anchor at end of file (started line 1)
[MappingTable] Unclosed Anchor: [DEF:MappingTable:Component] started at line 1
[updateMapping] Unclosed Anchor at end of file (started line 25)
[updateMapping] Unclosed Anchor: [DEF:updateMapping:Function] started at line 25
[updateMapping] Unclosed Anchor: [DEF:updateMapping:Function] started at line 25
[getSuggestion] Unclosed Anchor at end of file (started line 34)
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34 | -| frontend/src/components/EnvSelector.svelte | 🔴 0% | [EnvSelector] Unclosed Anchor at end of file (started line 1)
[EnvSelector] Unclosed Anchor: [DEF:EnvSelector:Component] started at line 1
[handleSelect] Unclosed Anchor at end of file (started line 24)
[handleSelect] Unclosed Anchor: [DEF:handleSelect:Function] started at line 24
[handleSelect] Unclosed Anchor: [DEF:handleSelect:Function] started at line 24 | -| frontend/src/components/TaskList.svelte | 🔴 0% | [TaskList] Unclosed Anchor at end of file (started line 1)
[TaskList] Unclosed Anchor: [DEF:TaskList:Component] started at line 1 | -| frontend/src/components/DynamicForm.svelte | 🔴 0% | [DynamicForm] Unclosed Anchor at end of file (started line 1)
[DynamicForm] Unclosed Anchor: [DEF:DynamicForm:Component] started at line 1
[handleSubmit] Unclosed Anchor at end of file (started line 23)
[handleSubmit] Unclosed Anchor: [DEF:handleSubmit:Function] started at line 23
[handleSubmit] Unclosed Anchor: [DEF:handleSubmit:Function] started at line 23
[initializeForm] Unclosed Anchor at end of file (started line 33)
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33 | -| frontend/src/components/TaskRunner.svelte | 🔴 0% | [TaskRunner] Unclosed Anchor at end of file (started line 1)
[TaskRunner] Unclosed Anchor: [DEF:TaskRunner:Component] started at line 1
[connect] Unclosed Anchor at end of file (started line 38)
[connect] Unclosed Anchor: [DEF:connect:Function] started at line 38
[connect] Unclosed Anchor: [DEF:connect:Function] started at line 38
[onMount] Unclosed Anchor at end of file (started line 225)
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onDestroy] Unclosed Anchor at end of file (started line 251)
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251 | -| frontend/src/components/TaskLogViewer.svelte | 🔴 0% | [TaskLogViewer] Unclosed Anchor at end of file (started line 1)
[TaskLogViewer] Unclosed Anchor: [DEF:TaskLogViewer:Component] started at line 1 | -| frontend/src/components/PasswordPrompt.svelte | 🔴 0% | [PasswordPrompt] Unclosed Anchor at end of file (started line 1)
[PasswordPrompt] Unclosed Anchor: [DEF:PasswordPrompt:Component] started at line 1 | -| frontend/src/components/MissingMappingModal.svelte | 🔴 0% | [MissingMappingModal] Unclosed Anchor at end of file (started line 1)
[MissingMappingModal] Unclosed Anchor: [DEF:MissingMappingModal:Component] started at line 1
[resolve] Unclosed Anchor at end of file (started line 26)
[resolve] Unclosed Anchor: [DEF:resolve:Function] started at line 26
[resolve] Missing Mandatory Tag: @PURPOSE
[resolve] Unclosed Anchor: [DEF:resolve:Function] started at line 26
[resolve] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor at end of file (started line 38)
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE | -| frontend/src/components/Toast.svelte | 🔴 0% | [Toast] Unclosed Anchor at end of file (started line 1)
[Toast] Unclosed Anchor: [DEF:Toast:Component] started at line 1 | -| frontend/src/pages/Settings.svelte | 🔴 0% | [Settings] Unclosed Anchor at end of file (started line 1)
[Settings] Unclosed Anchor: [DEF:Settings:Component] started at line 1
[loadSettings] Unclosed Anchor at end of file (started line 50)
[loadSettings] Unclosed Anchor: [DEF:loadSettings:Function] started at line 50
[loadSettings] Unclosed Anchor: [DEF:loadSettings:Function] started at line 50
[handleSaveGlobal] Unclosed Anchor at end of file (started line 67)
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleAddOrUpdateEnv] Unclosed Anchor at end of file (started line 84)
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleDeleteEnv] Unclosed Anchor at end of file (started line 108)
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleTestEnv] Unclosed Anchor at end of file (started line 129)
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[editEnv] Unclosed Anchor at end of file (started line 152)
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[resetEnvForm] Unclosed Anchor at end of file (started line 163)
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163 | -| frontend/src/pages/Dashboard.svelte | 🔴 0% | [Dashboard] Unclosed Anchor at end of file (started line 1)
[Dashboard] Unclosed Anchor: [DEF:Dashboard:Component] started at line 1
[onMount] Unclosed Anchor at end of file (started line 17)
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 17
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 17
[selectPlugin] Unclosed Anchor at end of file (started line 27)
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27 | -| frontend/src/lib/stores.js | 🔴 0% | [stores_module] Unclosed Anchor at end of file (started line 1)
[stores_module] Unclosed Anchor: [DEF:stores_module:Module] started at line 1
[plugins] Unclosed Anchor at end of file (started line 9)
[plugins] Unclosed Anchor: [DEF:plugins:Data] started at line 9
[plugins] Unclosed Anchor: [DEF:plugins:Data] started at line 9
[tasks] Unclosed Anchor at end of file (started line 13)
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[selectedPlugin] Unclosed Anchor at end of file (started line 17)
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedTask] Unclosed Anchor at end of file (started line 21)
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[currentPage] Unclosed Anchor at end of file (started line 25)
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[taskLogs] Unclosed Anchor at end of file (started line 29)
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[fetchPlugins] Unclosed Anchor at end of file (started line 33)
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchTasks] Unclosed Anchor at end of file (started line 47)
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47 | -| frontend/src/lib/toasts.js | 🔴 0% | [toasts_module] Unclosed Anchor at end of file (started line 1)
[toasts_module] Unclosed Anchor: [DEF:toasts_module:Module] started at line 1
[toasts] Unclosed Anchor at end of file (started line 8)
[toasts] Unclosed Anchor: [DEF:toasts:Data] started at line 8
[toasts] Unclosed Anchor: [DEF:toasts:Data] started at line 8
[addToast] Unclosed Anchor at end of file (started line 12)
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[removeToast] Unclosed Anchor at end of file (started line 25)
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25 | -| frontend/src/lib/api.js | 🔴 0% | [api_module] Unclosed Anchor at end of file (started line 1)
[api_module] Unclosed Anchor: [DEF:api_module:Module] started at line 1
[fetchApi] Unclosed Anchor at end of file (started line 26)
[fetchApi] Unclosed Anchor: [DEF:fetchApi:Function] started at line 26
[fetchApi] Unclosed Anchor: [DEF:fetchApi:Function] started at line 26
[postApi] Unclosed Anchor at end of file (started line 46)
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[requestApi] Unclosed Anchor at end of file (started line 73)
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[api] Unclosed Anchor at end of file (started line 100)
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100 | -| frontend/src/routes/migration/+page.svelte | 🔴 0% | [MigrationDashboard] Unclosed Anchor at end of file (started line 1)
[MigrationDashboard] Unclosed Anchor: [DEF:MigrationDashboard:Component] started at line 1
[fetchEnvironments] Unclosed Anchor at end of file (started line 51)
[fetchEnvironments] Unclosed Anchor: [DEF:fetchEnvironments:Function] started at line 51
[fetchEnvironments] Unclosed Anchor: [DEF:fetchEnvironments:Function] started at line 51
[fetchDashboards] Unclosed Anchor at end of file (started line 69)
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDatabases] Unclosed Anchor at end of file (started line 93)
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[handleMappingUpdate] Unclosed Anchor at end of file (started line 128)
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleViewLogs] Unclosed Anchor at end of file (started line 163)
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor at end of file (started line 172)
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[startMigration] Unclosed Anchor at end of file (started line 207)
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207 | -| frontend/src/routes/migration/mappings/+page.svelte | 🔴 0% | [MappingManagement] Unclosed Anchor at end of file (started line 1)
[MappingManagement] Unclosed Anchor: [DEF:MappingManagement:Component] started at line 1
[fetchDatabases] Unclosed Anchor at end of file (started line 47)
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 47
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 47
[handleUpdate] Unclosed Anchor at end of file (started line 83)
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83 | -| backend/src/dependencies.py | 🔴 0% | [Dependencies] Unclosed Anchor at end of file (started line 1)
[Dependencies] Unclosed Anchor: [DEF:Dependencies:Module] started at line 1 | -| backend/src/app.py | 🔴 0% | [AppModule] Unclosed Anchor at end of file (started line 1)
[AppModule] Unclosed Anchor: [DEF:AppModule:Module] started at line 1
[App] Unclosed Anchor at end of file (started line 26)
[App] Unclosed Anchor: [DEF:App:Global] started at line 26
[App] Unclosed Anchor: [DEF:App:Global] started at line 26
[WebSocketEndpoint] Unclosed Anchor at end of file (started line 72)
[WebSocketEndpoint] Unclosed Anchor: [DEF:WebSocketEndpoint:Endpoint] started at line 72
[WebSocketEndpoint] Unclosed Anchor: [DEF:WebSocketEndpoint:Endpoint] started at line 72
[WebSocketEndpoint] Unclosed Anchor: [DEF:WebSocketEndpoint:Endpoint] started at line 72
[StaticFiles] Unclosed Anchor at end of file (started line 130)
[StaticFiles] Unclosed Anchor: [DEF:StaticFiles:Mount] started at line 130
[StaticFiles] Unclosed Anchor: [DEF:StaticFiles:Mount] started at line 130
[StaticFiles] Unclosed Anchor: [DEF:StaticFiles:Mount] started at line 130
[StaticFiles] Unclosed Anchor: [DEF:StaticFiles:Mount] started at line 130
[RootEndpoint] Unclosed Anchor at end of file (started line 146)
[RootEndpoint] Unclosed Anchor: [DEF:RootEndpoint:Endpoint] started at line 146
[RootEndpoint] Unclosed Anchor: [DEF:RootEndpoint:Endpoint] started at line 146
[RootEndpoint] Unclosed Anchor: [DEF:RootEndpoint:Endpoint] started at line 146
[RootEndpoint] Unclosed Anchor: [DEF:RootEndpoint:Endpoint] started at line 146
[RootEndpoint] Unclosed Anchor: [DEF:RootEndpoint:Endpoint] started at line 146 | -| backend/src/models/mapping.py | 🔴 0% | [backend.src.models.mapping] Unclosed Anchor at end of file (started line 1)
[backend.src.models.mapping] Unclosed Anchor: [DEF:backend.src.models.mapping:Module] started at line 1
[MigrationStatus] Unclosed Anchor at end of file (started line 21)
[MigrationStatus] Unclosed Anchor: [DEF:MigrationStatus:Class] started at line 21
[MigrationStatus] Unclosed Anchor: [DEF:MigrationStatus:Class] started at line 21
[Environment] Unclosed Anchor at end of file (started line 31)
[Environment] Unclosed Anchor: [DEF:Environment:Class] started at line 31
[Environment] Unclosed Anchor: [DEF:Environment:Class] started at line 31
[Environment] Unclosed Anchor: [DEF:Environment:Class] started at line 31
[DatabaseMapping] Unclosed Anchor at end of file (started line 42)
[DatabaseMapping] Unclosed Anchor: [DEF:DatabaseMapping:Class] started at line 42
[DatabaseMapping] Unclosed Anchor: [DEF:DatabaseMapping:Class] started at line 42
[DatabaseMapping] Unclosed Anchor: [DEF:DatabaseMapping:Class] started at line 42
[DatabaseMapping] Unclosed Anchor: [DEF:DatabaseMapping:Class] started at line 42
[MigrationJob] Unclosed Anchor at end of file (started line 57)
[MigrationJob] Unclosed Anchor: [DEF:MigrationJob:Class] started at line 57
[MigrationJob] Unclosed Anchor: [DEF:MigrationJob:Class] started at line 57
[MigrationJob] Unclosed Anchor: [DEF:MigrationJob:Class] started at line 57
[MigrationJob] Unclosed Anchor: [DEF:MigrationJob:Class] started at line 57
[MigrationJob] Unclosed Anchor: [DEF:MigrationJob:Class] started at line 57 | -| backend/src/models/dashboard.py | 🔴 0% | [backend.src.models.dashboard] Unclosed Anchor at end of file (started line 1)
[backend.src.models.dashboard] Unclosed Anchor: [DEF:backend.src.models.dashboard:Module] started at line 1
[DashboardMetadata] Unclosed Anchor at end of file (started line 10)
[DashboardMetadata] Unclosed Anchor: [DEF:DashboardMetadata:Class] started at line 10
[DashboardMetadata] Unclosed Anchor: [DEF:DashboardMetadata:Class] started at line 10
[DashboardSelection] Unclosed Anchor at end of file (started line 19)
[DashboardSelection] Unclosed Anchor: [DEF:DashboardSelection:Class] started at line 19
[DashboardSelection] Unclosed Anchor: [DEF:DashboardSelection:Class] started at line 19
[DashboardSelection] Unclosed Anchor: [DEF:DashboardSelection:Class] started at line 19 | -| backend/src/models/task.py | 🔴 0% | [backend.src.models.task] Unclosed Anchor at end of file (started line 1)
[backend.src.models.task] Unclosed Anchor: [DEF:backend.src.models.task:Module] started at line 1
[TaskRecord] Unclosed Anchor at end of file (started line 17)
[TaskRecord] Unclosed Anchor: [DEF:TaskRecord:Class] started at line 17
[TaskRecord] Unclosed Anchor: [DEF:TaskRecord:Class] started at line 17 | -| backend/src/services/mapping_service.py | 🔴 0% | [backend.src.services.mapping_service] Unclosed Anchor at end of file (started line 1)
[backend.src.services.mapping_service] Unclosed Anchor: [DEF:backend.src.services.mapping_service:Module] started at line 1
[MappingService] Unclosed Anchor at end of file (started line 18)
[MappingService] Unclosed Anchor: [DEF:MappingService:Class] started at line 18
[MappingService] Unclosed Anchor: [DEF:MappingService:Class] started at line 18
[MappingService.__init__] Unclosed Anchor at end of file (started line 22)
[MappingService.__init__] Unclosed Anchor: [DEF:MappingService.__init__:Function] started at line 22
[MappingService.__init__] Missing Mandatory Tag: @PURPOSE
[MappingService.__init__] Unclosed Anchor: [DEF:MappingService.__init__:Function] started at line 22
[MappingService.__init__] Missing Mandatory Tag: @PURPOSE
[MappingService.__init__] Unclosed Anchor: [DEF:MappingService.__init__:Function] started at line 22
[MappingService.__init__] Missing Mandatory Tag: @PURPOSE
[MappingService._get_client] Unclosed Anchor at end of file (started line 26)
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService.get_suggestions] Unclosed Anchor at end of file (started line 46)
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46 | -| backend/src/core/config_manager.py | 🔴 0% | [ConfigManagerModule] Unclosed Anchor at end of file (started line 1)
[ConfigManagerModule] Unclosed Anchor: [DEF:ConfigManagerModule:Module] started at line 1
[ConfigManager] Unclosed Anchor at end of file (started line 22)
[ConfigManager] Unclosed Anchor: [DEF:ConfigManager:Class] started at line 22
[ConfigManager] Unclosed Anchor: [DEF:ConfigManager:Class] started at line 22
[__init__] Unclosed Anchor at end of file (started line 27)
[__init__] Unclosed Anchor: [DEF:__init__:Function] started at line 27
[__init__] Unclosed Anchor: [DEF:__init__:Function] started at line 27
[__init__] Unclosed Anchor: [DEF:__init__:Function] started at line 27
[_load_config] Unclosed Anchor at end of file (started line 51)
[_load_config] Unclosed Anchor: [DEF:_load_config:Function] started at line 51
[_load_config] Unclosed Anchor: [DEF:_load_config:Function] started at line 51
[_load_config] Unclosed Anchor: [DEF:_load_config:Function] started at line 51
[_load_config] Unclosed Anchor: [DEF:_load_config:Function] started at line 51
[_save_config_to_disk] Unclosed Anchor at end of file (started line 83)
[_save_config_to_disk] Unclosed Anchor: [DEF:_save_config_to_disk:Function] started at line 83
[_save_config_to_disk] Unclosed Anchor: [DEF:_save_config_to_disk:Function] started at line 83
[_save_config_to_disk] Unclosed Anchor: [DEF:_save_config_to_disk:Function] started at line 83
[_save_config_to_disk] Unclosed Anchor: [DEF:_save_config_to_disk:Function] started at line 83
[_save_config_to_disk] Unclosed Anchor: [DEF:_save_config_to_disk:Function] started at line 83
[save] Unclosed Anchor at end of file (started line 102)
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[get_config] Unclosed Anchor at end of file (started line 108)
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[update_global_settings] Unclosed Anchor at end of file (started line 115)
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[validate_path] Unclosed Anchor at end of file (started line 135)
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[get_environments] Unclosed Anchor at end of file (started line 153)
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[has_environments] Unclosed Anchor at end of file (started line 160)
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[add_environment] Unclosed Anchor at end of file (started line 167)
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[update_environment] Unclosed Anchor at end of file (started line 186)
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[delete_environment] Unclosed Anchor at end of file (started line 215)
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215 | -| backend/src/core/superset_client.py | 🔴 0% | [backend.src.core.superset_client] Unclosed Anchor at end of file (started line 1)
[backend.src.core.superset_client] Unclosed Anchor: [DEF:backend.src.core.superset_client:Module] started at line 1
[SupersetClient] Unclosed Anchor at end of file (started line 16)
[SupersetClient] Unclosed Anchor: [DEF:SupersetClient:Class] started at line 16
[SupersetClient] Unclosed Anchor: [DEF:SupersetClient:Class] started at line 16
[SupersetClient.get_databases_summary] Unclosed Anchor at end of file (started line 20)
[SupersetClient.get_databases_summary] Unclosed Anchor: [DEF:SupersetClient.get_databases_summary:Function] started at line 20
[SupersetClient.get_databases_summary] Unclosed Anchor: [DEF:SupersetClient.get_databases_summary:Function] started at line 20
[SupersetClient.get_databases_summary] Unclosed Anchor: [DEF:SupersetClient.get_databases_summary:Function] started at line 20
[SupersetClient.get_database_by_uuid] Unclosed Anchor at end of file (started line 40)
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_dashboards_summary] Unclosed Anchor at end of file (started line 55)
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55 | -| backend/src/core/migration_engine.py | 🔴 0% | [backend.src.core.migration_engine] Unclosed Anchor at end of file (started line 1)
[backend.src.core.migration_engine] Unclosed Anchor: [DEF:backend.src.core.migration_engine:Module] started at line 1
[MigrationEngine] Unclosed Anchor at end of file (started line 22)
[MigrationEngine] Unclosed Anchor: [DEF:MigrationEngine:Class] started at line 22
[MigrationEngine] Unclosed Anchor: [DEF:MigrationEngine:Class] started at line 22
[MigrationEngine.transform_zip] Unclosed Anchor at end of file (started line 26)
[MigrationEngine.transform_zip] Unclosed Anchor: [DEF:MigrationEngine.transform_zip:Function] started at line 26
[MigrationEngine.transform_zip] Unclosed Anchor: [DEF:MigrationEngine.transform_zip:Function] started at line 26
[MigrationEngine.transform_zip] Unclosed Anchor: [DEF:MigrationEngine.transform_zip:Function] started at line 26
[MigrationEngine._transform_yaml] Unclosed Anchor at end of file (started line 77)
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77 | -| backend/src/core/logger.py | 🔴 0% | [LoggerModule] Unclosed Anchor at end of file (started line 1)
[LoggerModule] Unclosed Anchor: [DEF:LoggerModule:Module] started at line 1
[BeliefFormatter] Unclosed Anchor at end of file (started line 22)
[BeliefFormatter] Unclosed Anchor: [DEF:BeliefFormatter:Class] started at line 22
[BeliefFormatter] Unclosed Anchor: [DEF:BeliefFormatter:Class] started at line 22
[LogEntry] Unclosed Anchor at end of file (started line 34)
[LogEntry] Unclosed Anchor: [DEF:LogEntry:Class] started at line 34
[LogEntry] Unclosed Anchor: [DEF:LogEntry:Class] started at line 34
[LogEntry] Unclosed Anchor: [DEF:LogEntry:Class] started at line 34
[BeliefScope] Unclosed Anchor at end of file (started line 45)
[BeliefScope] Unclosed Anchor: [DEF:BeliefScope:Function] started at line 45
[BeliefScope] Unclosed Anchor: [DEF:BeliefScope:Function] started at line 45
[BeliefScope] Unclosed Anchor: [DEF:BeliefScope:Function] started at line 45
[BeliefScope] Unclosed Anchor: [DEF:BeliefScope:Function] started at line 45
[ConfigureLogger] Unclosed Anchor at end of file (started line 76)
[ConfigureLogger] Unclosed Anchor: [DEF:ConfigureLogger:Function] started at line 76
[ConfigureLogger] Unclosed Anchor: [DEF:ConfigureLogger:Function] started at line 76
[ConfigureLogger] Unclosed Anchor: [DEF:ConfigureLogger:Function] started at line 76
[ConfigureLogger] Unclosed Anchor: [DEF:ConfigureLogger:Function] started at line 76
[ConfigureLogger] Unclosed Anchor: [DEF:ConfigureLogger:Function] started at line 76
[WebSocketLogHandler] Unclosed Anchor at end of file (started line 120)
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[Logger] Unclosed Anchor at end of file (started line 163)
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163 | -| backend/src/core/database.py | 🔴 0% | [backend.src.core.database] Unclosed Anchor at end of file (started line 1)
[backend.src.core.database] Unclosed Anchor: [DEF:backend.src.core.database:Module] started at line 1
[DATABASE_URL] Unclosed Anchor at end of file (started line 20)
[DATABASE_URL] Unclosed Anchor: [DEF:DATABASE_URL:Constant] started at line 20
[DATABASE_URL] Unclosed Anchor: [DEF:DATABASE_URL:Constant] started at line 20
[TASKS_DATABASE_URL] Unclosed Anchor at end of file (started line 24)
[TASKS_DATABASE_URL] Unclosed Anchor: [DEF:TASKS_DATABASE_URL:Constant] started at line 24
[TASKS_DATABASE_URL] Unclosed Anchor: [DEF:TASKS_DATABASE_URL:Constant] started at line 24
[TASKS_DATABASE_URL] Unclosed Anchor: [DEF:TASKS_DATABASE_URL:Constant] started at line 24
[engine] Unclosed Anchor at end of file (started line 28)
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28
[tasks_engine] Unclosed Anchor at end of file (started line 32)
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[SessionLocal] Unclosed Anchor at end of file (started line 36)
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor at end of file (started line 40)
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[init_db] Unclosed Anchor at end of file (started line 44)
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[get_db] Unclosed Anchor at end of file (started line 51)
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_tasks_db] Unclosed Anchor at end of file (started line 63)
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63 | -| backend/src/core/config_models.py | 🔴 0% | [ConfigModels] Unclosed Anchor at end of file (started line 1)
[ConfigModels] Unclosed Anchor: [DEF:ConfigModels:Module] started at line 1
[Schedule] Unclosed Anchor at end of file (started line 11)
[Schedule] Unclosed Anchor: [DEF:Schedule:DataClass] started at line 11
[Schedule] Unclosed Anchor: [DEF:Schedule:DataClass] started at line 11
[Environment] Unclosed Anchor at end of file (started line 18)
[Environment] Unclosed Anchor: [DEF:Environment:DataClass] started at line 18
[Environment] Unclosed Anchor: [DEF:Environment:DataClass] started at line 18
[Environment] Unclosed Anchor: [DEF:Environment:DataClass] started at line 18
[LoggingConfig] Unclosed Anchor at end of file (started line 30)
[LoggingConfig] Unclosed Anchor: [DEF:LoggingConfig:DataClass] started at line 30
[LoggingConfig] Unclosed Anchor: [DEF:LoggingConfig:DataClass] started at line 30
[LoggingConfig] Unclosed Anchor: [DEF:LoggingConfig:DataClass] started at line 30
[LoggingConfig] Unclosed Anchor: [DEF:LoggingConfig:DataClass] started at line 30
[GlobalSettings] Unclosed Anchor at end of file (started line 40)
[GlobalSettings] Unclosed Anchor: [DEF:GlobalSettings:DataClass] started at line 40
[GlobalSettings] Unclosed Anchor: [DEF:GlobalSettings:DataClass] started at line 40
[GlobalSettings] Unclosed Anchor: [DEF:GlobalSettings:DataClass] started at line 40
[GlobalSettings] Unclosed Anchor: [DEF:GlobalSettings:DataClass] started at line 40
[GlobalSettings] Unclosed Anchor: [DEF:GlobalSettings:DataClass] started at line 40
[AppConfig] Unclosed Anchor at end of file (started line 53)
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53 | -| backend/src/core/plugin_loader.py | 🔴 0% | [PluginLoader] Unclosed Anchor at end of file (started line 8)
[PluginLoader] Unclosed Anchor: [DEF:PluginLoader:Class] started at line 8 | -| backend/src/core/plugin_base.py | 🔴 0% | [PluginBase] Unclosed Anchor at end of file (started line 6)
[PluginBase] Unclosed Anchor: [DEF:PluginBase:Class] started at line 6
[PluginConfig] Unclosed Anchor at end of file (started line 59)
[PluginConfig] Unclosed Anchor: [DEF:PluginConfig:Class] started at line 59
[PluginConfig] Unclosed Anchor: [DEF:PluginConfig:Class] started at line 59 | -| backend/src/core/utils/matching.py | 🔴 0% | [backend.src.core.utils.matching] Unclosed Anchor at end of file (started line 1)
[backend.src.core.utils.matching] Unclosed Anchor: [DEF:backend.src.core.utils.matching:Module] started at line 1
[suggest_mappings] Unclosed Anchor at end of file (started line 15)
[suggest_mappings] Unclosed Anchor: [DEF:suggest_mappings:Function] started at line 15
[suggest_mappings] Unclosed Anchor: [DEF:suggest_mappings:Function] started at line 15 | -| backend/src/core/task_manager/cleanup.py | 🔴 0% | [TaskCleanupModule] Unclosed Anchor at end of file (started line 1)
[TaskCleanupModule] Unclosed Anchor: [DEF:TaskCleanupModule:Module] started at line 1
[TaskCleanupService] Unclosed Anchor at end of file (started line 12)
[TaskCleanupService] Unclosed Anchor: [DEF:TaskCleanupService:Class] started at line 12
[TaskCleanupService] Unclosed Anchor: [DEF:TaskCleanupService:Class] started at line 12
[TaskCleanupService.run_cleanup] Unclosed Anchor at end of file (started line 19)
[TaskCleanupService.run_cleanup] Unclosed Anchor: [DEF:TaskCleanupService.run_cleanup:Function] started at line 19
[TaskCleanupService.run_cleanup] Unclosed Anchor: [DEF:TaskCleanupService.run_cleanup:Function] started at line 19
[TaskCleanupService.run_cleanup] Unclosed Anchor: [DEF:TaskCleanupService.run_cleanup:Function] started at line 19 | -| backend/src/plugins/backup.py | 🔴 0% | [BackupPlugin] Unclosed Anchor at end of file (started line 1)
[BackupPlugin] Unclosed Anchor: [DEF:BackupPlugin:Module] started at line 1 | -| backend/src/plugins/migration.py | 🔴 0% | [MigrationPlugin] Unclosed Anchor at end of file (started line 1)
[MigrationPlugin] Unclosed Anchor: [DEF:MigrationPlugin:Module] started at line 1
[MigrationPlugin.execute] Unclosed Anchor at end of file (started line 103)
[MigrationPlugin.execute] Unclosed Anchor: [DEF:MigrationPlugin.execute:Action] started at line 103
[MigrationPlugin.execute] Unclosed Anchor: [DEF:MigrationPlugin.execute:Action] started at line 103 | -| backend/src/api/auth.py | 🔴 0% | [AuthModule] Unclosed Anchor at end of file (started line 1)
[AuthModule] Unclosed Anchor: [DEF:AuthModule:Module] started at line 1 | -| backend/src/api/routes/settings.py | 🔴 0% | [SettingsRouter] Unclosed Anchor at end of file (started line 1)
[SettingsRouter] Unclosed Anchor: [DEF:SettingsRouter:Module] started at line 1
[get_settings] Unclosed Anchor at end of file (started line 26)
[get_settings] Unclosed Anchor: [DEF:get_settings:Function] started at line 26
[get_settings] Unclosed Anchor: [DEF:get_settings:Function] started at line 26
[update_global_settings] Unclosed Anchor at end of file (started line 40)
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 40
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 40
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 40
[get_environments] Unclosed Anchor at end of file (started line 54)
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 54
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 54
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 54
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 54
[add_environment] Unclosed Anchor at end of file (started line 63)
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 63
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 63
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 63
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 63
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 63
[update_environment] Unclosed Anchor at end of file (started line 96)
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[delete_environment] Unclosed Anchor at end of file (started line 139)
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[test_environment_connection] Unclosed Anchor at end of file (started line 152)
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[validate_backup_path] Unclosed Anchor at end of file (started line 195)
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195 | -| backend/src/api/routes/tasks.py | 🔴 0% | [TasksRouter] Unclosed Anchor at end of file (started line 1)
[TasksRouter] Unclosed Anchor: [DEF:TasksRouter:Module] started at line 1 | -| backend/src/api/routes/environments.py | 🔴 0% | [backend.src.api.routes.environments] Unclosed Anchor at end of file (started line 1)
[backend.src.api.routes.environments] Unclosed Anchor: [DEF:backend.src.api.routes.environments:Module] started at line 1
[ScheduleSchema] Unclosed Anchor at end of file (started line 23)
[ScheduleSchema] Unclosed Anchor: [DEF:ScheduleSchema:DataClass] started at line 23
[ScheduleSchema] Unclosed Anchor: [DEF:ScheduleSchema:DataClass] started at line 23
[EnvironmentResponse] Unclosed Anchor at end of file (started line 29)
[EnvironmentResponse] Unclosed Anchor: [DEF:EnvironmentResponse:DataClass] started at line 29
[EnvironmentResponse] Unclosed Anchor: [DEF:EnvironmentResponse:DataClass] started at line 29
[EnvironmentResponse] Unclosed Anchor: [DEF:EnvironmentResponse:DataClass] started at line 29
[DatabaseResponse] Unclosed Anchor at end of file (started line 37)
[DatabaseResponse] Unclosed Anchor: [DEF:DatabaseResponse:DataClass] started at line 37
[DatabaseResponse] Unclosed Anchor: [DEF:DatabaseResponse:DataClass] started at line 37
[DatabaseResponse] Unclosed Anchor: [DEF:DatabaseResponse:DataClass] started at line 37
[DatabaseResponse] Unclosed Anchor: [DEF:DatabaseResponse:DataClass] started at line 37
[get_environments] Unclosed Anchor at end of file (started line 44)
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 44
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 44
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 44
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 44
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 44
[update_environment_schedule] Unclosed Anchor at end of file (started line 66)
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[get_environment_databases] Unclosed Anchor at end of file (started line 94)
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94 | -| backend/src/api/routes/plugins.py | 🔴 0% | [PluginsRouter] Unclosed Anchor at end of file (started line 1)
[PluginsRouter] Unclosed Anchor: [DEF:PluginsRouter:Module] started at line 1 | -| backend/src/api/routes/migration.py | 🔴 0% | [backend.src.api.routes.migration] Unclosed Anchor at end of file (started line 1)
[backend.src.api.routes.migration] Unclosed Anchor: [DEF:backend.src.api.routes.migration:Module] started at line 1
[get_dashboards] Unclosed Anchor at end of file (started line 17)
[get_dashboards] Unclosed Anchor: [DEF:get_dashboards:Function] started at line 17
[get_dashboards] Unclosed Anchor: [DEF:get_dashboards:Function] started at line 17
[execute_migration] Unclosed Anchor at end of file (started line 42)
[execute_migration] Unclosed Anchor: [DEF:execute_migration:Function] started at line 42
[execute_migration] Unclosed Anchor: [DEF:execute_migration:Function] started at line 42
[execute_migration] Unclosed Anchor: [DEF:execute_migration:Function] started at line 42 | -| backend/src/api/routes/mappings.py | 🔴 0% | [backend.src.api.routes.mappings] Unclosed Anchor at end of file (started line 1)
[backend.src.api.routes.mappings] Unclosed Anchor: [DEF:backend.src.api.routes.mappings:Module] started at line 1
[MappingCreate] Unclosed Anchor at end of file (started line 24)
[MappingCreate] Unclosed Anchor: [DEF:MappingCreate:DataClass] started at line 24
[MappingCreate] Unclosed Anchor: [DEF:MappingCreate:DataClass] started at line 24
[MappingResponse] Unclosed Anchor at end of file (started line 34)
[MappingResponse] Unclosed Anchor: [DEF:MappingResponse:DataClass] started at line 34
[MappingResponse] Unclosed Anchor: [DEF:MappingResponse:DataClass] started at line 34
[MappingResponse] Unclosed Anchor: [DEF:MappingResponse:DataClass] started at line 34
[SuggestRequest] Unclosed Anchor at end of file (started line 48)
[SuggestRequest] Unclosed Anchor: [DEF:SuggestRequest:DataClass] started at line 48
[SuggestRequest] Unclosed Anchor: [DEF:SuggestRequest:DataClass] started at line 48
[SuggestRequest] Unclosed Anchor: [DEF:SuggestRequest:DataClass] started at line 48
[SuggestRequest] Unclosed Anchor: [DEF:SuggestRequest:DataClass] started at line 48
[get_mappings] Unclosed Anchor at end of file (started line 54)
[get_mappings] Unclosed Anchor: [DEF:get_mappings:Function] started at line 54
[get_mappings] Unclosed Anchor: [DEF:get_mappings:Function] started at line 54
[get_mappings] Unclosed Anchor: [DEF:get_mappings:Function] started at line 54
[get_mappings] Unclosed Anchor: [DEF:get_mappings:Function] started at line 54
[get_mappings] Unclosed Anchor: [DEF:get_mappings:Function] started at line 54
[create_mapping] Unclosed Anchor at end of file (started line 70)
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[suggest_mappings_api] Unclosed Anchor at end of file (started line 95)
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95 | -| backend/src/core/scheduler.py | 🔴 29% | [SchedulerModule] Unclosed Anchor at end of file (started line 1)
[SchedulerModule] Unclosed Anchor: [DEF:SchedulerModule:Module] started at line 1
[SchedulerService] Unclosed Anchor at end of file (started line 16)
[SchedulerService] Unclosed Anchor: [DEF:SchedulerService:Class] started at line 16
[SchedulerService] Unclosed Anchor: [DEF:SchedulerService:Class] started at line 16
[SchedulerService.start] Unclosed Anchor at end of file (started line 27)
[SchedulerService.start] Unclosed Anchor: [DEF:SchedulerService.start:Function] started at line 27
[SchedulerService.start] Unclosed Anchor: [DEF:SchedulerService.start:Function] started at line 27
[SchedulerService.start] Unclosed Anchor: [DEF:SchedulerService.start:Function] started at line 27
[SchedulerService.stop] Unclosed Anchor at end of file (started line 36)
[SchedulerService.stop] Unclosed Anchor: [DEF:SchedulerService.stop:Function] started at line 36
[SchedulerService.stop] Unclosed Anchor: [DEF:SchedulerService.stop:Function] started at line 36
[SchedulerService.stop] Unclosed Anchor: [DEF:SchedulerService.stop:Function] started at line 36
[SchedulerService.stop] Unclosed Anchor: [DEF:SchedulerService.stop:Function] started at line 36
[SchedulerService.load_schedules] Unclosed Anchor at end of file (started line 44)
[SchedulerService.load_schedules] Unclosed Anchor: [DEF:SchedulerService.load_schedules:Function] started at line 44
[SchedulerService.load_schedules] Unclosed Anchor: [DEF:SchedulerService.load_schedules:Function] started at line 44
[SchedulerService.load_schedules] Unclosed Anchor: [DEF:SchedulerService.load_schedules:Function] started at line 44
[SchedulerService.load_schedules] Unclosed Anchor: [DEF:SchedulerService.load_schedules:Function] started at line 44
[SchedulerService.load_schedules] Unclosed Anchor: [DEF:SchedulerService.load_schedules:Function] started at line 44 | -| generate_semantic_map.py | 🟢 100% | OK | -| search_script.py | 🟢 100% | OK | -| get_dataset_structure.py | 🟢 100% | OK | -| debug_db_api.py | 🟢 100% | OK | -| run_mapper.py | 🟢 100% | OK | -| backend/src/core/task_manager/manager.py | 🟢 100% | OK | -| backend/src/core/task_manager/__init__.py | 🟢 100% | OK | -| backend/src/core/task_manager/models.py | 🟢 100% | OK | -| backend/src/core/task_manager/persistence.py | 🟢 100% | OK | diff --git a/semantics/reports/semantic_report_20260101_163539.md b/semantics/reports/semantic_report_20260101_163539.md deleted file mode 100644 index 3fbb86f..0000000 --- a/semantics/reports/semantic_report_20260101_163539.md +++ /dev/null @@ -1,80 +0,0 @@ -# Semantic Compliance Report - -**Generated At:** 2026-01-01T16:35:39.152636 -**Global Compliance Score:** 36.2% -**Scanned Files:** 68 - -## Critical Parsing Errors -- 🔴 backend/src/app.py:153 Mismatched closing anchor. Expected [/DEF:App:Global], found [/DEF:AppModule:Module]. - -## File Compliance Status -| File | Score | Issues | -|------|-------|--------| -| frontend/src/App.svelte | 🔴 0% | [App] Unclosed Anchor at end of file (started line 1)
[App] Unclosed Anchor: [DEF:App:Component] started at line 1
[handleFormSubmit] Unclosed Anchor at end of file (started line 24)
[handleFormSubmit] Unclosed Anchor: [DEF:handleFormSubmit:Function] started at line 24
[handleFormSubmit] Unclosed Anchor: [DEF:handleFormSubmit:Function] started at line 24
[navigate] Unclosed Anchor at end of file (started line 44)
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44 | -| frontend/src/main.js | 🔴 0% | [main] Unclosed Anchor at end of file (started line 1)
[main] Unclosed Anchor: [DEF:main:Module] started at line 1
[app_instance] Unclosed Anchor at end of file (started line 9)
[app_instance] Unclosed Anchor: [DEF:app_instance:Data] started at line 9
[app_instance] Unclosed Anchor: [DEF:app_instance:Data] started at line 9 | -| frontend/src/components/DashboardGrid.svelte | 🔴 0% | [DashboardGrid] Unclosed Anchor at end of file (started line 1)
[DashboardGrid] Unclosed Anchor: [DEF:DashboardGrid:Component] started at line 1
[handleSort] Unclosed Anchor at end of file (started line 62)
[handleSort] Unclosed Anchor: [DEF:handleSort:Function] started at line 62
[handleSort] Unclosed Anchor: [DEF:handleSort:Function] started at line 62
[handleSelectionChange] Unclosed Anchor at end of file (started line 74)
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectAll] Unclosed Anchor at end of file (started line 88)
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[goToPage] Unclosed Anchor at end of file (started line 106)
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106 | -| frontend/src/components/TaskHistory.svelte | 🔴 0% | [TaskHistory] Unclosed Anchor at end of file (started line 1)
[TaskHistory] Unclosed Anchor: [DEF:TaskHistory:Component] started at line 1 | -| frontend/src/components/MappingTable.svelte | 🔴 0% | [MappingTable] Unclosed Anchor at end of file (started line 1)
[MappingTable] Unclosed Anchor: [DEF:MappingTable:Component] started at line 1
[updateMapping] Unclosed Anchor at end of file (started line 25)
[updateMapping] Unclosed Anchor: [DEF:updateMapping:Function] started at line 25
[updateMapping] Unclosed Anchor: [DEF:updateMapping:Function] started at line 25
[getSuggestion] Unclosed Anchor at end of file (started line 34)
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34 | -| frontend/src/components/EnvSelector.svelte | 🔴 0% | [EnvSelector] Unclosed Anchor at end of file (started line 1)
[EnvSelector] Unclosed Anchor: [DEF:EnvSelector:Component] started at line 1
[handleSelect] Unclosed Anchor at end of file (started line 24)
[handleSelect] Unclosed Anchor: [DEF:handleSelect:Function] started at line 24
[handleSelect] Unclosed Anchor: [DEF:handleSelect:Function] started at line 24 | -| frontend/src/components/TaskList.svelte | 🔴 0% | [TaskList] Unclosed Anchor at end of file (started line 1)
[TaskList] Unclosed Anchor: [DEF:TaskList:Component] started at line 1 | -| frontend/src/components/DynamicForm.svelte | 🔴 0% | [DynamicForm] Unclosed Anchor at end of file (started line 1)
[DynamicForm] Unclosed Anchor: [DEF:DynamicForm:Component] started at line 1
[handleSubmit] Unclosed Anchor at end of file (started line 23)
[handleSubmit] Unclosed Anchor: [DEF:handleSubmit:Function] started at line 23
[handleSubmit] Unclosed Anchor: [DEF:handleSubmit:Function] started at line 23
[initializeForm] Unclosed Anchor at end of file (started line 33)
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33 | -| frontend/src/components/TaskRunner.svelte | 🔴 0% | [TaskRunner] Unclosed Anchor at end of file (started line 1)
[TaskRunner] Unclosed Anchor: [DEF:TaskRunner:Component] started at line 1
[connect] Unclosed Anchor at end of file (started line 38)
[connect] Unclosed Anchor: [DEF:connect:Function] started at line 38
[connect] Unclosed Anchor: [DEF:connect:Function] started at line 38
[onMount] Unclosed Anchor at end of file (started line 225)
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onDestroy] Unclosed Anchor at end of file (started line 251)
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251 | -| frontend/src/components/TaskLogViewer.svelte | 🔴 0% | [TaskLogViewer] Unclosed Anchor at end of file (started line 1)
[TaskLogViewer] Unclosed Anchor: [DEF:TaskLogViewer:Component] started at line 1 | -| frontend/src/components/PasswordPrompt.svelte | 🔴 0% | [PasswordPrompt] Unclosed Anchor at end of file (started line 1)
[PasswordPrompt] Unclosed Anchor: [DEF:PasswordPrompt:Component] started at line 1 | -| frontend/src/components/MissingMappingModal.svelte | 🔴 0% | [MissingMappingModal] Unclosed Anchor at end of file (started line 1)
[MissingMappingModal] Unclosed Anchor: [DEF:MissingMappingModal:Component] started at line 1
[resolve] Unclosed Anchor at end of file (started line 26)
[resolve] Unclosed Anchor: [DEF:resolve:Function] started at line 26
[resolve] Missing Mandatory Tag: @PURPOSE
[resolve] Unclosed Anchor: [DEF:resolve:Function] started at line 26
[resolve] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor at end of file (started line 38)
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE | -| frontend/src/components/Toast.svelte | 🔴 0% | [Toast] Unclosed Anchor at end of file (started line 1)
[Toast] Unclosed Anchor: [DEF:Toast:Component] started at line 1 | -| frontend/src/pages/Settings.svelte | 🔴 0% | [Settings] Unclosed Anchor at end of file (started line 1)
[Settings] Unclosed Anchor: [DEF:Settings:Component] started at line 1
[loadSettings] Unclosed Anchor at end of file (started line 50)
[loadSettings] Unclosed Anchor: [DEF:loadSettings:Function] started at line 50
[loadSettings] Unclosed Anchor: [DEF:loadSettings:Function] started at line 50
[handleSaveGlobal] Unclosed Anchor at end of file (started line 67)
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleAddOrUpdateEnv] Unclosed Anchor at end of file (started line 84)
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleDeleteEnv] Unclosed Anchor at end of file (started line 108)
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleTestEnv] Unclosed Anchor at end of file (started line 129)
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[editEnv] Unclosed Anchor at end of file (started line 152)
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[resetEnvForm] Unclosed Anchor at end of file (started line 163)
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163 | -| frontend/src/pages/Dashboard.svelte | 🔴 0% | [Dashboard] Unclosed Anchor at end of file (started line 1)
[Dashboard] Unclosed Anchor: [DEF:Dashboard:Component] started at line 1
[onMount] Unclosed Anchor at end of file (started line 17)
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 17
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 17
[selectPlugin] Unclosed Anchor at end of file (started line 27)
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27 | -| frontend/src/lib/stores.js | 🔴 0% | [stores_module] Unclosed Anchor at end of file (started line 1)
[stores_module] Unclosed Anchor: [DEF:stores_module:Module] started at line 1
[plugins] Unclosed Anchor at end of file (started line 9)
[plugins] Unclosed Anchor: [DEF:plugins:Data] started at line 9
[plugins] Unclosed Anchor: [DEF:plugins:Data] started at line 9
[tasks] Unclosed Anchor at end of file (started line 13)
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[selectedPlugin] Unclosed Anchor at end of file (started line 17)
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedTask] Unclosed Anchor at end of file (started line 21)
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[currentPage] Unclosed Anchor at end of file (started line 25)
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[taskLogs] Unclosed Anchor at end of file (started line 29)
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[fetchPlugins] Unclosed Anchor at end of file (started line 33)
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchTasks] Unclosed Anchor at end of file (started line 47)
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47 | -| frontend/src/lib/toasts.js | 🔴 0% | [toasts_module] Unclosed Anchor at end of file (started line 1)
[toasts_module] Unclosed Anchor: [DEF:toasts_module:Module] started at line 1
[toasts] Unclosed Anchor at end of file (started line 8)
[toasts] Unclosed Anchor: [DEF:toasts:Data] started at line 8
[toasts] Unclosed Anchor: [DEF:toasts:Data] started at line 8
[addToast] Unclosed Anchor at end of file (started line 12)
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[removeToast] Unclosed Anchor at end of file (started line 25)
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25 | -| frontend/src/lib/api.js | 🔴 0% | [api_module] Unclosed Anchor at end of file (started line 1)
[api_module] Unclosed Anchor: [DEF:api_module:Module] started at line 1
[fetchApi] Unclosed Anchor at end of file (started line 26)
[fetchApi] Unclosed Anchor: [DEF:fetchApi:Function] started at line 26
[fetchApi] Unclosed Anchor: [DEF:fetchApi:Function] started at line 26
[postApi] Unclosed Anchor at end of file (started line 46)
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[requestApi] Unclosed Anchor at end of file (started line 73)
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[api] Unclosed Anchor at end of file (started line 100)
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100 | -| frontend/src/routes/migration/+page.svelte | 🔴 0% | [MigrationDashboard] Unclosed Anchor at end of file (started line 1)
[MigrationDashboard] Unclosed Anchor: [DEF:MigrationDashboard:Component] started at line 1
[fetchEnvironments] Unclosed Anchor at end of file (started line 51)
[fetchEnvironments] Unclosed Anchor: [DEF:fetchEnvironments:Function] started at line 51
[fetchEnvironments] Unclosed Anchor: [DEF:fetchEnvironments:Function] started at line 51
[fetchDashboards] Unclosed Anchor at end of file (started line 69)
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDatabases] Unclosed Anchor at end of file (started line 93)
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[handleMappingUpdate] Unclosed Anchor at end of file (started line 128)
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleViewLogs] Unclosed Anchor at end of file (started line 163)
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor at end of file (started line 172)
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[startMigration] Unclosed Anchor at end of file (started line 207)
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207 | -| frontend/src/routes/migration/mappings/+page.svelte | 🔴 0% | [MappingManagement] Unclosed Anchor at end of file (started line 1)
[MappingManagement] Unclosed Anchor: [DEF:MappingManagement:Component] started at line 1
[fetchDatabases] Unclosed Anchor at end of file (started line 47)
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 47
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 47
[handleUpdate] Unclosed Anchor at end of file (started line 83)
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83 | -| backend/src/models/mapping.py | 🔴 0% | [backend.src.models.mapping] Unclosed Anchor at end of file (started line 1)
[backend.src.models.mapping] Unclosed Anchor: [DEF:backend.src.models.mapping:Module] started at line 1
[MigrationStatus] Unclosed Anchor at end of file (started line 21)
[MigrationStatus] Unclosed Anchor: [DEF:MigrationStatus:Class] started at line 21
[MigrationStatus] Unclosed Anchor: [DEF:MigrationStatus:Class] started at line 21
[Environment] Unclosed Anchor at end of file (started line 31)
[Environment] Unclosed Anchor: [DEF:Environment:Class] started at line 31
[Environment] Unclosed Anchor: [DEF:Environment:Class] started at line 31
[Environment] Unclosed Anchor: [DEF:Environment:Class] started at line 31
[DatabaseMapping] Unclosed Anchor at end of file (started line 42)
[DatabaseMapping] Unclosed Anchor: [DEF:DatabaseMapping:Class] started at line 42
[DatabaseMapping] Unclosed Anchor: [DEF:DatabaseMapping:Class] started at line 42
[DatabaseMapping] Unclosed Anchor: [DEF:DatabaseMapping:Class] started at line 42
[DatabaseMapping] Unclosed Anchor: [DEF:DatabaseMapping:Class] started at line 42
[MigrationJob] Unclosed Anchor at end of file (started line 57)
[MigrationJob] Unclosed Anchor: [DEF:MigrationJob:Class] started at line 57
[MigrationJob] Unclosed Anchor: [DEF:MigrationJob:Class] started at line 57
[MigrationJob] Unclosed Anchor: [DEF:MigrationJob:Class] started at line 57
[MigrationJob] Unclosed Anchor: [DEF:MigrationJob:Class] started at line 57
[MigrationJob] Unclosed Anchor: [DEF:MigrationJob:Class] started at line 57 | -| backend/src/models/dashboard.py | 🔴 0% | [backend.src.models.dashboard] Unclosed Anchor at end of file (started line 1)
[backend.src.models.dashboard] Unclosed Anchor: [DEF:backend.src.models.dashboard:Module] started at line 1
[DashboardMetadata] Unclosed Anchor at end of file (started line 10)
[DashboardMetadata] Unclosed Anchor: [DEF:DashboardMetadata:Class] started at line 10
[DashboardMetadata] Unclosed Anchor: [DEF:DashboardMetadata:Class] started at line 10
[DashboardSelection] Unclosed Anchor at end of file (started line 19)
[DashboardSelection] Unclosed Anchor: [DEF:DashboardSelection:Class] started at line 19
[DashboardSelection] Unclosed Anchor: [DEF:DashboardSelection:Class] started at line 19
[DashboardSelection] Unclosed Anchor: [DEF:DashboardSelection:Class] started at line 19 | -| backend/src/models/task.py | 🔴 0% | [backend.src.models.task] Unclosed Anchor at end of file (started line 1)
[backend.src.models.task] Unclosed Anchor: [DEF:backend.src.models.task:Module] started at line 1
[TaskRecord] Unclosed Anchor at end of file (started line 17)
[TaskRecord] Unclosed Anchor: [DEF:TaskRecord:Class] started at line 17
[TaskRecord] Unclosed Anchor: [DEF:TaskRecord:Class] started at line 17 | -| backend/src/services/mapping_service.py | 🔴 0% | [backend.src.services.mapping_service] Unclosed Anchor at end of file (started line 1)
[backend.src.services.mapping_service] Unclosed Anchor: [DEF:backend.src.services.mapping_service:Module] started at line 1
[MappingService] Unclosed Anchor at end of file (started line 18)
[MappingService] Unclosed Anchor: [DEF:MappingService:Class] started at line 18
[MappingService] Unclosed Anchor: [DEF:MappingService:Class] started at line 18
[MappingService.__init__] Unclosed Anchor at end of file (started line 22)
[MappingService.__init__] Unclosed Anchor: [DEF:MappingService.__init__:Function] started at line 22
[MappingService.__init__] Missing Mandatory Tag: @PURPOSE
[MappingService.__init__] Unclosed Anchor: [DEF:MappingService.__init__:Function] started at line 22
[MappingService.__init__] Missing Mandatory Tag: @PURPOSE
[MappingService.__init__] Unclosed Anchor: [DEF:MappingService.__init__:Function] started at line 22
[MappingService.__init__] Missing Mandatory Tag: @PURPOSE
[MappingService._get_client] Unclosed Anchor at end of file (started line 26)
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService.get_suggestions] Unclosed Anchor at end of file (started line 46)
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46 | -| backend/src/core/config_manager.py | 🔴 0% | [ConfigManagerModule] Unclosed Anchor at end of file (started line 1)
[ConfigManagerModule] Unclosed Anchor: [DEF:ConfigManagerModule:Module] started at line 1
[ConfigManager] Unclosed Anchor at end of file (started line 22)
[ConfigManager] Unclosed Anchor: [DEF:ConfigManager:Class] started at line 22
[ConfigManager] Unclosed Anchor: [DEF:ConfigManager:Class] started at line 22
[__init__] Unclosed Anchor at end of file (started line 27)
[__init__] Unclosed Anchor: [DEF:__init__:Function] started at line 27
[__init__] Unclosed Anchor: [DEF:__init__:Function] started at line 27
[__init__] Unclosed Anchor: [DEF:__init__:Function] started at line 27
[_load_config] Unclosed Anchor at end of file (started line 51)
[_load_config] Unclosed Anchor: [DEF:_load_config:Function] started at line 51
[_load_config] Unclosed Anchor: [DEF:_load_config:Function] started at line 51
[_load_config] Unclosed Anchor: [DEF:_load_config:Function] started at line 51
[_load_config] Unclosed Anchor: [DEF:_load_config:Function] started at line 51
[_save_config_to_disk] Unclosed Anchor at end of file (started line 83)
[_save_config_to_disk] Unclosed Anchor: [DEF:_save_config_to_disk:Function] started at line 83
[_save_config_to_disk] Unclosed Anchor: [DEF:_save_config_to_disk:Function] started at line 83
[_save_config_to_disk] Unclosed Anchor: [DEF:_save_config_to_disk:Function] started at line 83
[_save_config_to_disk] Unclosed Anchor: [DEF:_save_config_to_disk:Function] started at line 83
[_save_config_to_disk] Unclosed Anchor: [DEF:_save_config_to_disk:Function] started at line 83
[save] Unclosed Anchor at end of file (started line 102)
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[get_config] Unclosed Anchor at end of file (started line 108)
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[update_global_settings] Unclosed Anchor at end of file (started line 115)
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[validate_path] Unclosed Anchor at end of file (started line 135)
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[get_environments] Unclosed Anchor at end of file (started line 153)
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[has_environments] Unclosed Anchor at end of file (started line 160)
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[add_environment] Unclosed Anchor at end of file (started line 167)
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[update_environment] Unclosed Anchor at end of file (started line 186)
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[delete_environment] Unclosed Anchor at end of file (started line 215)
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215 | -| backend/src/core/superset_client.py | 🔴 0% | [backend.src.core.superset_client] Unclosed Anchor at end of file (started line 1)
[backend.src.core.superset_client] Unclosed Anchor: [DEF:backend.src.core.superset_client:Module] started at line 1
[SupersetClient] Unclosed Anchor at end of file (started line 16)
[SupersetClient] Unclosed Anchor: [DEF:SupersetClient:Class] started at line 16
[SupersetClient] Unclosed Anchor: [DEF:SupersetClient:Class] started at line 16
[SupersetClient.get_databases_summary] Unclosed Anchor at end of file (started line 20)
[SupersetClient.get_databases_summary] Unclosed Anchor: [DEF:SupersetClient.get_databases_summary:Function] started at line 20
[SupersetClient.get_databases_summary] Unclosed Anchor: [DEF:SupersetClient.get_databases_summary:Function] started at line 20
[SupersetClient.get_databases_summary] Unclosed Anchor: [DEF:SupersetClient.get_databases_summary:Function] started at line 20
[SupersetClient.get_database_by_uuid] Unclosed Anchor at end of file (started line 40)
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_dashboards_summary] Unclosed Anchor at end of file (started line 55)
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55 | -| backend/src/core/migration_engine.py | 🔴 0% | [backend.src.core.migration_engine] Unclosed Anchor at end of file (started line 1)
[backend.src.core.migration_engine] Unclosed Anchor: [DEF:backend.src.core.migration_engine:Module] started at line 1
[MigrationEngine] Unclosed Anchor at end of file (started line 22)
[MigrationEngine] Unclosed Anchor: [DEF:MigrationEngine:Class] started at line 22
[MigrationEngine] Unclosed Anchor: [DEF:MigrationEngine:Class] started at line 22
[MigrationEngine.transform_zip] Unclosed Anchor at end of file (started line 26)
[MigrationEngine.transform_zip] Unclosed Anchor: [DEF:MigrationEngine.transform_zip:Function] started at line 26
[MigrationEngine.transform_zip] Unclosed Anchor: [DEF:MigrationEngine.transform_zip:Function] started at line 26
[MigrationEngine.transform_zip] Unclosed Anchor: [DEF:MigrationEngine.transform_zip:Function] started at line 26
[MigrationEngine._transform_yaml] Unclosed Anchor at end of file (started line 77)
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77 | -| backend/src/core/logger.py | 🔴 0% | [LoggerModule] Unclosed Anchor at end of file (started line 1)
[LoggerModule] Unclosed Anchor: [DEF:LoggerModule:Module] started at line 1
[BeliefFormatter] Unclosed Anchor at end of file (started line 22)
[BeliefFormatter] Unclosed Anchor: [DEF:BeliefFormatter:Class] started at line 22
[BeliefFormatter] Unclosed Anchor: [DEF:BeliefFormatter:Class] started at line 22
[LogEntry] Unclosed Anchor at end of file (started line 34)
[LogEntry] Unclosed Anchor: [DEF:LogEntry:Class] started at line 34
[LogEntry] Unclosed Anchor: [DEF:LogEntry:Class] started at line 34
[LogEntry] Unclosed Anchor: [DEF:LogEntry:Class] started at line 34
[BeliefScope] Unclosed Anchor at end of file (started line 45)
[BeliefScope] Unclosed Anchor: [DEF:BeliefScope:Function] started at line 45
[BeliefScope] Unclosed Anchor: [DEF:BeliefScope:Function] started at line 45
[BeliefScope] Unclosed Anchor: [DEF:BeliefScope:Function] started at line 45
[BeliefScope] Unclosed Anchor: [DEF:BeliefScope:Function] started at line 45
[ConfigureLogger] Unclosed Anchor at end of file (started line 76)
[ConfigureLogger] Unclosed Anchor: [DEF:ConfigureLogger:Function] started at line 76
[ConfigureLogger] Unclosed Anchor: [DEF:ConfigureLogger:Function] started at line 76
[ConfigureLogger] Unclosed Anchor: [DEF:ConfigureLogger:Function] started at line 76
[ConfigureLogger] Unclosed Anchor: [DEF:ConfigureLogger:Function] started at line 76
[ConfigureLogger] Unclosed Anchor: [DEF:ConfigureLogger:Function] started at line 76
[WebSocketLogHandler] Unclosed Anchor at end of file (started line 120)
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[Logger] Unclosed Anchor at end of file (started line 163)
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163 | -| backend/src/core/database.py | 🔴 0% | [backend.src.core.database] Unclosed Anchor at end of file (started line 1)
[backend.src.core.database] Unclosed Anchor: [DEF:backend.src.core.database:Module] started at line 1
[DATABASE_URL] Unclosed Anchor at end of file (started line 20)
[DATABASE_URL] Unclosed Anchor: [DEF:DATABASE_URL:Constant] started at line 20
[DATABASE_URL] Unclosed Anchor: [DEF:DATABASE_URL:Constant] started at line 20
[TASKS_DATABASE_URL] Unclosed Anchor at end of file (started line 24)
[TASKS_DATABASE_URL] Unclosed Anchor: [DEF:TASKS_DATABASE_URL:Constant] started at line 24
[TASKS_DATABASE_URL] Unclosed Anchor: [DEF:TASKS_DATABASE_URL:Constant] started at line 24
[TASKS_DATABASE_URL] Unclosed Anchor: [DEF:TASKS_DATABASE_URL:Constant] started at line 24
[engine] Unclosed Anchor at end of file (started line 28)
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28
[tasks_engine] Unclosed Anchor at end of file (started line 32)
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[SessionLocal] Unclosed Anchor at end of file (started line 36)
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor at end of file (started line 40)
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[init_db] Unclosed Anchor at end of file (started line 44)
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[get_db] Unclosed Anchor at end of file (started line 51)
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_tasks_db] Unclosed Anchor at end of file (started line 63)
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63 | -| backend/src/core/config_models.py | 🔴 0% | [ConfigModels] Unclosed Anchor at end of file (started line 1)
[ConfigModels] Unclosed Anchor: [DEF:ConfigModels:Module] started at line 1
[Schedule] Unclosed Anchor at end of file (started line 11)
[Schedule] Unclosed Anchor: [DEF:Schedule:DataClass] started at line 11
[Schedule] Unclosed Anchor: [DEF:Schedule:DataClass] started at line 11
[Environment] Unclosed Anchor at end of file (started line 18)
[Environment] Unclosed Anchor: [DEF:Environment:DataClass] started at line 18
[Environment] Unclosed Anchor: [DEF:Environment:DataClass] started at line 18
[Environment] Unclosed Anchor: [DEF:Environment:DataClass] started at line 18
[LoggingConfig] Unclosed Anchor at end of file (started line 30)
[LoggingConfig] Unclosed Anchor: [DEF:LoggingConfig:DataClass] started at line 30
[LoggingConfig] Unclosed Anchor: [DEF:LoggingConfig:DataClass] started at line 30
[LoggingConfig] Unclosed Anchor: [DEF:LoggingConfig:DataClass] started at line 30
[LoggingConfig] Unclosed Anchor: [DEF:LoggingConfig:DataClass] started at line 30
[GlobalSettings] Unclosed Anchor at end of file (started line 40)
[GlobalSettings] Unclosed Anchor: [DEF:GlobalSettings:DataClass] started at line 40
[GlobalSettings] Unclosed Anchor: [DEF:GlobalSettings:DataClass] started at line 40
[GlobalSettings] Unclosed Anchor: [DEF:GlobalSettings:DataClass] started at line 40
[GlobalSettings] Unclosed Anchor: [DEF:GlobalSettings:DataClass] started at line 40
[GlobalSettings] Unclosed Anchor: [DEF:GlobalSettings:DataClass] started at line 40
[AppConfig] Unclosed Anchor at end of file (started line 53)
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53 | -| backend/src/core/plugin_loader.py | 🔴 0% | [PluginLoader] Unclosed Anchor at end of file (started line 8)
[PluginLoader] Unclosed Anchor: [DEF:PluginLoader:Class] started at line 8 | -| backend/src/core/plugin_base.py | 🔴 0% | [PluginBase] Unclosed Anchor at end of file (started line 6)
[PluginBase] Unclosed Anchor: [DEF:PluginBase:Class] started at line 6
[PluginConfig] Unclosed Anchor at end of file (started line 59)
[PluginConfig] Unclosed Anchor: [DEF:PluginConfig:Class] started at line 59
[PluginConfig] Unclosed Anchor: [DEF:PluginConfig:Class] started at line 59 | -| backend/src/core/utils/matching.py | 🔴 0% | [backend.src.core.utils.matching] Unclosed Anchor at end of file (started line 1)
[backend.src.core.utils.matching] Unclosed Anchor: [DEF:backend.src.core.utils.matching:Module] started at line 1
[suggest_mappings] Unclosed Anchor at end of file (started line 15)
[suggest_mappings] Unclosed Anchor: [DEF:suggest_mappings:Function] started at line 15
[suggest_mappings] Unclosed Anchor: [DEF:suggest_mappings:Function] started at line 15 | -| backend/src/core/task_manager/cleanup.py | 🔴 0% | [TaskCleanupModule] Unclosed Anchor at end of file (started line 1)
[TaskCleanupModule] Unclosed Anchor: [DEF:TaskCleanupModule:Module] started at line 1
[TaskCleanupService] Unclosed Anchor at end of file (started line 12)
[TaskCleanupService] Unclosed Anchor: [DEF:TaskCleanupService:Class] started at line 12
[TaskCleanupService] Unclosed Anchor: [DEF:TaskCleanupService:Class] started at line 12
[TaskCleanupService.run_cleanup] Unclosed Anchor at end of file (started line 19)
[TaskCleanupService.run_cleanup] Unclosed Anchor: [DEF:TaskCleanupService.run_cleanup:Function] started at line 19
[TaskCleanupService.run_cleanup] Unclosed Anchor: [DEF:TaskCleanupService.run_cleanup:Function] started at line 19
[TaskCleanupService.run_cleanup] Unclosed Anchor: [DEF:TaskCleanupService.run_cleanup:Function] started at line 19 | -| backend/src/plugins/backup.py | 🔴 0% | [BackupPlugin] Unclosed Anchor at end of file (started line 1)
[BackupPlugin] Unclosed Anchor: [DEF:BackupPlugin:Module] started at line 1 | -| backend/src/plugins/migration.py | 🔴 0% | [MigrationPlugin] Unclosed Anchor at end of file (started line 1)
[MigrationPlugin] Unclosed Anchor: [DEF:MigrationPlugin:Module] started at line 1
[MigrationPlugin.execute] Unclosed Anchor at end of file (started line 103)
[MigrationPlugin.execute] Unclosed Anchor: [DEF:MigrationPlugin.execute:Action] started at line 103
[MigrationPlugin.execute] Unclosed Anchor: [DEF:MigrationPlugin.execute:Action] started at line 103 | -| backend/src/api/auth.py | 🔴 0% | [AuthModule] Unclosed Anchor at end of file (started line 1)
[AuthModule] Unclosed Anchor: [DEF:AuthModule:Module] started at line 1 | -| backend/src/api/routes/settings.py | 🔴 0% | [SettingsRouter] Unclosed Anchor at end of file (started line 1)
[SettingsRouter] Unclosed Anchor: [DEF:SettingsRouter:Module] started at line 1
[get_settings] Unclosed Anchor at end of file (started line 26)
[get_settings] Unclosed Anchor: [DEF:get_settings:Function] started at line 26
[get_settings] Unclosed Anchor: [DEF:get_settings:Function] started at line 26
[update_global_settings] Unclosed Anchor at end of file (started line 40)
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 40
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 40
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 40
[get_environments] Unclosed Anchor at end of file (started line 54)
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 54
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 54
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 54
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 54
[add_environment] Unclosed Anchor at end of file (started line 63)
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 63
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 63
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 63
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 63
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 63
[update_environment] Unclosed Anchor at end of file (started line 96)
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[delete_environment] Unclosed Anchor at end of file (started line 139)
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[test_environment_connection] Unclosed Anchor at end of file (started line 152)
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[validate_backup_path] Unclosed Anchor at end of file (started line 195)
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195 | -| backend/src/api/routes/tasks.py | 🔴 0% | [TasksRouter] Unclosed Anchor at end of file (started line 1)
[TasksRouter] Unclosed Anchor: [DEF:TasksRouter:Module] started at line 1 | -| backend/src/api/routes/environments.py | 🔴 0% | [backend.src.api.routes.environments] Unclosed Anchor at end of file (started line 1)
[backend.src.api.routes.environments] Unclosed Anchor: [DEF:backend.src.api.routes.environments:Module] started at line 1
[ScheduleSchema] Unclosed Anchor at end of file (started line 23)
[ScheduleSchema] Unclosed Anchor: [DEF:ScheduleSchema:DataClass] started at line 23
[ScheduleSchema] Unclosed Anchor: [DEF:ScheduleSchema:DataClass] started at line 23
[EnvironmentResponse] Unclosed Anchor at end of file (started line 29)
[EnvironmentResponse] Unclosed Anchor: [DEF:EnvironmentResponse:DataClass] started at line 29
[EnvironmentResponse] Unclosed Anchor: [DEF:EnvironmentResponse:DataClass] started at line 29
[EnvironmentResponse] Unclosed Anchor: [DEF:EnvironmentResponse:DataClass] started at line 29
[DatabaseResponse] Unclosed Anchor at end of file (started line 37)
[DatabaseResponse] Unclosed Anchor: [DEF:DatabaseResponse:DataClass] started at line 37
[DatabaseResponse] Unclosed Anchor: [DEF:DatabaseResponse:DataClass] started at line 37
[DatabaseResponse] Unclosed Anchor: [DEF:DatabaseResponse:DataClass] started at line 37
[DatabaseResponse] Unclosed Anchor: [DEF:DatabaseResponse:DataClass] started at line 37
[get_environments] Unclosed Anchor at end of file (started line 44)
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 44
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 44
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 44
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 44
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 44
[update_environment_schedule] Unclosed Anchor at end of file (started line 66)
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[get_environment_databases] Unclosed Anchor at end of file (started line 94)
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94 | -| backend/src/api/routes/plugins.py | 🔴 0% | [PluginsRouter] Unclosed Anchor at end of file (started line 1)
[PluginsRouter] Unclosed Anchor: [DEF:PluginsRouter:Module] started at line 1 | -| backend/src/api/routes/migration.py | 🔴 0% | [backend.src.api.routes.migration] Unclosed Anchor at end of file (started line 1)
[backend.src.api.routes.migration] Unclosed Anchor: [DEF:backend.src.api.routes.migration:Module] started at line 1
[get_dashboards] Unclosed Anchor at end of file (started line 17)
[get_dashboards] Unclosed Anchor: [DEF:get_dashboards:Function] started at line 17
[get_dashboards] Unclosed Anchor: [DEF:get_dashboards:Function] started at line 17
[execute_migration] Unclosed Anchor at end of file (started line 42)
[execute_migration] Unclosed Anchor: [DEF:execute_migration:Function] started at line 42
[execute_migration] Unclosed Anchor: [DEF:execute_migration:Function] started at line 42
[execute_migration] Unclosed Anchor: [DEF:execute_migration:Function] started at line 42 | -| backend/src/api/routes/mappings.py | 🔴 0% | [backend.src.api.routes.mappings] Unclosed Anchor at end of file (started line 1)
[backend.src.api.routes.mappings] Unclosed Anchor: [DEF:backend.src.api.routes.mappings:Module] started at line 1
[MappingCreate] Unclosed Anchor at end of file (started line 24)
[MappingCreate] Unclosed Anchor: [DEF:MappingCreate:DataClass] started at line 24
[MappingCreate] Unclosed Anchor: [DEF:MappingCreate:DataClass] started at line 24
[MappingResponse] Unclosed Anchor at end of file (started line 34)
[MappingResponse] Unclosed Anchor: [DEF:MappingResponse:DataClass] started at line 34
[MappingResponse] Unclosed Anchor: [DEF:MappingResponse:DataClass] started at line 34
[MappingResponse] Unclosed Anchor: [DEF:MappingResponse:DataClass] started at line 34
[SuggestRequest] Unclosed Anchor at end of file (started line 48)
[SuggestRequest] Unclosed Anchor: [DEF:SuggestRequest:DataClass] started at line 48
[SuggestRequest] Unclosed Anchor: [DEF:SuggestRequest:DataClass] started at line 48
[SuggestRequest] Unclosed Anchor: [DEF:SuggestRequest:DataClass] started at line 48
[SuggestRequest] Unclosed Anchor: [DEF:SuggestRequest:DataClass] started at line 48
[get_mappings] Unclosed Anchor at end of file (started line 54)
[get_mappings] Unclosed Anchor: [DEF:get_mappings:Function] started at line 54
[get_mappings] Unclosed Anchor: [DEF:get_mappings:Function] started at line 54
[get_mappings] Unclosed Anchor: [DEF:get_mappings:Function] started at line 54
[get_mappings] Unclosed Anchor: [DEF:get_mappings:Function] started at line 54
[get_mappings] Unclosed Anchor: [DEF:get_mappings:Function] started at line 54
[create_mapping] Unclosed Anchor at end of file (started line 70)
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[suggest_mappings_api] Unclosed Anchor at end of file (started line 95)
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95 | -| backend/src/app.py | 🟡 60% | [AppModule] Unclosed Anchor at end of file (started line 1)
[AppModule] Unclosed Anchor: [DEF:AppModule:Module] started at line 1
[App] Unclosed Anchor at end of file (started line 26)
[App] Unclosed Anchor: [DEF:App:Global] started at line 26
[App] Unclosed Anchor: [DEF:App:Global] started at line 26 | -| generate_semantic_map.py | 🟢 100% | OK | -| search_script.py | 🟢 100% | OK | -| get_dataset_structure.py | 🟢 100% | OK | -| debug_db_api.py | 🟢 100% | OK | -| run_mapper.py | 🟢 100% | OK | -| migration_script.py | 🟢 100% | OK | -| backup_script.py | 🟢 100% | OK | -| superset_tool/exceptions.py | 🟢 100% | OK | -| superset_tool/__init__.py | 🟢 100% | OK | -| superset_tool/client.py | 🟢 100% | OK | -| superset_tool/models.py | 🟢 100% | OK | -| superset_tool/utils/logger.py | 🟢 100% | OK | -| superset_tool/utils/network.py | 🟢 100% | OK | -| superset_tool/utils/whiptail_fallback.py | 🟢 100% | OK | -| superset_tool/utils/dataset_mapper.py | 🟢 100% | OK | -| superset_tool/utils/__init__.py | 🟢 100% | OK | -| superset_tool/utils/init_clients.py | 🟢 100% | OK | -| superset_tool/utils/fileio.py | 🟢 100% | OK | -| backend/src/dependencies.py | 🟢 100% | OK | -| backend/src/core/scheduler.py | 🟢 100% | OK | -| backend/src/core/task_manager/manager.py | 🟢 100% | OK | -| backend/src/core/task_manager/__init__.py | 🟢 100% | OK | -| backend/src/core/task_manager/models.py | 🟢 100% | OK | -| backend/src/core/task_manager/persistence.py | 🟢 100% | OK | diff --git a/semantics/reports/semantic_report_20260101_163627.md b/semantics/reports/semantic_report_20260101_163627.md deleted file mode 100644 index f09ffe5..0000000 --- a/semantics/reports/semantic_report_20260101_163627.md +++ /dev/null @@ -1,77 +0,0 @@ -# Semantic Compliance Report - -**Generated At:** 2026-01-01T16:36:27.207490 -**Global Compliance Score:** 36.8% -**Scanned Files:** 68 - -## File Compliance Status -| File | Score | Issues | -|------|-------|--------| -| frontend/src/App.svelte | 🔴 0% | [App] Unclosed Anchor at end of file (started line 1)
[App] Unclosed Anchor: [DEF:App:Component] started at line 1
[handleFormSubmit] Unclosed Anchor at end of file (started line 24)
[handleFormSubmit] Unclosed Anchor: [DEF:handleFormSubmit:Function] started at line 24
[handleFormSubmit] Unclosed Anchor: [DEF:handleFormSubmit:Function] started at line 24
[navigate] Unclosed Anchor at end of file (started line 44)
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44 | -| frontend/src/main.js | 🔴 0% | [main] Unclosed Anchor at end of file (started line 1)
[main] Unclosed Anchor: [DEF:main:Module] started at line 1
[app_instance] Unclosed Anchor at end of file (started line 9)
[app_instance] Unclosed Anchor: [DEF:app_instance:Data] started at line 9
[app_instance] Unclosed Anchor: [DEF:app_instance:Data] started at line 9 | -| frontend/src/components/DashboardGrid.svelte | 🔴 0% | [DashboardGrid] Unclosed Anchor at end of file (started line 1)
[DashboardGrid] Unclosed Anchor: [DEF:DashboardGrid:Component] started at line 1
[handleSort] Unclosed Anchor at end of file (started line 62)
[handleSort] Unclosed Anchor: [DEF:handleSort:Function] started at line 62
[handleSort] Unclosed Anchor: [DEF:handleSort:Function] started at line 62
[handleSelectionChange] Unclosed Anchor at end of file (started line 74)
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectAll] Unclosed Anchor at end of file (started line 88)
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[goToPage] Unclosed Anchor at end of file (started line 106)
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106 | -| frontend/src/components/TaskHistory.svelte | 🔴 0% | [TaskHistory] Unclosed Anchor at end of file (started line 1)
[TaskHistory] Unclosed Anchor: [DEF:TaskHistory:Component] started at line 1 | -| frontend/src/components/MappingTable.svelte | 🔴 0% | [MappingTable] Unclosed Anchor at end of file (started line 1)
[MappingTable] Unclosed Anchor: [DEF:MappingTable:Component] started at line 1
[updateMapping] Unclosed Anchor at end of file (started line 25)
[updateMapping] Unclosed Anchor: [DEF:updateMapping:Function] started at line 25
[updateMapping] Unclosed Anchor: [DEF:updateMapping:Function] started at line 25
[getSuggestion] Unclosed Anchor at end of file (started line 34)
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34 | -| frontend/src/components/EnvSelector.svelte | 🔴 0% | [EnvSelector] Unclosed Anchor at end of file (started line 1)
[EnvSelector] Unclosed Anchor: [DEF:EnvSelector:Component] started at line 1
[handleSelect] Unclosed Anchor at end of file (started line 24)
[handleSelect] Unclosed Anchor: [DEF:handleSelect:Function] started at line 24
[handleSelect] Unclosed Anchor: [DEF:handleSelect:Function] started at line 24 | -| frontend/src/components/TaskList.svelte | 🔴 0% | [TaskList] Unclosed Anchor at end of file (started line 1)
[TaskList] Unclosed Anchor: [DEF:TaskList:Component] started at line 1 | -| frontend/src/components/DynamicForm.svelte | 🔴 0% | [DynamicForm] Unclosed Anchor at end of file (started line 1)
[DynamicForm] Unclosed Anchor: [DEF:DynamicForm:Component] started at line 1
[handleSubmit] Unclosed Anchor at end of file (started line 23)
[handleSubmit] Unclosed Anchor: [DEF:handleSubmit:Function] started at line 23
[handleSubmit] Unclosed Anchor: [DEF:handleSubmit:Function] started at line 23
[initializeForm] Unclosed Anchor at end of file (started line 33)
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33 | -| frontend/src/components/TaskRunner.svelte | 🔴 0% | [TaskRunner] Unclosed Anchor at end of file (started line 1)
[TaskRunner] Unclosed Anchor: [DEF:TaskRunner:Component] started at line 1
[connect] Unclosed Anchor at end of file (started line 38)
[connect] Unclosed Anchor: [DEF:connect:Function] started at line 38
[connect] Unclosed Anchor: [DEF:connect:Function] started at line 38
[onMount] Unclosed Anchor at end of file (started line 225)
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onDestroy] Unclosed Anchor at end of file (started line 251)
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251 | -| frontend/src/components/TaskLogViewer.svelte | 🔴 0% | [TaskLogViewer] Unclosed Anchor at end of file (started line 1)
[TaskLogViewer] Unclosed Anchor: [DEF:TaskLogViewer:Component] started at line 1 | -| frontend/src/components/PasswordPrompt.svelte | 🔴 0% | [PasswordPrompt] Unclosed Anchor at end of file (started line 1)
[PasswordPrompt] Unclosed Anchor: [DEF:PasswordPrompt:Component] started at line 1 | -| frontend/src/components/MissingMappingModal.svelte | 🔴 0% | [MissingMappingModal] Unclosed Anchor at end of file (started line 1)
[MissingMappingModal] Unclosed Anchor: [DEF:MissingMappingModal:Component] started at line 1
[resolve] Unclosed Anchor at end of file (started line 26)
[resolve] Unclosed Anchor: [DEF:resolve:Function] started at line 26
[resolve] Missing Mandatory Tag: @PURPOSE
[resolve] Unclosed Anchor: [DEF:resolve:Function] started at line 26
[resolve] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor at end of file (started line 38)
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE | -| frontend/src/components/Toast.svelte | 🔴 0% | [Toast] Unclosed Anchor at end of file (started line 1)
[Toast] Unclosed Anchor: [DEF:Toast:Component] started at line 1 | -| frontend/src/pages/Settings.svelte | 🔴 0% | [Settings] Unclosed Anchor at end of file (started line 1)
[Settings] Unclosed Anchor: [DEF:Settings:Component] started at line 1
[loadSettings] Unclosed Anchor at end of file (started line 50)
[loadSettings] Unclosed Anchor: [DEF:loadSettings:Function] started at line 50
[loadSettings] Unclosed Anchor: [DEF:loadSettings:Function] started at line 50
[handleSaveGlobal] Unclosed Anchor at end of file (started line 67)
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleAddOrUpdateEnv] Unclosed Anchor at end of file (started line 84)
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleDeleteEnv] Unclosed Anchor at end of file (started line 108)
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleTestEnv] Unclosed Anchor at end of file (started line 129)
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[editEnv] Unclosed Anchor at end of file (started line 152)
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[resetEnvForm] Unclosed Anchor at end of file (started line 163)
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163 | -| frontend/src/pages/Dashboard.svelte | 🔴 0% | [Dashboard] Unclosed Anchor at end of file (started line 1)
[Dashboard] Unclosed Anchor: [DEF:Dashboard:Component] started at line 1
[onMount] Unclosed Anchor at end of file (started line 17)
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 17
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 17
[selectPlugin] Unclosed Anchor at end of file (started line 27)
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27 | -| frontend/src/lib/stores.js | 🔴 0% | [stores_module] Unclosed Anchor at end of file (started line 1)
[stores_module] Unclosed Anchor: [DEF:stores_module:Module] started at line 1
[plugins] Unclosed Anchor at end of file (started line 9)
[plugins] Unclosed Anchor: [DEF:plugins:Data] started at line 9
[plugins] Unclosed Anchor: [DEF:plugins:Data] started at line 9
[tasks] Unclosed Anchor at end of file (started line 13)
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[selectedPlugin] Unclosed Anchor at end of file (started line 17)
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedTask] Unclosed Anchor at end of file (started line 21)
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[currentPage] Unclosed Anchor at end of file (started line 25)
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[taskLogs] Unclosed Anchor at end of file (started line 29)
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[fetchPlugins] Unclosed Anchor at end of file (started line 33)
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchTasks] Unclosed Anchor at end of file (started line 47)
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47 | -| frontend/src/lib/toasts.js | 🔴 0% | [toasts_module] Unclosed Anchor at end of file (started line 1)
[toasts_module] Unclosed Anchor: [DEF:toasts_module:Module] started at line 1
[toasts] Unclosed Anchor at end of file (started line 8)
[toasts] Unclosed Anchor: [DEF:toasts:Data] started at line 8
[toasts] Unclosed Anchor: [DEF:toasts:Data] started at line 8
[addToast] Unclosed Anchor at end of file (started line 12)
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[removeToast] Unclosed Anchor at end of file (started line 25)
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25 | -| frontend/src/lib/api.js | 🔴 0% | [api_module] Unclosed Anchor at end of file (started line 1)
[api_module] Unclosed Anchor: [DEF:api_module:Module] started at line 1
[fetchApi] Unclosed Anchor at end of file (started line 26)
[fetchApi] Unclosed Anchor: [DEF:fetchApi:Function] started at line 26
[fetchApi] Unclosed Anchor: [DEF:fetchApi:Function] started at line 26
[postApi] Unclosed Anchor at end of file (started line 46)
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[requestApi] Unclosed Anchor at end of file (started line 73)
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[api] Unclosed Anchor at end of file (started line 100)
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100 | -| frontend/src/routes/migration/+page.svelte | 🔴 0% | [MigrationDashboard] Unclosed Anchor at end of file (started line 1)
[MigrationDashboard] Unclosed Anchor: [DEF:MigrationDashboard:Component] started at line 1
[fetchEnvironments] Unclosed Anchor at end of file (started line 51)
[fetchEnvironments] Unclosed Anchor: [DEF:fetchEnvironments:Function] started at line 51
[fetchEnvironments] Unclosed Anchor: [DEF:fetchEnvironments:Function] started at line 51
[fetchDashboards] Unclosed Anchor at end of file (started line 69)
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDatabases] Unclosed Anchor at end of file (started line 93)
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[handleMappingUpdate] Unclosed Anchor at end of file (started line 128)
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleViewLogs] Unclosed Anchor at end of file (started line 163)
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor at end of file (started line 172)
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[startMigration] Unclosed Anchor at end of file (started line 207)
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207 | -| frontend/src/routes/migration/mappings/+page.svelte | 🔴 0% | [MappingManagement] Unclosed Anchor at end of file (started line 1)
[MappingManagement] Unclosed Anchor: [DEF:MappingManagement:Component] started at line 1
[fetchDatabases] Unclosed Anchor at end of file (started line 47)
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 47
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 47
[handleUpdate] Unclosed Anchor at end of file (started line 83)
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83 | -| backend/src/models/mapping.py | 🔴 0% | [backend.src.models.mapping] Unclosed Anchor at end of file (started line 1)
[backend.src.models.mapping] Unclosed Anchor: [DEF:backend.src.models.mapping:Module] started at line 1
[MigrationStatus] Unclosed Anchor at end of file (started line 21)
[MigrationStatus] Unclosed Anchor: [DEF:MigrationStatus:Class] started at line 21
[MigrationStatus] Unclosed Anchor: [DEF:MigrationStatus:Class] started at line 21
[Environment] Unclosed Anchor at end of file (started line 31)
[Environment] Unclosed Anchor: [DEF:Environment:Class] started at line 31
[Environment] Unclosed Anchor: [DEF:Environment:Class] started at line 31
[Environment] Unclosed Anchor: [DEF:Environment:Class] started at line 31
[DatabaseMapping] Unclosed Anchor at end of file (started line 42)
[DatabaseMapping] Unclosed Anchor: [DEF:DatabaseMapping:Class] started at line 42
[DatabaseMapping] Unclosed Anchor: [DEF:DatabaseMapping:Class] started at line 42
[DatabaseMapping] Unclosed Anchor: [DEF:DatabaseMapping:Class] started at line 42
[DatabaseMapping] Unclosed Anchor: [DEF:DatabaseMapping:Class] started at line 42
[MigrationJob] Unclosed Anchor at end of file (started line 57)
[MigrationJob] Unclosed Anchor: [DEF:MigrationJob:Class] started at line 57
[MigrationJob] Unclosed Anchor: [DEF:MigrationJob:Class] started at line 57
[MigrationJob] Unclosed Anchor: [DEF:MigrationJob:Class] started at line 57
[MigrationJob] Unclosed Anchor: [DEF:MigrationJob:Class] started at line 57
[MigrationJob] Unclosed Anchor: [DEF:MigrationJob:Class] started at line 57 | -| backend/src/models/dashboard.py | 🔴 0% | [backend.src.models.dashboard] Unclosed Anchor at end of file (started line 1)
[backend.src.models.dashboard] Unclosed Anchor: [DEF:backend.src.models.dashboard:Module] started at line 1
[DashboardMetadata] Unclosed Anchor at end of file (started line 10)
[DashboardMetadata] Unclosed Anchor: [DEF:DashboardMetadata:Class] started at line 10
[DashboardMetadata] Unclosed Anchor: [DEF:DashboardMetadata:Class] started at line 10
[DashboardSelection] Unclosed Anchor at end of file (started line 19)
[DashboardSelection] Unclosed Anchor: [DEF:DashboardSelection:Class] started at line 19
[DashboardSelection] Unclosed Anchor: [DEF:DashboardSelection:Class] started at line 19
[DashboardSelection] Unclosed Anchor: [DEF:DashboardSelection:Class] started at line 19 | -| backend/src/models/task.py | 🔴 0% | [backend.src.models.task] Unclosed Anchor at end of file (started line 1)
[backend.src.models.task] Unclosed Anchor: [DEF:backend.src.models.task:Module] started at line 1
[TaskRecord] Unclosed Anchor at end of file (started line 17)
[TaskRecord] Unclosed Anchor: [DEF:TaskRecord:Class] started at line 17
[TaskRecord] Unclosed Anchor: [DEF:TaskRecord:Class] started at line 17 | -| backend/src/services/mapping_service.py | 🔴 0% | [backend.src.services.mapping_service] Unclosed Anchor at end of file (started line 1)
[backend.src.services.mapping_service] Unclosed Anchor: [DEF:backend.src.services.mapping_service:Module] started at line 1
[MappingService] Unclosed Anchor at end of file (started line 18)
[MappingService] Unclosed Anchor: [DEF:MappingService:Class] started at line 18
[MappingService] Unclosed Anchor: [DEF:MappingService:Class] started at line 18
[MappingService.__init__] Unclosed Anchor at end of file (started line 22)
[MappingService.__init__] Unclosed Anchor: [DEF:MappingService.__init__:Function] started at line 22
[MappingService.__init__] Missing Mandatory Tag: @PURPOSE
[MappingService.__init__] Unclosed Anchor: [DEF:MappingService.__init__:Function] started at line 22
[MappingService.__init__] Missing Mandatory Tag: @PURPOSE
[MappingService.__init__] Unclosed Anchor: [DEF:MappingService.__init__:Function] started at line 22
[MappingService.__init__] Missing Mandatory Tag: @PURPOSE
[MappingService._get_client] Unclosed Anchor at end of file (started line 26)
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService.get_suggestions] Unclosed Anchor at end of file (started line 46)
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46 | -| backend/src/core/config_manager.py | 🔴 0% | [ConfigManagerModule] Unclosed Anchor at end of file (started line 1)
[ConfigManagerModule] Unclosed Anchor: [DEF:ConfigManagerModule:Module] started at line 1
[ConfigManager] Unclosed Anchor at end of file (started line 22)
[ConfigManager] Unclosed Anchor: [DEF:ConfigManager:Class] started at line 22
[ConfigManager] Unclosed Anchor: [DEF:ConfigManager:Class] started at line 22
[__init__] Unclosed Anchor at end of file (started line 27)
[__init__] Unclosed Anchor: [DEF:__init__:Function] started at line 27
[__init__] Unclosed Anchor: [DEF:__init__:Function] started at line 27
[__init__] Unclosed Anchor: [DEF:__init__:Function] started at line 27
[_load_config] Unclosed Anchor at end of file (started line 51)
[_load_config] Unclosed Anchor: [DEF:_load_config:Function] started at line 51
[_load_config] Unclosed Anchor: [DEF:_load_config:Function] started at line 51
[_load_config] Unclosed Anchor: [DEF:_load_config:Function] started at line 51
[_load_config] Unclosed Anchor: [DEF:_load_config:Function] started at line 51
[_save_config_to_disk] Unclosed Anchor at end of file (started line 83)
[_save_config_to_disk] Unclosed Anchor: [DEF:_save_config_to_disk:Function] started at line 83
[_save_config_to_disk] Unclosed Anchor: [DEF:_save_config_to_disk:Function] started at line 83
[_save_config_to_disk] Unclosed Anchor: [DEF:_save_config_to_disk:Function] started at line 83
[_save_config_to_disk] Unclosed Anchor: [DEF:_save_config_to_disk:Function] started at line 83
[_save_config_to_disk] Unclosed Anchor: [DEF:_save_config_to_disk:Function] started at line 83
[save] Unclosed Anchor at end of file (started line 102)
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[save] Unclosed Anchor: [DEF:save:Function] started at line 102
[get_config] Unclosed Anchor at end of file (started line 108)
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[get_config] Unclosed Anchor: [DEF:get_config:Function] started at line 108
[update_global_settings] Unclosed Anchor at end of file (started line 115)
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 115
[validate_path] Unclosed Anchor at end of file (started line 135)
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[validate_path] Unclosed Anchor: [DEF:validate_path:Function] started at line 135
[get_environments] Unclosed Anchor at end of file (started line 153)
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 153
[has_environments] Unclosed Anchor at end of file (started line 160)
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[has_environments] Unclosed Anchor: [DEF:has_environments:Function] started at line 160
[add_environment] Unclosed Anchor at end of file (started line 167)
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 167
[update_environment] Unclosed Anchor at end of file (started line 186)
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 186
[delete_environment] Unclosed Anchor at end of file (started line 215)
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 215 | -| backend/src/core/superset_client.py | 🔴 0% | [backend.src.core.superset_client] Unclosed Anchor at end of file (started line 1)
[backend.src.core.superset_client] Unclosed Anchor: [DEF:backend.src.core.superset_client:Module] started at line 1
[SupersetClient] Unclosed Anchor at end of file (started line 16)
[SupersetClient] Unclosed Anchor: [DEF:SupersetClient:Class] started at line 16
[SupersetClient] Unclosed Anchor: [DEF:SupersetClient:Class] started at line 16
[SupersetClient.get_databases_summary] Unclosed Anchor at end of file (started line 20)
[SupersetClient.get_databases_summary] Unclosed Anchor: [DEF:SupersetClient.get_databases_summary:Function] started at line 20
[SupersetClient.get_databases_summary] Unclosed Anchor: [DEF:SupersetClient.get_databases_summary:Function] started at line 20
[SupersetClient.get_databases_summary] Unclosed Anchor: [DEF:SupersetClient.get_databases_summary:Function] started at line 20
[SupersetClient.get_database_by_uuid] Unclosed Anchor at end of file (started line 40)
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_dashboards_summary] Unclosed Anchor at end of file (started line 55)
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55 | -| backend/src/core/migration_engine.py | 🔴 0% | [backend.src.core.migration_engine] Unclosed Anchor at end of file (started line 1)
[backend.src.core.migration_engine] Unclosed Anchor: [DEF:backend.src.core.migration_engine:Module] started at line 1
[MigrationEngine] Unclosed Anchor at end of file (started line 22)
[MigrationEngine] Unclosed Anchor: [DEF:MigrationEngine:Class] started at line 22
[MigrationEngine] Unclosed Anchor: [DEF:MigrationEngine:Class] started at line 22
[MigrationEngine.transform_zip] Unclosed Anchor at end of file (started line 26)
[MigrationEngine.transform_zip] Unclosed Anchor: [DEF:MigrationEngine.transform_zip:Function] started at line 26
[MigrationEngine.transform_zip] Unclosed Anchor: [DEF:MigrationEngine.transform_zip:Function] started at line 26
[MigrationEngine.transform_zip] Unclosed Anchor: [DEF:MigrationEngine.transform_zip:Function] started at line 26
[MigrationEngine._transform_yaml] Unclosed Anchor at end of file (started line 77)
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77 | -| backend/src/core/logger.py | 🔴 0% | [LoggerModule] Unclosed Anchor at end of file (started line 1)
[LoggerModule] Unclosed Anchor: [DEF:LoggerModule:Module] started at line 1
[BeliefFormatter] Unclosed Anchor at end of file (started line 22)
[BeliefFormatter] Unclosed Anchor: [DEF:BeliefFormatter:Class] started at line 22
[BeliefFormatter] Unclosed Anchor: [DEF:BeliefFormatter:Class] started at line 22
[LogEntry] Unclosed Anchor at end of file (started line 34)
[LogEntry] Unclosed Anchor: [DEF:LogEntry:Class] started at line 34
[LogEntry] Unclosed Anchor: [DEF:LogEntry:Class] started at line 34
[LogEntry] Unclosed Anchor: [DEF:LogEntry:Class] started at line 34
[BeliefScope] Unclosed Anchor at end of file (started line 45)
[BeliefScope] Unclosed Anchor: [DEF:BeliefScope:Function] started at line 45
[BeliefScope] Unclosed Anchor: [DEF:BeliefScope:Function] started at line 45
[BeliefScope] Unclosed Anchor: [DEF:BeliefScope:Function] started at line 45
[BeliefScope] Unclosed Anchor: [DEF:BeliefScope:Function] started at line 45
[ConfigureLogger] Unclosed Anchor at end of file (started line 76)
[ConfigureLogger] Unclosed Anchor: [DEF:ConfigureLogger:Function] started at line 76
[ConfigureLogger] Unclosed Anchor: [DEF:ConfigureLogger:Function] started at line 76
[ConfigureLogger] Unclosed Anchor: [DEF:ConfigureLogger:Function] started at line 76
[ConfigureLogger] Unclosed Anchor: [DEF:ConfigureLogger:Function] started at line 76
[ConfigureLogger] Unclosed Anchor: [DEF:ConfigureLogger:Function] started at line 76
[WebSocketLogHandler] Unclosed Anchor at end of file (started line 120)
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[WebSocketLogHandler] Unclosed Anchor: [DEF:WebSocketLogHandler:Class] started at line 120
[Logger] Unclosed Anchor at end of file (started line 163)
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163
[Logger] Unclosed Anchor: [DEF:Logger:Global] started at line 163 | -| backend/src/core/database.py | 🔴 0% | [backend.src.core.database] Unclosed Anchor at end of file (started line 1)
[backend.src.core.database] Unclosed Anchor: [DEF:backend.src.core.database:Module] started at line 1
[DATABASE_URL] Unclosed Anchor at end of file (started line 20)
[DATABASE_URL] Unclosed Anchor: [DEF:DATABASE_URL:Constant] started at line 20
[DATABASE_URL] Unclosed Anchor: [DEF:DATABASE_URL:Constant] started at line 20
[TASKS_DATABASE_URL] Unclosed Anchor at end of file (started line 24)
[TASKS_DATABASE_URL] Unclosed Anchor: [DEF:TASKS_DATABASE_URL:Constant] started at line 24
[TASKS_DATABASE_URL] Unclosed Anchor: [DEF:TASKS_DATABASE_URL:Constant] started at line 24
[TASKS_DATABASE_URL] Unclosed Anchor: [DEF:TASKS_DATABASE_URL:Constant] started at line 24
[engine] Unclosed Anchor at end of file (started line 28)
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28
[tasks_engine] Unclosed Anchor at end of file (started line 32)
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[SessionLocal] Unclosed Anchor at end of file (started line 36)
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Unclosed Anchor: [DEF:SessionLocal:Class] started at line 36
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor at end of file (started line 40)
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Unclosed Anchor: [DEF:TasksSessionLocal:Class] started at line 40
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[init_db] Unclosed Anchor at end of file (started line 44)
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[init_db] Unclosed Anchor: [DEF:init_db:Function] started at line 44
[get_db] Unclosed Anchor at end of file (started line 51)
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_db] Unclosed Anchor: [DEF:get_db:Function] started at line 51
[get_tasks_db] Unclosed Anchor at end of file (started line 63)
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63
[get_tasks_db] Unclosed Anchor: [DEF:get_tasks_db:Function] started at line 63 | -| backend/src/core/config_models.py | 🔴 0% | [ConfigModels] Unclosed Anchor at end of file (started line 1)
[ConfigModels] Unclosed Anchor: [DEF:ConfigModels:Module] started at line 1
[Schedule] Unclosed Anchor at end of file (started line 11)
[Schedule] Unclosed Anchor: [DEF:Schedule:DataClass] started at line 11
[Schedule] Unclosed Anchor: [DEF:Schedule:DataClass] started at line 11
[Environment] Unclosed Anchor at end of file (started line 18)
[Environment] Unclosed Anchor: [DEF:Environment:DataClass] started at line 18
[Environment] Unclosed Anchor: [DEF:Environment:DataClass] started at line 18
[Environment] Unclosed Anchor: [DEF:Environment:DataClass] started at line 18
[LoggingConfig] Unclosed Anchor at end of file (started line 30)
[LoggingConfig] Unclosed Anchor: [DEF:LoggingConfig:DataClass] started at line 30
[LoggingConfig] Unclosed Anchor: [DEF:LoggingConfig:DataClass] started at line 30
[LoggingConfig] Unclosed Anchor: [DEF:LoggingConfig:DataClass] started at line 30
[LoggingConfig] Unclosed Anchor: [DEF:LoggingConfig:DataClass] started at line 30
[GlobalSettings] Unclosed Anchor at end of file (started line 40)
[GlobalSettings] Unclosed Anchor: [DEF:GlobalSettings:DataClass] started at line 40
[GlobalSettings] Unclosed Anchor: [DEF:GlobalSettings:DataClass] started at line 40
[GlobalSettings] Unclosed Anchor: [DEF:GlobalSettings:DataClass] started at line 40
[GlobalSettings] Unclosed Anchor: [DEF:GlobalSettings:DataClass] started at line 40
[GlobalSettings] Unclosed Anchor: [DEF:GlobalSettings:DataClass] started at line 40
[AppConfig] Unclosed Anchor at end of file (started line 53)
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53
[AppConfig] Unclosed Anchor: [DEF:AppConfig:DataClass] started at line 53 | -| backend/src/core/plugin_loader.py | 🔴 0% | [PluginLoader] Unclosed Anchor at end of file (started line 8)
[PluginLoader] Unclosed Anchor: [DEF:PluginLoader:Class] started at line 8 | -| backend/src/core/plugin_base.py | 🔴 0% | [PluginBase] Unclosed Anchor at end of file (started line 6)
[PluginBase] Unclosed Anchor: [DEF:PluginBase:Class] started at line 6
[PluginConfig] Unclosed Anchor at end of file (started line 59)
[PluginConfig] Unclosed Anchor: [DEF:PluginConfig:Class] started at line 59
[PluginConfig] Unclosed Anchor: [DEF:PluginConfig:Class] started at line 59 | -| backend/src/core/utils/matching.py | 🔴 0% | [backend.src.core.utils.matching] Unclosed Anchor at end of file (started line 1)
[backend.src.core.utils.matching] Unclosed Anchor: [DEF:backend.src.core.utils.matching:Module] started at line 1
[suggest_mappings] Unclosed Anchor at end of file (started line 15)
[suggest_mappings] Unclosed Anchor: [DEF:suggest_mappings:Function] started at line 15
[suggest_mappings] Unclosed Anchor: [DEF:suggest_mappings:Function] started at line 15 | -| backend/src/core/task_manager/cleanup.py | 🔴 0% | [TaskCleanupModule] Unclosed Anchor at end of file (started line 1)
[TaskCleanupModule] Unclosed Anchor: [DEF:TaskCleanupModule:Module] started at line 1
[TaskCleanupService] Unclosed Anchor at end of file (started line 12)
[TaskCleanupService] Unclosed Anchor: [DEF:TaskCleanupService:Class] started at line 12
[TaskCleanupService] Unclosed Anchor: [DEF:TaskCleanupService:Class] started at line 12
[TaskCleanupService.run_cleanup] Unclosed Anchor at end of file (started line 19)
[TaskCleanupService.run_cleanup] Unclosed Anchor: [DEF:TaskCleanupService.run_cleanup:Function] started at line 19
[TaskCleanupService.run_cleanup] Unclosed Anchor: [DEF:TaskCleanupService.run_cleanup:Function] started at line 19
[TaskCleanupService.run_cleanup] Unclosed Anchor: [DEF:TaskCleanupService.run_cleanup:Function] started at line 19 | -| backend/src/plugins/backup.py | 🔴 0% | [BackupPlugin] Unclosed Anchor at end of file (started line 1)
[BackupPlugin] Unclosed Anchor: [DEF:BackupPlugin:Module] started at line 1 | -| backend/src/plugins/migration.py | 🔴 0% | [MigrationPlugin] Unclosed Anchor at end of file (started line 1)
[MigrationPlugin] Unclosed Anchor: [DEF:MigrationPlugin:Module] started at line 1
[MigrationPlugin.execute] Unclosed Anchor at end of file (started line 103)
[MigrationPlugin.execute] Unclosed Anchor: [DEF:MigrationPlugin.execute:Action] started at line 103
[MigrationPlugin.execute] Unclosed Anchor: [DEF:MigrationPlugin.execute:Action] started at line 103 | -| backend/src/api/auth.py | 🔴 0% | [AuthModule] Unclosed Anchor at end of file (started line 1)
[AuthModule] Unclosed Anchor: [DEF:AuthModule:Module] started at line 1 | -| backend/src/api/routes/settings.py | 🔴 0% | [SettingsRouter] Unclosed Anchor at end of file (started line 1)
[SettingsRouter] Unclosed Anchor: [DEF:SettingsRouter:Module] started at line 1
[get_settings] Unclosed Anchor at end of file (started line 26)
[get_settings] Unclosed Anchor: [DEF:get_settings:Function] started at line 26
[get_settings] Unclosed Anchor: [DEF:get_settings:Function] started at line 26
[update_global_settings] Unclosed Anchor at end of file (started line 40)
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 40
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 40
[update_global_settings] Unclosed Anchor: [DEF:update_global_settings:Function] started at line 40
[get_environments] Unclosed Anchor at end of file (started line 54)
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 54
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 54
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 54
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 54
[add_environment] Unclosed Anchor at end of file (started line 63)
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 63
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 63
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 63
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 63
[add_environment] Unclosed Anchor: [DEF:add_environment:Function] started at line 63
[update_environment] Unclosed Anchor at end of file (started line 96)
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[update_environment] Unclosed Anchor: [DEF:update_environment:Function] started at line 96
[delete_environment] Unclosed Anchor at end of file (started line 139)
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[delete_environment] Unclosed Anchor: [DEF:delete_environment:Function] started at line 139
[test_environment_connection] Unclosed Anchor at end of file (started line 152)
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[test_environment_connection] Unclosed Anchor: [DEF:test_environment_connection:Function] started at line 152
[validate_backup_path] Unclosed Anchor at end of file (started line 195)
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195
[validate_backup_path] Unclosed Anchor: [DEF:validate_backup_path:Function] started at line 195 | -| backend/src/api/routes/tasks.py | 🔴 0% | [TasksRouter] Unclosed Anchor at end of file (started line 1)
[TasksRouter] Unclosed Anchor: [DEF:TasksRouter:Module] started at line 1 | -| backend/src/api/routes/environments.py | 🔴 0% | [backend.src.api.routes.environments] Unclosed Anchor at end of file (started line 1)
[backend.src.api.routes.environments] Unclosed Anchor: [DEF:backend.src.api.routes.environments:Module] started at line 1
[ScheduleSchema] Unclosed Anchor at end of file (started line 23)
[ScheduleSchema] Unclosed Anchor: [DEF:ScheduleSchema:DataClass] started at line 23
[ScheduleSchema] Unclosed Anchor: [DEF:ScheduleSchema:DataClass] started at line 23
[EnvironmentResponse] Unclosed Anchor at end of file (started line 29)
[EnvironmentResponse] Unclosed Anchor: [DEF:EnvironmentResponse:DataClass] started at line 29
[EnvironmentResponse] Unclosed Anchor: [DEF:EnvironmentResponse:DataClass] started at line 29
[EnvironmentResponse] Unclosed Anchor: [DEF:EnvironmentResponse:DataClass] started at line 29
[DatabaseResponse] Unclosed Anchor at end of file (started line 37)
[DatabaseResponse] Unclosed Anchor: [DEF:DatabaseResponse:DataClass] started at line 37
[DatabaseResponse] Unclosed Anchor: [DEF:DatabaseResponse:DataClass] started at line 37
[DatabaseResponse] Unclosed Anchor: [DEF:DatabaseResponse:DataClass] started at line 37
[DatabaseResponse] Unclosed Anchor: [DEF:DatabaseResponse:DataClass] started at line 37
[get_environments] Unclosed Anchor at end of file (started line 44)
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 44
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 44
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 44
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 44
[get_environments] Unclosed Anchor: [DEF:get_environments:Function] started at line 44
[update_environment_schedule] Unclosed Anchor at end of file (started line 66)
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[update_environment_schedule] Unclosed Anchor: [DEF:update_environment_schedule:Function] started at line 66
[get_environment_databases] Unclosed Anchor at end of file (started line 94)
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94
[get_environment_databases] Unclosed Anchor: [DEF:get_environment_databases:Function] started at line 94 | -| backend/src/api/routes/plugins.py | 🔴 0% | [PluginsRouter] Unclosed Anchor at end of file (started line 1)
[PluginsRouter] Unclosed Anchor: [DEF:PluginsRouter:Module] started at line 1 | -| backend/src/api/routes/migration.py | 🔴 0% | [backend.src.api.routes.migration] Unclosed Anchor at end of file (started line 1)
[backend.src.api.routes.migration] Unclosed Anchor: [DEF:backend.src.api.routes.migration:Module] started at line 1
[get_dashboards] Unclosed Anchor at end of file (started line 17)
[get_dashboards] Unclosed Anchor: [DEF:get_dashboards:Function] started at line 17
[get_dashboards] Unclosed Anchor: [DEF:get_dashboards:Function] started at line 17
[execute_migration] Unclosed Anchor at end of file (started line 42)
[execute_migration] Unclosed Anchor: [DEF:execute_migration:Function] started at line 42
[execute_migration] Unclosed Anchor: [DEF:execute_migration:Function] started at line 42
[execute_migration] Unclosed Anchor: [DEF:execute_migration:Function] started at line 42 | -| backend/src/api/routes/mappings.py | 🔴 0% | [backend.src.api.routes.mappings] Unclosed Anchor at end of file (started line 1)
[backend.src.api.routes.mappings] Unclosed Anchor: [DEF:backend.src.api.routes.mappings:Module] started at line 1
[MappingCreate] Unclosed Anchor at end of file (started line 24)
[MappingCreate] Unclosed Anchor: [DEF:MappingCreate:DataClass] started at line 24
[MappingCreate] Unclosed Anchor: [DEF:MappingCreate:DataClass] started at line 24
[MappingResponse] Unclosed Anchor at end of file (started line 34)
[MappingResponse] Unclosed Anchor: [DEF:MappingResponse:DataClass] started at line 34
[MappingResponse] Unclosed Anchor: [DEF:MappingResponse:DataClass] started at line 34
[MappingResponse] Unclosed Anchor: [DEF:MappingResponse:DataClass] started at line 34
[SuggestRequest] Unclosed Anchor at end of file (started line 48)
[SuggestRequest] Unclosed Anchor: [DEF:SuggestRequest:DataClass] started at line 48
[SuggestRequest] Unclosed Anchor: [DEF:SuggestRequest:DataClass] started at line 48
[SuggestRequest] Unclosed Anchor: [DEF:SuggestRequest:DataClass] started at line 48
[SuggestRequest] Unclosed Anchor: [DEF:SuggestRequest:DataClass] started at line 48
[get_mappings] Unclosed Anchor at end of file (started line 54)
[get_mappings] Unclosed Anchor: [DEF:get_mappings:Function] started at line 54
[get_mappings] Unclosed Anchor: [DEF:get_mappings:Function] started at line 54
[get_mappings] Unclosed Anchor: [DEF:get_mappings:Function] started at line 54
[get_mappings] Unclosed Anchor: [DEF:get_mappings:Function] started at line 54
[get_mappings] Unclosed Anchor: [DEF:get_mappings:Function] started at line 54
[create_mapping] Unclosed Anchor at end of file (started line 70)
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[create_mapping] Unclosed Anchor: [DEF:create_mapping:Function] started at line 70
[suggest_mappings_api] Unclosed Anchor at end of file (started line 95)
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95
[suggest_mappings_api] Unclosed Anchor: [DEF:suggest_mappings_api:Function] started at line 95 | -| generate_semantic_map.py | 🟢 100% | OK | -| search_script.py | 🟢 100% | OK | -| get_dataset_structure.py | 🟢 100% | OK | -| debug_db_api.py | 🟢 100% | OK | -| run_mapper.py | 🟢 100% | OK | -| migration_script.py | 🟢 100% | OK | -| backup_script.py | 🟢 100% | OK | -| superset_tool/exceptions.py | 🟢 100% | OK | -| superset_tool/__init__.py | 🟢 100% | OK | -| superset_tool/client.py | 🟢 100% | OK | -| superset_tool/models.py | 🟢 100% | OK | -| superset_tool/utils/logger.py | 🟢 100% | OK | -| superset_tool/utils/network.py | 🟢 100% | OK | -| superset_tool/utils/whiptail_fallback.py | 🟢 100% | OK | -| superset_tool/utils/dataset_mapper.py | 🟢 100% | OK | -| superset_tool/utils/__init__.py | 🟢 100% | OK | -| superset_tool/utils/init_clients.py | 🟢 100% | OK | -| superset_tool/utils/fileio.py | 🟢 100% | OK | -| backend/src/dependencies.py | 🟢 100% | OK | -| backend/src/app.py | 🟢 100% | OK | -| backend/src/core/scheduler.py | 🟢 100% | OK | -| backend/src/core/task_manager/manager.py | 🟢 100% | OK | -| backend/src/core/task_manager/__init__.py | 🟢 100% | OK | -| backend/src/core/task_manager/models.py | 🟢 100% | OK | -| backend/src/core/task_manager/persistence.py | 🟢 100% | OK | diff --git a/semantics/reports/semantic_report_20260101_164125.md b/semantics/reports/semantic_report_20260101_164125.md deleted file mode 100644 index c7c1812..0000000 --- a/semantics/reports/semantic_report_20260101_164125.md +++ /dev/null @@ -1,83 +0,0 @@ -# Semantic Compliance Report - -**Generated At:** 2026-01-01T16:41:25.515146 -**Global Compliance Score:** 62.4% -**Scanned Files:** 68 - -## Critical Parsing Errors -- 🔴 backend/src/core/database.py:75 Mismatched closing anchor. Expected [/DEF:tasks_engine:Variable], found [/DEF:backend.src.core.database:Module]. -- 🔴 backend/src/plugins/backup.py:146 Mismatched closing anchor. Expected [/DEF:BackupPlugin:Module], found [/DEF:BackupPlugin:Class]. -- 🔴 backend/src/plugins/migration.py:296 Mismatched closing anchor. Expected [/DEF:MigrationPlugin.execute:Action], found [/DEF:MigrationPlugin:Class]. -- 🔴 backend/src/plugins/migration.py:297 Mismatched closing anchor. Expected [/DEF:MigrationPlugin.execute:Action], found [/DEF:MigrationPlugin:Module]. - -## File Compliance Status -| File | Score | Issues | -|------|-------|--------| -| frontend/src/App.svelte | 🔴 0% | [App] Unclosed Anchor at end of file (started line 1)
[App] Unclosed Anchor: [DEF:App:Component] started at line 1
[handleFormSubmit] Unclosed Anchor at end of file (started line 24)
[handleFormSubmit] Unclosed Anchor: [DEF:handleFormSubmit:Function] started at line 24
[handleFormSubmit] Unclosed Anchor: [DEF:handleFormSubmit:Function] started at line 24
[navigate] Unclosed Anchor at end of file (started line 44)
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44 | -| frontend/src/main.js | 🔴 0% | [main] Unclosed Anchor at end of file (started line 1)
[main] Unclosed Anchor: [DEF:main:Module] started at line 1
[app_instance] Unclosed Anchor at end of file (started line 9)
[app_instance] Unclosed Anchor: [DEF:app_instance:Data] started at line 9
[app_instance] Unclosed Anchor: [DEF:app_instance:Data] started at line 9 | -| frontend/src/components/DashboardGrid.svelte | 🔴 0% | [DashboardGrid] Unclosed Anchor at end of file (started line 1)
[DashboardGrid] Unclosed Anchor: [DEF:DashboardGrid:Component] started at line 1
[handleSort] Unclosed Anchor at end of file (started line 62)
[handleSort] Unclosed Anchor: [DEF:handleSort:Function] started at line 62
[handleSort] Unclosed Anchor: [DEF:handleSort:Function] started at line 62
[handleSelectionChange] Unclosed Anchor at end of file (started line 74)
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectAll] Unclosed Anchor at end of file (started line 88)
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[goToPage] Unclosed Anchor at end of file (started line 106)
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106 | -| frontend/src/components/TaskHistory.svelte | 🔴 0% | [TaskHistory] Unclosed Anchor at end of file (started line 1)
[TaskHistory] Unclosed Anchor: [DEF:TaskHistory:Component] started at line 1 | -| frontend/src/components/MappingTable.svelte | 🔴 0% | [MappingTable] Unclosed Anchor at end of file (started line 1)
[MappingTable] Unclosed Anchor: [DEF:MappingTable:Component] started at line 1
[updateMapping] Unclosed Anchor at end of file (started line 25)
[updateMapping] Unclosed Anchor: [DEF:updateMapping:Function] started at line 25
[updateMapping] Unclosed Anchor: [DEF:updateMapping:Function] started at line 25
[getSuggestion] Unclosed Anchor at end of file (started line 34)
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34 | -| frontend/src/components/EnvSelector.svelte | 🔴 0% | [EnvSelector] Unclosed Anchor at end of file (started line 1)
[EnvSelector] Unclosed Anchor: [DEF:EnvSelector:Component] started at line 1
[handleSelect] Unclosed Anchor at end of file (started line 24)
[handleSelect] Unclosed Anchor: [DEF:handleSelect:Function] started at line 24
[handleSelect] Unclosed Anchor: [DEF:handleSelect:Function] started at line 24 | -| frontend/src/components/TaskList.svelte | 🔴 0% | [TaskList] Unclosed Anchor at end of file (started line 1)
[TaskList] Unclosed Anchor: [DEF:TaskList:Component] started at line 1 | -| frontend/src/components/DynamicForm.svelte | 🔴 0% | [DynamicForm] Unclosed Anchor at end of file (started line 1)
[DynamicForm] Unclosed Anchor: [DEF:DynamicForm:Component] started at line 1
[handleSubmit] Unclosed Anchor at end of file (started line 23)
[handleSubmit] Unclosed Anchor: [DEF:handleSubmit:Function] started at line 23
[handleSubmit] Unclosed Anchor: [DEF:handleSubmit:Function] started at line 23
[initializeForm] Unclosed Anchor at end of file (started line 33)
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33 | -| frontend/src/components/TaskRunner.svelte | 🔴 0% | [TaskRunner] Unclosed Anchor at end of file (started line 1)
[TaskRunner] Unclosed Anchor: [DEF:TaskRunner:Component] started at line 1
[connect] Unclosed Anchor at end of file (started line 38)
[connect] Unclosed Anchor: [DEF:connect:Function] started at line 38
[connect] Unclosed Anchor: [DEF:connect:Function] started at line 38
[onMount] Unclosed Anchor at end of file (started line 225)
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onDestroy] Unclosed Anchor at end of file (started line 251)
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251 | -| frontend/src/components/TaskLogViewer.svelte | 🔴 0% | [TaskLogViewer] Unclosed Anchor at end of file (started line 1)
[TaskLogViewer] Unclosed Anchor: [DEF:TaskLogViewer:Component] started at line 1 | -| frontend/src/components/PasswordPrompt.svelte | 🔴 0% | [PasswordPrompt] Unclosed Anchor at end of file (started line 1)
[PasswordPrompt] Unclosed Anchor: [DEF:PasswordPrompt:Component] started at line 1 | -| frontend/src/components/MissingMappingModal.svelte | 🔴 0% | [MissingMappingModal] Unclosed Anchor at end of file (started line 1)
[MissingMappingModal] Unclosed Anchor: [DEF:MissingMappingModal:Component] started at line 1
[resolve] Unclosed Anchor at end of file (started line 26)
[resolve] Unclosed Anchor: [DEF:resolve:Function] started at line 26
[resolve] Missing Mandatory Tag: @PURPOSE
[resolve] Unclosed Anchor: [DEF:resolve:Function] started at line 26
[resolve] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor at end of file (started line 38)
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE | -| frontend/src/components/Toast.svelte | 🔴 0% | [Toast] Unclosed Anchor at end of file (started line 1)
[Toast] Unclosed Anchor: [DEF:Toast:Component] started at line 1 | -| frontend/src/pages/Settings.svelte | 🔴 0% | [Settings] Unclosed Anchor at end of file (started line 1)
[Settings] Unclosed Anchor: [DEF:Settings:Component] started at line 1
[loadSettings] Unclosed Anchor at end of file (started line 50)
[loadSettings] Unclosed Anchor: [DEF:loadSettings:Function] started at line 50
[loadSettings] Unclosed Anchor: [DEF:loadSettings:Function] started at line 50
[handleSaveGlobal] Unclosed Anchor at end of file (started line 67)
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleAddOrUpdateEnv] Unclosed Anchor at end of file (started line 84)
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleDeleteEnv] Unclosed Anchor at end of file (started line 108)
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleTestEnv] Unclosed Anchor at end of file (started line 129)
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[editEnv] Unclosed Anchor at end of file (started line 152)
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[resetEnvForm] Unclosed Anchor at end of file (started line 163)
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163 | -| frontend/src/pages/Dashboard.svelte | 🔴 0% | [Dashboard] Unclosed Anchor at end of file (started line 1)
[Dashboard] Unclosed Anchor: [DEF:Dashboard:Component] started at line 1
[onMount] Unclosed Anchor at end of file (started line 17)
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 17
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 17
[selectPlugin] Unclosed Anchor at end of file (started line 27)
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27 | -| frontend/src/lib/stores.js | 🔴 0% | [stores_module] Unclosed Anchor at end of file (started line 1)
[stores_module] Unclosed Anchor: [DEF:stores_module:Module] started at line 1
[plugins] Unclosed Anchor at end of file (started line 9)
[plugins] Unclosed Anchor: [DEF:plugins:Data] started at line 9
[plugins] Unclosed Anchor: [DEF:plugins:Data] started at line 9
[tasks] Unclosed Anchor at end of file (started line 13)
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[selectedPlugin] Unclosed Anchor at end of file (started line 17)
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedTask] Unclosed Anchor at end of file (started line 21)
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[currentPage] Unclosed Anchor at end of file (started line 25)
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[taskLogs] Unclosed Anchor at end of file (started line 29)
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[fetchPlugins] Unclosed Anchor at end of file (started line 33)
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchTasks] Unclosed Anchor at end of file (started line 47)
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47 | -| frontend/src/lib/toasts.js | 🔴 0% | [toasts_module] Unclosed Anchor at end of file (started line 1)
[toasts_module] Unclosed Anchor: [DEF:toasts_module:Module] started at line 1
[toasts] Unclosed Anchor at end of file (started line 8)
[toasts] Unclosed Anchor: [DEF:toasts:Data] started at line 8
[toasts] Unclosed Anchor: [DEF:toasts:Data] started at line 8
[addToast] Unclosed Anchor at end of file (started line 12)
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[removeToast] Unclosed Anchor at end of file (started line 25)
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25 | -| frontend/src/lib/api.js | 🔴 0% | [api_module] Unclosed Anchor at end of file (started line 1)
[api_module] Unclosed Anchor: [DEF:api_module:Module] started at line 1
[fetchApi] Unclosed Anchor at end of file (started line 26)
[fetchApi] Unclosed Anchor: [DEF:fetchApi:Function] started at line 26
[fetchApi] Unclosed Anchor: [DEF:fetchApi:Function] started at line 26
[postApi] Unclosed Anchor at end of file (started line 46)
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[requestApi] Unclosed Anchor at end of file (started line 73)
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[api] Unclosed Anchor at end of file (started line 100)
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100 | -| frontend/src/routes/migration/+page.svelte | 🔴 0% | [MigrationDashboard] Unclosed Anchor at end of file (started line 1)
[MigrationDashboard] Unclosed Anchor: [DEF:MigrationDashboard:Component] started at line 1
[fetchEnvironments] Unclosed Anchor at end of file (started line 51)
[fetchEnvironments] Unclosed Anchor: [DEF:fetchEnvironments:Function] started at line 51
[fetchEnvironments] Unclosed Anchor: [DEF:fetchEnvironments:Function] started at line 51
[fetchDashboards] Unclosed Anchor at end of file (started line 69)
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDatabases] Unclosed Anchor at end of file (started line 93)
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[handleMappingUpdate] Unclosed Anchor at end of file (started line 128)
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleViewLogs] Unclosed Anchor at end of file (started line 163)
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor at end of file (started line 172)
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[startMigration] Unclosed Anchor at end of file (started line 207)
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207 | -| frontend/src/routes/migration/mappings/+page.svelte | 🔴 0% | [MappingManagement] Unclosed Anchor at end of file (started line 1)
[MappingManagement] Unclosed Anchor: [DEF:MappingManagement:Component] started at line 1
[fetchDatabases] Unclosed Anchor at end of file (started line 47)
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 47
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 47
[handleUpdate] Unclosed Anchor at end of file (started line 83)
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83 | -| backend/src/services/mapping_service.py | 🔴 0% | [backend.src.services.mapping_service] Unclosed Anchor at end of file (started line 1)
[backend.src.services.mapping_service] Unclosed Anchor: [DEF:backend.src.services.mapping_service:Module] started at line 1
[MappingService] Unclosed Anchor at end of file (started line 18)
[MappingService] Unclosed Anchor: [DEF:MappingService:Class] started at line 18
[MappingService] Unclosed Anchor: [DEF:MappingService:Class] started at line 18
[MappingService.__init__] Unclosed Anchor at end of file (started line 22)
[MappingService.__init__] Unclosed Anchor: [DEF:MappingService.__init__:Function] started at line 22
[MappingService.__init__] Missing Mandatory Tag: @PURPOSE
[MappingService.__init__] Unclosed Anchor: [DEF:MappingService.__init__:Function] started at line 22
[MappingService.__init__] Missing Mandatory Tag: @PURPOSE
[MappingService.__init__] Unclosed Anchor: [DEF:MappingService.__init__:Function] started at line 22
[MappingService.__init__] Missing Mandatory Tag: @PURPOSE
[MappingService._get_client] Unclosed Anchor at end of file (started line 26)
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService.get_suggestions] Unclosed Anchor at end of file (started line 46)
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46 | -| backend/src/core/superset_client.py | 🔴 0% | [backend.src.core.superset_client] Unclosed Anchor at end of file (started line 1)
[backend.src.core.superset_client] Unclosed Anchor: [DEF:backend.src.core.superset_client:Module] started at line 1
[SupersetClient] Unclosed Anchor at end of file (started line 16)
[SupersetClient] Unclosed Anchor: [DEF:SupersetClient:Class] started at line 16
[SupersetClient] Unclosed Anchor: [DEF:SupersetClient:Class] started at line 16
[SupersetClient.get_databases_summary] Unclosed Anchor at end of file (started line 20)
[SupersetClient.get_databases_summary] Unclosed Anchor: [DEF:SupersetClient.get_databases_summary:Function] started at line 20
[SupersetClient.get_databases_summary] Unclosed Anchor: [DEF:SupersetClient.get_databases_summary:Function] started at line 20
[SupersetClient.get_databases_summary] Unclosed Anchor: [DEF:SupersetClient.get_databases_summary:Function] started at line 20
[SupersetClient.get_database_by_uuid] Unclosed Anchor at end of file (started line 40)
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_dashboards_summary] Unclosed Anchor at end of file (started line 55)
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55 | -| backend/src/core/migration_engine.py | 🔴 0% | [backend.src.core.migration_engine] Unclosed Anchor at end of file (started line 1)
[backend.src.core.migration_engine] Unclosed Anchor: [DEF:backend.src.core.migration_engine:Module] started at line 1
[MigrationEngine] Unclosed Anchor at end of file (started line 22)
[MigrationEngine] Unclosed Anchor: [DEF:MigrationEngine:Class] started at line 22
[MigrationEngine] Unclosed Anchor: [DEF:MigrationEngine:Class] started at line 22
[MigrationEngine.transform_zip] Unclosed Anchor at end of file (started line 26)
[MigrationEngine.transform_zip] Unclosed Anchor: [DEF:MigrationEngine.transform_zip:Function] started at line 26
[MigrationEngine.transform_zip] Unclosed Anchor: [DEF:MigrationEngine.transform_zip:Function] started at line 26
[MigrationEngine.transform_zip] Unclosed Anchor: [DEF:MigrationEngine.transform_zip:Function] started at line 26
[MigrationEngine._transform_yaml] Unclosed Anchor at end of file (started line 77)
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77 | -| backend/src/plugins/backup.py | 🔴 0% | [BackupPlugin] Unclosed Anchor at end of file (started line 1)
[BackupPlugin] Unclosed Anchor: [DEF:BackupPlugin:Module] started at line 1 | -| backend/src/plugins/migration.py | 🔴 0% | [MigrationPlugin] Unclosed Anchor at end of file (started line 1)
[MigrationPlugin] Unclosed Anchor: [DEF:MigrationPlugin:Module] started at line 1
[MigrationPlugin.execute] Unclosed Anchor at end of file (started line 103)
[MigrationPlugin.execute] Unclosed Anchor: [DEF:MigrationPlugin.execute:Action] started at line 103
[MigrationPlugin.execute] Unclosed Anchor: [DEF:MigrationPlugin.execute:Action] started at line 103 | -| backend/src/core/database.py | 🔴 40% | [backend.src.core.database] Unclosed Anchor at end of file (started line 1)
[backend.src.core.database] Unclosed Anchor: [DEF:backend.src.core.database:Module] started at line 1
[DATABASE_URL] Unclosed Anchor at end of file (started line 20)
[DATABASE_URL] Unclosed Anchor: [DEF:DATABASE_URL:Constant] started at line 20
[DATABASE_URL] Unclosed Anchor: [DEF:DATABASE_URL:Constant] started at line 20
[TASKS_DATABASE_URL] Unclosed Anchor at end of file (started line 24)
[TASKS_DATABASE_URL] Unclosed Anchor: [DEF:TASKS_DATABASE_URL:Constant] started at line 24
[TASKS_DATABASE_URL] Unclosed Anchor: [DEF:TASKS_DATABASE_URL:Constant] started at line 24
[TASKS_DATABASE_URL] Unclosed Anchor: [DEF:TASKS_DATABASE_URL:Constant] started at line 24
[engine] Unclosed Anchor at end of file (started line 28)
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28
[tasks_engine] Unclosed Anchor at end of file (started line 32)
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[tasks_engine] Unclosed Anchor: [DEF:tasks_engine:Variable] started at line 32
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[SessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE
[TasksSessionLocal] Missing Mandatory Tag: @PURPOSE | -| generate_semantic_map.py | 🟢 100% | OK | -| search_script.py | 🟢 100% | OK | -| get_dataset_structure.py | 🟢 100% | OK | -| debug_db_api.py | 🟢 100% | OK | -| run_mapper.py | 🟢 100% | OK | -| migration_script.py | 🟢 100% | OK | -| backup_script.py | 🟢 100% | OK | -| superset_tool/exceptions.py | 🟢 100% | OK | -| superset_tool/__init__.py | 🟢 100% | OK | -| superset_tool/client.py | 🟢 100% | OK | -| superset_tool/models.py | 🟢 100% | OK | -| superset_tool/utils/logger.py | 🟢 100% | OK | -| superset_tool/utils/network.py | 🟢 100% | OK | -| superset_tool/utils/whiptail_fallback.py | 🟢 100% | OK | -| superset_tool/utils/dataset_mapper.py | 🟢 100% | OK | -| superset_tool/utils/__init__.py | 🟢 100% | OK | -| superset_tool/utils/init_clients.py | 🟢 100% | OK | -| superset_tool/utils/fileio.py | 🟢 100% | OK | -| backend/src/dependencies.py | 🟢 100% | OK | -| backend/src/app.py | 🟢 100% | OK | -| backend/src/models/mapping.py | 🟢 100% | OK | -| backend/src/models/dashboard.py | 🟢 100% | OK | -| backend/src/models/task.py | 🟢 100% | OK | -| backend/src/core/config_manager.py | 🟢 100% | OK | -| backend/src/core/logger.py | 🟢 100% | OK | -| backend/src/core/config_models.py | 🟢 100% | OK | -| backend/src/core/scheduler.py | 🟢 100% | OK | -| backend/src/core/plugin_loader.py | 🟢 100% | OK | -| backend/src/core/plugin_base.py | 🟢 100% | OK | -| backend/src/core/utils/matching.py | 🟢 100% | OK | -| backend/src/core/task_manager/manager.py | 🟢 100% | OK | -| backend/src/core/task_manager/__init__.py | 🟢 100% | OK | -| backend/src/core/task_manager/cleanup.py | 🟢 100% | OK | -| backend/src/core/task_manager/models.py | 🟢 100% | OK | -| backend/src/core/task_manager/persistence.py | 🟢 100% | OK | -| backend/src/api/auth.py | 🟢 100% | OK | -| backend/src/api/routes/settings.py | 🟢 100% | OK | -| backend/src/api/routes/tasks.py | 🟢 100% | OK | -| backend/src/api/routes/environments.py | 🟢 100% | OK | -| backend/src/api/routes/plugins.py | 🟢 100% | OK | -| backend/src/api/routes/migration.py | 🟢 100% | OK | -| backend/src/api/routes/mappings.py | 🟢 100% | OK | diff --git a/semantics/reports/semantic_report_20260101_164254.md b/semantics/reports/semantic_report_20260101_164254.md deleted file mode 100644 index cc014cf..0000000 --- a/semantics/reports/semantic_report_20260101_164254.md +++ /dev/null @@ -1,81 +0,0 @@ -# Semantic Compliance Report - -**Generated At:** 2026-01-01T16:42:54.849752 -**Global Compliance Score:** 65.6% -**Scanned Files:** 68 - -## Critical Parsing Errors -- 🔴 backend/src/core/database.py:77 Mismatched closing anchor. Expected [/DEF:engine:Variable], found [/DEF:backend.src.core.database:Module]. -- 🔴 backend/src/plugins/migration.py:297 Mismatched closing anchor. Expected [/DEF:MigrationPlugin:Module], found [/DEF:MigrationPlugin:Class]. - -## File Compliance Status -| File | Score | Issues | -|------|-------|--------| -| frontend/src/App.svelte | 🔴 0% | [App] Unclosed Anchor at end of file (started line 1)
[App] Unclosed Anchor: [DEF:App:Component] started at line 1
[handleFormSubmit] Unclosed Anchor at end of file (started line 24)
[handleFormSubmit] Unclosed Anchor: [DEF:handleFormSubmit:Function] started at line 24
[handleFormSubmit] Unclosed Anchor: [DEF:handleFormSubmit:Function] started at line 24
[navigate] Unclosed Anchor at end of file (started line 44)
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44 | -| frontend/src/main.js | 🔴 0% | [main] Unclosed Anchor at end of file (started line 1)
[main] Unclosed Anchor: [DEF:main:Module] started at line 1
[app_instance] Unclosed Anchor at end of file (started line 9)
[app_instance] Unclosed Anchor: [DEF:app_instance:Data] started at line 9
[app_instance] Unclosed Anchor: [DEF:app_instance:Data] started at line 9 | -| frontend/src/components/DashboardGrid.svelte | 🔴 0% | [DashboardGrid] Unclosed Anchor at end of file (started line 1)
[DashboardGrid] Unclosed Anchor: [DEF:DashboardGrid:Component] started at line 1
[handleSort] Unclosed Anchor at end of file (started line 62)
[handleSort] Unclosed Anchor: [DEF:handleSort:Function] started at line 62
[handleSort] Unclosed Anchor: [DEF:handleSort:Function] started at line 62
[handleSelectionChange] Unclosed Anchor at end of file (started line 74)
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectAll] Unclosed Anchor at end of file (started line 88)
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[goToPage] Unclosed Anchor at end of file (started line 106)
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106 | -| frontend/src/components/TaskHistory.svelte | 🔴 0% | [TaskHistory] Unclosed Anchor at end of file (started line 1)
[TaskHistory] Unclosed Anchor: [DEF:TaskHistory:Component] started at line 1 | -| frontend/src/components/MappingTable.svelte | 🔴 0% | [MappingTable] Unclosed Anchor at end of file (started line 1)
[MappingTable] Unclosed Anchor: [DEF:MappingTable:Component] started at line 1
[updateMapping] Unclosed Anchor at end of file (started line 25)
[updateMapping] Unclosed Anchor: [DEF:updateMapping:Function] started at line 25
[updateMapping] Unclosed Anchor: [DEF:updateMapping:Function] started at line 25
[getSuggestion] Unclosed Anchor at end of file (started line 34)
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34 | -| frontend/src/components/EnvSelector.svelte | 🔴 0% | [EnvSelector] Unclosed Anchor at end of file (started line 1)
[EnvSelector] Unclosed Anchor: [DEF:EnvSelector:Component] started at line 1
[handleSelect] Unclosed Anchor at end of file (started line 24)
[handleSelect] Unclosed Anchor: [DEF:handleSelect:Function] started at line 24
[handleSelect] Unclosed Anchor: [DEF:handleSelect:Function] started at line 24 | -| frontend/src/components/TaskList.svelte | 🔴 0% | [TaskList] Unclosed Anchor at end of file (started line 1)
[TaskList] Unclosed Anchor: [DEF:TaskList:Component] started at line 1 | -| frontend/src/components/DynamicForm.svelte | 🔴 0% | [DynamicForm] Unclosed Anchor at end of file (started line 1)
[DynamicForm] Unclosed Anchor: [DEF:DynamicForm:Component] started at line 1
[handleSubmit] Unclosed Anchor at end of file (started line 23)
[handleSubmit] Unclosed Anchor: [DEF:handleSubmit:Function] started at line 23
[handleSubmit] Unclosed Anchor: [DEF:handleSubmit:Function] started at line 23
[initializeForm] Unclosed Anchor at end of file (started line 33)
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33 | -| frontend/src/components/TaskRunner.svelte | 🔴 0% | [TaskRunner] Unclosed Anchor at end of file (started line 1)
[TaskRunner] Unclosed Anchor: [DEF:TaskRunner:Component] started at line 1
[connect] Unclosed Anchor at end of file (started line 38)
[connect] Unclosed Anchor: [DEF:connect:Function] started at line 38
[connect] Unclosed Anchor: [DEF:connect:Function] started at line 38
[onMount] Unclosed Anchor at end of file (started line 225)
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onDestroy] Unclosed Anchor at end of file (started line 251)
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251 | -| frontend/src/components/TaskLogViewer.svelte | 🔴 0% | [TaskLogViewer] Unclosed Anchor at end of file (started line 1)
[TaskLogViewer] Unclosed Anchor: [DEF:TaskLogViewer:Component] started at line 1 | -| frontend/src/components/PasswordPrompt.svelte | 🔴 0% | [PasswordPrompt] Unclosed Anchor at end of file (started line 1)
[PasswordPrompt] Unclosed Anchor: [DEF:PasswordPrompt:Component] started at line 1 | -| frontend/src/components/MissingMappingModal.svelte | 🔴 0% | [MissingMappingModal] Unclosed Anchor at end of file (started line 1)
[MissingMappingModal] Unclosed Anchor: [DEF:MissingMappingModal:Component] started at line 1
[resolve] Unclosed Anchor at end of file (started line 26)
[resolve] Unclosed Anchor: [DEF:resolve:Function] started at line 26
[resolve] Missing Mandatory Tag: @PURPOSE
[resolve] Unclosed Anchor: [DEF:resolve:Function] started at line 26
[resolve] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor at end of file (started line 38)
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE | -| frontend/src/components/Toast.svelte | 🔴 0% | [Toast] Unclosed Anchor at end of file (started line 1)
[Toast] Unclosed Anchor: [DEF:Toast:Component] started at line 1 | -| frontend/src/pages/Settings.svelte | 🔴 0% | [Settings] Unclosed Anchor at end of file (started line 1)
[Settings] Unclosed Anchor: [DEF:Settings:Component] started at line 1
[loadSettings] Unclosed Anchor at end of file (started line 50)
[loadSettings] Unclosed Anchor: [DEF:loadSettings:Function] started at line 50
[loadSettings] Unclosed Anchor: [DEF:loadSettings:Function] started at line 50
[handleSaveGlobal] Unclosed Anchor at end of file (started line 67)
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleAddOrUpdateEnv] Unclosed Anchor at end of file (started line 84)
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleDeleteEnv] Unclosed Anchor at end of file (started line 108)
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleTestEnv] Unclosed Anchor at end of file (started line 129)
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[editEnv] Unclosed Anchor at end of file (started line 152)
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[resetEnvForm] Unclosed Anchor at end of file (started line 163)
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163 | -| frontend/src/pages/Dashboard.svelte | 🔴 0% | [Dashboard] Unclosed Anchor at end of file (started line 1)
[Dashboard] Unclosed Anchor: [DEF:Dashboard:Component] started at line 1
[onMount] Unclosed Anchor at end of file (started line 17)
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 17
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 17
[selectPlugin] Unclosed Anchor at end of file (started line 27)
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27 | -| frontend/src/lib/stores.js | 🔴 0% | [stores_module] Unclosed Anchor at end of file (started line 1)
[stores_module] Unclosed Anchor: [DEF:stores_module:Module] started at line 1
[plugins] Unclosed Anchor at end of file (started line 9)
[plugins] Unclosed Anchor: [DEF:plugins:Data] started at line 9
[plugins] Unclosed Anchor: [DEF:plugins:Data] started at line 9
[tasks] Unclosed Anchor at end of file (started line 13)
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[selectedPlugin] Unclosed Anchor at end of file (started line 17)
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedTask] Unclosed Anchor at end of file (started line 21)
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[currentPage] Unclosed Anchor at end of file (started line 25)
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[taskLogs] Unclosed Anchor at end of file (started line 29)
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[fetchPlugins] Unclosed Anchor at end of file (started line 33)
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchTasks] Unclosed Anchor at end of file (started line 47)
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47 | -| frontend/src/lib/toasts.js | 🔴 0% | [toasts_module] Unclosed Anchor at end of file (started line 1)
[toasts_module] Unclosed Anchor: [DEF:toasts_module:Module] started at line 1
[toasts] Unclosed Anchor at end of file (started line 8)
[toasts] Unclosed Anchor: [DEF:toasts:Data] started at line 8
[toasts] Unclosed Anchor: [DEF:toasts:Data] started at line 8
[addToast] Unclosed Anchor at end of file (started line 12)
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[removeToast] Unclosed Anchor at end of file (started line 25)
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25 | -| frontend/src/lib/api.js | 🔴 0% | [api_module] Unclosed Anchor at end of file (started line 1)
[api_module] Unclosed Anchor: [DEF:api_module:Module] started at line 1
[fetchApi] Unclosed Anchor at end of file (started line 26)
[fetchApi] Unclosed Anchor: [DEF:fetchApi:Function] started at line 26
[fetchApi] Unclosed Anchor: [DEF:fetchApi:Function] started at line 26
[postApi] Unclosed Anchor at end of file (started line 46)
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[requestApi] Unclosed Anchor at end of file (started line 73)
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[api] Unclosed Anchor at end of file (started line 100)
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100 | -| frontend/src/routes/migration/+page.svelte | 🔴 0% | [MigrationDashboard] Unclosed Anchor at end of file (started line 1)
[MigrationDashboard] Unclosed Anchor: [DEF:MigrationDashboard:Component] started at line 1
[fetchEnvironments] Unclosed Anchor at end of file (started line 51)
[fetchEnvironments] Unclosed Anchor: [DEF:fetchEnvironments:Function] started at line 51
[fetchEnvironments] Unclosed Anchor: [DEF:fetchEnvironments:Function] started at line 51
[fetchDashboards] Unclosed Anchor at end of file (started line 69)
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDatabases] Unclosed Anchor at end of file (started line 93)
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[handleMappingUpdate] Unclosed Anchor at end of file (started line 128)
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleViewLogs] Unclosed Anchor at end of file (started line 163)
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor at end of file (started line 172)
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[startMigration] Unclosed Anchor at end of file (started line 207)
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207 | -| frontend/src/routes/migration/mappings/+page.svelte | 🔴 0% | [MappingManagement] Unclosed Anchor at end of file (started line 1)
[MappingManagement] Unclosed Anchor: [DEF:MappingManagement:Component] started at line 1
[fetchDatabases] Unclosed Anchor at end of file (started line 47)
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 47
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 47
[handleUpdate] Unclosed Anchor at end of file (started line 83)
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83 | -| backend/src/services/mapping_service.py | 🔴 0% | [backend.src.services.mapping_service] Unclosed Anchor at end of file (started line 1)
[backend.src.services.mapping_service] Unclosed Anchor: [DEF:backend.src.services.mapping_service:Module] started at line 1
[MappingService] Unclosed Anchor at end of file (started line 18)
[MappingService] Unclosed Anchor: [DEF:MappingService:Class] started at line 18
[MappingService] Unclosed Anchor: [DEF:MappingService:Class] started at line 18
[MappingService.__init__] Unclosed Anchor at end of file (started line 22)
[MappingService.__init__] Unclosed Anchor: [DEF:MappingService.__init__:Function] started at line 22
[MappingService.__init__] Missing Mandatory Tag: @PURPOSE
[MappingService.__init__] Unclosed Anchor: [DEF:MappingService.__init__:Function] started at line 22
[MappingService.__init__] Missing Mandatory Tag: @PURPOSE
[MappingService.__init__] Unclosed Anchor: [DEF:MappingService.__init__:Function] started at line 22
[MappingService.__init__] Missing Mandatory Tag: @PURPOSE
[MappingService._get_client] Unclosed Anchor at end of file (started line 26)
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService.get_suggestions] Unclosed Anchor at end of file (started line 46)
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46 | -| backend/src/core/superset_client.py | 🔴 0% | [backend.src.core.superset_client] Unclosed Anchor at end of file (started line 1)
[backend.src.core.superset_client] Unclosed Anchor: [DEF:backend.src.core.superset_client:Module] started at line 1
[SupersetClient] Unclosed Anchor at end of file (started line 16)
[SupersetClient] Unclosed Anchor: [DEF:SupersetClient:Class] started at line 16
[SupersetClient] Unclosed Anchor: [DEF:SupersetClient:Class] started at line 16
[SupersetClient.get_databases_summary] Unclosed Anchor at end of file (started line 20)
[SupersetClient.get_databases_summary] Unclosed Anchor: [DEF:SupersetClient.get_databases_summary:Function] started at line 20
[SupersetClient.get_databases_summary] Unclosed Anchor: [DEF:SupersetClient.get_databases_summary:Function] started at line 20
[SupersetClient.get_databases_summary] Unclosed Anchor: [DEF:SupersetClient.get_databases_summary:Function] started at line 20
[SupersetClient.get_database_by_uuid] Unclosed Anchor at end of file (started line 40)
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_dashboards_summary] Unclosed Anchor at end of file (started line 55)
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55 | -| backend/src/core/migration_engine.py | 🔴 0% | [backend.src.core.migration_engine] Unclosed Anchor at end of file (started line 1)
[backend.src.core.migration_engine] Unclosed Anchor: [DEF:backend.src.core.migration_engine:Module] started at line 1
[MigrationEngine] Unclosed Anchor at end of file (started line 22)
[MigrationEngine] Unclosed Anchor: [DEF:MigrationEngine:Class] started at line 22
[MigrationEngine] Unclosed Anchor: [DEF:MigrationEngine:Class] started at line 22
[MigrationEngine.transform_zip] Unclosed Anchor at end of file (started line 26)
[MigrationEngine.transform_zip] Unclosed Anchor: [DEF:MigrationEngine.transform_zip:Function] started at line 26
[MigrationEngine.transform_zip] Unclosed Anchor: [DEF:MigrationEngine.transform_zip:Function] started at line 26
[MigrationEngine.transform_zip] Unclosed Anchor: [DEF:MigrationEngine.transform_zip:Function] started at line 26
[MigrationEngine._transform_yaml] Unclosed Anchor at end of file (started line 77)
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77 | -| backend/src/core/database.py | 🟡 60% | [backend.src.core.database] Unclosed Anchor at end of file (started line 1)
[backend.src.core.database] Unclosed Anchor: [DEF:backend.src.core.database:Module] started at line 1
[DATABASE_URL] Unclosed Anchor at end of file (started line 20)
[DATABASE_URL] Unclosed Anchor: [DEF:DATABASE_URL:Constant] started at line 20
[DATABASE_URL] Unclosed Anchor: [DEF:DATABASE_URL:Constant] started at line 20
[TASKS_DATABASE_URL] Unclosed Anchor at end of file (started line 24)
[TASKS_DATABASE_URL] Unclosed Anchor: [DEF:TASKS_DATABASE_URL:Constant] started at line 24
[TASKS_DATABASE_URL] Unclosed Anchor: [DEF:TASKS_DATABASE_URL:Constant] started at line 24
[TASKS_DATABASE_URL] Unclosed Anchor: [DEF:TASKS_DATABASE_URL:Constant] started at line 24
[engine] Unclosed Anchor at end of file (started line 28)
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28
[engine] Unclosed Anchor: [DEF:engine:Variable] started at line 28 | -| generate_semantic_map.py | 🟢 100% | OK | -| search_script.py | 🟢 100% | OK | -| get_dataset_structure.py | 🟢 100% | OK | -| debug_db_api.py | 🟢 100% | OK | -| run_mapper.py | 🟢 100% | OK | -| migration_script.py | 🟢 100% | OK | -| backup_script.py | 🟢 100% | OK | -| superset_tool/exceptions.py | 🟢 100% | OK | -| superset_tool/__init__.py | 🟢 100% | OK | -| superset_tool/client.py | 🟢 100% | OK | -| superset_tool/models.py | 🟢 100% | OK | -| superset_tool/utils/logger.py | 🟢 100% | OK | -| superset_tool/utils/network.py | 🟢 100% | OK | -| superset_tool/utils/whiptail_fallback.py | 🟢 100% | OK | -| superset_tool/utils/dataset_mapper.py | 🟢 100% | OK | -| superset_tool/utils/__init__.py | 🟢 100% | OK | -| superset_tool/utils/init_clients.py | 🟢 100% | OK | -| superset_tool/utils/fileio.py | 🟢 100% | OK | -| backend/src/dependencies.py | 🟢 100% | OK | -| backend/src/app.py | 🟢 100% | OK | -| backend/src/models/mapping.py | 🟢 100% | OK | -| backend/src/models/dashboard.py | 🟢 100% | OK | -| backend/src/models/task.py | 🟢 100% | OK | -| backend/src/core/config_manager.py | 🟢 100% | OK | -| backend/src/core/logger.py | 🟢 100% | OK | -| backend/src/core/config_models.py | 🟢 100% | OK | -| backend/src/core/scheduler.py | 🟢 100% | OK | -| backend/src/core/plugin_loader.py | 🟢 100% | OK | -| backend/src/core/plugin_base.py | 🟢 100% | OK | -| backend/src/core/utils/matching.py | 🟢 100% | OK | -| backend/src/core/task_manager/manager.py | 🟢 100% | OK | -| backend/src/core/task_manager/__init__.py | 🟢 100% | OK | -| backend/src/core/task_manager/cleanup.py | 🟢 100% | OK | -| backend/src/core/task_manager/models.py | 🟢 100% | OK | -| backend/src/core/task_manager/persistence.py | 🟢 100% | OK | -| backend/src/plugins/backup.py | 🟢 100% | OK | -| backend/src/plugins/migration.py | 🟢 100% | OK | -| backend/src/api/auth.py | 🟢 100% | OK | -| backend/src/api/routes/settings.py | 🟢 100% | OK | -| backend/src/api/routes/tasks.py | 🟢 100% | OK | -| backend/src/api/routes/environments.py | 🟢 100% | OK | -| backend/src/api/routes/plugins.py | 🟢 100% | OK | -| backend/src/api/routes/migration.py | 🟢 100% | OK | -| backend/src/api/routes/mappings.py | 🟢 100% | OK | diff --git a/semantics/reports/semantic_report_20260101_164326.md b/semantics/reports/semantic_report_20260101_164326.md deleted file mode 100644 index bc69826..0000000 --- a/semantics/reports/semantic_report_20260101_164326.md +++ /dev/null @@ -1,81 +0,0 @@ -# Semantic Compliance Report - -**Generated At:** 2026-01-01T16:43:26.440577 -**Global Compliance Score:** 65.7% -**Scanned Files:** 68 - -## Critical Parsing Errors -- 🔴 backend/src/core/database.py:77 Mismatched closing anchor. Expected [/DEF:TASKS_DATABASE_URL:Constant], found [/DEF:backend.src.core.database:Module]. -- 🔴 backend/src/plugins/migration.py:297 Mismatched closing anchor. Expected [/DEF:MigrationPlugin:Module], found [/DEF:MigrationPlugin:Class]. - -## File Compliance Status -| File | Score | Issues | -|------|-------|--------| -| frontend/src/App.svelte | 🔴 0% | [App] Unclosed Anchor at end of file (started line 1)
[App] Unclosed Anchor: [DEF:App:Component] started at line 1
[handleFormSubmit] Unclosed Anchor at end of file (started line 24)
[handleFormSubmit] Unclosed Anchor: [DEF:handleFormSubmit:Function] started at line 24
[handleFormSubmit] Unclosed Anchor: [DEF:handleFormSubmit:Function] started at line 24
[navigate] Unclosed Anchor at end of file (started line 44)
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44 | -| frontend/src/main.js | 🔴 0% | [main] Unclosed Anchor at end of file (started line 1)
[main] Unclosed Anchor: [DEF:main:Module] started at line 1
[app_instance] Unclosed Anchor at end of file (started line 9)
[app_instance] Unclosed Anchor: [DEF:app_instance:Data] started at line 9
[app_instance] Unclosed Anchor: [DEF:app_instance:Data] started at line 9 | -| frontend/src/components/DashboardGrid.svelte | 🔴 0% | [DashboardGrid] Unclosed Anchor at end of file (started line 1)
[DashboardGrid] Unclosed Anchor: [DEF:DashboardGrid:Component] started at line 1
[handleSort] Unclosed Anchor at end of file (started line 62)
[handleSort] Unclosed Anchor: [DEF:handleSort:Function] started at line 62
[handleSort] Unclosed Anchor: [DEF:handleSort:Function] started at line 62
[handleSelectionChange] Unclosed Anchor at end of file (started line 74)
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectAll] Unclosed Anchor at end of file (started line 88)
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[goToPage] Unclosed Anchor at end of file (started line 106)
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106 | -| frontend/src/components/TaskHistory.svelte | 🔴 0% | [TaskHistory] Unclosed Anchor at end of file (started line 1)
[TaskHistory] Unclosed Anchor: [DEF:TaskHistory:Component] started at line 1 | -| frontend/src/components/MappingTable.svelte | 🔴 0% | [MappingTable] Unclosed Anchor at end of file (started line 1)
[MappingTable] Unclosed Anchor: [DEF:MappingTable:Component] started at line 1
[updateMapping] Unclosed Anchor at end of file (started line 25)
[updateMapping] Unclosed Anchor: [DEF:updateMapping:Function] started at line 25
[updateMapping] Unclosed Anchor: [DEF:updateMapping:Function] started at line 25
[getSuggestion] Unclosed Anchor at end of file (started line 34)
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34 | -| frontend/src/components/EnvSelector.svelte | 🔴 0% | [EnvSelector] Unclosed Anchor at end of file (started line 1)
[EnvSelector] Unclosed Anchor: [DEF:EnvSelector:Component] started at line 1
[handleSelect] Unclosed Anchor at end of file (started line 24)
[handleSelect] Unclosed Anchor: [DEF:handleSelect:Function] started at line 24
[handleSelect] Unclosed Anchor: [DEF:handleSelect:Function] started at line 24 | -| frontend/src/components/TaskList.svelte | 🔴 0% | [TaskList] Unclosed Anchor at end of file (started line 1)
[TaskList] Unclosed Anchor: [DEF:TaskList:Component] started at line 1 | -| frontend/src/components/DynamicForm.svelte | 🔴 0% | [DynamicForm] Unclosed Anchor at end of file (started line 1)
[DynamicForm] Unclosed Anchor: [DEF:DynamicForm:Component] started at line 1
[handleSubmit] Unclosed Anchor at end of file (started line 23)
[handleSubmit] Unclosed Anchor: [DEF:handleSubmit:Function] started at line 23
[handleSubmit] Unclosed Anchor: [DEF:handleSubmit:Function] started at line 23
[initializeForm] Unclosed Anchor at end of file (started line 33)
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33 | -| frontend/src/components/TaskRunner.svelte | 🔴 0% | [TaskRunner] Unclosed Anchor at end of file (started line 1)
[TaskRunner] Unclosed Anchor: [DEF:TaskRunner:Component] started at line 1
[connect] Unclosed Anchor at end of file (started line 38)
[connect] Unclosed Anchor: [DEF:connect:Function] started at line 38
[connect] Unclosed Anchor: [DEF:connect:Function] started at line 38
[onMount] Unclosed Anchor at end of file (started line 225)
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onDestroy] Unclosed Anchor at end of file (started line 251)
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251 | -| frontend/src/components/TaskLogViewer.svelte | 🔴 0% | [TaskLogViewer] Unclosed Anchor at end of file (started line 1)
[TaskLogViewer] Unclosed Anchor: [DEF:TaskLogViewer:Component] started at line 1 | -| frontend/src/components/PasswordPrompt.svelte | 🔴 0% | [PasswordPrompt] Unclosed Anchor at end of file (started line 1)
[PasswordPrompt] Unclosed Anchor: [DEF:PasswordPrompt:Component] started at line 1 | -| frontend/src/components/MissingMappingModal.svelte | 🔴 0% | [MissingMappingModal] Unclosed Anchor at end of file (started line 1)
[MissingMappingModal] Unclosed Anchor: [DEF:MissingMappingModal:Component] started at line 1
[resolve] Unclosed Anchor at end of file (started line 26)
[resolve] Unclosed Anchor: [DEF:resolve:Function] started at line 26
[resolve] Missing Mandatory Tag: @PURPOSE
[resolve] Unclosed Anchor: [DEF:resolve:Function] started at line 26
[resolve] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor at end of file (started line 38)
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE | -| frontend/src/components/Toast.svelte | 🔴 0% | [Toast] Unclosed Anchor at end of file (started line 1)
[Toast] Unclosed Anchor: [DEF:Toast:Component] started at line 1 | -| frontend/src/pages/Settings.svelte | 🔴 0% | [Settings] Unclosed Anchor at end of file (started line 1)
[Settings] Unclosed Anchor: [DEF:Settings:Component] started at line 1
[loadSettings] Unclosed Anchor at end of file (started line 50)
[loadSettings] Unclosed Anchor: [DEF:loadSettings:Function] started at line 50
[loadSettings] Unclosed Anchor: [DEF:loadSettings:Function] started at line 50
[handleSaveGlobal] Unclosed Anchor at end of file (started line 67)
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleAddOrUpdateEnv] Unclosed Anchor at end of file (started line 84)
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleDeleteEnv] Unclosed Anchor at end of file (started line 108)
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleTestEnv] Unclosed Anchor at end of file (started line 129)
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[editEnv] Unclosed Anchor at end of file (started line 152)
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[resetEnvForm] Unclosed Anchor at end of file (started line 163)
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163 | -| frontend/src/pages/Dashboard.svelte | 🔴 0% | [Dashboard] Unclosed Anchor at end of file (started line 1)
[Dashboard] Unclosed Anchor: [DEF:Dashboard:Component] started at line 1
[onMount] Unclosed Anchor at end of file (started line 17)
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 17
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 17
[selectPlugin] Unclosed Anchor at end of file (started line 27)
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27 | -| frontend/src/lib/stores.js | 🔴 0% | [stores_module] Unclosed Anchor at end of file (started line 1)
[stores_module] Unclosed Anchor: [DEF:stores_module:Module] started at line 1
[plugins] Unclosed Anchor at end of file (started line 9)
[plugins] Unclosed Anchor: [DEF:plugins:Data] started at line 9
[plugins] Unclosed Anchor: [DEF:plugins:Data] started at line 9
[tasks] Unclosed Anchor at end of file (started line 13)
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[selectedPlugin] Unclosed Anchor at end of file (started line 17)
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedTask] Unclosed Anchor at end of file (started line 21)
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[currentPage] Unclosed Anchor at end of file (started line 25)
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[taskLogs] Unclosed Anchor at end of file (started line 29)
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[fetchPlugins] Unclosed Anchor at end of file (started line 33)
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchTasks] Unclosed Anchor at end of file (started line 47)
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47 | -| frontend/src/lib/toasts.js | 🔴 0% | [toasts_module] Unclosed Anchor at end of file (started line 1)
[toasts_module] Unclosed Anchor: [DEF:toasts_module:Module] started at line 1
[toasts] Unclosed Anchor at end of file (started line 8)
[toasts] Unclosed Anchor: [DEF:toasts:Data] started at line 8
[toasts] Unclosed Anchor: [DEF:toasts:Data] started at line 8
[addToast] Unclosed Anchor at end of file (started line 12)
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[removeToast] Unclosed Anchor at end of file (started line 25)
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25 | -| frontend/src/lib/api.js | 🔴 0% | [api_module] Unclosed Anchor at end of file (started line 1)
[api_module] Unclosed Anchor: [DEF:api_module:Module] started at line 1
[fetchApi] Unclosed Anchor at end of file (started line 26)
[fetchApi] Unclosed Anchor: [DEF:fetchApi:Function] started at line 26
[fetchApi] Unclosed Anchor: [DEF:fetchApi:Function] started at line 26
[postApi] Unclosed Anchor at end of file (started line 46)
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[requestApi] Unclosed Anchor at end of file (started line 73)
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[api] Unclosed Anchor at end of file (started line 100)
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100 | -| frontend/src/routes/migration/+page.svelte | 🔴 0% | [MigrationDashboard] Unclosed Anchor at end of file (started line 1)
[MigrationDashboard] Unclosed Anchor: [DEF:MigrationDashboard:Component] started at line 1
[fetchEnvironments] Unclosed Anchor at end of file (started line 51)
[fetchEnvironments] Unclosed Anchor: [DEF:fetchEnvironments:Function] started at line 51
[fetchEnvironments] Unclosed Anchor: [DEF:fetchEnvironments:Function] started at line 51
[fetchDashboards] Unclosed Anchor at end of file (started line 69)
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDatabases] Unclosed Anchor at end of file (started line 93)
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[handleMappingUpdate] Unclosed Anchor at end of file (started line 128)
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleViewLogs] Unclosed Anchor at end of file (started line 163)
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor at end of file (started line 172)
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[startMigration] Unclosed Anchor at end of file (started line 207)
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207 | -| frontend/src/routes/migration/mappings/+page.svelte | 🔴 0% | [MappingManagement] Unclosed Anchor at end of file (started line 1)
[MappingManagement] Unclosed Anchor: [DEF:MappingManagement:Component] started at line 1
[fetchDatabases] Unclosed Anchor at end of file (started line 47)
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 47
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 47
[handleUpdate] Unclosed Anchor at end of file (started line 83)
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83 | -| backend/src/services/mapping_service.py | 🔴 0% | [backend.src.services.mapping_service] Unclosed Anchor at end of file (started line 1)
[backend.src.services.mapping_service] Unclosed Anchor: [DEF:backend.src.services.mapping_service:Module] started at line 1
[MappingService] Unclosed Anchor at end of file (started line 18)
[MappingService] Unclosed Anchor: [DEF:MappingService:Class] started at line 18
[MappingService] Unclosed Anchor: [DEF:MappingService:Class] started at line 18
[MappingService.__init__] Unclosed Anchor at end of file (started line 22)
[MappingService.__init__] Unclosed Anchor: [DEF:MappingService.__init__:Function] started at line 22
[MappingService.__init__] Missing Mandatory Tag: @PURPOSE
[MappingService.__init__] Unclosed Anchor: [DEF:MappingService.__init__:Function] started at line 22
[MappingService.__init__] Missing Mandatory Tag: @PURPOSE
[MappingService.__init__] Unclosed Anchor: [DEF:MappingService.__init__:Function] started at line 22
[MappingService.__init__] Missing Mandatory Tag: @PURPOSE
[MappingService._get_client] Unclosed Anchor at end of file (started line 26)
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService.get_suggestions] Unclosed Anchor at end of file (started line 46)
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46 | -| backend/src/core/superset_client.py | 🔴 0% | [backend.src.core.superset_client] Unclosed Anchor at end of file (started line 1)
[backend.src.core.superset_client] Unclosed Anchor: [DEF:backend.src.core.superset_client:Module] started at line 1
[SupersetClient] Unclosed Anchor at end of file (started line 16)
[SupersetClient] Unclosed Anchor: [DEF:SupersetClient:Class] started at line 16
[SupersetClient] Unclosed Anchor: [DEF:SupersetClient:Class] started at line 16
[SupersetClient.get_databases_summary] Unclosed Anchor at end of file (started line 20)
[SupersetClient.get_databases_summary] Unclosed Anchor: [DEF:SupersetClient.get_databases_summary:Function] started at line 20
[SupersetClient.get_databases_summary] Unclosed Anchor: [DEF:SupersetClient.get_databases_summary:Function] started at line 20
[SupersetClient.get_databases_summary] Unclosed Anchor: [DEF:SupersetClient.get_databases_summary:Function] started at line 20
[SupersetClient.get_database_by_uuid] Unclosed Anchor at end of file (started line 40)
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_dashboards_summary] Unclosed Anchor at end of file (started line 55)
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55 | -| backend/src/core/migration_engine.py | 🔴 0% | [backend.src.core.migration_engine] Unclosed Anchor at end of file (started line 1)
[backend.src.core.migration_engine] Unclosed Anchor: [DEF:backend.src.core.migration_engine:Module] started at line 1
[MigrationEngine] Unclosed Anchor at end of file (started line 22)
[MigrationEngine] Unclosed Anchor: [DEF:MigrationEngine:Class] started at line 22
[MigrationEngine] Unclosed Anchor: [DEF:MigrationEngine:Class] started at line 22
[MigrationEngine.transform_zip] Unclosed Anchor at end of file (started line 26)
[MigrationEngine.transform_zip] Unclosed Anchor: [DEF:MigrationEngine.transform_zip:Function] started at line 26
[MigrationEngine.transform_zip] Unclosed Anchor: [DEF:MigrationEngine.transform_zip:Function] started at line 26
[MigrationEngine.transform_zip] Unclosed Anchor: [DEF:MigrationEngine.transform_zip:Function] started at line 26
[MigrationEngine._transform_yaml] Unclosed Anchor at end of file (started line 77)
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77 | -| backend/src/core/database.py | 🟡 70% | [backend.src.core.database] Unclosed Anchor at end of file (started line 1)
[backend.src.core.database] Unclosed Anchor: [DEF:backend.src.core.database:Module] started at line 1
[DATABASE_URL] Unclosed Anchor at end of file (started line 20)
[DATABASE_URL] Unclosed Anchor: [DEF:DATABASE_URL:Constant] started at line 20
[DATABASE_URL] Unclosed Anchor: [DEF:DATABASE_URL:Constant] started at line 20
[TASKS_DATABASE_URL] Unclosed Anchor at end of file (started line 24)
[TASKS_DATABASE_URL] Unclosed Anchor: [DEF:TASKS_DATABASE_URL:Constant] started at line 24
[TASKS_DATABASE_URL] Unclosed Anchor: [DEF:TASKS_DATABASE_URL:Constant] started at line 24
[TASKS_DATABASE_URL] Unclosed Anchor: [DEF:TASKS_DATABASE_URL:Constant] started at line 24 | -| generate_semantic_map.py | 🟢 100% | OK | -| search_script.py | 🟢 100% | OK | -| get_dataset_structure.py | 🟢 100% | OK | -| debug_db_api.py | 🟢 100% | OK | -| run_mapper.py | 🟢 100% | OK | -| migration_script.py | 🟢 100% | OK | -| backup_script.py | 🟢 100% | OK | -| superset_tool/exceptions.py | 🟢 100% | OK | -| superset_tool/__init__.py | 🟢 100% | OK | -| superset_tool/client.py | 🟢 100% | OK | -| superset_tool/models.py | 🟢 100% | OK | -| superset_tool/utils/logger.py | 🟢 100% | OK | -| superset_tool/utils/network.py | 🟢 100% | OK | -| superset_tool/utils/whiptail_fallback.py | 🟢 100% | OK | -| superset_tool/utils/dataset_mapper.py | 🟢 100% | OK | -| superset_tool/utils/__init__.py | 🟢 100% | OK | -| superset_tool/utils/init_clients.py | 🟢 100% | OK | -| superset_tool/utils/fileio.py | 🟢 100% | OK | -| backend/src/dependencies.py | 🟢 100% | OK | -| backend/src/app.py | 🟢 100% | OK | -| backend/src/models/mapping.py | 🟢 100% | OK | -| backend/src/models/dashboard.py | 🟢 100% | OK | -| backend/src/models/task.py | 🟢 100% | OK | -| backend/src/core/config_manager.py | 🟢 100% | OK | -| backend/src/core/logger.py | 🟢 100% | OK | -| backend/src/core/config_models.py | 🟢 100% | OK | -| backend/src/core/scheduler.py | 🟢 100% | OK | -| backend/src/core/plugin_loader.py | 🟢 100% | OK | -| backend/src/core/plugin_base.py | 🟢 100% | OK | -| backend/src/core/utils/matching.py | 🟢 100% | OK | -| backend/src/core/task_manager/manager.py | 🟢 100% | OK | -| backend/src/core/task_manager/__init__.py | 🟢 100% | OK | -| backend/src/core/task_manager/cleanup.py | 🟢 100% | OK | -| backend/src/core/task_manager/models.py | 🟢 100% | OK | -| backend/src/core/task_manager/persistence.py | 🟢 100% | OK | -| backend/src/plugins/backup.py | 🟢 100% | OK | -| backend/src/plugins/migration.py | 🟢 100% | OK | -| backend/src/api/auth.py | 🟢 100% | OK | -| backend/src/api/routes/settings.py | 🟢 100% | OK | -| backend/src/api/routes/tasks.py | 🟢 100% | OK | -| backend/src/api/routes/environments.py | 🟢 100% | OK | -| backend/src/api/routes/plugins.py | 🟢 100% | OK | -| backend/src/api/routes/migration.py | 🟢 100% | OK | -| backend/src/api/routes/mappings.py | 🟢 100% | OK | diff --git a/semantics/reports/semantic_report_20260101_164454.md b/semantics/reports/semantic_report_20260101_164454.md deleted file mode 100644 index bc498be..0000000 --- a/semantics/reports/semantic_report_20260101_164454.md +++ /dev/null @@ -1,77 +0,0 @@ -# Semantic Compliance Report - -**Generated At:** 2026-01-01T16:44:54.688193 -**Global Compliance Score:** 66.2% -**Scanned Files:** 68 - -## File Compliance Status -| File | Score | Issues | -|------|-------|--------| -| frontend/src/App.svelte | 🔴 0% | [App] Unclosed Anchor at end of file (started line 1)
[App] Unclosed Anchor: [DEF:App:Component] started at line 1
[handleFormSubmit] Unclosed Anchor at end of file (started line 24)
[handleFormSubmit] Unclosed Anchor: [DEF:handleFormSubmit:Function] started at line 24
[handleFormSubmit] Unclosed Anchor: [DEF:handleFormSubmit:Function] started at line 24
[navigate] Unclosed Anchor at end of file (started line 44)
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44 | -| frontend/src/main.js | 🔴 0% | [main] Unclosed Anchor at end of file (started line 1)
[main] Unclosed Anchor: [DEF:main:Module] started at line 1
[app_instance] Unclosed Anchor at end of file (started line 9)
[app_instance] Unclosed Anchor: [DEF:app_instance:Data] started at line 9
[app_instance] Unclosed Anchor: [DEF:app_instance:Data] started at line 9 | -| frontend/src/components/DashboardGrid.svelte | 🔴 0% | [DashboardGrid] Unclosed Anchor at end of file (started line 1)
[DashboardGrid] Unclosed Anchor: [DEF:DashboardGrid:Component] started at line 1
[handleSort] Unclosed Anchor at end of file (started line 62)
[handleSort] Unclosed Anchor: [DEF:handleSort:Function] started at line 62
[handleSort] Unclosed Anchor: [DEF:handleSort:Function] started at line 62
[handleSelectionChange] Unclosed Anchor at end of file (started line 74)
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectAll] Unclosed Anchor at end of file (started line 88)
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[goToPage] Unclosed Anchor at end of file (started line 106)
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106 | -| frontend/src/components/TaskHistory.svelte | 🔴 0% | [TaskHistory] Unclosed Anchor at end of file (started line 1)
[TaskHistory] Unclosed Anchor: [DEF:TaskHistory:Component] started at line 1 | -| frontend/src/components/MappingTable.svelte | 🔴 0% | [MappingTable] Unclosed Anchor at end of file (started line 1)
[MappingTable] Unclosed Anchor: [DEF:MappingTable:Component] started at line 1
[updateMapping] Unclosed Anchor at end of file (started line 25)
[updateMapping] Unclosed Anchor: [DEF:updateMapping:Function] started at line 25
[updateMapping] Unclosed Anchor: [DEF:updateMapping:Function] started at line 25
[getSuggestion] Unclosed Anchor at end of file (started line 34)
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34 | -| frontend/src/components/EnvSelector.svelte | 🔴 0% | [EnvSelector] Unclosed Anchor at end of file (started line 1)
[EnvSelector] Unclosed Anchor: [DEF:EnvSelector:Component] started at line 1
[handleSelect] Unclosed Anchor at end of file (started line 24)
[handleSelect] Unclosed Anchor: [DEF:handleSelect:Function] started at line 24
[handleSelect] Unclosed Anchor: [DEF:handleSelect:Function] started at line 24 | -| frontend/src/components/TaskList.svelte | 🔴 0% | [TaskList] Unclosed Anchor at end of file (started line 1)
[TaskList] Unclosed Anchor: [DEF:TaskList:Component] started at line 1 | -| frontend/src/components/DynamicForm.svelte | 🔴 0% | [DynamicForm] Unclosed Anchor at end of file (started line 1)
[DynamicForm] Unclosed Anchor: [DEF:DynamicForm:Component] started at line 1
[handleSubmit] Unclosed Anchor at end of file (started line 23)
[handleSubmit] Unclosed Anchor: [DEF:handleSubmit:Function] started at line 23
[handleSubmit] Unclosed Anchor: [DEF:handleSubmit:Function] started at line 23
[initializeForm] Unclosed Anchor at end of file (started line 33)
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33 | -| frontend/src/components/TaskRunner.svelte | 🔴 0% | [TaskRunner] Unclosed Anchor at end of file (started line 1)
[TaskRunner] Unclosed Anchor: [DEF:TaskRunner:Component] started at line 1
[connect] Unclosed Anchor at end of file (started line 38)
[connect] Unclosed Anchor: [DEF:connect:Function] started at line 38
[connect] Unclosed Anchor: [DEF:connect:Function] started at line 38
[onMount] Unclosed Anchor at end of file (started line 225)
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onDestroy] Unclosed Anchor at end of file (started line 251)
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251 | -| frontend/src/components/TaskLogViewer.svelte | 🔴 0% | [TaskLogViewer] Unclosed Anchor at end of file (started line 1)
[TaskLogViewer] Unclosed Anchor: [DEF:TaskLogViewer:Component] started at line 1 | -| frontend/src/components/PasswordPrompt.svelte | 🔴 0% | [PasswordPrompt] Unclosed Anchor at end of file (started line 1)
[PasswordPrompt] Unclosed Anchor: [DEF:PasswordPrompt:Component] started at line 1 | -| frontend/src/components/MissingMappingModal.svelte | 🔴 0% | [MissingMappingModal] Unclosed Anchor at end of file (started line 1)
[MissingMappingModal] Unclosed Anchor: [DEF:MissingMappingModal:Component] started at line 1
[resolve] Unclosed Anchor at end of file (started line 26)
[resolve] Unclosed Anchor: [DEF:resolve:Function] started at line 26
[resolve] Missing Mandatory Tag: @PURPOSE
[resolve] Unclosed Anchor: [DEF:resolve:Function] started at line 26
[resolve] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor at end of file (started line 38)
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE | -| frontend/src/components/Toast.svelte | 🔴 0% | [Toast] Unclosed Anchor at end of file (started line 1)
[Toast] Unclosed Anchor: [DEF:Toast:Component] started at line 1 | -| frontend/src/pages/Settings.svelte | 🔴 0% | [Settings] Unclosed Anchor at end of file (started line 1)
[Settings] Unclosed Anchor: [DEF:Settings:Component] started at line 1
[loadSettings] Unclosed Anchor at end of file (started line 50)
[loadSettings] Unclosed Anchor: [DEF:loadSettings:Function] started at line 50
[loadSettings] Unclosed Anchor: [DEF:loadSettings:Function] started at line 50
[handleSaveGlobal] Unclosed Anchor at end of file (started line 67)
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleAddOrUpdateEnv] Unclosed Anchor at end of file (started line 84)
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleDeleteEnv] Unclosed Anchor at end of file (started line 108)
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleTestEnv] Unclosed Anchor at end of file (started line 129)
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[editEnv] Unclosed Anchor at end of file (started line 152)
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[resetEnvForm] Unclosed Anchor at end of file (started line 163)
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163 | -| frontend/src/pages/Dashboard.svelte | 🔴 0% | [Dashboard] Unclosed Anchor at end of file (started line 1)
[Dashboard] Unclosed Anchor: [DEF:Dashboard:Component] started at line 1
[onMount] Unclosed Anchor at end of file (started line 17)
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 17
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 17
[selectPlugin] Unclosed Anchor at end of file (started line 27)
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27 | -| frontend/src/lib/stores.js | 🔴 0% | [stores_module] Unclosed Anchor at end of file (started line 1)
[stores_module] Unclosed Anchor: [DEF:stores_module:Module] started at line 1
[plugins] Unclosed Anchor at end of file (started line 9)
[plugins] Unclosed Anchor: [DEF:plugins:Data] started at line 9
[plugins] Unclosed Anchor: [DEF:plugins:Data] started at line 9
[tasks] Unclosed Anchor at end of file (started line 13)
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[selectedPlugin] Unclosed Anchor at end of file (started line 17)
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedTask] Unclosed Anchor at end of file (started line 21)
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[currentPage] Unclosed Anchor at end of file (started line 25)
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[taskLogs] Unclosed Anchor at end of file (started line 29)
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[fetchPlugins] Unclosed Anchor at end of file (started line 33)
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchTasks] Unclosed Anchor at end of file (started line 47)
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47 | -| frontend/src/lib/toasts.js | 🔴 0% | [toasts_module] Unclosed Anchor at end of file (started line 1)
[toasts_module] Unclosed Anchor: [DEF:toasts_module:Module] started at line 1
[toasts] Unclosed Anchor at end of file (started line 8)
[toasts] Unclosed Anchor: [DEF:toasts:Data] started at line 8
[toasts] Unclosed Anchor: [DEF:toasts:Data] started at line 8
[addToast] Unclosed Anchor at end of file (started line 12)
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[removeToast] Unclosed Anchor at end of file (started line 25)
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25 | -| frontend/src/lib/api.js | 🔴 0% | [api_module] Unclosed Anchor at end of file (started line 1)
[api_module] Unclosed Anchor: [DEF:api_module:Module] started at line 1
[fetchApi] Unclosed Anchor at end of file (started line 26)
[fetchApi] Unclosed Anchor: [DEF:fetchApi:Function] started at line 26
[fetchApi] Unclosed Anchor: [DEF:fetchApi:Function] started at line 26
[postApi] Unclosed Anchor at end of file (started line 46)
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[requestApi] Unclosed Anchor at end of file (started line 73)
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[api] Unclosed Anchor at end of file (started line 100)
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100 | -| frontend/src/routes/migration/+page.svelte | 🔴 0% | [MigrationDashboard] Unclosed Anchor at end of file (started line 1)
[MigrationDashboard] Unclosed Anchor: [DEF:MigrationDashboard:Component] started at line 1
[fetchEnvironments] Unclosed Anchor at end of file (started line 51)
[fetchEnvironments] Unclosed Anchor: [DEF:fetchEnvironments:Function] started at line 51
[fetchEnvironments] Unclosed Anchor: [DEF:fetchEnvironments:Function] started at line 51
[fetchDashboards] Unclosed Anchor at end of file (started line 69)
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDatabases] Unclosed Anchor at end of file (started line 93)
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[handleMappingUpdate] Unclosed Anchor at end of file (started line 128)
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleViewLogs] Unclosed Anchor at end of file (started line 163)
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor at end of file (started line 172)
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[startMigration] Unclosed Anchor at end of file (started line 207)
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207 | -| frontend/src/routes/migration/mappings/+page.svelte | 🔴 0% | [MappingManagement] Unclosed Anchor at end of file (started line 1)
[MappingManagement] Unclosed Anchor: [DEF:MappingManagement:Component] started at line 1
[fetchDatabases] Unclosed Anchor at end of file (started line 47)
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 47
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 47
[handleUpdate] Unclosed Anchor at end of file (started line 83)
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83 | -| backend/src/services/mapping_service.py | 🔴 0% | [backend.src.services.mapping_service] Unclosed Anchor at end of file (started line 1)
[backend.src.services.mapping_service] Unclosed Anchor: [DEF:backend.src.services.mapping_service:Module] started at line 1
[MappingService] Unclosed Anchor at end of file (started line 18)
[MappingService] Unclosed Anchor: [DEF:MappingService:Class] started at line 18
[MappingService] Unclosed Anchor: [DEF:MappingService:Class] started at line 18
[MappingService.__init__] Unclosed Anchor at end of file (started line 22)
[MappingService.__init__] Unclosed Anchor: [DEF:MappingService.__init__:Function] started at line 22
[MappingService.__init__] Missing Mandatory Tag: @PURPOSE
[MappingService.__init__] Unclosed Anchor: [DEF:MappingService.__init__:Function] started at line 22
[MappingService.__init__] Missing Mandatory Tag: @PURPOSE
[MappingService.__init__] Unclosed Anchor: [DEF:MappingService.__init__:Function] started at line 22
[MappingService.__init__] Missing Mandatory Tag: @PURPOSE
[MappingService._get_client] Unclosed Anchor at end of file (started line 26)
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService._get_client] Unclosed Anchor: [DEF:MappingService._get_client:Function] started at line 26
[MappingService.get_suggestions] Unclosed Anchor at end of file (started line 46)
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46
[MappingService.get_suggestions] Unclosed Anchor: [DEF:MappingService.get_suggestions:Function] started at line 46 | -| backend/src/core/superset_client.py | 🔴 0% | [backend.src.core.superset_client] Unclosed Anchor at end of file (started line 1)
[backend.src.core.superset_client] Unclosed Anchor: [DEF:backend.src.core.superset_client:Module] started at line 1
[SupersetClient] Unclosed Anchor at end of file (started line 16)
[SupersetClient] Unclosed Anchor: [DEF:SupersetClient:Class] started at line 16
[SupersetClient] Unclosed Anchor: [DEF:SupersetClient:Class] started at line 16
[SupersetClient.get_databases_summary] Unclosed Anchor at end of file (started line 20)
[SupersetClient.get_databases_summary] Unclosed Anchor: [DEF:SupersetClient.get_databases_summary:Function] started at line 20
[SupersetClient.get_databases_summary] Unclosed Anchor: [DEF:SupersetClient.get_databases_summary:Function] started at line 20
[SupersetClient.get_databases_summary] Unclosed Anchor: [DEF:SupersetClient.get_databases_summary:Function] started at line 20
[SupersetClient.get_database_by_uuid] Unclosed Anchor at end of file (started line 40)
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_database_by_uuid] Unclosed Anchor: [DEF:SupersetClient.get_database_by_uuid:Function] started at line 40
[SupersetClient.get_dashboards_summary] Unclosed Anchor at end of file (started line 55)
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55
[SupersetClient.get_dashboards_summary] Unclosed Anchor: [DEF:SupersetClient.get_dashboards_summary:Function] started at line 55 | -| backend/src/core/migration_engine.py | 🔴 0% | [backend.src.core.migration_engine] Unclosed Anchor at end of file (started line 1)
[backend.src.core.migration_engine] Unclosed Anchor: [DEF:backend.src.core.migration_engine:Module] started at line 1
[MigrationEngine] Unclosed Anchor at end of file (started line 22)
[MigrationEngine] Unclosed Anchor: [DEF:MigrationEngine:Class] started at line 22
[MigrationEngine] Unclosed Anchor: [DEF:MigrationEngine:Class] started at line 22
[MigrationEngine.transform_zip] Unclosed Anchor at end of file (started line 26)
[MigrationEngine.transform_zip] Unclosed Anchor: [DEF:MigrationEngine.transform_zip:Function] started at line 26
[MigrationEngine.transform_zip] Unclosed Anchor: [DEF:MigrationEngine.transform_zip:Function] started at line 26
[MigrationEngine.transform_zip] Unclosed Anchor: [DEF:MigrationEngine.transform_zip:Function] started at line 26
[MigrationEngine._transform_yaml] Unclosed Anchor at end of file (started line 77)
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77
[MigrationEngine._transform_yaml] Unclosed Anchor: [DEF:MigrationEngine._transform_yaml:Function] started at line 77 | -| generate_semantic_map.py | 🟢 100% | OK | -| search_script.py | 🟢 100% | OK | -| get_dataset_structure.py | 🟢 100% | OK | -| debug_db_api.py | 🟢 100% | OK | -| run_mapper.py | 🟢 100% | OK | -| migration_script.py | 🟢 100% | OK | -| backup_script.py | 🟢 100% | OK | -| superset_tool/exceptions.py | 🟢 100% | OK | -| superset_tool/__init__.py | 🟢 100% | OK | -| superset_tool/client.py | 🟢 100% | OK | -| superset_tool/models.py | 🟢 100% | OK | -| superset_tool/utils/logger.py | 🟢 100% | OK | -| superset_tool/utils/network.py | 🟢 100% | OK | -| superset_tool/utils/whiptail_fallback.py | 🟢 100% | OK | -| superset_tool/utils/dataset_mapper.py | 🟢 100% | OK | -| superset_tool/utils/__init__.py | 🟢 100% | OK | -| superset_tool/utils/init_clients.py | 🟢 100% | OK | -| superset_tool/utils/fileio.py | 🟢 100% | OK | -| backend/src/dependencies.py | 🟢 100% | OK | -| backend/src/app.py | 🟢 100% | OK | -| backend/src/models/mapping.py | 🟢 100% | OK | -| backend/src/models/dashboard.py | 🟢 100% | OK | -| backend/src/models/task.py | 🟢 100% | OK | -| backend/src/core/config_manager.py | 🟢 100% | OK | -| backend/src/core/logger.py | 🟢 100% | OK | -| backend/src/core/database.py | 🟢 100% | OK | -| backend/src/core/config_models.py | 🟢 100% | OK | -| backend/src/core/scheduler.py | 🟢 100% | OK | -| backend/src/core/plugin_loader.py | 🟢 100% | OK | -| backend/src/core/plugin_base.py | 🟢 100% | OK | -| backend/src/core/utils/matching.py | 🟢 100% | OK | -| backend/src/core/task_manager/manager.py | 🟢 100% | OK | -| backend/src/core/task_manager/__init__.py | 🟢 100% | OK | -| backend/src/core/task_manager/cleanup.py | 🟢 100% | OK | -| backend/src/core/task_manager/models.py | 🟢 100% | OK | -| backend/src/core/task_manager/persistence.py | 🟢 100% | OK | -| backend/src/plugins/backup.py | 🟢 100% | OK | -| backend/src/plugins/migration.py | 🟢 100% | OK | -| backend/src/api/auth.py | 🟢 100% | OK | -| backend/src/api/routes/settings.py | 🟢 100% | OK | -| backend/src/api/routes/tasks.py | 🟢 100% | OK | -| backend/src/api/routes/environments.py | 🟢 100% | OK | -| backend/src/api/routes/plugins.py | 🟢 100% | OK | -| backend/src/api/routes/migration.py | 🟢 100% | OK | -| backend/src/api/routes/mappings.py | 🟢 100% | OK | diff --git a/semantics/reports/semantic_report_20260101_164708.md b/semantics/reports/semantic_report_20260101_164708.md deleted file mode 100644 index b4d9e30..0000000 --- a/semantics/reports/semantic_report_20260101_164708.md +++ /dev/null @@ -1,77 +0,0 @@ -# Semantic Compliance Report - -**Generated At:** 2026-01-01T16:47:08.171792 -**Global Compliance Score:** 70.6% -**Scanned Files:** 68 - -## File Compliance Status -| File | Score | Issues | -|------|-------|--------| -| frontend/src/App.svelte | 🔴 0% | [App] Unclosed Anchor at end of file (started line 1)
[App] Unclosed Anchor: [DEF:App:Component] started at line 1
[handleFormSubmit] Unclosed Anchor at end of file (started line 24)
[handleFormSubmit] Unclosed Anchor: [DEF:handleFormSubmit:Function] started at line 24
[handleFormSubmit] Unclosed Anchor: [DEF:handleFormSubmit:Function] started at line 24
[navigate] Unclosed Anchor at end of file (started line 44)
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44
[navigate] Unclosed Anchor: [DEF:navigate:Function] started at line 44 | -| frontend/src/main.js | 🔴 0% | [main] Unclosed Anchor at end of file (started line 1)
[main] Unclosed Anchor: [DEF:main:Module] started at line 1
[app_instance] Unclosed Anchor at end of file (started line 9)
[app_instance] Unclosed Anchor: [DEF:app_instance:Data] started at line 9
[app_instance] Unclosed Anchor: [DEF:app_instance:Data] started at line 9 | -| frontend/src/components/DashboardGrid.svelte | 🔴 0% | [DashboardGrid] Unclosed Anchor at end of file (started line 1)
[DashboardGrid] Unclosed Anchor: [DEF:DashboardGrid:Component] started at line 1
[handleSort] Unclosed Anchor at end of file (started line 62)
[handleSort] Unclosed Anchor: [DEF:handleSort:Function] started at line 62
[handleSort] Unclosed Anchor: [DEF:handleSort:Function] started at line 62
[handleSelectionChange] Unclosed Anchor at end of file (started line 74)
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 74
[handleSelectAll] Unclosed Anchor at end of file (started line 88)
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 88
[goToPage] Unclosed Anchor at end of file (started line 106)
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 106 | -| frontend/src/components/TaskHistory.svelte | 🔴 0% | [TaskHistory] Unclosed Anchor at end of file (started line 1)
[TaskHistory] Unclosed Anchor: [DEF:TaskHistory:Component] started at line 1 | -| frontend/src/components/MappingTable.svelte | 🔴 0% | [MappingTable] Unclosed Anchor at end of file (started line 1)
[MappingTable] Unclosed Anchor: [DEF:MappingTable:Component] started at line 1
[updateMapping] Unclosed Anchor at end of file (started line 25)
[updateMapping] Unclosed Anchor: [DEF:updateMapping:Function] started at line 25
[updateMapping] Unclosed Anchor: [DEF:updateMapping:Function] started at line 25
[getSuggestion] Unclosed Anchor at end of file (started line 34)
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34
[getSuggestion] Unclosed Anchor: [DEF:getSuggestion:Function] started at line 34 | -| frontend/src/components/EnvSelector.svelte | 🔴 0% | [EnvSelector] Unclosed Anchor at end of file (started line 1)
[EnvSelector] Unclosed Anchor: [DEF:EnvSelector:Component] started at line 1
[handleSelect] Unclosed Anchor at end of file (started line 24)
[handleSelect] Unclosed Anchor: [DEF:handleSelect:Function] started at line 24
[handleSelect] Unclosed Anchor: [DEF:handleSelect:Function] started at line 24 | -| frontend/src/components/TaskList.svelte | 🔴 0% | [TaskList] Unclosed Anchor at end of file (started line 1)
[TaskList] Unclosed Anchor: [DEF:TaskList:Component] started at line 1 | -| frontend/src/components/DynamicForm.svelte | 🔴 0% | [DynamicForm] Unclosed Anchor at end of file (started line 1)
[DynamicForm] Unclosed Anchor: [DEF:DynamicForm:Component] started at line 1
[handleSubmit] Unclosed Anchor at end of file (started line 23)
[handleSubmit] Unclosed Anchor: [DEF:handleSubmit:Function] started at line 23
[handleSubmit] Unclosed Anchor: [DEF:handleSubmit:Function] started at line 23
[initializeForm] Unclosed Anchor at end of file (started line 33)
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33
[initializeForm] Unclosed Anchor: [DEF:initializeForm:Function] started at line 33 | -| frontend/src/components/TaskRunner.svelte | 🔴 0% | [TaskRunner] Unclosed Anchor at end of file (started line 1)
[TaskRunner] Unclosed Anchor: [DEF:TaskRunner:Component] started at line 1
[connect] Unclosed Anchor at end of file (started line 38)
[connect] Unclosed Anchor: [DEF:connect:Function] started at line 38
[connect] Unclosed Anchor: [DEF:connect:Function] started at line 38
[onMount] Unclosed Anchor at end of file (started line 225)
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 225
[onMount] Missing Mandatory Tag: @PURPOSE
[onDestroy] Unclosed Anchor at end of file (started line 251)
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251
[onDestroy] Unclosed Anchor: [DEF:onDestroy:Function] started at line 251 | -| frontend/src/components/TaskLogViewer.svelte | 🔴 0% | [TaskLogViewer] Unclosed Anchor at end of file (started line 1)
[TaskLogViewer] Unclosed Anchor: [DEF:TaskLogViewer:Component] started at line 1 | -| frontend/src/components/PasswordPrompt.svelte | 🔴 0% | [PasswordPrompt] Unclosed Anchor at end of file (started line 1)
[PasswordPrompt] Unclosed Anchor: [DEF:PasswordPrompt:Component] started at line 1 | -| frontend/src/components/MissingMappingModal.svelte | 🔴 0% | [MissingMappingModal] Unclosed Anchor at end of file (started line 1)
[MissingMappingModal] Unclosed Anchor: [DEF:MissingMappingModal:Component] started at line 1
[resolve] Unclosed Anchor at end of file (started line 26)
[resolve] Unclosed Anchor: [DEF:resolve:Function] started at line 26
[resolve] Missing Mandatory Tag: @PURPOSE
[resolve] Unclosed Anchor: [DEF:resolve:Function] started at line 26
[resolve] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor at end of file (started line 38)
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE
[cancel] Unclosed Anchor: [DEF:cancel:Function] started at line 38
[cancel] Missing Mandatory Tag: @PURPOSE | -| frontend/src/components/Toast.svelte | 🔴 0% | [Toast] Unclosed Anchor at end of file (started line 1)
[Toast] Unclosed Anchor: [DEF:Toast:Component] started at line 1 | -| frontend/src/pages/Settings.svelte | 🔴 0% | [Settings] Unclosed Anchor at end of file (started line 1)
[Settings] Unclosed Anchor: [DEF:Settings:Component] started at line 1
[loadSettings] Unclosed Anchor at end of file (started line 50)
[loadSettings] Unclosed Anchor: [DEF:loadSettings:Function] started at line 50
[loadSettings] Unclosed Anchor: [DEF:loadSettings:Function] started at line 50
[handleSaveGlobal] Unclosed Anchor at end of file (started line 67)
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleSaveGlobal] Unclosed Anchor: [DEF:handleSaveGlobal:Function] started at line 67
[handleAddOrUpdateEnv] Unclosed Anchor at end of file (started line 84)
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleAddOrUpdateEnv] Unclosed Anchor: [DEF:handleAddOrUpdateEnv:Function] started at line 84
[handleDeleteEnv] Unclosed Anchor at end of file (started line 108)
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleDeleteEnv] Unclosed Anchor: [DEF:handleDeleteEnv:Function] started at line 108
[handleTestEnv] Unclosed Anchor at end of file (started line 129)
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[handleTestEnv] Unclosed Anchor: [DEF:handleTestEnv:Function] started at line 129
[editEnv] Unclosed Anchor at end of file (started line 152)
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[editEnv] Unclosed Anchor: [DEF:editEnv:Function] started at line 152
[resetEnvForm] Unclosed Anchor at end of file (started line 163)
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163
[resetEnvForm] Unclosed Anchor: [DEF:resetEnvForm:Function] started at line 163 | -| frontend/src/pages/Dashboard.svelte | 🔴 0% | [Dashboard] Unclosed Anchor at end of file (started line 1)
[Dashboard] Unclosed Anchor: [DEF:Dashboard:Component] started at line 1
[onMount] Unclosed Anchor at end of file (started line 17)
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 17
[onMount] Unclosed Anchor: [DEF:onMount:Function] started at line 17
[selectPlugin] Unclosed Anchor at end of file (started line 27)
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27
[selectPlugin] Unclosed Anchor: [DEF:selectPlugin:Function] started at line 27 | -| frontend/src/lib/stores.js | 🔴 0% | [stores_module] Unclosed Anchor at end of file (started line 1)
[stores_module] Unclosed Anchor: [DEF:stores_module:Module] started at line 1
[plugins] Unclosed Anchor at end of file (started line 9)
[plugins] Unclosed Anchor: [DEF:plugins:Data] started at line 9
[plugins] Unclosed Anchor: [DEF:plugins:Data] started at line 9
[tasks] Unclosed Anchor at end of file (started line 13)
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[tasks] Unclosed Anchor: [DEF:tasks:Data] started at line 13
[selectedPlugin] Unclosed Anchor at end of file (started line 17)
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedPlugin] Unclosed Anchor: [DEF:selectedPlugin:Data] started at line 17
[selectedTask] Unclosed Anchor at end of file (started line 21)
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[selectedTask] Unclosed Anchor: [DEF:selectedTask:Data] started at line 21
[currentPage] Unclosed Anchor at end of file (started line 25)
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[currentPage] Unclosed Anchor: [DEF:currentPage:Data] started at line 25
[taskLogs] Unclosed Anchor at end of file (started line 29)
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[taskLogs] Unclosed Anchor: [DEF:taskLogs:Data] started at line 29
[fetchPlugins] Unclosed Anchor at end of file (started line 33)
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchPlugins] Unclosed Anchor: [DEF:fetchPlugins:Function] started at line 33
[fetchTasks] Unclosed Anchor at end of file (started line 47)
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47
[fetchTasks] Unclosed Anchor: [DEF:fetchTasks:Function] started at line 47 | -| frontend/src/lib/toasts.js | 🔴 0% | [toasts_module] Unclosed Anchor at end of file (started line 1)
[toasts_module] Unclosed Anchor: [DEF:toasts_module:Module] started at line 1
[toasts] Unclosed Anchor at end of file (started line 8)
[toasts] Unclosed Anchor: [DEF:toasts:Data] started at line 8
[toasts] Unclosed Anchor: [DEF:toasts:Data] started at line 8
[addToast] Unclosed Anchor at end of file (started line 12)
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[addToast] Unclosed Anchor: [DEF:addToast:Function] started at line 12
[removeToast] Unclosed Anchor at end of file (started line 25)
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25
[removeToast] Unclosed Anchor: [DEF:removeToast:Function] started at line 25 | -| frontend/src/lib/api.js | 🔴 0% | [api_module] Unclosed Anchor at end of file (started line 1)
[api_module] Unclosed Anchor: [DEF:api_module:Module] started at line 1
[fetchApi] Unclosed Anchor at end of file (started line 26)
[fetchApi] Unclosed Anchor: [DEF:fetchApi:Function] started at line 26
[fetchApi] Unclosed Anchor: [DEF:fetchApi:Function] started at line 26
[postApi] Unclosed Anchor at end of file (started line 46)
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[postApi] Unclosed Anchor: [DEF:postApi:Function] started at line 46
[requestApi] Unclosed Anchor at end of file (started line 73)
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[requestApi] Unclosed Anchor: [DEF:requestApi:Function] started at line 73
[api] Unclosed Anchor at end of file (started line 100)
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100
[api] Unclosed Anchor: [DEF:api:Data] started at line 100 | -| frontend/src/routes/migration/+page.svelte | 🔴 0% | [MigrationDashboard] Unclosed Anchor at end of file (started line 1)
[MigrationDashboard] Unclosed Anchor: [DEF:MigrationDashboard:Component] started at line 1
[fetchEnvironments] Unclosed Anchor at end of file (started line 51)
[fetchEnvironments] Unclosed Anchor: [DEF:fetchEnvironments:Function] started at line 51
[fetchEnvironments] Unclosed Anchor: [DEF:fetchEnvironments:Function] started at line 51
[fetchDashboards] Unclosed Anchor at end of file (started line 69)
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDashboards] Unclosed Anchor: [DEF:fetchDashboards:Function] started at line 69
[fetchDatabases] Unclosed Anchor at end of file (started line 93)
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 93
[handleMappingUpdate] Unclosed Anchor at end of file (started line 128)
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleMappingUpdate] Unclosed Anchor: [DEF:handleMappingUpdate:Function] started at line 128
[handleViewLogs] Unclosed Anchor at end of file (started line 163)
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handleViewLogs] Unclosed Anchor: [DEF:handleViewLogs:Function] started at line 163
[handleViewLogs] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor at end of file (started line 172)
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[handlePasswordPrompt] Unclosed Anchor: [DEF:handlePasswordPrompt:Function] started at line 172
[handlePasswordPrompt] Missing Mandatory Tag: @PURPOSE
[startMigration] Unclosed Anchor at end of file (started line 207)
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207
[startMigration] Unclosed Anchor: [DEF:startMigration:Function] started at line 207 | -| frontend/src/routes/migration/mappings/+page.svelte | 🔴 0% | [MappingManagement] Unclosed Anchor at end of file (started line 1)
[MappingManagement] Unclosed Anchor: [DEF:MappingManagement:Component] started at line 1
[fetchDatabases] Unclosed Anchor at end of file (started line 47)
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 47
[fetchDatabases] Unclosed Anchor: [DEF:fetchDatabases:Function] started at line 47
[handleUpdate] Unclosed Anchor at end of file (started line 83)
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83
[handleUpdate] Unclosed Anchor: [DEF:handleUpdate:Function] started at line 83 | -| generate_semantic_map.py | 🟢 100% | OK | -| search_script.py | 🟢 100% | OK | -| get_dataset_structure.py | 🟢 100% | OK | -| debug_db_api.py | 🟢 100% | OK | -| run_mapper.py | 🟢 100% | OK | -| migration_script.py | 🟢 100% | OK | -| backup_script.py | 🟢 100% | OK | -| superset_tool/exceptions.py | 🟢 100% | OK | -| superset_tool/__init__.py | 🟢 100% | OK | -| superset_tool/client.py | 🟢 100% | OK | -| superset_tool/models.py | 🟢 100% | OK | -| superset_tool/utils/logger.py | 🟢 100% | OK | -| superset_tool/utils/network.py | 🟢 100% | OK | -| superset_tool/utils/whiptail_fallback.py | 🟢 100% | OK | -| superset_tool/utils/dataset_mapper.py | 🟢 100% | OK | -| superset_tool/utils/__init__.py | 🟢 100% | OK | -| superset_tool/utils/init_clients.py | 🟢 100% | OK | -| superset_tool/utils/fileio.py | 🟢 100% | OK | -| backend/src/dependencies.py | 🟢 100% | OK | -| backend/src/app.py | 🟢 100% | OK | -| backend/src/models/mapping.py | 🟢 100% | OK | -| backend/src/models/dashboard.py | 🟢 100% | OK | -| backend/src/models/task.py | 🟢 100% | OK | -| backend/src/services/mapping_service.py | 🟢 100% | OK | -| backend/src/core/config_manager.py | 🟢 100% | OK | -| backend/src/core/superset_client.py | 🟢 100% | OK | -| backend/src/core/migration_engine.py | 🟢 100% | OK | -| backend/src/core/logger.py | 🟢 100% | OK | -| backend/src/core/database.py | 🟢 100% | OK | -| backend/src/core/config_models.py | 🟢 100% | OK | -| backend/src/core/scheduler.py | 🟢 100% | OK | -| backend/src/core/plugin_loader.py | 🟢 100% | OK | -| backend/src/core/plugin_base.py | 🟢 100% | OK | -| backend/src/core/utils/matching.py | 🟢 100% | OK | -| backend/src/core/task_manager/manager.py | 🟢 100% | OK | -| backend/src/core/task_manager/__init__.py | 🟢 100% | OK | -| backend/src/core/task_manager/cleanup.py | 🟢 100% | OK | -| backend/src/core/task_manager/models.py | 🟢 100% | OK | -| backend/src/core/task_manager/persistence.py | 🟢 100% | OK | -| backend/src/plugins/backup.py | 🟢 100% | OK | -| backend/src/plugins/migration.py | 🟢 100% | OK | -| backend/src/api/auth.py | 🟢 100% | OK | -| backend/src/api/routes/settings.py | 🟢 100% | OK | -| backend/src/api/routes/tasks.py | 🟢 100% | OK | -| backend/src/api/routes/environments.py | 🟢 100% | OK | -| backend/src/api/routes/plugins.py | 🟢 100% | OK | -| backend/src/api/routes/migration.py | 🟢 100% | OK | -| backend/src/api/routes/mappings.py | 🟢 100% | OK | diff --git a/semantics/reports/semantic_report_20260101_165607.md b/semantics/reports/semantic_report_20260101_165607.md deleted file mode 100644 index 7a8fd01..0000000 --- a/semantics/reports/semantic_report_20260101_165607.md +++ /dev/null @@ -1,79 +0,0 @@ -# Semantic Compliance Report - -**Generated At:** 2026-01-01T16:56:07.582450 -**Global Compliance Score:** 99.5% -**Scanned Files:** 70 - -## File Compliance Status -| File | Score | Issues | -|------|-------|--------| -| frontend/src/lib/toasts.js | 🟡 75% | [toasts_module] Unclosed Anchor at end of file (started line 1)
[toasts_module] Unclosed Anchor: [DEF:toasts_module:Module] started at line 1 | -| frontend/src/lib/stores.js | 🟡 89% | [stores_module] Unclosed Anchor at end of file (started line 1)
[stores_module] Unclosed Anchor: [DEF:stores_module:Module] started at line 1 | -| generate_semantic_map.py | 🟢 100% | OK | -| search_script.py | 🟢 100% | OK | -| get_dataset_structure.py | 🟢 100% | OK | -| debug_db_api.py | 🟢 100% | OK | -| run_mapper.py | 🟢 100% | OK | -| migration_script.py | 🟢 100% | OK | -| backup_script.py | 🟢 100% | OK | -| superset_tool/exceptions.py | 🟢 100% | OK | -| superset_tool/__init__.py | 🟢 100% | OK | -| superset_tool/client.py | 🟢 100% | OK | -| superset_tool/models.py | 🟢 100% | OK | -| superset_tool/utils/logger.py | 🟢 100% | OK | -| superset_tool/utils/network.py | 🟢 100% | OK | -| superset_tool/utils/whiptail_fallback.py | 🟢 100% | OK | -| superset_tool/utils/dataset_mapper.py | 🟢 100% | OK | -| superset_tool/utils/__init__.py | 🟢 100% | OK | -| superset_tool/utils/init_clients.py | 🟢 100% | OK | -| superset_tool/utils/fileio.py | 🟢 100% | OK | -| frontend/src/App.svelte | 🟢 100% | OK | -| frontend/src/main.js | 🟢 100% | OK | -| frontend/src/components/DashboardGrid.svelte | 🟢 100% | OK | -| frontend/src/components/TaskHistory.svelte | 🟢 100% | OK | -| frontend/src/components/MappingTable.svelte | 🟢 100% | OK | -| frontend/src/components/EnvSelector.svelte | 🟢 100% | OK | -| frontend/src/components/TaskList.svelte | 🟢 100% | OK | -| frontend/src/components/DynamicForm.svelte | 🟢 100% | OK | -| frontend/src/components/Footer.svelte | 🟢 100% | OK | -| frontend/src/components/Navbar.svelte | 🟢 100% | OK | -| frontend/src/components/TaskRunner.svelte | 🟢 100% | OK | -| frontend/src/components/TaskLogViewer.svelte | 🟢 100% | OK | -| frontend/src/components/PasswordPrompt.svelte | 🟢 100% | OK | -| frontend/src/components/MissingMappingModal.svelte | 🟢 100% | OK | -| frontend/src/components/Toast.svelte | 🟢 100% | OK | -| frontend/src/pages/Settings.svelte | 🟢 100% | OK | -| frontend/src/pages/Dashboard.svelte | 🟢 100% | OK | -| frontend/src/lib/api.js | 🟢 100% | OK | -| frontend/src/routes/migration/+page.svelte | 🟢 100% | OK | -| frontend/src/routes/migration/mappings/+page.svelte | 🟢 100% | OK | -| backend/src/dependencies.py | 🟢 100% | OK | -| backend/src/app.py | 🟢 100% | OK | -| backend/src/models/mapping.py | 🟢 100% | OK | -| backend/src/models/dashboard.py | 🟢 100% | OK | -| backend/src/models/task.py | 🟢 100% | OK | -| backend/src/services/mapping_service.py | 🟢 100% | OK | -| backend/src/core/config_manager.py | 🟢 100% | OK | -| backend/src/core/superset_client.py | 🟢 100% | OK | -| backend/src/core/migration_engine.py | 🟢 100% | OK | -| backend/src/core/logger.py | 🟢 100% | OK | -| backend/src/core/database.py | 🟢 100% | OK | -| backend/src/core/config_models.py | 🟢 100% | OK | -| backend/src/core/scheduler.py | 🟢 100% | OK | -| backend/src/core/plugin_loader.py | 🟢 100% | OK | -| backend/src/core/plugin_base.py | 🟢 100% | OK | -| backend/src/core/utils/matching.py | 🟢 100% | OK | -| backend/src/core/task_manager/manager.py | 🟢 100% | OK | -| backend/src/core/task_manager/__init__.py | 🟢 100% | OK | -| backend/src/core/task_manager/cleanup.py | 🟢 100% | OK | -| backend/src/core/task_manager/models.py | 🟢 100% | OK | -| backend/src/core/task_manager/persistence.py | 🟢 100% | OK | -| backend/src/plugins/backup.py | 🟢 100% | OK | -| backend/src/plugins/migration.py | 🟢 100% | OK | -| backend/src/api/auth.py | 🟢 100% | OK | -| backend/src/api/routes/settings.py | 🟢 100% | OK | -| backend/src/api/routes/tasks.py | 🟢 100% | OK | -| backend/src/api/routes/environments.py | 🟢 100% | OK | -| backend/src/api/routes/plugins.py | 🟢 100% | OK | -| backend/src/api/routes/migration.py | 🟢 100% | OK | -| backend/src/api/routes/mappings.py | 🟢 100% | OK | diff --git a/semantics/reports/semantic_report_20260101_165712.md b/semantics/reports/semantic_report_20260101_165712.md deleted file mode 100644 index c9a1c74..0000000 --- a/semantics/reports/semantic_report_20260101_165712.md +++ /dev/null @@ -1,79 +0,0 @@ -# Semantic Compliance Report - -**Generated At:** 2026-01-01T16:57:12.650889 -**Global Compliance Score:** 100.0% -**Scanned Files:** 70 - -## File Compliance Status -| File | Score | Issues | -|------|-------|--------| -| generate_semantic_map.py | 🟢 100% | OK | -| search_script.py | 🟢 100% | OK | -| get_dataset_structure.py | 🟢 100% | OK | -| debug_db_api.py | 🟢 100% | OK | -| run_mapper.py | 🟢 100% | OK | -| migration_script.py | 🟢 100% | OK | -| backup_script.py | 🟢 100% | OK | -| superset_tool/exceptions.py | 🟢 100% | OK | -| superset_tool/__init__.py | 🟢 100% | OK | -| superset_tool/client.py | 🟢 100% | OK | -| superset_tool/models.py | 🟢 100% | OK | -| superset_tool/utils/logger.py | 🟢 100% | OK | -| superset_tool/utils/network.py | 🟢 100% | OK | -| superset_tool/utils/whiptail_fallback.py | 🟢 100% | OK | -| superset_tool/utils/dataset_mapper.py | 🟢 100% | OK | -| superset_tool/utils/__init__.py | 🟢 100% | OK | -| superset_tool/utils/init_clients.py | 🟢 100% | OK | -| superset_tool/utils/fileio.py | 🟢 100% | OK | -| frontend/src/App.svelte | 🟢 100% | OK | -| frontend/src/main.js | 🟢 100% | OK | -| frontend/src/components/DashboardGrid.svelte | 🟢 100% | OK | -| frontend/src/components/TaskHistory.svelte | 🟢 100% | OK | -| frontend/src/components/MappingTable.svelte | 🟢 100% | OK | -| frontend/src/components/EnvSelector.svelte | 🟢 100% | OK | -| frontend/src/components/TaskList.svelte | 🟢 100% | OK | -| frontend/src/components/DynamicForm.svelte | 🟢 100% | OK | -| frontend/src/components/Footer.svelte | 🟢 100% | OK | -| frontend/src/components/Navbar.svelte | 🟢 100% | OK | -| frontend/src/components/TaskRunner.svelte | 🟢 100% | OK | -| frontend/src/components/TaskLogViewer.svelte | 🟢 100% | OK | -| frontend/src/components/PasswordPrompt.svelte | 🟢 100% | OK | -| frontend/src/components/MissingMappingModal.svelte | 🟢 100% | OK | -| frontend/src/components/Toast.svelte | 🟢 100% | OK | -| frontend/src/pages/Settings.svelte | 🟢 100% | OK | -| frontend/src/pages/Dashboard.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/migration/+page.svelte | 🟢 100% | OK | -| frontend/src/routes/migration/mappings/+page.svelte | 🟢 100% | OK | -| backend/src/dependencies.py | 🟢 100% | OK | -| backend/src/app.py | 🟢 100% | OK | -| backend/src/models/mapping.py | 🟢 100% | OK | -| backend/src/models/dashboard.py | 🟢 100% | OK | -| backend/src/models/task.py | 🟢 100% | OK | -| backend/src/services/mapping_service.py | 🟢 100% | OK | -| backend/src/core/config_manager.py | 🟢 100% | OK | -| backend/src/core/superset_client.py | 🟢 100% | OK | -| backend/src/core/migration_engine.py | 🟢 100% | OK | -| backend/src/core/logger.py | 🟢 100% | OK | -| backend/src/core/database.py | 🟢 100% | OK | -| backend/src/core/config_models.py | 🟢 100% | OK | -| backend/src/core/scheduler.py | 🟢 100% | OK | -| backend/src/core/plugin_loader.py | 🟢 100% | OK | -| backend/src/core/plugin_base.py | 🟢 100% | OK | -| backend/src/core/utils/matching.py | 🟢 100% | OK | -| backend/src/core/task_manager/manager.py | 🟢 100% | OK | -| backend/src/core/task_manager/__init__.py | 🟢 100% | OK | -| backend/src/core/task_manager/cleanup.py | 🟢 100% | OK | -| backend/src/core/task_manager/models.py | 🟢 100% | OK | -| backend/src/core/task_manager/persistence.py | 🟢 100% | OK | -| backend/src/plugins/backup.py | 🟢 100% | OK | -| backend/src/plugins/migration.py | 🟢 100% | OK | -| backend/src/api/auth.py | 🟢 100% | OK | -| backend/src/api/routes/settings.py | 🟢 100% | OK | -| backend/src/api/routes/tasks.py | 🟢 100% | OK | -| backend/src/api/routes/environments.py | 🟢 100% | OK | -| backend/src/api/routes/plugins.py | 🟢 100% | OK | -| backend/src/api/routes/migration.py | 🟢 100% | OK | -| backend/src/api/routes/mappings.py | 🟢 100% | OK | diff --git a/semantics/reports/semantic_report_20260112_211607.md b/semantics/reports/semantic_report_20260112_211607.md deleted file mode 100644 index 25b583e..0000000 --- a/semantics/reports/semantic_report_20260112_211607.md +++ /dev/null @@ -1,98 +0,0 @@ -# Semantic Compliance Report - -**Generated At:** 2026-01-12T21:16:07.922245 -**Global Compliance Score:** 90.4% -**Scanned Files:** 80 - -## Critical Parsing Errors -- 🔴 frontend/src/components/tools/ConnectionForm.svelte:99 Mismatched closing anchor. Expected [/DEF:handleSubmit:Function], found [/DEF:ConnectionForm:Component]. -- 🔴 frontend/src/components/tools/ConnectionList.svelte:82 Mismatched closing anchor. Expected [/DEF:handleDelete:Function], found [/DEF:ConnectionList:Component]. -- 🔴 frontend/src/components/tools/MapperTool.svelte:159 Mismatched closing anchor. Expected [/DEF:handleRunMapper:Function], found [/DEF:MapperTool:Component]. -- 🔴 frontend/src/components/tools/SearchTool.svelte:177 Mismatched closing anchor. Expected [/DEF:startPolling:Function], found [/DEF:SearchTool:Component]. -- 🔴 backend/src/api/routes/connections.py:76 Mismatched closing anchor. Expected [/DEF:delete_connection:Function], found [/DEF:ConnectionsRouter:Module]. -- 🔴 backend/src/plugins/debug.py:136 Mismatched closing anchor. Expected [/DEF:DebugPlugin._get_dataset_structure:Function], found [/DEF:DebugPlugin:Class]. -- 🔴 backend/src/plugins/debug.py:137 Mismatched closing anchor. Expected [/DEF:DebugPlugin._get_dataset_structure:Function], found [/DEF:DebugPluginModule:Module]. - -## File Compliance Status -| File | Score | Issues | -|------|-------|--------| -| frontend/.svelte-kit/output/server/entries/pages/migration/_page.svelte.js | 🔴 0% | [handleSort] Unclosed Anchor at end of file (started line 65)
[handleSort] Unclosed Anchor: [DEF:handleSort:Function] started at line 65
[handleSelectionChange] Unclosed Anchor at end of file (started line 68)
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 68
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 68
[handleSelectAll] Unclosed Anchor at end of file (started line 71)
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 71
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 71
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 71
[goToPage] Unclosed Anchor at end of file (started line 74)
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 74
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 74
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 74
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 74 | -| frontend/src/components/tools/ConnectionForm.svelte | 🔴 0% | [ConnectionForm] Unclosed Anchor at end of file (started line 1)
[ConnectionForm] Unclosed Anchor: [DEF:ConnectionForm:Component] started at line 1
[handleSubmit] Unclosed Anchor at end of file (started line 26)
[handleSubmit] Unclosed Anchor: [DEF:handleSubmit:Function] started at line 26
[handleSubmit] Unclosed Anchor: [DEF:handleSubmit:Function] started at line 26 | -| frontend/src/components/tools/ConnectionList.svelte | 🔴 0% | [ConnectionList] Unclosed Anchor at end of file (started line 1)
[ConnectionList] Unclosed Anchor: [DEF:ConnectionList:Component] started at line 1
[fetchConnections] Unclosed Anchor at end of file (started line 20)
[fetchConnections] Unclosed Anchor: [DEF:fetchConnections:Function] started at line 20
[fetchConnections] Unclosed Anchor: [DEF:fetchConnections:Function] started at line 20
[handleDelete] Unclosed Anchor at end of file (started line 33)
[handleDelete] Unclosed Anchor: [DEF:handleDelete:Function] started at line 33
[handleDelete] Unclosed Anchor: [DEF:handleDelete:Function] started at line 33
[handleDelete] Unclosed Anchor: [DEF:handleDelete:Function] started at line 33 | -| frontend/src/components/tools/MapperTool.svelte | 🔴 0% | [MapperTool] Unclosed Anchor at end of file (started line 1)
[MapperTool] Unclosed Anchor: [DEF:MapperTool:Component] started at line 1
[fetchData] Unclosed Anchor at end of file (started line 29)
[fetchData] Unclosed Anchor: [DEF:fetchData:Function] started at line 29
[fetchData] Unclosed Anchor: [DEF:fetchData:Function] started at line 29
[handleRunMapper] Unclosed Anchor at end of file (started line 41)
[handleRunMapper] Unclosed Anchor: [DEF:handleRunMapper:Function] started at line 41
[handleRunMapper] Unclosed Anchor: [DEF:handleRunMapper:Function] started at line 41
[handleRunMapper] Unclosed Anchor: [DEF:handleRunMapper:Function] started at line 41 | -| frontend/src/components/tools/DebugTool.svelte | 🔴 0% | [DebugTool] Unclosed Anchor at end of file (started line 1)
[DebugTool] Unclosed Anchor: [DEF:DebugTool:Component] started at line 1 | -| frontend/src/components/tools/SearchTool.svelte | 🔴 0% | [SearchTool] Unclosed Anchor at end of file (started line 1)
[SearchTool] Unclosed Anchor: [DEF:SearchTool:Component] started at line 1
[fetchEnvironments] Unclosed Anchor at end of file (started line 23)
[fetchEnvironments] Unclosed Anchor: [DEF:fetchEnvironments:Function] started at line 23
[fetchEnvironments] Unclosed Anchor: [DEF:fetchEnvironments:Function] started at line 23
[handleSearch] Unclosed Anchor at end of file (started line 34)
[handleSearch] Unclosed Anchor: [DEF:handleSearch:Function] started at line 34
[handleSearch] Unclosed Anchor: [DEF:handleSearch:Function] started at line 34
[handleSearch] Unclosed Anchor: [DEF:handleSearch:Function] started at line 34
[startPolling] Unclosed Anchor at end of file (started line 60)
[startPolling] Unclosed Anchor: [DEF:startPolling:Function] started at line 60
[startPolling] Unclosed Anchor: [DEF:startPolling:Function] started at line 60
[startPolling] Unclosed Anchor: [DEF:startPolling:Function] started at line 60
[startPolling] Unclosed Anchor: [DEF:startPolling:Function] started at line 60 | -| backend/src/api/routes/connections.py | 🔴 0% | [ConnectionsRouter] Unclosed Anchor at end of file (started line 1)
[ConnectionsRouter] Unclosed Anchor: [DEF:ConnectionsRouter:Module] started at line 1
[ConnectionSchema] Unclosed Anchor at end of file (started line 21)
[ConnectionSchema] Unclosed Anchor: [DEF:ConnectionSchema:Class] started at line 21
[ConnectionSchema] Missing Mandatory Tag: @PURPOSE
[ConnectionSchema] Unclosed Anchor: [DEF:ConnectionSchema:Class] started at line 21
[ConnectionSchema] Missing Mandatory Tag: @PURPOSE
[ConnectionCreate] Unclosed Anchor at end of file (started line 35)
[ConnectionCreate] Unclosed Anchor: [DEF:ConnectionCreate:Class] started at line 35
[ConnectionCreate] Missing Mandatory Tag: @PURPOSE
[ConnectionCreate] Unclosed Anchor: [DEF:ConnectionCreate:Class] started at line 35
[ConnectionCreate] Missing Mandatory Tag: @PURPOSE
[ConnectionCreate] Unclosed Anchor: [DEF:ConnectionCreate:Class] started at line 35
[ConnectionCreate] Missing Mandatory Tag: @PURPOSE
[list_connections] Unclosed Anchor at end of file (started line 45)
[list_connections] Unclosed Anchor: [DEF:list_connections:Function] started at line 45
[list_connections] Missing Mandatory Tag: @PURPOSE
[list_connections] Unclosed Anchor: [DEF:list_connections:Function] started at line 45
[list_connections] Missing Mandatory Tag: @PURPOSE
[list_connections] Unclosed Anchor: [DEF:list_connections:Function] started at line 45
[list_connections] Missing Mandatory Tag: @PURPOSE
[list_connections] Unclosed Anchor: [DEF:list_connections:Function] started at line 45
[list_connections] Missing Mandatory Tag: @PURPOSE
[create_connection] Unclosed Anchor at end of file (started line 52)
[create_connection] Unclosed Anchor: [DEF:create_connection:Function] started at line 52
[create_connection] Missing Mandatory Tag: @PURPOSE
[create_connection] Unclosed Anchor: [DEF:create_connection:Function] started at line 52
[create_connection] Missing Mandatory Tag: @PURPOSE
[create_connection] Unclosed Anchor: [DEF:create_connection:Function] started at line 52
[create_connection] Missing Mandatory Tag: @PURPOSE
[create_connection] Unclosed Anchor: [DEF:create_connection:Function] started at line 52
[create_connection] Missing Mandatory Tag: @PURPOSE
[create_connection] Unclosed Anchor: [DEF:create_connection:Function] started at line 52
[create_connection] Missing Mandatory Tag: @PURPOSE
[delete_connection] Unclosed Anchor at end of file (started line 63)
[delete_connection] Unclosed Anchor: [DEF:delete_connection:Function] started at line 63
[delete_connection] Missing Mandatory Tag: @PURPOSE
[delete_connection] Unclosed Anchor: [DEF:delete_connection:Function] started at line 63
[delete_connection] Missing Mandatory Tag: @PURPOSE
[delete_connection] Unclosed Anchor: [DEF:delete_connection:Function] started at line 63
[delete_connection] Missing Mandatory Tag: @PURPOSE
[delete_connection] Unclosed Anchor: [DEF:delete_connection:Function] started at line 63
[delete_connection] Missing Mandatory Tag: @PURPOSE
[delete_connection] Unclosed Anchor: [DEF:delete_connection:Function] started at line 63
[delete_connection] Missing Mandatory Tag: @PURPOSE
[delete_connection] Unclosed Anchor: [DEF:delete_connection:Function] started at line 63
[delete_connection] Missing Mandatory Tag: @PURPOSE | -| backend/src/plugins/debug.py | 🔴 33% | [DebugPluginModule] Unclosed Anchor at end of file (started line 1)
[DebugPluginModule] Unclosed Anchor: [DEF:DebugPluginModule:Module] started at line 1
[DebugPlugin] Unclosed Anchor at end of file (started line 15)
[DebugPlugin] Unclosed Anchor: [DEF:DebugPlugin:Class] started at line 15
[DebugPlugin] Unclosed Anchor: [DEF:DebugPlugin:Class] started at line 15
[DebugPlugin._test_db_api] Unclosed Anchor at end of file (started line 89)
[DebugPlugin._test_db_api] Unclosed Anchor: [DEF:DebugPlugin._test_db_api:Function] started at line 89
[DebugPlugin._test_db_api] Missing Mandatory Tag: @PURPOSE
[DebugPlugin._test_db_api] Unclosed Anchor: [DEF:DebugPlugin._test_db_api:Function] started at line 89
[DebugPlugin._test_db_api] Missing Mandatory Tag: @PURPOSE
[DebugPlugin._test_db_api] Unclosed Anchor: [DEF:DebugPlugin._test_db_api:Function] started at line 89
[DebugPlugin._test_db_api] Missing Mandatory Tag: @PURPOSE
[DebugPlugin._get_dataset_structure] Unclosed Anchor at end of file (started line 116)
[DebugPlugin._get_dataset_structure] Unclosed Anchor: [DEF:DebugPlugin._get_dataset_structure:Function] started at line 116
[DebugPlugin._get_dataset_structure] Missing Mandatory Tag: @PURPOSE
[DebugPlugin._get_dataset_structure] Unclosed Anchor: [DEF:DebugPlugin._get_dataset_structure:Function] started at line 116
[DebugPlugin._get_dataset_structure] Missing Mandatory Tag: @PURPOSE
[DebugPlugin._get_dataset_structure] Unclosed Anchor: [DEF:DebugPlugin._get_dataset_structure:Function] started at line 116
[DebugPlugin._get_dataset_structure] Missing Mandatory Tag: @PURPOSE
[DebugPlugin._get_dataset_structure] Unclosed Anchor: [DEF:DebugPlugin._get_dataset_structure:Function] started at line 116
[DebugPlugin._get_dataset_structure] Missing Mandatory Tag: @PURPOSE | -| generate_semantic_map.py | 🟢 100% | OK | -| migration_script.py | 🟢 100% | OK | -| superset_tool/exceptions.py | 🟢 100% | OK | -| superset_tool/models.py | 🟢 100% | OK | -| superset_tool/client.py | 🟢 100% | OK | -| superset_tool/__init__.py | 🟢 100% | OK | -| superset_tool/utils/init_clients.py | 🟢 100% | OK | -| superset_tool/utils/logger.py | 🟢 100% | OK | -| superset_tool/utils/fileio.py | 🟢 100% | OK | -| superset_tool/utils/network.py | 🟢 100% | OK | -| superset_tool/utils/whiptail_fallback.py | 🟢 100% | OK | -| superset_tool/utils/dataset_mapper.py | 🟢 100% | OK | -| superset_tool/utils/__init__.py | 🟢 100% | OK | -| 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/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/connections/+page.svelte | 🟢 100% | OK | -| frontend/src/pages/Dashboard.svelte | 🟢 100% | OK | -| frontend/src/pages/Settings.svelte | 🟢 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 | -| backend/src/app.py | 🟢 100% | OK | -| backend/src/dependencies.py | 🟢 100% | OK | -| backend/src/core/superset_client.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/logger.py | 🟢 100% | OK | -| backend/src/core/plugin_loader.py | 🟢 100% | OK | -| backend/src/core/migration_engine.py | 🟢 100% | OK | -| backend/src/core/plugin_base.py | 🟢 100% | OK | -| backend/src/core/utils/matching.py | 🟢 100% | OK | -| 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% | OK | -| backend/src/core/task_manager/cleanup.py | 🟢 100% | OK | -| backend/src/core/task_manager/__init__.py | 🟢 100% | OK | -| backend/src/api/auth.py | 🟢 100% | OK | -| backend/src/api/routes/environments.py | 🟢 100% | OK | -| backend/src/api/routes/migration.py | 🟢 100% | OK | -| 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/search.py | 🟢 100% | OK | -| backend/src/plugins/mapper.py | 🟢 100% | OK | -| backend/src/plugins/migration.py | 🟢 100% | OK | diff --git a/semantics/reports/semantic_report_20260112_211857.md b/semantics/reports/semantic_report_20260112_211857.md deleted file mode 100644 index f756089..0000000 --- a/semantics/reports/semantic_report_20260112_211857.md +++ /dev/null @@ -1,89 +0,0 @@ -# Semantic Compliance Report - -**Generated At:** 2026-01-12T21:18:57.549358 -**Global Compliance Score:** 96.8% -**Scanned Files:** 80 - -## File Compliance Status -| File | Score | Issues | -|------|-------|--------| -| frontend/.svelte-kit/output/server/entries/pages/migration/_page.svelte.js | 🔴 0% | [handleSort] Unclosed Anchor at end of file (started line 65)
[handleSort] Unclosed Anchor: [DEF:handleSort:Function] started at line 65
[handleSelectionChange] Unclosed Anchor at end of file (started line 68)
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 68
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 68
[handleSelectAll] Unclosed Anchor at end of file (started line 71)
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 71
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 71
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 71
[goToPage] Unclosed Anchor at end of file (started line 74)
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 74
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 74
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 74
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 74 | -| frontend/src/components/tools/DebugTool.svelte | 🔴 0% | [DebugTool] Unclosed Anchor at end of file (started line 1)
[DebugTool] Unclosed Anchor: [DEF:DebugTool:Component] started at line 1 | -| backend/src/api/routes/connections.py | 🟡 58% | [ConnectionSchema] Missing Mandatory Tag: @PURPOSE
[ConnectionSchema] Missing Mandatory Tag: @PURPOSE
[ConnectionCreate] Missing Mandatory Tag: @PURPOSE
[ConnectionCreate] Missing Mandatory Tag: @PURPOSE
[list_connections] Missing Mandatory Tag: @PURPOSE
[list_connections] Missing Mandatory Tag: @PURPOSE
[create_connection] Missing Mandatory Tag: @PURPOSE
[create_connection] Missing Mandatory Tag: @PURPOSE
[delete_connection] Missing Mandatory Tag: @PURPOSE
[delete_connection] Missing Mandatory Tag: @PURPOSE | -| backend/src/plugins/debug.py | 🟡 83% | [DebugPlugin._test_db_api] Missing Mandatory Tag: @PURPOSE
[DebugPlugin._test_db_api] Missing Mandatory Tag: @PURPOSE
[DebugPlugin._test_db_api] Missing Mandatory Tag: @PURPOSE
[DebugPlugin._get_dataset_structure] Missing Mandatory Tag: @PURPOSE
[DebugPlugin._get_dataset_structure] Missing Mandatory Tag: @PURPOSE
[DebugPlugin._get_dataset_structure] Missing Mandatory Tag: @PURPOSE | -| generate_semantic_map.py | 🟢 100% | OK | -| migration_script.py | 🟢 100% | OK | -| superset_tool/exceptions.py | 🟢 100% | OK | -| superset_tool/models.py | 🟢 100% | OK | -| superset_tool/client.py | 🟢 100% | OK | -| superset_tool/__init__.py | 🟢 100% | OK | -| superset_tool/utils/init_clients.py | 🟢 100% | OK | -| superset_tool/utils/logger.py | 🟢 100% | OK | -| superset_tool/utils/fileio.py | 🟢 100% | OK | -| superset_tool/utils/network.py | 🟢 100% | OK | -| superset_tool/utils/whiptail_fallback.py | 🟢 100% | OK | -| superset_tool/utils/dataset_mapper.py | 🟢 100% | OK | -| superset_tool/utils/__init__.py | 🟢 100% | OK | -| 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/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/connections/+page.svelte | 🟢 100% | OK | -| frontend/src/pages/Dashboard.svelte | 🟢 100% | OK | -| frontend/src/pages/Settings.svelte | 🟢 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/SearchTool.svelte | 🟢 100% | OK | -| backend/src/app.py | 🟢 100% | OK | -| backend/src/dependencies.py | 🟢 100% | OK | -| backend/src/core/superset_client.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/logger.py | 🟢 100% | OK | -| backend/src/core/plugin_loader.py | 🟢 100% | OK | -| backend/src/core/migration_engine.py | 🟢 100% | OK | -| backend/src/core/plugin_base.py | 🟢 100% | OK | -| backend/src/core/utils/matching.py | 🟢 100% | OK | -| 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% | OK | -| backend/src/core/task_manager/cleanup.py | 🟢 100% | OK | -| backend/src/core/task_manager/__init__.py | 🟢 100% | OK | -| backend/src/api/auth.py | 🟢 100% | OK | -| backend/src/api/routes/environments.py | 🟢 100% | OK | -| backend/src/api/routes/migration.py | 🟢 100% | OK | -| 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/search.py | 🟢 100% | OK | -| backend/src/plugins/mapper.py | 🟢 100% | OK | -| backend/src/plugins/migration.py | 🟢 100% | OK | diff --git a/semantics/reports/semantic_report_20260113_090204.md b/semantics/reports/semantic_report_20260113_090204.md deleted file mode 100644 index b3cdda2..0000000 --- a/semantics/reports/semantic_report_20260113_090204.md +++ /dev/null @@ -1,89 +0,0 @@ -# Semantic Compliance Report - -**Generated At:** 2026-01-13T09:02:04.771961 -**Global Compliance Score:** 98.8% -**Scanned Files:** 80 - -## File Compliance Status -| File | Score | Issues | -|------|-------|--------| -| frontend/.svelte-kit/output/server/entries/pages/migration/_page.svelte.js | 🔴 0% | [handleSort] Unclosed Anchor at end of file (started line 65)
[handleSort] Unclosed Anchor: [DEF:handleSort:Function] started at line 65
[handleSelectionChange] Unclosed Anchor at end of file (started line 68)
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 68
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 68
[handleSelectAll] Unclosed Anchor at end of file (started line 71)
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 71
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 71
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 71
[goToPage] Unclosed Anchor at end of file (started line 74)
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 74
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 74
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 74
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 74 | -| generate_semantic_map.py | 🟢 100% | OK | -| migration_script.py | 🟢 100% | OK | -| superset_tool/exceptions.py | 🟢 100% | OK | -| superset_tool/models.py | 🟢 100% | OK | -| superset_tool/client.py | 🟢 100% | OK | -| superset_tool/__init__.py | 🟢 100% | OK | -| superset_tool/utils/init_clients.py | 🟢 100% | OK | -| superset_tool/utils/logger.py | 🟢 100% | OK | -| superset_tool/utils/fileio.py | 🟢 100% | OK | -| superset_tool/utils/network.py | 🟢 100% | OK | -| superset_tool/utils/whiptail_fallback.py | 🟢 100% | OK | -| superset_tool/utils/dataset_mapper.py | 🟢 100% | OK | -| superset_tool/utils/__init__.py | 🟢 100% | OK | -| 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/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/connections/+page.svelte | 🟢 100% | OK | -| frontend/src/pages/Dashboard.svelte | 🟢 100% | OK | -| frontend/src/pages/Settings.svelte | 🟢 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/superset_client.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/logger.py | 🟢 100% | OK | -| backend/src/core/plugin_loader.py | 🟢 100% | OK | -| backend/src/core/migration_engine.py | 🟢 100% | OK | -| backend/src/core/plugin_base.py | 🟢 100% | OK | -| backend/src/core/utils/matching.py | 🟢 100% | OK | -| 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% | OK | -| backend/src/core/task_manager/cleanup.py | 🟢 100% | OK | -| backend/src/core/task_manager/__init__.py | 🟢 100% | OK | -| backend/src/api/auth.py | 🟢 100% | OK | -| backend/src/api/routes/connections.py | 🟢 100% | OK | -| backend/src/api/routes/environments.py | 🟢 100% | OK | -| backend/src/api/routes/migration.py | 🟢 100% | OK | -| 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 | diff --git a/semantics/reports/semantic_report_20260113_090858.md b/semantics/reports/semantic_report_20260113_090858.md deleted file mode 100644 index 652f64d..0000000 --- a/semantics/reports/semantic_report_20260113_090858.md +++ /dev/null @@ -1,89 +0,0 @@ -# Semantic Compliance Report - -**Generated At:** 2026-01-13T09:08:58.209356 -**Global Compliance Score:** 98.8% -**Scanned Files:** 80 - -## File Compliance Status -| File | Score | Issues | -|------|-------|--------| -| frontend/.svelte-kit/output/server/entries/pages/migration/_page.svelte.js | 🔴 0% | [handleSort] Unclosed Anchor at end of file (started line 65)
[handleSort] Unclosed Anchor: [DEF:handleSort:Function] started at line 65
[handleSelectionChange] Unclosed Anchor at end of file (started line 68)
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 68
[handleSelectionChange] Unclosed Anchor: [DEF:handleSelectionChange:Function] started at line 68
[handleSelectAll] Unclosed Anchor at end of file (started line 71)
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 71
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 71
[handleSelectAll] Unclosed Anchor: [DEF:handleSelectAll:Function] started at line 71
[goToPage] Unclosed Anchor at end of file (started line 74)
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 74
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 74
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 74
[goToPage] Unclosed Anchor: [DEF:goToPage:Function] started at line 74 | -| generate_semantic_map.py | 🟢 100% | OK | -| migration_script.py | 🟢 100% | OK | -| superset_tool/exceptions.py | 🟢 100% | OK | -| superset_tool/models.py | 🟢 100% | OK | -| superset_tool/client.py | 🟢 100% | OK | -| superset_tool/__init__.py | 🟢 100% | OK | -| superset_tool/utils/init_clients.py | 🟢 100% | OK | -| superset_tool/utils/logger.py | 🟢 100% | OK | -| superset_tool/utils/fileio.py | 🟢 100% | OK | -| superset_tool/utils/network.py | 🟢 100% | OK | -| superset_tool/utils/whiptail_fallback.py | 🟢 100% | OK | -| superset_tool/utils/dataset_mapper.py | 🟢 100% | OK | -| superset_tool/utils/__init__.py | 🟢 100% | OK | -| 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/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/connections/+page.svelte | 🟢 100% | OK | -| frontend/src/pages/Dashboard.svelte | 🟢 100% | OK | -| frontend/src/pages/Settings.svelte | 🟢 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/superset_client.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/logger.py | 🟢 100% | OK | -| backend/src/core/plugin_loader.py | 🟢 100% | OK | -| backend/src/core/migration_engine.py | 🟢 100% | OK | -| backend/src/core/plugin_base.py | 🟢 100% | OK | -| backend/src/core/utils/matching.py | 🟢 100% | OK | -| 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% | OK | -| backend/src/core/task_manager/cleanup.py | 🟢 100% | OK | -| backend/src/core/task_manager/__init__.py | 🟢 100% | OK | -| backend/src/api/auth.py | 🟢 100% | OK | -| backend/src/api/routes/connections.py | 🟢 100% | OK | -| backend/src/api/routes/environments.py | 🟢 100% | OK | -| backend/src/api/routes/migration.py | 🟢 100% | OK | -| 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 | diff --git a/semantics/reports/semantic_report_20260116_143730.md b/semantics/reports/semantic_report_20260116_143730.md new file mode 100644 index 0000000..673f150 --- /dev/null +++ b/semantics/reports/semantic_report_20260116_143730.md @@ -0,0 +1,101 @@ +# Semantic Compliance Report + +**Generated At:** 2026-01-16T14:37:30.272533 +**Global Compliance Score:** 100.0% +**Scanned Files:** 89 + +## Critical Parsing Errors +- 🔴 superset_tool/utils/logger.py:149 Function 'belief_scope' implementation found without matching [DEF:belief_scope:Function] contract. + +## File Compliance Status +| File | Score | Issues | +|------|-------|--------| +| 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. | +| migration_script.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.
[run] Missing Belief State Logging: Function should use belief_scope context manager.
[run] Missing Belief State Logging: Function should use belief_scope context manager.
[run] Missing Belief State Logging: Function should use belief_scope context manager.
[ask_delete_on_failure] Missing Belief State Logging: Function should use belief_scope context manager.
[ask_delete_on_failure] Missing Belief State Logging: Function should use belief_scope context manager.
[ask_delete_on_failure] Missing Belief State Logging: Function should use belief_scope context manager.
[select_environments] Missing Belief State Logging: Function should use belief_scope context manager.
[select_environments] Missing Belief State Logging: Function should use belief_scope context manager.
[select_environments] Missing Belief State Logging: Function should use belief_scope context manager.
[select_dashboards] Missing Belief State Logging: Function should use belief_scope context manager.
[select_dashboards] Missing Belief State Logging: Function should use belief_scope context manager.
[select_dashboards] Missing Belief State Logging: Function should use belief_scope context manager.
[confirm_db_config_replacement] Missing Belief State Logging: Function should use belief_scope context manager.
[confirm_db_config_replacement] Missing Belief State Logging: Function should use belief_scope context manager.
[confirm_db_config_replacement] Missing Belief State Logging: Function should use belief_scope context manager.
[_select_databases] Missing Belief State Logging: Function should use belief_scope context manager.
[_select_databases] Missing Belief State Logging: Function should use belief_scope context manager.
[_select_databases] Missing Belief State Logging: Function should use belief_scope context manager.
[_batch_delete_by_ids] Missing Belief State Logging: Function should use belief_scope context manager.
[_batch_delete_by_ids] Missing Belief State Logging: Function should use belief_scope context manager.
[_batch_delete_by_ids] 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.
[execute_migration] Missing Belief State Logging: Function should use belief_scope context manager. | +| superset_tool/exceptions.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.
[__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.
[__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.
[__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.
[__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.
[__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.
[__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.
[__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.
[__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. | +| superset_tool/models.py | 🟢 100% | [validate_auth] Missing Belief State Logging: Function should use belief_scope context manager.
[validate_auth] Missing Belief State Logging: Function should use belief_scope context manager.
[validate_auth] Missing Belief State Logging: Function should use belief_scope context manager.
[normalize_base_url] Missing Belief State Logging: Function should use belief_scope context manager.
[normalize_base_url] Missing Belief State Logging: Function should use belief_scope context manager.
[normalize_base_url] Missing Belief State Logging: Function should use belief_scope context manager.
[validate_config] Missing Belief State Logging: Function should use belief_scope context manager.
[validate_config] Missing Belief State Logging: Function should use belief_scope context manager.
[validate_config] Missing Belief State Logging: Function should use belief_scope context manager. | +| superset_tool/client.py | 🟢 100% | OK | +| superset_tool/__init__.py | 🟢 100% | OK | +| superset_tool/utils/init_clients.py | 🟢 100% | [setup_clients] Missing Belief State Logging: Function should use belief_scope context manager.
[setup_clients] Missing Belief State Logging: Function should use belief_scope context manager. | +| superset_tool/utils/logger.py | 🟢 100% | [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. | +| superset_tool/utils/fileio.py | 🟢 100% | OK | +| superset_tool/utils/network.py | 🟢 100% | OK | +| superset_tool/utils/whiptail_fallback.py | 🟢 100% | OK | +| superset_tool/utils/dataset_mapper.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.
[get_postgres_comments] Missing Belief State Logging: Function should use belief_scope context manager.
[get_postgres_comments] Missing Belief State Logging: Function should use belief_scope context manager.
[get_postgres_comments] Missing Belief State Logging: Function should use belief_scope context manager.
[load_excel_mappings] Missing Belief State Logging: Function should use belief_scope context manager.
[load_excel_mappings] Missing Belief State Logging: Function should use belief_scope context manager.
[load_excel_mappings] Missing Belief State Logging: Function should use belief_scope context manager.
[run_mapping] Missing Belief State Logging: Function should use belief_scope context manager.
[run_mapping] Missing Belief State Logging: Function should use belief_scope context manager.
[run_mapping] Missing Belief State Logging: Function should use belief_scope context manager. | +| superset_tool/utils/__init__.py | 🟢 100% | OK | +| 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/superset_client.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/logger.py | 🟢 100% | [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. | +| 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_models.py | 🟢 100% | OK | +| backend/tests/test_logger.py | 🟢 100% | OK | diff --git a/semantics/semantic_map.json b/semantics/semantic_map.json index 4607607..ed22310 100644 --- a/semantics/semantic_map.json +++ b/semantics/semantic_map.json @@ -1,12 +1,12 @@ { "project_root": ".", - "generated_at": "2026-01-13T17:32:50.390430", + "generated_at": "2026-01-16T14:37:30.265701", "modules": [ { "name": "generate_semantic_map", "type": "Module", "start_line": 1, - "end_line": 576, + "end_line": 613, "tags": { "SEMANTICS": "semantic_analysis, parser, map_generator, compliance_checker", "PURPOSE": "Scans the codebase to generate a Semantic Map and Compliance Report based on the System Standard.", @@ -31,11 +31,71 @@ } ], "children": [ + { + "name": "__init__", + "type": "Function", + "start_line": 21, + "end_line": 27, + "tags": { + "PURPOSE": "Mock init.", + "PRE": "name is a string.", + "POST": "Instance initialized." + }, + "relations": [], + "children": [], + "compliance": { + "valid": false, + "issues": [ + "Missing Belief State Logging: Function should use belief_scope context manager.", + "Missing Belief State Logging: Function should use belief_scope context manager." + ] + } + }, + { + "name": "__enter__", + "type": "Function", + "start_line": 29, + "end_line": 35, + "tags": { + "PURPOSE": "Mock enter.", + "PRE": "Instance initialized.", + "POST": "Returns self." + }, + "relations": [], + "children": [], + "compliance": { + "valid": false, + "issues": [ + "Missing Belief State Logging: Function should use belief_scope context manager.", + "Missing Belief State Logging: Function should use belief_scope context manager." + ] + } + }, + { + "name": "__exit__", + "type": "Function", + "start_line": 37, + "end_line": 43, + "tags": { + "PURPOSE": "Mock exit.", + "PRE": "Context entered.", + "POST": "Context exited." + }, + "relations": [], + "children": [], + "compliance": { + "valid": false, + "issues": [ + "Missing Belief State Logging: Function should use belief_scope context manager.", + "Missing Belief State Logging: Function should use belief_scope context manager." + ] + } + }, { "name": "SemanticEntity", "type": "Class", - "start_line": 47, - "end_line": 147, + "start_line": 67, + "end_line": 167, "tags": { "PURPOSE": "Represents a code entity (Module, Function, Component) found during parsing.", "INVARIANT": "start_line is always set; end_line is set upon closure." @@ -45,8 +105,8 @@ { "name": "__init__", "type": "Function", - "start_line": 51, - "end_line": 67, + "start_line": 71, + "end_line": 87, "tags": { "PURPOSE": "Initializes a new SemanticEntity instance.", "PRE": "name, type_, start_line, file_path are provided.", @@ -62,8 +122,8 @@ { "name": "to_dict", "type": "Function", - "start_line": 69, - "end_line": 89, + "start_line": 89, + "end_line": 109, "tags": { "PURPOSE": "Serializes the entity to a dictionary for JSON output.", "PRE": "Entity is fully populated.", @@ -80,8 +140,8 @@ { "name": "validate", "type": "Function", - "start_line": 91, - "end_line": 120, + "start_line": 111, + "end_line": 140, "tags": { "PURPOSE": "Checks for semantic compliance (closure, mandatory tags, belief state).", "PRE": "Entity structure is complete.", @@ -97,8 +157,8 @@ { "name": "get_score", "type": "Function", - "start_line": 122, - "end_line": 146, + "start_line": 142, + "end_line": 166, "tags": { "PURPOSE": "Calculates a compliance score (0.0 to 1.0).", "PRE": "validate() has been called.", @@ -121,8 +181,8 @@ { "name": "get_patterns", "type": "Function", - "start_line": 150, - "end_line": 178, + "start_line": 170, + "end_line": 198, "tags": { "PURPOSE": "Returns regex patterns for a specific language.", "PRE": "lang is either 'python' or 'svelte_js'.", @@ -140,32 +200,27 @@ { "name": "parse_file", "type": "Function", - "start_line": 181, - "end_line": 301, + "start_line": 201, + "end_line": 324, "tags": { "PURPOSE": "Parses a single file to extract semantic entities.", + "PRE": "full_path, rel_path, lang are valid strings.", + "POST": "Returns extracted entities and list of issues.", "PARAM": "lang - Language identifier.", "RETURN": "Tuple[List[SemanticEntity], List[str]] - Entities found and global issues." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "SemanticMapGenerator", "type": "Class", - "start_line": 304, - "end_line": 570, + "start_line": 327, + "end_line": 607, "tags": { "PURPOSE": "Orchestrates the mapping process." }, @@ -174,8 +229,8 @@ { "name": "__init__", "type": "Function", - "start_line": 307, - "end_line": 317, + "start_line": 330, + "end_line": 341, "tags": { "PURPOSE": "Initializes the generator with a root directory.", "PRE": "root_dir is a valid path string.", @@ -184,45 +239,33 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "_load_gitignore", "type": "Function", - "start_line": 319, - "end_line": 332, + "start_line": 343, + "end_line": 359, "tags": { "PURPOSE": "Loads patterns from .gitignore file.", + "PRE": ".gitignore exists in root_dir.", + "POST": "Returns set of ignore patterns.", "RETURN": "Set of patterns to ignore." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "_is_ignored", "type": "Function", - "start_line": 334, - "end_line": 374, + "start_line": 361, + "end_line": 402, "tags": { "PURPOSE": "Checks if a path should be ignored based on .gitignore or hardcoded defaults.", "PRE": "rel_path is a valid relative path string.", @@ -233,19 +276,15 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "run", "type": "Function", - "start_line": 376, - "end_line": 387, + "start_line": 404, + "end_line": 416, "tags": { "PURPOSE": "Main execution flow.", "PRE": "Generator is initialized.", @@ -263,19 +302,15 @@ ], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "_walk_and_parse", "type": "Function", - "start_line": 389, - "end_line": 417, + "start_line": 418, + "end_line": 447, "tags": { "PURPOSE": "Recursively walks directories and triggers parsing.", "PRE": "root_dir exists.", @@ -284,19 +319,15 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "_process_file_results", "type": "Function", - "start_line": 419, - "end_line": 444, + "start_line": 449, + "end_line": 476, "tags": { "PURPOSE": "Validates entities and calculates file scores.", "PRE": "Entities have been parsed from the file.", @@ -307,8 +338,8 @@ { "name": "validate_recursive", "type": "Function", - "start_line": 427, - "end_line": 438, + "start_line": 458, + "end_line": 470, "tags": { "PURPOSE": "Recursively validates a list of entities.", "PRE": "ent_list is a list of SemanticEntity objects.", @@ -317,30 +348,21 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } } ], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "_generate_artifacts", "type": "Function", - "start_line": 446, - "end_line": 468, + "start_line": 478, + "end_line": 501, "tags": { "PURPOSE": "Writes output files.", "PRE": "Parsing and validation are complete.", @@ -349,19 +371,15 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "_generate_report", "type": "Function", - "start_line": 470, - "end_line": 509, + "start_line": 503, + "end_line": 543, "tags": { "PURPOSE": "Generates the Markdown compliance report.", "PRE": "File scores and issues are available.", @@ -370,19 +388,15 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "_collect_issues", "type": "Function", - "start_line": 511, - "end_line": 520, + "start_line": 545, + "end_line": 555, "tags": { "PURPOSE": "Helper to collect issues for a specific file from the entity tree.", "PRE": "entities list and file_path are valid.", @@ -391,19 +405,15 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "_generate_compressed_map", "type": "Function", - "start_line": 522, - "end_line": 537, + "start_line": 557, + "end_line": 573, "tags": { "PURPOSE": "Generates the token-optimized project map.", "PRE": "Entities have been processed.", @@ -412,19 +422,15 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "_write_entity_md", "type": "Function", - "start_line": 539, - "end_line": 568, + "start_line": 575, + "end_line": 605, "tags": { "PURPOSE": "Recursive helper to write entity tree to Markdown.", "PRE": "f is an open file handle, entity is valid.", @@ -433,12 +439,8 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } } ], @@ -457,7 +459,7 @@ "name": "migration_script", "type": "Module", "start_line": 1, - "end_line": 402, + "end_line": 413, "tags": { "SEMANTICS": "migration, cli, superset, ui, logging, error-recovery, batch-delete", "PURPOSE": "\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 CLI \u0434\u043b\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432 Superset \u043c\u0435\u0436\u0434\u0443 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u043e\u0448\u0438\u0431\u043e\u043a.", @@ -479,7 +481,7 @@ "name": "Migration", "type": "Class", "start_line": 25, - "end_line": 397, + "end_line": 408, "tags": { "PURPOSE": "\u0418\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u043b\u043e\u0433\u0438\u043a\u0443 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u00ab\u0443\u0434\u0430\u043b\u0438\u0442\u044c\u2011\u0438\u2011\u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c\u00bb \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0430." }, @@ -519,7 +521,7 @@ "name": "run", "type": "Function", "start_line": 53, - "end_line": 70, + "end_line": 71, "tags": { "PURPOSE": "\u0422\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u2013 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u0441\u0435\u0445 \u0448\u0430\u0433\u043e\u0432 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438.", "PRE": "\u041b\u043e\u0433\u0433\u0435\u0440 \u0433\u043e\u0442\u043e\u0432.", @@ -560,10 +562,11 @@ { "name": "ask_delete_on_failure", "type": "Function", - "start_line": 72, - "end_line": 85, + "start_line": 73, + "end_line": 88, "tags": { "PURPOSE": "\u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0434\u0430\u0448\u0431\u043e\u0440\u0434 \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0430.", + "PRE": "None.", "POST": "`self.enable_delete_on_failure` \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d." }, "relations": [ @@ -576,11 +579,8 @@ "compliance": { "valid": false, "issues": [ - "Missing Mandatory Tag: @PRE", "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", "Missing Belief State Logging: Function should use belief_scope context manager." ] } @@ -588,8 +588,8 @@ { "name": "select_environments", "type": "Function", - "start_line": 87, - "end_line": 126, + "start_line": 90, + "end_line": 130, "tags": { "PURPOSE": "\u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f Superset.", "PRE": "`setup_clients` \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u044b.", @@ -618,8 +618,8 @@ { "name": "select_dashboards", "type": "Function", - "start_line": 128, - "end_line": 183, + "start_line": 132, + "end_line": 188, "tags": { "PURPOSE": "\u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432 \u0434\u043b\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438.", "PRE": "`self.from_c` \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d.", @@ -648,10 +648,11 @@ { "name": "confirm_db_config_replacement", "type": "Function", - "start_line": 185, - "end_line": 218, + "start_line": 190, + "end_line": 225, "tags": { "PURPOSE": "\u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043b\u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u043c\u0435\u043d\u0430 \u0411\u0414 \u0432 YAML-\u0444\u0430\u0439\u043b\u0430\u0445.", + "PRE": "None.", "POST": "`self.db_config_replacement` \u043b\u0438\u0431\u043e `None`, \u043b\u0438\u0431\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d." }, "relations": [ @@ -668,11 +669,8 @@ "compliance": { "valid": false, "issues": [ - "Missing Mandatory Tag: @PRE", "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", "Missing Belief State Logging: Function should use belief_scope context manager." ] } @@ -680,10 +678,11 @@ { "name": "_select_databases", "type": "Function", - "start_line": 220, - "end_line": 297, + "start_line": 227, + "end_line": 306, "tags": { "PURPOSE": "\u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0438 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u0411\u0414 \u0447\u0435\u0440\u0435\u0437 API.", + "PRE": "Clients are initialized.", "POST": "\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u0440\u0442\u0435\u0436 (\u0441\u0442\u0430\u0440\u0430\u044f \u0411\u0414, \u043d\u043e\u0432\u0430\u044f \u0411\u0414) \u0438\u043b\u0438 (None, None) \u043f\u0440\u0438 \u043e\u0442\u043c\u0435\u043d\u0435." }, "relations": [ @@ -712,11 +711,8 @@ "compliance": { "valid": false, "issues": [ - "Missing Mandatory Tag: @PRE", "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", "Missing Belief State Logging: Function should use belief_scope context manager." ] } @@ -724,8 +720,8 @@ { "name": "_batch_delete_by_ids", "type": "Function", - "start_line": 299, - "end_line": 323, + "start_line": 308, + "end_line": 333, "tags": { "PURPOSE": "\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432 \u043f\u043e \u0438\u0445 ID \u0435\u0434\u0438\u043d\u044b\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c.", "PRE": "`ids` \u2013 \u043d\u0435\u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b.", @@ -751,8 +747,8 @@ { "name": "execute_migration", "type": "Function", - "start_line": 325, - "end_line": 395, + "start_line": 335, + "end_line": 406, "tags": { "PURPOSE": "\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u044d\u043a\u0441\u043f\u043e\u0440\u0442-\u0438\u043c\u043f\u043e\u0440\u0442 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438, \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f.", "PRE": "`self.dashboards_to_migrate` \u043d\u0435 \u043f\u0443\u0441\u0442; `self.from_c` \u0438 `self.to_c` \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b.", @@ -810,7 +806,7 @@ "name": "superset_tool.exceptions", "type": "Module", "start_line": 1, - "end_line": null, + "end_line": 173, "tags": { "PURPOSE": "\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u0435\u0434\u0438\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0448\u0438\u0431\u043e\u043a.", "SEMANTICS": "exception, error, hierarchy", @@ -1166,7 +1162,7 @@ "name": "NetworkError", "type": "Class", "start_line": 137, - "end_line": null, + "end_line": 150, "tags": { "PURPOSE": "\u041e\u0448\u0438\u0431\u043a\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u0441\u0435\u0442\u0435\u0432\u044b\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u043c.", "PARAM": "context (Any) - \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438." @@ -1182,105 +1178,93 @@ "name": "__init__", "type": "Function", "start_line": 143, - "end_line": null, + "end_line": 149, "tags": { "PURPOSE": "Initializes a network error.", "PRE": "Optional message and context.", "POST": "Error is initialized with network failure context." }, "relations": [], - "children": [ - { - "name": "FileOperationError", - "type": "Class", - "start_line": 151, - "end_line": 156, - "tags": { - "PURPOSE": "\u041e\u0431\u0449\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 (I/O)." - }, - "relations": [ - { - "type": "INHERITS_FROM", - "target": "SupersetToolError" - } - ], - "children": [], - "compliance": { - "valid": true, - "issues": [] - } - }, - { - "name": "InvalidFileStructureError", - "type": "Class", - "start_line": 158, - "end_line": 163, - "tags": { - "PURPOSE": "\u041e\u0448\u0438\u0431\u043a\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u043d\u0430 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u043b\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439." - }, - "relations": [ - { - "type": "INHERITS_FROM", - "target": "FileOperationError" - } - ], - "children": [], - "compliance": { - "valid": true, - "issues": [] - } - }, - { - "name": "ConfigurationError", - "type": "Class", - "start_line": 165, - "end_line": 170, - "tags": { - "PURPOSE": "\u041e\u0448\u0438\u0431\u043a\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u043d\u0435\u0432\u0435\u0440\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430." - }, - "relations": [ - { - "type": "INHERITS_FROM", - "target": "SupersetToolError" - } - ], - "children": [], - "compliance": { - "valid": true, - "issues": [] - } - } - ], + "children": [], "compliance": { "valid": false, "issues": [ - "Unclosed Anchor at end of file (started line 143)", - "Unclosed Anchor: [DEF:__init__:Function] started at line 143", "Missing Belief State Logging: Function should use belief_scope context manager.", - "Unclosed Anchor: [DEF:__init__:Function] started at line 143", "Missing Belief State Logging: Function should use belief_scope context manager.", - "Unclosed Anchor: [DEF:__init__:Function] started at line 143", "Missing Belief State Logging: Function should use belief_scope context manager." ] } } ], "compliance": { - "valid": false, - "issues": [ - "Unclosed Anchor at end of file (started line 137)", - "Unclosed Anchor: [DEF:NetworkError:Class] started at line 137", - "Unclosed Anchor: [DEF:NetworkError:Class] started at line 137" - ] + "valid": true, + "issues": [] + } + }, + { + "name": "FileOperationError", + "type": "Class", + "start_line": 152, + "end_line": 157, + "tags": { + "PURPOSE": "\u041e\u0431\u0449\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 (I/O)." + }, + "relations": [ + { + "type": "INHERITS_FROM", + "target": "SupersetToolError" + } + ], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "InvalidFileStructureError", + "type": "Class", + "start_line": 159, + "end_line": 164, + "tags": { + "PURPOSE": "\u041e\u0448\u0438\u0431\u043a\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u043d\u0430 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u043b\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439." + }, + "relations": [ + { + "type": "INHERITS_FROM", + "target": "FileOperationError" + } + ], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "ConfigurationError", + "type": "Class", + "start_line": 166, + "end_line": 171, + "tags": { + "PURPOSE": "\u041e\u0448\u0438\u0431\u043a\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u043d\u0435\u0432\u0435\u0440\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430." + }, + "relations": [ + { + "type": "INHERITS_FROM", + "target": "SupersetToolError" + } + ], + "children": [], + "compliance": { + "valid": true, + "issues": [] } } ], "compliance": { - "valid": false, - "issues": [ - "Unclosed Anchor at end of file (started line 1)", - "Unclosed Anchor: [DEF:superset_tool.exceptions:Module] started at line 1" - ] + "valid": true, + "issues": [] } }, { @@ -1426,7 +1410,7 @@ "name": "superset_tool.client", "type": "Module", "start_line": 1, - "end_line": 468, + "end_line": 508, "tags": { "SEMANTICS": "superset, api, client, rest, http, dashboard, dataset, import, export", "PURPOSE": "\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 Superset REST API, \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u0443\u044f \u043b\u043e\u0433\u0438\u043a\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044e.", @@ -1454,7 +1438,7 @@ "name": "SupersetClient", "type": "Class", "start_line": 27, - "end_line": 466, + "end_line": 506, "tags": { "PURPOSE": "\u041a\u043b\u0430\u0441\u0441-\u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u043d\u0430\u0434 Superset REST API, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430\u043c\u0438 \u0438 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430\u043c\u0438." }, @@ -1473,7 +1457,7 @@ "name": "__init__", "type": "Function", "start_line": 32, - "end_line": 51, + "end_line": 52, "tags": { "PURPOSE": "\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043b\u0438\u0435\u043d\u0442, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u043a\u043b\u0438\u0435\u043d\u0442.", "PRE": "`config` \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c SupersetConfig.", @@ -1483,19 +1467,15 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "_validate_config", "type": "Function", - "start_line": 53, - "end_line": 63, + "start_line": 54, + "end_line": 65, "tags": { "PURPOSE": "\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438\u043c\u0435\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0442\u0438\u043f.", "PRE": "`config` \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u043d.", @@ -1506,19 +1486,15 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "headers", "type": "Function", - "start_line": 67, - "end_line": 72, + "start_line": 68, + "end_line": 75, "tags": { "PURPOSE": "\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 HTTP-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0441\u0435\u0442\u0435\u0432\u044b\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c.", "PRE": "self.network \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d.", @@ -1527,19 +1503,15 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "get_dashboards", "type": "Function", - "start_line": 74, - "end_line": 96, + "start_line": 77, + "end_line": 108, "tags": { "PURPOSE": "\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044f \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044e.", "PRE": "self.network \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d.", @@ -1560,19 +1532,15 @@ ], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "export_dashboard", "type": "Function", - "start_line": 98, - "end_line": 121, + "start_line": 110, + "end_line": 134, "tags": { "PURPOSE": "\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u0448\u0431\u043e\u0440\u0434 \u0432 \u0432\u0438\u0434\u0435 ZIP-\u0430\u0440\u0445\u0438\u0432\u0430.", "PRE": "dashboard_id \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0446\u0435\u043b\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c.", @@ -1589,19 +1557,15 @@ ], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "import_dashboard", "type": "Function", - "start_line": 123, - "end_line": 155, + "start_line": 136, + "end_line": 169, "tags": { "PURPOSE": "\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u0448\u0431\u043e\u0440\u0434 \u0438\u0437 ZIP-\u0444\u0430\u0439\u043b\u0430 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435.", "PRE": "\u0424\u0430\u0439\u043b, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0432 `file_name`, \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0438 \u0431\u044b\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c ZIP-\u0430\u0440\u0445\u0438\u0432\u043e\u043c Superset.", @@ -1626,19 +1590,15 @@ ], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "_resolve_target_id_for_delete", "type": "Function", - "start_line": 157, - "end_line": 180, + "start_line": 171, + "end_line": 205, "tags": { "PURPOSE": "\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 ID \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f ID \u0438\u043b\u0438 slug.", "PARAM": "dash_slug (Optional[str]) - Slug \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430.", @@ -1650,19 +1610,15 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "_do_import", "type": "Function", - "start_line": 182, - "end_line": 203, + "start_line": 207, + "end_line": 229, "tags": { "PURPOSE": "\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u0434\u0438\u043d \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0438\u043c\u043f\u043e\u0440\u0442 \u0431\u0435\u0437 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439.", "PRE": "\u0424\u0430\u0439\u043b \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c.", @@ -1674,19 +1630,15 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "delete_dashboard", "type": "Function", - "start_line": 205, - "end_line": 221, + "start_line": 231, + "end_line": 248, "tags": { "PURPOSE": "\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u0434\u0430\u0448\u0431\u043e\u0440\u0434 \u043f\u043e \u0435\u0433\u043e ID \u0438\u043b\u0438 slug.", "PRE": "dashboard_id \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d.", @@ -1702,19 +1654,15 @@ ], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "_extract_dashboard_id_from_zip", "type": "Function", - "start_line": 223, - "end_line": 244, + "start_line": 250, + "end_line": 272, "tags": { "PURPOSE": "\u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 ID \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430 \u0438\u0437 `metadata.yaml` \u0432\u043d\u0443\u0442\u0440\u0438 ZIP-\u0430\u0440\u0445\u0438\u0432\u0430.", "PARAM": "file_name (Union[str, Path]) - \u041f\u0443\u0442\u044c \u043a ZIP-\u0444\u0430\u0439\u043b\u0443.", @@ -1726,19 +1674,15 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "_extract_dashboard_slug_from_zip", "type": "Function", - "start_line": 246, - "end_line": 267, + "start_line": 274, + "end_line": 296, "tags": { "PURPOSE": "\u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 slug \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430 \u0438\u0437 `metadata.yaml` \u0432\u043d\u0443\u0442\u0440\u0438 ZIP-\u0430\u0440\u0445\u0438\u0432\u0430.", "PARAM": "file_name (Union[str, Path]) - \u041f\u0443\u0442\u044c \u043a ZIP-\u0444\u0430\u0439\u043b\u0443.", @@ -1750,19 +1694,15 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "_validate_export_response", "type": "Function", - "start_line": 269, - "end_line": 283, + "start_line": 298, + "end_line": 313, "tags": { "PURPOSE": "\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e HTTP-\u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c ZIP-\u0430\u0440\u0445\u0438\u0432\u043e\u043c.", "PRE": "response \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c requests.Response.", @@ -1773,19 +1713,15 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "_resolve_export_filename", "type": "Function", - "start_line": 285, - "end_line": 301, + "start_line": 315, + "end_line": 332, "tags": { "PURPOSE": "\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u0438\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u0438\u043b\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0435\u0433\u043e.", "PRE": "response \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c requests.Response.", @@ -1796,19 +1732,15 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "_validate_query_params", "type": "Function", - "start_line": 303, - "end_line": 313, + "start_line": 334, + "end_line": 345, "tags": { "PURPOSE": "\u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441 \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0435\u0439.", "PARAM": "query (Optional[Dict]) - \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b.", @@ -1819,19 +1751,15 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "_fetch_total_object_count", "type": "Function", - "start_line": 315, - "end_line": 329, + "start_line": 347, + "end_line": 362, "tags": { "PURPOSE": "\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0443 \u0434\u043b\u044f \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0438.", "PARAM": "endpoint (str) - API \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442.", @@ -1843,19 +1771,15 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "_fetch_all_pages", "type": "Function", - "start_line": 331, - "end_line": 343, + "start_line": 364, + "end_line": 377, "tags": { "PURPOSE": "\u0418\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c \u043f\u0430\u0433\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e API \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.", "PARAM": "pagination_options (Dict) - \u041e\u043f\u0446\u0438\u0438 \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0438.", @@ -1867,19 +1791,15 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "_validate_import_file", "type": "Function", - "start_line": 345, - "end_line": 359, + "start_line": 379, + "end_line": 394, "tags": { "PURPOSE": "\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u0444\u0430\u0439\u043b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f ZIP-\u0430\u0440\u0445\u0438\u0432\u043e\u043c \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 `metadata.yaml`.", "PRE": "zip_path \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d.", @@ -1890,19 +1810,15 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "get_datasets", "type": "Function", - "start_line": 361, - "end_line": 382, + "start_line": 396, + "end_line": 418, "tags": { "PURPOSE": "\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u043e\u0432, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044f \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044e.", "PARAM": "query (Optional[Dict]) - \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u0430.", @@ -1923,19 +1839,15 @@ ], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "get_databases", "type": "Function", - "start_line": 384, - "end_line": 406, + "start_line": 420, + "end_line": 443, "tags": { "PURPOSE": "\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044f \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044e.", "PARAM": "query (Optional[Dict]) - \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u0430.", @@ -1956,19 +1868,15 @@ ], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "get_dataset", "type": "Function", - "start_line": 408, - "end_line": 423, + "start_line": 445, + "end_line": 461, "tags": { "PURPOSE": "\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0435 \u043f\u043e \u0435\u0433\u043e ID.", "PARAM": "dataset_id (int) - ID \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430.", @@ -1985,19 +1893,15 @@ ], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "get_database", "type": "Function", - "start_line": 425, - "end_line": 440, + "start_line": 463, + "end_line": 479, "tags": { "PURPOSE": "\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u0435\u0451 ID.", "PARAM": "database_id (int) - ID \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445.", @@ -2014,19 +1918,15 @@ ], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "update_dataset", "type": "Function", - "start_line": 442, - "end_line": 464, + "start_line": 481, + "end_line": 504, "tags": { "PURPOSE": "\u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 \u043f\u043e \u0435\u0433\u043e ID.", "PARAM": "data (Dict) - \u0414\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f.", @@ -2043,12 +1943,8 @@ ], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } } ], @@ -2149,7 +2045,7 @@ "name": "superset_tool.utils.logger", "type": "Module", "start_line": 1, - "end_line": 107, + "end_line": 156, "tags": { "SEMANTICS": "logging, utility, infrastructure, wrapper", "PURPOSE": "\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u0451\u0440\u0442\u043a\u0443 \u043d\u0430\u0434 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c `logging.Logger` \u0434\u043b\u044f \u0443\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u0433\u0435\u0440\u0430\u043c\u0438 \u0441 \u0432\u044b\u0432\u043e\u0434\u043e\u043c \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0438/\u0438\u043b\u0438 \u0444\u0430\u0439\u043b.", @@ -2164,11 +2060,32 @@ } ], "children": [ + { + "name": "belief_scope", + "type": "Function", + "start_line": 20, + "end_line": 34, + "tags": { + "PURPOSE": "Context manager for belief state logging to maintain execution coherence.", + "PRE": "scope_id must be a string.", + "POST": "Entry and exit actions are logged.", + "PARAM": "scope_id (str) - Identifier for the logical scope." + }, + "relations": [], + "children": [], + "compliance": { + "valid": false, + "issues": [ + "Missing Belief State Logging: Function should use belief_scope context manager.", + "Missing Belief State Logging: Function should use belief_scope context manager." + ] + } + }, { "name": "SupersetLogger", "type": "Class", - "start_line": 19, - "end_line": 105, + "start_line": 36, + "end_line": 154, "tags": { "PURPOSE": "\u041e\u0431\u0451\u0440\u0442\u043a\u0430 \u043d\u0430\u0434 `logging.Logger`, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043b\u043e\u0433\u0433\u0435\u0440\u043e\u0432." }, @@ -2180,10 +2097,10 @@ ], "children": [ { - "name": "SupersetLogger.__init__", + "name": "__init__", "type": "Function", - "start_line": 23, - "end_line": 56, + "start_line": 40, + "end_line": 74, "tags": { "PURPOSE": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u0442 \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043b\u043e\u0433\u0433\u0435\u0440, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u0430 \u0438/\u0438\u043b\u0438 \u043a\u043e\u043d\u0441\u043e\u043b\u0438.", "PRE": "\u0415\u0441\u043b\u0438 log_dir \u0443\u043a\u0430\u0437\u0430\u043d, \u043f\u0443\u0442\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c (\u0438\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u043c).", @@ -2193,188 +2110,145 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "SupersetLogger._log", + "name": "_log", "type": "Function", - "start_line": 58, - "end_line": 67, + "start_line": 76, + "end_line": 88, "tags": { "PURPOSE": "(Helper) \u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.", + "PRE": "level_method \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043b\u043e\u0433\u0433\u0435\u0440\u0430. msg must be a string.", + "POST": "\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u043b\u043e\u0433.", "PARAM": "exc_info (bool) - \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043b\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "SupersetLogger.info", + "name": "info", "type": "Function", - "start_line": 69, - "end_line": 73, - "tags": { - "PURPOSE": "\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f INFO." - }, - "relations": [], - "children": [], - "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] - } - }, - { - "name": "SupersetLogger.debug", - "type": "Function", - "start_line": 75, - "end_line": 79, - "tags": { - "PURPOSE": "\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f DEBUG." - }, - "relations": [], - "children": [], - "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] - } - }, - { - "name": "SupersetLogger.warning", - "type": "Function", - "start_line": 81, - "end_line": 85, - "tags": { - "PURPOSE": "\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f WARNING." - }, - "relations": [], - "children": [], - "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] - } - }, - { - "name": "SupersetLogger.error", - "type": "Function", - "start_line": 87, - "end_line": 91, - "tags": { - "PURPOSE": "\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f ERROR." - }, - "relations": [], - "children": [], - "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] - } - }, - { - "name": "SupersetLogger.critical", - "type": "Function", - "start_line": 93, + "start_line": 90, "end_line": 97, "tags": { - "PURPOSE": "\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f CRITICAL." + "PURPOSE": "\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f INFO.", + "PRE": "msg \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0439.", + "POST": "\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f INFO \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "SupersetLogger.exception", + "name": "debug", "type": "Function", "start_line": 99, - "end_line": 103, + "end_line": 106, "tags": { - "PURPOSE": "\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f ERROR \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u0441\u0442\u0435\u043a\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f." + "PURPOSE": "\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f DEBUG.", + "PRE": "msg \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0439.", + "POST": "\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f DEBUG \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] + } + }, + { + "name": "warning", + "type": "Function", + "start_line": 108, + "end_line": 115, + "tags": { + "PURPOSE": "\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f WARNING.", + "PRE": "msg \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0439.", + "POST": "\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f WARNING \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "error", + "type": "Function", + "start_line": 117, + "end_line": 124, + "tags": { + "PURPOSE": "\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f ERROR.", + "PRE": "msg \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0439.", + "POST": "\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f ERROR \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "critical", + "type": "Function", + "start_line": 126, + "end_line": 133, + "tags": { + "PURPOSE": "\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f CRITICAL.", + "PRE": "msg \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0439.", + "POST": "\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f CRITICAL \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "exception", + "type": "Function", + "start_line": 135, + "end_line": 142, + "tags": { + "PURPOSE": "\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f ERROR \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u0441\u0442\u0435\u043a\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.", + "PRE": "msg \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0439.", + "POST": "\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0441 traceback \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "belief_scope", + "type": "Method", + "start_line": 144, + "end_line": 152, + "tags": { + "PURPOSE": "Instance method wrapper for belief_scope context manager.", + "PRE": "scope_id must be a string.", + "POST": "Enters the belief scope." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] } } ], @@ -2393,7 +2267,7 @@ "name": "superset_tool.utils.fileio", "type": "Module", "start_line": 1, - "end_line": 458, + "end_line": 507, "tags": { "SEMANTICS": "file, io, zip, yaml, temp, archive, utility", "PURPOSE": "\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0443\u0442\u0438\u043b\u0438\u0442 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438, \u0430\u0440\u0445\u0438\u0432\u0430\u043c\u0438 ZIP, \u0444\u0430\u0439\u043b\u0430\u043c\u0438 YAML \u0438 \u043e\u0447\u0438\u0441\u0442\u043a\u0443 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439.", @@ -2419,9 +2293,11 @@ "name": "create_temp_file", "type": "Function", "start_line": 29, - "end_line": 67, + "end_line": 70, "tags": { "PURPOSE": "\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0438\u043b\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u043c.", + "PRE": "suffix \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0439, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0435\u0439 \u0442\u0438\u043f \u0440\u0435\u0441\u0443\u0440\u0441\u0430.", + "POST": "\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 \u0441\u043e\u0437\u0434\u0430\u043d \u0438 \u043f\u0443\u0442\u044c \u043a \u043d\u0435\u043c\u0443 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d; \u0440\u0435\u0441\u0443\u0440\u0441 \u0443\u0434\u0430\u043b\u0435\u043d \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430.", "PARAM": "logger (Optional[SupersetLogger]) - \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043b\u043e\u0433\u0433\u0435\u0440\u0430.", "YIELDS": "Path - \u041f\u0443\u0442\u044c \u043a \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c\u0443 \u0440\u0435\u0441\u0443\u0440\u0441\u0443.", "THROW": "IOError - \u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u0430." @@ -2429,48 +2305,38 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "remove_empty_directories", "type": "Function", - "start_line": 69, - "end_line": 91, + "start_line": 72, + "end_line": 97, "tags": { "PURPOSE": "\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0432\u0441\u0435 \u043f\u0443\u0441\u0442\u044b\u0435 \u043f\u043e\u0434\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0443\u0442\u0438.", + "PRE": "root_dir \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u0443\u0442\u0435\u043c \u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.", + "POST": "\u0412\u0441\u0435 \u043f\u0443\u0441\u0442\u044b\u0435 \u043f\u043e\u0434\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u044b, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u043e \u0438\u0445 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e.", "PARAM": "logger (Optional[SupersetLogger]) - \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043b\u043e\u0433\u0433\u0435\u0440\u0430.", "RETURN": "int - \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0445 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "read_dashboard_from_disk", "type": "Function", - "start_line": 93, - "end_line": 108, + "start_line": 99, + "end_line": 117, "tags": { "PURPOSE": "\u0427\u0438\u0442\u0430\u0435\u0442 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0444\u0430\u0439\u043b\u0430 \u0441 \u0434\u0438\u0441\u043a\u0430.", + "PRE": "file_path \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0444\u0430\u0439\u043b.", + "POST": "\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0431\u0430\u0439\u0442\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0438 \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430.", "PARAM": "logger (Optional[SupersetLogger]) - \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043b\u043e\u0433\u0433\u0435\u0440\u0430.", "RETURN": "Tuple[bytes, str] - \u041a\u043e\u0440\u0442\u0435\u0436 (\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435, \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430).", "THROW": "FileNotFoundError - \u0415\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d." @@ -2478,24 +2344,19 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "calculate_crc32", "type": "Function", - "start_line": 110, - "end_line": 119, + "start_line": 119, + "end_line": 132, "tags": { "PURPOSE": "\u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443 CRC32 \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u0430.", + "PRE": "file_path \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c Path \u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0444\u0430\u0439\u043b\u0443.", + "POST": "\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 8-\u0437\u043d\u0430\u0447\u043d\u0443\u044e hex-\u0441\u0442\u0440\u043e\u043a\u0443 CRC32.", "PARAM": "file_path (Path) - \u041f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443.", "RETURN": "str - 8-\u0437\u043d\u0430\u0447\u043d\u043e\u0435 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 CRC32.", "THROW": "IOError - \u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0447\u0442\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430." @@ -2503,22 +2364,15 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "RetentionPolicy", "type": "DataClass", - "start_line": 121, - "end_line": 128, + "start_line": 135, + "end_line": 142, "tags": { "PURPOSE": "\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0430\u0440\u0445\u0438\u0432\u043e\u0432 (\u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u0435, \u0435\u0436\u0435\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u044b\u0435, \u0435\u0436\u0435\u043c\u0435\u0441\u044f\u0447\u043d\u044b\u0435)." }, @@ -2532,10 +2386,12 @@ { "name": "archive_exports", "type": "Function", - "start_line": 130, - "end_line": 210, + "start_line": 145, + "end_line": 228, "tags": { "PURPOSE": "\u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0430\u0440\u0445\u0438\u0432\u043e\u043c \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u0434\u0435\u0434\u0443\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044e.", + "PRE": "output_dir \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u0443\u0442\u0435\u043c \u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.", + "POST": "\u0421\u0442\u0430\u0440\u044b\u0435 \u0438\u043b\u0438 \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0435\u0441\u044f \u0430\u0440\u0445\u0438\u0432\u044b \u0443\u0434\u0430\u043b\u0435\u043d\u044b \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0435.", "PARAM": "logger (Optional[SupersetLogger]) - \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043b\u043e\u0433\u0433\u0435\u0440\u0430." }, "relations": [ @@ -2550,48 +2406,38 @@ ], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "apply_retention_policy", "type": "Function", - "start_line": 212, - "end_line": 243, + "start_line": 230, + "end_line": 264, "tags": { "PURPOSE": "(Helper) \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a \u0441\u043f\u0438\u0441\u043a\u0443 \u0444\u0430\u0439\u043b\u043e\u0432, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044f \u0442\u0435, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c.", + "PRE": "files_with_dates is a list of (Path, date) tuples.", + "POST": "Returns a set of files to keep.", "PARAM": "logger (SupersetLogger) - \u041b\u043e\u0433\u0433\u0435\u0440.", "RETURN": "set - \u041c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u0443\u0442\u0435\u0439 \u043a \u0444\u0430\u0439\u043b\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "save_and_unpack_dashboard", "type": "Function", - "start_line": 245, - "end_line": 273, + "start_line": 266, + "end_line": 297, "tags": { "PURPOSE": "\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 ZIP-\u0430\u0440\u0445\u0438\u0432\u0430 \u043d\u0430 \u0434\u0438\u0441\u043a \u0438 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e.", + "PRE": "zip_content \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0431\u0430\u0439\u0442\u0430\u043c\u0438 \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0433\u043e ZIP-\u0430\u0440\u0445\u0438\u0432\u0430.", + "POST": "ZIP-\u0444\u0430\u0439\u043b \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d, \u0438 \u0435\u0441\u043b\u0438 unpack=True, \u043e\u043d \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u043d \u0432 output_dir.", "PARAM": "logger (Optional[SupersetLogger]) - \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043b\u043e\u0433\u0433\u0435\u0440\u0430.", "RETURN": "Tuple[Path, Optional[Path]] - \u041f\u0443\u0442\u044c \u043a ZIP-\u0444\u0430\u0439\u043b\u0443 \u0438, \u0435\u0441\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e, \u043f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u043e\u0439.", "THROW": "InvalidZipFormatError - \u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 ZIP." @@ -2599,24 +2445,19 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "update_yamls", "type": "Function", - "start_line": 275, - "end_line": 294, + "start_line": 299, + "end_line": 321, "tags": { "PURPOSE": "\u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0432 YAML-\u0444\u0430\u0439\u043b\u0430\u0445, \u0437\u0430\u043c\u0435\u043d\u044f\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044f regex.", + "PRE": "path \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0435\u0439.", + "POST": "\u0412\u0441\u0435 YAML \u0444\u0430\u0439\u043b\u044b \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c.", "THROW": "FileNotFoundError - \u0415\u0441\u043b\u0438 `path` \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442.", "PARAM": "logger (Optional[SupersetLogger]) - \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043b\u043e\u0433\u0433\u0435\u0440\u0430." }, @@ -2628,134 +2469,120 @@ ], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "_update_yaml_file", "type": "Function", - "start_line": 296, - "end_line": 355, + "start_line": 323, + "end_line": 390, "tags": { "PURPOSE": "(Helper) \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u043e\u0434\u0438\u043d YAML \u0444\u0430\u0439\u043b.", + "PRE": "file_path \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c Path \u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 YAML \u0444\u0430\u0439\u043b\u0443.", + "POST": "\u0424\u0430\u0439\u043b \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u043c \u0438\u043b\u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u043c\u0443 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044e.", "PARAM": "logger (SupersetLogger) - \u041b\u043e\u0433\u0433\u0435\u0440." }, "relations": [], - "children": [], + "children": [ + { + "name": "replacer", + "type": "Function", + "start_line": 371, + "end_line": 381, + "tags": { + "PURPOSE": "\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u043c\u0435\u043d\u044b, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0449\u0430\u044f \u043a\u0430\u0432\u044b\u0447\u043a\u0438 \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0431\u044b\u043b\u0438.", + "PRE": "match \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f.", + "POST": "\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u043d\u043e\u0432\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u0438 \u043a\u0430\u0432\u044b\u0447\u043a\u0438." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + } + ], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "create_dashboard_export", "type": "Function", - "start_line": 357, - "end_line": 382, + "start_line": 392, + "end_line": 420, "tags": { "PURPOSE": "\u0421\u043e\u0437\u0434\u0430\u0435\u0442 ZIP-\u0430\u0440\u0445\u0438\u0432 \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0443\u0442\u0435\u0439.", + "PRE": "source_paths \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u0443\u0442\u0438.", + "POST": "ZIP-\u0430\u0440\u0445\u0438\u0432 \u0441\u043e\u0437\u0434\u0430\u043d \u043f\u043e \u043f\u0443\u0442\u0438 zip_path.", "PARAM": "logger (Optional[SupersetLogger]) - \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043b\u043e\u0433\u0433\u0435\u0440\u0430.", "RETURN": "bool - `True` \u043f\u0440\u0438 \u0443\u0441\u043f\u0435\u0445\u0435, `False` \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "sanitize_filename", "type": "Function", - "start_line": 384, - "end_line": 390, + "start_line": 422, + "end_line": 432, "tags": { "PURPOSE": "\u041e\u0447\u0438\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u043e\u0442 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0445 \u0432 \u0438\u043c\u0435\u043d\u0430\u0445 \u0444\u0430\u0439\u043b\u043e\u0432.", + "PRE": "filename \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0439.", + "POST": "\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0431\u0435\u0437 \u0441\u043f\u0435\u0446\u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432.", "PARAM": "filename (str) - \u0418\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430.", "RETURN": "str - \u041e\u0447\u0438\u0449\u0435\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "get_filename_from_headers", "type": "Function", - "start_line": 392, - "end_line": 401, + "start_line": 434, + "end_line": 447, "tags": { "PURPOSE": "\u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0438\u0437 HTTP \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 'Content-Disposition'.", + "PRE": "headers \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u043b\u043e\u0432\u0430\u0440\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432.", + "POST": "\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0438\u043b\u0438 None, \u0435\u0441\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.", "PARAM": "headers (dict) - \u0421\u043b\u043e\u0432\u0430\u0440\u044c HTTP \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432.", - "RETURN": "Optional[str] - \u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0438\u043b\u0438 `None`." + "RETURN": "Optional[str] - \u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430 or `None`." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "consolidate_archive_folders", "type": "Function", - "start_line": 403, - "end_line": 456, + "start_line": 449, + "end_line": 505, "tags": { "PURPOSE": "\u041a\u043e\u043d\u0441\u043e\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0430\u0440\u0445\u0438\u0432\u043e\u0432 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043e\u0431\u0449\u0435\u0433\u043e \u0441\u043b\u0430\u0433\u0430 \u0432 \u0438\u043c\u0435\u043d\u0438.", + "PRE": "root_directory \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c Path \u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.", + "POST": "\u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u043c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u044b \u0432 \u043e\u0434\u043d\u0443.", "THROW": "TypeError, ValueError - \u0415\u0441\u043b\u0438 `root_directory` \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u0435\u043d.", "PARAM": "logger (Optional[SupersetLogger]) - \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043b\u043e\u0433\u0433\u0435\u0440\u0430." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } } ], @@ -2768,7 +2595,7 @@ "name": "superset_tool.utils.network", "type": "Module", "start_line": 1, - "end_line": 232, + "end_line": 265, "tags": { "SEMANTICS": "network, http, client, api, requests, session, authentication", "PURPOSE": "\u0418\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0443\u044e HTTP-\u043b\u043e\u0433\u0438\u043a\u0443 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 Superset API, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0435\u0439, retry-\u043b\u043e\u0433\u0438\u043a\u0443 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a.", @@ -2793,72 +2620,57 @@ { "name": "APIClient", "type": "Class", - "start_line": 24, - "end_line": 230, + "start_line": 25, + "end_line": 263, "tags": { "PURPOSE": "\u0418\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u0443\u0435\u0442 HTTP-\u043b\u043e\u0433\u0438\u043a\u0443 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 API, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0441\u0435\u0441\u0441\u0438\u0438, \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e, \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432." }, "relations": [], "children": [ { - "name": "APIClient.__init__", + "name": "__init__", "type": "Function", - "start_line": 29, - "end_line": 45, + "start_line": 30, + "end_line": 49, "tags": { "PURPOSE": "\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 API \u043a\u043b\u0438\u0435\u043d\u0442 \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439, \u0441\u0435\u0441\u0441\u0438\u0435\u0439 \u0438 \u043b\u043e\u0433\u0433\u0435\u0440\u043e\u043c.", - "PARAM": "logger (Optional[SupersetLogger]) - \u041b\u043e\u0433\u0433\u0435\u0440." + "PARAM": "logger (Optional[SupersetLogger]) - \u041b\u043e\u0433\u0433\u0435\u0440.", + "PRE": "config must contain 'base_url' and 'auth'.", + "POST": "APIClient instance is initialized with a session." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "APIClient._init_session", + "name": "_init_session", "type": "Function", - "start_line": 47, - "end_line": 61, + "start_line": 51, + "end_line": 68, "tags": { "PURPOSE": "\u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 `requests.Session` \u0441 retry-\u043b\u043e\u0433\u0438\u043a\u043e\u0439.", + "PRE": "self.request_settings must be initialized.", + "POST": "Returns a configured requests.Session instance.", "RETURN": "requests.Session - \u041d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0441\u0435\u0441\u0441\u0438\u044f." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "APIClient.authenticate", + "name": "authenticate", "type": "Function", - "start_line": 63, - "end_line": 88, + "start_line": 70, + "end_line": 97, "tags": { "PURPOSE": "\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u0432 Superset API \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 access \u0438 CSRF \u0442\u043e\u043a\u0435\u043d\u044b.", + "PRE": "self.auth and self.base_url must be valid.", "POST": "`self._tokens` \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d, `self._authenticated` \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0432 `True`.", "RETURN": "Dict[str, str] - \u0421\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438.", "THROW": "AuthenticationError, NetworkError - \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0430\u0445." @@ -2866,229 +2678,158 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "APIClient.headers", + "name": "headers", "type": "Function", - "start_line": 92, - "end_line": 101, + "start_line": 100, + "end_line": 113, "tags": { - "PURPOSE": "\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 HTTP-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432." + "PURPOSE": "\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 HTTP-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.", + "PRE": "APIClient is initialized and authenticated or can be authenticated.", + "POST": "Returns headers including auth tokens." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "APIClient.request", + "name": "request", "type": "Function", - "start_line": 103, - "end_line": 124, + "start_line": 115, + "end_line": 139, "tags": { "PURPOSE": "\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441 \u043a API.", + "PARAM": "raw_response (bool) - \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043b\u0438 \u0441\u044b\u0440\u043e\u0439 \u043e\u0442\u0432\u0435\u0442.", + "PRE": "method and endpoint must be strings.", + "POST": "Returns response content or raw Response object.", "RETURN": "`requests.Response` \u0435\u0441\u043b\u0438 `raw_response=True`, \u0438\u043d\u0430\u0447\u0435 `dict`.", - "THROW": "SupersetAPIError, NetworkError \u0438 \u0438\u0445 \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u044b.", - "PARAM": "raw_response (bool) - \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043b\u0438 \u0441\u044b\u0440\u043e\u0439 \u043e\u0442\u0432\u0435\u0442." + "THROW": "SupersetAPIError, NetworkError \u0438 \u0438\u0445 \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u044b." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "APIClient._handle_http_error", + "name": "_handle_http_error", "type": "Function", - "start_line": 126, - "end_line": 136, + "start_line": 141, + "end_line": 154, "tags": { "PURPOSE": "(Helper) \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 HTTP \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.", - "PARAM": "endpoint (str) - \u042d\u043d\u0434\u043f\u043e\u0438\u043d\u0442." + "PARAM": "endpoint (str) - \u042d\u043d\u0434\u043f\u043e\u0438\u043d\u0442.", + "PRE": "e must be a valid HTTPError with a response.", + "POST": "Raises a specific SupersetAPIError or subclass." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "APIClient._handle_network_error", + "name": "_handle_network_error", "type": "Function", - "start_line": 138, - "end_line": 147, + "start_line": 156, + "end_line": 168, "tags": { "PURPOSE": "(Helper) \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 `NetworkError`.", - "PARAM": "url (str) - URL." + "PARAM": "url (str) - URL.", + "PRE": "e must be a RequestException.", + "POST": "Raises a NetworkError." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "APIClient.upload_file", + "name": "upload_file", "type": "Function", - "start_line": 149, - "end_line": 173, + "start_line": 170, + "end_line": 197, "tags": { "PURPOSE": "\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0444\u0430\u0439\u043b \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0447\u0435\u0440\u0435\u0437 multipart/form-data.", + "PARAM": "timeout (Optional[int]) - \u0422\u0430\u0439\u043c\u0430\u0443\u0442.", + "PRE": "file_info must contain 'file_obj' and 'file_name'.", + "POST": "File is uploaded and response returned.", "RETURN": "\u041e\u0442\u0432\u0435\u0442 API \u0432 \u0432\u0438\u0434\u0435 \u0441\u043b\u043e\u0432\u0430\u0440\u044f.", - "THROW": "SupersetAPIError, NetworkError, TypeError.", - "PARAM": "timeout (Optional[int]) - \u0422\u0430\u0439\u043c\u0430\u0443\u0442." + "THROW": "SupersetAPIError, NetworkError, TypeError." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "APIClient._perform_upload", + "name": "_perform_upload", "type": "Function", - "start_line": 175, - "end_line": 199, + "start_line": 199, + "end_line": 226, "tags": { "PURPOSE": "(Helper) \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 POST \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u0444\u0430\u0439\u043b\u043e\u043c.", "PARAM": "timeout (Optional[int]) - \u0422\u0430\u0439\u043c\u0430\u0443\u0442.", + "PRE": "url, files, and headers must be provided.", + "POST": "POST request is performed and JSON response returned.", "RETURN": "Dict - \u041e\u0442\u0432\u0435\u0442." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "APIClient.fetch_paginated_count", + "name": "fetch_paginated_count", "type": "Function", - "start_line": 201, - "end_line": 210, + "start_line": 228, + "end_line": 240, "tags": { "PURPOSE": "\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0438.", "PARAM": "count_field (str) - \u041f\u043e\u043b\u0435 \u0441 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c.", + "PRE": "query_params must be a dictionary.", + "POST": "Returns total count of items.", "RETURN": "int - \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "APIClient.fetch_paginated_data", + "name": "fetch_paginated_data", "type": "Function", - "start_line": 212, - "end_line": 228, + "start_line": 242, + "end_line": 261, "tags": { "PURPOSE": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043e \u0432\u0441\u0435\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043f\u0430\u0433\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430.", "PARAM": "pagination_options (Dict[str, Any]) - \u041e\u043f\u0446\u0438\u0438 \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0438.", + "PRE": "pagination_options must contain 'base_query', 'total_count', 'results_field'.", + "POST": "Returns all items across all pages.", "RETURN": "List[Any] - \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } } ], @@ -3107,7 +2848,7 @@ "name": "superset_tool.utils.whiptail_fallback", "type": "Module", "start_line": 1, - "end_line": 104, + "end_line": 157, "tags": { "SEMANTICS": "ui, fallback, console, utility, interactive", "PURPOSE": "\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043b\u043e\u0442\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0439 UI-fallback \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432, \u0438\u043c\u0438\u0442\u0438\u0440\u0443\u044f `whiptail` \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c, \u0433\u0434\u0435 \u043e\u043d \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d.", @@ -3119,132 +2860,193 @@ { "name": "menu", "type": "Function", - "start_line": 13, - "end_line": 29, + "start_line": 14, + "end_line": 33, "tags": { "PURPOSE": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u043c\u0435\u043d\u044e \u0432\u044b\u0431\u043e\u0440\u0430 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442.", "PARAM": "choices (List[str]) - \u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430.", + "PRE": "choices must be a non-empty list of strings.", + "POST": "Returns a tuple with return code and selected choice.", "RETURN": "Tuple[int, Optional[str]] - \u041a\u043e\u0440\u0442\u0435\u0436 (\u043a\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430, \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442). rc=0 - \u0443\u0441\u043f\u0435\u0445." }, "relations": [], "children": [], - "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] - } - }, - { - "name": "checklist", - "type": "Function", - "start_line": 31, - "end_line": 49, - "tags": { - "PURPOSE": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430.", - "PARAM": "options (List[Tuple[str, str]]) - \u0421\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u0440\u0442\u0435\u0436\u0435\u0439 (\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043c\u0435\u0442\u043a\u0430).", - "RETURN": "Tuple[int, List[str]] - \u041a\u043e\u0440\u0442\u0435\u0436 (\u043a\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430, \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439)." - }, - "relations": [], - "children": [], - "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] - } - }, - { - "name": "yesno", - "type": "Function", - "start_line": 51, - "end_line": 59, - "tags": { - "PURPOSE": "\u0417\u0430\u0434\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u0441 \u043e\u0442\u0432\u0435\u0442\u043e\u043c \u0434\u0430/\u043d\u0435\u0442.", - "PARAM": "question (str) - \u0412\u043e\u043f\u0440\u043e\u0441 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.", - "RETURN": "bool - `True`, \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u0442\u0432\u0435\u0442\u0438\u043b \"\u0434\u0430\"." - }, - "relations": [], - "children": [], - "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] - } - }, - { - "name": "msgbox", - "type": "Function", - "start_line": 61, - "end_line": 67, - "tags": { - "PURPOSE": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435.", - "PARAM": "msg (str) - \u0422\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f." - }, - "relations": [], - "children": [], - "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] - } - }, - { - "name": "inputbox", - "type": "Function", - "start_line": 69, - "end_line": 78, - "tags": { - "PURPOSE": "\u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0432\u0432\u043e\u0434.", - "PARAM": "prompt (str) - \u041f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u043a \u0432\u0432\u043e\u0434\u0443.", - "RETURN": "Tuple[int, Optional[str]] - \u041a\u043e\u0440\u0442\u0435\u0436 (\u043a\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430, \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430)." - }, - "relations": [], - "children": [], - "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] - } - }, - { - "name": "_ConsoleGauge", - "type": "Class", - "start_line": 80, - "end_line": 94, - "tags": { - "PURPOSE": "\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 `whiptail gauge` \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438." - }, - "relations": [], - "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "checklist", + "type": "Function", + "start_line": 35, + "end_line": 56, + "tags": { + "PURPOSE": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430.", + "PARAM": "options (List[Tuple[str, str]]) - \u0421\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u0440\u0442\u0435\u0436\u0435\u0439 (\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043c\u0435\u0442\u043a\u0430).", + "PRE": "options must be a list of (value, label) tuples.", + "POST": "Returns a list of selected values.", + "RETURN": "Tuple[int, List[str]] - \u041a\u043e\u0440\u0442\u0435\u0436 (\u043a\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430, \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439)." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "yesno", + "type": "Function", + "start_line": 58, + "end_line": 69, + "tags": { + "PURPOSE": "\u0417\u0430\u0434\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u0441 \u043e\u0442\u0432\u0435\u0442\u043e\u043c \u0434\u0430/\u043d\u0435\u0442.", + "PARAM": "question (str) - \u0412\u043e\u043f\u0440\u043e\u0441 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.", + "PRE": "question must be a string.", + "POST": "Returns boolean based on user input.", + "RETURN": "bool - `True`, \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u0442\u0432\u0435\u0442\u0438\u043b \"\u0434\u0430\"." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "msgbox", + "type": "Function", + "start_line": 71, + "end_line": 80, + "tags": { + "PURPOSE": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435.", + "PARAM": "msg (str) - \u0422\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.", + "PRE": "msg must be a string.", + "POST": "Message is printed to console." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "inputbox", + "type": "Function", + "start_line": 82, + "end_line": 94, + "tags": { + "PURPOSE": "\u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0432\u0432\u043e\u0434.", + "PARAM": "prompt (str) - \u041f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u043a \u0432\u0432\u043e\u0434\u0443.", + "PRE": "prompt must be a string.", + "POST": "Returns user input string.", + "RETURN": "Tuple[int, Optional[str]] - \u041a\u043e\u0440\u0442\u0435\u0436 (\u043a\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430, \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430)." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "_ConsoleGauge", + "type": "Class", + "start_line": 96, + "end_line": 144, + "tags": { + "PURPOSE": "\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 `whiptail gauge` \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438." + }, + "relations": [], + "children": [ + { + "name": "__init__", + "type": "Function", + "start_line": 99, + "end_line": 106, + "tags": { + "PURPOSE": "Initializes the gauge.", + "PRE": "title must be a string.", + "POST": "Instance initialized." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "__enter__", + "type": "Function", + "start_line": 108, + "end_line": 116, + "tags": { + "PURPOSE": "Enters the context.", + "PRE": "Instance initialized.", + "POST": "Header printed, returns self." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "__exit__", + "type": "Function", + "start_line": 118, + "end_line": 125, + "tags": { + "PURPOSE": "Exits the context.", + "PRE": "Context entered.", + "POST": "Newline printed." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "set_text", + "type": "Function", + "start_line": 127, + "end_line": 134, + "tags": { + "PURPOSE": "Sets the gauge text.", + "PRE": "txt must be a string.", + "POST": "Text written to stdout." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "set_percent", + "type": "Function", + "start_line": 136, + "end_line": 143, + "tags": { + "PURPOSE": "Sets the gauge percentage.", + "PRE": "percent must be an integer.", + "POST": "Percentage written to stdout." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + } + ], "compliance": { "valid": true, "issues": [] @@ -3253,25 +3055,20 @@ { "name": "gauge", "type": "Function", - "start_line": 96, - "end_line": 102, + "start_line": 146, + "end_line": 155, "tags": { "PURPOSE": "\u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 `_ConsoleGauge`.", + "PRE": "title must be a string.", + "POST": "Returns an instance of _ConsoleGauge.", "PARAM": "title (str) - \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0434\u043b\u044f \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0430.", "RETURN": "_ConsoleGauge - \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } } ], @@ -3284,7 +3081,7 @@ "name": "superset_tool.utils.dataset_mapper", "type": "Module", "start_line": 1, - "end_line": 229, + "end_line": 240, "tags": { "SEMANTICS": "dataset, mapping, postgresql, xlsx, superset", "PURPOSE": "\u042d\u0442\u043e\u0442 \u043c\u043e\u0434\u0443\u043b\u044c \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 (verbose_map) \u0432 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430\u0445 Superset, \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044f \u0438\u0445 \u0438\u0437 PostgreSQL \u0438\u043b\u0438 XLSX-\u0444\u0430\u0439\u043b\u043e\u0432.", @@ -3310,21 +3107,42 @@ "name": "DatasetMapper", "type": "Class", "start_line": 20, - "end_line": 227, + "end_line": 238, "tags": { "PURPOSE": "\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u043c\u0435\u043f\u043f\u0438\u043d\u0433\u0430 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f verbose_map \u0432 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430\u0445 Superset." }, "relations": [], "children": [ { - "name": "DatasetMapper.get_postgres_comments", + "name": "__init__", "type": "Function", - "start_line": 26, - "end_line": 88, + "start_line": 23, + "end_line": 29, + "tags": { + "PURPOSE": "Initializes the mapper.", + "PRE": "logger \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u043c SupersetLogger.", + "POST": "\u041e\u0431\u044a\u0435\u043a\u0442 DatasetMapper \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d." + }, + "relations": [], + "children": [], + "compliance": { + "valid": false, + "issues": [ + "Missing Belief State Logging: Function should use belief_scope context manager.", + "Missing Belief State Logging: Function should use belief_scope context manager.", + "Missing Belief State Logging: Function should use belief_scope context manager." + ] + } + }, + { + "name": "get_postgres_comments", + "type": "Function", + "start_line": 31, + "end_line": 94, "tags": { "PURPOSE": "\u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043a \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 PostgreSQL.", - "PRE": "`table_name` \u0438 `table_schema` \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438.", - "POST": "\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u043c\u0435\u043f\u043f\u0438\u043d\u0433\u043e\u043c `column_name` -> `column_comment`.", + "PRE": "table_name \u0438 table_schema \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438.", + "POST": "\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u043e\u0432\u0430\u0440\u044c, \u0433\u0434\u0435 \u043a\u043b\u044e\u0447\u0438 - \u0438\u043c\u0435\u043d\u0430 \u043a\u043e\u043b\u043e\u043d\u043e\u043a, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f - \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0438\u0437 \u0411\u0414.", "THROW": "Exception - \u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a \u0411\u0414.", "PARAM": "table_schema (str) - \u0421\u0445\u0435\u043c\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.", "RETURN": "Dict[str, str] - \u0421\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c\u0438 \u043a \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c." @@ -3341,14 +3159,14 @@ } }, { - "name": "DatasetMapper.load_excel_mappings", + "name": "load_excel_mappings", "type": "Function", - "start_line": 90, - "end_line": 107, + "start_line": 96, + "end_line": 114, "tags": { "PURPOSE": "\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u043c\u0435\u043f\u043f\u0438\u043d\u0433\u0438 'column_name' -> 'column_comment' \u0438\u0437 XLSX \u0444\u0430\u0439\u043b\u0430.", - "PRE": "`file_path` \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c \u043f\u0443\u0442\u0435\u043c \u043a XLSX \u0444\u0430\u0439\u043b\u0443 \u0441 \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c\u0438 'column_name' \u0438 'column_comment'.", - "POST": "\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u043c\u0435\u043f\u043f\u0438\u043d\u0433\u0430\u043c\u0438.", + "PRE": "file_path \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 XLSX \u0444\u0430\u0439\u043b.", + "POST": "\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u043c\u0435\u043f\u043f\u0438\u043d\u0433\u0430\u043c\u0438 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430.", "THROW": "Exception - \u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0447\u0442\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430 \u0438\u043b\u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430.", "PARAM": "file_path (str) - \u041f\u0443\u0442\u044c \u043a XLSX \u0444\u0430\u0439\u043b\u0443.", "RETURN": "Dict[str, str] - \u0421\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u043c\u0435\u043f\u043f\u0438\u043d\u0433\u0430\u043c\u0438." @@ -3365,12 +3183,14 @@ } }, { - "name": "DatasetMapper.run_mapping", + "name": "run_mapping", "type": "Function", - "start_line": 109, - "end_line": 226, + "start_line": 116, + "end_line": 237, "tags": { "PURPOSE": "\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u043f\u043f\u0438\u043d\u0433\u0430 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f verbose_map \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 \u0432 Superset.", + "PRE": "dataset_id \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c ID \u0432 Superset.", + "POST": "\u0415\u0441\u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0434\u0430\u0442\u0430\u0441\u0435\u0442 \u0432 Superset \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d \u0447\u0435\u0440\u0435\u0437 API.", "PARAM": "table_schema (Optional[str]) - \u0421\u0445\u0435\u043c\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 PostgreSQL." }, "relations": [ @@ -3395,14 +3215,8 @@ "compliance": { "valid": false, "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", "Missing Belief State Logging: Function should use belief_scope context manager." ] } @@ -3473,7 +3287,7 @@ "name": "App", "type": "Component", "start_line": 1, - "end_line": 113, + "end_line": 117, "tags": { "SEMANTICS": "main, entrypoint, layout, navigation", "PURPOSE": "The root component of the frontend application. Manages navigation and layout.", @@ -3487,42 +3301,36 @@ "name": "handleFormSubmit", "type": "Function", "start_line": 24, - "end_line": 42, + "end_line": 44, "tags": { "PURPOSE": "Handles form submission for task creation.", + "PRE": "event.detail contains form parameters.", + "POST": "Task is created and selectedTask is updated.", "PARAM": "{CustomEvent} event - The submit event from DynamicForm." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "navigate", "type": "Function", - "start_line": 44, - "end_line": 59, + "start_line": 46, + "end_line": 63, "tags": { "PURPOSE": "Changes the current page and resets state.", + "PRE": "Target page name is provided.", + "POST": "currentPage store is updated and selection state is reset.", "PARAM": "{string} page - Target page name." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } } ], @@ -3535,7 +3343,7 @@ "name": "stores_module", "type": "Module", "start_line": 1, - "end_line": 66, + "end_line": 70, "tags": { "SEMANTICS": "state, stores, svelte, plugins, tasks", "PURPOSE": "Global state management using Svelte stores.", @@ -3637,40 +3445,34 @@ "name": "fetchPlugins", "type": "Function", "start_line": 39, - "end_line": 51, + "end_line": 53, "tags": { - "PURPOSE": "Fetches plugins from the API and updates the plugins store." + "PURPOSE": "Fetches plugins from the API and updates the plugins store.", + "PRE": "None.", + "POST": "plugins store is updated with data from the API." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "fetchTasks", "type": "Function", - "start_line": 53, - "end_line": 65, + "start_line": 55, + "end_line": 69, "tags": { - "PURPOSE": "Fetches tasks from the API and updates the tasks store." + "PURPOSE": "Fetches tasks from the API and updates the tasks store.", + "PRE": "None.", + "POST": "tasks store is updated with data from the API." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } } ], @@ -3683,7 +3485,7 @@ "name": "toasts_module", "type": "Module", "start_line": 1, - "end_line": 34, + "end_line": 38, "tags": { "SEMANTICS": "notification, toast, feedback, state", "PURPOSE": "Manages toast notifications using a Svelte writable store.", @@ -3710,42 +3512,36 @@ "name": "addToast", "type": "Function", "start_line": 13, - "end_line": 24, + "end_line": 26, "tags": { "PURPOSE": "Adds a new toast message.", + "PRE": "message string is provided.", + "POST": "New toast is added to the store and scheduled for removal.", "PARAM": "duration (number) - Duration in ms before the toast is removed." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "removeToast", "type": "Function", - "start_line": 26, - "end_line": 33, + "start_line": 28, + "end_line": 37, "tags": { "PURPOSE": "Removes a toast message by ID.", + "PRE": "id is provided.", + "POST": "Toast is removed from the store.", "PARAM": "id (string) - The ID of the toast to remove." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } } ], @@ -3758,7 +3554,7 @@ "name": "api_module", "type": "Module", "start_line": 1, - "end_line": 122, + "end_line": 130, "tags": { "SEMANTICS": "api, client, fetch, rest", "PURPOSE": "Handles all communication with the backend API.", @@ -3770,93 +3566,81 @@ "name": "getWsUrl", "type": "Function", "start_line": 11, - "end_line": 24, + "end_line": 26, "tags": { "PURPOSE": "Returns the WebSocket URL for a specific task, with fallback logic.", + "PRE": "taskId is provided.", + "POST": "Returns valid WebSocket URL string.", "PARAM": "taskId (string) - The ID of the task.", "RETURN": "string - The WebSocket URL." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "fetchApi", "type": "Function", - "start_line": 26, - "end_line": 44, + "start_line": 28, + "end_line": 48, "tags": { "PURPOSE": "Generic GET request wrapper.", + "PRE": "endpoint string is provided.", + "POST": "Returns Promise resolving to JSON data or throws on error.", "PARAM": "endpoint (string) - API endpoint.", "RETURN": "Promise - JSON response." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "postApi", "type": "Function", - "start_line": 46, - "end_line": 71, + "start_line": 50, + "end_line": 77, "tags": { "PURPOSE": "Generic POST request wrapper.", + "PRE": "endpoint and body are provided.", + "POST": "Returns Promise resolving to JSON data or throws on error.", "PARAM": "body (object) - Request payload.", "RETURN": "Promise - JSON response." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "requestApi", "type": "Function", - "start_line": 73, - "end_line": 99, + "start_line": 79, + "end_line": 107, "tags": { - "PURPOSE": "Generic request wrapper." + "PURPOSE": "Generic request wrapper.", + "PRE": "endpoint and method are provided.", + "POST": "Returns Promise resolving to JSON data or throws on error." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "api", "type": "Data", - "start_line": 101, - "end_line": 120, + "start_line": 109, + "end_line": 128, "tags": { "PURPOSE": "API client object with specific methods." }, @@ -3873,11 +3657,131 @@ "issues": [] } }, + { + "name": "selectPlugin", + "type": "Function", + "start_line": 17, + "end_line": 30, + "tags": { + "PURPOSE": "Handles plugin selection and navigation.", + "PRE": "plugin object must be provided.", + "POST": "Navigates to migration or sets selectedPlugin store." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "handleFormSubmit", + "type": "Function", + "start_line": 32, + "end_line": 50, + "tags": { + "PURPOSE": "Handles task creation from dynamic form submission.", + "PRE": "event.detail must contain task parameters.", + "POST": "Task is created via API and selectedTask store is updated." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "load", + "type": "Function", + "start_line": 3, + "end_line": 23, + "tags": { + "PURPOSE": "Loads initial plugin data for the dashboard.", + "PRE": "None.", + "POST": "Returns an object with plugins or an error message.", + "TYPE": "{import('./$types').PageLoad} */" + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "loadInitialData", + "type": "Function", + "start_line": 16, + "end_line": 36, + "tags": { + "PURPOSE": "Loads tasks and environments on page initialization.", + "PRE": "API must be reachable.", + "POST": "tasks and environments variables are populated." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "refreshTasks", + "type": "Function", + "start_line": 38, + "end_line": 54, + "tags": { + "PURPOSE": "Periodically refreshes the task list.", + "PRE": "API must be reachable.", + "POST": "tasks variable is updated if data is valid." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "handleSelectTask", + "type": "Function", + "start_line": 56, + "end_line": 64, + "tags": { + "PURPOSE": "Updates the selected task ID when a task is clicked.", + "PRE": "event.detail.id must be provided.", + "POST": "selectedTaskId is updated." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "handleRunBackup", + "type": "Function", + "start_line": 66, + "end_line": 87, + "tags": { + "PURPOSE": "Triggers a manual backup task for the selected environment.", + "PRE": "selectedEnvId must not be empty.", + "POST": "Backup task is created and task list is refreshed." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, { "name": "MigrationDashboard", "type": "Component", "start_line": 1, - "end_line": 405, + "end_line": 418, "tags": { "SEMANTICS": "migration, dashboard, environment, selection, database-replacement", "PURPOSE": "Main dashboard for configuring and starting migrations.", @@ -3891,158 +3795,137 @@ "name": "fetchEnvironments", "type": "Function", "start_line": 51, - "end_line": 67, + "end_line": 68, "tags": { "PURPOSE": "Fetches the list of environments from the API.", + "PRE": "None.", "POST": "environments state is updated." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @PRE" - ] + "valid": true, + "issues": [] } }, { "name": "fetchDashboards", "type": "Function", - "start_line": 69, - "end_line": 86, + "start_line": 70, + "end_line": 88, "tags": { "PURPOSE": "Fetches dashboards for the selected source environment.", + "PRE": "envId is a valid environment ID.", "PARAM": "envId The environment ID.", "POST": "dashboards state is updated." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @PRE" - ] + "valid": true, + "issues": [] } }, { "name": "fetchDatabases", "type": "Function", - "start_line": 93, - "end_line": 126, + "start_line": 95, + "end_line": 130, "tags": { - "PURPOSE": "Fetches databases from both environments and gets suggestions." + "PURPOSE": "Fetches databases from both environments and gets suggestions.", + "PRE": "sourceEnvId and targetEnvId must be set.", + "POST": "sourceDatabases, targetDatabases, mappings, and suggestions are updated." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "handleMappingUpdate", "type": "Function", - "start_line": 128, - "end_line": 161, + "start_line": 132, + "end_line": 167, "tags": { - "PURPOSE": "Saves a mapping to the backend." + "PURPOSE": "Saves a mapping to the backend.", + "PRE": "event.detail contains sourceUuid and targetUuid.", + "POST": "Mapping is saved and local mappings list is updated." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "handleViewLogs", "type": "Function", - "start_line": 163, - "end_line": 171, + "start_line": 169, + "end_line": 179, "tags": { - "PURPOSE": "Opens the log viewer for a specific task." + "PURPOSE": "Opens the log viewer for a specific task.", + "PRE": "event.detail contains task object.", + "POST": "logViewer state updated and showLogViewer set to true." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "handlePasswordPrompt", "type": "Function", - "start_line": 173, - "end_line": 193, + "start_line": 181, + "end_line": 203, "tags": { - "PURPOSE": "Reactive logic to show password prompt when a task is awaiting input." + "PURPOSE": "Reactive logic to show password prompt when a task is awaiting input.", + "PRE": "selectedTask status is AWAITING_INPUT.", + "POST": "showPasswordPrompt set to true with request data." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "handleResumeMigration", "type": "Function", - "start_line": 195, - "end_line": 211, + "start_line": 205, + "end_line": 223, "tags": { - "PURPOSE": "Resumes a migration task with provided passwords." + "PURPOSE": "Resumes a migration task with provided passwords.", + "PRE": "event.detail contains passwords.", + "POST": "resumeTask is called and showPasswordPrompt is hidden on success." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "startMigration", "type": "Function", - "start_line": 213, - "end_line": 279, + "start_line": 225, + "end_line": 292, "tags": { "PURPOSE": "Starts the migration process.", - "PRE": "sourceEnvId and targetEnvId must be set and different." + "PRE": "sourceEnvId and targetEnvId must be set and different.", + "POST": "Migration task is started and selectedTask is updated." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } } ], @@ -4055,7 +3938,7 @@ "name": "MappingManagement", "type": "Component", "start_line": 1, - "end_line": 186, + "end_line": 192, "tags": { "SEMANTICS": "mapping, management, database, fuzzy-matching", "PURPOSE": "Page for managing database mappings between environments.", @@ -4069,60 +3952,51 @@ "name": "fetchEnvironments", "type": "Function", "start_line": 33, - "end_line": 46, + "end_line": 48, "tags": { - "PURPOSE": "Fetches the list of environments." + "PURPOSE": "Fetches the list of environments.", + "PRE": "None.", + "POST": "environments array is populated." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "fetchDatabases", "type": "Function", - "start_line": 50, - "end_line": 84, + "start_line": 52, + "end_line": 88, "tags": { - "PURPOSE": "Fetches databases from both environments and gets suggestions." + "PURPOSE": "Fetches databases from both environments and gets suggestions.", + "PRE": "sourceEnvId and targetEnvId must be set.", + "POST": "sourceDatabases, targetDatabases, mappings, and suggestions are updated." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "handleUpdate", "type": "Function", - "start_line": 86, - "end_line": 120, + "start_line": 90, + "end_line": 126, "tags": { - "PURPOSE": "Saves a mapping to the backend." + "PURPOSE": "Saves a mapping to the backend.", + "PRE": "event.detail contains sourceUuid and targetUuid.", + "POST": "Mapping is saved and local mappings list is updated." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } } ], @@ -4183,14 +4057,14 @@ } }, { - "name": "ConnectionsSettingsPage", - "type": "Component", - "start_line": 1, - "end_line": 34, + "name": "handleSaveGlobal", + "type": "Function", + "start_line": 24, + "end_line": 40, "tags": { - "SEMANTICS": "settings, connections, page", - "PURPOSE": "Page for managing database connection configurations.", - "LAYER": "UI" + "PURPOSE": "Saves global application settings.", + "PRE": "settings.settings must contain valid configuration.", + "POST": "Global settings are updated via API." }, "relations": [], "children": [], @@ -4199,11 +4073,149 @@ "issues": [] } }, + { + "name": "handleAddOrUpdateEnv", + "type": "Function", + "start_line": 42, + "end_line": 68, + "tags": { + "PURPOSE": "Adds a new environment or updates an existing one.", + "PRE": "newEnv must contain valid environment details.", + "POST": "Environment is saved and page is reloaded to reflect changes." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "handleDeleteEnv", + "type": "Function", + "start_line": 70, + "end_line": 89, + "tags": { + "PURPOSE": "Deletes a Superset environment.", + "PRE": "id must be a valid environment ID.", + "POST": "Environment is removed and page is reloaded." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "handleTestEnv", + "type": "Function", + "start_line": 91, + "end_line": 112, + "tags": { + "PURPOSE": "Tests the connection to a Superset environment.", + "PRE": "id must be a valid environment ID.", + "POST": "Displays success or error toast based on connection result." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "editEnv", + "type": "Function", + "start_line": 114, + "end_line": 123, + "tags": { + "PURPOSE": "Populates the environment form for editing.", + "PRE": "env object must be provided.", + "POST": "newEnv and editingEnvId are updated." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "resetEnvForm", + "type": "Function", + "start_line": 125, + "end_line": 141, + "tags": { + "PURPOSE": "Resets the environment creation/edit form to default state.", + "PRE": "None.", + "POST": "newEnv is cleared and editingEnvId is set to null." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "load", + "type": "Function", + "start_line": 3, + "end_line": 29, + "tags": { + "PURPOSE": "Loads application settings and environment list.", + "PRE": "API must be reachable.", + "POST": "Returns settings object or default values on error.", + "TYPE": "{import('./$types').PageLoad} */" + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "ConnectionsSettingsPage", + "type": "Component", + "start_line": 1, + "end_line": 40, + "tags": { + "SEMANTICS": "settings, connections, page", + "PURPOSE": "Page for managing database connection configurations.", + "LAYER": "UI" + }, + "relations": [], + "children": [ + { + "name": "handleSuccess", + "type": "Function", + "start_line": 13, + "end_line": 23, + "tags": { + "PURPOSE": "Refreshes the connection list after a successful creation.", + "PRE": "listComponent must be bound.", + "POST": "Triggers the fetchConnections method on the list component." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + } + ], + "compliance": { + "valid": true, + "issues": [] + } + }, { "name": "Dashboard", "type": "Component", "start_line": 1, - "end_line": 60, + "end_line": 64, "tags": { "SEMANTICS": "dashboard, plugins, tools, list", "PURPOSE": "Displays the list of available plugins and allows selecting one.", @@ -4218,41 +4230,35 @@ "name": "onMount", "type": "Function", "start_line": 17, - "end_line": 25, + "end_line": 27, "tags": { - "PURPOSE": "Fetch plugins when the component mounts." + "PURPOSE": "Fetch plugins when the component mounts.", + "PRE": "Component is mounting.", + "POST": "plugins store is populated with available tools." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "selectPlugin", "type": "Function", - "start_line": 27, - "end_line": 36, + "start_line": 29, + "end_line": 40, "tags": { "PURPOSE": "Selects a plugin to display its form.", + "PRE": "plugin object is provided.", + "POST": "selectedPlugin store is updated.", "PARAM": "{Object} plugin - The plugin object to select." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } } ], @@ -4265,7 +4271,7 @@ "name": "Settings", "type": "Component", "start_line": 1, - "end_line": 333, + "end_line": 347, "tags": { "SEMANTICS": "settings, ui, configuration", "PURPOSE": "The main settings page for the application, allowing management of environments and global settings.", @@ -4281,143 +4287,122 @@ "name": "loadSettings", "type": "Function", "start_line": 50, - "end_line": 65, + "end_line": 67, "tags": { - "PURPOSE": "Loads settings from the backend." + "PURPOSE": "Loads settings from the backend.", + "PRE": "Component mounted or refresh requested.", + "POST": "settings object is populated with backend data." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "handleSaveGlobal", "type": "Function", - "start_line": 67, - "end_line": 82, + "start_line": 69, + "end_line": 86, "tags": { - "PURPOSE": "Saves global settings to the backend." + "PURPOSE": "Saves global settings to the backend.", + "PRE": "settings.settings contains valid configuration.", + "POST": "Backend global settings are updated." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "handleAddOrUpdateEnv", "type": "Function", - "start_line": 84, - "end_line": 106, + "start_line": 88, + "end_line": 112, "tags": { - "PURPOSE": "Adds or updates an environment." + "PURPOSE": "Adds or updates an environment.", + "PRE": "newEnv contains valid environment details.", + "POST": "Environment list is updated on backend and reloaded locally." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "handleDeleteEnv", "type": "Function", - "start_line": 108, - "end_line": 127, + "start_line": 114, + "end_line": 135, "tags": { "PURPOSE": "Deletes an environment.", + "PRE": "id of environment to delete is provided.", + "POST": "Environment is removed from backend and list is reloaded.", "PARAM": "{string} id - The ID of the environment to delete." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "handleTestEnv", "type": "Function", - "start_line": 129, - "end_line": 150, + "start_line": 137, + "end_line": 160, "tags": { "PURPOSE": "Tests the connection to an environment.", + "PRE": "Environment ID is valid.", + "POST": "Connection test result is displayed via toast.", "PARAM": "{string} id - The ID of the environment to test." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "editEnv", "type": "Function", - "start_line": 152, - "end_line": 161, + "start_line": 162, + "end_line": 173, "tags": { "PURPOSE": "Sets the form to edit an existing environment.", + "PRE": "env object is provided.", + "POST": "newEnv is populated with env data and editingEnvId is set.", "PARAM": "{Object} env - The environment object to edit." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "resetEnvForm", "type": "Function", - "start_line": 163, - "end_line": 182, + "start_line": 175, + "end_line": 196, "tags": { - "PURPOSE": "Resets the environment form." + "PURPOSE": "Resets the environment form.", + "PRE": "None.", + "POST": "newEnv is reset to initial state and editingEnvId is cleared." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } } ], @@ -4426,11 +4411,217 @@ "issues": [] } }, + { + "name": "getConnections", + "type": "Function", + "start_line": 7, + "end_line": 23, + "tags": { + "PURPOSE": "Fetch a list of saved connections.", + "PRE": "None.", + "POST": "Returns a promise resolving to an array of connections.", + "RETURNS": "{Promise} List of connections." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "createConnection", + "type": "Function", + "start_line": 25, + "end_line": 50, + "tags": { + "PURPOSE": "Create a new connection configuration.", + "PRE": "connectionData must be a valid object.", + "POST": "Returns a promise resolving to the created connection.", + "PARAM": "{Object} connectionData - The connection data.", + "RETURNS": "{Promise} The created connection instance." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "deleteConnection", + "type": "Function", + "start_line": 52, + "end_line": 70, + "tags": { + "PURPOSE": "Delete a connection configuration.", + "PRE": "connectionId must be a valid string.", + "POST": "Returns a promise that resolves when deletion is complete.", + "PARAM": "{string} connectionId - The ID of the connection to delete." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "runTask", + "type": "Function", + "start_line": 7, + "end_line": 33, + "tags": { + "PURPOSE": "Start a new task for a given plugin.", + "PRE": "pluginId and params must be provided.", + "POST": "Returns a promise resolving to the task instance.", + "PARAM": "{Object} params - Parameters for the plugin.", + "RETURNS": "{Promise} The created task instance." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "getTaskStatus", + "type": "Function", + "start_line": 35, + "end_line": 52, + "tags": { + "PURPOSE": "Fetch details for a specific task (to poll status or get result).", + "PRE": "taskId must be provided.", + "POST": "Returns a promise resolving to task details.", + "PARAM": "{string} taskId - The ID of the task.", + "RETURNS": "{Promise} Task details." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "getTasks", + "type": "Function", + "start_line": 7, + "end_line": 34, + "tags": { + "PURPOSE": "Fetch a list of tasks with pagination and optional status filter.", + "PRE": "limit and offset are numbers.", + "POST": "Returns a promise resolving to a list of tasks.", + "PARAM": "{string|null} status - Filter by task status (optional).", + "RETURNS": "{Promise} List of tasks." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "getTask", + "type": "Function", + "start_line": 36, + "end_line": 53, + "tags": { + "PURPOSE": "Fetch details for a specific task.", + "PRE": "taskId must be provided.", + "POST": "Returns a promise resolving to task details.", + "PARAM": "{string} taskId - The ID of the task.", + "RETURNS": "{Promise} Task details." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "getTaskLogs", + "type": "Function", + "start_line": 55, + "end_line": 75, + "tags": { + "PURPOSE": "Fetch logs for a specific task.", + "PRE": "taskId must be provided.", + "POST": "Returns a promise resolving to a list of log entries.", + "PARAM": "{string} taskId - The ID of the task.", + "RETURNS": "{Promise} List of log entries." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "resumeTask", + "type": "Function", + "start_line": 77, + "end_line": 103, + "tags": { + "PURPOSE": "Resume a task that is awaiting input (e.g., passwords).", + "PRE": "taskId and passwords must be provided.", + "POST": "Returns a promise resolving to the updated task object.", + "PARAM": "{Object} passwords - Map of database names to passwords.", + "RETURNS": "{Promise} Updated task object." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "resolveTask", + "type": "Function", + "start_line": 105, + "end_line": 131, + "tags": { + "PURPOSE": "Resolve a task that is awaiting mapping.", + "PRE": "taskId and resolutionParams must be provided.", + "POST": "Returns a promise resolving to the updated task object.", + "PARAM": "{Object} resolutionParams - Resolution parameters.", + "RETURNS": "{Promise} Updated task object." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "clearTasks", + "type": "Function", + "start_line": 133, + "end_line": 156, + "tags": { + "PURPOSE": "Clear tasks based on status.", + "PRE": "status is a string or null.", + "POST": "Returns a promise that resolves when tasks are cleared.", + "PARAM": "{string|null} status - Filter by task status (optional)." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, { "name": "PasswordPrompt", "type": "Component", "start_line": 1, - "end_line": 129, + "end_line": 133, "tags": { "SEMANTICS": "password, prompt, modal, input, security", "PURPOSE": "A modal component to prompt the user for database passwords when a migration task is paused.", @@ -4443,40 +4634,34 @@ "name": "handleSubmit", "type": "Function", "start_line": 21, - "end_line": 37, + "end_line": 39, "tags": { - "PURPOSE": "Validates and dispatches the passwords to resume the task." + "PURPOSE": "Validates and dispatches the passwords to resume the task.", + "PRE": "All database passwords must be entered.", + "POST": "'resume' event is dispatched with passwords." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "handleCancel", "type": "Function", - "start_line": 39, - "end_line": 45, + "start_line": 41, + "end_line": 49, "tags": { - "PURPOSE": "Cancels the password prompt." + "PURPOSE": "Cancels the password prompt.", + "PRE": "Modal is open.", + "POST": "'cancel' event is dispatched and show is set to false." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } } ], @@ -4489,7 +4674,7 @@ "name": "MappingTable", "type": "Component", "start_line": 1, - "end_line": 94, + "end_line": 98, "tags": { "SEMANTICS": "mapping, table, database, editor", "PURPOSE": "Displays and allows editing of database mappings.", @@ -4503,40 +4688,34 @@ "name": "updateMapping", "type": "Function", "start_line": 25, - "end_line": 32, + "end_line": 34, "tags": { - "PURPOSE": "Updates a mapping for a specific source database." + "PURPOSE": "Updates a mapping for a specific source database.", + "PRE": "sourceUuid and targetUuid are provided.", + "POST": "'update' event is dispatched." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "getSuggestion", "type": "Function", - "start_line": 34, - "end_line": 41, + "start_line": 36, + "end_line": 45, "tags": { - "PURPOSE": "Finds a suggestion for a source database." + "PURPOSE": "Finds a suggestion for a source database.", + "PRE": "sourceUuid is provided.", + "POST": "Returns matching suggestion object or undefined." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } } ], @@ -4549,7 +4728,7 @@ "name": "TaskLogViewer", "type": "Component", "start_line": 1, - "end_line": 171, + "end_line": 183, "tags": { "SEMANTICS": "task, log, viewer, modal", "PURPOSE": "Displays detailed logs for a specific task in a modal.", @@ -4562,120 +4741,102 @@ "name": "fetchLogs", "type": "Function", "start_line": 25, - "end_line": 40, + "end_line": 42, "tags": { - "PURPOSE": "Fetches logs for the current task." + "PURPOSE": "Fetches logs for the current task.", + "PRE": "taskId must be set.", + "POST": "logs array is updated with data from taskService." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "scrollToBottom", "type": "Function", - "start_line": 42, - "end_line": 51, + "start_line": 44, + "end_line": 55, "tags": { - "PURPOSE": "Scrolls the log container to the bottom." + "PURPOSE": "Scrolls the log container to the bottom.", + "PRE": "logContainer element must be bound.", + "POST": "logContainer scrollTop is set to scrollHeight." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "handleScroll", "type": "Function", - "start_line": 53, - "end_line": 62, + "start_line": 57, + "end_line": 68, "tags": { - "PURPOSE": "Updates auto-scroll preference based on scroll position." + "PURPOSE": "Updates auto-scroll preference based on scroll position.", + "PRE": "logContainer scroll event fired.", + "POST": "autoScroll boolean is updated." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "close", "type": "Function", - "start_line": 64, - "end_line": 70, + "start_line": 70, + "end_line": 78, "tags": { - "PURPOSE": "Closes the log viewer modal." + "PURPOSE": "Closes the log viewer modal.", + "PRE": "Modal is open.", + "POST": "Modal is closed and close event is dispatched." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "getLogLevelColor", "type": "Function", - "start_line": 72, - "end_line": 83, + "start_line": 80, + "end_line": 93, "tags": { - "PURPOSE": "Returns the CSS color class for a given log level." + "PURPOSE": "Returns the CSS color class for a given log level.", + "PRE": "level string is provided.", + "POST": "Returns tailwind color class string." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "onDestroy", "type": "Function", - "start_line": 100, - "end_line": 105, + "start_line": 110, + "end_line": 117, "tags": { - "PURPOSE": "Cleans up the polling interval." + "PURPOSE": "Cleans up the polling interval.", + "PRE": "Component is being destroyed.", + "POST": "Polling interval is cleared." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } } ], @@ -4705,7 +4866,7 @@ "name": "MissingMappingModal", "type": "Component", "start_line": 1, - "end_line": 114, + "end_line": 118, "tags": { "SEMANTICS": "modal, mapping, prompt, migration", "PURPOSE": "Prompts the user to provide a database mapping when one is missing during migration.", @@ -4719,40 +4880,34 @@ "name": "resolve", "type": "Function", "start_line": 26, - "end_line": 37, + "end_line": 39, "tags": { - "PURPOSE": "Dispatches the resolution event with the selected mapping." + "PURPOSE": "Dispatches the resolution event with the selected mapping.", + "PRE": "selectedTargetUuid must be set.", + "POST": "'resolve' event is dispatched and modal is hidden." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "cancel", "type": "Function", - "start_line": 39, - "end_line": 45, + "start_line": 41, + "end_line": 49, "tags": { - "PURPOSE": "Cancels the mapping resolution modal." + "PURPOSE": "Cancels the mapping resolution modal.", + "PRE": "Modal is open.", + "POST": "'cancel' event is dispatched and modal is hidden." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } } ], @@ -4765,7 +4920,7 @@ "name": "DashboardGrid", "type": "Component", "start_line": 1, - "end_line": 205, + "end_line": 213, "tags": { "SEMANTICS": "dashboard, grid, selection, pagination", "PURPOSE": "Displays a grid of dashboards with selection and pagination.", @@ -4779,80 +4934,68 @@ "name": "handleSort", "type": "Function", "start_line": 62, - "end_line": 72, + "end_line": 74, "tags": { - "PURPOSE": "Toggles sort direction or changes sort column." + "PURPOSE": "Toggles sort direction or changes sort column.", + "PRE": "column name is provided.", + "POST": "sortColumn and sortDirection state updated." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "handleSelectionChange", "type": "Function", - "start_line": 74, - "end_line": 86, + "start_line": 76, + "end_line": 90, "tags": { - "PURPOSE": "Handles individual checkbox changes." + "PURPOSE": "Handles individual checkbox changes.", + "PRE": "dashboard ID and checked status provided.", + "POST": "selectedIds array updated and selectionChanged event dispatched." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "handleSelectAll", "type": "Function", - "start_line": 88, - "end_line": 104, + "start_line": 92, + "end_line": 110, "tags": { - "PURPOSE": "Handles select all checkbox." + "PURPOSE": "Handles select all checkbox.", + "PRE": "checked status provided.", + "POST": "selectedIds array updated for all paginated items and event dispatched." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "goToPage", "type": "Function", - "start_line": 106, - "end_line": 113, + "start_line": 112, + "end_line": 121, "tags": { - "PURPOSE": "Changes current page." + "PURPOSE": "Changes current page.", + "PRE": "page index is provided.", + "POST": "currentPage state updated if within valid range." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } } ], @@ -4883,7 +5026,7 @@ "name": "TaskHistory", "type": "Component", "start_line": 1, - "end_line": 197, + "end_line": 209, "tags": { "SEMANTICS": "task, history, list, status, monitoring", "PURPOSE": "Displays a list of recent tasks with their status and allows selecting them for viewing logs.", @@ -4896,120 +5039,102 @@ "name": "fetchTasks", "type": "Function", "start_line": 18, - "end_line": 46, + "end_line": 48, "tags": { - "PURPOSE": "Fetches the list of recent tasks from the API." + "PURPOSE": "Fetches the list of recent tasks from the API.", + "PRE": "None.", + "POST": "tasks array is updated and selectedTask status synchronized." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "clearTasks", "type": "Function", - "start_line": 48, - "end_line": 65, + "start_line": 50, + "end_line": 69, "tags": { - "PURPOSE": "Clears tasks from the history, optionally filtered by status." + "PURPOSE": "Clears tasks from the history, optionally filtered by status.", + "PRE": "User confirms deletion via prompt.", + "POST": "Tasks are deleted from backend and list is re-fetched." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "selectTask", "type": "Function", - "start_line": 67, - "end_line": 85, + "start_line": 71, + "end_line": 91, "tags": { - "PURPOSE": "Selects a task and fetches its full details." + "PURPOSE": "Selects a task and fetches its full details.", + "PRE": "task object is provided.", + "POST": "selectedTask store is updated with full task details." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "getStatusColor", "type": "Function", - "start_line": 87, - "end_line": 99, + "start_line": 93, + "end_line": 107, "tags": { - "PURPOSE": "Returns the CSS color class for a given task status." + "PURPOSE": "Returns the CSS color class for a given task status.", + "PRE": "status string is provided.", + "POST": "Returns tailwind color class string." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "onMount", "type": "Function", - "start_line": 101, - "end_line": 107, + "start_line": 109, + "end_line": 117, "tags": { - "PURPOSE": "Initializes the component by fetching tasks and starting polling." + "PURPOSE": "Initializes the component by fetching tasks and starting polling.", + "PRE": "Component is mounting.", + "POST": "Tasks are fetched and 5s polling interval is started." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "onDestroy", "type": "Function", - "start_line": 109, - "end_line": 114, + "start_line": 119, + "end_line": 126, "tags": { - "PURPOSE": "Cleans up the polling interval when the component is destroyed." + "PURPOSE": "Cleans up the polling interval when the component is destroyed.", + "PRE": "Component is being destroyed.", + "POST": "Polling interval is cleared." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } } ], @@ -5042,7 +5167,7 @@ "name": "TaskRunner", "type": "Component", "start_line": 1, - "end_line": 379, + "end_line": 395, "tags": { "SEMANTICS": "task, runner, logs, websocket", "PURPOSE": "Connects to a WebSocket to display real-time logs for a running task.", @@ -5057,160 +5182,136 @@ "name": "connect", "type": "Function", "start_line": 38, - "end_line": 130, + "end_line": 132, "tags": { - "PURPOSE": "Establishes WebSocket connection with exponential backoff." + "PURPOSE": "Establishes WebSocket connection with exponential backoff.", + "PRE": "selectedTask must be set in the store.", + "POST": "WebSocket instance created and listeners attached." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "fetchTargetDatabases", "type": "Function", - "start_line": 132, - "end_line": 152, + "start_line": 134, + "end_line": 156, "tags": { - "PURPOSE": "Fetches the list of databases in the target environment." + "PURPOSE": "Fetches the list of databases in the target environment.", + "PRE": "task must be selected and have a target environment parameter.", + "POST": "targetDatabases array is populated with database objects." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "handleMappingResolve", "type": "Function", - "start_line": 154, - "end_line": 195, + "start_line": 158, + "end_line": 201, "tags": { - "PURPOSE": "Handles the resolution of a missing database mapping." + "PURPOSE": "Handles the resolution of a missing database mapping.", + "PRE": "event.detail contains sourceDbUuid, targetDbUuid, and targetDbName.", + "POST": "Mapping is saved and task is resumed." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "handlePasswordResume", "type": "Function", - "start_line": 197, - "end_line": 217, + "start_line": 203, + "end_line": 225, "tags": { - "PURPOSE": "Handles the submission of database passwords to resume a task." + "PURPOSE": "Handles the submission of database passwords to resume a task.", + "PRE": "event.detail contains passwords dictionary.", + "POST": "Task resume endpoint is called with passwords." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "startDataTimeout", "type": "Function", - "start_line": 219, - "end_line": 229, + "start_line": 227, + "end_line": 239, "tags": { - "PURPOSE": "Starts a timeout to detect when the log stream has stalled." + "PURPOSE": "Starts a timeout to detect when the log stream has stalled.", + "PRE": "None.", + "POST": "dataTimeout is set to check connection status after 5s." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "resetDataTimeout", "type": "Function", - "start_line": 231, - "end_line": 238, + "start_line": 241, + "end_line": 250, "tags": { - "PURPOSE": "Resets the data stall timeout." + "PURPOSE": "Resets the data stall timeout.", + "PRE": "dataTimeout must be active.", + "POST": "dataTimeout is cleared and restarted." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "onMount", "type": "Function", - "start_line": 240, - "end_line": 265, + "start_line": 252, + "end_line": 279, "tags": { - "PURPOSE": "Initializes the component and subscribes to task selection changes." + "PURPOSE": "Initializes the component and subscribes to task selection changes.", + "PRE": "Svelte component is mounting.", + "POST": "Store subscription is created and returned for cleanup." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "onDestroy", "type": "Function", - "start_line": 267, - "end_line": 279, + "start_line": 281, + "end_line": 295, "tags": { - "PURPOSE": "Close WebSocket connection when the component is destroyed." + "PURPOSE": "Close WebSocket connection when the component is destroyed.", + "PRE": "Component is being destroyed.", + "POST": "WebSocket is closed and timeouts are cleared." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } } ], @@ -5223,7 +5324,7 @@ "name": "TaskList", "type": "Component", "start_line": 1, - "end_line": 103, + "end_line": 109, "tags": { "SEMANTICS": "tasks, list, status, history", "PURPOSE": "Displays a list of tasks with their status and execution details.", @@ -5236,60 +5337,51 @@ "name": "getStatusColor", "type": "Function", "start_line": 18, - "end_line": 31, + "end_line": 33, "tags": { - "PURPOSE": "Returns the CSS color class for a given task status." + "PURPOSE": "Returns the CSS color class for a given task status.", + "PRE": "status string is provided.", + "POST": "Returns tailwind color class string." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "formatTime", "type": "Function", - "start_line": 33, - "end_line": 43, + "start_line": 35, + "end_line": 47, "tags": { - "PURPOSE": "Formats a date string using date-fns." + "PURPOSE": "Formats a date string using date-fns.", + "PRE": "dateStr is a valid date string or null.", + "POST": "Returns human-readable relative time string." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "handleTaskClick", "type": "Function", - "start_line": 45, - "end_line": 50, + "start_line": 49, + "end_line": 56, "tags": { - "PURPOSE": "Dispatches a select event when a task is clicked." + "PURPOSE": "Dispatches a select event when a task is clicked.", + "PRE": "taskId is provided.", + "POST": "'select' event is dispatched with task ID." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } } ], @@ -5302,7 +5394,7 @@ "name": "DynamicForm", "type": "Component", "start_line": 1, - "end_line": 88, + "end_line": 92, "tags": { "SEMANTICS": "form, schema, dynamic, json-schema", "PURPOSE": "Generates a form dynamically based on a JSON schema.", @@ -5317,40 +5409,34 @@ "name": "handleSubmit", "type": "Function", "start_line": 23, - "end_line": 31, + "end_line": 33, "tags": { - "PURPOSE": "Dispatches the submit event with the form data." + "PURPOSE": "Dispatches the submit event with the form data.", + "PRE": "formData contains user input.", + "POST": "'submit' event is dispatched with formData." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "initializeForm", "type": "Function", - "start_line": 33, - "end_line": 44, + "start_line": 35, + "end_line": 48, "tags": { - "PURPOSE": "Initialize form data with default values from the schema." + "PURPOSE": "Initialize form data with default values from the schema.", + "PRE": "schema is provided and contains properties.", + "POST": "formData is initialized with default values or empty strings." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } } ], @@ -5363,7 +5449,7 @@ "name": "EnvSelector", "type": "Component", "start_line": 1, - "end_line": 58, + "end_line": 60, "tags": { "SEMANTICS": "environment, selector, dropdown, migration", "PURPOSE": "Provides a UI component for selecting source and target environments.", @@ -5377,21 +5463,18 @@ "name": "handleSelect", "type": "Function", "start_line": 24, - "end_line": 34, + "end_line": 36, "tags": { "PURPOSE": "Dispatches the selection change event.", + "PRE": "event.target must be an HTMLSelectElement.", + "POST": "selectedId is updated and 'change' event is dispatched.", "PARAM": "{Event} event - The change event from the select element." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } } ], @@ -5404,7 +5487,7 @@ "name": "ConnectionForm", "type": "Component", "start_line": 1, - "end_line": 100, + "end_line": 108, "tags": { "SEMANTICS": "connection, form, settings", "PURPOSE": "UI component for creating a new database connection configuration.", @@ -5417,20 +5500,34 @@ "name": "handleSubmit", "type": "Function", "start_line": 26, - "end_line": 48, + "end_line": 50, "tags": { - "PURPOSE": "Submits the connection form to the backend." + "PURPOSE": "Submits the connection form to the backend.", + "PRE": "All required fields (name, host, database, username, password) must be filled.", + "POST": "A new connection is created via the connection service and a success event is dispatched." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] + } + }, + { + "name": "resetForm", + "type": "Function", + "start_line": 52, + "end_line": 65, + "tags": { + "PURPOSE": "Resets the connection form fields to their default values.", + "PRE": "None.", + "POST": "All form input variables are reset." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] } } ], @@ -5443,7 +5540,7 @@ "name": "ConnectionList", "type": "Component", "start_line": 1, - "end_line": 84, + "end_line": 88, "tags": { "SEMANTICS": "connection, list, settings", "PURPOSE": "UI component for listing and deleting saved database connection configurations.", @@ -5456,40 +5553,34 @@ "name": "fetchConnections", "type": "Function", "start_line": 20, - "end_line": 32, + "end_line": 34, "tags": { - "PURPOSE": "Fetches the list of connections from the backend." + "PURPOSE": "Fetches the list of connections from the backend.", + "PRE": "None.", + "POST": "connections array is populated." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "handleDelete", "type": "Function", - "start_line": 34, - "end_line": 47, + "start_line": 36, + "end_line": 51, "tags": { - "PURPOSE": "Deletes a connection configuration." + "PURPOSE": "Deletes a connection configuration.", + "PRE": "id is provided and user confirms deletion.", + "POST": "Connection is deleted from backend and list is reloaded." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } } ], @@ -5502,7 +5593,7 @@ "name": "MapperTool", "type": "Component", "start_line": 1, - "end_line": 161, + "end_line": 165, "tags": { "SEMANTICS": "mapper, tool, dataset, postgresql, excel", "PURPOSE": "UI component for mapping dataset column verbose names using the MapperPlugin.", @@ -5515,40 +5606,34 @@ "name": "fetchData", "type": "Function", "start_line": 29, - "end_line": 40, + "end_line": 42, "tags": { - "PURPOSE": "Fetches environments and saved connections." + "PURPOSE": "Fetches environments and saved connections.", + "PRE": "None.", + "POST": "envs and connections arrays are populated." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "handleRunMapper", "type": "Function", - "start_line": 42, - "end_line": 81, + "start_line": 44, + "end_line": 85, "tags": { - "PURPOSE": "Triggers the MapperPlugin task." + "PURPOSE": "Triggers the MapperPlugin task.", + "PRE": "selectedEnv and datasetId are set; source-specific fields are valid.", + "POST": "Mapper task is started and selectedTask is updated." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } } ], @@ -5635,7 +5720,7 @@ "name": "SearchTool", "type": "Component", "start_line": 1, - "end_line": 180, + "end_line": 186, "tags": { "SEMANTICS": "search, tool, dataset, regex", "PURPOSE": "UI component for searching datasets using the SearchPlugin.", @@ -5648,60 +5733,51 @@ "name": "fetchEnvironments", "type": "Function", "start_line": 23, - "end_line": 33, + "end_line": 35, "tags": { - "PURPOSE": "Fetches the list of available environments." + "PURPOSE": "Fetches the list of available environments.", + "PRE": "None.", + "POST": "envs array is populated." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "handleSearch", "type": "Function", - "start_line": 35, - "end_line": 60, + "start_line": 37, + "end_line": 64, "tags": { - "PURPOSE": "Triggers the SearchPlugin task." + "PURPOSE": "Triggers the SearchPlugin task.", + "PRE": "selectedEnv and searchQuery must be set.", + "POST": "Task is started and polling begins." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "startPolling", "type": "Function", - "start_line": 62, - "end_line": 89, + "start_line": 66, + "end_line": 95, "tags": { - "PURPOSE": "Polls for task completion and results." + "PURPOSE": "Polls for task completion and results.", + "PRE": "taskId is provided.", + "POST": "pollInterval is set and results are updated on success." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } } ], @@ -5714,7 +5790,7 @@ "name": "AppModule", "type": "Module", "start_line": 1, - "end_line": 159, + "end_line": 189, "tags": { "SEMANTICS": "app, main, entrypoint, fastapi", "PURPOSE": "The main entry point for the FastAPI application. It initializes the app, configures CORS, sets up dependencies, includes API routers, and defines the WebSocket endpoint for log streaming.", @@ -5740,13 +5816,66 @@ } }, { - "name": "WebSocketEndpoint", - "type": "Endpoint", - "start_line": 74, - "end_line": 129, + "name": "startup_event", + "type": "Function", + "start_line": 36, + "end_line": 46, "tags": { - "SEMANTICS": "websocket, logs, streaming, real-time", - "PURPOSE": "Provides a WebSocket endpoint for clients to connect to and receive real-time log entries for a specific task." + "PURPOSE": "Handles application startup tasks, such as starting the scheduler.", + "PRE": "None.", + "POST": "Scheduler is started." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "shutdown_event", + "type": "Function", + "start_line": 48, + "end_line": 58, + "tags": { + "PURPOSE": "Handles application shutdown tasks, such as stopping the scheduler.", + "PRE": "None.", + "POST": "Scheduler is stopped." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "log_requests", + "type": "Function", + "start_line": 70, + "end_line": 83, + "tags": { + "PURPOSE": "Middleware to log incoming HTTP requests and their response status.", + "PRE": "request is a FastAPI Request object.", + "POST": "Logs request and response details.", + "PARAM": "call_next (Callable) - The next middleware or route handler." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "websocket_endpoint", + "type": "Function", + "start_line": 94, + "end_line": 151, + "tags": { + "PURPOSE": "Provides a WebSocket endpoint for real-time log streaming of a task.", + "PRE": "task_id must be a valid task ID.", + "POST": "WebSocket connection is managed and logs are streamed until disconnect." }, "relations": [], "children": [], @@ -5758,8 +5887,8 @@ { "name": "StaticFiles", "type": "Mount", - "start_line": 131, - "end_line": 158, + "start_line": 153, + "end_line": 188, "tags": { "SEMANTICS": "static, frontend, spa", "PURPOSE": "Mounts the frontend build directory to serve static assets." @@ -5767,13 +5896,31 @@ "relations": [], "children": [ { - "name": "RootEndpoint", - "type": "Endpoint", - "start_line": 151, - "end_line": 157, + "name": "serve_spa", + "type": "Function", + "start_line": 161, + "end_line": 177, "tags": { - "SEMANTICS": "root, healthcheck", - "PURPOSE": "A simple root endpoint to confirm that the API is running." + "PURPOSE": "Serves frontend static files or index.html for SPA routing.", + "PRE": "file_path is requested by the client.", + "POST": "Returns the requested file or index.html as a fallback." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "read_root", + "type": "Function", + "start_line": 179, + "end_line": 187, + "tags": { + "PURPOSE": "A simple root endpoint to confirm that the API is running when frontend is missing.", + "PRE": "None.", + "POST": "Returns a JSON message indicating API status." }, "relations": [], "children": [], @@ -5798,7 +5945,7 @@ "name": "Dependencies", "type": "Module", "start_line": 1, - "end_line": 50, + "end_line": 80, "tags": { "SEMANTICS": "dependency, injection, singleton, factory", "PURPOSE": "Manages the creation and provision of shared application dependencies, such as the PluginLoader and TaskManager, to avoid circular imports.", @@ -5806,7 +5953,80 @@ "RELATION": "Used by the main app and API routers to get access to shared instances." }, "relations": [], - "children": [], + "children": [ + { + "name": "get_config_manager", + "type": "Function", + "start_line": 24, + "end_line": 33, + "tags": { + "PURPOSE": "Dependency injector for the ConfigManager.", + "PRE": "Global config_manager must be initialized.", + "POST": "Returns shared ConfigManager instance.", + "RETURN": "ConfigManager - The shared config manager instance." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "get_plugin_loader", + "type": "Function", + "start_line": 47, + "end_line": 56, + "tags": { + "PURPOSE": "Dependency injector for the PluginLoader.", + "PRE": "Global plugin_loader must be initialized.", + "POST": "Returns shared PluginLoader instance.", + "RETURN": "PluginLoader - The shared plugin loader instance." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "get_task_manager", + "type": "Function", + "start_line": 58, + "end_line": 67, + "tags": { + "PURPOSE": "Dependency injector for the TaskManager.", + "PRE": "Global task_manager must be initialized.", + "POST": "Returns shared TaskManager instance.", + "RETURN": "TaskManager - The shared task manager instance." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "get_scheduler_service", + "type": "Function", + "start_line": 69, + "end_line": 78, + "tags": { + "PURPOSE": "Dependency injector for the SchedulerService.", + "PRE": "Global scheduler_service must be initialized.", + "POST": "Returns shared SchedulerService instance.", + "RETURN": "SchedulerService - The shared scheduler service instance." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + } + ], "compliance": { "valid": true, "issues": [] @@ -5816,7 +6036,7 @@ "name": "backend.src.core.superset_client", "type": "Module", "start_line": 1, - "end_line": 105, + "end_line": 119, "tags": { "SEMANTICS": "superset, api, client, database, metadata", "PURPOSE": "Extends the base SupersetClient with database-specific metadata fetching.", @@ -5833,139 +6053,103 @@ { "name": "SupersetClient", "type": "Class", - "start_line": 16, - "end_line": 103, + "start_line": 17, + "end_line": 117, "tags": { "PURPOSE": "Extended SupersetClient for migration-specific operations." }, "relations": [], "children": [ { - "name": "SupersetClient.get_databases_summary", + "name": "get_databases_summary", "type": "Function", - "start_line": 20, - "end_line": 38, + "start_line": 21, + "end_line": 41, "tags": { "PURPOSE": "Fetch a summary of databases including uuid, name, and engine.", + "PRE": "self.network must be initialized and authenticated.", "POST": "Returns a list of database dictionaries with 'engine' field.", "RETURN": "List[Dict] - Summary of databases." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "SupersetClient.get_database_by_uuid", + "name": "get_database_by_uuid", "type": "Function", - "start_line": 40, - "end_line": 53, + "start_line": 43, + "end_line": 59, "tags": { "PURPOSE": "Find a database by its UUID.", + "PRE": "db_uuid must be a string.", + "POST": "Returns database metadata if found.", "PARAM": "db_uuid (str) - The UUID of the database.", "RETURN": "Optional[Dict] - Database info if found, else None." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "SupersetClient.get_dashboards_summary", + "name": "get_dashboards_summary", "type": "Function", - "start_line": 55, - "end_line": 79, + "start_line": 61, + "end_line": 87, "tags": { "PURPOSE": "Fetches dashboard metadata optimized for the grid.", - "POST": "Returns a list of dashboard dictionaries.", + "PRE": "self.network must be authenticated.", + "POST": "Returns a list of dashboard dictionaries mapped to the grid schema.", "RETURN": "List[Dict]" }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "SupersetClient.get_dataset", + "name": "get_dataset", "type": "Function", - "start_line": 81, - "end_line": 90, + "start_line": 89, + "end_line": 101, "tags": { "PURPOSE": "Fetch full dataset structure including columns and metrics.", + "PRE": "dataset_id must be a valid integer.", + "POST": "Returns full dataset metadata from Superset API.", "PARAM": "dataset_id (int) - The ID of the dataset.", "RETURN": "Dict - The dataset metadata." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "SupersetClient.update_dataset", + "name": "update_dataset", "type": "Function", - "start_line": 92, - "end_line": 101, + "start_line": 103, + "end_line": 115, "tags": { "PURPOSE": "Update dataset metadata.", + "PRE": "dataset_id must be valid, data must be a valid Superset dataset payload.", + "POST": "Dataset is updated in Superset.", "PARAM": "data (Dict) - The payload for update." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } } ], @@ -5984,7 +6168,7 @@ "name": "ConfigManagerModule", "type": "Module", "start_line": 1, - "end_line": 238, + "end_line": 266, "tags": { "SEMANTICS": "config, manager, persistence, json", "PURPOSE": "Manages application configuration, including loading/saving to JSON and CRUD for environments.", @@ -6011,7 +6195,7 @@ "name": "ConfigManager", "type": "Class", "start_line": 22, - "end_line": 236, + "end_line": 264, "tags": { "PURPOSE": "A class to handle application configuration persistence and management." }, @@ -6026,7 +6210,7 @@ "name": "__init__", "type": "Function", "start_line": 27, - "end_line": 49, + "end_line": 50, "tags": { "PURPOSE": "Initializes the ConfigManager.", "PRE": "isinstance(config_path, str) and len(config_path) > 0", @@ -6036,287 +6220,207 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "_load_config", "type": "Function", - "start_line": 51, - "end_line": 81, + "start_line": 52, + "end_line": 84, "tags": { "PURPOSE": "Loads the configuration from disk or creates a default one.", + "PRE": "self.config_path is set.", "POST": "isinstance(return, AppConfig)", "RETURN": "AppConfig - The loaded or default configuration." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "_save_config_to_disk", "type": "Function", - "start_line": 83, - "end_line": 100, + "start_line": 86, + "end_line": 105, "tags": { "PURPOSE": "Saves the provided configuration object to disk.", "PRE": "isinstance(config, AppConfig)", + "POST": "Configuration saved to disk.", "PARAM": "config (AppConfig) - The configuration to save." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "save", "type": "Function", - "start_line": 102, - "end_line": 106, + "start_line": 107, + "end_line": 114, "tags": { - "PURPOSE": "Saves the current configuration state to disk." + "PURPOSE": "Saves the current configuration state to disk.", + "PRE": "self.config is set.", + "POST": "self._save_config_to_disk called." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "get_config", "type": "Function", - "start_line": 108, - "end_line": 113, + "start_line": 116, + "end_line": 124, "tags": { "PURPOSE": "Returns the current configuration.", + "PRE": "self.config is set.", + "POST": "Returns self.config.", "RETURN": "AppConfig - The current configuration." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "update_global_settings", "type": "Function", - "start_line": 115, - "end_line": 133, + "start_line": 126, + "end_line": 146, "tags": { "PURPOSE": "Updates the global settings and persists the change.", "PRE": "isinstance(settings, GlobalSettings)", + "POST": "self.config.settings updated and saved.", "PARAM": "settings (GlobalSettings) - The new global settings." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "validate_path", "type": "Function", - "start_line": 135, - "end_line": 151, + "start_line": 148, + "end_line": 167, "tags": { "PURPOSE": "Validates if a path exists and is writable.", + "PRE": "path is a string.", + "POST": "Returns (bool, str) status.", "PARAM": "path (str) - The path to validate.", "RETURN": "tuple (bool, str) - (is_valid, message)" }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "get_environments", "type": "Function", - "start_line": 153, - "end_line": 158, + "start_line": 169, + "end_line": 177, "tags": { "PURPOSE": "Returns the list of configured environments.", + "PRE": "self.config is set.", + "POST": "Returns list of environments.", "RETURN": "List[Environment] - List of environments." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "has_environments", "type": "Function", - "start_line": 160, - "end_line": 165, + "start_line": 179, + "end_line": 187, "tags": { "PURPOSE": "Checks if at least one environment is configured.", + "PRE": "self.config is set.", + "POST": "Returns boolean indicating if environments exist.", "RETURN": "bool - True if at least one environment exists." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "add_environment", "type": "Function", - "start_line": 167, - "end_line": 184, + "start_line": 189, + "end_line": 208, "tags": { "PURPOSE": "Adds a new environment to the configuration.", "PRE": "isinstance(env, Environment)", + "POST": "Environment added or updated in self.config.environments.", "PARAM": "env (Environment) - The environment to add." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "update_environment", "type": "Function", - "start_line": 186, - "end_line": 213, + "start_line": 210, + "end_line": 239, "tags": { "PURPOSE": "Updates an existing environment.", "PRE": "isinstance(env_id, str) and len(env_id) > 0 and isinstance(updated_env, Environment)", + "POST": "Returns True if environment was found and updated.", "PARAM": "updated_env (Environment) - The updated environment data.", "RETURN": "bool - True if updated, False otherwise." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "delete_environment", "type": "Function", - "start_line": 215, - "end_line": 234, + "start_line": 241, + "end_line": 262, "tags": { "PURPOSE": "Deletes an environment by ID.", "PRE": "isinstance(env_id, str) and len(env_id) > 0", + "POST": "Environment removed from self.config.environments if it existed.", "PARAM": "env_id (str) - The ID of the environment to delete." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } } ], @@ -6335,7 +6439,7 @@ "name": "SchedulerModule", "type": "Module", "start_line": 1, - "end_line": 104, + "end_line": 119, "tags": { "SEMANTICS": "scheduler, apscheduler, cron, backup", "PURPOSE": "Manages scheduled tasks using APScheduler.", @@ -6348,7 +6452,7 @@ "name": "SchedulerService", "type": "Class", "start_line": 16, - "end_line": 103, + "end_line": 118, "tags": { "SEMANTICS": "scheduler, service, apscheduler", "PURPOSE": "Provides a service to manage scheduled backup tasks." @@ -6356,115 +6460,107 @@ "relations": [], "children": [ { - "name": "SchedulerService.start", + "name": "__init__", "type": "Function", - "start_line": 27, - "end_line": 35, + "start_line": 20, + "end_line": 30, "tags": { - "PURPOSE": "Starts the background scheduler and loads initial schedules." + "PURPOSE": "Initializes the scheduler service with task and config managers.", + "PRE": "task_manager and config_manager must be provided.", + "POST": "Scheduler instance is created but not started." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { - "name": "SchedulerService.stop", + "name": "start", "type": "Function", - "start_line": 37, - "end_line": 44, + "start_line": 32, + "end_line": 42, "tags": { - "PURPOSE": "Stops the background scheduler." + "PURPOSE": "Starts the background scheduler and loads initial schedules.", + "PRE": "Scheduler should be initialized.", + "POST": "Scheduler is running and schedules are loaded." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { - "name": "SchedulerService.load_schedules", + "name": "stop", "type": "Function", - "start_line": 46, - "end_line": 57, + "start_line": 44, + "end_line": 53, "tags": { - "PURPOSE": "Loads backup schedules from configuration and registers them." + "PURPOSE": "Stops the background scheduler.", + "PRE": "Scheduler should be running.", + "POST": "Scheduler is shut down." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { - "name": "SchedulerService.add_backup_job", + "name": "load_schedules", "type": "Function", - "start_line": 59, - "end_line": 77, + "start_line": 55, + "end_line": 68, + "tags": { + "PURPOSE": "Loads backup schedules from configuration and registers them.", + "PRE": "config_manager must have valid configuration.", + "POST": "All enabled backup jobs are added to the scheduler." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "add_backup_job", + "type": "Function", + "start_line": 70, + "end_line": 90, "tags": { "PURPOSE": "Adds a scheduled backup job for an environment.", + "PRE": "env_id and cron_expression must be valid strings.", + "POST": "A new job is added to the scheduler or replaced if it already exists.", "PARAM": "cron_expression (str) - The cron expression for the schedule." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { - "name": "SchedulerService._trigger_backup", + "name": "_trigger_backup", "type": "Function", - "start_line": 79, - "end_line": 101, + "start_line": 92, + "end_line": 116, "tags": { "PURPOSE": "Triggered by the scheduler to start a backup task.", + "PRE": "env_id must be a valid environment ID.", + "POST": "A new backup task is created in the task manager if not already running.", "PARAM": "env_id (str) - The ID of the environment." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } } ], @@ -6585,7 +6681,7 @@ "name": "backend.src.core.database", "type": "Module", "start_line": 1, - "end_line": 78, + "end_line": 85, "tags": { "SEMANTICS": "database, sqlite, sqlalchemy, session, persistence", "PURPOSE": "Configures the SQLite database connection and session management.", @@ -6689,66 +6785,53 @@ "name": "init_db", "type": "Function", "start_line": 47, - "end_line": 52, + "end_line": 55, "tags": { - "PURPOSE": "Initializes the database by creating all tables." + "PURPOSE": "Initializes the database by creating all tables.", + "PRE": "engine and tasks_engine are initialized.", + "POST": "Database tables created." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "get_db", "type": "Function", - "start_line": 54, - "end_line": 64, + "start_line": 57, + "end_line": 69, "tags": { "PURPOSE": "Dependency for getting a database session.", + "PRE": "SessionLocal is initialized.", "POST": "Session is closed after use.", "RETURN": "Generator[Session, None, None]" }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "get_tasks_db", "type": "Function", - "start_line": 66, - "end_line": 76, + "start_line": 71, + "end_line": 83, "tags": { "PURPOSE": "Dependency for getting a tasks database session.", + "PRE": "TasksSessionLocal is initialized.", "POST": "Session is closed after use.", "RETURN": "Generator[Session, None, None]" }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } } ], @@ -6761,7 +6844,7 @@ "name": "LoggerModule", "type": "Module", "start_line": 1, - "end_line": 188, + "end_line": 220, "tags": { "SEMANTICS": "logging, websocket, streaming, handler", "PURPOSE": "Configures the application's logging system, including a custom handler for buffering logs and streaming them over WebSockets.", @@ -6774,12 +6857,36 @@ "name": "BeliefFormatter", "type": "Class", "start_line": 22, - "end_line": 31, + "end_line": 38, "tags": { "PURPOSE": "Custom logging formatter that adds belief state prefixes to log messages." }, "relations": [], - "children": [], + "children": [ + { + "name": "format", + "type": "Function", + "start_line": 25, + "end_line": 37, + "tags": { + "PURPOSE": "Formats the log record, adding belief state context if available.", + "PRE": "record is a logging.LogRecord.", + "POST": "Returns formatted string.", + "PARAM": "record (logging.LogRecord) - The log record to format.", + "RETURN": "str - The formatted log message." + }, + "relations": [], + "children": [], + "compliance": { + "valid": false, + "issues": [ + "Missing Belief State Logging: Function should use belief_scope context manager.", + "Missing Belief State Logging: Function should use belief_scope context manager.", + "Missing Belief State Logging: Function should use belief_scope context manager." + ] + } + } + ], "compliance": { "valid": true, "issues": [] @@ -6788,8 +6895,8 @@ { "name": "LogEntry", "type": "Class", - "start_line": 34, - "end_line": 43, + "start_line": 41, + "end_line": 50, "tags": { "SEMANTICS": "log, entry, record, pydantic", "PURPOSE": "A Pydantic model representing a single, structured log entry. This is a re-definition for consistency, as it's also defined in task_manager.py." @@ -6802,32 +6909,31 @@ } }, { - "name": "BeliefScope", + "name": "belief_scope", "type": "Function", - "start_line": 45, - "end_line": 74, + "start_line": 52, + "end_line": 85, "tags": { - "PURPOSE": "Context manager for structured Belief State logging." + "PURPOSE": "Context manager for structured Belief State logging.", + "PARAM": "message (str) - Optional entry message.", + "PRE": "anchor_id must be provided.", + "POST": "Thread-local belief state is updated and entry/exit logs are generated." }, "relations": [], "children": [], "compliance": { "valid": false, "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", "Missing Belief State Logging: Function should use belief_scope context manager." ] } }, { - "name": "ConfigureLogger", + "name": "configure_logger", "type": "Function", - "start_line": 76, - "end_line": 118, + "start_line": 87, + "end_line": 129, "tags": { "PURPOSE": "Configures the logger with the provided logging settings.", "PRE": "config is a valid LoggingConfig instance.", @@ -6847,14 +6953,69 @@ { "name": "WebSocketLogHandler", "type": "Class", - "start_line": 120, - "end_line": 161, + "start_line": 131, + "end_line": 193, "tags": { "SEMANTICS": "logging, handler, websocket, buffer", "PURPOSE": "A custom logging handler that captures log records into a buffer. It is designed to be extended for real-time log streaming over WebSockets." }, "relations": [], - "children": [], + "children": [ + { + "name": "__init__", + "type": "Function", + "start_line": 139, + "end_line": 150, + "tags": { + "PURPOSE": "Initializes the handler with a fixed-capacity buffer.", + "PRE": "capacity is an integer.", + "POST": "Instance initialized with empty deque.", + "PARAM": "capacity (int) - Maximum number of logs to keep in memory." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "emit", + "type": "Function", + "start_line": 152, + "end_line": 178, + "tags": { + "PURPOSE": "Captures a log record, formats it, and stores it in the buffer.", + "PRE": "record is a logging.LogRecord.", + "POST": "Log is added to the log_buffer.", + "PARAM": "record (logging.LogRecord) - The log record to emit." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "get_recent_logs", + "type": "Function", + "start_line": 180, + "end_line": 191, + "tags": { + "PURPOSE": "Returns a list of recent log entries from the buffer.", + "PRE": "None.", + "POST": "Returns list of LogEntry objects.", + "RETURN": "List[LogEntry] - List of buffered log entries." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + } + ], "compliance": { "valid": true, "issues": [] @@ -6863,8 +7024,8 @@ { "name": "Logger", "type": "Global", - "start_line": 163, - "end_line": 187, + "start_line": 195, + "end_line": 219, "tags": { "SEMANTICS": "logger, global, instance", "PURPOSE": "The global logger instance for the application, configured with both a console handler and the custom WebSocket handler." @@ -6885,8 +7046,8 @@ { "name": "PluginLoader", "type": "Class", - "start_line": 8, - "end_line": 169, + "start_line": 9, + "end_line": 191, "tags": { "SEMANTICS": "plugin, loader, dynamic, import", "PURPOSE": "Scans a specified directory for Python modules, dynamically loads them, and registers any classes that are valid implementations of the PluginBase interface.", @@ -6896,165 +7057,130 @@ "relations": [], "children": [ { - "name": "PluginLoader.__init__", + "name": "__init__", "type": "Function", - "start_line": 19, - "end_line": 27, + "start_line": 20, + "end_line": 31, "tags": { "PURPOSE": "Initializes the PluginLoader with a directory to scan.", + "PRE": "plugin_dir is a valid directory path.", + "POST": "Plugins are loaded and registered.", "PARAM": "plugin_dir (str) - The directory containing plugin modules." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "PluginLoader._load_plugins", + "name": "_load_plugins", "type": "Function", - "start_line": 29, - "end_line": 50, + "start_line": 33, + "end_line": 57, "tags": { - "PURPOSE": "Scans the plugin directory and loads all valid plugins." + "PURPOSE": "Scans the plugin directory and loads all valid plugins.", + "PRE": "plugin_dir exists or can be created.", + "POST": "_load_module is called for each .py file." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "PluginLoader._load_module", + "name": "_load_module", "type": "Function", - "start_line": 52, - "end_line": 97, + "start_line": 59, + "end_line": 107, "tags": { "PURPOSE": "Loads a single Python module and discovers PluginBase implementations.", + "PRE": "module_name and file_path are valid.", + "POST": "Plugin classes are instantiated and registered.", "PARAM": "file_path (str) - The path to the module file." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "PluginLoader._register_plugin", + "name": "_register_plugin", "type": "Function", - "start_line": 99, - "end_line": 134, + "start_line": 109, + "end_line": 147, "tags": { "PURPOSE": "Registers a PluginBase instance and its configuration.", + "PRE": "plugin_instance is a valid implementation of PluginBase.", + "POST": "Plugin is added to _plugins and _plugin_configs.", "PARAM": "plugin_instance (PluginBase) - The plugin instance to register." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "PluginLoader.get_plugin", + "name": "get_plugin", "type": "Function", - "start_line": 137, - "end_line": 146, + "start_line": 150, + "end_line": 162, "tags": { "PURPOSE": "Retrieves a loaded plugin instance by its ID.", + "PRE": "plugin_id is a string.", + "POST": "Returns plugin instance or None.", "PARAM": "plugin_id (str) - The unique identifier of the plugin.", "RETURN": "Optional[PluginBase] - The plugin instance if found, otherwise None." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "PluginLoader.get_all_plugin_configs", + "name": "get_all_plugin_configs", "type": "Function", - "start_line": 148, - "end_line": 156, + "start_line": 164, + "end_line": 175, "tags": { "PURPOSE": "Returns a list of all registered plugin configurations.", + "PRE": "None.", + "POST": "Returns list of all PluginConfig objects.", "RETURN": "List[PluginConfig] - A list of plugin configurations." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "PluginLoader.has_plugin", + "name": "has_plugin", "type": "Function", - "start_line": 158, - "end_line": 167, + "start_line": 177, + "end_line": 189, "tags": { "PURPOSE": "Checks if a plugin with the given ID is registered.", + "PRE": "plugin_id is a string.", + "POST": "Returns True if plugin exists.", "PARAM": "plugin_id (str) - The unique identifier of the plugin.", "RETURN": "bool - True if the plugin is registered, False otherwise." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } } ], @@ -7067,7 +7193,7 @@ "name": "backend.src.core.migration_engine", "type": "Module", "start_line": 1, - "end_line": 98, + "end_line": 104, "tags": { "SEMANTICS": "migration, engine, zip, yaml, transformation", "PURPOSE": "Handles the interception and transformation of Superset asset ZIP archives.", @@ -7085,57 +7211,49 @@ "name": "MigrationEngine", "type": "Class", "start_line": 22, - "end_line": 96, + "end_line": 102, "tags": { "PURPOSE": "Engine for transforming Superset export ZIPs." }, "relations": [], "children": [ { - "name": "MigrationEngine.transform_zip", + "name": "transform_zip", "type": "Function", "start_line": 26, - "end_line": 76, + "end_line": 78, "tags": { "PURPOSE": "Extracts ZIP, replaces database UUIDs in YAMLs, and re-packages.", "PARAM": "strip_databases (bool) - Whether to remove the databases directory from the archive.", + "PRE": "zip_path must point to a valid Superset export archive.", + "POST": "Transformed archive is saved to output_path.", "RETURN": "bool - True if successful." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { - "name": "MigrationEngine._transform_yaml", + "name": "_transform_yaml", "type": "Function", - "start_line": 78, - "end_line": 94, + "start_line": 80, + "end_line": 100, "tags": { - "PURPOSE": "Replaces database_uuid in a single YAML file." + "PURPOSE": "Replaces database_uuid in a single YAML file.", + "PARAM": "db_mapping (Dict[str, str]) - UUID mapping dictionary.", + "PRE": "file_path must exist and be readable.", + "POST": "File is modified in-place if source UUID matches mapping." }, "relations": [], "children": [], "compliance": { "valid": false, "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", "Missing Belief State Logging: Function should use belief_scope context manager." ] } @@ -7155,8 +7273,8 @@ { "name": "PluginBase", "type": "Class", - "start_line": 6, - "end_line": 57, + "start_line": 7, + "end_line": 101, "tags": { "SEMANTICS": "plugin, interface, base, abstract", "PURPOSE": "Defines the abstract base class that all plugins must implement to be recognized by the system. It enforces a common structure for plugin metadata and execution.", @@ -7165,7 +7283,116 @@ "INVARIANT": "All plugins MUST inherit from this class." }, "relations": [], - "children": [], + "children": [ + { + "name": "id", + "type": "Function", + "start_line": 21, + "end_line": 30, + "tags": { + "PURPOSE": "Returns the unique identifier for the plugin.", + "PRE": "Plugin instance exists.", + "POST": "Returns string ID.", + "RETURN": "str - Plugin ID." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "name", + "type": "Function", + "start_line": 34, + "end_line": 43, + "tags": { + "PURPOSE": "Returns the human-readable name of the plugin.", + "PRE": "Plugin instance exists.", + "POST": "Returns string name.", + "RETURN": "str - Plugin name." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "description", + "type": "Function", + "start_line": 47, + "end_line": 56, + "tags": { + "PURPOSE": "Returns a brief description of the plugin.", + "PRE": "Plugin instance exists.", + "POST": "Returns string description.", + "RETURN": "str - Plugin description." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "version", + "type": "Function", + "start_line": 60, + "end_line": 69, + "tags": { + "PURPOSE": "Returns the version of the plugin.", + "PRE": "Plugin instance exists.", + "POST": "Returns string version.", + "RETURN": "str - Plugin version." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "get_schema", + "type": "Function", + "start_line": 72, + "end_line": 84, + "tags": { + "PURPOSE": "Returns the JSON schema for the plugin's input parameters.", + "PRE": "Plugin instance exists.", + "POST": "Returns dict schema.", + "RETURN": "Dict[str, Any] - JSON schema." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "execute", + "type": "Function", + "start_line": 87, + "end_line": 100, + "tags": { + "PURPOSE": "Executes the plugin's core logic.", + "PARAM": "params (Dict[str, Any]) - Validated input parameters.", + "PRE": "params must be a dictionary.", + "POST": "Plugin execution is completed." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + } + ], "compliance": { "valid": true, "issues": [] @@ -7174,8 +7401,8 @@ { "name": "PluginConfig", "type": "Class", - "start_line": 59, - "end_line": 71, + "start_line": 103, + "end_line": 115, "tags": { "SEMANTICS": "plugin, config, schema, pydantic", "PURPOSE": "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.", @@ -7239,7 +7466,7 @@ "name": "TaskPersistenceModule", "type": "Module", "start_line": 1, - "end_line": 148, + "end_line": 158, "tags": { "SEMANTICS": "persistence, sqlite, sqlalchemy, task, storage", "PURPOSE": "Handles the persistence of tasks using SQLAlchemy and the tasks.db database.", @@ -7253,7 +7480,7 @@ "name": "TaskPersistenceService", "type": "Class", "start_line": 20, - "end_line": 147, + "end_line": 157, "tags": { "SEMANTICS": "persistence, service, database, sqlalchemy", "PURPOSE": "Provides methods to save and load tasks from the tasks.db database using SQLAlchemy." @@ -7264,7 +7491,7 @@ "name": "__init__", "type": "Function", "start_line": 24, - "end_line": 31, + "end_line": 32, "tags": { "PURPOSE": "Initializes the persistence service.", "PRE": "None.", @@ -7273,108 +7500,81 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "persist_task", "type": "Function", - "start_line": 33, - "end_line": 74, + "start_line": 34, + "end_line": 77, "tags": { "PURPOSE": "Persists or updates a single task in the database.", + "PRE": "isinstance(task, Task)", + "POST": "Task record created or updated in database.", "PARAM": "task (Task) - The task object to persist." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "persist_tasks", "type": "Function", - "start_line": 76, - "end_line": 82, + "start_line": 79, + "end_line": 88, "tags": { "PURPOSE": "Persists multiple tasks.", + "PRE": "isinstance(tasks, list)", + "POST": "All tasks in list are persisted.", "PARAM": "tasks (List[Task]) - The list of tasks to persist." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "load_tasks", "type": "Function", - "start_line": 84, - "end_line": 127, + "start_line": 90, + "end_line": 135, "tags": { "PURPOSE": "Loads tasks from the database.", + "PRE": "limit is an integer.", + "POST": "Returns list of Task objects.", "PARAM": "status (Optional[TaskStatus]) - Filter by status.", "RETURN": "List[Task] - The loaded tasks." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { "name": "delete_tasks", "type": "Function", - "start_line": 129, - "end_line": 145, + "start_line": 137, + "end_line": 155, "tags": { "PURPOSE": "Deletes specific tasks from the database.", + "PRE": "task_ids is a list of strings.", + "POST": "Specified task records deleted from database.", "PARAM": "task_ids (List[str]) - List of task IDs to delete." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } } ], @@ -7393,7 +7593,7 @@ "name": "TaskManagerModule", "type": "Module", "start_line": 1, - "end_line": 376, + "end_line": 398, "tags": { "SEMANTICS": "task, manager, lifecycle, execution, state", "PURPOSE": "Manages the lifecycle of tasks, including their creation, execution, and state tracking. It uses a thread pool to run plugins asynchronously.", @@ -7408,7 +7608,7 @@ "name": "TaskManager", "type": "Class", "start_line": 20, - "end_line": 375, + "end_line": 397, "tags": { "SEMANTICS": "task, manager, lifecycle, execution, state", "PURPOSE": "Manages the lifecycle of tasks, including their creation, execution, and state tracking." @@ -7530,60 +7730,44 @@ "name": "get_task", "type": "Function", "start_line": 187, - "end_line": 193, + "end_line": 196, "tags": { "PURPOSE": "Retrieves a task by its ID.", + "PRE": "task_id is a string.", + "POST": "Returns Task object or None.", "PARAM": "task_id (str) - ID of the task.", "RETURN": "Optional[Task] - The task or None." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "get_all_tasks", "type": "Function", - "start_line": 195, - "end_line": 200, + "start_line": 198, + "end_line": 206, "tags": { "PURPOSE": "Retrieves all registered tasks.", + "PRE": "None.", + "POST": "Returns list of all Task objects.", "RETURN": "List[Task] - All tasks." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "get_tasks", "type": "Function", - "start_line": 202, - "end_line": 217, + "start_line": 208, + "end_line": 224, "tags": { "PURPOSE": "Retrieves tasks with pagination and optional status filter.", "PRE": "limit and offset are non-negative integers.", @@ -7594,46 +7778,34 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "get_task_logs", "type": "Function", - "start_line": 219, - "end_line": 226, + "start_line": 226, + "end_line": 236, "tags": { "PURPOSE": "Retrieves logs for a specific task.", + "PRE": "task_id is a string.", + "POST": "Returns list of LogEntry objects.", "PARAM": "task_id (str) - ID of the task.", "RETURN": "List[LogEntry] - List of log entries." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "_add_log", "type": "Function", - "start_line": 228, - "end_line": 249, + "start_line": 238, + "end_line": 260, "tags": { "PURPOSE": "Adds a log entry to a task and notifies subscribers.", "PRE": "Task exists.", @@ -7643,97 +7815,69 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "subscribe_logs", "type": "Function", - "start_line": 251, - "end_line": 261, + "start_line": 262, + "end_line": 275, "tags": { "PURPOSE": "Subscribes to real-time logs for a task.", + "PRE": "task_id is a string.", + "POST": "Returns an asyncio.Queue for log entries.", "PARAM": "task_id (str) - ID of the task.", "RETURN": "asyncio.Queue - Queue for log entries." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "unsubscribe_logs", "type": "Function", - "start_line": 263, - "end_line": 273, + "start_line": 277, + "end_line": 290, "tags": { "PURPOSE": "Unsubscribes from real-time logs for a task.", + "PRE": "task_id is a string, queue is asyncio.Queue.", + "POST": "Queue removed from subscribers.", "PARAM": "queue (asyncio.Queue) - Queue to remove." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "load_persisted_tasks", "type": "Function", - "start_line": 275, - "end_line": 282, + "start_line": 292, + "end_line": 302, "tags": { - "PURPOSE": "Load persisted tasks using persistence service." + "PURPOSE": "Load persisted tasks using persistence service.", + "PRE": "None.", + "POST": "Persisted tasks loaded into self.tasks." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "await_input", "type": "Function", - "start_line": 284, - "end_line": 304, + "start_line": 304, + "end_line": 324, "tags": { "PURPOSE": "Transition a task to AWAITING_INPUT state with input request.", "PRE": "Task exists and is in RUNNING state.", @@ -7751,8 +7895,8 @@ { "name": "resume_task_with_password", "type": "Function", - "start_line": 306, - "end_line": 333, + "start_line": 326, + "end_line": 353, "tags": { "PURPOSE": "Resume a task that is awaiting input with provided passwords.", "PRE": "Task exists and is in AWAITING_INPUT state.", @@ -7770,25 +7914,20 @@ { "name": "clear_tasks", "type": "Function", - "start_line": 335, - "end_line": 373, + "start_line": 355, + "end_line": 395, "tags": { "PURPOSE": "Clears tasks based on status filter.", + "PRE": "status is Optional[TaskStatus].", + "POST": "Tasks matching filter (or all non-active) cleared from registry and database.", "PARAM": "status (Optional[TaskStatus]) - Filter by task status.", "RETURN": "int - Number of tasks cleared." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } } ], @@ -7990,7 +8129,7 @@ "name": "AuthModule", "type": "Module", "start_line": 1, - "end_line": 52, + "end_line": 59, "tags": { "SEMANTICS": "auth, authentication, adfs, oauth, middleware", "PURPOSE": "Implements ADFS authentication using Authlib for FastAPI. It provides a dependency to protect endpoints.", @@ -7998,7 +8137,30 @@ "RELATION": "Used by API routers to protect endpoints that require authentication." }, "relations": [], - "children": [], + "children": [ + { + "name": "get_current_user", + "type": "Function", + "start_line": 34, + "end_line": 58, + "tags": { + "PURPOSE": "Dependency to get the current user from the ADFS token.", + "PARAM": "token (str) - The OAuth2 bearer token.", + "PRE": "token should be provided via Authorization header.", + "POST": "Returns user details if authenticated, else raises 401.", + "RETURN": "Dict[str, str] - User information." + }, + "relations": [], + "children": [], + "compliance": { + "valid": false, + "issues": [ + "Missing Belief State Logging: Function should use belief_scope context manager.", + "Missing Belief State Logging: Function should use belief_scope context manager." + ] + } + } + ], "compliance": { "valid": true, "issues": [] @@ -8115,7 +8277,7 @@ "name": "backend.src.api.routes.environments", "type": "Module", "start_line": 1, - "end_line": 124, + "end_line": 133, "tags": { "SEMANTICS": "api, environments, superset, databases", "PURPOSE": "API endpoints for listing environments and their databases.", @@ -8176,70 +8338,55 @@ "name": "get_environments", "type": "Function", "start_line": 44, - "end_line": 64, + "end_line": 67, "tags": { "PURPOSE": "List all configured environments.", + "PRE": "config_manager is injected via Depends.", + "POST": "Returns a list of EnvironmentResponse objects.", "RETURN": "List[EnvironmentResponse]" }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "update_environment_schedule", "type": "Function", - "start_line": 66, - "end_line": 92, + "start_line": 69, + "end_line": 98, "tags": { "PURPOSE": "Update backup schedule for an environment.", + "PRE": "Environment id exists, schedule is valid ScheduleSchema.", + "POST": "Backup schedule updated and scheduler reloaded.", "PARAM": "schedule (ScheduleSchema) - The new schedule." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "get_environment_databases", "type": "Function", - "start_line": 94, - "end_line": 122, + "start_line": 100, + "end_line": 131, "tags": { "PURPOSE": "Fetch the list of databases from a specific environment.", + "PRE": "Environment id exists.", + "POST": "Returns a list of database summaries from the environment.", "PARAM": "id (str) - The environment ID.", "RETURN": "List[Dict] - List of databases." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } } ], @@ -8323,7 +8470,7 @@ "name": "PluginsRouter", "type": "Module", "start_line": 1, - "end_line": 22, + "end_line": 29, "tags": { "SEMANTICS": "api, router, plugins, list", "PURPOSE": "Defines the FastAPI router for plugin-related endpoints, allowing clients to list available plugins.", @@ -8331,7 +8478,26 @@ "RELATION": "Depends on the PluginLoader and PluginConfig. It is included by the main app." }, "relations": [], - "children": [], + "children": [ + { + "name": "list_plugins", + "type": "Function", + "start_line": 14, + "end_line": 28, + "tags": { + "PURPOSE": "Retrieve a list of all available plugins.", + "PRE": "plugin_loader is injected via Depends.", + "POST": "Returns a list of PluginConfig objects.", + "RETURN": "List[PluginConfig] - List of registered plugins." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + } + ], "compliance": { "valid": true, "issues": [] @@ -8341,7 +8507,7 @@ "name": "backend.src.api.routes.mappings", "type": "Module", "start_line": 1, - "end_line": 110, + "end_line": 119, "tags": { "SEMANTICS": "api, mappings, database, fuzzy-matching", "PURPOSE": "API endpoints for managing database mappings and getting suggestions.", @@ -8406,66 +8572,51 @@ "name": "get_mappings", "type": "Function", "start_line": 54, - "end_line": 68, + "end_line": 71, "tags": { - "PURPOSE": "List all saved database mappings." + "PURPOSE": "List all saved database mappings.", + "PRE": "db session is injected.", + "POST": "Returns filtered list of DatabaseMapping records." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "create_mapping", "type": "Function", - "start_line": 70, - "end_line": 93, + "start_line": 73, + "end_line": 99, "tags": { - "PURPOSE": "Create or update a database mapping." + "PURPOSE": "Create or update a database mapping.", + "PRE": "mapping is valid MappingCreate, db session is injected.", + "POST": "DatabaseMapping created or updated in database." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "suggest_mappings_api", "type": "Function", - "start_line": 95, - "end_line": 108, + "start_line": 101, + "end_line": 117, "tags": { - "PURPOSE": "Get suggested mappings based on fuzzy matching." + "PURPOSE": "Get suggested mappings based on fuzzy matching.", + "PRE": "request is valid SuggestRequest, config_manager is injected.", + "POST": "Returns mapping suggestions." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } } ], @@ -8478,7 +8629,7 @@ "name": "SettingsRouter", "type": "Module", "start_line": 1, - "end_line": 218, + "end_line": 242, "tags": { "SEMANTICS": "settings, api, router, fastapi", "PURPOSE": "Provides API endpoints for managing application settings and Superset environments.", @@ -8501,189 +8652,149 @@ "name": "get_settings", "type": "Function", "start_line": 26, - "end_line": 38, + "end_line": 41, "tags": { "PURPOSE": "Retrieves all application settings.", + "PRE": "Config manager is available.", + "POST": "Returns masked AppConfig.", "RETURN": "AppConfig - The current configuration." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "update_global_settings", "type": "Function", - "start_line": 40, - "end_line": 52, + "start_line": 43, + "end_line": 58, "tags": { "PURPOSE": "Updates global application settings.", + "PRE": "New settings are provided.", + "POST": "Global settings are updated.", "PARAM": "settings (GlobalSettings) - The new global settings.", "RETURN": "GlobalSettings - The updated settings." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "get_environments", "type": "Function", - "start_line": 54, - "end_line": 61, + "start_line": 60, + "end_line": 70, "tags": { "PURPOSE": "Lists all configured Superset environments.", + "PRE": "Config manager is available.", + "POST": "Returns list of environments.", "RETURN": "List[Environment] - List of environments." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "add_environment", "type": "Function", - "start_line": 63, - "end_line": 94, + "start_line": 72, + "end_line": 106, "tags": { "PURPOSE": "Adds a new Superset environment.", + "PRE": "Environment data is valid and reachable.", + "POST": "Environment is added to config.", "PARAM": "env (Environment) - The environment to add.", "RETURN": "Environment - The added environment." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "update_environment", "type": "Function", - "start_line": 96, - "end_line": 137, + "start_line": 108, + "end_line": 152, "tags": { "PURPOSE": "Updates an existing Superset environment.", + "PRE": "ID and valid environment data are provided.", + "POST": "Environment is updated in config.", "PARAM": "env (Environment) - The updated environment data.", "RETURN": "Environment - The updated environment." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "delete_environment", "type": "Function", - "start_line": 139, - "end_line": 150, + "start_line": 154, + "end_line": 168, "tags": { "PURPOSE": "Deletes a Superset environment.", + "PRE": "ID is provided.", + "POST": "Environment is removed from config.", "PARAM": "id (str) - The ID of the environment to delete." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "test_environment_connection", "type": "Function", - "start_line": 152, - "end_line": 193, + "start_line": 170, + "end_line": 214, "tags": { "PURPOSE": "Tests the connection to a Superset environment.", + "PRE": "ID is provided.", + "POST": "Returns success or error status.", "PARAM": "id (str) - The ID of the environment to test.", "RETURN": "dict - Success message or error." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { "name": "validate_backup_path", "type": "Function", - "start_line": 195, - "end_line": 216, + "start_line": 216, + "end_line": 240, "tags": { "PURPOSE": "Validates if a backup path exists and is writable.", + "PRE": "Path is provided in path_data.", + "POST": "Returns success or error status.", "PARAM": "path (str) - The path to validate.", "RETURN": "dict - Validation result." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } } ], @@ -8696,7 +8807,7 @@ "name": "TasksRouter", "type": "Module", "start_line": 1, - "end_line": 120, + "end_line": 187, "tags": { "SEMANTICS": "api, router, tasks, create, list, get", "PURPOSE": "Defines the FastAPI router for task-related endpoints, allowing clients to create, list, and get the status of tasks.", @@ -8704,7 +8815,140 @@ "RELATION": "Depends on the TaskManager. It is included by the main app." }, "relations": [], - "children": [], + "children": [ + { + "name": "create_task", + "type": "Function", + "start_line": 27, + "end_line": 50, + "tags": { + "PURPOSE": "Create and start a new task for a given plugin.", + "PARAM": "task_manager (TaskManager) - The task manager instance.", + "PRE": "plugin_id must exist and params must be valid for that plugin.", + "POST": "A new task is created and started.", + "RETURN": "Task - The created task instance." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "list_tasks", + "type": "Function", + "start_line": 53, + "end_line": 73, + "tags": { + "PURPOSE": "Retrieve a list of tasks with pagination and optional status filter.", + "PARAM": "task_manager (TaskManager) - The task manager instance.", + "PRE": "task_manager must be available.", + "POST": "Returns a list of tasks.", + "RETURN": "List[Task] - List of tasks." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "get_task", + "type": "Function", + "start_line": 76, + "end_line": 95, + "tags": { + "PURPOSE": "Retrieve the details of a specific task.", + "PARAM": "task_manager (TaskManager) - The task manager instance.", + "PRE": "task_id must exist.", + "POST": "Returns task details or raises 404.", + "RETURN": "Task - The task details." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "get_task_logs", + "type": "Function", + "start_line": 98, + "end_line": 117, + "tags": { + "PURPOSE": "Retrieve logs for a specific task.", + "PARAM": "task_manager (TaskManager) - The task manager instance.", + "PRE": "task_id must exist.", + "POST": "Returns a list of log entries or raises 404.", + "RETURN": "List[LogEntry] - List of log entries." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "resolve_task", + "type": "Function", + "start_line": 120, + "end_line": 142, + "tags": { + "PURPOSE": "Resolve a task that is awaiting mapping.", + "PARAM": "task_manager (TaskManager) - The task manager instance.", + "PRE": "task must be in AWAITING_MAPPING status.", + "POST": "Task is resolved and resumes execution.", + "RETURN": "Task - The updated task object." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "resume_task", + "type": "Function", + "start_line": 145, + "end_line": 167, + "tags": { + "PURPOSE": "Resume a task that is awaiting input (e.g., passwords).", + "PARAM": "task_manager (TaskManager) - The task manager instance.", + "PRE": "task must be in AWAITING_INPUT status.", + "POST": "Task resumes execution with provided input.", + "RETURN": "Task - The updated task object." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "clear_tasks", + "type": "Function", + "start_line": 170, + "end_line": 186, + "tags": { + "PURPOSE": "Clear tasks matching the status filter.", + "PARAM": "task_manager (TaskManager) - The task manager instance.", + "PRE": "task_manager is available.", + "POST": "Tasks are removed from memory/persistence." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + } + ], "compliance": { "valid": true, "issues": [] @@ -8930,7 +9174,7 @@ "name": "backend.src.services.mapping_service", "type": "Module", "start_line": 1, - "end_line": 69, + "end_line": 82, "tags": { "SEMANTICS": "service, mapping, fuzzy-matching, superset", "PURPOSE": "Orchestrates database fetching and fuzzy matching suggestions.", @@ -8951,88 +9195,67 @@ { "name": "MappingService", "type": "Class", - "start_line": 18, - "end_line": 67, + "start_line": 19, + "end_line": 80, "tags": { "PURPOSE": "Service for handling database mapping logic." }, "relations": [], "children": [ { - "name": "MappingService.__init__", + "name": "__init__", "type": "Function", - "start_line": 22, - "end_line": 26, + "start_line": 23, + "end_line": 31, "tags": { - "PURPOSE": "Initializes the mapping service with a config manager." + "PURPOSE": "Initializes the mapping service with a config manager.", + "PRE": "config_manager is provided.", + "PARAM": "config_manager (ConfigManager) - The configuration manager.", + "POST": "Service is initialized." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "MappingService._get_client", + "name": "_get_client", "type": "Function", - "start_line": 28, - "end_line": 47, + "start_line": 33, + "end_line": 57, "tags": { - "PURPOSE": "Helper to get an initialized SupersetClient for an environment." + "PURPOSE": "Helper to get an initialized SupersetClient for an environment.", + "PARAM": "env_id (str) - The ID of the environment.", + "PRE": "environment must exist in config.", + "POST": "Returns an initialized SupersetClient.", + "RETURN": "SupersetClient - Initialized client." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "MappingService.get_suggestions", + "name": "get_suggestions", "type": "Function", - "start_line": 49, - "end_line": 65, + "start_line": 59, + "end_line": 78, "tags": { "PURPOSE": "Fetches databases from both environments and returns fuzzy matching suggestions.", "PARAM": "target_env_id (str) - Target environment ID.", + "PRE": "Both environments must be accessible.", + "POST": "Returns fuzzy-matched database suggestions.", "RETURN": "List[Dict] - Suggested mappings." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } } ], @@ -9051,7 +9274,7 @@ "name": "BackupPlugin", "type": "Module", "start_line": 1, - "end_line": 149, + "end_line": 192, "tags": { "SEMANTICS": "backup, superset, automation, dashboard, plugin", "PURPOSE": "A plugin that provides functionality to back up Superset dashboards.", @@ -9075,13 +9298,122 @@ { "name": "BackupPlugin", "type": "Class", - "start_line": 28, - "end_line": 148, + "start_line": 29, + "end_line": 191, "tags": { "PURPOSE": "Implementation of the backup plugin logic." }, "relations": [], - "children": [], + "children": [ + { + "name": "id", + "type": "Function", + "start_line": 37, + "end_line": 45, + "tags": { + "PURPOSE": "Returns the unique identifier for the backup plugin.", + "PRE": "Plugin instance exists.", + "POST": "Returns string ID.", + "RETURN": "str - \"superset-backup\"" + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "name", + "type": "Function", + "start_line": 48, + "end_line": 56, + "tags": { + "PURPOSE": "Returns the human-readable name of the backup plugin.", + "PRE": "Plugin instance exists.", + "POST": "Returns string name.", + "RETURN": "str - Plugin name." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "description", + "type": "Function", + "start_line": 59, + "end_line": 67, + "tags": { + "PURPOSE": "Returns a description of the backup plugin.", + "PRE": "Plugin instance exists.", + "POST": "Returns string description.", + "RETURN": "str - Plugin description." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "version", + "type": "Function", + "start_line": 70, + "end_line": 78, + "tags": { + "PURPOSE": "Returns the version of the backup plugin.", + "PRE": "Plugin instance exists.", + "POST": "Returns string version.", + "RETURN": "str - \"1.0.0\"" + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "get_schema", + "type": "Function", + "start_line": 80, + "end_line": 109, + "tags": { + "PURPOSE": "Returns the JSON schema for backup plugin parameters.", + "PRE": "Plugin instance exists.", + "POST": "Returns dictionary schema.", + "RETURN": "Dict[str, Any] - JSON schema." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "execute", + "type": "Function", + "start_line": 111, + "end_line": 190, + "tags": { + "PURPOSE": "Executes the dashboard backup logic.", + "PARAM": "params (Dict[str, Any]) - Backup parameters (env, backup_path).", + "PRE": "Target environment must be configured. params must be a dictionary.", + "POST": "All dashboards are exported and archived." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + } + ], "compliance": { "valid": true, "issues": [] @@ -9097,7 +9429,7 @@ "name": "DebugPluginModule", "type": "Module", "start_line": 1, - "end_line": 149, + "end_line": 187, "tags": { "SEMANTICS": "plugin, debug, api, database, superset", "PURPOSE": "Implements a plugin for system diagnostics and debugging Superset API responses.", @@ -9111,67 +9443,129 @@ "name": "DebugPlugin", "type": "Class", "start_line": 15, - "end_line": 148, + "end_line": 186, "tags": { "PURPOSE": "Plugin for system diagnostics and debugging." }, "relations": [], "children": [ { - "name": "DebugPlugin.get_schema", + "name": "id", "type": "Function", - "start_line": 38, - "end_line": 73, + "start_line": 23, + "end_line": 31, "tags": { - "PURPOSE": "Returns the JSON schema for the debug plugin parameters." + "PURPOSE": "Returns the unique identifier for the debug plugin.", + "PRE": "Plugin instance exists.", + "POST": "Returns string ID.", + "RETURN": "str - \"system-debug\"" }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "DebugPlugin.execute", + "name": "name", "type": "Function", - "start_line": 75, - "end_line": 87, + "start_line": 34, + "end_line": 42, "tags": { - "PURPOSE": "Executes the debug logic." + "PURPOSE": "Returns the human-readable name of the debug plugin.", + "PRE": "Plugin instance exists.", + "POST": "Returns string name.", + "RETURN": "str - Plugin name." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST" - ] + "valid": true, + "issues": [] } }, { - "name": "DebugPlugin._test_db_api", + "name": "description", "type": "Function", - "start_line": 89, - "end_line": 120, + "start_line": 45, + "end_line": 53, + "tags": { + "PURPOSE": "Returns a description of the debug plugin.", + "PRE": "Plugin instance exists.", + "POST": "Returns string description.", + "RETURN": "str - Plugin description." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "version", + "type": "Function", + "start_line": 56, + "end_line": 64, + "tags": { + "PURPOSE": "Returns the version of the debug plugin.", + "PRE": "Plugin instance exists.", + "POST": "Returns string version.", + "RETURN": "str - \"1.0.0\"" + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "get_schema", + "type": "Function", + "start_line": 66, + "end_line": 105, + "tags": { + "PURPOSE": "Returns the JSON schema for the debug plugin parameters.", + "PRE": "Plugin instance exists.", + "POST": "Returns dictionary schema.", + "RETURN": "Dict[str, Any] - JSON schema." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "execute", + "type": "Function", + "start_line": 107, + "end_line": 123, + "tags": { + "PURPOSE": "Executes the debug logic.", + "PARAM": "params (Dict[str, Any]) - Debug parameters.", + "PRE": "action must be provided in params.", + "POST": "Debug action is executed and results returned.", + "RETURN": "Dict[str, Any] - Execution results." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "_test_db_api", + "type": "Function", + "start_line": 125, + "end_line": 157, "tags": { "PURPOSE": "Tests database API connectivity for source and target environments.", - "PRE": "source_env and target_env params exist.", + "PRE": "source_env and target_env params exist in params.", "POST": "Returns DB counts for both envs.", "PARAM": "params (Dict) - Plugin parameters.", "RETURN": "Dict - Comparison results." @@ -9179,22 +9573,18 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "DebugPlugin._get_dataset_structure", + "name": "_get_dataset_structure", "type": "Function", - "start_line": 122, - "end_line": 146, + "start_line": 159, + "end_line": 184, "tags": { "PURPOSE": "Retrieves the structure of a dataset.", - "PRE": "env and dataset_id params exist.", + "PRE": "env and dataset_id params exist in params.", "POST": "Returns dataset JSON structure.", "PARAM": "params (Dict) - Plugin parameters.", "RETURN": "Dict - Dataset structure." @@ -9202,12 +9592,8 @@ "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } } ], @@ -9226,7 +9612,7 @@ "name": "SearchPluginModule", "type": "Module", "start_line": 1, - "end_line": 161, + "end_line": 202, "tags": { "SEMANTICS": "plugin, search, datasets, regex, superset", "PURPOSE": "Implements a plugin for searching text patterns across all datasets in a specific Superset environment.", @@ -9240,46 +9626,22 @@ "name": "SearchPlugin", "type": "Class", "start_line": 16, - "end_line": 160, + "end_line": 201, "tags": { "PURPOSE": "Plugin for searching text patterns in Superset datasets." }, "relations": [], "children": [ { - "name": "SearchPlugin.get_schema", + "name": "id", "type": "Function", - "start_line": 39, - "end_line": 58, + "start_line": 24, + "end_line": 32, "tags": { - "PURPOSE": "Returns the JSON schema for the search plugin parameters." - }, - "relations": [], - "children": [], - "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] - } - }, - { - "name": "SearchPlugin.execute", - "type": "Function", - "start_line": 60, - "end_line": 127, - "tags": { - "PURPOSE": "Executes the dataset search logic.", - "PRE": "Params contain valid 'env' and 'query'.", - "POST": "Returns a dictionary with count and results list." + "PURPOSE": "Returns the unique identifier for the search plugin.", + "PRE": "Plugin instance exists.", + "POST": "Returns string ID.", + "RETURN": "str - \"search-datasets\"" }, "relations": [], "children": [], @@ -9289,28 +9651,113 @@ } }, { - "name": "SearchPlugin._get_context", + "name": "name", "type": "Function", - "start_line": 129, - "end_line": 158, + "start_line": 35, + "end_line": 43, "tags": { - "PURPOSE": "Extracts a small context around the match for display." + "PURPOSE": "Returns the human-readable name of the search plugin.", + "PRE": "Plugin instance exists.", + "POST": "Returns string name.", + "RETURN": "str - Plugin name." }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] + } + }, + { + "name": "description", + "type": "Function", + "start_line": 46, + "end_line": 54, + "tags": { + "PURPOSE": "Returns a description of the search plugin.", + "PRE": "Plugin instance exists.", + "POST": "Returns string description.", + "RETURN": "str - Plugin description." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "version", + "type": "Function", + "start_line": 57, + "end_line": 65, + "tags": { + "PURPOSE": "Returns the version of the search plugin.", + "PRE": "Plugin instance exists.", + "POST": "Returns string version.", + "RETURN": "str - \"1.0.0\"" + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "get_schema", + "type": "Function", + "start_line": 67, + "end_line": 90, + "tags": { + "PURPOSE": "Returns the JSON schema for the search plugin parameters.", + "PRE": "Plugin instance exists.", + "POST": "Returns dictionary schema.", + "RETURN": "Dict[str, Any] - JSON schema." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "execute", + "type": "Function", + "start_line": 92, + "end_line": 161, + "tags": { + "PURPOSE": "Executes the dataset search logic.", + "PARAM": "params (Dict[str, Any]) - Search parameters.", + "PRE": "Params contain valid 'env' and 'query'.", + "POST": "Returns a dictionary with count and results list.", + "RETURN": "Dict[str, Any] - Search results." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "_get_context", + "type": "Function", + "start_line": 163, + "end_line": 199, + "tags": { + "PURPOSE": "Extracts a small context around the match for display.", + "PARAM": "context_lines (int) - Number of lines of context to include.", + "PRE": "text and match_text must be strings.", + "POST": "Returns context string.", + "RETURN": "str - Extracted context." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] } } ], @@ -9329,7 +9776,7 @@ "name": "MapperPluginModule", "type": "Module", "start_line": 1, - "end_line": 164, + "end_line": 198, "tags": { "SEMANTICS": "plugin, mapper, datasets, postgresql, excel", "PURPOSE": "Implements a plugin for mapping dataset columns using external database connections or Excel files.", @@ -9343,46 +9790,113 @@ "name": "MapperPlugin", "type": "Class", "start_line": 19, - "end_line": 163, + "end_line": 197, "tags": { "PURPOSE": "Plugin for mapping dataset columns verbose names." }, "relations": [], "children": [ { - "name": "MapperPlugin.get_schema", + "name": "id", "type": "Function", - "start_line": 42, - "end_line": 88, + "start_line": 27, + "end_line": 35, "tags": { - "PURPOSE": "Returns the JSON schema for the mapper plugin parameters." + "PURPOSE": "Returns the unique identifier for the mapper plugin.", + "PRE": "Plugin instance exists.", + "POST": "Returns string ID.", + "RETURN": "str - \"dataset-mapper\"" }, "relations": [], "children": [], "compliance": { - "valid": false, - "issues": [ - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager.", - "Missing Mandatory Tag: @PRE", - "Missing Mandatory Tag: @POST", - "Missing Belief State Logging: Function should use belief_scope context manager." - ] + "valid": true, + "issues": [] } }, { - "name": "MapperPlugin.execute", + "name": "name", "type": "Function", - "start_line": 90, - "end_line": 161, + "start_line": 38, + "end_line": 46, + "tags": { + "PURPOSE": "Returns the human-readable name of the mapper plugin.", + "PRE": "Plugin instance exists.", + "POST": "Returns string name.", + "RETURN": "str - Plugin name." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "description", + "type": "Function", + "start_line": 49, + "end_line": 57, + "tags": { + "PURPOSE": "Returns a description of the mapper plugin.", + "PRE": "Plugin instance exists.", + "POST": "Returns string description.", + "RETURN": "str - Plugin description." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "version", + "type": "Function", + "start_line": 60, + "end_line": 68, + "tags": { + "PURPOSE": "Returns the version of the mapper plugin.", + "PRE": "Plugin instance exists.", + "POST": "Returns string version.", + "RETURN": "str - \"1.0.0\"" + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "get_schema", + "type": "Function", + "start_line": 70, + "end_line": 120, + "tags": { + "PURPOSE": "Returns the JSON schema for the mapper plugin parameters.", + "PRE": "Plugin instance exists.", + "POST": "Returns dictionary schema.", + "RETURN": "Dict[str, Any] - JSON schema." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "execute", + "type": "Function", + "start_line": 122, + "end_line": 195, "tags": { "PURPOSE": "Executes the dataset mapping logic.", - "PRE": "Params contain valid 'env', 'dataset_id', and 'source'.", - "POST": "Updates the dataset in Superset." + "PARAM": "params (Dict[str, Any]) - Mapping parameters.", + "PRE": "Params contain valid 'env', 'dataset_id', and 'source'. params must be a dictionary.", + "POST": "Updates the dataset in Superset.", + "RETURN": "Dict[str, Any] - Execution status." }, "relations": [], "children": [], @@ -9407,7 +9921,7 @@ "name": "MigrationPlugin", "type": "Module", "start_line": 1, - "end_line": 300, + "end_line": 390, "tags": { "SEMANTICS": "migration, superset, automation, dashboard, plugin", "PURPOSE": "A plugin that provides functionality to migrate Superset dashboards between environments.", @@ -9431,20 +9945,23 @@ { "name": "MigrationPlugin", "type": "Class", - "start_line": 24, - "end_line": 299, + "start_line": 25, + "end_line": 389, "tags": { "PURPOSE": "Implementation of the migration plugin logic." }, "relations": [], "children": [ { - "name": "MigrationPlugin.execute", - "type": "Action", - "start_line": 105, - "end_line": 292, + "name": "id", + "type": "Function", + "start_line": 33, + "end_line": 41, "tags": { - "PURPOSE": "Execute the migration logic with proper task logging." + "PURPOSE": "Returns the unique identifier for the migration plugin.", + "PRE": "None.", + "POST": "Returns \"superset-migration\".", + "RETURN": "str - \"superset-migration\"" }, "relations": [], "children": [], @@ -9452,6 +9969,232 @@ "valid": true, "issues": [] } + }, + { + "name": "name", + "type": "Function", + "start_line": 44, + "end_line": 52, + "tags": { + "PURPOSE": "Returns the human-readable name of the migration plugin.", + "PRE": "None.", + "POST": "Returns the plugin name.", + "RETURN": "str - Plugin name." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "description", + "type": "Function", + "start_line": 55, + "end_line": 63, + "tags": { + "PURPOSE": "Returns a description of the migration plugin.", + "PRE": "None.", + "POST": "Returns the plugin description.", + "RETURN": "str - Plugin description." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "version", + "type": "Function", + "start_line": 66, + "end_line": 74, + "tags": { + "PURPOSE": "Returns the version of the migration plugin.", + "PRE": "None.", + "POST": "Returns \"1.0.0\".", + "RETURN": "str - \"1.0.0\"" + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "get_schema", + "type": "Function", + "start_line": 76, + "end_line": 125, + "tags": { + "PURPOSE": "Returns the JSON schema for migration plugin parameters.", + "PRE": "Config manager is available.", + "POST": "Returns a valid JSON schema dictionary.", + "RETURN": "Dict[str, Any] - JSON schema." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "execute", + "type": "Function", + "start_line": 127, + "end_line": 388, + "tags": { + "PURPOSE": "Executes the dashboard migration logic.", + "PARAM": "params (Dict[str, Any]) - Migration parameters.", + "PRE": "Source and target environments must be configured.", + "POST": "Selected dashboards are migrated." + }, + "relations": [], + "children": [ + { + "name": "MigrationPlugin.execute", + "type": "Action", + "start_line": 147, + "end_line": 387, + "tags": { + "PURPOSE": "Execute the migration logic with proper task logging." + }, + "relations": [], + "children": [ + { + "name": "__init__", + "type": "Function", + "start_line": 154, + "end_line": 162, + "tags": { + "PURPOSE": "Initializes the proxy logger.", + "PRE": "None.", + "POST": "Instance is initialized." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "debug", + "type": "Function", + "start_line": 164, + "end_line": 171, + "tags": { + "PURPOSE": "Logs a debug message to the task manager.", + "PRE": "msg is a string.", + "POST": "Log is added to task manager if task_id exists." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "info", + "type": "Function", + "start_line": 173, + "end_line": 180, + "tags": { + "PURPOSE": "Logs an info message to the task manager.", + "PRE": "msg is a string.", + "POST": "Log is added to task manager if task_id exists." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "warning", + "type": "Function", + "start_line": 182, + "end_line": 189, + "tags": { + "PURPOSE": "Logs a warning message to the task manager.", + "PRE": "msg is a string.", + "POST": "Log is added to task manager if task_id exists." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "error", + "type": "Function", + "start_line": 191, + "end_line": 198, + "tags": { + "PURPOSE": "Logs an error message to the task manager.", + "PRE": "msg is a string.", + "POST": "Log is added to task manager if task_id exists." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "critical", + "type": "Function", + "start_line": 200, + "end_line": 207, + "tags": { + "PURPOSE": "Logs a critical message to the task manager.", + "PRE": "msg is a string.", + "POST": "Log is added to task manager if task_id exists." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "exception", + "type": "Function", + "start_line": 209, + "end_line": 216, + "tags": { + "PURPOSE": "Logs an exception message to the task manager.", + "PRE": "msg is a string.", + "POST": "Log is added to task manager if task_id exists." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + } + ], + "compliance": { + "valid": true, + "issues": [] + } + } + ], + "compliance": { + "valid": true, + "issues": [] + } } ], "compliance": { @@ -9464,6 +10207,91 @@ "valid": true, "issues": [] } + }, + { + "name": "test_superset_config_url_normalization", + "type": "Function", + "start_line": 5, + "end_line": 41, + "tags": { + "PURPOSE": "Tests that SupersetConfig correctly normalizes the base URL.", + "PRE": "SupersetConfig class is available.", + "POST": "URL normalization is verified." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "test_superset_config_invalid_url", + "type": "Function", + "start_line": 43, + "end_line": 62, + "tags": { + "PURPOSE": "Tests that SupersetConfig raises ValueError for invalid URLs.", + "PRE": "SupersetConfig class is available.", + "POST": "ValueError is raised for invalid URLs." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "test_belief_scope_logs_entry_action_exit", + "type": "Function", + "start_line": 5, + "end_line": 22, + "tags": { + "PURPOSE": "Test that belief_scope generates [ID][Entry], [ID][Action], and [ID][Exit] logs.", + "PRE": "belief_scope is available. caplog fixture is used.", + "POST": "Logs are verified to contain Entry, Action, and Exit tags." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "test_belief_scope_error_handling", + "type": "Function", + "start_line": 25, + "end_line": 42, + "tags": { + "PURPOSE": "Test that belief_scope logs Coherence:Failed on exception.", + "PRE": "belief_scope is available. caplog fixture is used.", + "POST": "Logs are verified to contain Coherence:Failed tag." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } + }, + { + "name": "test_belief_scope_success_coherence", + "type": "Function", + "start_line": 45, + "end_line": 59, + "tags": { + "PURPOSE": "Test that belief_scope logs Coherence:OK on success.", + "PRE": "belief_scope is available. caplog fixture is used.", + "POST": "Logs are verified to contain Coherence:OK tag." + }, + "relations": [], + "children": [], + "compliance": { + "valid": true, + "issues": [] + } } ] } \ No newline at end of file diff --git a/specs/project_map.md b/specs/project_map.md index 7310bd1..4d5af6c 100644 --- a/specs/project_map.md +++ b/specs/project_map.md @@ -5,6 +5,12 @@ - 📦 **generate_semantic_map** (`Module`) - 📝 Scans the codebase to generate a Semantic Map and Compliance Report based on the System Standard. - 🏗️ Layer: DevOps/Tooling + - ƒ **__init__** (`Function`) + - 📝 Mock init. + - ƒ **__enter__** (`Function`) + - 📝 Mock enter. + - ƒ **__exit__** (`Function`) + - 📝 Mock exit. - ℂ **SemanticEntity** (`Class`) - 📝 Represents a code entity (Module, Function, Component) found during parsing. - ƒ **__init__** (`Function`) @@ -142,6 +148,15 @@ - 🔗 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 @@ -239,24 +254,28 @@ - 📦 **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`, которая упрощает конфигурацию и использование логгеров. - - ƒ **SupersetLogger.__init__** (`Function`) + - ƒ **__init__** (`Function`) - 📝 Конфигурирует и инициализирует логгер, добавляя обработчики для файла и/или консоли. - - ƒ **SupersetLogger._log** (`Function`) + - ƒ **_log** (`Function`) - 📝 (Helper) Универсальный метод для вызова соответствующего уровня логирования. - - ƒ **SupersetLogger.info** (`Function`) + - ƒ **info** (`Function`) - 📝 Записывает сообщение уровня INFO. - - ƒ **SupersetLogger.debug** (`Function`) + - ƒ **debug** (`Function`) - 📝 Записывает сообщение уровня DEBUG. - - ƒ **SupersetLogger.warning** (`Function`) + - ƒ **warning** (`Function`) - 📝 Записывает сообщение уровня WARNING. - - ƒ **SupersetLogger.error** (`Function`) + - ƒ **error** (`Function`) - 📝 Записывает сообщение уровня ERROR. - - ƒ **SupersetLogger.critical** (`Function`) + - ƒ **critical** (`Function`) - 📝 Записывает сообщение уровня CRITICAL. - - ƒ **SupersetLogger.exception** (`Function`) + - ƒ **exception** (`Function`) - 📝 Записывает сообщение уровня ERROR вместе с трассировкой стека текущего исключения. + - 📦 **belief_scope** (`Method`) + - 📝 Instance method wrapper for belief_scope context manager. - 📦 **superset_tool.utils.fileio** (`Module`) - 📝 Предоставляет набор утилит для управления файловыми операциями, включая работу с временными файлами, архивами ZIP, файлами YAML и очистку директорий. - 🏗️ Layer: Infra @@ -286,6 +305,8 @@ - 🔗 CALLS -> `_update_yaml_file` - ƒ **_update_yaml_file** (`Function`) - 📝 (Helper) Обновляет один YAML файл. + - ƒ **replacer** (`Function`) + - 📝 Функция замены, сохраняющая кавычки если они были. - ƒ **create_dashboard_export** (`Function`) - 📝 Создает ZIP-архив из указанных исходных путей. - ƒ **sanitize_filename** (`Function`) @@ -302,27 +323,27 @@ - 🔗 DEPENDS_ON -> `requests` - ℂ **APIClient** (`Class`) - 📝 Инкапсулирует HTTP-логику для работы с API, включая сессии, аутентификацию, и обработку запросов. - - ƒ **APIClient.__init__** (`Function`) + - ƒ **__init__** (`Function`) - 📝 Инициализирует API клиент с конфигурацией, сессией и логгером. - - ƒ **APIClient._init_session** (`Function`) + - ƒ **_init_session** (`Function`) - 📝 Создает и настраивает `requests.Session` с retry-логикой. - - ƒ **APIClient.authenticate** (`Function`) + - ƒ **authenticate** (`Function`) - 📝 Выполняет аутентификацию в Superset API и получает access и CSRF токены. - - ƒ **APIClient.headers** (`Function`) + - ƒ **headers** (`Function`) - 📝 Возвращает HTTP-заголовки для аутентифицированных запросов. - - ƒ **APIClient.request** (`Function`) + - ƒ **request** (`Function`) - 📝 Выполняет универсальный HTTP-запрос к API. - - ƒ **APIClient._handle_http_error** (`Function`) + - ƒ **_handle_http_error** (`Function`) - 📝 (Helper) Преобразует HTTP ошибки в кастомные исключения. - - ƒ **APIClient._handle_network_error** (`Function`) + - ƒ **_handle_network_error** (`Function`) - 📝 (Helper) Преобразует сетевые ошибки в `NetworkError`. - - ƒ **APIClient.upload_file** (`Function`) + - ƒ **upload_file** (`Function`) - 📝 Загружает файл на сервер через multipart/form-data. - - ƒ **APIClient._perform_upload** (`Function`) + - ƒ **_perform_upload** (`Function`) - 📝 (Helper) Выполняет POST запрос с файлом. - - ƒ **APIClient.fetch_paginated_count** (`Function`) + - ƒ **fetch_paginated_count** (`Function`) - 📝 Получает общее количество элементов для пагинации. - - ƒ **APIClient.fetch_paginated_data** (`Function`) + - ƒ **fetch_paginated_data** (`Function`) - 📝 Автоматически собирает данные со всех страниц пагинированного эндпоинта. - 📦 **superset_tool.utils.whiptail_fallback** (`Module`) - 📝 Предоставляет плотный консольный UI-fallback для интерактивных диалогов, имитируя `whiptail` для систем, где он недоступен. @@ -339,6 +360,16 @@ - 📝 Запрашивает у пользователя текстовый ввод. - ℂ **_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`) @@ -349,11 +380,13 @@ - 🔗 DEPENDS_ON -> `psycopg2` - ℂ **DatasetMapper** (`Class`) - 📝 Класс для меппинга и обновления verbose_map в датасетах Superset. - - ƒ **DatasetMapper.get_postgres_comments** (`Function`) + - ƒ **__init__** (`Function`) + - 📝 Initializes the mapper. + - ƒ **get_postgres_comments** (`Function`) - 📝 Извлекает комментарии к колонкам из системного каталога PostgreSQL. - - ƒ **DatasetMapper.load_excel_mappings** (`Function`) + - ƒ **load_excel_mappings** (`Function`) - 📝 Загружает меппинги 'column_name' -> 'column_comment' из XLSX файла. - - ƒ **DatasetMapper.run_mapping** (`Function`) + - ƒ **run_mapping** (`Function`) - 📝 Основная функция для выполнения меппинга и обновления verbose_map датасета в Superset. - 🔗 CALLS -> `self.get_postgres_comments` - 🔗 CALLS -> `self.load_excel_mappings` @@ -415,6 +448,20 @@ - 📝 Generic request wrapper. - 📦 **api** (`Data`) - 📝 API client object with specific methods. +- ƒ **selectPlugin** (`Function`) + - 📝 Handles plugin selection and navigation. +- ƒ **handleFormSubmit** (`Function`) + - 📝 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. - 🧩 **MigrationDashboard** (`Component`) - 📝 Main dashboard for configuring and starting migrations. - 🏗️ Layer: Page @@ -452,9 +499,25 @@ - 🧩 **DebugPage** (`Component`) - 📝 Page for system diagnostics and debugging. - 🏗️ Layer: UI +- ƒ **handleSaveGlobal** (`Function`) + - 📝 Saves global application settings. +- ƒ **handleAddOrUpdateEnv** (`Function`) + - 📝 Adds a new environment or updates an existing one. +- ƒ **handleDeleteEnv** (`Function`) + - 📝 Deletes a Superset environment. +- ƒ **handleTestEnv** (`Function`) + - 📝 Tests the connection to a Superset environment. +- ƒ **editEnv** (`Function`) + - 📝 Populates the environment form for editing. +- ƒ **resetEnvForm** (`Function`) + - 📝 Resets the environment creation/edit form to default state. +- ƒ **load** (`Function`) + - 📝 Loads application settings and environment list. - 🧩 **ConnectionsSettingsPage** (`Component`) - 📝 Page for managing database connection configurations. - 🏗️ Layer: UI + - ƒ **handleSuccess** (`Function`) + - 📝 Refreshes the connection list after a successful creation. - 🧩 **Dashboard** (`Component`) - 📝 Displays the list of available plugins and allows selecting one. - 🏗️ Layer: UI @@ -479,6 +542,28 @@ - 📝 Sets the form to edit an existing environment. - ƒ **resetEnvForm** (`Function`) - 📝 Resets the environment form. +- ƒ **getConnections** (`Function`) + - 📝 Fetch a list of saved connections. +- ƒ **createConnection** (`Function`) + - 📝 Create a new connection configuration. +- ƒ **deleteConnection** (`Function`) + - 📝 Delete a connection configuration. +- ƒ **runTask** (`Function`) + - 📝 Start a new task for a given plugin. +- ƒ **getTaskStatus** (`Function`) + - 📝 Fetch details for a specific task (to poll status or get result). +- ƒ **getTasks** (`Function`) + - 📝 Fetch a list of tasks with pagination and optional status filter. +- ƒ **getTask** (`Function`) + - 📝 Fetch details for a specific task. +- ƒ **getTaskLogs** (`Function`) + - 📝 Fetch logs for a specific task. +- ƒ **resumeTask** (`Function`) + - 📝 Resume a task that is awaiting input (e.g., passwords). +- ƒ **resolveTask** (`Function`) + - 📝 Resolve a task that is awaiting mapping. +- ƒ **clearTasks** (`Function`) + - 📝 Clear tasks based on status. - 🧩 **PasswordPrompt** (`Component`) - 📝 A modal component to prompt the user for database passwords when a migration task is paused. - 🏗️ Layer: UI @@ -595,6 +680,8 @@ - 🏗️ Layer: UI - ƒ **handleSubmit** (`Function`) - 📝 Submits the connection form to the backend. + - ƒ **resetForm** (`Function`) + - 📝 Resets the connection form fields to their default values. - 🧩 **ConnectionList** (`Component`) - 📝 UI component for listing and deleting saved database connection configurations. - 🏗️ Layer: UI @@ -632,30 +719,46 @@ - 🏗️ Layer: UI (API) - 📦 **App** (`Global`) - 📝 The global FastAPI application instance. - - 📦 **WebSocketEndpoint** (`Endpoint`) - - 📝 Provides a WebSocket endpoint for clients to connect to and receive real-time log entries for a specific task. + - ƒ **startup_event** (`Function`) + - 📝 Handles application startup tasks, such as starting the scheduler. + - ƒ **shutdown_event** (`Function`) + - 📝 Handles application shutdown tasks, such as stopping the scheduler. + - ƒ **log_requests** (`Function`) + - 📝 Middleware to log incoming HTTP requests and their response status. + - ƒ **websocket_endpoint** (`Function`) + - 📝 Provides a WebSocket endpoint for real-time log streaming of a task. - 📦 **StaticFiles** (`Mount`) - 📝 Mounts the frontend build directory to serve static assets. - - 📦 **RootEndpoint** (`Endpoint`) - - 📝 A simple root endpoint to confirm that the API is running. + - ƒ **serve_spa** (`Function`) + - 📝 Serves frontend static files or index.html for SPA routing. + - ƒ **read_root** (`Function`) + - 📝 A simple root endpoint to confirm that the API is running when frontend is missing. - 📦 **Dependencies** (`Module`) - 📝 Manages the creation and provision of shared application dependencies, such as the PluginLoader and TaskManager, to avoid circular imports. - 🏗️ Layer: Core + - ƒ **get_config_manager** (`Function`) + - 📝 Dependency injector for the ConfigManager. + - ƒ **get_plugin_loader** (`Function`) + - 📝 Dependency injector for the PluginLoader. + - ƒ **get_task_manager** (`Function`) + - 📝 Dependency injector for the TaskManager. + - ƒ **get_scheduler_service** (`Function`) + - 📝 Dependency injector for the SchedulerService. - 📦 **backend.src.core.superset_client** (`Module`) - 📝 Extends the base SupersetClient with database-specific metadata fetching. - 🏗️ Layer: Core - 🔗 INHERITS_FROM -> `superset_tool.client.SupersetClient` - ℂ **SupersetClient** (`Class`) - 📝 Extended SupersetClient for migration-specific operations. - - ƒ **SupersetClient.get_databases_summary** (`Function`) + - ƒ **get_databases_summary** (`Function`) - 📝 Fetch a summary of databases including uuid, name, and engine. - - ƒ **SupersetClient.get_database_by_uuid** (`Function`) + - ƒ **get_database_by_uuid** (`Function`) - 📝 Find a database by its UUID. - - ƒ **SupersetClient.get_dashboards_summary** (`Function`) + - ƒ **get_dashboards_summary** (`Function`) - 📝 Fetches dashboard metadata optimized for the grid. - - ƒ **SupersetClient.get_dataset** (`Function`) + - ƒ **get_dataset** (`Function`) - 📝 Fetch full dataset structure including columns and metrics. - - ƒ **SupersetClient.update_dataset** (`Function`) + - ƒ **update_dataset** (`Function`) - 📝 Update dataset metadata. - 📦 **ConfigManagerModule** (`Module`) - 📝 Manages application configuration, including loading/saving to JSON and CRUD for environments. @@ -693,15 +796,17 @@ - 🏗️ Layer: Core - ℂ **SchedulerService** (`Class`) - 📝 Provides a service to manage scheduled backup tasks. - - ƒ **SchedulerService.start** (`Function`) + - ƒ **__init__** (`Function`) + - 📝 Initializes the scheduler service with task and config managers. + - ƒ **start** (`Function`) - 📝 Starts the background scheduler and loads initial schedules. - - ƒ **SchedulerService.stop** (`Function`) + - ƒ **stop** (`Function`) - 📝 Stops the background scheduler. - - ƒ **SchedulerService.load_schedules** (`Function`) + - ƒ **load_schedules** (`Function`) - 📝 Loads backup schedules from configuration and registers them. - - ƒ **SchedulerService.add_backup_job** (`Function`) + - ƒ **add_backup_job** (`Function`) - 📝 Adds a scheduled backup job for an environment. - - ƒ **SchedulerService._trigger_backup** (`Function`) + - ƒ **_trigger_backup** (`Function`) - 📝 Triggered by the scheduler to start a backup task. - 📦 **ConfigModels** (`Module`) - 📝 Defines the data models for application configuration using Pydantic. @@ -739,32 +844,40 @@ - 🏗️ Layer: Core - ℂ **BeliefFormatter** (`Class`) - 📝 Custom logging formatter that adds belief state prefixes to log messages. + - ƒ **format** (`Function`) + - 📝 Formats the log record, adding belief state context if available. - ℂ **LogEntry** (`Class`) - 📝 A Pydantic model representing a single, structured log entry. This is a re-definition for consistency, as it's also defined in task_manager.py. - - ƒ **BeliefScope** (`Function`) + - ƒ **belief_scope** (`Function`) - 📝 Context manager for structured Belief State logging. - - ƒ **ConfigureLogger** (`Function`) + - ƒ **configure_logger** (`Function`) - 📝 Configures the logger with the provided logging settings. - ℂ **WebSocketLogHandler** (`Class`) - 📝 A custom logging handler that captures log records into a buffer. It is designed to be extended for real-time log streaming over WebSockets. + - ƒ **__init__** (`Function`) + - 📝 Initializes the handler with a fixed-capacity buffer. + - ƒ **emit** (`Function`) + - 📝 Captures a log record, formats it, and stores it in the buffer. + - ƒ **get_recent_logs** (`Function`) + - 📝 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. - ℂ **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 - - ƒ **PluginLoader.__init__** (`Function`) + - ƒ **__init__** (`Function`) - 📝 Initializes the PluginLoader with a directory to scan. - - ƒ **PluginLoader._load_plugins** (`Function`) + - ƒ **_load_plugins** (`Function`) - 📝 Scans the plugin directory and loads all valid plugins. - - ƒ **PluginLoader._load_module** (`Function`) + - ƒ **_load_module** (`Function`) - 📝 Loads a single Python module and discovers PluginBase implementations. - - ƒ **PluginLoader._register_plugin** (`Function`) + - ƒ **_register_plugin** (`Function`) - 📝 Registers a PluginBase instance and its configuration. - - ƒ **PluginLoader.get_plugin** (`Function`) + - ƒ **get_plugin** (`Function`) - 📝 Retrieves a loaded plugin instance by its ID. - - ƒ **PluginLoader.get_all_plugin_configs** (`Function`) + - ƒ **get_all_plugin_configs** (`Function`) - 📝 Returns a list of all registered plugin configurations. - - ƒ **PluginLoader.has_plugin** (`Function`) + - ƒ **has_plugin** (`Function`) - 📝 Checks if a plugin with the given ID is registered. - 📦 **backend.src.core.migration_engine** (`Module`) - 📝 Handles the interception and transformation of Superset asset ZIP archives. @@ -772,13 +885,25 @@ - 🔗 DEPENDS_ON -> `PyYAML` - ℂ **MigrationEngine** (`Class`) - 📝 Engine for transforming Superset export ZIPs. - - ƒ **MigrationEngine.transform_zip** (`Function`) + - ƒ **transform_zip** (`Function`) - 📝 Extracts ZIP, replaces database UUIDs in YAMLs, and re-packages. - - ƒ **MigrationEngine._transform_yaml** (`Function`) + - ƒ **_transform_yaml** (`Function`) - 📝 Replaces database_uuid in a single YAML file. - ℂ **PluginBase** (`Class`) - 📝 Defines the abstract base class that all plugins must implement to be recognized by the system. It enforces a common structure for plugin metadata and execution. - 🏗️ Layer: Core + - ƒ **id** (`Function`) + - 📝 Returns the unique identifier for the plugin. + - ƒ **name** (`Function`) + - 📝 Returns the human-readable name of the plugin. + - ƒ **description** (`Function`) + - 📝 Returns a brief description of the plugin. + - ƒ **version** (`Function`) + - 📝 Returns the version of the plugin. + - ƒ **get_schema** (`Function`) + - 📝 Returns the JSON schema for the plugin's input parameters. + - ƒ **execute** (`Function`) + - 📝 Executes the plugin's core logic. - ℂ **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 @@ -868,6 +993,8 @@ - 📦 **AuthModule** (`Module`) - 📝 Implements ADFS authentication using Authlib for FastAPI. It provides a dependency to protect endpoints. - 🏗️ Layer: UI (API) + - ƒ **get_current_user** (`Function`) + - 📝 Dependency to get the current user from the ADFS token. - 📦 **ConnectionsRouter** (`Module`) - 📝 Defines the FastAPI router for managing external database connections. - 🏗️ Layer: UI (API) @@ -907,6 +1034,8 @@ - 📦 **PluginsRouter** (`Module`) - 📝 Defines the FastAPI router for plugin-related endpoints, allowing clients to list available plugins. - 🏗️ Layer: UI (API) + - ƒ **list_plugins** (`Function`) + - 📝 Retrieve a list of all available plugins. - 📦 **backend.src.api.routes.mappings** (`Module`) - 📝 API endpoints for managing database mappings and getting suggestions. - 🏗️ Layer: API @@ -946,6 +1075,20 @@ - 📦 **TasksRouter** (`Module`) - 📝 Defines the FastAPI router for task-related endpoints, allowing clients to create, list, and get the status of tasks. - 🏗️ Layer: UI (API) + - ƒ **create_task** (`Function`) + - 📝 Create and start a new task for a given plugin. + - ƒ **list_tasks** (`Function`) + - 📝 Retrieve a list of tasks with pagination and optional status filter. + - ƒ **get_task** (`Function`) + - 📝 Retrieve the details of a specific task. + - ƒ **get_task_logs** (`Function`) + - 📝 Retrieve logs for a specific task. + - ƒ **resolve_task** (`Function`) + - 📝 Resolve a task that is awaiting mapping. + - ƒ **resume_task** (`Function`) + - 📝 Resume a task that is awaiting input (e.g., passwords). + - ƒ **clear_tasks** (`Function`) + - 📝 Clear tasks matching the status filter. - 📦 **backend.src.models.task** (`Module`) - 📝 Defines the database schema for task execution records. - 🏗️ Layer: Domain @@ -984,11 +1127,11 @@ - 🔗 DEPENDS_ON -> `backend.src.core.utils.matching` - ℂ **MappingService** (`Class`) - 📝 Service for handling database mapping logic. - - ƒ **MappingService.__init__** (`Function`) + - ƒ **__init__** (`Function`) - 📝 Initializes the mapping service with a config manager. - - ƒ **MappingService._get_client** (`Function`) + - ƒ **_get_client** (`Function`) - 📝 Helper to get an initialized SupersetClient for an environment. - - ƒ **MappingService.get_suggestions** (`Function`) + - ƒ **get_suggestions** (`Function`) - 📝 Fetches databases from both environments and returns fuzzy matching suggestions. - 📦 **BackupPlugin** (`Module`) - 📝 A plugin that provides functionality to back up Superset dashboards. @@ -997,38 +1140,74 @@ - 🔗 DEPENDS_ON -> `superset_tool.utils` - ℂ **BackupPlugin** (`Class`) - 📝 Implementation of the backup plugin logic. + - ƒ **id** (`Function`) + - 📝 Returns the unique identifier for the backup plugin. + - ƒ **name** (`Function`) + - 📝 Returns the human-readable name of the backup plugin. + - ƒ **description** (`Function`) + - 📝 Returns a description of the backup plugin. + - ƒ **version** (`Function`) + - 📝 Returns the version of the backup plugin. + - ƒ **get_schema** (`Function`) + - 📝 Returns the JSON schema for backup plugin parameters. + - ƒ **execute** (`Function`) + - 📝 Executes the dashboard backup logic. - 📦 **DebugPluginModule** (`Module`) - 📝 Implements a plugin for system diagnostics and debugging Superset API responses. - 🏗️ Layer: Plugins - ℂ **DebugPlugin** (`Class`) - 📝 Plugin for system diagnostics and debugging. - - ƒ **DebugPlugin.get_schema** (`Function`) + - ƒ **id** (`Function`) + - 📝 Returns the unique identifier for the debug plugin. + - ƒ **name** (`Function`) + - 📝 Returns the human-readable name of the debug plugin. + - ƒ **description** (`Function`) + - 📝 Returns a description of the debug plugin. + - ƒ **version** (`Function`) + - 📝 Returns the version of the debug plugin. + - ƒ **get_schema** (`Function`) - 📝 Returns the JSON schema for the debug plugin parameters. - - ƒ **DebugPlugin.execute** (`Function`) + - ƒ **execute** (`Function`) - 📝 Executes the debug logic. - - ƒ **DebugPlugin._test_db_api** (`Function`) + - ƒ **_test_db_api** (`Function`) - 📝 Tests database API connectivity for source and target environments. - - ƒ **DebugPlugin._get_dataset_structure** (`Function`) + - ƒ **_get_dataset_structure** (`Function`) - 📝 Retrieves the structure of a dataset. - 📦 **SearchPluginModule** (`Module`) - 📝 Implements a plugin for searching text patterns across all datasets in a specific Superset environment. - 🏗️ Layer: Plugins - ℂ **SearchPlugin** (`Class`) - 📝 Plugin for searching text patterns in Superset datasets. - - ƒ **SearchPlugin.get_schema** (`Function`) + - ƒ **id** (`Function`) + - 📝 Returns the unique identifier for the search plugin. + - ƒ **name** (`Function`) + - 📝 Returns the human-readable name of the search plugin. + - ƒ **description** (`Function`) + - 📝 Returns a description of the search plugin. + - ƒ **version** (`Function`) + - 📝 Returns the version of the search plugin. + - ƒ **get_schema** (`Function`) - 📝 Returns the JSON schema for the search plugin parameters. - - ƒ **SearchPlugin.execute** (`Function`) + - ƒ **execute** (`Function`) - 📝 Executes the dataset search logic. - - ƒ **SearchPlugin._get_context** (`Function`) + - ƒ **_get_context** (`Function`) - 📝 Extracts a small context around the match for display. - 📦 **MapperPluginModule** (`Module`) - 📝 Implements a plugin for mapping dataset columns using external database connections or Excel files. - 🏗️ Layer: Plugins - ℂ **MapperPlugin** (`Class`) - 📝 Plugin for mapping dataset columns verbose names. - - ƒ **MapperPlugin.get_schema** (`Function`) + - ƒ **id** (`Function`) + - 📝 Returns the unique identifier for the mapper plugin. + - ƒ **name** (`Function`) + - 📝 Returns the human-readable name of the mapper plugin. + - ƒ **description** (`Function`) + - 📝 Returns a description of the mapper plugin. + - ƒ **version** (`Function`) + - 📝 Returns the version of the mapper plugin. + - ƒ **get_schema** (`Function`) - 📝 Returns the JSON schema for the mapper plugin parameters. - - ƒ **MapperPlugin.execute** (`Function`) + - ƒ **execute** (`Function`) - 📝 Executes the dataset mapping logic. - 📦 **MigrationPlugin** (`Module`) - 📝 A plugin that provides functionality to migrate Superset dashboards between environments. @@ -1037,5 +1216,25 @@ - 🔗 DEPENDS_ON -> `superset_tool.utils` - ℂ **MigrationPlugin** (`Class`) - 📝 Implementation of the migration plugin logic. - - 📦 **MigrationPlugin.execute** (`Action`) - - 📝 Execute the migration logic with proper task logging. + - ƒ **id** (`Function`) + - 📝 Returns the unique identifier for the migration plugin. + - ƒ **name** (`Function`) + - 📝 Returns the human-readable name of the migration plugin. + - ƒ **description** (`Function`) + - 📝 Returns a description of the migration plugin. + - ƒ **version** (`Function`) + - 📝 Returns the version of the migration plugin. + - ƒ **get_schema** (`Function`) + - 📝 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_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`) + - 📝 Test that belief_scope logs Coherence:Failed on exception. +- ƒ **test_belief_scope_success_coherence** (`Function`) + - 📝 Test that belief_scope logs Coherence:OK on success. diff --git a/superset_tool/client.py b/superset_tool/client.py index 66b1ee9..33b6b04 100755 --- a/superset_tool/client.py +++ b/superset_tool/client.py @@ -36,9 +36,10 @@ class SupersetClient: # @PARAM: config (SupersetConfig) - Конфигурация подключения. # @PARAM: logger (Optional[SupersetLogger]) - Экземпляр логгера. def __init__(self, config: SupersetConfig, logger: Optional[SupersetLogger] = None): - self.logger = logger or SupersetLogger(name="SupersetClient") - self.logger.info("[SupersetClient.__init__][Enter] Initializing SupersetClient.") - self._validate_config(config) + with belief_scope("__init__"): + self.logger = logger or SupersetLogger(name="SupersetClient") + self.logger.info("[SupersetClient.__init__][Enter] Initializing SupersetClient.") + self._validate_config(config) self.config = config self.network = APIClient( config=config.dict(), @@ -57,19 +58,21 @@ class SupersetClient: # @THROW: TypeError - Если `config` не является экземпляром `SupersetConfig`. # @PARAM: config (SupersetConfig) - Объект для проверки. def _validate_config(self, config: SupersetConfig) -> None: - self.logger.debug("[_validate_config][Enter] Validating SupersetConfig.") - assert isinstance(config, SupersetConfig), "Конфигурация должна быть экземпляром SupersetConfig" - self.logger.debug("[_validate_config][Exit] Config is valid.") + with belief_scope("_validate_config"): + self.logger.debug("[_validate_config][Enter] Validating SupersetConfig.") + assert isinstance(config, SupersetConfig), "Конфигурация должна быть экземпляром SupersetConfig" + self.logger.debug("[_validate_config][Exit] Config is valid.") # [/DEF:_validate_config:Function] @property + # [DEF:headers:Function] + # @PURPOSE: Возвращает базовые HTTP-заголовки, используемые сетевым клиентом. + # @PRE: self.network должен быть инициализирован. + # @POST: Возвращаемый словарь содержит актуальные заголовки, включая токен авторизации. def headers(self) -> dict: - # [DEF:headers:Function] - # @PURPOSE: Возвращает базовые HTTP-заголовки, используемые сетевым клиентом. - # @PRE: self.network должен быть инициализирован. - # @POST: Возвращаемый словарь содержит актуальные заголовки, включая токен авторизации. - return self.network.headers - # [/DEF:headers:Function] + with belief_scope("headers"): + return self.network.headers + # [/DEF:headers:Function] # [DEF:get_dashboards:Function] # @PURPOSE: Получает полный список дашбордов, автоматически обрабатывая пагинацию. @@ -81,10 +84,19 @@ class SupersetClient: # @PARAM: query (Optional[Dict]) - Дополнительные параметры запроса для API. # @RETURN: Tuple[int, List[Dict]] - Кортеж (общее количество, список дашбордов). def get_dashboards(self, query: Optional[Dict] = None) -> Tuple[int, List[Dict]]: - assert self.network, "[get_dashboards][PRE] Network client must be initialized." - self.logger.info("[get_dashboards][Enter] Fetching dashboards.") - validated_query = self._validate_query_params(query or {}) - if 'columns' not in validated_query: + with belief_scope("get_dashboards"): + assert self.network, "[get_dashboards][PRE] Network client must be initialized." + self.logger.info("[get_dashboards][Enter] Fetching dashboards.") + validated_query = self._validate_query_params(query or {}) + if 'columns' not in validated_query: + validated_query['columns'] = ["slug", "id", "changed_on_utc", "dashboard_title", "published"] + total_count = self._fetch_total_object_count(endpoint="/dashboard/") + paginated_data = self._fetch_all_pages( + endpoint="/dashboard/", + pagination_options={"base_query": validated_query, "total_count": total_count, "results_field": "result"}, + ) + self.logger.info("[get_dashboards][Exit] Found %d dashboards.", total_count) + return total_count, paginated_data validated_query['columns'] = ["slug", "id", "changed_on_utc", "dashboard_title", "published"] total_count = self._fetch_total_object_count(endpoint="/dashboard/") paginated_data = self._fetch_all_pages( @@ -104,20 +116,21 @@ class SupersetClient: # @PARAM: dashboard_id (int) - ID дашборда для экспорта. # @RETURN: Tuple[bytes, str] - Бинарное содержимое ZIP-архива и имя файла. def export_dashboard(self, dashboard_id: int) -> Tuple[bytes, str]: - assert isinstance(dashboard_id, int) and dashboard_id > 0, "[export_dashboard][PRE] dashboard_id must be a positive integer." - self.logger.info("[export_dashboard][Enter] Exporting dashboard %s.", dashboard_id) - response = self.network.request( - method="GET", - endpoint="/dashboard/export/", - params={"q": json.dumps([dashboard_id])}, - stream=True, - raw_response=True, - ) - response = cast(Response, response) - self._validate_export_response(response, dashboard_id) - filename = self._resolve_export_filename(response, dashboard_id) - self.logger.info("[export_dashboard][Exit] Exported dashboard %s to %s.", dashboard_id, filename) - return response.content, filename + with belief_scope("export_dashboard"): + assert isinstance(dashboard_id, int) and dashboard_id > 0, "[export_dashboard][PRE] dashboard_id must be a positive integer." + self.logger.info("[export_dashboard][Enter] Exporting dashboard %s.", dashboard_id) + response = self.network.request( + method="GET", + endpoint="/dashboard/export/", + params={"q": json.dumps([dashboard_id])}, + stream=True, + raw_response=True, + ) + response = cast(Response, response) + self._validate_export_response(response, dashboard_id) + filename = self._resolve_export_filename(response, dashboard_id) + self.logger.info("[export_dashboard][Exit] Exported dashboard %s to %s.", dashboard_id, filename) + return response.content, filename # [/DEF:export_dashboard:Function] # [DEF:import_dashboard:Function] @@ -134,24 +147,25 @@ class SupersetClient: # @PARAM: dash_slug (Optional[str]) - Slug дашборда для поиска ID, если ID не предоставлен. # @RETURN: Dict - Ответ API в случае успеха. def import_dashboard(self, file_name: Union[str, Path], dash_id: Optional[int] = None, dash_slug: Optional[str] = None) -> Dict: - assert file_name, "[import_dashboard][PRE] file_name must be provided." - file_path = str(file_name) - self._validate_import_file(file_path) - try: - return self._do_import(file_path) - except Exception as exc: - self.logger.error("[import_dashboard][Failure] First import attempt failed: %s", exc, exc_info=True) - if not self.delete_before_reimport: - raise + with belief_scope("import_dashboard"): + assert file_name, "[import_dashboard][PRE] file_name must be provided." + file_path = str(file_name) + self._validate_import_file(file_path) + try: + return self._do_import(file_path) + except Exception as exc: + self.logger.error("[import_dashboard][Failure] First import attempt failed: %s", exc, exc_info=True) + if not self.delete_before_reimport: + raise - target_id = self._resolve_target_id_for_delete(dash_id, dash_slug) - if target_id is None: - self.logger.error("[import_dashboard][Failure] No ID available for delete-retry.") - raise + target_id = self._resolve_target_id_for_delete(dash_id, dash_slug) + if target_id is None: + self.logger.error("[import_dashboard][Failure] No ID available for delete-retry.") + raise - self.delete_dashboard(target_id) - self.logger.info("[import_dashboard][State] Deleted dashboard ID %s, retrying import.", target_id) - return self._do_import(file_path) + self.delete_dashboard(target_id) + self.logger.info("[import_dashboard][State] Deleted dashboard ID %s, retrying import.", target_id) + return self._do_import(file_path) # [/DEF:import_dashboard:Function] # [DEF:_resolve_target_id_for_delete:Function] @@ -163,10 +177,21 @@ class SupersetClient: # @THROW: APIError - В случае ошибки сетевого запроса при поиске по slug. # @RETURN: Optional[int] - Найденный ID или None. def _resolve_target_id_for_delete(self, dash_id: Optional[int], dash_slug: Optional[str]) -> Optional[int]: - assert dash_id is not None or dash_slug is not None, "[_resolve_target_id_for_delete][PRE] At least one of ID or slug must be provided." - if dash_id is not None: - return dash_id - if dash_slug is not None: + with belief_scope("_resolve_target_id_for_delete"): + assert dash_id is not None or dash_slug is not None, "[_resolve_target_id_for_delete][PRE] At least one of ID or slug must be provided." + if dash_id is not None: + return dash_id + if dash_slug is not None: + self.logger.debug("[_resolve_target_id_for_delete][State] Resolving ID by slug '%s'.", dash_slug) + try: + _, candidates = self.get_dashboards(query={"filters": [{"col": "slug", "op": "eq", "value": dash_slug}]}) + if candidates: + target_id = candidates[0]["id"] + self.logger.debug("[_resolve_target_id_for_delete][Success] Resolved slug to ID %s.", target_id) + return target_id + except Exception as e: + self.logger.warning("[_resolve_target_id_for_delete][Warning] Could not resolve slug '%s' to ID: %s", dash_slug, e) + return None self.logger.debug("[_resolve_target_id_for_delete][State] Resolving ID by slug '%s'.", dash_slug) try: _, candidates = self.get_dashboards(query={"filters": [{"col": "slug", "op": "eq", "value": dash_slug}]}) @@ -187,19 +212,20 @@ class SupersetClient: # @PARAM: file_name (Union[str, Path]) - Путь к файлу. # @RETURN: Dict - Ответ API. def _do_import(self, file_name: Union[str, Path]) -> Dict: - self.logger.debug(f"[_do_import][State] Uploading file: {file_name}") - file_path = Path(file_name) - if file_path.exists(): - self.logger.debug(f"[_do_import][State] File size: {file_path.stat().st_size} bytes") - else: - self.logger.error(f"[_do_import][Failure] File does not exist: {file_name}") - raise FileNotFoundError(f"File does not exist: {file_name}") - return self.network.upload_file( - endpoint="/dashboard/import/", - file_info={"file_obj": file_path, "file_name": file_path.name, "form_field": "formData"}, - extra_data={"overwrite": "true"}, - timeout=self.config.timeout * 2, - ) + with belief_scope("_do_import"): + self.logger.debug(f"[_do_import][State] Uploading file: {file_name}") + file_path = Path(file_name) + if file_path.exists(): + self.logger.debug(f"[_do_import][State] File size: {file_path.stat().st_size} bytes") + else: + self.logger.error(f"[_do_import][Failure] File does not exist: {file_name}") + raise FileNotFoundError(f"File does not exist: {file_name}") + return self.network.upload_file( + endpoint="/dashboard/import/", + file_info={"file_obj": file_path, "file_name": file_path.name, "form_field": "formData"}, + extra_data={"overwrite": "true"}, + timeout=self.config.timeout * 2, + ) # [/DEF:_do_import:Function] # [DEF:delete_dashboard:Function] @@ -210,14 +236,15 @@ class SupersetClient: # @THROW: APIError - В случае ошибки сетевого запроса. # @PARAM: dashboard_id (Union[int, str]) - ID или slug дашборда. def delete_dashboard(self, dashboard_id: Union[int, str]) -> None: - assert dashboard_id, "[delete_dashboard][PRE] dashboard_id must be provided." - self.logger.info("[delete_dashboard][Enter] Deleting dashboard %s.", dashboard_id) - response = self.network.request(method="DELETE", endpoint=f"/dashboard/{dashboard_id}") - response = cast(Dict, response) - if response.get("result", True) is not False: - self.logger.info("[delete_dashboard][Success] Dashboard %s deleted.", dashboard_id) - else: - self.logger.warning("[delete_dashboard][Warning] Unexpected response while deleting %s: %s", dashboard_id, response) + with belief_scope("delete_dashboard"): + assert dashboard_id, "[delete_dashboard][PRE] dashboard_id must be provided." + self.logger.info("[delete_dashboard][Enter] Deleting dashboard %s.", dashboard_id) + response = self.network.request(method="DELETE", endpoint=f"/dashboard/{dashboard_id}") + response = cast(Dict, response) + if response.get("result", True) is not False: + self.logger.info("[delete_dashboard][Success] Dashboard %s deleted.", dashboard_id) + else: + self.logger.warning("[delete_dashboard][Warning] Unexpected response while deleting %s: %s", dashboard_id, response) # [/DEF:delete_dashboard:Function] # [DEF:_extract_dashboard_id_from_zip:Function] @@ -228,19 +255,20 @@ class SupersetClient: # @THROW: ImportError - Если не установлен `yaml`. # @RETURN: Optional[int] - ID дашборда или None. def _extract_dashboard_id_from_zip(self, file_name: Union[str, Path]) -> Optional[int]: - assert zipfile.is_zipfile(file_name), "[_extract_dashboard_id_from_zip][PRE] file_name must be a valid zip file." - try: - import yaml - with zipfile.ZipFile(file_name, "r") as zf: - for name in zf.namelist(): - if name.endswith("metadata.yaml"): - with zf.open(name) as meta_file: - meta = yaml.safe_load(meta_file) - dash_id = meta.get("dashboard_uuid") or meta.get("dashboard_id") - if dash_id: return int(dash_id) - except Exception as exc: - self.logger.error("[_extract_dashboard_id_from_zip][Failure] %s", exc, exc_info=True) - return None + with belief_scope("_extract_dashboard_id_from_zip"): + assert zipfile.is_zipfile(file_name), "[_extract_dashboard_id_from_zip][PRE] file_name must be a valid zip file." + try: + import yaml + with zipfile.ZipFile(file_name, "r") as zf: + for name in zf.namelist(): + if name.endswith("metadata.yaml"): + with zf.open(name) as meta_file: + meta = yaml.safe_load(meta_file) + dash_id = meta.get("dashboard_uuid") or meta.get("dashboard_id") + if dash_id: return int(dash_id) + except Exception as exc: + self.logger.error("[_extract_dashboard_id_from_zip][Failure] %s", exc, exc_info=True) + return None # [/DEF:_extract_dashboard_id_from_zip:Function] # [DEF:_extract_dashboard_slug_from_zip:Function] @@ -251,19 +279,20 @@ class SupersetClient: # @THROW: ImportError - Если не установлен `yaml`. # @RETURN: Optional[str] - Slug дашборда или None. def _extract_dashboard_slug_from_zip(self, file_name: Union[str, Path]) -> Optional[str]: - assert zipfile.is_zipfile(file_name), "[_extract_dashboard_slug_from_zip][PRE] file_name must be a valid zip file." - try: - import yaml - with zipfile.ZipFile(file_name, "r") as zf: - for name in zf.namelist(): - if name.endswith("metadata.yaml"): - with zf.open(name) as meta_file: - meta = yaml.safe_load(meta_file) - if slug := meta.get("slug"): - return str(slug) - except Exception as exc: - self.logger.error("[_extract_dashboard_slug_from_zip][Failure] %s", exc, exc_info=True) - return None + with belief_scope("_extract_dashboard_slug_from_zip"): + assert zipfile.is_zipfile(file_name), "[_extract_dashboard_slug_from_zip][PRE] file_name must be a valid zip file." + try: + import yaml + with zipfile.ZipFile(file_name, "r") as zf: + for name in zf.namelist(): + if name.endswith("metadata.yaml"): + with zf.open(name) as meta_file: + meta = yaml.safe_load(meta_file) + if slug := meta.get("slug"): + return str(slug) + except Exception as exc: + self.logger.error("[_extract_dashboard_slug_from_zip][Failure] %s", exc, exc_info=True) + return None # [/DEF:_extract_dashboard_slug_from_zip:Function] # [DEF:_validate_export_response:Function] @@ -274,12 +303,13 @@ class SupersetClient: # @PARAM: response (Response) - HTTP ответ. # @PARAM: dashboard_id (int) - ID дашборда. def _validate_export_response(self, response: Response, dashboard_id: int) -> None: - assert isinstance(response, Response), "[_validate_export_response][PRE] response must be a requests.Response object." - content_type = response.headers.get("Content-Type", "") - if "application/zip" not in content_type: - raise ExportError(f"Получен не ZIP-архив (Content-Type: {content_type})") - if not response.content: - raise ExportError("Получены пустые данные при экспорте") + with belief_scope("_validate_export_response"): + assert isinstance(response, Response), "[_validate_export_response][PRE] response must be a requests.Response object." + content_type = response.headers.get("Content-Type", "") + if "application/zip" not in content_type: + raise ExportError(f"Получен не ZIP-архив (Content-Type: {content_type})") + if not response.content: + raise ExportError("Получены пустые данные при экспорте") # [/DEF:_validate_export_response:Function] # [DEF:_resolve_export_filename:Function] @@ -290,14 +320,15 @@ class SupersetClient: # @PARAM: dashboard_id (int) - ID дашборда. # @RETURN: str - Имя файла. def _resolve_export_filename(self, response: Response, dashboard_id: int) -> str: - assert isinstance(response, Response), "[_resolve_export_filename][PRE] response must be a requests.Response object." - filename = get_filename_from_headers(dict(response.headers)) - if not filename: - from datetime import datetime - timestamp = datetime.now().strftime("%Y%m%dT%H%M%S") - filename = f"dashboard_export_{dashboard_id}_{timestamp}.zip" - self.logger.warning("[_resolve_export_filename][Warning] Generated filename: %s", filename) - return filename + with belief_scope("_resolve_export_filename"): + assert isinstance(response, Response), "[_resolve_export_filename][PRE] response must be a requests.Response object." + filename = get_filename_from_headers(dict(response.headers)) + if not filename: + from datetime import datetime + timestamp = datetime.now().strftime("%Y%m%dT%H%M%S") + filename = f"dashboard_export_{dashboard_id}_{timestamp}.zip" + self.logger.warning("[_resolve_export_filename][Warning] Generated filename: %s", filename) + return filename # [/DEF:_resolve_export_filename:Function] # [DEF:_validate_query_params:Function] @@ -307,9 +338,10 @@ class SupersetClient: # @POST: Возвращает словарь, содержащий базовые параметры пагинации, объединенные с `query`. # @RETURN: Dict - Валидированные параметры. def _validate_query_params(self, query: Optional[Dict]) -> Dict: - assert query is None or isinstance(query, dict), "[_validate_query_params][PRE] query must be a dictionary or None." - base_query = {"page": 0, "page_size": 1000} - return {**base_query, **(query or {})} + with belief_scope("_validate_query_params"): + assert query is None or isinstance(query, dict), "[_validate_query_params][PRE] query must be a dictionary or None." + base_query = {"page": 0, "page_size": 1000} + return {**base_query, **(query or {})} # [/DEF:_validate_query_params:Function] # [DEF:_fetch_total_object_count:Function] @@ -320,12 +352,13 @@ class SupersetClient: # @THROW: APIError - В случае ошибки сетевого запроса. # @RETURN: int - Количество объектов. def _fetch_total_object_count(self, endpoint: str) -> int: - assert endpoint and isinstance(endpoint, str), "[_fetch_total_object_count][PRE] endpoint must be a non-empty string." - return self.network.fetch_paginated_count( - endpoint=endpoint, - query_params={"page": 0, "page_size": 1}, - count_field="count", - ) + with belief_scope("_fetch_total_object_count"): + assert endpoint and isinstance(endpoint, str), "[_fetch_total_object_count][PRE] endpoint must be a non-empty string." + return self.network.fetch_paginated_count( + endpoint=endpoint, + query_params={"page": 0, "page_size": 1}, + count_field="count", + ) # [/DEF:_fetch_total_object_count:Function] # [DEF:_fetch_all_pages:Function] @@ -337,9 +370,10 @@ class SupersetClient: # @THROW: APIError - В случае ошибки сетевого запроса. # @RETURN: List[Dict] - Список всех объектов. def _fetch_all_pages(self, endpoint: str, pagination_options: Dict) -> List[Dict]: - assert endpoint and isinstance(endpoint, str), "[_fetch_all_pages][PRE] endpoint must be a non-empty string." - assert isinstance(pagination_options, dict), "[_fetch_all_pages][PRE] pagination_options must be a dictionary." - return self.network.fetch_paginated_data(endpoint=endpoint, pagination_options=pagination_options) + with belief_scope("_fetch_all_pages"): + assert endpoint and isinstance(endpoint, str), "[_fetch_all_pages][PRE] endpoint must be a non-empty string." + assert isinstance(pagination_options, dict), "[_fetch_all_pages][PRE] pagination_options must be a dictionary." + return self.network.fetch_paginated_data(endpoint=endpoint, pagination_options=pagination_options) # [/DEF:_fetch_all_pages:Function] # [DEF:_validate_import_file:Function] @@ -350,12 +384,13 @@ class SupersetClient: # @THROW: InvalidZipFormatError - Если файл не является ZIP или не содержит `metadata.yaml`. # @PARAM: zip_path (Union[str, Path]) - Путь к файлу. def _validate_import_file(self, zip_path: Union[str, Path]) -> None: - assert zip_path, "[_validate_import_file][PRE] zip_path must be provided." - path = Path(zip_path) - assert path.exists(), f"Файл {zip_path} не существует" - assert zipfile.is_zipfile(path), f"Файл {zip_path} не является ZIP-архивом" - with zipfile.ZipFile(path, "r") as zf: - assert any(n.endswith("metadata.yaml") for n in zf.namelist()), f"Архив {zip_path} не содержит 'metadata.yaml'" + with belief_scope("_validate_import_file"): + assert zip_path, "[_validate_import_file][PRE] zip_path must be provided." + path = Path(zip_path) + assert path.exists(), f"Файл {zip_path} не существует" + assert zipfile.is_zipfile(path), f"Файл {zip_path} не является ZIP-архивом" + with zipfile.ZipFile(path, "r") as zf: + assert any(n.endswith("metadata.yaml") for n in zf.namelist()), f"Архив {zip_path} не содержит 'metadata.yaml'" # [/DEF:_validate_import_file:Function] # [DEF:get_datasets:Function] @@ -368,17 +403,18 @@ class SupersetClient: # @THROW: APIError - В случае ошибки сетевого запроса. # @RETURN: Tuple[int, List[Dict]] - Кортеж (общее количество, список датасетов). def get_datasets(self, query: Optional[Dict] = None) -> Tuple[int, List[Dict]]: - assert self.network, "[get_datasets][PRE] Network client must be initialized." - self.logger.info("[get_datasets][Enter] Fetching datasets.") - validated_query = self._validate_query_params(query) + with belief_scope("get_datasets"): + assert self.network, "[get_datasets][PRE] Network client must be initialized." + self.logger.info("[get_datasets][Enter] Fetching datasets.") + validated_query = self._validate_query_params(query) - total_count = self._fetch_total_object_count(endpoint="/dataset/") - paginated_data = self._fetch_all_pages( - endpoint="/dataset/", - pagination_options={"base_query": validated_query, "total_count": total_count, "results_field": "result"}, - ) - self.logger.info("[get_datasets][Exit] Found %d datasets.", total_count) - return total_count, paginated_data + total_count = self._fetch_total_object_count(endpoint="/dataset/") + paginated_data = self._fetch_all_pages( + endpoint="/dataset/", + pagination_options={"base_query": validated_query, "total_count": total_count, "results_field": "result"}, + ) + self.logger.info("[get_datasets][Exit] Found %d datasets.", total_count) + return total_count, paginated_data # [/DEF:get_datasets:Function] # [DEF:get_databases:Function] @@ -391,18 +427,19 @@ class SupersetClient: # @THROW: APIError - В случае ошибки сетевого запроса. # @RETURN: Tuple[int, List[Dict]] - Кортеж (общее количество, список баз данных). def get_databases(self, query: Optional[Dict] = None) -> Tuple[int, List[Dict]]: - assert self.network, "[get_databases][PRE] Network client must be initialized." - self.logger.info("[get_databases][Enter] Fetching databases.") - validated_query = self._validate_query_params(query or {}) - if 'columns' not in validated_query: - validated_query['columns'] = [] - total_count = self._fetch_total_object_count(endpoint="/database/") - paginated_data = self._fetch_all_pages( - endpoint="/database/", - pagination_options={"base_query": validated_query, "total_count": total_count, "results_field": "result"}, - ) - self.logger.info("[get_databases][Exit] Found %d databases.", total_count) - return total_count, paginated_data + with belief_scope("get_databases"): + assert self.network, "[get_databases][PRE] Network client must be initialized." + self.logger.info("[get_databases][Enter] Fetching databases.") + validated_query = self._validate_query_params(query or {}) + if 'columns' not in validated_query: + validated_query['columns'] = [] + total_count = self._fetch_total_object_count(endpoint="/database/") + paginated_data = self._fetch_all_pages( + endpoint="/database/", + pagination_options={"base_query": validated_query, "total_count": total_count, "results_field": "result"}, + ) + self.logger.info("[get_databases][Exit] Found %d databases.", total_count) + return total_count, paginated_data # [/DEF:get_databases:Function] # [DEF:get_dataset:Function] @@ -414,12 +451,13 @@ class SupersetClient: # @THROW: APIError - В случае ошибки сетевого запроса или если датасет не найден. # @RETURN: Dict - Информация о датасете. def get_dataset(self, dataset_id: int) -> Dict: - assert isinstance(dataset_id, int) and dataset_id > 0, "[get_dataset][PRE] dataset_id must be a positive integer." - self.logger.info("[get_dataset][Enter] Fetching dataset %s.", dataset_id) - response = self.network.request(method="GET", endpoint=f"/dataset/{dataset_id}") - response = cast(Dict, response) - self.logger.info("[get_dataset][Exit] Got dataset %s.", dataset_id) - return response + with belief_scope("get_dataset"): + assert isinstance(dataset_id, int) and dataset_id > 0, "[get_dataset][PRE] dataset_id must be a positive integer." + self.logger.info("[get_dataset][Enter] Fetching dataset %s.", dataset_id) + response = self.network.request(method="GET", endpoint=f"/dataset/{dataset_id}") + response = cast(Dict, response) + self.logger.info("[get_dataset][Exit] Got dataset %s.", dataset_id) + return response # [/DEF:get_dataset:Function] # [DEF:get_database:Function] @@ -431,12 +469,13 @@ class SupersetClient: # @THROW: APIError - В случае ошибки сетевого запроса или если база данных не найдена. # @RETURN: Dict - Информация о базе данных. def get_database(self, database_id: int) -> Dict: - assert isinstance(database_id, int) and database_id > 0, "[get_database][PRE] database_id must be a positive integer." - self.logger.info("[get_database][Enter] Fetching database %s.", database_id) - response = self.network.request(method="GET", endpoint=f"/database/{database_id}") - response = cast(Dict, response) - self.logger.info("[get_database][Exit] Got database %s.", database_id) - return response + with belief_scope("get_database"): + assert isinstance(database_id, int) and database_id > 0, "[get_database][PRE] database_id must be a positive integer." + self.logger.info("[get_database][Enter] Fetching database %s.", database_id) + response = self.network.request(method="GET", endpoint=f"/database/{database_id}") + response = cast(Dict, response) + self.logger.info("[get_database][Exit] Got database %s.", database_id) + return response # [/DEF:get_database:Function] # [DEF:update_dataset:Function] @@ -449,18 +488,19 @@ class SupersetClient: # @THROW: APIError - В случае ошибки сетевого запроса. # @RETURN: Dict - Ответ API. def update_dataset(self, dataset_id: int, data: Dict) -> Dict: - assert isinstance(dataset_id, int) and dataset_id > 0, "[update_dataset][PRE] dataset_id must be a positive integer." - assert isinstance(data, dict) and data, "[update_dataset][PRE] data must be a non-empty dictionary." - self.logger.info("[update_dataset][Enter] Updating dataset %s.", dataset_id) - response = self.network.request( - method="PUT", - endpoint=f"/dataset/{dataset_id}", - data=json.dumps(data), - headers={'Content-Type': 'application/json'} - ) - response = cast(Dict, response) - self.logger.info("[update_dataset][Exit] Updated dataset %s.", dataset_id) - return response + with belief_scope("update_dataset"): + assert isinstance(dataset_id, int) and dataset_id > 0, "[update_dataset][PRE] dataset_id must be a positive integer." + assert isinstance(data, dict) and data, "[update_dataset][PRE] data must be a non-empty dictionary." + self.logger.info("[update_dataset][Enter] Updating dataset %s.", dataset_id) + response = self.network.request( + method="PUT", + endpoint=f"/dataset/{dataset_id}", + data=json.dumps(data), + headers={'Content-Type': 'application/json'} + ) + response = cast(Dict, response) + self.logger.info("[update_dataset][Exit] Updated dataset %s.", dataset_id) + return response # [/DEF:update_dataset:Function] # [/DEF:SupersetClient:Class] diff --git a/superset_tool/exceptions.py b/superset_tool/exceptions.py index 901b5ed..3dc0f64 100755 --- a/superset_tool/exceptions.py +++ b/superset_tool/exceptions.py @@ -146,6 +146,7 @@ class NetworkError(SupersetToolError): # @POST: Error is initialized with network failure context. def __init__(self, message: str = "Network connection failed", **context: Any): super().__init__(f"[NETWORK_FAILURE] {message}", context={"type": "network", **context}) + # [/DEF:__init__:Function] # [/DEF:NetworkError:Class] # [DEF:FileOperationError:Class] diff --git a/superset_tool/utils/dataset_mapper.py b/superset_tool/utils/dataset_mapper.py index 40a9b69..ec3afe6 100755 --- a/superset_tool/utils/dataset_mapper.py +++ b/superset_tool/utils/dataset_mapper.py @@ -7,7 +7,7 @@ # @RELATION: DEPENDS_ON -> pandas # @RELATION: DEPENDS_ON -> psycopg2 # @PUBLIC_API: DatasetMapper - + # [SECTION: IMPORTS] import pandas as pd # type: ignore import psycopg2 # type: ignore @@ -16,26 +16,32 @@ from superset_tool.utils.init_clients import setup_clients from superset_tool.utils.logger import SupersetLogger from typing import Dict, List, Optional, Any # [/SECTION] - + # [DEF:DatasetMapper:Class] # @PURPOSE: Класс для меппинга и обновления verbose_map в датасетах Superset. class DatasetMapper: + # [DEF:__init__:Function] + # @PURPOSE: Initializes the mapper. + # @PRE: logger должен быть экземпляром SupersetLogger. + # @POST: Объект DatasetMapper инициализирован. def __init__(self, logger: SupersetLogger): self.logger = logger - - # [DEF:DatasetMapper.get_postgres_comments:Function] + # [/DEF:__init__:Function] + + # [DEF:get_postgres_comments:Function] # @PURPOSE: Извлекает комментарии к колонкам из системного каталога PostgreSQL. - # @PRE: `db_config` должен содержать валидные креды для подключения к PostgreSQL. - # @PRE: `table_name` и `table_schema` должны быть строками. - # @POST: Возвращается словарь с меппингом `column_name` -> `column_comment`. + # @PRE: db_config должен содержать валидные параметры подключения (host, port, user, password, dbname). + # @PRE: table_name и table_schema должны быть строками. + # @POST: Возвращается словарь, где ключи - имена колонок, значения - комментарии из БД. # @THROW: Exception - При ошибках подключения или выполнения запроса к БД. # @PARAM: db_config (Dict) - Конфигурация для подключения к БД. # @PARAM: table_name (str) - Имя таблицы. # @PARAM: table_schema (str) - Схема таблицы. # @RETURN: Dict[str, str] - Словарь с комментариями к колонкам. def get_postgres_comments(self, db_config: Dict, table_name: str, table_schema: str) -> Dict[str, str]: - self.logger.info("[get_postgres_comments][Enter] Fetching comments from PostgreSQL for %s.%s.", table_schema, table_name) - query = f""" + with self.logger.belief_scope("Fetch comments from PostgreSQL"): + self.logger.info("[get_postgres_comments][Enter] Fetching comments from PostgreSQL for %s.%s.", table_schema, table_name) + query = f""" SELECT cols.column_name, CASE @@ -73,41 +79,45 @@ class DatasetMapper: information_schema.columns cols WHERE cols.table_catalog = '{db_config.get('dbname')}' AND cols.table_name = '{table_name}' AND cols.table_schema = '{table_schema}'; """ - comments = {} - try: - with psycopg2.connect(**db_config) as conn, conn.cursor() as cursor: - cursor.execute(query) - for row in cursor.fetchall(): - if row[1]: - comments[row[0]] = row[1] - self.logger.info("[get_postgres_comments][Success] Fetched %d comments.", len(comments)) - except Exception as e: - self.logger.error("[get_postgres_comments][Failure] %s", e, exc_info=True) - raise - return comments - # [/DEF:DatasetMapper.get_postgres_comments:Function] - - # [DEF:DatasetMapper.load_excel_mappings:Function] + comments = {} + try: + with psycopg2.connect(**db_config) as conn, conn.cursor() as cursor: + cursor.execute(query) + for row in cursor.fetchall(): + if row[1]: + comments[row[0]] = row[1] + self.logger.info("[get_postgres_comments][Success] Fetched %d comments.", len(comments)) + except Exception as e: + self.logger.error("[get_postgres_comments][Failure] %s", e, exc_info=True) + raise + return comments + # [/DEF:get_postgres_comments:Function] + + # [DEF:load_excel_mappings:Function] # @PURPOSE: Загружает меппинги 'column_name' -> 'column_comment' из XLSX файла. - # @PRE: `file_path` должен быть валидным путем к XLSX файлу с колонками 'column_name' и 'column_comment'. - # @POST: Возвращается словарь с меппингами. + # @PRE: file_path должен указывать на существующий XLSX файл. + # @POST: Возвращается словарь с меппингами из файла. # @THROW: Exception - При ошибках чтения файла или парсинга. # @PARAM: file_path (str) - Путь к XLSX файлу. # @RETURN: Dict[str, str] - Словарь с меппингами. def load_excel_mappings(self, file_path: str) -> Dict[str, str]: - self.logger.info("[load_excel_mappings][Enter] Loading mappings from %s.", file_path) - try: - df = pd.read_excel(file_path) - mappings = df.set_index('column_name')['verbose_name'].to_dict() - self.logger.info("[load_excel_mappings][Success] Loaded %d mappings.", len(mappings)) - return mappings - except Exception as e: - self.logger.error("[load_excel_mappings][Failure] %s", e, exc_info=True) - raise - # [/DEF:DatasetMapper.load_excel_mappings:Function] - - # [DEF:DatasetMapper.run_mapping:Function] + with self.logger.belief_scope("Load mappings from Excel"): + self.logger.info("[load_excel_mappings][Enter] Loading mappings from %s.", file_path) + try: + df = pd.read_excel(file_path) + mappings = df.set_index('column_name')['verbose_name'].to_dict() + self.logger.info("[load_excel_mappings][Success] Loaded %d mappings.", len(mappings)) + return mappings + except Exception as e: + self.logger.error("[load_excel_mappings][Failure] %s", e, exc_info=True) + raise + # [/DEF:load_excel_mappings:Function] + + # [DEF:run_mapping:Function] # @PURPOSE: Основная функция для выполнения меппинга и обновления verbose_map датасета в Superset. + # @PRE: superset_client должен быть авторизован. + # @PRE: dataset_id должен быть существующим ID в Superset. + # @POST: Если найдены изменения, датасет в Superset обновлен через API. # @RELATION: CALLS -> self.get_postgres_comments # @RELATION: CALLS -> self.load_excel_mappings # @RELATION: CALLS -> superset_client.get_dataset @@ -120,110 +130,111 @@ class DatasetMapper: # @PARAM: table_name (Optional[str]) - Имя таблицы в PostgreSQL. # @PARAM: table_schema (Optional[str]) - Схема таблицы в PostgreSQL. def run_mapping(self, superset_client: SupersetClient, dataset_id: int, source: str, postgres_config: Optional[Dict] = None, excel_path: Optional[str] = None, table_name: Optional[str] = None, table_schema: Optional[str] = None): - self.logger.info("[run_mapping][Enter] Starting dataset mapping for ID %d from source '%s'.", dataset_id, source) - mappings: Dict[str, str] = {} - - try: - if source in ['postgres', 'both']: - assert postgres_config and table_name and table_schema, "Postgres config is required." - mappings.update(self.get_postgres_comments(postgres_config, table_name, table_schema)) - if source in ['excel', 'both']: - assert excel_path, "Excel path is required." - mappings.update(self.load_excel_mappings(excel_path)) - if source not in ['postgres', 'excel', 'both']: - self.logger.error("[run_mapping][Failure] Invalid source: %s.", source) - return - - dataset_response = superset_client.get_dataset(dataset_id) - dataset_data = dataset_response['result'] + with self.logger.belief_scope(f"Run dataset mapping for ID {dataset_id}"): + self.logger.info("[run_mapping][Enter] Starting dataset mapping for ID %d from source '%s'.", dataset_id, source) + mappings: Dict[str, str] = {} - original_columns = dataset_data.get('columns', []) - updated_columns = [] - changes_made = False - - for column in original_columns: - col_name = column.get('column_name') + try: + if source in ['postgres', 'both']: + assert postgres_config and table_name and table_schema, "Postgres config is required." + mappings.update(self.get_postgres_comments(postgres_config, table_name, table_schema)) + if source in ['excel', 'both']: + assert excel_path, "Excel path is required." + mappings.update(self.load_excel_mappings(excel_path)) + if source not in ['postgres', 'excel', 'both']: + self.logger.error("[run_mapping][Failure] Invalid source: %s.", source) + return + + dataset_response = superset_client.get_dataset(dataset_id) + dataset_data = dataset_response['result'] - new_column = { - "column_name": col_name, - "id": column.get("id"), - "advanced_data_type": column.get("advanced_data_type"), - "description": column.get("description"), - "expression": column.get("expression"), - "extra": column.get("extra"), - "filterable": column.get("filterable"), - "groupby": column.get("groupby"), - "is_active": column.get("is_active"), - "is_dttm": column.get("is_dttm"), - "python_date_format": column.get("python_date_format"), - "type": column.get("type"), - "uuid": column.get("uuid"), - "verbose_name": column.get("verbose_name"), - } - - new_column = {k: v for k, v in new_column.items() if v is not None} - - if col_name in mappings: - mapping_value = mappings[col_name] - if isinstance(mapping_value, str) and new_column.get('verbose_name') != mapping_value: - new_column['verbose_name'] = mapping_value - changes_made = True - - updated_columns.append(new_column) - - updated_metrics = [] - for metric in dataset_data.get("metrics", []): - new_metric = { - "id": metric.get("id"), - "metric_name": metric.get("metric_name"), - "expression": metric.get("expression"), - "verbose_name": metric.get("verbose_name"), - "description": metric.get("description"), - "d3format": metric.get("d3format"), - "currency": metric.get("currency"), - "extra": metric.get("extra"), - "warning_text": metric.get("warning_text"), - "metric_type": metric.get("metric_type"), - "uuid": metric.get("uuid"), - } - updated_metrics.append({k: v for k, v in new_metric.items() if v is not None}) - - if changes_made: - payload_for_update = { - "database_id": dataset_data.get("database", {}).get("id"), - "table_name": dataset_data.get("table_name"), - "schema": dataset_data.get("schema"), - "columns": updated_columns, - "owners": [owner["id"] for owner in dataset_data.get("owners", [])], - "metrics": updated_metrics, - "extra": dataset_data.get("extra"), - "description": dataset_data.get("description"), - "sql": dataset_data.get("sql"), - "cache_timeout": dataset_data.get("cache_timeout"), - "catalog": dataset_data.get("catalog"), - "default_endpoint": dataset_data.get("default_endpoint"), - "external_url": dataset_data.get("external_url"), - "fetch_values_predicate": dataset_data.get("fetch_values_predicate"), - "filter_select_enabled": dataset_data.get("filter_select_enabled"), - "is_managed_externally": dataset_data.get("is_managed_externally"), - "is_sqllab_view": dataset_data.get("is_sqllab_view"), - "main_dttm_col": dataset_data.get("main_dttm_col"), - "normalize_columns": dataset_data.get("normalize_columns"), - "offset": dataset_data.get("offset"), - "template_params": dataset_data.get("template_params"), - } - - payload_for_update = {k: v for k, v in payload_for_update.items() if v is not None} - - superset_client.update_dataset(dataset_id, payload_for_update) - self.logger.info("[run_mapping][Success] Dataset %d columns' verbose_name updated.", dataset_id) - else: - self.logger.info("[run_mapping][State] No changes in columns' verbose_name, skipping update.") - - except (AssertionError, FileNotFoundError, Exception) as e: - self.logger.error("[run_mapping][Failure] %s", e, exc_info=True) - return - # [/DEF:DatasetMapper.run_mapping:Function] + original_columns = dataset_data.get('columns', []) + updated_columns = [] + changes_made = False + + for column in original_columns: + col_name = column.get('column_name') + + new_column = { + "column_name": col_name, + "id": column.get("id"), + "advanced_data_type": column.get("advanced_data_type"), + "description": column.get("description"), + "expression": column.get("expression"), + "extra": column.get("extra"), + "filterable": column.get("filterable"), + "groupby": column.get("groupby"), + "is_active": column.get("is_active"), + "is_dttm": column.get("is_dttm"), + "python_date_format": column.get("python_date_format"), + "type": column.get("type"), + "uuid": column.get("uuid"), + "verbose_name": column.get("verbose_name"), + } + + new_column = {k: v for k, v in new_column.items() if v is not None} + + if col_name in mappings: + mapping_value = mappings[col_name] + if isinstance(mapping_value, str) and new_column.get('verbose_name') != mapping_value: + new_column['verbose_name'] = mapping_value + changes_made = True + + updated_columns.append(new_column) + + updated_metrics = [] + for metric in dataset_data.get("metrics", []): + new_metric = { + "id": metric.get("id"), + "metric_name": metric.get("metric_name"), + "expression": metric.get("expression"), + "verbose_name": metric.get("verbose_name"), + "description": metric.get("description"), + "d3format": metric.get("d3format"), + "currency": metric.get("currency"), + "extra": metric.get("extra"), + "warning_text": metric.get("warning_text"), + "metric_type": metric.get("metric_type"), + "uuid": metric.get("uuid"), + } + updated_metrics.append({k: v for k, v in new_metric.items() if v is not None}) + + if changes_made: + payload_for_update = { + "database_id": dataset_data.get("database", {}).get("id"), + "table_name": dataset_data.get("table_name"), + "schema": dataset_data.get("schema"), + "columns": updated_columns, + "owners": [owner["id"] for owner in dataset_data.get("owners", [])], + "metrics": updated_metrics, + "extra": dataset_data.get("extra"), + "description": dataset_data.get("description"), + "sql": dataset_data.get("sql"), + "cache_timeout": dataset_data.get("cache_timeout"), + "catalog": dataset_data.get("catalog"), + "default_endpoint": dataset_data.get("default_endpoint"), + "external_url": dataset_data.get("external_url"), + "fetch_values_predicate": dataset_data.get("fetch_values_predicate"), + "filter_select_enabled": dataset_data.get("filter_select_enabled"), + "is_managed_externally": dataset_data.get("is_managed_externally"), + "is_sqllab_view": dataset_data.get("is_sqllab_view"), + "main_dttm_col": dataset_data.get("main_dttm_col"), + "normalize_columns": dataset_data.get("normalize_columns"), + "offset": dataset_data.get("offset"), + "template_params": dataset_data.get("template_params"), + } + + payload_for_update = {k: v for k, v in payload_for_update.items() if v is not None} + + superset_client.update_dataset(dataset_id, payload_for_update) + self.logger.info("[run_mapping][Success] Dataset %d columns' verbose_name updated.", dataset_id) + else: + self.logger.info("[run_mapping][State] No changes in columns' verbose_name, skipping update.") + + except (AssertionError, FileNotFoundError, Exception) as e: + self.logger.error("[run_mapping][Failure] %s", e, exc_info=True) + return + # [/DEF:run_mapping:Function] # [/DEF:DatasetMapper:Class] - + # [/DEF:superset_tool.utils.dataset_mapper:Module] diff --git a/superset_tool/utils/fileio.py b/superset_tool/utils/fileio.py index 1b41e09..78c1f13 100755 --- a/superset_tool/utils/fileio.py +++ b/superset_tool/utils/fileio.py @@ -28,6 +28,8 @@ from superset_tool.utils.logger import SupersetLogger # [DEF:create_temp_file:Function] # @PURPOSE: Контекстный менеджер для создания временного файла или директории с гарантированным удалением. +# @PRE: suffix должен быть строкой, определяющей тип ресурса. +# @POST: Временный ресурс создан и путь к нему возвращен; ресурс удален после выхода из контекста. # @PARAM: content (Optional[bytes]) - Бинарное содержимое для записи во временный файл. # @PARAM: suffix (str) - Суффикс ресурса. Если `.dir`, создается директория. # @PARAM: mode (str) - Режим записи в файл (e.g., 'wb'). @@ -37,87 +39,99 @@ from superset_tool.utils.logger import SupersetLogger @contextmanager def create_temp_file(content: Optional[bytes] = None, suffix: str = ".zip", mode: str = 'wb', dry_run = False, logger: Optional[SupersetLogger] = None) -> Generator[Path, None, None]: logger = logger or SupersetLogger(name="fileio") - resource_path = None - is_dir = suffix.startswith('.dir') - try: - if is_dir: - with tempfile.TemporaryDirectory(suffix=suffix) as temp_dir: - resource_path = Path(temp_dir) - logger.debug("[create_temp_file][State] Created temporary directory: %s", resource_path) + with logger.belief_scope("Create temporary resource"): + resource_path = None + is_dir = suffix.startswith('.dir') + try: + if is_dir: + with tempfile.TemporaryDirectory(suffix=suffix) as temp_dir: + resource_path = Path(temp_dir) + logger.debug("[create_temp_file][State] Created temporary directory: %s", resource_path) + yield resource_path + else: + fd, temp_path_str = tempfile.mkstemp(suffix=suffix) + resource_path = Path(temp_path_str) + os.close(fd) + if content: + resource_path.write_bytes(content) + logger.debug("[create_temp_file][State] Created temporary file: %s", resource_path) yield resource_path - else: - fd, temp_path_str = tempfile.mkstemp(suffix=suffix) - resource_path = Path(temp_path_str) - os.close(fd) - if content: - resource_path.write_bytes(content) - logger.debug("[create_temp_file][State] Created temporary file: %s", resource_path) - yield resource_path - finally: - if resource_path and resource_path.exists() and not dry_run: - try: - if resource_path.is_dir(): - shutil.rmtree(resource_path) - logger.debug("[create_temp_file][Cleanup] Removed temporary directory: %s", resource_path) - else: - resource_path.unlink() - logger.debug("[create_temp_file][Cleanup] Removed temporary file: %s", resource_path) - except OSError as e: - logger.error("[create_temp_file][Failure] Error during cleanup of %s: %s", resource_path, e) + finally: + if resource_path and resource_path.exists() and not dry_run: + try: + if resource_path.is_dir(): + shutil.rmtree(resource_path) + logger.debug("[create_temp_file][Cleanup] Removed temporary directory: %s", resource_path) + else: + resource_path.unlink() + logger.debug("[create_temp_file][Cleanup] Removed temporary file: %s", resource_path) + except OSError as e: + logger.error("[create_temp_file][Failure] Error during cleanup of %s: %s", resource_path, e) # [/DEF:create_temp_file:Function] # [DEF:remove_empty_directories:Function] # @PURPOSE: Рекурсивно удаляет все пустые поддиректории, начиная с указанного пути. +# @PRE: root_dir должен быть путем к существующей директории. +# @POST: Все пустые поддиректории удалены, возвращено их количество. # @PARAM: root_dir (str) - Путь к корневой директории для очистки. # @PARAM: logger (Optional[SupersetLogger]) - Экземпляр логгера. # @RETURN: int - Количество удаленных директорий. def remove_empty_directories(root_dir: str, logger: Optional[SupersetLogger] = None) -> int: logger = logger or SupersetLogger(name="fileio") - logger.info("[remove_empty_directories][Enter] Starting cleanup of empty directories in %s", root_dir) - removed_count = 0 - if not os.path.isdir(root_dir): - logger.error("[remove_empty_directories][Failure] Directory not found: %s", root_dir) - return 0 - for current_dir, _, _ in os.walk(root_dir, topdown=False): - if not os.listdir(current_dir): - try: - os.rmdir(current_dir) - removed_count += 1 - logger.info("[remove_empty_directories][State] Removed empty directory: %s", current_dir) - except OSError as e: - logger.error("[remove_empty_directories][Failure] Failed to remove %s: %s", current_dir, e) - logger.info("[remove_empty_directories][Exit] Removed %d empty directories.", removed_count) - return removed_count + with logger.belief_scope(f"Remove empty directories in {root_dir}"): + logger.info("[remove_empty_directories][Enter] Starting cleanup of empty directories in %s", root_dir) + removed_count = 0 + if not os.path.isdir(root_dir): + logger.error("[remove_empty_directories][Failure] Directory not found: %s", root_dir) + return 0 + for current_dir, _, _ in os.walk(root_dir, topdown=False): + if not os.listdir(current_dir): + try: + os.rmdir(current_dir) + removed_count += 1 + logger.info("[remove_empty_directories][State] Removed empty directory: %s", current_dir) + except OSError as e: + logger.error("[remove_empty_directories][Failure] Failed to remove %s: %s", current_dir, e) + logger.info("[remove_empty_directories][Exit] Removed %d empty directories.", removed_count) + return removed_count # [/DEF:remove_empty_directories:Function] # [DEF:read_dashboard_from_disk:Function] # @PURPOSE: Читает бинарное содержимое файла с диска. +# @PRE: file_path должен указывать на существующий файл. +# @POST: Возвращает байты содержимого и имя файла. # @PARAM: file_path (str) - Путь к файлу. # @PARAM: logger (Optional[SupersetLogger]) - Экземпляр логгера. # @RETURN: Tuple[bytes, str] - Кортеж (содержимое, имя файла). # @THROW: FileNotFoundError - Если файл не найден. def read_dashboard_from_disk(file_path: str, logger: Optional[SupersetLogger] = None) -> Tuple[bytes, str]: logger = logger or SupersetLogger(name="fileio") - path = Path(file_path) - assert path.is_file(), f"Файл дашборда не найден: {file_path}" - logger.info("[read_dashboard_from_disk][Enter] Reading file: %s", file_path) - content = path.read_bytes() - if not content: - logger.warning("[read_dashboard_from_disk][Warning] File is empty: %s", file_path) - return content, path.name + with logger.belief_scope(f"Read dashboard from {file_path}"): + path = Path(file_path) + assert path.is_file(), f"Файл дашборда не найден: {file_path}" + logger.info("[read_dashboard_from_disk][Enter] Reading file: %s", file_path) + content = path.read_bytes() + if not content: + logger.warning("[read_dashboard_from_disk][Warning] File is empty: %s", file_path) + return content, path.name # [/DEF:read_dashboard_from_disk:Function] # [DEF:calculate_crc32:Function] # @PURPOSE: Вычисляет контрольную сумму CRC32 для файла. +# @PRE: file_path должен быть объектом Path к существующему файлу. +# @POST: Возвращает 8-значную hex-строку CRC32. # @PARAM: file_path (Path) - Путь к файлу. # @RETURN: str - 8-значное шестнадцатеричное представление CRC32. # @THROW: IOError - При ошибках чтения файла. def calculate_crc32(file_path: Path) -> str: - with open(file_path, 'rb') as f: - crc32_value = zlib.crc32(f.read()) - return f"{crc32_value:08x}" + logger = SupersetLogger(name="fileio") + with logger.belief_scope(f"Calculate CRC32 for {file_path}"): + with open(file_path, 'rb') as f: + crc32_value = zlib.crc32(f.read()) + return f"{crc32_value:08x}" # [/DEF:calculate_crc32:Function] +# [SECTION: DATA_CLASSES] # [DEF:RetentionPolicy:DataClass] # @PURPOSE: Определяет политику хранения для архивов (ежедневные, еженедельные, ежемесячные). @dataclass @@ -126,9 +140,12 @@ class RetentionPolicy: weekly: int = 4 monthly: int = 12 # [/DEF:RetentionPolicy:DataClass] +# [/SECTION] # [DEF:archive_exports:Function] # @PURPOSE: Управляет архивом экспортированных файлов, применяя политику хранения и дедупликацию. +# @PRE: output_dir должен быть путем к существующей директории. +# @POST: Старые или дублирующиеся архивы удалены согласно политике. # @RELATION: CALLS -> apply_retention_policy # @RELATION: CALLS -> calculate_crc32 # @PARAM: output_dir (str) - Директория с архивами. @@ -137,113 +154,119 @@ class RetentionPolicy: # @PARAM: logger (Optional[SupersetLogger]) - Экземпляр логгера. def archive_exports(output_dir: str, policy: RetentionPolicy, deduplicate: bool = False, logger: Optional[SupersetLogger] = None) -> None: logger = logger or SupersetLogger(name="fileio") - output_path = Path(output_dir) - if not output_path.is_dir(): - logger.warning("[archive_exports][Skip] Archive directory not found: %s", output_dir) - return + with logger.belief_scope(f"Archive exports in {output_dir}"): + output_path = Path(output_dir) + if not output_path.is_dir(): + logger.warning("[archive_exports][Skip] Archive directory not found: %s", output_dir) + return - logger.info("[archive_exports][Enter] Managing archive in %s", output_dir) - - # 1. Collect all zip files - zip_files = list(output_path.glob("*.zip")) - if not zip_files: - logger.info("[archive_exports][State] No zip files found in %s", output_dir) - return + logger.info("[archive_exports][Enter] Managing archive in %s", output_dir) + + # 1. Collect all zip files + zip_files = list(output_path.glob("*.zip")) + if not zip_files: + logger.info("[archive_exports][State] No zip files found in %s", output_dir) + return - # 2. Deduplication - if deduplicate: - logger.info("[archive_exports][State] Starting deduplication...") - checksums = {} - files_to_remove = [] - - # Sort by modification time (newest first) to keep the latest version - zip_files.sort(key=lambda f: f.stat().st_mtime, reverse=True) - + # 2. Deduplication + if deduplicate: + logger.info("[archive_exports][State] Starting deduplication...") + checksums = {} + files_to_remove = [] + + # Sort by modification time (newest first) to keep the latest version + zip_files.sort(key=lambda f: f.stat().st_mtime, reverse=True) + + for file_path in zip_files: + try: + crc = calculate_crc32(file_path) + if crc in checksums: + files_to_remove.append(file_path) + logger.debug("[archive_exports][State] Duplicate found: %s (same as %s)", file_path.name, checksums[crc].name) + else: + checksums[crc] = file_path + except Exception as e: + logger.error("[archive_exports][Failure] Failed to calculate CRC32 for %s: %s", file_path, e) + + for f in files_to_remove: + try: + f.unlink() + zip_files.remove(f) + logger.info("[archive_exports][State] Removed duplicate: %s", f.name) + except OSError as e: + logger.error("[archive_exports][Failure] Failed to remove duplicate %s: %s", f, e) + + # 3. Retention Policy + files_with_dates = [] for file_path in zip_files: - try: - crc = calculate_crc32(file_path) - if crc in checksums: - files_to_remove.append(file_path) - logger.debug("[archive_exports][State] Duplicate found: %s (same as %s)", file_path.name, checksums[crc].name) - else: - checksums[crc] = file_path - except Exception as e: - logger.error("[archive_exports][Failure] Failed to calculate CRC32 for %s: %s", file_path, e) - - for f in files_to_remove: - try: - f.unlink() - zip_files.remove(f) - logger.info("[archive_exports][State] Removed duplicate: %s", f.name) - except OSError as e: - logger.error("[archive_exports][Failure] Failed to remove duplicate %s: %s", f, e) + # Try to extract date from filename + # Pattern: ..._YYYYMMDD_HHMMSS.zip or ..._YYYYMMDD.zip + match = re.search(r'_(\d{8})_', file_path.name) + file_date = None + if match: + try: + date_str = match.group(1) + file_date = datetime.strptime(date_str, "%Y%m%d").date() + except ValueError: + pass + + if not file_date: + # Fallback to modification time + file_date = datetime.fromtimestamp(file_path.stat().st_mtime).date() + + files_with_dates.append((file_path, file_date)) - # 3. Retention Policy - files_with_dates = [] - for file_path in zip_files: - # Try to extract date from filename - # Pattern: ..._YYYYMMDD_HHMMSS.zip or ..._YYYYMMDD.zip - match = re.search(r'_(\d{8})_', file_path.name) - file_date = None - if match: - try: - date_str = match.group(1) - file_date = datetime.strptime(date_str, "%Y%m%d").date() - except ValueError: - pass + files_to_keep = apply_retention_policy(files_with_dates, policy, logger) - if not file_date: - # Fallback to modification time - file_date = datetime.fromtimestamp(file_path.stat().st_mtime).date() - - files_with_dates.append((file_path, file_date)) - - files_to_keep = apply_retention_policy(files_with_dates, policy, logger) - - for file_path, _ in files_with_dates: - if file_path not in files_to_keep: - try: - file_path.unlink() - logger.info("[archive_exports][State] Removed by retention policy: %s", file_path.name) - except OSError as e: - logger.error("[archive_exports][Failure] Failed to remove %s: %s", file_path, e) + for file_path, _ in files_with_dates: + if file_path not in files_to_keep: + try: + file_path.unlink() + logger.info("[archive_exports][State] Removed by retention policy: %s", file_path.name) + except OSError as e: + logger.error("[archive_exports][Failure] Failed to remove %s: %s", file_path, e) # [/DEF:archive_exports:Function] # [DEF:apply_retention_policy:Function] # @PURPOSE: (Helper) Применяет политику хранения к списку файлов, возвращая те, что нужно сохранить. +# @PRE: files_with_dates is a list of (Path, date) tuples. +# @POST: Returns a set of files to keep. # @PARAM: files_with_dates (List[Tuple[Path, date]]) - Список файлов с датами. # @PARAM: policy (RetentionPolicy) - Политика хранения. # @PARAM: logger (SupersetLogger) - Логгер. # @RETURN: set - Множество путей к файлам, которые должны быть сохранены. -def apply_retention_policy(files_with_dates: List[Tuple[Path, date]], policy: RetentionPolicy, logger: SupersetLogger) -> set: - # Сортируем по дате (от новой к старой) - sorted_files = sorted(files_with_dates, key=lambda x: x[1], reverse=True) - # Словарь для хранения файлов по категориям - daily_files = [] - weekly_files = [] - monthly_files = [] - today = date.today() - for file_path, file_date in sorted_files: - # Ежедневные - if (today - file_date).days < policy.daily: - daily_files.append(file_path) - # Еженедельные - elif (today - file_date).days < policy.weekly * 7: - weekly_files.append(file_path) - # Ежемесячные - elif (today - file_date).days < policy.monthly * 30: - monthly_files.append(file_path) - # Возвращаем множество файлов, которые нужно сохранить - files_to_keep = set() - files_to_keep.update(daily_files) - files_to_keep.update(weekly_files[:policy.weekly]) - files_to_keep.update(monthly_files[:policy.monthly]) - logger.debug("[apply_retention_policy][State] Keeping %d files according to retention policy", len(files_to_keep)) - return files_to_keep +def apply_retention_policy(files_with_dates: List[Tuple[Path, date]], policy: RetentionPolicy, logger: SupersetLogger) -> set: + with logger.belief_scope("Apply retention policy"): + # Сортируем по дате (от новой к старой) + sorted_files = sorted(files_with_dates, key=lambda x: x[1], reverse=True) + # Словарь для хранения файлов по категориям + daily_files = [] + weekly_files = [] + monthly_files = [] + today = date.today() + for file_path, file_date in sorted_files: + # Ежедневные + if (today - file_date).days < policy.daily: + daily_files.append(file_path) + # Еженедельные + elif (today - file_date).days < policy.weekly * 7: + weekly_files.append(file_path) + # Ежемесячные + elif (today - file_date).days < policy.monthly * 30: + monthly_files.append(file_path) + # Возвращаем множество файлов, которые нужно сохранить + files_to_keep = set() + files_to_keep.update(daily_files) + files_to_keep.update(weekly_files[:policy.weekly]) + files_to_keep.update(monthly_files[:policy.monthly]) + logger.debug("[apply_retention_policy][State] Keeping %d files according to retention policy", len(files_to_keep)) + return files_to_keep # [/DEF:apply_retention_policy:Function] # [DEF:save_and_unpack_dashboard:Function] # @PURPOSE: Сохраняет бинарное содержимое ZIP-архива на диск и опционально распаковывает его. +# @PRE: zip_content должен быть байтами валидного ZIP-архива. +# @POST: ZIP-файл сохранен, и если unpack=True, он распакован в output_dir. # @PARAM: zip_content (bytes) - Содержимое ZIP-архива. # @PARAM: output_dir (Union[str, Path]) - Директория для сохранения. # @PARAM: unpack (bool) - Флаг, нужно ли распаковывать архив. @@ -253,27 +276,30 @@ def apply_retention_policy(files_with_dates: List[Tuple[Path, date]], policy: Re # @THROW: InvalidZipFormatError - При ошибке формата ZIP. def save_and_unpack_dashboard(zip_content: bytes, output_dir: Union[str, Path], unpack: bool = False, original_filename: Optional[str] = None, logger: Optional[SupersetLogger] = None) -> Tuple[Path, Optional[Path]]: logger = logger or SupersetLogger(name="fileio") - logger.info("[save_and_unpack_dashboard][Enter] Processing dashboard. Unpack: %s", unpack) - try: - output_path = Path(output_dir) - output_path.mkdir(parents=True, exist_ok=True) - zip_name = sanitize_filename(original_filename) if original_filename else f"dashboard_export_{datetime.now().strftime('%Y%m%d_%H%M%S')}.zip" - zip_path = output_path / zip_name - zip_path.write_bytes(zip_content) - logger.info("[save_and_unpack_dashboard][State] Dashboard saved to: %s", zip_path) - if unpack: - with zipfile.ZipFile(zip_path, 'r') as zip_ref: - zip_ref.extractall(output_path) - logger.info("[save_and_unpack_dashboard][State] Dashboard unpacked to: %s", output_path) - return zip_path, output_path - return zip_path, None - except zipfile.BadZipFile as e: - logger.error("[save_and_unpack_dashboard][Failure] Invalid ZIP archive: %s", e) - raise InvalidZipFormatError(f"Invalid ZIP file: {e}") from e + with logger.belief_scope("Save and unpack dashboard"): + logger.info("[save_and_unpack_dashboard][Enter] Processing dashboard. Unpack: %s", unpack) + try: + output_path = Path(output_dir) + output_path.mkdir(parents=True, exist_ok=True) + zip_name = sanitize_filename(original_filename) if original_filename else f"dashboard_export_{datetime.now().strftime('%Y%m%d_%H%M%S')}.zip" + zip_path = output_path / zip_name + zip_path.write_bytes(zip_content) + logger.info("[save_and_unpack_dashboard][State] Dashboard saved to: %s", zip_path) + if unpack: + with zipfile.ZipFile(zip_path, 'r') as zip_ref: + zip_ref.extractall(output_path) + logger.info("[save_and_unpack_dashboard][State] Dashboard unpacked to: %s", output_path) + return zip_path, output_path + return zip_path, None + except zipfile.BadZipFile as e: + logger.error("[save_and_unpack_dashboard][Failure] Invalid ZIP archive: %s", e) + raise InvalidZipFormatError(f"Invalid ZIP file: {e}") from e # [/DEF:save_and_unpack_dashboard:Function] # [DEF:update_yamls:Function] # @PURPOSE: Обновляет конфигурации в YAML-файлах, заменяя значения или применяя regex. +# @PRE: path должен быть существующей директорией. +# @POST: Все YAML файлы в директории обновлены согласно переданным параметрам. # @RELATION: CALLS -> _update_yaml_file # @THROW: FileNotFoundError - Если `path` не существует. # @PARAM: db_configs (Optional[List[Dict]]) - Список конфигураций для замены. @@ -283,79 +309,90 @@ def save_and_unpack_dashboard(zip_content: bytes, output_dir: Union[str, Path], # @PARAM: logger (Optional[SupersetLogger]) - Экземпляр логгера. def update_yamls(db_configs: Optional[List[Dict[str, Any]]] = None, path: str = "dashboards", regexp_pattern: Optional[LiteralString] = None, replace_string: Optional[LiteralString] = None, logger: Optional[SupersetLogger] = None) -> None: logger = logger or SupersetLogger(name="fileio") - logger.info("[update_yamls][Enter] Starting YAML configuration update.") - dir_path = Path(path) - assert dir_path.is_dir(), f"Путь {path} не существует или не является директорией" - - configs: List[Dict[str, Any]] = db_configs or [] - - for file_path in dir_path.rglob("*.yaml"): - _update_yaml_file(file_path, configs, regexp_pattern, replace_string, logger) + with logger.belief_scope("Update YAML configurations"): + logger.info("[update_yamls][Enter] Starting YAML configuration update.") + dir_path = Path(path) + assert dir_path.is_dir(), f"Путь {path} не существует или не является директорией" + + configs: List[Dict[str, Any]] = db_configs or [] + + for file_path in dir_path.rglob("*.yaml"): + _update_yaml_file(file_path, configs, regexp_pattern, replace_string, logger) # [/DEF:update_yamls:Function] # [DEF:_update_yaml_file:Function] # @PURPOSE: (Helper) Обновляет один YAML файл. +# @PRE: file_path должен быть объектом Path к существующему YAML файлу. +# @POST: Файл обновлен согласно переданным конфигурациям или регулярному выражению. # @PARAM: file_path (Path) - Путь к файлу. # @PARAM: db_configs (List[Dict]) - Конфигурации. # @PARAM: regexp_pattern (Optional[str]) - Паттерн. # @PARAM: replace_string (Optional[str]) - Замена. # @PARAM: logger (SupersetLogger) - Логгер. def _update_yaml_file(file_path: Path, db_configs: List[Dict[str, Any]], regexp_pattern: Optional[str], replace_string: Optional[str], logger: SupersetLogger) -> None: - # Читаем содержимое файла - try: - with open(file_path, 'r', encoding='utf-8') as f: - content = f.read() - except Exception as e: - logger.error("[_update_yaml_file][Failure] Failed to read %s: %s", file_path, e) - return - # Если задан pattern и replace_string, применяем замену по регулярному выражению - if regexp_pattern and replace_string: + with logger.belief_scope(f"Update YAML file: {file_path}"): + # Читаем содержимое файла try: - new_content = re.sub(regexp_pattern, replace_string, content) - if new_content != content: - with open(file_path, 'w', encoding='utf-8') as f: - f.write(new_content) - logger.info("[_update_yaml_file][State] Updated %s using regex pattern", file_path) + with open(file_path, 'r', encoding='utf-8') as f: + content = f.read() except Exception as e: - logger.error("[_update_yaml_file][Failure] Error applying regex to %s: %s", file_path, e) - # Если заданы конфигурации, заменяем значения (поддержка old/new) - if db_configs: - try: - # Прямой текстовый заменитель для старых/новых значений, чтобы сохранить структуру файла - modified_content = content - for cfg in db_configs: - # Ожидаем структуру: {'old': {...}, 'new': {...}} - old_cfg = cfg.get('old', {}) - new_cfg = cfg.get('new', {}) - for key, old_val in old_cfg.items(): - if key in new_cfg: - new_val = new_cfg[key] - # Заменяем только точные совпадения старого значения в тексте YAML, используя ключ для контекста - if isinstance(old_val, str): - # Ищем паттерн: key: "value" или key: value - key_pattern = re.escape(key) - val_pattern = re.escape(old_val) - # Группы: 1=ключ+разделитель, 2=открывающая кавычка (опц), 3=значение, 4=закрывающая кавычка (опц) - pattern = rf'({key_pattern}\s*:\s*)(["\']?)({val_pattern})(["\']?)' - - # Функция замены, сохраняющая кавычки если они были - def replacer(match): - prefix = match.group(1) - quote_open = match.group(2) - quote_close = match.group(4) - return f"{prefix}{quote_open}{new_val}{quote_close}" + logger.error("[_update_yaml_file][Failure] Failed to read %s: %s", file_path, e) + return + # Если задан pattern и replace_string, применяем замену по регулярному выражению + if regexp_pattern and replace_string: + try: + new_content = re.sub(regexp_pattern, replace_string, content) + if new_content != content: + with open(file_path, 'w', encoding='utf-8') as f: + f.write(new_content) + logger.info("[_update_yaml_file][State] Updated %s using regex pattern", file_path) + except Exception as e: + logger.error("[_update_yaml_file][Failure] Error applying regex to %s: %s", file_path, e) + # Если заданы конфигурации, заменяем значения (поддержка old/new) + if db_configs: + try: + # Прямой текстовый заменитель для старых/новых значений, чтобы сохранить структуру файла + modified_content = content + for cfg in db_configs: + # Ожидаем структуру: {'old': {...}, 'new': {...}} + old_cfg = cfg.get('old', {}) + new_cfg = cfg.get('new', {}) + for key, old_val in old_cfg.items(): + if key in new_cfg: + new_val = new_cfg[key] + # Заменяем только точные совпадения старого значения в тексте YAML, используя ключ для контекста + if isinstance(old_val, str): + # Ищем паттерн: key: "value" или key: value + key_pattern = re.escape(key) + val_pattern = re.escape(old_val) + # Группы: 1=ключ+разделитель, 2=открывающая кавычка (опц), 3=значение, 4=закрывающая кавычка (опц) + pattern = rf'({key_pattern}\s*:\s*)(["\']?)({val_pattern})(["\']?)' + + # [DEF:replacer:Function] + # @PURPOSE: Функция замены, сохраняющая кавычки если они были. + # @PRE: match должен быть объектом совпадения регулярного выражения. + # @POST: Возвращает строку с новым значением, сохраняя префикс и кавычки. + def replacer(match): + with logger.belief_scope("replacer"): + prefix = match.group(1) + quote_open = match.group(2) + quote_close = match.group(4) + return f"{prefix}{quote_open}{new_val}{quote_close}" + # [/DEF:replacer:Function] - modified_content = re.sub(pattern, replacer, modified_content) - logger.info("[_update_yaml_file][State] Replaced '%s' with '%s' for key %s in %s", old_val, new_val, key, file_path) - # Записываем обратно изменённый контент без парсинга YAML, сохраняем оригинальное форматирование - with open(file_path, 'w', encoding='utf-8') as f: - f.write(modified_content) - except Exception as e: - logger.error("[_update_yaml_file][Failure] Error performing raw replacement in %s: %s", file_path, e) + modified_content = re.sub(pattern, replacer, modified_content) + logger.info("[_update_yaml_file][State] Replaced '%s' with '%s' for key %s in %s", old_val, new_val, key, file_path) + # Записываем обратно изменённый контент без парсинга YAML, сохраняем оригинальное форматирование + with open(file_path, 'w', encoding='utf-8') as f: + f.write(modified_content) + except Exception as e: + logger.error("[_update_yaml_file][Failure] Error performing raw replacement in %s: %s", file_path, e) # [/DEF:_update_yaml_file:Function] # [DEF:create_dashboard_export:Function] # @PURPOSE: Создает ZIP-архив из указанных исходных путей. +# @PRE: source_paths должен содержать существующие пути. +# @POST: ZIP-архив создан по пути zip_path. # @PARAM: zip_path (Union[str, Path]) - Путь для сохранения ZIP архива. # @PARAM: source_paths (List[Union[str, Path]]) - Список исходных путей для архивации. # @PARAM: exclude_extensions (Optional[List[str]]) - Список расширений для исключения. @@ -363,96 +400,108 @@ def _update_yaml_file(file_path: Path, db_configs: List[Dict[str, Any]], regexp_ # @RETURN: bool - `True` при успехе, `False` при ошибке. def create_dashboard_export(zip_path: Union[str, Path], source_paths: List[Union[str, Path]], exclude_extensions: Optional[List[str]] = None, logger: Optional[SupersetLogger] = None) -> bool: logger = logger or SupersetLogger(name="fileio") - logger.info("[create_dashboard_export][Enter] Packing dashboard: %s -> %s", source_paths, zip_path) - try: - exclude_ext = [ext.lower() for ext in exclude_extensions or []] - with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf: - for src_path_str in source_paths: - src_path = Path(src_path_str) - assert src_path.exists(), f"Путь не найден: {src_path}" - for item in src_path.rglob('*'): - if item.is_file() and item.suffix.lower() not in exclude_ext: - arcname = item.relative_to(src_path.parent) - zipf.write(item, arcname) - logger.info("[create_dashboard_export][Exit] Archive created: %s", zip_path) - return True - except (IOError, zipfile.BadZipFile, AssertionError) as e: - logger.error("[create_dashboard_export][Failure] Error: %s", e, exc_info=True) - return False + with logger.belief_scope(f"Create dashboard export: {zip_path}"): + logger.info("[create_dashboard_export][Enter] Packing dashboard: %s -> %s", source_paths, zip_path) + try: + exclude_ext = [ext.lower() for ext in exclude_extensions or []] + with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf: + for src_path_str in source_paths: + src_path = Path(src_path_str) + assert src_path.exists(), f"Путь не найден: {src_path}" + for item in src_path.rglob('*'): + if item.is_file() and item.suffix.lower() not in exclude_ext: + arcname = item.relative_to(src_path.parent) + zipf.write(item, arcname) + logger.info("[create_dashboard_export][Exit] Archive created: %s", zip_path) + return True + except (IOError, zipfile.BadZipFile, AssertionError) as e: + logger.error("[create_dashboard_export][Failure] Error: %s", e, exc_info=True) + return False # [/DEF:create_dashboard_export:Function] # [DEF:sanitize_filename:Function] # @PURPOSE: Очищает строку от символов, недопустимых в именах файлов. +# @PRE: filename должен быть строкой. +# @POST: Возвращает строку без спецсимволов. # @PARAM: filename (str) - Исходное имя файла. # @RETURN: str - Очищенная строка. def sanitize_filename(filename: str) -> str: - return re.sub(r'[\\/*?:"<>|]', "_", filename).strip() + logger = SupersetLogger(name="fileio") + with logger.belief_scope(f"Sanitize filename: {filename}"): + return re.sub(r'[\\/*?:"<>|]', "_", filename).strip() # [/DEF:sanitize_filename:Function] # [DEF:get_filename_from_headers:Function] # @PURPOSE: Извлекает имя файла из HTTP заголовка 'Content-Disposition'. +# @PRE: headers должен быть словарем заголовков. +# @POST: Возвращает имя файла или None, если заголовок отсутствует. # @PARAM: headers (dict) - Словарь HTTP заголовков. -# @RETURN: Optional[str] - Имя файла или `None`. +# @RETURN: Optional[str] - Имя файла or `None`. def get_filename_from_headers(headers: dict) -> Optional[str]: - content_disposition = headers.get("Content-Disposition", "") - if match := re.search(r'filename="?([^"]+)"?', content_disposition): - return match.group(1).strip() - return None + logger = SupersetLogger(name="fileio") + with logger.belief_scope("Get filename from headers"): + content_disposition = headers.get("Content-Disposition", "") + if match := re.search(r'filename="?([^"]+)"?', content_disposition): + return match.group(1).strip() + return None # [/DEF:get_filename_from_headers:Function] # [DEF:consolidate_archive_folders:Function] # @PURPOSE: Консолидирует директории архивов на основе общего слага в имени. +# @PRE: root_directory должен быть объектом Path к существующей директории. +# @POST: Директории с одинаковым префиксом объединены в одну. # @THROW: TypeError, ValueError - Если `root_directory` невалиден. # @PARAM: root_directory (Path) - Корневая директория для консолидации. # @PARAM: logger (Optional[SupersetLogger]) - Экземпляр логгера. -def consolidate_archive_folders(root_directory: Path, logger: Optional[SupersetLogger] = None) -> None: +def consolidate_archive_folders(root_directory: Path, logger: Optional[SupersetLogger] = None) -> None: logger = logger or SupersetLogger(name="fileio") - assert isinstance(root_directory, Path), "root_directory must be a Path object." - assert root_directory.is_dir(), "root_directory must be an existing directory." - - logger.info("[consolidate_archive_folders][Enter] Consolidating archives in %s", root_directory) - # Собираем все директории с архивами - archive_dirs = [] - for item in root_directory.iterdir(): - if item.is_dir(): - # Проверяем, есть ли в директории ZIP-архивы - if any(item.glob("*.zip")): - archive_dirs.append(item) - # Группируем по слагу (части имени до первого '_') - slug_groups = {} - for dir_path in archive_dirs: - dir_name = dir_path.name - slug = dir_name.split('_')[0] if '_' in dir_name else dir_name - if slug not in slug_groups: - slug_groups[slug] = [] - slug_groups[slug].append(dir_path) - # Для каждой группы консолидируем - for slug, dirs in slug_groups.items(): - if len(dirs) <= 1: - continue - # Создаем целевую директорию - target_dir = root_directory / slug - target_dir.mkdir(exist_ok=True) - logger.info("[consolidate_archive_folders][State] Consolidating %d directories under %s", len(dirs), target_dir) - # Перемещаем содержимое - for source_dir in dirs: - if source_dir == target_dir: + with logger.belief_scope(f"Consolidate archives in {root_directory}"): + assert isinstance(root_directory, Path), "root_directory must be a Path object." + assert root_directory.is_dir(), "root_directory must be an existing directory." + + logger.info("[consolidate_archive_folders][Enter] Consolidating archives in %s", root_directory) + # Собираем все директории с архивами + archive_dirs = [] + for item in root_directory.iterdir(): + if item.is_dir(): + # Проверяем, есть ли в директории ZIP-архивы + if any(item.glob("*.zip")): + archive_dirs.append(item) + # Группируем по слагу (части имени до первого '_') + slug_groups = {} + for dir_path in archive_dirs: + dir_name = dir_path.name + slug = dir_name.split('_')[0] if '_' in dir_name else dir_name + if slug not in slug_groups: + slug_groups[slug] = [] + slug_groups[slug].append(dir_path) + # Для каждой группы консолидируем + for slug, dirs in slug_groups.items(): + if len(dirs) <= 1: continue - for item in source_dir.iterdir(): - dest_item = target_dir / item.name + # Создаем целевую директорию + target_dir = root_directory / slug + target_dir.mkdir(exist_ok=True) + logger.info("[consolidate_archive_folders][State] Consolidating %d directories under %s", len(dirs), target_dir) + # Перемещаем содержимое + for source_dir in dirs: + if source_dir == target_dir: + continue + for item in source_dir.iterdir(): + dest_item = target_dir / item.name + try: + if item.is_dir(): + shutil.move(str(item), str(dest_item)) + else: + shutil.move(str(item), str(dest_item)) + except Exception as e: + logger.error("[consolidate_archive_folders][Failure] Failed to move %s to %s: %s", item, dest_item, e) + # Удаляем исходную директорию try: - if item.is_dir(): - shutil.move(str(item), str(dest_item)) - else: - shutil.move(str(item), str(dest_item)) + source_dir.rmdir() + logger.info("[consolidate_archive_folders][State] Removed source directory: %s", source_dir) except Exception as e: - logger.error("[consolidate_archive_folders][Failure] Failed to move %s to %s: %s", item, dest_item, e) - # Удаляем исходную директорию - try: - source_dir.rmdir() - logger.info("[consolidate_archive_folders][State] Removed source directory: %s", source_dir) - except Exception as e: - logger.error("[consolidate_archive_folders][Failure] Failed to remove source directory %s: %s", source_dir, e) + logger.error("[consolidate_archive_folders][Failure] Failed to remove source directory %s: %s", source_dir, e) # [/DEF:consolidate_archive_folders:Function] # [/DEF:superset_tool.utils.fileio:Module] diff --git a/superset_tool/utils/logger.py b/superset_tool/utils/logger.py index 8313550..d7e5528 100755 --- a/superset_tool/utils/logger.py +++ b/superset_tool/utils/logger.py @@ -13,14 +13,31 @@ import logging import sys from datetime import datetime from pathlib import Path -from typing import Optional, Any, Mapping +from typing import Optional, Any, Mapping, Generator +from contextlib import contextmanager # [/SECTION] +# [DEF:belief_scope:Function] +# @PURPOSE: Context manager for belief state logging to maintain execution coherence. +# @PRE: scope_id must be a string. +# @POST: Entry and exit actions are logged. +# @PARAM: scope_id (str) - Identifier for the logical scope. +@contextmanager +def belief_scope(scope_id: str) -> Generator[None, None, None]: + """Context manager for belief state logging.""" + logger = logging.getLogger("superset_tool") + logger.debug(f"[BELIEF_ENTRY] {scope_id}") + try: + yield + finally: + logger.debug(f"[BELIEF_EXIT] {scope_id}") +# [/DEF:belief_scope:Function] + # [DEF:SupersetLogger:Class] # @PURPOSE: Обёртка над `logging.Logger`, которая упрощает конфигурацию и использование логгеров. # @RELATION: WRAPS -> logging.Logger class SupersetLogger: - # [DEF:SupersetLogger.__init__:Function] + # [DEF:__init__:Function] # @PURPOSE: Конфигурирует и инициализирует логгер, добавляя обработчики для файла и/или консоли. # @PRE: Если log_dir указан, путь должен быть валидным (или создаваемым). # @POST: `self.logger` готов к использованию с настроенными обработчиками. @@ -29,78 +46,110 @@ class SupersetLogger: # @PARAM: level (int) - Уровень логирования (e.g., `logging.INFO`). # @PARAM: console (bool) - Флаг для включения вывода в консоль. def __init__(self, name: str = "superset_tool", log_dir: Optional[Path] = None, level: int = logging.INFO, console: bool = True, logger: Optional[logging.Logger] = None) -> None: - if logger: - self.logger = logger - return + with belief_scope("__init__"): + if logger: + self.logger = logger + return - self.logger = logging.getLogger(name) - self.logger.setLevel(level) - self.logger.propagate = False + self.logger = logging.getLogger(name) + self.logger.setLevel(level) + self.logger.propagate = False - formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s") + formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s") - if self.logger.hasHandlers(): - self.logger.handlers.clear() + if self.logger.hasHandlers(): + self.logger.handlers.clear() - if log_dir: - log_dir.mkdir(parents=True, exist_ok=True) - timestamp = datetime.now().strftime("%Y%m%d") - file_handler = logging.FileHandler(log_dir / f"{name}_{timestamp}.log", encoding="utf-8") - file_handler.setFormatter(formatter) - self.logger.addHandler(file_handler) + if log_dir: + log_dir.mkdir(parents=True, exist_ok=True) + timestamp = datetime.now().strftime("%Y%m%d") + file_handler = logging.FileHandler(log_dir / f"{name}_{timestamp}.log", encoding="utf-8") + file_handler.setFormatter(formatter) + self.logger.addHandler(file_handler) - if console: - console_handler = logging.StreamHandler(sys.stdout) - console_handler.setFormatter(formatter) - self.logger.addHandler(console_handler) - # [/DEF:SupersetLogger.__init__:Function] + if console: + console_handler = logging.StreamHandler(sys.stdout) + console_handler.setFormatter(formatter) + self.logger.addHandler(console_handler) + # [/DEF:__init__:Function] - # [DEF:SupersetLogger._log:Function] + # [DEF:_log:Function] # @PURPOSE: (Helper) Универсальный метод для вызова соответствующего уровня логирования. + # @PRE: level_method должен быть вызываемым методом логгера. msg must be a string. + # @POST: Сообщение записано в лог. # @PARAM: level_method (Any) - Метод логгера (info, debug, etc). # @PARAM: msg (str) - Сообщение. # @PARAM: args (Any) - Аргументы форматирования. # @PARAM: extra (Optional[Mapping[str, Any]]) - Дополнительные данные. # @PARAM: exc_info (bool) - Добавлять ли информацию об исключении. def _log(self, level_method: Any, msg: str, *args: Any, extra: Optional[Mapping[str, Any]] = None, exc_info: bool = False) -> None: - level_method(msg, *args, extra=extra, exc_info=exc_info) - # [/DEF:SupersetLogger._log:Function] + with belief_scope("_log"): + level_method(msg, *args, extra=extra, exc_info=exc_info) + # [/DEF:_log:Function] - # [DEF:SupersetLogger.info:Function] + # [DEF:info:Function] # @PURPOSE: Записывает сообщение уровня INFO. + # @PRE: msg должен быть строкой. + # @POST: Сообщение уровня INFO записано. def info(self, msg: str, *args: Any, extra: Optional[Mapping[str, Any]] = None, exc_info: bool = False) -> None: - self._log(self.logger.info, msg, *args, extra=extra, exc_info=exc_info) - # [/DEF:SupersetLogger.info:Function] + with belief_scope("info"): + self._log(self.logger.info, msg, *args, extra=extra, exc_info=exc_info) + # [/DEF:info:Function] - # [DEF:SupersetLogger.debug:Function] + # [DEF:debug:Function] # @PURPOSE: Записывает сообщение уровня DEBUG. + # @PRE: msg должен быть строкой. + # @POST: Сообщение уровня DEBUG записано. def debug(self, msg: str, *args: Any, extra: Optional[Mapping[str, Any]] = None, exc_info: bool = False) -> None: - self._log(self.logger.debug, msg, *args, extra=extra, exc_info=exc_info) - # [/DEF:SupersetLogger.debug:Function] + with belief_scope("debug"): + self._log(self.logger.debug, msg, *args, extra=extra, exc_info=exc_info) + # [/DEF:debug:Function] - # [DEF:SupersetLogger.warning:Function] + # [DEF:warning:Function] # @PURPOSE: Записывает сообщение уровня WARNING. + # @PRE: msg должен быть строкой. + # @POST: Сообщение уровня WARNING записано. def warning(self, msg: str, *args: Any, extra: Optional[Mapping[str, Any]] = None, exc_info: bool = False) -> None: - self._log(self.logger.warning, msg, *args, extra=extra, exc_info=exc_info) - # [/DEF:SupersetLogger.warning:Function] + with belief_scope("warning"): + self._log(self.logger.warning, msg, *args, extra=extra, exc_info=exc_info) + # [/DEF:warning:Function] - # [DEF:SupersetLogger.error:Function] + # [DEF:error:Function] # @PURPOSE: Записывает сообщение уровня ERROR. + # @PRE: msg должен быть строкой. + # @POST: Сообщение уровня ERROR записано. def error(self, msg: str, *args: Any, extra: Optional[Mapping[str, Any]] = None, exc_info: bool = False) -> None: - self._log(self.logger.error, msg, *args, extra=extra, exc_info=exc_info) - # [/DEF:SupersetLogger.error:Function] + with belief_scope("error"): + self._log(self.logger.error, msg, *args, extra=extra, exc_info=exc_info) + # [/DEF:error:Function] - # [DEF:SupersetLogger.critical:Function] + # [DEF:critical:Function] # @PURPOSE: Записывает сообщение уровня CRITICAL. + # @PRE: msg должен быть строкой. + # @POST: Сообщение уровня CRITICAL записано. def critical(self, msg: str, *args: Any, extra: Optional[Mapping[str, Any]] = None, exc_info: bool = False) -> None: - self._log(self.logger.critical, msg, *args, extra=extra, exc_info=exc_info) - # [/DEF:SupersetLogger.critical:Function] + with belief_scope("critical"): + self._log(self.logger.critical, msg, *args, extra=extra, exc_info=exc_info) + # [/DEF:critical:Function] - # [DEF:SupersetLogger.exception:Function] + # [DEF:exception:Function] # @PURPOSE: Записывает сообщение уровня ERROR вместе с трассировкой стека текущего исключения. + # @PRE: msg должен быть строкой. + # @POST: Сообщение об ошибке с traceback записано. def exception(self, msg: str, *args: Any, **kwargs: Any) -> None: - self.logger.exception(msg, *args, **kwargs) - # [/DEF:SupersetLogger.exception:Function] + with belief_scope("exception"): + self.logger.exception(msg, *args, **kwargs) + # [/DEF:exception:Function] + + # [DEF:belief_scope:Method] + # @PURPOSE: Instance method wrapper for belief_scope context manager. + # @PRE: scope_id must be a string. + # @POST: Enters the belief scope. + @contextmanager + def belief_scope(self, scope_id: str) -> Generator[None, None, None]: + with belief_scope(scope_id): + yield + # [/DEF:belief_scope:Method] # [/DEF:SupersetLogger:Class] diff --git a/superset_tool/utils/network.py b/superset_tool/utils/network.py index 7988e49..a996d24 100755 --- a/superset_tool/utils/network.py +++ b/superset_tool/utils/network.py @@ -16,6 +16,7 @@ from pathlib import Path import requests from requests.adapters import HTTPAdapter import urllib3 +from superset_tool.utils.logger import belief_scope from urllib3.util.retry import Retry from superset_tool.exceptions import AuthenticationError, NetworkError, DashboardNotFoundError, SupersetAPIError, PermissionDeniedError from superset_tool.utils.logger import SupersetLogger @@ -26,15 +27,18 @@ from superset_tool.utils.logger import SupersetLogger class APIClient: DEFAULT_TIMEOUT = 30 - # [DEF:APIClient.__init__:Function] + # [DEF:__init__:Function] # @PURPOSE: Инициализирует API клиент с конфигурацией, сессией и логгером. # @PARAM: config (Dict[str, Any]) - Конфигурация. # @PARAM: verify_ssl (bool) - Проверять ли SSL. # @PARAM: timeout (int) - Таймаут запросов. # @PARAM: logger (Optional[SupersetLogger]) - Логгер. + # @PRE: config must contain 'base_url' and 'auth'. + # @POST: APIClient instance is initialized with a session. def __init__(self, config: Dict[str, Any], verify_ssl: bool = True, timeout: int = DEFAULT_TIMEOUT, logger: Optional[SupersetLogger] = None): - self.logger = logger or SupersetLogger(name="APIClient") - self.logger.info("[APIClient.__init__][Entry] Initializing APIClient.") + with belief_scope("__init__"): + self.logger = logger or SupersetLogger(name="APIClient") + self.logger.info("[APIClient.__init__][Entry] Initializing APIClient.") self.base_url: str = config.get("base_url", "") self.auth = config.get("auth") self.request_settings = {"verify_ssl": verify_ssl, "timeout": timeout} @@ -42,13 +46,16 @@ class APIClient: self._tokens: Dict[str, str] = {} self._authenticated = False self.logger.info("[APIClient.__init__][Exit] APIClient initialized.") - # [/DEF:APIClient.__init__:Function] + # [/DEF:__init__:Function] - # [DEF:APIClient._init_session:Function] + # [DEF:_init_session:Function] # @PURPOSE: Создает и настраивает `requests.Session` с retry-логикой. + # @PRE: self.request_settings must be initialized. + # @POST: Returns a configured requests.Session instance. # @RETURN: requests.Session - Настроенная сессия. def _init_session(self) -> requests.Session: - session = requests.Session() + with belief_scope("_init_session"): + session = requests.Session() retries = Retry(total=3, backoff_factor=0.5, status_forcelist=[500, 502, 503, 504]) adapter = HTTPAdapter(max_retries=retries) session.mount('http://', adapter) @@ -58,58 +65,66 @@ class APIClient: self.logger.warning("[_init_session][State] SSL verification disabled.") session.verify = self.request_settings["verify_ssl"] return session - # [/DEF:APIClient._init_session:Function] + # [/DEF:_init_session:Function] - # [DEF:APIClient.authenticate:Function] + # [DEF:authenticate:Function] # @PURPOSE: Выполняет аутентификацию в Superset API и получает access и CSRF токены. + # @PRE: self.auth and self.base_url must be valid. # @POST: `self._tokens` заполнен, `self._authenticated` установлен в `True`. # @RETURN: Dict[str, str] - Словарь с токенами. # @THROW: AuthenticationError, NetworkError - при ошибках. def authenticate(self) -> Dict[str, str]: - self.logger.info("[authenticate][Enter] Authenticating to %s", self.base_url) - try: - login_url = f"{self.base_url}/security/login" - response = self.session.post(login_url, json=self.auth, timeout=self.request_settings["timeout"]) - response.raise_for_status() - access_token = response.json()["access_token"] - - csrf_url = f"{self.base_url}/security/csrf_token/" - csrf_response = self.session.get(csrf_url, headers={"Authorization": f"Bearer {access_token}"}, timeout=self.request_settings["timeout"]) - csrf_response.raise_for_status() - - self._tokens = {"access_token": access_token, "csrf_token": csrf_response.json()["result"]} - self._authenticated = True - self.logger.info("[authenticate][Exit] Authenticated successfully.") - return self._tokens - except requests.exceptions.HTTPError as e: - raise AuthenticationError(f"Authentication failed: {e}") from e - except (requests.exceptions.RequestException, KeyError) as e: - raise NetworkError(f"Network or parsing error during authentication: {e}") from e - # [/DEF:APIClient.authenticate:Function] + with belief_scope("authenticate"): + self.logger.info("[authenticate][Enter] Authenticating to %s", self.base_url) + try: + login_url = f"{self.base_url}/security/login" + response = self.session.post(login_url, json=self.auth, timeout=self.request_settings["timeout"]) + response.raise_for_status() + access_token = response.json()["access_token"] + + csrf_url = f"{self.base_url}/security/csrf_token/" + csrf_response = self.session.get(csrf_url, headers={"Authorization": f"Bearer {access_token}"}, timeout=self.request_settings["timeout"]) + csrf_response.raise_for_status() + + self._tokens = {"access_token": access_token, "csrf_token": csrf_response.json()["result"]} + self._authenticated = True + self.logger.info("[authenticate][Exit] Authenticated successfully.") + return self._tokens + except requests.exceptions.HTTPError as e: + raise AuthenticationError(f"Authentication failed: {e}") from e + except (requests.exceptions.RequestException, KeyError) as e: + raise NetworkError(f"Network or parsing error during authentication: {e}") from e + # [/DEF:authenticate:Function] @property + # [DEF:headers:Function] + # @PURPOSE: Возвращает HTTP-заголовки для аутентифицированных запросов. + # @PRE: APIClient is initialized and authenticated or can be authenticated. + # @POST: Returns headers including auth tokens. def headers(self) -> Dict[str, str]: - # [DEF:APIClient.headers:Function] - # @PURPOSE: Возвращает HTTP-заголовки для аутентифицированных запросов. - if not self._authenticated: self.authenticate() - return { + with belief_scope("headers"): + if not self._authenticated: self.authenticate() + return { "Authorization": f"Bearer {self._tokens['access_token']}", "X-CSRFToken": self._tokens.get("csrf_token", ""), "Referer": self.base_url, "Content-Type": "application/json" } - # [/DEF:APIClient.headers:Function] + # [/DEF:headers:Function] - # [DEF:APIClient.request:Function] + # [DEF:request:Function] # @PURPOSE: Выполняет универсальный HTTP-запрос к API. - # @RETURN: `requests.Response` если `raw_response=True`, иначе `dict`. - # @THROW: SupersetAPIError, NetworkError и их подклассы. # @PARAM: method (str) - HTTP метод. # @PARAM: endpoint (str) - API эндпоинт. # @PARAM: headers (Optional[Dict]) - Дополнительные заголовки. # @PARAM: raw_response (bool) - Возвращать ли сырой ответ. + # @PRE: method and endpoint must be strings. + # @POST: Returns response content or raw Response object. + # @RETURN: `requests.Response` если `raw_response=True`, иначе `dict`. + # @THROW: SupersetAPIError, NetworkError и их подклассы. def request(self, method: str, endpoint: str, headers: Optional[Dict] = None, raw_response: bool = False, **kwargs) -> Union[requests.Response, Dict[str, Any]]: - full_url = f"{self.base_url}{endpoint}" + with belief_scope("request"): + full_url = f"{self.base_url}{endpoint}" _headers = self.headers.copy() if headers: _headers.update(headers) @@ -121,41 +136,50 @@ class APIClient: self._handle_http_error(e, endpoint) except requests.exceptions.RequestException as e: self._handle_network_error(e, full_url) - # [/DEF:APIClient.request:Function] + # [/DEF:request:Function] - # [DEF:APIClient._handle_http_error:Function] + # [DEF:_handle_http_error:Function] # @PURPOSE: (Helper) Преобразует HTTP ошибки в кастомные исключения. # @PARAM: e (requests.exceptions.HTTPError) - Ошибка. # @PARAM: endpoint (str) - Эндпоинт. + # @PRE: e must be a valid HTTPError with a response. + # @POST: Raises a specific SupersetAPIError or subclass. def _handle_http_error(self, e: requests.exceptions.HTTPError, endpoint: str): - status_code = e.response.status_code + with belief_scope("_handle_http_error"): + status_code = e.response.status_code if status_code == 404: raise DashboardNotFoundError(endpoint) from e if status_code == 403: raise PermissionDeniedError() from e if status_code == 401: raise AuthenticationError() from e raise SupersetAPIError(f"API Error {status_code}: {e.response.text}") from e - # [/DEF:APIClient._handle_http_error:Function] + # [/DEF:_handle_http_error:Function] - # [DEF:APIClient._handle_network_error:Function] + # [DEF:_handle_network_error:Function] # @PURPOSE: (Helper) Преобразует сетевые ошибки в `NetworkError`. # @PARAM: e (requests.exceptions.RequestException) - Ошибка. # @PARAM: url (str) - URL. + # @PRE: e must be a RequestException. + # @POST: Raises a NetworkError. def _handle_network_error(self, e: requests.exceptions.RequestException, url: str): - if isinstance(e, requests.exceptions.Timeout): msg = "Request timeout" - elif isinstance(e, requests.exceptions.ConnectionError): msg = "Connection error" - else: msg = f"Unknown network error: {e}" - raise NetworkError(msg, url=url) from e - # [/DEF:APIClient._handle_network_error:Function] + with belief_scope("_handle_network_error"): + if isinstance(e, requests.exceptions.Timeout): msg = "Request timeout" + elif isinstance(e, requests.exceptions.ConnectionError): msg = "Connection error" + else: msg = f"Unknown network error: {e}" + raise NetworkError(msg, url=url) from e + # [/DEF:_handle_network_error:Function] - # [DEF:APIClient.upload_file:Function] + # [DEF:upload_file:Function] # @PURPOSE: Загружает файл на сервер через multipart/form-data. - # @RETURN: Ответ API в виде словаря. - # @THROW: SupersetAPIError, NetworkError, TypeError. # @PARAM: endpoint (str) - Эндпоинт. # @PARAM: file_info (Dict[str, Any]) - Информация о файле. # @PARAM: extra_data (Optional[Dict]) - Дополнительные данные. # @PARAM: timeout (Optional[int]) - Таймаут. + # @PRE: file_info must contain 'file_obj' and 'file_name'. + # @POST: File is uploaded and response returned. + # @RETURN: Ответ API в виде словаря. + # @THROW: SupersetAPIError, NetworkError, TypeError. def upload_file(self, endpoint: str, file_info: Dict[str, Any], extra_data: Optional[Dict] = None, timeout: Optional[int] = None) -> Dict: - full_url = f"{self.base_url}{endpoint}" + with belief_scope("upload_file"): + full_url = f"{self.base_url}{endpoint}" _headers = self.headers.copy(); _headers.pop('Content-Type', None) file_obj, file_name, form_field = file_info.get("file_obj"), file_info.get("file_name"), file_info.get("form_field", "file") @@ -170,52 +194,61 @@ class APIClient: raise TypeError(f"Unsupported file_obj type: {type(file_obj)}") return self._perform_upload(full_url, files_payload, extra_data, _headers, timeout) - # [/DEF:APIClient.upload_file:Function] + # [/DEF:upload_file:Function] - # [DEF:APIClient._perform_upload:Function] + # [DEF:_perform_upload:Function] # @PURPOSE: (Helper) Выполняет POST запрос с файлом. # @PARAM: url (str) - URL. # @PARAM: files (Dict) - Файлы. # @PARAM: data (Optional[Dict]) - Данные. # @PARAM: headers (Dict) - Заголовки. # @PARAM: timeout (Optional[int]) - Таймаут. + # @PRE: url, files, and headers must be provided. + # @POST: POST request is performed and JSON response returned. # @RETURN: Dict - Ответ. def _perform_upload(self, url: str, files: Dict, data: Optional[Dict], headers: Dict, timeout: Optional[int]) -> Dict: - try: - response = self.session.post(url, files=files, data=data or {}, headers=headers, timeout=timeout or self.request_settings["timeout"]) - response.raise_for_status() - # Добавляем логирование для отладки - if response.status_code == 200: - try: - return response.json() - except Exception as json_e: - self.logger.debug(f"[_perform_upload][Debug] Response is not valid JSON: {response.text[:200]}...") - raise SupersetAPIError(f"API error during upload: Response is not valid JSON: {json_e}") from json_e - return response.json() - except requests.exceptions.HTTPError as e: - raise SupersetAPIError(f"API error during upload: {e.response.text}") from e - except requests.exceptions.RequestException as e: - raise NetworkError(f"Network error during upload: {e}", url=url) from e - # [/DEF:APIClient._perform_upload:Function] + with belief_scope("_perform_upload"): + try: + response = self.session.post(url, files=files, data=data or {}, headers=headers, timeout=timeout or self.request_settings["timeout"]) + response.raise_for_status() + # Добавляем логирование для отладки + if response.status_code == 200: + try: + return response.json() + except Exception as json_e: + self.logger.debug(f"[_perform_upload][Debug] Response is not valid JSON: {response.text[:200]}...") + raise SupersetAPIError(f"API error during upload: Response is not valid JSON: {json_e}") from json_e + return response.json() + except requests.exceptions.HTTPError as e: + raise SupersetAPIError(f"API error during upload: {e.response.text}") from e + except requests.exceptions.RequestException as e: + raise NetworkError(f"Network error during upload: {e}", url=url) from e + # [/DEF:_perform_upload:Function] - # [DEF:APIClient.fetch_paginated_count:Function] + # [DEF:fetch_paginated_count:Function] # @PURPOSE: Получает общее количество элементов для пагинации. # @PARAM: endpoint (str) - Эндпоинт. # @PARAM: query_params (Dict) - Параметры запроса. # @PARAM: count_field (str) - Поле с количеством. + # @PRE: query_params must be a dictionary. + # @POST: Returns total count of items. # @RETURN: int - Количество. def fetch_paginated_count(self, endpoint: str, query_params: Dict, count_field: str = "count") -> int: - response_json = cast(Dict[str, Any], self.request("GET", endpoint, params={"q": json.dumps(query_params)})) + with belief_scope("fetch_paginated_count"): + response_json = cast(Dict[str, Any], self.request("GET", endpoint, params={"q": json.dumps(query_params)})) return response_json.get(count_field, 0) - # [/DEF:APIClient.fetch_paginated_count:Function] + # [/DEF:fetch_paginated_count:Function] - # [DEF:APIClient.fetch_paginated_data:Function] + # [DEF:fetch_paginated_data:Function] # @PURPOSE: Автоматически собирает данные со всех страниц пагинированного эндпоинта. # @PARAM: endpoint (str) - Эндпоинт. # @PARAM: pagination_options (Dict[str, Any]) - Опции пагинации. + # @PRE: pagination_options must contain 'base_query', 'total_count', 'results_field'. + # @POST: Returns all items across all pages. # @RETURN: List[Any] - Список данных. def fetch_paginated_data(self, endpoint: str, pagination_options: Dict[str, Any]) -> List[Any]: - base_query, total_count = pagination_options["base_query"], pagination_options["total_count"] + with belief_scope("fetch_paginated_data"): + base_query, total_count = pagination_options["base_query"], pagination_options["total_count"] results_field, page_size = pagination_options["results_field"], base_query.get('page_size') assert page_size and page_size > 0, "'page_size' must be a positive number." @@ -225,7 +258,7 @@ class APIClient: response_json = cast(Dict[str, Any], self.request("GET", endpoint, params={"q": json.dumps(query)})) results.extend(response_json.get(results_field, [])) return results - # [/DEF:APIClient.fetch_paginated_data:Function] + # [/DEF:fetch_paginated_data:Function] # [/DEF:APIClient:Class] diff --git a/superset_tool/utils/whiptail_fallback.py b/superset_tool/utils/whiptail_fallback.py index 2e7a33e..eaf8b0f 100755 --- a/superset_tool/utils/whiptail_fallback.py +++ b/superset_tool/utils/whiptail_fallback.py @@ -8,6 +8,7 @@ # [SECTION: IMPORTS] import sys from typing import List, Tuple, Optional, Any +from .logger import belief_scope # [/SECTION] # [DEF:menu:Function] @@ -15,17 +16,20 @@ from typing import List, Tuple, Optional, Any # @PARAM: title (str) - Заголовок меню. # @PARAM: prompt (str) - Приглашение к вводу. # @PARAM: choices (List[str]) - Список вариантов для выбора. +# @PRE: choices must be a non-empty list of strings. +# @POST: Returns a tuple with return code and selected choice. # @RETURN: Tuple[int, Optional[str]] - Кортеж (код возврата, выбранный элемент). rc=0 - успех. def menu(title: str, prompt: str, choices: List[str], **kwargs) -> Tuple[int, Optional[str]]: - print(f"\n=== {title} ===\n{prompt}") - for idx, item in enumerate(choices, 1): - print(f"{idx}) {item}") - try: - raw = input("\nВведите номер (0 – отмена): ").strip() - sel = int(raw) - return (0, choices[sel - 1]) if 0 < sel <= len(choices) else (1, None) - except (ValueError, IndexError): - return 1, None + with belief_scope("menu"): + print(f"\n=== {title} ===\n{prompt}") + for idx, item in enumerate(choices, 1): + print(f"{idx}) {item}") + try: + raw = input("\nВведите номер (0 – отмена): ").strip() + sel = int(raw) + return (0, choices[sel - 1]) if 0 < sel <= len(choices) else (1, None) + except (ValueError, IndexError): + return 1, None # [/DEF:menu:Function] # [DEF:checklist:Function] @@ -33,72 +37,121 @@ def menu(title: str, prompt: str, choices: List[str], **kwargs) -> Tuple[int, Op # @PARAM: title (str) - Заголовок. # @PARAM: prompt (str) - Приглашение к вводу. # @PARAM: options (List[Tuple[str, str]]) - Список кортежей (значение, метка). +# @PRE: options must be a list of (value, label) tuples. +# @POST: Returns a list of selected values. # @RETURN: Tuple[int, List[str]] - Кортеж (код возврата, список выбранных значений). def checklist(title: str, prompt: str, options: List[Tuple[str, str]], **kwargs) -> Tuple[int, List[str]]: - print(f"\n=== {title} ===\n{prompt}") - for idx, (val, label) in enumerate(options, 1): - print(f"{idx}) [{val}] {label}") - raw = input("\nВведите номера через запятую (пустой ввод → отказ): ").strip() - if not raw: return 1, [] - try: - indices = {int(x.strip()) for x in raw.split(",") if x.strip()} - selected_values = [options[i - 1][0] for i in indices if 0 < i <= len(options)] - return 0, selected_values - except (ValueError, IndexError): - return 1, [] + with belief_scope("checklist"): + print(f"\n=== {title} ===\n{prompt}") + for idx, (val, label) in enumerate(options, 1): + print(f"{idx}) [{val}] {label}") + raw = input("\nВведите номера через запятую (пустой ввод → отказ): ").strip() + if not raw: return 1, [] + try: + indices = {int(x.strip()) for x in raw.split(",") if x.strip()} + selected_values = [options[i - 1][0] for i in indices if 0 < i <= len(options)] + return 0, selected_values + except (ValueError, IndexError): + return 1, [] # [/DEF:checklist:Function] # [DEF:yesno:Function] # @PURPOSE: Задает вопрос с ответом да/нет. # @PARAM: title (str) - Заголовок. # @PARAM: question (str) - Вопрос для пользователя. +# @PRE: question must be a string. +# @POST: Returns boolean based on user input. # @RETURN: bool - `True`, если пользователь ответил "да". def yesno(title: str, question: str, **kwargs) -> bool: - ans = input(f"\n=== {title} ===\n{question} (y/n): ").strip().lower() - return ans in ("y", "yes", "да", "д") + with belief_scope("yesno"): + ans = input(f"\n=== {title} ===\n{question} (y/n): ").strip().lower() + return ans in ("y", "yes", "да", "д") # [/DEF:yesno:Function] # [DEF:msgbox:Function] # @PURPOSE: Отображает информационное сообщение. # @PARAM: title (str) - Заголовок. # @PARAM: msg (str) - Текст сообщения. +# @PRE: msg must be a string. +# @POST: Message is printed to console. def msgbox(title: str, msg: str, **kwargs) -> None: - print(f"\n=== {title} ===\n{msg}\n") + with belief_scope("msgbox"): + print(f"\n=== {title} ===\n{msg}\n") # [/DEF:msgbox:Function] # [DEF:inputbox:Function] # @PURPOSE: Запрашивает у пользователя текстовый ввод. # @PARAM: title (str) - Заголовок. # @PARAM: prompt (str) - Приглашение к вводу. +# @PRE: prompt must be a string. +# @POST: Returns user input string. # @RETURN: Tuple[int, Optional[str]] - Кортеж (код возврата, введенная строка). def inputbox(title: str, prompt: str, **kwargs) -> Tuple[int, Optional[str]]: - print(f"\n=== {title} ===") - val = input(f"{prompt}\n") - return (0, val) if val else (1, None) + with belief_scope("inputbox"): + print(f"\n=== {title} ===") + val = input(f"{prompt}\n") + return (0, val) if val else (1, None) # [/DEF:inputbox:Function] # [DEF:_ConsoleGauge:Class] # @PURPOSE: Контекстный менеджер для имитации `whiptail gauge` в консоли. class _ConsoleGauge: + # [DEF:__init__:Function] + # @PURPOSE: Initializes the gauge. + # @PRE: title must be a string. + # @POST: Instance initialized. def __init__(self, title: str, **kwargs): - self.title = title + with belief_scope("__init__"): + self.title = title + # [/DEF:__init__:Function] + + # [DEF:__enter__:Function] + # @PURPOSE: Enters the context. + # @PRE: Instance initialized. + # @POST: Header printed, returns self. def __enter__(self): - print(f"\n=== {self.title} ===") - return self + with belief_scope("__enter__"): + print(f"\n=== {self.title} ===") + return self + # [/DEF:__enter__:Function] + + # [DEF:__exit__:Function] + # @PURPOSE: Exits the context. + # @PRE: Context entered. + # @POST: Newline printed. def __exit__(self, exc_type, exc_val, exc_tb): - sys.stdout.write("\n"); sys.stdout.flush() + with belief_scope("__exit__"): + sys.stdout.write("\n"); sys.stdout.flush() + # [/DEF:__exit__:Function] + + # [DEF:set_text:Function] + # @PURPOSE: Sets the gauge text. + # @PRE: txt must be a string. + # @POST: Text written to stdout. def set_text(self, txt: str) -> None: - sys.stdout.write(f"\r{txt} "); sys.stdout.flush() + with belief_scope("set_text"): + sys.stdout.write(f"\r{txt} "); sys.stdout.flush() + # [/DEF:set_text:Function] + + # [DEF:set_percent:Function] + # @PURPOSE: Sets the gauge percentage. + # @PRE: percent must be an integer. + # @POST: Percentage written to stdout. def set_percent(self, percent: int) -> None: - sys.stdout.write(f"{percent}%"); sys.stdout.flush() + with belief_scope("set_percent"): + sys.stdout.write(f"{percent}%"); sys.stdout.flush() + # [/DEF:set_percent:Function] # [/DEF:_ConsoleGauge:Class] # [DEF:gauge:Function] # @PURPOSE: Создает и возвращает экземпляр `_ConsoleGauge`. +# @PRE: title must be a string. +# @POST: Returns an instance of _ConsoleGauge. # @PARAM: title (str) - Заголовок для индикатора прогресса. # @RETURN: _ConsoleGauge - Экземпляр контекстного менеджера. def gauge(title: str, **kwargs) -> _ConsoleGauge: - return _ConsoleGauge(title, **kwargs) + with belief_scope("gauge"): + return _ConsoleGauge(title, **kwargs) # [/DEF:gauge:Function] # [/DEF:superset_tool.utils.whiptail_fallback:Module]