25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

83 lines
2.4KB

  1. from typing import Optional
  2. import yaml
  3. import logging
  4. from dataclasses import dataclass
  5. from pathlib import Path
  6. from .plugins import Plugin, handle_plugins
  7. from .packages import Package, handle_packages
  8. logger = logging.getLogger(__name__)
  9. @dataclass
  10. class Configuration:
  11. kotlin_version: str
  12. gradle_version: Optional[str]
  13. plugins: list[Plugin]
  14. packages: list[Package]
  15. @dataclass
  16. class MavenMirrors:
  17. package_mirrors: list[str]
  18. plugin_mirrors: list[str]
  19. @dataclass
  20. class Config:
  21. configurations: list[Configuration]
  22. mirrors: MavenMirrors
  23. def parse_config(path: Path) -> Optional[Config]:
  24. with path.open('r') as f:
  25. data = yaml.safe_load(f)
  26. error: list[str] = []
  27. configurations: dict[tuple[str, str], tuple[list[Plugin], list[Package]]] = {}
  28. for i, section in enumerate(data.get('configurations')):
  29. if (kotlin_versions := section.get('kotlin-version')) is None:
  30. error.append(f"Configuration {i} is missing 'kotlin-version'")
  31. if not isinstance(kotlin_versions, list):
  32. kotlin_versions = [kotlin_versions]
  33. gradle_versions = section.get('gradle-version')
  34. if not isinstance(gradle_versions, list):
  35. gradle_versions = [gradle_versions]
  36. plugins = handle_plugins(section.get('plugins', {}))
  37. packages = handle_packages(section.get('packages', {}))
  38. for kotlin in kotlin_versions:
  39. for gradle in gradle_versions:
  40. key = (kotlin, gradle)
  41. if key in configurations:
  42. configurations[key] = (
  43. configurations[key][0] + plugins,
  44. configurations[key][1] + packages,
  45. )
  46. else:
  47. configurations[key] = (plugins, packages)
  48. if error:
  49. for msg in error:
  50. logger.error(msg)
  51. return None
  52. else:
  53. return Config(
  54. [
  55. Configuration(kotlin, gradle, plugins, packages)
  56. for (kotlin, gradle), (plugins, packages) in configurations.items()
  57. ],
  58. MavenMirrors(
  59. data.get('maven', {}).get('package-mirrors', []),
  60. data.get('maven', {}).get('plugin-mirrors', []),
  61. ),
  62. )