127 lines
3.1 KiB
Python
127 lines
3.1 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Abstract Base Class for FastLED Compilers
|
|
|
|
Defines the interface that all FastLED compiler implementations must follow.
|
|
"""
|
|
|
|
from abc import ABC, abstractmethod
|
|
from concurrent.futures import Future
|
|
from dataclasses import dataclass
|
|
from enum import Enum
|
|
from pathlib import Path
|
|
from typing import Any
|
|
|
|
|
|
class CacheType(Enum):
|
|
"""Compiler cache type options."""
|
|
|
|
NO_CACHE = "no_cache"
|
|
SCCACHE = "sccache"
|
|
|
|
|
|
@dataclass
|
|
class CompilerResult:
|
|
"""Base result class for compiler operations."""
|
|
|
|
success: bool
|
|
output: str
|
|
build_dir: Path
|
|
|
|
|
|
@dataclass
|
|
class InitResult(CompilerResult):
|
|
"""Result from compiler initialization."""
|
|
|
|
@property
|
|
def platformio_ini(self) -> Path:
|
|
return self.build_dir / "platformio.ini"
|
|
|
|
|
|
@dataclass
|
|
class SketchResult(CompilerResult):
|
|
"""Result from sketch compilation."""
|
|
|
|
example: str
|
|
|
|
|
|
class Compiler(ABC):
|
|
"""Abstract base class defining the interface for FastLED compilers."""
|
|
|
|
def __init__(self) -> None:
|
|
"""Initialize the compiler."""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def build(self, examples: list[str]) -> list[Future[SketchResult]]:
|
|
"""Build a list of examples with proper resource management.
|
|
|
|
Args:
|
|
examples: List of example names or paths to compile
|
|
|
|
Returns:
|
|
List of Future objects containing SketchResult for each example
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def clean(self) -> None:
|
|
"""Clean build artifacts for this platform."""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def clean_all(self) -> None:
|
|
"""Clean all build artifacts (local and global) for this platform."""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def deploy(
|
|
self, example: str, upload_port: str | None = None, monitor: bool = False
|
|
) -> SketchResult:
|
|
"""Deploy (upload) a specific example to the target device.
|
|
|
|
Args:
|
|
example: Name of the example to deploy
|
|
upload_port: Optional specific port for upload
|
|
monitor: If True, attach to device monitor after successful upload
|
|
|
|
Returns:
|
|
SketchResult indicating success/failure of deployment
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def cancel_all(self) -> None:
|
|
"""Cancel all currently running builds."""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def check_usb_permissions(self) -> tuple[bool, str]:
|
|
"""Check if USB device access is properly configured.
|
|
|
|
Returns:
|
|
Tuple of (has_access, status_message)
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def install_usb_permissions(self) -> bool:
|
|
"""Install platform-specific USB permissions or equivalent.
|
|
|
|
Returns:
|
|
True if installation succeeded, False otherwise
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def get_cache_stats(self) -> str:
|
|
"""Get compiler statistics as a formatted string.
|
|
|
|
This can include cache statistics, build metrics, performance data,
|
|
or any other relevant compiler statistics.
|
|
|
|
Returns:
|
|
Formatted string containing compiler statistics, or empty string if none available
|
|
"""
|
|
pass
|