From 18e96a635f5296da52da0f13f9f44c850d1c48a0 Mon Sep 17 00:00:00 2001 From: colinrosati Date: Wed, 17 Jun 2026 17:03:56 +0200 Subject: [PATCH 1/4] Fix RAML array example formatting --- .../ramldoc/extensions/VrapExtensions.kt | 2 +- .../languages/ramldoc/TestCodeGenerator.kt | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/languages/ramldoc/src/main/kotlin/io/vrap/codegen/languages/ramldoc/extensions/VrapExtensions.kt b/languages/ramldoc/src/main/kotlin/io/vrap/codegen/languages/ramldoc/extensions/VrapExtensions.kt index 154e8ee4..e2156bd3 100644 --- a/languages/ramldoc/src/main/kotlin/io/vrap/codegen/languages/ramldoc/extensions/VrapExtensions.kt +++ b/languages/ramldoc/src/main/kotlin/io/vrap/codegen/languages/ramldoc/extensions/VrapExtensions.kt @@ -156,7 +156,7 @@ fun Example.renderExample(exampleName: String, inlineExample: Boolean = false): | <<${this.description.value.trim()}>>""" else ""}${if (this.annotations.isNotEmpty()) """ | <<${this.annotations.joinToString("\n") { it.renderAnnotation() }}>>""" else ""} | strict: ${this.strict.value} - | value:${if (!inlineExample) " !include ../examples/$exampleName.json" else if (this.value is ObjectInstance) """| + | value:${if (!inlineExample) " !include ../examples/$exampleName.json" else if (this.value is ObjectInstance || this.value is ArrayInstance) """| | <<${this.value.toJson().escapeAll()}>>""".trimMargin().keepAngleIndent().escapeAll() else " " + this.value.toJson().escapeAll() } """.trimMargin().keepAngleIndent().escapeAll() } diff --git a/languages/ramldoc/src/test/kotlin/io/vrap/codegen/languages/ramldoc/TestCodeGenerator.kt b/languages/ramldoc/src/test/kotlin/io/vrap/codegen/languages/ramldoc/TestCodeGenerator.kt index ff0227de..c728b7f7 100644 --- a/languages/ramldoc/src/test/kotlin/io/vrap/codegen/languages/ramldoc/TestCodeGenerator.kt +++ b/languages/ramldoc/src/test/kotlin/io/vrap/codegen/languages/ramldoc/TestCodeGenerator.kt @@ -1,6 +1,7 @@ package io.vrap.codegen.languages.ramldoc import io.vrap.codegen.languages.ramldoc.extensions.renderAnnotation +import io.vrap.codegen.languages.ramldoc.extensions.renderExample import io.vrap.codegen.languages.ramldoc.extensions.toJson import io.vrap.codegen.languages.ramldoc.model.MarkdownModelModule import io.vrap.codegen.languages.ramldoc.model.RamldocBaseTypes @@ -9,6 +10,7 @@ import io.vrap.rmf.codegen.CodeGeneratorConfig import io.vrap.rmf.codegen.di.* import io.vrap.rmf.codegen.io.MemoryDataSink import io.vrap.rmf.raml.model.types.ObjectInstance +import io.vrap.rmf.raml.model.types.TypesFactory import org.assertj.core.api.Assertions import org.assertj.core.util.diff.DiffUtils import org.junit.jupiter.api.Test @@ -305,6 +307,29 @@ class TestCodeGenerator { """.trimIndent().trimStart()) } + @Test + fun testArrayExampleRenderUsesMultilineBlock() { + val example = TypesFactory.eINSTANCE.createExample() + example.strict = TypesFactory.eINSTANCE.createBooleanInstance().apply { + value = true + } + + val arrayInstance = TypesFactory.eINSTANCE.createArrayInstance() + arrayInstance.value.add(TypesFactory.eINSTANCE.createStringInstance().apply { + value = "first" + }) + arrayInstance.value.add(TypesFactory.eINSTANCE.createStringInstance().apply { + value = "second" + }) + example.value = arrayInstance + + val rendered = example.renderExample("Test", inlineExample = true) + + Assertions.assertThat(rendered) + .contains("value: |") + .doesNotContain("value: [ {") + } + @Test fun ramlRenderToRamlDoc() { val generatorConfig = CodeGeneratorConfig( From 267ac4d8e035f44f6c11c4632440e40b0157394e Mon Sep 17 00:00:00 2001 From: colinrosati Date: Wed, 17 Jun 2026 17:10:15 +0200 Subject: [PATCH 2/4] Fix test: use RAML file instead of non-existent factory methods --- .../languages/ramldoc/TestCodeGenerator.kt | 35 +++++++++---------- .../src/test/resources/arrayexample.raml | 22 ++++++++++++ 2 files changed, 38 insertions(+), 19 deletions(-) create mode 100644 languages/ramldoc/src/test/resources/arrayexample.raml diff --git a/languages/ramldoc/src/test/kotlin/io/vrap/codegen/languages/ramldoc/TestCodeGenerator.kt b/languages/ramldoc/src/test/kotlin/io/vrap/codegen/languages/ramldoc/TestCodeGenerator.kt index c728b7f7..7f7b2dc0 100644 --- a/languages/ramldoc/src/test/kotlin/io/vrap/codegen/languages/ramldoc/TestCodeGenerator.kt +++ b/languages/ramldoc/src/test/kotlin/io/vrap/codegen/languages/ramldoc/TestCodeGenerator.kt @@ -1,7 +1,6 @@ package io.vrap.codegen.languages.ramldoc import io.vrap.codegen.languages.ramldoc.extensions.renderAnnotation -import io.vrap.codegen.languages.ramldoc.extensions.renderExample import io.vrap.codegen.languages.ramldoc.extensions.toJson import io.vrap.codegen.languages.ramldoc.model.MarkdownModelModule import io.vrap.codegen.languages.ramldoc.model.RamldocBaseTypes @@ -10,7 +9,6 @@ import io.vrap.rmf.codegen.CodeGeneratorConfig import io.vrap.rmf.codegen.di.* import io.vrap.rmf.codegen.io.MemoryDataSink import io.vrap.rmf.raml.model.types.ObjectInstance -import io.vrap.rmf.raml.model.types.TypesFactory import org.assertj.core.api.Assertions import org.assertj.core.util.diff.DiffUtils import org.junit.jupiter.api.Test @@ -309,23 +307,22 @@ class TestCodeGenerator { @Test fun testArrayExampleRenderUsesMultilineBlock() { - val example = TypesFactory.eINSTANCE.createExample() - example.strict = TypesFactory.eINSTANCE.createBooleanInstance().apply { - value = true - } - - val arrayInstance = TypesFactory.eINSTANCE.createArrayInstance() - arrayInstance.value.add(TypesFactory.eINSTANCE.createStringInstance().apply { - value = "first" - }) - arrayInstance.value.add(TypesFactory.eINSTANCE.createStringInstance().apply { - value = "second" - }) - example.value = arrayInstance - - val rendered = example.renderExample("Test", inlineExample = true) - - Assertions.assertThat(rendered) + val generatorConfig = CodeGeneratorConfig( + basePackageName = "com/commercetools/importer", + outputFolder = Paths.get("build/gensrc"), + inlineExamples = true + ) + + val apiProvider = RamlApiProvider(Paths.get("src/test/resources/arrayexample.raml")) + + val dataSink = MemoryDataSink() + val generatorModule = RamlGeneratorModule(apiProvider, generatorConfig, RamldocBaseTypes, dataSink = dataSink) + val generatorComponent = RamlGeneratorComponent(generatorModule, RamldocModelModule) + generatorComponent.generateFiles() + + val resourceContent = dataSink.files.get("resources/QueryItems.raml") + Assertions.assertThat(resourceContent).isNotNull() + Assertions.assertThat(resourceContent) .contains("value: |") .doesNotContain("value: [ {") } diff --git a/languages/ramldoc/src/test/resources/arrayexample.raml b/languages/ramldoc/src/test/resources/arrayexample.raml new file mode 100644 index 00000000..07eb96c0 --- /dev/null +++ b/languages/ramldoc/src/test/resources/arrayexample.raml @@ -0,0 +1,22 @@ +#%RAML 1.0 +--- +title: Array Example Test API +version: 1.0 +baseUri: http://example.com/api +/items: + get: + displayName: QueryItems + securedBy: [] + responses: + 200: + body: + application/json: + type: array + items: + type: object + examples: + default: + strict: true + value: + - name: "first" + - name: "second" From 0248c11b585ddb2798eefa5935be6e5737d8be4a Mon Sep 17 00:00:00 2001 From: colinrosati Date: Wed, 17 Jun 2026 17:20:53 +0200 Subject: [PATCH 3/4] Fix test: find resource by prefix instead of hardcoded key --- .../vrap/codegen/languages/ramldoc/TestCodeGenerator.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/languages/ramldoc/src/test/kotlin/io/vrap/codegen/languages/ramldoc/TestCodeGenerator.kt b/languages/ramldoc/src/test/kotlin/io/vrap/codegen/languages/ramldoc/TestCodeGenerator.kt index 7f7b2dc0..537e8c3f 100644 --- a/languages/ramldoc/src/test/kotlin/io/vrap/codegen/languages/ramldoc/TestCodeGenerator.kt +++ b/languages/ramldoc/src/test/kotlin/io/vrap/codegen/languages/ramldoc/TestCodeGenerator.kt @@ -320,8 +320,12 @@ class TestCodeGenerator { val generatorComponent = RamlGeneratorComponent(generatorModule, RamldocModelModule) generatorComponent.generateFiles() - val resourceContent = dataSink.files.get("resources/QueryItems.raml") - Assertions.assertThat(resourceContent).isNotNull() + Assertions.assertThat(dataSink.files).isNotEmpty() + val resourceContent = dataSink.files.entries + .filter { it.key.startsWith("resources/") } + .map { it.value } + .joinToString("\n") + Assertions.assertThat(resourceContent).isNotBlank() Assertions.assertThat(resourceContent) .contains("value: |") .doesNotContain("value: [ {") From ec561e19d637ef681b11b548688823135729c4c1 Mon Sep 17 00:00:00 2001 From: colinrosati Date: Thu, 18 Jun 2026 09:36:57 +0200 Subject: [PATCH 4/4] Harden CI Gradle downloads with cache and retries --- .github/workflows/ci.yml | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 38fdb0a1..29d2dec5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,9 +21,27 @@ jobs: with: distribution: 'temurin' java-version: '11' + cache: 'gradle' - name: Build and Release - run: ./gradlew clean check shadowJar + env: + GRADLE_OPTS: "-Dorg.gradle.internal.http.connectionTimeout=120000 -Dorg.gradle.internal.http.socketTimeout=120000" + run: | + set -euo pipefail + for attempt in 1 2 3; do + echo "Gradle build attempt ${attempt}/3" + if ./gradlew --no-daemon clean check shadowJar; then + exit 0 + fi + + if [[ "${attempt}" -lt 3 ]]; then + echo "Build failed, retrying in 15 seconds..." + sleep 15 + fi + done + + echo "Build failed after 3 attempts." + exit 1 - run: ./scripts/install_local.sh - name: Checkout @@ -50,6 +68,7 @@ jobs: with: distribution: 'temurin' java-version: '11' + cache: 'gradle' - name: Setup Node uses: actions/setup-node@v4