From 402b90899b2ec5b643c2b481d51534804b91919a Mon Sep 17 00:00:00 2001 From: Melsy Huamani Date: Wed, 27 May 2026 16:28:41 -0500 Subject: [PATCH 1/2] feat: add OpenAPI language support without YAML and JSON conflicts --- .../OpenAPICustomOpenApiRuleRepository.java | 26 +++++++++++++++++++ .../sonar/openapi/OpenAPICustomPlugin.java | 3 ++- .../OpenAPICustomProfileDefinition.java | 5 ++++ .../openapi/OpenAPICustomRulesDefinition.java | 2 ++ ...penAPICustomOpenApiRuleRepositoryTest.java | 26 +++++++++++++++++++ .../openapi/OpenAPICustomPluginTest.java | 5 ++-- .../OpenAPICustomProfileDefinitionTest.java | 7 +++++ .../OpenAPICustomRulesDefinitionTest.java | 5 ++++ 8 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 src/main/java/apiaddicts/sonar/openapi/OpenAPICustomOpenApiRuleRepository.java create mode 100644 src/test/java/apiaddicts/sonar/openapi/OpenAPICustomOpenApiRuleRepositoryTest.java diff --git a/src/main/java/apiaddicts/sonar/openapi/OpenAPICustomOpenApiRuleRepository.java b/src/main/java/apiaddicts/sonar/openapi/OpenAPICustomOpenApiRuleRepository.java new file mode 100644 index 00000000..8c27535a --- /dev/null +++ b/src/main/java/apiaddicts/sonar/openapi/OpenAPICustomOpenApiRuleRepository.java @@ -0,0 +1,26 @@ +package apiaddicts.sonar.openapi; + +import org.sonar.api.ExtensionPoint; +import org.sonar.api.scanner.ScannerSide; +import org.apiaddicts.apitools.dosonarapi.api.OpenApiCustomRuleRepository; +import apiaddicts.sonar.openapi.checks.RulesLists; +import org.sonarsource.api.sonarlint.SonarLintSide; + +import java.util.List; + +import static apiaddicts.sonar.openapi.OpenAPICustomRulesDefinition.OPENAPI_REPOSITORY_KEY; + +@SonarLintSide +@ScannerSide +@ExtensionPoint +public class OpenAPICustomOpenApiRuleRepository implements OpenApiCustomRuleRepository { + @Override + public String repositoryKey() { + return OPENAPI_REPOSITORY_KEY; + } + + @Override + public List> checkClasses() { + return RulesLists.getAllChecks(); + } +} diff --git a/src/main/java/apiaddicts/sonar/openapi/OpenAPICustomPlugin.java b/src/main/java/apiaddicts/sonar/openapi/OpenAPICustomPlugin.java index aaf6c302..15654b06 100644 --- a/src/main/java/apiaddicts/sonar/openapi/OpenAPICustomPlugin.java +++ b/src/main/java/apiaddicts/sonar/openapi/OpenAPICustomPlugin.java @@ -15,7 +15,8 @@ public void define(Context context) { OpenAPICustomRulesDefinition.class, // batch extensions -> objects are instantiated during code analysis OpenAPICustomRuleRepository.class, - OpenAPICustomJsonRuleRepository.class + OpenAPICustomJsonRuleRepository.class, + OpenAPICustomOpenApiRuleRepository.class ); } diff --git a/src/main/java/apiaddicts/sonar/openapi/OpenAPICustomProfileDefinition.java b/src/main/java/apiaddicts/sonar/openapi/OpenAPICustomProfileDefinition.java index 5ccaa621..9eb7d1f3 100644 --- a/src/main/java/apiaddicts/sonar/openapi/OpenAPICustomProfileDefinition.java +++ b/src/main/java/apiaddicts/sonar/openapi/OpenAPICustomProfileDefinition.java @@ -32,6 +32,11 @@ public void define(Context context) { addBaseRules(jsonProfile, CheckList.JSON_REPOSITORY_KEY); addRepositoryRules(jsonProfile, OpenAPICustomRulesDefinition.JSON_REPOSITORY_KEY, RulesLists.getAllChecks()); jsonProfile.done(); + + NewBuiltInQualityProfile openapiProfile = context.createBuiltInQualityProfile(OPENAPI_WAY, CheckList.OPENAPI_LANGUAGE); + addBaseRules(openapiProfile, CheckList.OPENAPI_REPOSITORY_KEY); + addRepositoryRules(openapiProfile, OpenAPICustomRulesDefinition.OPENAPI_REPOSITORY_KEY, RulesLists.getAllChecks()); + openapiProfile.done(); } private void addBaseRules(NewBuiltInQualityProfile profile, String repositoryKey) { diff --git a/src/main/java/apiaddicts/sonar/openapi/OpenAPICustomRulesDefinition.java b/src/main/java/apiaddicts/sonar/openapi/OpenAPICustomRulesDefinition.java index 47f64a74..a0dff556 100644 --- a/src/main/java/apiaddicts/sonar/openapi/OpenAPICustomRulesDefinition.java +++ b/src/main/java/apiaddicts/sonar/openapi/OpenAPICustomRulesDefinition.java @@ -17,6 +17,7 @@ public class OpenAPICustomRulesDefinition implements RulesDefinition { public static final String YAML_REPOSITORY_KEY = "openapi-custom-yaml"; public static final String JSON_REPOSITORY_KEY = "openapi-custom-json"; + public static final String OPENAPI_REPOSITORY_KEY = "openapi-custom"; private static final String REPOSITORY_NAME = "OpenAPI Custom"; private static final String ROOT_RESOURCE_FOLDER = "org/sonar/l10n/openapi/rules/openapi/"; private static final String SECURITY_GROUP = "security"; @@ -34,6 +35,7 @@ public void define(Context context) { I18nContext.initializeFromUserLanguage(); populateRepository(context, YAML_REPOSITORY_KEY, "yaml"); populateRepository(context, JSON_REPOSITORY_KEY, "json"); + populateRepository(context, OPENAPI_REPOSITORY_KEY, "openapi"); } private void populateRepository(Context context, String key, String language) { diff --git a/src/test/java/apiaddicts/sonar/openapi/OpenAPICustomOpenApiRuleRepositoryTest.java b/src/test/java/apiaddicts/sonar/openapi/OpenAPICustomOpenApiRuleRepositoryTest.java new file mode 100644 index 00000000..34d65499 --- /dev/null +++ b/src/test/java/apiaddicts/sonar/openapi/OpenAPICustomOpenApiRuleRepositoryTest.java @@ -0,0 +1,26 @@ +package apiaddicts.sonar.openapi; + +import static org.assertj.core.api.Assertions.assertThat; +import org.junit.Test; + +public class OpenAPICustomOpenApiRuleRepositoryTest { + + @Test + public void testRepositoryKey() { + OpenAPICustomOpenApiRuleRepository repository = new OpenAPICustomOpenApiRuleRepository(); + assertThat(repository.repositoryKey()).isEqualTo("openapi-custom"); + } + + @Test + public void testCheckClassesNotEmpty() { + OpenAPICustomOpenApiRuleRepository repository = new OpenAPICustomOpenApiRuleRepository(); + assertThat(repository.checkClasses()).isNotEmpty(); + } + + @Test + public void testCheckClassesSameAsAllChecks() { + OpenAPICustomOpenApiRuleRepository repository = new OpenAPICustomOpenApiRuleRepository(); + OpenAPICustomRuleRepository yamlRepo = new OpenAPICustomRuleRepository(); + assertThat(repository.checkClasses()).isEqualTo(yamlRepo.checkClasses()); + } +} diff --git a/src/test/java/apiaddicts/sonar/openapi/OpenAPICustomPluginTest.java b/src/test/java/apiaddicts/sonar/openapi/OpenAPICustomPluginTest.java index df1ff7a4..8225eac6 100644 --- a/src/test/java/apiaddicts/sonar/openapi/OpenAPICustomPluginTest.java +++ b/src/test/java/apiaddicts/sonar/openapi/OpenAPICustomPluginTest.java @@ -22,11 +22,12 @@ public void testDefine() { }; Plugin.Context context = new Plugin.Context(runtime); plugin.define(context); - assertThat(context.getExtensions()).hasSize(4); + assertThat(context.getExtensions()).hasSize(5); assertThat(context.getExtensions()).contains( OpenAPICustomProfileDefinition.class, OpenAPICustomRulesDefinition.class, OpenAPICustomRuleRepository.class, - OpenAPICustomJsonRuleRepository.class); + OpenAPICustomJsonRuleRepository.class, + OpenAPICustomOpenApiRuleRepository.class); } } diff --git a/src/test/java/apiaddicts/sonar/openapi/OpenAPICustomProfileDefinitionTest.java b/src/test/java/apiaddicts/sonar/openapi/OpenAPICustomProfileDefinitionTest.java index 907aee0a..3cf3b80c 100644 --- a/src/test/java/apiaddicts/sonar/openapi/OpenAPICustomProfileDefinitionTest.java +++ b/src/test/java/apiaddicts/sonar/openapi/OpenAPICustomProfileDefinitionTest.java @@ -32,5 +32,12 @@ public void testDefine() { assertThat(jsonProfile.name()).isEqualTo(OpenAPICustomProfileDefinition.OPENAPI_WAY); assertThat(jsonProfile.rules()).hasSize(expectedSize); assertThat(jsonProfile.rules().stream().noneMatch(r -> r.ruleKey().equals("OAR112"))).isTrue(); + + BuiltInQualityProfile openapiProfile = context.profile("openapi", OpenAPICustomProfileDefinition.OPENAPI_WAY); + assertThat(openapiProfile).isNotNull(); + assertThat(openapiProfile.language()).isEqualTo("openapi"); + assertThat(openapiProfile.name()).isEqualTo(OpenAPICustomProfileDefinition.OPENAPI_WAY); + assertThat(openapiProfile.rules()).hasSize(expectedSize); + assertThat(openapiProfile.rules().stream().noneMatch(r -> r.ruleKey().equals("OAR112"))).isTrue(); } } diff --git a/src/test/java/apiaddicts/sonar/openapi/OpenAPICustomRulesDefinitionTest.java b/src/test/java/apiaddicts/sonar/openapi/OpenAPICustomRulesDefinitionTest.java index 225b0e36..f8e2d86b 100644 --- a/src/test/java/apiaddicts/sonar/openapi/OpenAPICustomRulesDefinitionTest.java +++ b/src/test/java/apiaddicts/sonar/openapi/OpenAPICustomRulesDefinitionTest.java @@ -26,6 +26,11 @@ public void testRepository() { assertThat(jsonRepository.name()).isEqualTo("OpenAPI Custom"); assertThat(jsonRepository.language()).isEqualTo("json"); assertThat(jsonRepository.rules()).hasSize(RulesLists.getAllChecks().size()); + + Repository openapiRepository = context.repository(OpenAPICustomRulesDefinition.OPENAPI_REPOSITORY_KEY); + assertThat(openapiRepository.name()).isEqualTo("OpenAPI Custom"); + assertThat(openapiRepository.language()).isEqualTo("openapi"); + assertThat(openapiRepository.rules()).hasSize(RulesLists.getAllChecks().size()); } @Test From 0bce485830c8f51ddb592caafbb1b78662a44ce3 Mon Sep 17 00:00:00 2001 From: Melsy Huamani Date: Thu, 28 May 2026 08:36:44 -0500 Subject: [PATCH 2/2] update changelog and version --- CHANGELOG.md | 7 +++++++ pom.xml | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b555d655..c355422a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [1.4.1-beta-2] - 2026-05-28 + +### Added + +- Add OpenAPI language support without YAML and JSON conflicts. + ## [1.4.1-beta-1] - 2026-05-26 ### Changed diff --git a/pom.xml b/pom.xml index 3e3aab47..9de5e121 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.apiaddicts.apitools.dosonarapi sonaropenapi-rules-community - 1.4.1-beta-1 + 1.4.1-beta-2 sonar-plugin SonarQube OpenAPI Community Rules