From e47277824e2db0b9f5b872b7e1b7f8acddad8bfb Mon Sep 17 00:00:00 2001 From: Sindre Stephansen Date: Fri, 28 Jul 2023 16:41:29 +0200 Subject: [PATCH] Restructure and simplify config file --- README.md | 52 +++++++++++++------------------- package-list.yaml | 36 ++++++++++++---------- sync/src/config.py | 74 +++++++++++++++++++++++----------------------- sync/src/main.py | 22 +++++++------- 4 files changed, 91 insertions(+), 93 deletions(-) diff --git a/README.md b/README.md index f31152a..a4ce39f 100644 --- a/README.md +++ b/README.md @@ -20,39 +20,29 @@ maven: mirrors: - "https://repo.maven.apache.org/maven2" -# Specify which kotlin versions to fetch. -kotlin: - 1.8.20: - # Plugins specific to this kotlin version. See `general` section for details. +# Specify configurations of kotlin version, plugins, and packages. For most packages the kotlin version doesn't matter. +configurations: + # A kotlin version without specific plugins and packages. This fetches the bare minimum of + # packages and plugins to be able to use that kotlin version. + - kotlin-version: "1.7.20" + + - kotlin-version: "1.8.20" + # Plugins specific to this kotlin version, listed with their plugin ID, not the full package name. + # Plugin versions can be a single version as a string, or a list of strings to fetch multiple versions. plugins: com.expediagroup.graphql: ["7.0.0-alpha.5", "6.5.2"] - # Packages specific to this kotlin version. See `general` section for details. + org.panteleyev.jpackageplugin: "1.5.2" + + # Packages specific to this kotlin version, listed either with their full name as a key, or split into group and artifact. + # Package versions can be a single version as a string, or a list of strings to fetch multiple versions. packages: org.slf4j:slf4j-api: "2.1.0" - # A kotlin version without specific plugins and packages. - 1.8.0: {} - 1.7.20: - packages: - org.slf4j:slf4j-api: "2.0.7" - -# Packages and plugins that doesn't require a specific kotlin version. -general: - # The kotlin version to use (doesn't matter much, use the newest stable version). - _kotlin-version: "1.8.20" - - plugins: - # Plugins are listed with their plugin ID, not the full package name. - # Plugin versions can be a single version as a string, or a list of strings to fetch multiple versions. - org.panteleyev.jpackageplugin: "1.5.2" - packages: - # Packages are listed either with their full name as a key, or split into group and artifact. - # Package versions can be a single version as a string, or a list of strings to fetch multiple versions. - org.jetbrains.kotlinx:kotlinx-datetime: "0.4.0" - com.expediagroup: - # When splitting into group and artifact, the default versions for the group can be specified. - # Using an empty list as the version for an artifact implies that the default versions should be used. - _versions: ["7.0.0-alpha.6", "6.5.2"] - graphql-kotlin-ktor-server: ["7.0.0-alpha.6"] # Uses only the specified version - graphql-kotlin-client: [] # Uses the default versions - graphql-kotlin-client-generator: [] # Uses the default versions + org.jetbrains.kotlinx:kotlinx-datetime: "0.4.0" + com.expediagroup: + # When splitting into group and artifact, the default versions for the group can be specified. + # Using an empty list as the version for an artifact implies that the default versions should be used. + _versions: ["7.0.0-alpha.6", "6.5.2"] + graphql-kotlin-ktor-server: ["7.0.0-alpha.6"] # Uses only the specified version + graphql-kotlin-client: [] # Uses the default versions + graphql-kotlin-client-generator: [] # Uses the default versions ``` diff --git a/package-list.yaml b/package-list.yaml index c808aec..aeb010c 100644 --- a/package-list.yaml +++ b/package-list.yaml @@ -7,23 +7,29 @@ maven: - "https://registry.quarkus.io/maven" - "https://plugins.gradle.org/m2" -kotlin: - 1.8.20: +configurations: + # Specify configurations where the packages/plugins depend on a specific kotlin version. + - kotlin-version: "1.8.20" plugins: com.expediagroup.graphql: ["7.0.0-alpha.5", "6.5.2"] - 1.8.0: {} - 1.7.20: + + - kotlin-version: "1.8.0" + + - kotlin-version: "1.7.20" packages: org.slf4j:slf4j-api: "2.0.7" -general: - _kotlin-version: "1.8.20" - plugins: - org.panteleyev.jpackageplugin: "1.5.2" - packages: - org.jetbrains.kotlinx:kotlinx-datetime: "0.4.0" - com.expediagroup: - _versions: ["7.0.0-alpha.6", "6.5.2"] - graphql-kotlin-ktor-server: ["7.0.0-alpha.6"] - graphql-kotlin-client: [] - graphql-kotlin-client-generator: [] + # The default configuration, where the kotlin version doesn't matter. + # This is kept as a separate configuration to make the ones above more obvious and easier to maintain. + # + # Most packages should be placed here. + - kotlin-version: "1.8.20" + plugins: + org.panteleyev.jpackageplugin: "1.5.2" + packages: + org.jetbrains.kotlinx:kotlinx-datetime: "0.4.0" + com.expediagroup: + _versions: ["7.0.0-alpha.6", "6.5.2"] + graphql-kotlin-ktor-server: ["7.0.0-alpha.6"] + graphql-kotlin-client: [] + graphql-kotlin-client-generator: [] diff --git a/sync/src/config.py b/sync/src/config.py index 14a9e7c..9a792d9 100644 --- a/sync/src/config.py +++ b/sync/src/config.py @@ -1,3 +1,5 @@ +from typing import Optional + import yaml import logging from dataclasses import dataclass @@ -7,21 +9,21 @@ logger = logging.getLogger(__name__) @dataclass -class KotlinVersion: - version: str +class Configuration: name: str + kotlin_version: str plugins: dict[str, str] packages: list[str] @dataclass class Config: - kotlin_versions: list[KotlinVersion] + configurations: list[Configuration] mirrors: list[str] def handle_packages(section) -> list[str]: - ignore = ["_kotlin-version", '_versions'] + ignore = ['_versions'] result = [] for entry in section: @@ -75,45 +77,43 @@ def handle_plugins(section) -> dict[str, list[str]]: return result -def parse_config(path: Path) -> Config: +def parse_config(path: Path) -> Optional[Config]: with path.open('r') as f: data = yaml.safe_load(f) - parsed = {} + error: list[str] = [] + configurations: list[Configuration] = [] + + for i, section in enumerate(data.get('configurations')): + if (version := section.get('kotlin-version')) is None: + error.append(f"Configuration {i} is missing 'kotlin-version'") - for version, section in data['kotlin'].items(): plugins = handle_plugins(section.get('plugins', {})) packages = handle_packages(section.get('packages', {})) - parsed[version] = { - 'plugins': plugins, - 'packages': packages, - } - - # Merge the general plugins and packages with that of the default version - if general := data.get('general'): - if default_version := general.get('_kotlin-version'): - parsed.setdefault(default_version, {}) - - parsed[default_version]['plugins'].update( - handle_plugins(general.get('plugins', {})) - ) - - parsed[default_version]['packages'].extend( - handle_packages(general.get('packages', {})) - ) - else: - logger.warning(f'"general" section exists, but "_kotlin-version" is not defined. Skipping.') - kotlin_versions = [] + configurations.append(Configuration( + name=f'{version}-packages', + kotlin_version=version, + plugins={}, + packages=packages + )) - for version, section in parsed.items(): - kotlin_versions.append(KotlinVersion(version, f'version-packages', {}, section['packages'])) - - for plugin, plugin_versions in section['plugins'].items(): + for plugin, plugin_versions in plugins.items(): for plugin_version in plugin_versions: - kotlin_versions.append(KotlinVersion(version, f'version-plugins-{plugin}', {plugin: plugin_version}, [])) - - return Config( - kotlin_versions, - data.get('maven', {}).get('mirrors', []), - ) + configurations.append(Configuration( + name=f'version-plugins-{plugin}', + kotlin_version=version, + plugins={plugin: plugin_version}, + packages=[] + )) + + if error: + for msg in error: + logger.error(msg) + + return None + else: + return Config( + configurations, + data.get('maven', {}).get('mirrors', []), + ) diff --git a/sync/src/main.py b/sync/src/main.py index c1913dd..785d184 100644 --- a/sync/src/main.py +++ b/sync/src/main.py @@ -4,25 +4,25 @@ import logging from pathlib import Path from maven import get_effective_packages -from config import parse_config, KotlinVersion +from config import parse_config, Configuration from gradle import create_gradle_build, create_gradle_settings logger = logging.getLogger(__name__) -async def resolve_kotlin(ident: str, kotlin: KotlinVersion, output_dir: Path, mirrors: list[str], gradle_repo: str): +async def resolve_kotlin(ident: str, kotlin: Configuration, output_dir: Path, mirrors: list[str], gradle_repo: str): resolved_packages = [ resolved for package in kotlin.packages for resolved in await get_effective_packages(package, mirrors) ] - path = output_dir / f"{ident}-kotlin-{kotlin.version}" + path = output_dir / f"{ident}-kotlin-{kotlin.kotlin_version}" path.mkdir() logger.debug(f'Creating {path}') logger.debug('Generating build.gradle.kts') - gradle_build = create_gradle_build(kotlin.version, kotlin.plugins, resolved_packages, gradle_repo) + gradle_build = create_gradle_build(kotlin.kotlin_version, kotlin.plugins, resolved_packages, gradle_repo) (path / 'build.gradle.kts').write_text(gradle_build) logger.debug('Generating settings.gradle.kts') @@ -33,17 +33,19 @@ async def resolve_kotlin(ident: str, kotlin: KotlinVersion, output_dir: Path, mi async def main(package_list: Path, output_dir: Path, gradle_repo: str) -> None: config = parse_config(package_list) - if not config.kotlin_versions: - print('No packages defined, nothing to do.') + if not config: + print('Error in configuration') + if not config.configurations: + print('No configurations defined, nothing to do.') elif not config.mirrors: print('No mirrors defined. Add maven.mirrors in the config file.') else: - for i, kotlin in enumerate(config.kotlin_versions): - logger.info(f'Resolving kotlin {kotlin.version}') + for i, configuration in enumerate(config.configurations): + logger.info(f'Resolving kotlin {configuration.kotlin_version}') try: - await resolve_kotlin(str(i), kotlin, output_dir, config.mirrors, gradle_repo) + await resolve_kotlin(str(i), configuration, output_dir, config.mirrors, gradle_repo) except: - logger.exception(f'Error resolving kotlin version {kotlin.version}') + logger.exception(f'Error resolving kotlin version {configuration.kotlin_version}') if __name__ == '__main__':