Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

120 рядки
4.0KB

  1. import yaml
  2. import logging
  3. from dataclasses import dataclass
  4. from pathlib import Path
  5. logger = logging.getLogger(__name__)
  6. @dataclass
  7. class KotlinVersion:
  8. version: str
  9. name: str
  10. plugins: dict[str, str]
  11. packages: list[str]
  12. @dataclass
  13. class Config:
  14. kotlin_versions: list[KotlinVersion]
  15. mirrors: list[str]
  16. def handle_packages(section) -> list[str]:
  17. ignore = ["_kotlin-version", '_versions']
  18. result = []
  19. for entry in section:
  20. if entry not in ignore:
  21. if ':' in entry:
  22. versions = section[entry]
  23. if isinstance(versions, str):
  24. result.append(f'{entry}:{versions}')
  25. elif isinstance(versions, list):
  26. for version in versions:
  27. result.append(f'{entry}:{version}')
  28. else:
  29. logger.warning(f'Invalid version "{versions}" for "{entry}". Should be a string or list.')
  30. elif isinstance(section[entry], dict):
  31. group_section = section[entry]
  32. default_versions = group_section['_versions']
  33. for artifact in group_section:
  34. if artifact not in ignore:
  35. versions = group_section[artifact]
  36. if not versions and default_versions:
  37. versions = default_versions
  38. if isinstance(versions, str):
  39. result.append(f'{entry}:{artifact}:{versions}')
  40. elif isinstance(versions, list) and versions:
  41. for version in versions:
  42. result.append(f'{entry}:{artifact}:{version}')
  43. else:
  44. logger.warning(f'Invalid versions "{versions}" for "{entry}:{artifact}"')
  45. else:
  46. logger.warning(f'Invalid package spec "{entry}". Should be a full spec or a group ID')
  47. return result
  48. def handle_plugins(section) -> dict[str, list[str]]:
  49. result = {}
  50. for entry in section:
  51. versions = section[entry]
  52. if isinstance(versions, str):
  53. result[entry] = [versions]
  54. elif isinstance(versions, list):
  55. result[entry] = versions
  56. else:
  57. logger.warning(f'Invalid plugin version "{versions}" for {entry}')
  58. return result
  59. def parse_config(path: Path) -> Config:
  60. with path.open('r') as f:
  61. data = yaml.safe_load(f)
  62. parsed = {}
  63. for version, section in data['kotlin'].items():
  64. plugins = handle_plugins(section.get('plugins', {}))
  65. packages = handle_packages(section.get('packages', {}))
  66. parsed[version] = {
  67. 'plugins': plugins,
  68. 'packages': packages,
  69. }
  70. # Merge the general plugins and packages with that of the default version
  71. if general := data.get('general'):
  72. if default_version := general.get('_kotlin-version'):
  73. parsed.setdefault(default_version, {})
  74. parsed[default_version]['plugins'].update(
  75. handle_plugins(general.get('plugins', {}))
  76. )
  77. parsed[default_version]['packages'].extend(
  78. handle_packages(general.get('packages', {}))
  79. )
  80. else:
  81. logger.warning(f'"general" section exists, but "_kotlin-version" is not defined. Skipping.')
  82. kotlin_versions = []
  83. for version, section in parsed.items():
  84. kotlin_versions.append(KotlinVersion(version, f'version-packages', {}, section['packages']))
  85. for plugin, plugin_versions in section['plugins'].items():
  86. for plugin_version in plugin_versions:
  87. kotlin_versions.append(KotlinVersion(version, f'version-plugins-{plugin}', {plugin: plugin_version}, []))
  88. return Config(
  89. kotlin_versions,
  90. data.get('maven', {}).get('mirrors', []),
  91. )