From 928a126ed46f58cf6b3bf80d39d22861f43fd0f1 Mon Sep 17 00:00:00 2001 From: michalkozak Date: Thu, 14 Nov 2024 16:00:48 +0100 Subject: [PATCH 1/3] feat(BEGUILD-249): rules for unified Backbase API specs --- .../oss/boat/quay/ruleset/NoPrefixPathRule.kt | 43 +++++++ .../boat/quay/ruleset/NoVersionInUriRule.kt | 32 +++++ .../oss/boat/quay/ruleset/PrefixPathRule.kt | 15 ++- .../oss/boat/quay/ruleset/VersionInUriRule.kt | 7 +- .../boat/quay/ruleset/util/UnifiedApiUtil.kt | 13 +++ .../boat/quay/ruleset/NoPrefixPathRuleTest.kt | 110 ++++++++++++++++++ .../quay/ruleset/NoVersionInUriRuleTest.kt | 109 +++++++++++++++++ 7 files changed, 323 insertions(+), 6 deletions(-) create mode 100644 boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/NoPrefixPathRule.kt create mode 100644 boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/NoVersionInUriRule.kt create mode 100644 boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/util/UnifiedApiUtil.kt create mode 100644 boat-quay/boat-quay-rules/src/test/kotlin/com/backbase/oss/boat/quay/ruleset/NoPrefixPathRuleTest.kt create mode 100644 boat-quay/boat-quay-rules/src/test/kotlin/com/backbase/oss/boat/quay/ruleset/NoVersionInUriRuleTest.kt diff --git a/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/NoPrefixPathRule.kt b/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/NoPrefixPathRule.kt new file mode 100644 index 000000000..a22d0fbd1 --- /dev/null +++ b/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/NoPrefixPathRule.kt @@ -0,0 +1,43 @@ +package com.backbase.oss.boat.quay.ruleset + +import com.backbase.oss.boat.quay.ruleset.util.UnifiedApiUtil +import com.typesafe.config.Config +import org.zalando.zally.rule.api.* +import kotlin.collections.map +import kotlin.collections.orEmpty + +@Rule( + ruleSet = BoatRuleSet::class, + id = "B007U", + severity = Severity.MUST, + title = "Check no prefix for paths for Unified Backbase API specs" +) +class NoPrefixPathRule(config: Config) { + + private val validPathPrefixes = config + .getStringList("PrefixPathRule.validPathPrefixes") + .toSet() + + @Check(Severity.MUST) + fun validate(context: Context): List = + + if (!UnifiedApiUtil.isUnifiedBackbaseApi(context.api.info)) + emptyList() + else + context.api.paths.orEmpty() + .map { + val extractParts = it.key.split("/") + val prefix = if (extractParts.size > 1) extractParts[1] else "" + Pair(prefix, it.value) + } + .filter { + validPathPrefixes.contains(it.first) + } + .map { + context.violation( + "Incorrect path prefix: ${it.first}. Values $validPathPrefixes are not allowed for Unified Backbase API", + it.second + ) + } + +} diff --git a/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/NoVersionInUriRule.kt b/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/NoVersionInUriRule.kt new file mode 100644 index 000000000..5c261a742 --- /dev/null +++ b/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/NoVersionInUriRule.kt @@ -0,0 +1,32 @@ +package com.backbase.oss.boat.quay.ruleset + +import com.backbase.oss.boat.quay.ruleset.util.UnifiedApiUtil +import io.swagger.v3.oas.models.OpenAPI +import io.swagger.v3.oas.models.PathItem +import org.zalando.zally.rule.api.* + +@Rule( + ruleSet = BoatRuleSet::class, + id = "B009U", + severity = Severity.MUST, + title = "Check no prefix for paths should contain version for Unified Backbase API specs" +) +class NoVersionInUriRule { + + private val description = "URL should not contain version number" + private val versionRegex = "(.*)v[0-9]+(.*)".toRegex() + + @Check(severity = Severity.MUST) + fun validate(context: Context): List = + if (!UnifiedApiUtil.isUnifiedBackbaseApi(context.api.info)) + emptyList() + else + ( violatingPaths(context.api)) + .map { context.violation(description, it) } + + + private fun violatingPaths(api: OpenAPI): Collection = + api.paths.orEmpty().entries + .filter { (path, _) -> path.matches(versionRegex) } + .map { (_, pathEntry) -> pathEntry } +} \ No newline at end of file diff --git a/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/PrefixPathRule.kt b/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/PrefixPathRule.kt index 3bd745c8a..51b66564f 100644 --- a/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/PrefixPathRule.kt +++ b/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/PrefixPathRule.kt @@ -1,7 +1,9 @@ package com.backbase.oss.boat.quay.ruleset +import com.backbase.oss.boat.quay.ruleset.util.UnifiedApiUtil import com.typesafe.config.Config import org.zalando.zally.rule.api.* +import kotlin.collections.emptyList @Rule( ruleSet = BoatRuleSet::class, @@ -18,18 +20,23 @@ class PrefixPathRule(config: Config) { @Check(Severity.MUST) fun validate(context: Context): List = - context.api.paths.orEmpty() + if (UnifiedApiUtil.isUnifiedBackbaseApi(context.api.info)) + emptyList() + else + context.api.paths.orEmpty() .map { val extractParts = it.key.split("/") - val prefix = if(extractParts.size > 1) extractParts[1] else "" + val prefix = if (extractParts.size > 1) extractParts[1] else "" Pair(prefix, it.value) } .filter { !validPathPrefixes.contains(it.first) } .map { - context.violation("Incorrect path prefix: ${it.first}. Correct values are $validPathPrefixes", it.second) + context.violation( + "Incorrect path prefix: ${it.first}. Correct values are $validPathPrefixes", + it.second + ) } - } diff --git a/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/VersionInUriRule.kt b/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/VersionInUriRule.kt index c9e620cb8..8125ec08c 100644 --- a/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/VersionInUriRule.kt +++ b/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/VersionInUriRule.kt @@ -1,5 +1,6 @@ package com.backbase.oss.boat.quay.ruleset +import com.backbase.oss.boat.quay.ruleset.util.UnifiedApiUtil import io.swagger.v3.oas.models.OpenAPI import io.swagger.v3.oas.models.PathItem import org.zalando.zally.rule.api.* @@ -8,7 +9,7 @@ import org.zalando.zally.rule.api.* ruleSet = BoatRuleSet::class, id = "B009", severity = Severity.MUST, - title = "Check prefix for paths should contain version." + title = "Check prefix for paths should contain version" ) class VersionInUriRule { @@ -17,11 +18,13 @@ class VersionInUriRule { @Check(severity = Severity.MUST) fun validate(context: Context): List = + if (UnifiedApiUtil.isUnifiedBackbaseApi(context.api.info)) + emptyList() + else ( violatingPaths(context.api)) .map { context.violation(description, it) } - private fun violatingPaths(api: OpenAPI): Collection = api.paths.orEmpty().entries .filter { (path, _) -> !path.matches(versionRegex) } diff --git a/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/util/UnifiedApiUtil.kt b/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/util/UnifiedApiUtil.kt new file mode 100644 index 000000000..5c7ea0b6a --- /dev/null +++ b/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/util/UnifiedApiUtil.kt @@ -0,0 +1,13 @@ +package com.backbase.oss.boat.quay.ruleset.util + +import io.swagger.v3.oas.models.info.Info + +object UnifiedApiUtil { + + private val API_TYPE = "x-api-type" + private val UNIFIED_BACKBASE_API = "Unified Backbase API" + + fun isUnifiedBackbaseApi(openApiInfo: Info) : Boolean = + openApiInfo.extensions != null && openApiInfo.extensions[API_TYPE] == UNIFIED_BACKBASE_API + +} \ No newline at end of file diff --git a/boat-quay/boat-quay-rules/src/test/kotlin/com/backbase/oss/boat/quay/ruleset/NoPrefixPathRuleTest.kt b/boat-quay/boat-quay-rules/src/test/kotlin/com/backbase/oss/boat/quay/ruleset/NoPrefixPathRuleTest.kt new file mode 100644 index 000000000..948a67ed6 --- /dev/null +++ b/boat-quay/boat-quay-rules/src/test/kotlin/com/backbase/oss/boat/quay/ruleset/NoPrefixPathRuleTest.kt @@ -0,0 +1,110 @@ +package com.backbase.oss.boat.quay.ruleset + +import com.backbase.oss.boat.quay.ruleset.test.ZallyAssertions +import org.intellij.lang.annotations.Language +import org.junit.jupiter.api.Test +import org.zalando.zally.core.DefaultContextFactory +import org.zalando.zally.core.rulesConfig + +class NoPrefixPathRuleTest { + + private val cut = NoPrefixPathRule(rulesConfig) + + @Test + fun `correct path prefix`() { + @Language("YAML") + val context = DefaultContextFactory().getOpenApiContext( + """ + openapi: 3.0.3 + info: + title: Thing API + version: 1.0.0 + x-api-type: Unified Backbase API + paths: + /foo: + get: + description: Lorem Ipsum + operationId: foo + responses: + 202: + description: Lorem Ipsum + headers: + Location: # should not violate since not called `Link` + type: string + format: url + /bar: + get: + description: Lorem Ipsum + operationId: foo + responses: + 202: + description: Lorem Ipsum + headers: + Location: # should not violate since not called `Link` + type: string + format: url + """.trimIndent() + ) + + val violations = cut.validate(context) + + ZallyAssertions + .assertThat(violations) + .isEmpty() + } + + @Test + fun `incorrect path prefix`() { + @Language("YAML") + val context = DefaultContextFactory().getOpenApiContext( + """ + openapi: 3.0.3 + info: + title: Thing API + version: 1.0.0 + x-api-type: Unified Backbase API + paths: + /client-api/foo: + get: + description: Lorem Ipsum + operationId: foo + responses: + 202: + description: Lorem Ipsum + headers: + Location: # should not violate since not called `Link` + type: string + format: url + /service-api/bar: + get: + description: Lorem Ipsum + operationId: bar + responses: + 202: + description: Lorem Ipsum + headers: + Location: # should not violate since not called `Link` + type: string + format: url + /integration-api/bar2: + get: + description: Lorem Ipsum 2 + operationId: bar2 + responses: + 202: + description: Lorem Ipsum 2 + headers: + Location: # should not violate since not called `Link` + type: string + format: url + """.trimIndent() + ) + + val violations = cut.validate(context) + + ZallyAssertions + .assertThat(violations) + .isNotEmpty + } + +} \ No newline at end of file diff --git a/boat-quay/boat-quay-rules/src/test/kotlin/com/backbase/oss/boat/quay/ruleset/NoVersionInUriRuleTest.kt b/boat-quay/boat-quay-rules/src/test/kotlin/com/backbase/oss/boat/quay/ruleset/NoVersionInUriRuleTest.kt new file mode 100644 index 000000000..846619ba8 --- /dev/null +++ b/boat-quay/boat-quay-rules/src/test/kotlin/com/backbase/oss/boat/quay/ruleset/NoVersionInUriRuleTest.kt @@ -0,0 +1,109 @@ +package com.backbase.oss.boat.quay.ruleset + +import com.backbase.oss.boat.quay.ruleset.test.ZallyAssertions +import org.intellij.lang.annotations.Language +import org.junit.jupiter.api.Test +import org.zalando.zally.core.DefaultContextFactory + +class NoVersionInUriRuleTest { + + private val cut = NoVersionInUriRule() + + @Test + fun `correct path prefix without version`() { + @Language("YAML") + val context = DefaultContextFactory().getOpenApiContext( + """ + openapi: 3.0.3 + info: + title: Thing API + version: 1.0.0 + x-api-type: Unified Backbase API + paths: + /api/foo: + get: + description: Lorem Ipsum + operationId: foo + responses: + 202: + description: Lorem Ipsum + headers: + Location: # should not violate since not called `Link` + type: string + format: url + /api/bar: + get: + description: Lorem Ipsum + operationId: foo + responses: + 202: + description: Lorem Ipsum + headers: + Location: # should not violate since not called `Link` + type: string + format: url + """.trimIndent() + ) + + val violations = cut.validate(context) + + ZallyAssertions + .assertThat(violations) + .isEmpty() + } + + @Test + fun `incorrect path prefix with version`() { + @Language("YAML") + val context = DefaultContextFactory().getOpenApiContext( + """ + openapi: 3.0.3 + info: + title: Thing API + version: 1.0.0 + x-api-type: Unified Backbase API + paths: + /api/foo/v1true: + get: + description: Lorem Ipsum + operationId: foo + responses: + 202: + description: Lorem Ipsum + headers: + Location: # should not violate since not called `Link` + type: string + format: url + /api/v1/bar: + get: + description: Lorem Ipsum + operationId: bar + responses: + 202: + description: Lorem Ipsum + headers: + Location: # should not violate since not called `Link` + type: string + format: url + /v2/bar2: + get: + description: Lorem Ipsum 2 + operationId: bar2 + responses: + 202: + description: Lorem Ipsum 2 + headers: + Location: # should not violate since not called `Link` + type: string + format: url + """.trimIndent() + ) + + val violations = cut.validate(context) + + ZallyAssertions + .assertThat(violations) + .isNotEmpty + } + +} \ No newline at end of file From e3cf47998764511a6e10a0099b072466b4964449 Mon Sep 17 00:00:00 2001 From: michalkozak Date: Thu, 21 Nov 2024 15:21:26 +0100 Subject: [PATCH 2/3] feat(BEGUILD-249): rules for unified Backbase API specs --- .../backbase/oss/boat/AbstractLintMojo.java | 2 +- .../com/backbase/oss/boat/LintMojoTests.java | 2 +- .../oss/boat/quay/ruleset/NoPrefixPathRule.kt | 33 ++++++++----------- .../boat/quay/ruleset/NoVersionInUriRule.kt | 10 ++---- .../oss/boat/quay/ruleset/PrefixPathRule.kt | 15 +++------ .../oss/boat/quay/ruleset/VersionInUriRule.kt | 7 ++-- .../boat/quay/ruleset/util/UnifiedApiUtil.kt | 13 -------- .../boat/quay/ruleset/NoPrefixPathRuleTest.kt | 2 -- .../quay/ruleset/NoVersionInUriRuleTest.kt | 2 -- 9 files changed, 24 insertions(+), 62 deletions(-) delete mode 100644 boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/util/UnifiedApiUtil.kt diff --git a/boat-maven-plugin/src/main/java/com/backbase/oss/boat/AbstractLintMojo.java b/boat-maven-plugin/src/main/java/com/backbase/oss/boat/AbstractLintMojo.java index 81cb645e2..51d94ed44 100644 --- a/boat-maven-plugin/src/main/java/com/backbase/oss/boat/AbstractLintMojo.java +++ b/boat-maven-plugin/src/main/java/com/backbase/oss/boat/AbstractLintMojo.java @@ -40,7 +40,7 @@ public abstract class AbstractLintMojo extends InputMavenArtifactMojo { @Parameter(name = "ignoreRules") protected String[] ignoreRules = new String[]{"150","219","215","218","166","136","174","235","107","171","224","143", "151","129","146","147","172","145","115","132","120", "134","183","154","105","104","130","118","110","153", - "101","176","116","M009","H002","M010","H001","M008","S005","S006","S007","M011"}; + "101","176","116","M009","H002","M010","H001","M008","S005","S006","S007","M011","B007U","B009U"}; protected List lint() throws MojoExecutionException, MojoFailureException { diff --git a/boat-maven-plugin/src/test/java/com/backbase/oss/boat/LintMojoTests.java b/boat-maven-plugin/src/test/java/com/backbase/oss/boat/LintMojoTests.java index ef52d0928..7b27f232d 100644 --- a/boat-maven-plugin/src/test/java/com/backbase/oss/boat/LintMojoTests.java +++ b/boat-maven-plugin/src/test/java/com/backbase/oss/boat/LintMojoTests.java @@ -21,7 +21,7 @@ class LintMojoTests { @Test void testFailOnWarningNoWarnings() throws MojoFailureException, MojoExecutionException { LintMojo lintMojo = new LintMojo(); - lintMojo.setIgnoreRules(Arrays.array("219", "105", "104", "151", "134", "115","M0012", "224", "B013", "B014")); + lintMojo.setIgnoreRules(Arrays.array("219", "105", "104", "151", "134", "115","M0012", "224", "B013", "B014", "B007U", "B009U")); lintMojo.setInput(getFile("/oas-examples/no-lint-warnings.yaml")); lintMojo.setFailOnWarning(true); lintMojo.execute(); diff --git a/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/NoPrefixPathRule.kt b/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/NoPrefixPathRule.kt index a22d0fbd1..e60f9aee8 100644 --- a/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/NoPrefixPathRule.kt +++ b/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/NoPrefixPathRule.kt @@ -1,6 +1,5 @@ package com.backbase.oss.boat.quay.ruleset -import com.backbase.oss.boat.quay.ruleset.util.UnifiedApiUtil import com.typesafe.config.Config import org.zalando.zally.rule.api.* import kotlin.collections.map @@ -10,7 +9,7 @@ import kotlin.collections.orEmpty ruleSet = BoatRuleSet::class, id = "B007U", severity = Severity.MUST, - title = "Check no prefix for paths for Unified Backbase API specs" + title = "Check no prefix for paths (the rule intended for Unified Backbase API specs)" ) class NoPrefixPathRule(config: Config) { @@ -21,23 +20,17 @@ class NoPrefixPathRule(config: Config) { @Check(Severity.MUST) fun validate(context: Context): List = - if (!UnifiedApiUtil.isUnifiedBackbaseApi(context.api.info)) - emptyList() - else - context.api.paths.orEmpty() - .map { - val extractParts = it.key.split("/") - val prefix = if (extractParts.size > 1) extractParts[1] else "" - Pair(prefix, it.value) - } - .filter { - validPathPrefixes.contains(it.first) - } - .map { - context.violation( - "Incorrect path prefix: ${it.first}. Values $validPathPrefixes are not allowed for Unified Backbase API", - it.second - ) - } + context.api.paths.orEmpty() + .map { + val extractParts = it.key.split("/") + val prefix = if (extractParts.size > 1) extractParts[1] else "" + Pair(prefix, it.value) + } + .filter { + validPathPrefixes.contains(it.first) + } + .map { + context.violation("Incorrect path prefix: ${it.first}", it.second) + } } diff --git a/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/NoVersionInUriRule.kt b/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/NoVersionInUriRule.kt index 5c261a742..e27741c23 100644 --- a/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/NoVersionInUriRule.kt +++ b/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/NoVersionInUriRule.kt @@ -1,6 +1,5 @@ package com.backbase.oss.boat.quay.ruleset -import com.backbase.oss.boat.quay.ruleset.util.UnifiedApiUtil import io.swagger.v3.oas.models.OpenAPI import io.swagger.v3.oas.models.PathItem import org.zalando.zally.rule.api.* @@ -9,7 +8,7 @@ import org.zalando.zally.rule.api.* ruleSet = BoatRuleSet::class, id = "B009U", severity = Severity.MUST, - title = "Check no prefix for paths should contain version for Unified Backbase API specs" + title = "Check no prefix for paths should contain version (the rule intended for Unified Backbase API specs)" ) class NoVersionInUriRule { @@ -18,11 +17,8 @@ class NoVersionInUriRule { @Check(severity = Severity.MUST) fun validate(context: Context): List = - if (!UnifiedApiUtil.isUnifiedBackbaseApi(context.api.info)) - emptyList() - else - ( violatingPaths(context.api)) - .map { context.violation(description, it) } + (violatingPaths(context.api)) + .map { context.violation(description, it) } private fun violatingPaths(api: OpenAPI): Collection = diff --git a/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/PrefixPathRule.kt b/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/PrefixPathRule.kt index 51b66564f..3bd745c8a 100644 --- a/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/PrefixPathRule.kt +++ b/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/PrefixPathRule.kt @@ -1,9 +1,7 @@ package com.backbase.oss.boat.quay.ruleset -import com.backbase.oss.boat.quay.ruleset.util.UnifiedApiUtil import com.typesafe.config.Config import org.zalando.zally.rule.api.* -import kotlin.collections.emptyList @Rule( ruleSet = BoatRuleSet::class, @@ -20,23 +18,18 @@ class PrefixPathRule(config: Config) { @Check(Severity.MUST) fun validate(context: Context): List = - if (UnifiedApiUtil.isUnifiedBackbaseApi(context.api.info)) - emptyList() - else - context.api.paths.orEmpty() + context.api.paths.orEmpty() .map { val extractParts = it.key.split("/") - val prefix = if (extractParts.size > 1) extractParts[1] else "" + val prefix = if(extractParts.size > 1) extractParts[1] else "" Pair(prefix, it.value) } .filter { !validPathPrefixes.contains(it.first) } .map { - context.violation( - "Incorrect path prefix: ${it.first}. Correct values are $validPathPrefixes", - it.second - ) + context.violation("Incorrect path prefix: ${it.first}. Correct values are $validPathPrefixes", it.second) } + } diff --git a/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/VersionInUriRule.kt b/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/VersionInUriRule.kt index 8125ec08c..c9e620cb8 100644 --- a/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/VersionInUriRule.kt +++ b/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/VersionInUriRule.kt @@ -1,6 +1,5 @@ package com.backbase.oss.boat.quay.ruleset -import com.backbase.oss.boat.quay.ruleset.util.UnifiedApiUtil import io.swagger.v3.oas.models.OpenAPI import io.swagger.v3.oas.models.PathItem import org.zalando.zally.rule.api.* @@ -9,7 +8,7 @@ import org.zalando.zally.rule.api.* ruleSet = BoatRuleSet::class, id = "B009", severity = Severity.MUST, - title = "Check prefix for paths should contain version" + title = "Check prefix for paths should contain version." ) class VersionInUriRule { @@ -18,13 +17,11 @@ class VersionInUriRule { @Check(severity = Severity.MUST) fun validate(context: Context): List = - if (UnifiedApiUtil.isUnifiedBackbaseApi(context.api.info)) - emptyList() - else ( violatingPaths(context.api)) .map { context.violation(description, it) } + private fun violatingPaths(api: OpenAPI): Collection = api.paths.orEmpty().entries .filter { (path, _) -> !path.matches(versionRegex) } diff --git a/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/util/UnifiedApiUtil.kt b/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/util/UnifiedApiUtil.kt deleted file mode 100644 index 5c7ea0b6a..000000000 --- a/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/util/UnifiedApiUtil.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.backbase.oss.boat.quay.ruleset.util - -import io.swagger.v3.oas.models.info.Info - -object UnifiedApiUtil { - - private val API_TYPE = "x-api-type" - private val UNIFIED_BACKBASE_API = "Unified Backbase API" - - fun isUnifiedBackbaseApi(openApiInfo: Info) : Boolean = - openApiInfo.extensions != null && openApiInfo.extensions[API_TYPE] == UNIFIED_BACKBASE_API - -} \ No newline at end of file diff --git a/boat-quay/boat-quay-rules/src/test/kotlin/com/backbase/oss/boat/quay/ruleset/NoPrefixPathRuleTest.kt b/boat-quay/boat-quay-rules/src/test/kotlin/com/backbase/oss/boat/quay/ruleset/NoPrefixPathRuleTest.kt index 948a67ed6..ba4cdffc9 100644 --- a/boat-quay/boat-quay-rules/src/test/kotlin/com/backbase/oss/boat/quay/ruleset/NoPrefixPathRuleTest.kt +++ b/boat-quay/boat-quay-rules/src/test/kotlin/com/backbase/oss/boat/quay/ruleset/NoPrefixPathRuleTest.kt @@ -19,7 +19,6 @@ class NoPrefixPathRuleTest { info: title: Thing API version: 1.0.0 - x-api-type: Unified Backbase API paths: /foo: get: @@ -62,7 +61,6 @@ class NoPrefixPathRuleTest { info: title: Thing API version: 1.0.0 - x-api-type: Unified Backbase API paths: /client-api/foo: get: diff --git a/boat-quay/boat-quay-rules/src/test/kotlin/com/backbase/oss/boat/quay/ruleset/NoVersionInUriRuleTest.kt b/boat-quay/boat-quay-rules/src/test/kotlin/com/backbase/oss/boat/quay/ruleset/NoVersionInUriRuleTest.kt index 846619ba8..35f123246 100644 --- a/boat-quay/boat-quay-rules/src/test/kotlin/com/backbase/oss/boat/quay/ruleset/NoVersionInUriRuleTest.kt +++ b/boat-quay/boat-quay-rules/src/test/kotlin/com/backbase/oss/boat/quay/ruleset/NoVersionInUriRuleTest.kt @@ -18,7 +18,6 @@ class NoVersionInUriRuleTest { info: title: Thing API version: 1.0.0 - x-api-type: Unified Backbase API paths: /api/foo: get: @@ -61,7 +60,6 @@ class NoVersionInUriRuleTest { info: title: Thing API version: 1.0.0 - x-api-type: Unified Backbase API paths: /api/foo/v1true: get: From 4accb7d3213e4649850ed7e4960a922b556e1f05 Mon Sep 17 00:00:00 2001 From: michalkozak Date: Wed, 27 Nov 2024 14:01:25 +0100 Subject: [PATCH 3/3] feat(BEGUILD-249): rules for unified Backbase API specs --- README.md | 5 +++++ .../com/backbase/oss/boat/quay/ruleset/NoPrefixPathRule.kt | 2 +- .../com/backbase/oss/boat/quay/ruleset/NoVersionInUriRule.kt | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 238c02fa0..ea52fad1d 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,11 @@ It currently consists of # Release Notes BOAT is still under development and subject to change. +## 0.17.52 +* Added 2 Lint rules `B007U` and `B009U` for Unified Backbase API specs: + * `B007U` checks whether paths do not contain `client-api`, `service-api` and `integration-api` prefixes. Any prefix is not allowed for Unified Backbase API. + * `B009U` checks whether paths do not contain any version number. Any version number is not allowed for Unified Backbase API. +* These rules are ignored by default, but if you redefine the list of ignored rules in your project, then you need to add these two rules to your list. ## 0.17.46 * boat-scaffold * Enhanced ISO8601 Date Formatting with Fractional Seconds Support for Swift template. diff --git a/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/NoPrefixPathRule.kt b/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/NoPrefixPathRule.kt index e60f9aee8..f83a999c4 100644 --- a/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/NoPrefixPathRule.kt +++ b/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/NoPrefixPathRule.kt @@ -9,7 +9,7 @@ import kotlin.collections.orEmpty ruleSet = BoatRuleSet::class, id = "B007U", severity = Severity.MUST, - title = "Check no prefix for paths (the rule intended for Unified Backbase API specs)" + title = "Unified Backbase API specs do NOT expect any prefix in paths" ) class NoPrefixPathRule(config: Config) { diff --git a/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/NoVersionInUriRule.kt b/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/NoVersionInUriRule.kt index e27741c23..7b16196f5 100644 --- a/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/NoVersionInUriRule.kt +++ b/boat-quay/boat-quay-rules/src/main/kotlin/com/backbase/oss/boat/quay/ruleset/NoVersionInUriRule.kt @@ -8,7 +8,7 @@ import org.zalando.zally.rule.api.* ruleSet = BoatRuleSet::class, id = "B009U", severity = Severity.MUST, - title = "Check no prefix for paths should contain version (the rule intended for Unified Backbase API specs)" + title = "Unified Backbase API specs do NOT expect a version prefix in paths" ) class NoVersionInUriRule {