Source code for pyArchimate.writers

# ruff: noqa: N999  # legacy module name preserved for API compatibility
"""
Writer registry helpers extracted from the legacy module.
"""

from collections.abc import Callable
from typing import Any

from ..enums import Writers

_writer_registry: dict[Writers, Callable[..., Any]] = {}
_default_writers_initialized = False


[docs] def register_writer(key, writer_callable): """Register a writer function for a given format key. Args: key: Writer key (typically a Writers enum value) writer_callable: Callable that writes model/view to file """ if not callable(writer_callable): raise TypeError("writer must be callable") _writer_registry[key] = writer_callable
def _ensure_default_writers(): global _default_writers_initialized if _default_writers_initialized: return # Import lazily to avoid circular imports during Model module load from .archimateWriter import ( archimate_writer, # noqa: PLC0415 # circular: writers import model types at module level ) from .archiWriter import archi_writer # noqa: PLC0415 # circular: writers import model types at module level from .csvWriter import csv_writer # noqa: PLC0415 # circular: writers import model types at module level register_writer(Writers.archimate, archimate_writer) register_writer(Writers.archi, archi_writer) register_writer(Writers.csv, csv_writer) _default_writers_initialized = True def _detect_writer_from_extension(file_path): """Auto-detect writer based on file extension. Args: file_path: Path to file being written Returns: Writers enum value (archimate for .archimate, archi for .xml, default archimate) """ if not file_path: return Writers.archimate file_path_lower = str(file_path).lower() if file_path_lower.endswith(".archimate"): return Writers.archi elif file_path_lower.endswith(".xml"): return Writers.archimate return Writers.archimate def _resolve_writer(writer): if callable(writer): return writer _ensure_default_writers() key = writer if isinstance(writer, Writers): key = writer elif isinstance(writer, str): try: key = Writers[writer] except KeyError: # noqa: S110 pass elif isinstance(writer, int): try: key = Writers(writer) except ValueError: # noqa: S110 pass if key in _writer_registry: return _writer_registry[key] raise ValueError(f"Unknown writer '{writer}'. Registered writers: {list(_writer_registry.keys())}") __all__ = ["register_writer", "_resolve_writer", "_ensure_default_writers", "_detect_writer_from_extension"]