from typing import Optional import yaml import logging from dataclasses import dataclass from pathlib import Path from .plugins import Plugin, handle_plugins from .packages import Package, handle_packages logger = logging.getLogger(__name__) @dataclass class Configuration: kotlin_version: str gradle_version: Optional[str] plugins: list[Plugin] packages: list[Package] @dataclass class MavenMirrors: package_mirrors: list[str] plugin_mirrors: list[str] @dataclass class Config: configurations: list[Configuration] mirrors: MavenMirrors def parse_config(path: Path) -> Optional[Config]: with path.open('r') as f: data = yaml.safe_load(f) error: list[str] = [] configurations: dict[tuple[str, str], tuple[list[Plugin], list[Package]]] = {} for i, section in enumerate(data.get('configurations')): if (kotlin_versions := section.get('kotlin-version')) is None: error.append(f"Configuration {i} is missing 'kotlin-version'") if not isinstance(kotlin_versions, list): kotlin_versions = [kotlin_versions] gradle_versions = section.get('gradle-version') if not isinstance(gradle_versions, list): gradle_versions = [gradle_versions] plugins = handle_plugins(section.get('plugins', {})) packages = handle_packages(section.get('packages', {})) for kotlin in kotlin_versions: for gradle in gradle_versions: key = (kotlin, gradle) if key in configurations: configurations[key] = ( configurations[key][0] + plugins, configurations[key][1] + packages, ) else: configurations[key] = (plugins, packages) if error: for msg in error: logger.error(msg) return None else: return Config( [ Configuration(kotlin, gradle, plugins, packages) for (kotlin, gradle), (plugins, packages) in configurations.items() ], MavenMirrors( data.get('maven', {}).get('package-mirrors', []), data.get('maven', {}).get('plugin-mirrors', []), ), )