diff --git a/run.py b/run.py index 28afb60c..c5e387c6 100755 --- a/run.py +++ b/run.py @@ -51,7 +51,6 @@ if debug_mode: # Try to import the plugin system directly to get better error info print("DEBUG: Attempting to import src.plugin_system...", flush=True) - from src.plugin_system import PluginManager print("DEBUG: Plugin system import successful", flush=True) except ImportError as e: print(f"DEBUG: Plugin system import failed: {e}", flush=True) diff --git a/scripts/add_defaults_to_schemas.py b/scripts/add_defaults_to_schemas.py index 9460c9ca..c0474530 100755 --- a/scripts/add_defaults_to_schemas.py +++ b/scripts/add_defaults_to_schemas.py @@ -9,7 +9,7 @@ and preventing validation errors. import json import sys from pathlib import Path -from typing import Any, Dict, List, Optional +from typing import Any, Dict, List def get_default_for_field(prop: Dict[str, Any]) -> Any: diff --git a/scripts/analyze_plugin_schemas.py b/scripts/analyze_plugin_schemas.py index c3c63d49..d10a308f 100755 --- a/scripts/analyze_plugin_schemas.py +++ b/scripts/analyze_plugin_schemas.py @@ -9,9 +9,8 @@ Analyze all plugin config schemas to identify issues: """ import json -import os from pathlib import Path -from typing import Dict, List, Set, Any +from typing import Dict, List, Any import jsonschema from jsonschema import Draft7Validator diff --git a/scripts/debug/check_imports.py b/scripts/debug/check_imports.py index c4593f3a..a1cefae0 100644 --- a/scripts/debug/check_imports.py +++ b/scripts/debug/check_imports.py @@ -3,8 +3,6 @@ Check what imports are actually in the app.py file on the Pi """ -import sys -import os from pathlib import Path # Read the app.py file and check the import lines diff --git a/scripts/dev/validate_python.py b/scripts/dev/validate_python.py index 57c864d3..b10a3ee9 100644 --- a/scripts/dev/validate_python.py +++ b/scripts/dev/validate_python.py @@ -15,7 +15,6 @@ Usage: python tools/validate_python.py import ast import sys import os -from pathlib import Path def validate_file(filepath: str) -> bool: """Validate a Python file for common issues.""" diff --git a/scripts/run_plugin_tests.py b/scripts/run_plugin_tests.py index 7355a8e6..61e59710 100755 --- a/scripts/run_plugin_tests.py +++ b/scripts/run_plugin_tests.py @@ -7,9 +7,7 @@ Supports both unittest and pytest. """ import sys -import os import argparse -import subprocess from pathlib import Path from typing import Optional @@ -198,17 +196,14 @@ def main(): if runner == 'auto': # Try pytest first, fall back to unittest try: - import pytest runner = 'pytest' except ImportError: runner = 'unittest' # Run tests if runner == 'pytest': - import importlib.util return run_pytest_tests(test_files, args.verbose, args.coverage) else: - import importlib.util return run_unittest_tests(test_files, args.verbose) diff --git a/scripts/utils/clear_cache.py b/scripts/utils/clear_cache.py index 3238f36b..6d4d7b0d 100644 --- a/scripts/utils/clear_cache.py +++ b/scripts/utils/clear_cache.py @@ -6,9 +6,7 @@ This script allows manual clearing of specific cache keys or all cache data. import os import sys -import json import argparse -from pathlib import Path # Add the src directory to the path so we can import our modules sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src')) diff --git a/src/background_cache_mixin.py b/src/background_cache_mixin.py index abdc461a..623a5313 100644 --- a/src/background_cache_mixin.py +++ b/src/background_cache_mixin.py @@ -7,10 +7,7 @@ where Recent/Upcoming managers consume data from the background service cache. """ import time -import logging from typing import Dict, Optional, Any, Callable -from datetime import datetime -import pytz class BackgroundCacheMixin: diff --git a/src/background_data_service.py b/src/background_data_service.py index 948b7f59..8293879c 100644 --- a/src/background_data_service.py +++ b/src/background_data_service.py @@ -14,19 +14,15 @@ Key Features: - Memory-efficient data storage """ -import os import time import logging import threading import requests -from typing import Dict, Any, Optional, List, Callable, Union -from datetime import datetime, timedelta +from typing import Dict, Any, Optional, Callable from dataclasses import dataclass, field from enum import Enum -import json import queue -from concurrent.futures import ThreadPoolExecutor, Future -import weakref +from concurrent.futures import ThreadPoolExecutor from src.cache_manager import CacheManager # Configure logging logger = logging.getLogger(__name__) diff --git a/src/base_classes/api_extractors.py b/src/base_classes/api_extractors.py index 291f142e..97155d86 100644 --- a/src/base_classes/api_extractors.py +++ b/src/base_classes/api_extractors.py @@ -7,7 +7,7 @@ fields and data structures. """ from abc import ABC, abstractmethod -from typing import Dict, Any, Optional, List +from typing import Dict, Optional import logging from datetime import datetime import pytz @@ -21,12 +21,10 @@ class APIDataExtractor(ABC): @abstractmethod def extract_game_details(self, game_event: Dict) -> Optional[Dict]: """Extract common game details from raw API data.""" - pass @abstractmethod def get_sport_specific_fields(self, game_event: Dict) -> Dict: """Extract sport-specific fields (downs, innings, periods, etc.).""" - pass def _extract_common_details(self, game_event: Dict) -> tuple[Dict | None, Dict | None, Dict | None, Dict | None, Dict | None]: """Extract common game details that work across all sports.""" diff --git a/src/base_classes/basketball.py b/src/base_classes/basketball.py index e00782e1..72c4bf28 100644 --- a/src/base_classes/basketball.py +++ b/src/base_classes/basketball.py @@ -1,6 +1,4 @@ import logging -import time -from datetime import datetime, timezone from typing import Any, Dict, Optional from PIL import Image, ImageDraw, ImageFont diff --git a/src/base_classes/data_sources.py b/src/base_classes/data_sources.py index a7454399..1c8ab76e 100644 --- a/src/base_classes/data_sources.py +++ b/src/base_classes/data_sources.py @@ -6,11 +6,10 @@ to support different APIs and data providers. """ from abc import ABC, abstractmethod -from typing import Dict, Any, Optional, List +from typing import Dict, List import requests import logging -from datetime import datetime, timedelta -import time +from datetime import datetime class DataSource(ABC): """Abstract base class for data sources.""" @@ -35,17 +34,14 @@ class DataSource(ABC): @abstractmethod def fetch_live_games(self, sport: str, league: str) -> List[Dict]: """Fetch live games for a sport/league.""" - pass @abstractmethod def fetch_schedule(self, sport: str, league: str, date_range: tuple) -> List[Dict]: """Fetch schedule for a sport/league within date range.""" - pass @abstractmethod def fetch_standings(self, sport: str, league: str) -> Dict: """Fetch standings for a sport/league.""" - pass def get_headers(self) -> Dict[str, str]: """Get headers for API requests.""" diff --git a/src/base_classes/football.py b/src/base_classes/football.py index 24d0873b..2974934f 100644 --- a/src/base_classes/football.py +++ b/src/base_classes/football.py @@ -1,10 +1,8 @@ -from typing import Dict, Any, Optional, List +from typing import Dict, Any, Optional from src.display_manager import DisplayManager from src.cache_manager import CacheManager -from datetime import datetime, timezone, timedelta import logging from PIL import Image, ImageDraw, ImageFont -import time from src.base_classes.data_sources import ESPNDataSource from src.base_classes.sports import SportsCore, SportsLive diff --git a/src/base_classes/hockey.py b/src/base_classes/hockey.py index c54b5fa8..c49f9547 100644 --- a/src/base_classes/hockey.py +++ b/src/base_classes/hockey.py @@ -1,6 +1,4 @@ import logging -import time -from datetime import datetime, timezone from typing import Any, Dict, Optional from PIL import Image, ImageDraw, ImageFont diff --git a/src/base_classes/sports.py b/src/base_classes/sports.py index 5dbd8860..acee7565 100644 --- a/src/base_classes/sports.py +++ b/src/base_classes/sports.py @@ -5,7 +5,7 @@ import time from abc import ABC, abstractmethod from datetime import datetime, timedelta, timezone from pathlib import Path -from typing import Any, Callable, Dict, List, Optional +from typing import Any, Dict, List, Optional import pytz import requests diff --git a/src/base_odds_manager.py b/src/base_odds_manager.py index 8abf3695..3520ce67 100644 --- a/src/base_odds_manager.py +++ b/src/base_odds_manager.py @@ -11,13 +11,10 @@ Follows LEDMatrix configuration management patterns: - Maintainable: Changes to odds logic affect all plugins """ -import time import logging import requests import json -from datetime import datetime, timedelta, timezone from typing import Dict, Any, Optional, List -import pytz class BaseOddsManager: diff --git a/src/cache/disk_cache.py b/src/cache/disk_cache.py index 03768842..8a9d6da2 100644 --- a/src/cache/disk_cache.py +++ b/src/cache/disk_cache.py @@ -13,7 +13,6 @@ import threading from typing import Dict, Any, Optional, Protocol from datetime import datetime -from src.exceptions import CacheError class CacheStrategyProtocol(Protocol): @@ -210,7 +209,7 @@ class DiskCache: # If direct write also fails, try fallback location self.logger.warning("Direct write failed for key '%s' to %s: %s", key, cache_path, write_error) raise # Re-raise to trigger fallback logic - except (IOError, OSError, PermissionError) as e: + except (IOError, OSError, PermissionError): # Attempt one-time fallback write to user's home cache directory try: # Try user's home cache directory as fallback diff --git a/src/cache_manager.py b/src/cache_manager.py index 263108c4..7418ed56 100644 --- a/src/cache_manager.py +++ b/src/cache_manager.py @@ -7,7 +7,6 @@ from typing import Any, Dict, List, Optional import logging import threading import tempfile -from pathlib import Path from src.exceptions import CacheError from src.cache.memory_cache import MemoryCache from src.cache.disk_cache import DiskCache @@ -111,7 +110,7 @@ class CacheManager: if os.access(system_cache_dir, os.W_OK): self.logger.info(f"Using system cache directory: {system_cache_dir}") return system_cache_dir - except (OSError, IOError, PermissionError) as perm_error: + except (OSError, IOError, PermissionError): # Permission errors are expected when running as non-root self.logger.debug(f"Could not create system cache directory (permission denied): {system_cache_dir}") except (OSError, IOError, PermissionError) as e: diff --git a/src/common/api_helper.py b/src/common/api_helper.py index b185d3e6..9d9b076f 100644 --- a/src/common/api_helper.py +++ b/src/common/api_helper.py @@ -5,13 +5,10 @@ Handles HTTP requests, caching, and ESPN API integration for LED matrix plugins. Extracted from LEDMatrix core to provide reusable functionality for plugins. """ -import json import logging import time -from datetime import datetime, timedelta -from pathlib import Path -from typing import Any, Dict, List, Optional, Union -from urllib.parse import urlencode +from datetime import datetime +from typing import Any, Dict, Optional import requests from requests.adapters import HTTPAdapter diff --git a/src/common/basketball_plugin_example.py b/src/common/basketball_plugin_example.py index 2c3e5710..9921a2fe 100644 --- a/src/common/basketball_plugin_example.py +++ b/src/common/basketball_plugin_example.py @@ -5,11 +5,9 @@ This example shows how to refactor the basketball plugin to use the ledmatrix-common package for cleaner, more maintainable code. """ -import logging from pathlib import Path from typing import Any, Dict, List, Optional -from PIL import Image, ImageDraw # Import common helpers from src.common import ( diff --git a/src/common/cli.py b/src/common/cli.py index 3fc0d19a..e93a61b4 100644 --- a/src/common/cli.py +++ b/src/common/cli.py @@ -42,7 +42,7 @@ def test_utilities(display_width: int, display_height: int): print(f"Testing LEDMatrix Common utilities with {display_width}x{display_height} display") try: - from ledmatrix_common import LogoHelper, TextHelper, APIHelper, DisplayHelper, GameHelper, ConfigHelper + from ledmatrix_common import LogoHelper, TextHelper, DisplayHelper, GameHelper, ConfigHelper # Test LogoHelper print("Testing LogoHelper...") diff --git a/src/common/display_helper.py b/src/common/display_helper.py index 414e785b..cf27e5e2 100644 --- a/src/common/display_helper.py +++ b/src/common/display_helper.py @@ -6,7 +6,7 @@ Extracted from LEDMatrix core to provide reusable functionality for plugins. """ import logging -from typing import Any, Dict, List, Optional, Tuple, Union +from typing import Any, Dict, Optional, Tuple from PIL import Image, ImageDraw, ImageFont diff --git a/src/common/logo_helper.py b/src/common/logo_helper.py index b4b11f5f..ee73c339 100644 --- a/src/common/logo_helper.py +++ b/src/common/logo_helper.py @@ -6,10 +6,8 @@ Extracted from LEDMatrix core to provide reusable functionality for plugins. """ import logging -import os from pathlib import Path from typing import Dict, List, Optional, Union -from urllib.parse import urlparse import requests from PIL import Image diff --git a/src/common/text_helper.py b/src/common/text_helper.py index 497f6d1a..5cbce429 100644 --- a/src/common/text_helper.py +++ b/src/common/text_helper.py @@ -6,7 +6,6 @@ Extracted from LEDMatrix core to provide reusable functionality for plugins. """ import logging -import os from pathlib import Path from typing import Dict, List, Optional, Tuple, Union diff --git a/src/common/utils.py b/src/common/utils.py index 2abfd66c..fc2d9613 100644 --- a/src/common/utils.py +++ b/src/common/utils.py @@ -8,7 +8,7 @@ Extracted from LEDMatrix core to provide reusable functionality for plugins. import logging import re from datetime import datetime, timezone -from typing import Optional, Tuple, Union +from typing import Union import pytz diff --git a/src/config_service.py b/src/config_service.py index c409236f..a7a42493 100644 --- a/src/config_service.py +++ b/src/config_service.py @@ -12,11 +12,10 @@ This service wraps ConfigManager and adds: """ import json -import os import time import threading from pathlib import Path -from typing import Dict, Any, Optional, List, Callable, Set +from typing import Dict, Any, Optional, List, Callable from datetime import datetime from collections import defaultdict import logging diff --git a/src/display_controller.py b/src/display_controller.py index d55cafd2..c58cb27f 100644 --- a/src/display_controller.py +++ b/src/display_controller.py @@ -1,6 +1,4 @@ import time -import logging -import sys import os import json from pathlib import Path diff --git a/src/display_manager.py b/src/display_manager.py index 59e41aeb..e3ab8898 100644 --- a/src/display_manager.py +++ b/src/display_manager.py @@ -6,7 +6,7 @@ else: from contextlib import contextmanager from PIL import Image, ImageDraw, ImageFont import time -from typing import Dict, Any, List, Tuple +from typing import Dict, Any, List import logging import math import freetype diff --git a/src/dynamic_team_resolver.py b/src/dynamic_team_resolver.py index b71c6c15..ab969e17 100644 --- a/src/dynamic_team_resolver.py +++ b/src/dynamic_team_resolver.py @@ -19,8 +19,7 @@ Usage: import logging import time import requests -from typing import Dict, List, Set, Optional, Any -from datetime import datetime, timezone +from typing import Dict, List logger = logging.getLogger(__name__) diff --git a/src/font_manager.py b/src/font_manager.py index df393363..6d65c1fc 100644 --- a/src/font_manager.py +++ b/src/font_manager.py @@ -6,12 +6,10 @@ import hashlib import urllib.request import zipfile import tempfile -import shutil import time from pathlib import Path from PIL import ImageFont from typing import Dict, Tuple, Optional, Union, Any, List -from functools import lru_cache logger = logging.getLogger(__name__) diff --git a/src/font_test_manager.py b/src/font_test_manager.py index 66007ea0..222f606b 100644 --- a/src/font_test_manager.py +++ b/src/font_test_manager.py @@ -1,7 +1,6 @@ import os -import time import freetype -from PIL import Image, ImageDraw, ImageFont +from PIL import ImageDraw, ImageFont import logging from typing import Dict, Any from src.display_manager import DisplayManager @@ -73,7 +72,6 @@ class FontTestManager: def update(self): """No update needed for static display.""" - pass def display(self, force_clear: bool = False): """Display the font with sample text.""" diff --git a/src/generic_cache_mixin.py b/src/generic_cache_mixin.py index e41ad3ba..3c727eb0 100644 --- a/src/generic_cache_mixin.py +++ b/src/generic_cache_mixin.py @@ -7,7 +7,6 @@ version of BackgroundCacheMixin that works for weather, stocks, news, etc. """ import time -import logging from typing import Dict, Optional, Any, Callable diff --git a/src/layout_manager.py b/src/layout_manager.py index c9f43c1b..1d852fc2 100644 --- a/src/layout_manager.py +++ b/src/layout_manager.py @@ -6,9 +6,8 @@ Handles custom layouts, element positioning, and display composition. import json import os import logging -from typing import Dict, List, Any, Tuple +from typing import Dict, List, Any from datetime import datetime -from PIL import Image, ImageDraw, ImageFont logger = logging.getLogger(__name__) diff --git a/src/logo_downloader.py b/src/logo_downloader.py index ab696355..b0cb830f 100644 --- a/src/logo_downloader.py +++ b/src/logo_downloader.py @@ -11,7 +11,7 @@ import time import logging import requests import json -from typing import Dict, Any, List, Optional, Tuple +from typing import Dict, List, Optional, Tuple from pathlib import Path from PIL import Image, ImageDraw, ImageFont from requests.adapters import HTTPAdapter diff --git a/src/plugin_system/health_monitor.py b/src/plugin_system/health_monitor.py index c3610681..37d6e313 100644 --- a/src/plugin_system/health_monitor.py +++ b/src/plugin_system/health_monitor.py @@ -11,7 +11,7 @@ Builds on existing PluginHealthTracker to provide: import threading import time from typing import Dict, Any, Optional, List, Callable -from datetime import datetime, timedelta +from datetime import datetime from enum import Enum from dataclasses import dataclass diff --git a/src/plugin_system/operation_queue.py b/src/plugin_system/operation_queue.py index b3684ee8..8ac18080 100644 --- a/src/plugin_system/operation_queue.py +++ b/src/plugin_system/operation_queue.py @@ -7,9 +7,8 @@ status tracking and cancellation support. import threading import queue -import time from typing import Dict, Optional, List, Callable, Any -from datetime import datetime, timedelta +from datetime import datetime from pathlib import Path import json diff --git a/src/plugin_system/operation_types.py b/src/plugin_system/operation_types.py index bd05c31a..7181263b 100644 --- a/src/plugin_system/operation_types.py +++ b/src/plugin_system/operation_types.py @@ -7,7 +7,7 @@ and their associated data structures. from enum import Enum from dataclasses import dataclass, field -from typing import Dict, Any, Optional, List +from typing import Dict, Any, Optional from datetime import datetime import uuid diff --git a/src/plugin_system/plugin_executor.py b/src/plugin_system/plugin_executor.py index e4c1b946..87e81db7 100644 --- a/src/plugin_system/plugin_executor.py +++ b/src/plugin_system/plugin_executor.py @@ -6,9 +6,8 @@ error isolation, and performance monitoring. """ import time -import signal -from typing import Any, Optional, Dict, Callable -from threading import Thread, Event +from typing import Any, Optional, Callable +from threading import Thread import logging from src.exceptions import PluginError @@ -18,7 +17,6 @@ from src.error_aggregator import record_error class PluginTimeoutError(Exception): """Raised when a plugin operation times out.""" - pass class PluginExecutor: diff --git a/src/plugin_system/plugin_manager.py b/src/plugin_system/plugin_manager.py index c6baed69..18ed6b08 100644 --- a/src/plugin_system/plugin_manager.py +++ b/src/plugin_system/plugin_manager.py @@ -7,10 +7,7 @@ Handles dynamic plugin loading from the plugins/ directory. API Version: 1.0.0 """ -import os import json -import importlib -import importlib.util import sys import subprocess import time diff --git a/src/plugin_system/resource_monitor.py b/src/plugin_system/resource_monitor.py index 38b5e1ad..31352a55 100644 --- a/src/plugin_system/resource_monitor.py +++ b/src/plugin_system/resource_monitor.py @@ -20,7 +20,6 @@ except ImportError: class ResourceLimitExceeded(Exception): """Raised when a plugin exceeds its resource limits.""" - pass @dataclass @@ -228,7 +227,7 @@ class PluginResourceMonitor: except ResourceLimitExceeded: raise - except Exception as e: + except Exception: # Still record execution time even on error execution_time = time.time() - start_time with self._lock: diff --git a/src/plugin_system/saved_repositories.py b/src/plugin_system/saved_repositories.py index 1773c42f..bd0e1872 100644 --- a/src/plugin_system/saved_repositories.py +++ b/src/plugin_system/saved_repositories.py @@ -5,7 +5,6 @@ Manages saved GitHub repository URLs for easy plugin discovery and installation. """ import json -import os import logging from pathlib import Path from typing import List, Dict, Optional diff --git a/src/plugin_system/schema_manager.py b/src/plugin_system/schema_manager.py index c61ed290..385b53fd 100644 --- a/src/plugin_system/schema_manager.py +++ b/src/plugin_system/schema_manager.py @@ -8,7 +8,6 @@ Provides utilities for extracting defaults, validating configurations, and manag import copy import json import logging -import os from pathlib import Path from typing import Any, Dict, List, Optional, Tuple import jsonschema diff --git a/src/plugin_system/state_reconciliation.py b/src/plugin_system/state_reconciliation.py index af804ec9..c6ad9c2a 100644 --- a/src/plugin_system/state_reconciliation.py +++ b/src/plugin_system/state_reconciliation.py @@ -8,12 +8,12 @@ Detects and fixes inconsistencies between: - State manager state """ -from typing import Dict, Any, List, Optional, Set +from typing import Dict, Any, List, Set from dataclasses import dataclass from enum import Enum from pathlib import Path -from src.plugin_system.state_manager import PluginStateManager, PluginState, PluginStateStatus +from src.plugin_system.state_manager import PluginStateManager from src.logging_config import get_logger diff --git a/src/plugin_system/store_manager.py b/src/plugin_system/store_manager.py index d495463a..57b24b21 100644 --- a/src/plugin_system/store_manager.py +++ b/src/plugin_system/store_manager.py @@ -23,7 +23,6 @@ import logging from src.common.permission_utils import sudo_remove_directory try: - import jsonschema from jsonschema import Draft7Validator, ValidationError JSONSCHEMA_AVAILABLE = True except ImportError: diff --git a/src/plugin_system/testing/mocks.py b/src/plugin_system/testing/mocks.py index 43615c01..a9b0f2bd 100644 --- a/src/plugin_system/testing/mocks.py +++ b/src/plugin_system/testing/mocks.py @@ -6,7 +6,6 @@ and plugin_manager for use in plugin unit tests. """ from typing import Dict, Any, Optional -from unittest.mock import MagicMock from PIL import Image diff --git a/src/plugin_system/testing/visual_display_manager.py b/src/plugin_system/testing/visual_display_manager.py index 17afcf45..73d64f3c 100644 --- a/src/plugin_system/testing/visual_display_manager.py +++ b/src/plugin_system/testing/visual_display_manager.py @@ -16,7 +16,7 @@ import math import os import time from pathlib import Path -from typing import Any, Dict, List, Optional, Tuple +from typing import Any, List, Optional, Tuple from PIL import Image, ImageDraw, ImageFont @@ -236,7 +236,6 @@ class VisualTestDisplayManager: Replicated from DisplayManager._draw_bdf_text(). """ try: - import freetype if isinstance(color, list): color = tuple(color) face = font if font else self.calendar_font diff --git a/src/startup_validator.py b/src/startup_validator.py index 1fe7a710..86c703f6 100644 --- a/src/startup_validator.py +++ b/src/startup_validator.py @@ -6,8 +6,7 @@ Fails fast with clear error messages to prevent runtime issues. """ import os -import logging -from typing import Dict, Any, List, Optional, Tuple +from typing import Any, List, Optional, Tuple from pathlib import Path from src.exceptions import ConfigError, PluginError, CacheError from src.logging_config import get_logger diff --git a/src/vegas_mode/config.py b/src/vegas_mode/config.py index dbdb5b33..9c930c1b 100644 --- a/src/vegas_mode/config.py +++ b/src/vegas_mode/config.py @@ -6,7 +6,7 @@ plugin ordering, exclusions, scroll speed, and display settings. """ import logging -from typing import Dict, Any, List, Set, Optional +from typing import Dict, Any, List, Set from dataclasses import dataclass, field logger = logging.getLogger(__name__) diff --git a/src/vegas_mode/render_pipeline.py b/src/vegas_mode/render_pipeline.py index d2406527..3851a4df 100644 --- a/src/vegas_mode/render_pipeline.py +++ b/src/vegas_mode/render_pipeline.py @@ -11,11 +11,10 @@ import threading from collections import deque from typing import Optional, List, Any, Dict, Deque, TYPE_CHECKING from PIL import Image -import numpy as np from src.common.scroll_helper import ScrollHelper from src.vegas_mode.config import VegasModeConfig -from src.vegas_mode.stream_manager import StreamManager, ContentSegment +from src.vegas_mode.stream_manager import StreamManager if TYPE_CHECKING: pass diff --git a/src/vegas_mode/stream_manager.py b/src/vegas_mode/stream_manager.py index 06082951..85d5abdd 100644 --- a/src/vegas_mode/stream_manager.py +++ b/src/vegas_mode/stream_manager.py @@ -14,7 +14,7 @@ Supports three display modes: import logging import threading import time -from typing import Optional, List, Dict, Any, Deque, Tuple, TYPE_CHECKING +from typing import Optional, List, Dict, Any, Deque, TYPE_CHECKING from collections import deque from dataclasses import dataclass, field from PIL import Image @@ -24,7 +24,6 @@ from src.vegas_mode.plugin_adapter import PluginAdapter from src.plugin_system.base_plugin import VegasDisplayMode if TYPE_CHECKING: - from src.plugin_system.base_plugin import BasePlugin from src.plugin_system.plugin_manager import PluginManager logger = logging.getLogger(__name__) diff --git a/src/web_interface/api_helpers.py b/src/web_interface/api_helpers.py index 740fecda..7ba6567a 100644 --- a/src/web_interface/api_helpers.py +++ b/src/web_interface/api_helpers.py @@ -5,11 +5,11 @@ Provides consistent API response formatting across all endpoints. """ import time -from typing import Any, Optional, Dict, Tuple, Union +from typing import Any, Optional, Dict, Tuple from flask import jsonify, request from src.web_interface.error_handler import create_error_response, create_success_response -from src.web_interface.errors import ErrorCode, ErrorCategory +from src.web_interface.errors import ErrorCode def success_response( diff --git a/src/web_interface/error_handler.py b/src/web_interface/error_handler.py index 4a3aa31d..c15d373c 100644 --- a/src/web_interface/error_handler.py +++ b/src/web_interface/error_handler.py @@ -5,7 +5,6 @@ Provides decorators and helpers for consistent error handling across API endpoin """ import functools -import traceback from typing import Callable, Any, Optional from flask import jsonify diff --git a/src/web_interface/validators.py b/src/web_interface/validators.py index a4fb040f..988d1700 100644 --- a/src/web_interface/validators.py +++ b/src/web_interface/validators.py @@ -3,7 +3,6 @@ Input validation utilities for the web interface. Provides validation functions for user inputs to prevent XSS, invalid data, and security issues. """ import re -import os from typing import Optional, Tuple, List from urllib.parse import urlparse from pathlib import Path diff --git a/src/wifi_manager.py b/src/wifi_manager.py index 733d5f6c..86cd6ef1 100644 --- a/src/wifi_manager.py +++ b/src/wifi_manager.py @@ -37,7 +37,7 @@ import time import re from pathlib import Path from typing import Dict, List, Optional, Tuple -from dataclasses import dataclass, field +from dataclasses import dataclass logger = logging.getLogger(__name__) diff --git a/test/conftest.py b/test/conftest.py index da076010..5c764b7b 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -5,7 +5,6 @@ Provides common fixtures for mocking core components and test setup. """ import pytest -import os import sys from pathlib import Path from unittest.mock import Mock, MagicMock diff --git a/test/debug_nba_api.py b/test/debug_nba_api.py index 13a4f38c..5840f5e1 100644 --- a/test/debug_nba_api.py +++ b/test/debug_nba_api.py @@ -3,7 +3,6 @@ Diagnostic script to examine NBA API data structure and identify the missing 'id' field issue. """ import requests -import json import logging from typing import Dict, Any diff --git a/test/plugins/conftest.py b/test/plugins/conftest.py index a6a19c8f..27bb6718 100644 --- a/test/plugins/conftest.py +++ b/test/plugins/conftest.py @@ -8,7 +8,7 @@ import sys import json from pathlib import Path from unittest.mock import MagicMock, Mock -from typing import Any, Dict, Generator, Optional +from typing import Any, Dict # Add project root to path project_root = Path(__file__).parent.parent.parent diff --git a/test/plugins/test_plugin_base.py b/test/plugins/test_plugin_base.py index 15dbc02b..43fe8901 100644 --- a/test/plugins/test_plugin_base.py +++ b/test/plugins/test_plugin_base.py @@ -6,9 +6,7 @@ Provides common test functionality for all plugins. import pytest import json -from pathlib import Path from typing import Dict, Any -from unittest.mock import MagicMock from src.plugin_system.plugin_loader import PluginLoader from src.plugin_system.base_plugin import BasePlugin diff --git a/test/plugins/test_visual_rendering.py b/test/plugins/test_visual_rendering.py index 971e0635..3bfffa57 100644 --- a/test/plugins/test_visual_rendering.py +++ b/test/plugins/test_visual_rendering.py @@ -5,7 +5,6 @@ Verifies that the visual display manager actually renders pixels, loads fonts, and can save snapshots. """ -import pytest from PIL import Image from src.plugin_system.testing import VisualTestDisplayManager diff --git a/test/test_cache_manager.py b/test/test_cache_manager.py index 0666e600..034175e7 100644 --- a/test/test_cache_manager.py +++ b/test/test_cache_manager.py @@ -6,10 +6,7 @@ Tests cache functionality including memory cache, disk cache, strategy, and metr import pytest import time -import json -import tempfile -from pathlib import Path -from unittest.mock import Mock, MagicMock, patch +from unittest.mock import patch from src.cache_manager import CacheManager from src.cache.memory_cache import MemoryCache from src.cache.disk_cache import DiskCache diff --git a/test/test_config_manager.py b/test/test_config_manager.py index e8b748cd..29705f36 100644 --- a/test/test_config_manager.py +++ b/test/test_config_manager.py @@ -7,9 +7,6 @@ Tests configuration loading, migration, secrets handling, and validation. import pytest import json import os -import tempfile -from pathlib import Path -from unittest.mock import Mock, patch, mock_open from src.config_manager import ConfigManager diff --git a/test/test_config_service.py b/test/test_config_service.py index 8c3a9f6f..a0d601a1 100644 --- a/test/test_config_service.py +++ b/test/test_config_service.py @@ -1,11 +1,6 @@ -import time import pytest -import threading import json -import os -import shutil -from pathlib import Path -from unittest.mock import Mock, MagicMock, patch +from unittest.mock import MagicMock, patch from src.config_service import ConfigService from src.config_manager import ConfigManager diff --git a/test/test_config_validation_edge_cases.py b/test/test_config_validation_edge_cases.py index 6de4d2ad..040902cd 100644 --- a/test/test_config_validation_edge_cases.py +++ b/test/test_config_validation_edge_cases.py @@ -10,11 +10,7 @@ Tests scenarios that commonly cause user configuration errors: """ import pytest -import json from pathlib import Path -from unittest.mock import Mock, patch, MagicMock -import tempfile -import os # Add project root to path import sys diff --git a/test/test_display_controller.py b/test/test_display_controller.py index 4c662a61..6a5fb5ba 100644 --- a/test/test_display_controller.py +++ b/test/test_display_controller.py @@ -1,7 +1,5 @@ -import pytest import time -from unittest.mock import MagicMock, patch, ANY -from src.display_controller import DisplayController +from unittest.mock import MagicMock, patch class TestDisplayControllerInitialization: """Test DisplayController initialization and setup.""" @@ -25,7 +23,6 @@ class TestDisplayControllerInitialization: # Manually trigger the plugin loading logic that happens in __init__ # Since we're using a fixture that mocks __init__ partially, we need to verify # the interactions or simulate the loading if we want to test that specific logic - pass # Note: Testing __init__ logic is tricky with the fixture. # We rely on the fixture to give us a usable controller. diff --git a/test/test_display_manager.py b/test/test_display_manager.py index 3cac60bb..9f4406cd 100644 --- a/test/test_display_manager.py +++ b/test/test_display_manager.py @@ -1,7 +1,6 @@ import pytest -import time -from unittest.mock import MagicMock, patch, ANY -from PIL import Image, ImageDraw +from unittest.mock import MagicMock, patch +from PIL import ImageDraw from src.display_manager import DisplayManager @pytest.fixture diff --git a/test/test_error_aggregator.py b/test/test_error_aggregator.py index 5194fc2a..c1f8e226 100644 --- a/test/test_error_aggregator.py +++ b/test/test_error_aggregator.py @@ -9,11 +9,8 @@ Tests: - Thread safety """ -import pytest -import time from datetime import datetime, timedelta from pathlib import Path -from unittest.mock import Mock, patch import threading import sys @@ -29,7 +26,7 @@ from src.error_aggregator import ( get_error_aggregator, record_error ) -from src.exceptions import PluginError, ConfigError +from src.exceptions import PluginError class TestErrorRecording: diff --git a/test/test_error_handling.py b/test/test_error_handling.py index 9b9f0933..c91e22c3 100644 --- a/test/test_error_handling.py +++ b/test/test_error_handling.py @@ -1,16 +1,10 @@ -import pytest import logging import json -import tempfile -from pathlib import Path -from src.exceptions import CacheError, ConfigError, PluginError, DisplayError, LEDMatrixError +from src.exceptions import CacheError, ConfigError, PluginError, DisplayError from src.common.error_handler import ( handle_file_operation, handle_json_operation, - safe_execute, - retry_on_failure, - log_and_continue, - log_and_raise + safe_execute ) class TestCustomExceptions: diff --git a/test/test_font_manager.py b/test/test_font_manager.py index 29a544c4..11240724 100644 --- a/test/test_font_manager.py +++ b/test/test_font_manager.py @@ -1,7 +1,5 @@ import pytest -import os -from unittest.mock import MagicMock, patch, mock_open -from pathlib import Path +from unittest.mock import patch from src.font_manager import FontManager @pytest.fixture diff --git a/test/test_layout_manager.py b/test/test_layout_manager.py index 43c2236e..c29d2fe4 100644 --- a/test/test_layout_manager.py +++ b/test/test_layout_manager.py @@ -6,10 +6,7 @@ Tests layout creation, management, rendering, and element positioning. import pytest import json -import tempfile -from pathlib import Path -from unittest.mock import MagicMock, patch, Mock -from datetime import datetime +from unittest.mock import MagicMock from src.layout_manager import LayoutManager diff --git a/test/test_nba_core_functionality.py b/test/test_nba_core_functionality.py index 8566fd34..85112cb4 100644 --- a/test/test_nba_core_functionality.py +++ b/test/test_nba_core_functionality.py @@ -6,7 +6,6 @@ import sys import os import logging import json -from typing import Dict, Any # Set up logging logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') diff --git a/test/test_nba_data_structure.py b/test/test_nba_data_structure.py index 2df3f5d6..c4f20768 100644 --- a/test/test_nba_data_structure.py +++ b/test/test_nba_data_structure.py @@ -3,11 +3,8 @@ Simple test script to verify NBA data structure includes team ID fields. """ import sys -import os import requests import logging -import json -from typing import Dict, Any # Set up logging logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') diff --git a/test/test_nba_integration.py b/test/test_nba_integration.py index 462dd3b4..fc3ed3cf 100644 --- a/test/test_nba_integration.py +++ b/test/test_nba_integration.py @@ -6,7 +6,6 @@ import sys import os import logging import json -from typing import Dict, Any # Set up logging logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') diff --git a/test/test_nba_leaderboard_fix.py b/test/test_nba_leaderboard_fix.py index 9d04f29a..81e18078 100644 --- a/test/test_nba_leaderboard_fix.py +++ b/test/test_nba_leaderboard_fix.py @@ -6,7 +6,6 @@ This script simulates the leaderboard manager's data fetching process. import sys import os import logging -from typing import Dict, Any # Add the src directory to Python path so we can import the leaderboard manager sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src')) diff --git a/test/test_plugin_loader.py b/test/test_plugin_loader.py index 80b48d44..043bf116 100644 --- a/test/test_plugin_loader.py +++ b/test/test_plugin_loader.py @@ -5,9 +5,7 @@ Tests plugin directory discovery, module loading, and class instantiation. """ import pytest -import sys -from pathlib import Path -from unittest.mock import MagicMock, patch, Mock, mock_open +from unittest.mock import MagicMock, patch from src.plugin_system.plugin_loader import PluginLoader from src.exceptions import PluginError diff --git a/test/test_plugin_loading_failures.py b/test/test_plugin_loading_failures.py index af7c0d06..0bb3e0d7 100644 --- a/test/test_plugin_loading_failures.py +++ b/test/test_plugin_loading_failures.py @@ -15,8 +15,7 @@ Tests various failure modes that can occur during plugin loading: import pytest import json from pathlib import Path -from unittest.mock import Mock, patch, MagicMock -import tempfile +from unittest.mock import patch, MagicMock import sys # Add project root to path @@ -25,9 +24,7 @@ if str(project_root) not in sys.path: sys.path.insert(0, str(project_root)) from src.plugin_system.plugin_manager import PluginManager -from src.plugin_system.plugin_loader import PluginLoader from src.plugin_system.plugin_state import PluginState -from src.exceptions import PluginError @pytest.fixture diff --git a/test/test_plugin_system.py b/test/test_plugin_system.py index 605ffada..b78a3156 100644 --- a/test/test_plugin_system.py +++ b/test/test_plugin_system.py @@ -1,12 +1,8 @@ -import pytest -import os -import sys import time -from unittest.mock import MagicMock, patch, ANY, call +from unittest.mock import MagicMock, patch from pathlib import Path from src.plugin_system.plugin_manager import PluginManager from src.plugin_system.plugin_state import PluginState -from src.exceptions import PluginError class TestPluginManager: """Test PluginManager functionality.""" @@ -90,7 +86,6 @@ class TestPluginLoader: """Test dependency checking logic.""" # This would test _check_dependencies_installed and _install_plugin_dependencies # which requires mocking subprocess calls and file operations - pass class TestPluginExecutor: diff --git a/test/test_schema_manager.py b/test/test_schema_manager.py index 62933511..3c12ae38 100644 --- a/test/test_schema_manager.py +++ b/test/test_schema_manager.py @@ -6,8 +6,6 @@ Tests schema loading, validation, default extraction, and caching. import pytest import json -from pathlib import Path -from unittest.mock import MagicMock, patch, mock_open from jsonschema import ValidationError from src.plugin_system.schema_manager import SchemaManager diff --git a/test/test_text_helper.py b/test/test_text_helper.py index 3a158f24..1e143ddf 100644 --- a/test/test_text_helper.py +++ b/test/test_text_helper.py @@ -5,7 +5,7 @@ Tests text rendering, font loading, and text positioning utilities. """ import pytest -from unittest.mock import MagicMock, patch, Mock +from unittest.mock import MagicMock, patch from PIL import Image, ImageDraw, ImageFont from src.common.text_helper import TextHelper diff --git a/test/test_web_api.py b/test/test_web_api.py index 8f059a08..8d4064de 100644 --- a/test/test_web_api.py +++ b/test/test_web_api.py @@ -6,10 +6,9 @@ Tests Flask routes, request/response handling, and API functionality. import pytest import json -import os import sys from pathlib import Path -from unittest.mock import MagicMock, patch, Mock +from unittest.mock import MagicMock, patch # Add project root to path project_root = Path(__file__).parent.parent @@ -288,7 +287,6 @@ class TestDisplayAPI: @patch('web_interface.blueprints.api_v3._ensure_cache_manager') def test_stop_on_demand_display(self, mock_ensure_cache, client): """Test stopping on-demand display.""" - from web_interface.blueprints.api_v3 import api_v3 # Mock the cache manager returned by _ensure_cache_manager mock_cache_manager = MagicMock() @@ -440,7 +438,6 @@ class TestPluginsAPI: def test_get_plugin_schema(self, client): """Test getting plugin configuration schema.""" - from web_interface.blueprints.api_v3 import api_v3 response = client.get('/api/v3/plugins/schema?plugin_id=weather') @@ -477,7 +474,6 @@ class TestPluginsAPI: def test_get_operation_history(self, client): """Test getting operation history.""" - from web_interface.blueprints.api_v3 import api_v3 response = client.get('/api/v3/plugins/operation/history') @@ -487,7 +483,6 @@ class TestPluginsAPI: def test_get_plugin_state(self, client): """Test getting plugin state.""" - from web_interface.blueprints.api_v3 import api_v3 response = client.get('/api/v3/plugins/state') diff --git a/test/web_interface/integration/test_plugin_operations.py b/test/web_interface/integration/test_plugin_operations.py index b38bbb2b..35de83cf 100644 --- a/test/web_interface/integration/test_plugin_operations.py +++ b/test/web_interface/integration/test_plugin_operations.py @@ -5,12 +5,10 @@ Integration tests for plugin operations (install, update, uninstall). import unittest import tempfile import shutil -import json from pathlib import Path -from unittest.mock import Mock, patch from src.plugin_system.operation_queue import PluginOperationQueue -from src.plugin_system.operation_types import OperationType, OperationStatus +from src.plugin_system.operation_types import OperationType from src.plugin_system.state_manager import PluginStateManager from src.plugin_system.operation_history import OperationHistory diff --git a/test/web_interface/test_dedup_unique_arrays.py b/test/web_interface/test_dedup_unique_arrays.py index 559dd79a..170f776c 100644 --- a/test/web_interface/test_dedup_unique_arrays.py +++ b/test/web_interface/test_dedup_unique_arrays.py @@ -8,7 +8,6 @@ Tests import the production function from src.web_interface.validators to ensure they exercise the real code path. """ -import pytest from src.web_interface.validators import dedup_unique_arrays as _dedup_unique_arrays diff --git a/test/web_interface/test_state_reconciliation.py b/test/web_interface/test_state_reconciliation.py index 1fa0de22..85ec656e 100644 --- a/test/web_interface/test_state_reconciliation.py +++ b/test/web_interface/test_state_reconciliation.py @@ -7,7 +7,7 @@ import tempfile import shutil import json from pathlib import Path -from unittest.mock import Mock, MagicMock, patch +from unittest.mock import Mock, patch from src.plugin_system.state_reconciliation import ( StateReconciliation, @@ -15,7 +15,7 @@ from src.plugin_system.state_reconciliation import ( FixAction, ReconciliationResult ) -from src.plugin_system.state_manager import PluginStateManager, PluginState, PluginStateStatus +from src.plugin_system.state_manager import PluginStateManager, PluginStateStatus class TestStateReconciliation(unittest.TestCase): diff --git a/web_interface/app.py b/web_interface/app.py index b88df468..4e653de4 100644 --- a/web_interface/app.py +++ b/web_interface/app.py @@ -1,4 +1,4 @@ -from flask import Flask, Blueprint, render_template, request, redirect, url_for, flash, jsonify, Response, send_from_directory +from flask import Flask, request, redirect, url_for, jsonify, Response, send_from_directory import json import logging import os @@ -21,7 +21,6 @@ from src.plugin_system.operation_queue import PluginOperationQueue from src.plugin_system.state_manager import PluginStateManager from src.plugin_system.operation_history import OperationHistory from src.plugin_system.health_monitor import PluginHealthMonitor -from src.wifi_manager import WiFiManager # Create Flask app app = Flask(__name__) @@ -51,10 +50,8 @@ try: except ImportError: # flask-limiter not installed, rate limiting disabled limiter = None - pass # Import cache functions from separate module to avoid circular imports -from web_interface.cache import get_cached, set_cached, invalidate_cache # Initialize plugin managers - read plugins directory from config config = config_manager.load_config() @@ -304,7 +301,6 @@ try: except ImportError: # Logging config not available, use default log_api_request = None - pass # Request timing and logging middleware @app.before_request @@ -546,7 +542,7 @@ def display_preview_generator(): } last_modified = current_modified yield preview_data - except Exception as read_err: + except Exception: # File might be being written, skip this update pass else: diff --git a/web_interface/blueprints/api_v3.py b/web_interface/blueprints/api_v3.py index 1d0fedfd..e361a775 100644 --- a/web_interface/blueprints/api_v3.py +++ b/web_interface/blueprints/api_v3.py @@ -1,4 +1,4 @@ -from flask import Blueprint, request, jsonify, Response, send_from_directory +from flask import Blueprint, request, jsonify, Response import json import os import re @@ -17,10 +17,8 @@ logger = logging.getLogger(__name__) from src.web_interface.api_helpers import success_response, error_response, validate_request_json from src.web_interface.errors import ErrorCode from src.plugin_system.operation_types import OperationType -from src.web_interface.logging_config import log_plugin_operation, log_config_change from src.web_interface.validators import ( - validate_image_url, validate_file_upload, validate_mime_type, - validate_numeric_range, validate_string_length, sanitize_plugin_config + validate_file_upload ) from src.error_aggregator import get_error_aggregator @@ -4137,7 +4135,6 @@ def save_plugin_config(): current_value = array_value # Update for length check below except (ValueError, KeyError, TypeError) as e: logger.debug(f"Failed to convert {prop_key} to array: {e}") - pass # If it's an array, ensure correct types and check minItems if isinstance(current_value, list): diff --git a/web_interface/blueprints/pages_v3.py b/web_interface/blueprints/pages_v3.py index a01f827a..bbfab66e 100644 --- a/web_interface/blueprints/pages_v3.py +++ b/web_interface/blueprints/pages_v3.py @@ -1,4 +1,4 @@ -from flask import Blueprint, render_template, request, redirect, url_for, flash, jsonify +from flask import Blueprint, render_template, flash import json import logging from pathlib import Path diff --git a/web_interface/logging_config.py b/web_interface/logging_config.py index ffa948db..70a06c75 100644 --- a/web_interface/logging_config.py +++ b/web_interface/logging_config.py @@ -6,7 +6,7 @@ import logging import json import sys from datetime import datetime -from typing import Any, Dict, Optional +from typing import Optional class JSONFormatter(logging.Formatter):