選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

83 行
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. )