From 5b57fee1ab9317237d2c6a19f64d2ebec6803c92 Mon Sep 17 00:00:00 2001 From: Oleg Smirnov Date: Tue, 4 Mar 2025 12:31:13 +0100 Subject: [PATCH] Extract remote schema generation into a task in buildSrc --- .../kotlin/tasks/GenerateRemoteSchemas.kt | 60 +++++++++++++++++++ test-suites/build.gradle.kts | 53 +++++++--------- 2 files changed, 83 insertions(+), 30 deletions(-) create mode 100644 buildSrc/src/main/kotlin/tasks/GenerateRemoteSchemas.kt diff --git a/buildSrc/src/main/kotlin/tasks/GenerateRemoteSchemas.kt b/buildSrc/src/main/kotlin/tasks/GenerateRemoteSchemas.kt new file mode 100644 index 00000000..d413ef40 --- /dev/null +++ b/buildSrc/src/main/kotlin/tasks/GenerateRemoteSchemas.kt @@ -0,0 +1,60 @@ +package tasks + +import org.gradle.api.DefaultTask +import org.gradle.api.file.Directory +import org.gradle.api.file.RegularFile +import org.gradle.api.provider.Provider +import org.gradle.api.tasks.InputDirectory +import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.OutputFile +import org.gradle.api.tasks.TaskAction +import org.gradle.process.ExecOperations +import javax.inject.Inject + +/** + * Generates remote schemas file for JSON schema test-suite + */ +abstract class GenerateRemoteSchemas : DefaultTask() { + @InputDirectory + val remotes: Provider = + project.objects.directoryProperty() + .convention( + project.layout.projectDirectory.dir("schema-test-suite/remotes"), + ) + + @InputFile + val script: Provider = + project.objects.fileProperty() + .convention( + project.layout.projectDirectory.file("schema-test-suite/bin/jsonschema_suite"), + ) + + @OutputFile + val remotesFile: Provider = + project.objects.fileProperty() + .convention( + project.layout.buildDirectory.file("remotes.json"), + ) + + @get:Inject + protected abstract val execService: ExecOperations + + init { + group = "generation" + description = "Generates remote schema files for test suites" + } + + @TaskAction + protected fun generate() { + remotesFile.get().asFile.outputStream().use { out -> + execService.exec { + standardOutput = out + executable = "python3" + args( + script.get().asFile.path, + "remotes", + ) + } + } + } +} \ No newline at end of file diff --git a/test-suites/build.gradle.kts b/test-suites/build.gradle.kts index 161e74d8..62ed74e9 100644 --- a/test-suites/build.gradle.kts +++ b/test-suites/build.gradle.kts @@ -3,6 +3,7 @@ import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest import org.jetbrains.kotlin.gradle.targets.native.tasks.KotlinNativeSimulatorTest import org.jetbrains.kotlin.gradle.targets.native.tasks.KotlinNativeTest import org.jlleitschuh.gradle.ktlint.reporter.ReporterType +import tasks.GenerateRemoteSchemas plugins { convention.kotlin @@ -68,52 +69,44 @@ dependencies { kover(projects.jsonSchemaValidator) } -private val remotesFile = - layout.buildDirectory - .file("remotes.json") - .get() - .asFile - val generateRemoteSchemas = - tasks.register("generateRemoteSchemas") { - inputs.dir("$projectDir/schema-test-suite/remotes") - outputs.files(remotesFile) - doLast { - remotesFile.outputStream().use { out -> - exec { - standardOutput = out - executable = "python3" - args( - "$projectDir/schema-test-suite/bin/jsonschema_suite", - "remotes", - ) - } - } - } - } + tasks.register("generateRemoteSchemas") tasks.withType { dependsOn(generateRemoteSchemas) } tasks.withType { - // This is used to pass the right location for Node.js test - environment("TEST_SUITES_DIR", "$projectDir/schema-test-suite/tests") - environment("REMOTES_SCHEMAS_JSON", remotesFile.absolutePath) + doFirst { + // This is used to pass the right location for Node.js test + environment("TEST_SUITES_DIR", "$projectDir/schema-test-suite/tests") + environment("REMOTES_SCHEMAS_JSON", generateRemoteSchemas.flatMap { it.remotesFile }.get().asFile.absolutePath) + } } tasks.withType { - // prefix SIMCTL_CHILD_ is used to pass the env variable to the simulator - environment("SIMCTL_CHILD_TEST_SUITES_DIR", "$projectDir/schema-test-suite/tests") - environment("SIMCTL_CHILD_REMOTES_SCHEMAS_JSON", remotesFile.absolutePath) + doFirst { + // prefix SIMCTL_CHILD_ is used to pass the env variable to the simulator + environment("SIMCTL_CHILD_TEST_SUITES_DIR", "$projectDir/schema-test-suite/tests") + environment( + "SIMCTL_CHILD_REMOTES_SCHEMAS_JSON", + generateRemoteSchemas.flatMap { + it.remotesFile + }.get().asFile.absolutePath, + ) + } } tasks.withType { - environment("REMOTES_SCHEMAS_JSON", remotesFile.absolutePath) + doFirst { + environment("REMOTES_SCHEMAS_JSON", generateRemoteSchemas.flatMap { it.remotesFile }.get().asFile.absolutePath) + } } tasks.withType { - environment("REMOTES_SCHEMAS_JSON", remotesFile.absolutePath) + doFirst { + environment("REMOTES_SCHEMAS_JSON", generateRemoteSchemas.flatMap { it.remotesFile }.get().asFile.absolutePath) + } } ktlint {