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 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..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 @@ -305,6 +305,32 @@ class TestCodeGenerator { """.trimIndent().trimStart()) } + @Test + fun testArrayExampleRenderUsesMultilineBlock() { + 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() + + 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: [ {") + } + @Test fun ramlRenderToRamlDoc() { val generatorConfig = CodeGeneratorConfig( 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"