From af2f019c9b3bf87d110ee1ff7ba2ca104009635c Mon Sep 17 00:00:00 2001 From: Ghislain Piot Date: Tue, 21 Jan 2025 11:24:32 +0100 Subject: [PATCH] SONARPY-2506 Move extension registration to PythonExtensions --- .../plugins/python/PythonExtensions.java | 82 +++++++++++++++++++ .../plugins/python/PythonExtensionsTest.java | 4 +- .../sonar/plugins/python/PythonPlugin.java | 70 +--------------- 3 files changed, 85 insertions(+), 71 deletions(-) rename sonar-python-plugin/src/test/java/org/sonar/plugins/python/PythonPluginTest.java => python-commons/src/test/java/org/sonar/plugins/python/PythonExtensionsTest.java (97%) diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonExtensions.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonExtensions.java index dfb90829e6..b81e376251 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonExtensions.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonExtensions.java @@ -20,6 +20,8 @@ import org.slf4j.LoggerFactory; import org.sonar.api.Plugin; import org.sonar.api.PropertyType; +import org.sonar.api.SonarProduct; +import org.sonar.api.SonarRuntime; import org.sonar.api.config.PropertyDefinition; import org.sonar.api.resources.Qualifiers; import org.sonar.plugins.python.api.SonarLintCache; @@ -35,8 +37,11 @@ import org.sonar.plugins.python.pylint.PylintSensor; import org.sonar.plugins.python.ruff.RuffRulesDefinition; import org.sonar.plugins.python.ruff.RuffSensor; +import org.sonar.plugins.python.warnings.AnalysisWarningsWrapper; import org.sonar.plugins.python.xunit.PythonXUnitSensor; +import static org.sonar.plugins.python.api.PythonVersionUtils.PYTHON_VERSION_KEY; + public class PythonExtensions { private static final Logger LOG = LoggerFactory.getLogger(PythonExtensions.class); @@ -50,6 +55,10 @@ public class PythonExtensions { private static final String EXTERNAL_ANALYZERS_CATEGORY = "External Analyzers"; private static final String DEPRECATED_PREFIX = "DEPRECATED : Use " + PythonCoverageSensor.REPORT_PATHS_KEY + " instead. "; + private PythonExtensions() { + // Utility class + } + static void addCoberturaExtensions(Plugin.Context context) { context.addExtensions( PropertyDefinition.builder(PythonCoverageSensor.REPORT_PATHS_KEY) @@ -168,6 +177,79 @@ static void addRuffExtensions(Plugin.Context context) { RuffRulesDefinition.class); } + static PropertyDefinition buildPythonVersion() { + return PropertyDefinition.builder(PYTHON_VERSION_KEY) + .index(12) + .name("Python versions") + .description("Comma-separated list of Python versions this project is compatible with.") + .multiValues(true) + .category(PYTHON_CATEGORY) + .subCategory(GENERAL) + .onQualifiers(Qualifiers.PROJECT) + .build(); + } + + static PropertyDefinition buildIpynbPythonSuffix() { + return PropertyDefinition.builder(IPYNB_FILE_SUFFIXES_KEY) + .index(11) + .name("IPython File Suffixes") + .description("List of suffixes of IPython Notebooks files to analyze.") + .multiValues(true) + .category(PYTHON_CATEGORY) + .subCategory(GENERAL) + .onQualifiers(Qualifiers.PROJECT) + .defaultValue("ipynb") + .build(); + } + + static PropertyDefinition buildPythonSuffix() { + return PropertyDefinition.builder(PYTHON_FILE_SUFFIXES_KEY) + .index(10) + .name("File Suffixes") + .description("List of suffixes of Python files to analyze.") + .multiValues(true) + .category(PYTHON_CATEGORY) + .subCategory(GENERAL) + .onQualifiers(Qualifiers.PROJECT) + .defaultValue("py") + .build(); + } + + static void addCommonExtensions(Plugin.Context context) { + context.addExtensions( + buildPythonSuffix(), + buildIpynbPythonSuffix(), + buildPythonVersion(), + + Python.class, + PythonProfile.class, + + PythonSensor.class, + PythonRuleRepository.class, + AnalysisWarningsWrapper.class, + + IPynb.class, + IPynbProfile.class, + IPynbSensor.class, + IPynbRuleRepository.class); + + SonarRuntime sonarRuntime = context.getRuntime(); + if (sonarRuntime.getProduct() != SonarProduct.SONARLINT) { + addCoberturaExtensions(context); + addXUnitExtensions(context); + addPylintExtensions(context); + addBanditExtensions(context); + addFlake8Extensions(context); + addMypyExtensions(context); + addRuffExtensions(context); + } + + if (sonarRuntime.getProduct() == SonarProduct.SONARLINT) { + SonarLintPluginAPIManager sonarLintPluginAPIManager = new SonarLintPluginAPIManager(); + sonarLintPluginAPIManager.addSonarlintPythonIndexer(context, new SonarLintPluginAPIVersion()); + } + } + static class SonarLintPluginAPIManager { public void addSonarlintPythonIndexer(Plugin.Context context, SonarLintPluginAPIVersion sonarLintPluginAPIVersion) { diff --git a/sonar-python-plugin/src/test/java/org/sonar/plugins/python/PythonPluginTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonExtensionsTest.java similarity index 97% rename from sonar-python-plugin/src/test/java/org/sonar/plugins/python/PythonPluginTest.java rename to python-commons/src/test/java/org/sonar/plugins/python/PythonExtensionsTest.java index 80e91bef38..fd44617102 100644 --- a/sonar-python-plugin/src/test/java/org/sonar/plugins/python/PythonPluginTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonExtensionsTest.java @@ -34,7 +34,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -class PythonPluginTest { +class PythonExtensionsTest { @RegisterExtension public LogTesterJUnit5 logTester = new LogTesterJUnit5().setLevel(Level.DEBUG); @@ -62,7 +62,7 @@ void classNotAvailable() { private static List extensions(SonarRuntime runtime) { Plugin.Context context = new Plugin.Context(runtime); - new PythonPlugin().define(context); + PythonExtensions.addCommonExtensions(context); return context.getExtensions(); } diff --git a/sonar-python-plugin/src/main/java/org/sonar/plugins/python/PythonPlugin.java b/sonar-python-plugin/src/main/java/org/sonar/plugins/python/PythonPlugin.java index fc94643f1c..22ceae69f7 100644 --- a/sonar-python-plugin/src/main/java/org/sonar/plugins/python/PythonPlugin.java +++ b/sonar-python-plugin/src/main/java/org/sonar/plugins/python/PythonPlugin.java @@ -17,81 +17,13 @@ package org.sonar.plugins.python; import org.sonar.api.Plugin; -import org.sonar.api.SonarProduct; -import org.sonar.api.SonarRuntime; -import org.sonar.api.config.PropertyDefinition; -import org.sonar.api.resources.Qualifiers; -import org.sonar.plugins.python.warnings.AnalysisWarningsWrapper; - -import static org.sonar.plugins.python.api.PythonVersionUtils.PYTHON_VERSION_KEY; public class PythonPlugin implements Plugin { @Override public void define(Context context) { - - context.addExtensions( - PropertyDefinition.builder(PythonExtensions.PYTHON_FILE_SUFFIXES_KEY) - .index(10) - .name("File Suffixes") - .description("List of suffixes of Python files to analyze.") - .multiValues(true) - .category(PythonExtensions.PYTHON_CATEGORY) - .subCategory(PythonExtensions.GENERAL) - .onQualifiers(Qualifiers.PROJECT) - .defaultValue("py") - .build(), - - PropertyDefinition.builder(PythonExtensions.IPYNB_FILE_SUFFIXES_KEY) - .index(11) - .name("IPython File Suffixes") - .description("List of suffixes of IPython Notebooks files to analyze.") - .multiValues(true) - .category(PythonExtensions.PYTHON_CATEGORY) - .subCategory(PythonExtensions.GENERAL) - .onQualifiers(Qualifiers.PROJECT) - .defaultValue("ipynb") - .build(), - - PropertyDefinition.builder(PYTHON_VERSION_KEY) - .index(12) - .name("Python versions") - .description("Comma-separated list of Python versions this project is compatible with.") - .multiValues(true) - .category(PythonExtensions.PYTHON_CATEGORY) - .subCategory(PythonExtensions.GENERAL) - .onQualifiers(Qualifiers.PROJECT) - .build(), - - Python.class, - - PythonProfile.class, - - PythonSensor.class, - PythonRuleRepository.class, - AnalysisWarningsWrapper.class, - - IPynb.class, - IPynbProfile.class, - IPynbSensor.class, - IPynbRuleRepository.class); - - SonarRuntime sonarRuntime = context.getRuntime(); - if (sonarRuntime.getProduct() != SonarProduct.SONARLINT) { - PythonExtensions.addCoberturaExtensions(context); - PythonExtensions.addXUnitExtensions(context); - PythonExtensions.addPylintExtensions(context); - PythonExtensions.addBanditExtensions(context); - PythonExtensions.addFlake8Extensions(context); - PythonExtensions.addMypyExtensions(context); - PythonExtensions.addRuffExtensions(context); - } - - if (sonarRuntime.getProduct() == SonarProduct.SONARLINT) { - PythonExtensions.SonarLintPluginAPIManager sonarLintPluginAPIManager = new PythonExtensions.SonarLintPluginAPIManager(); - sonarLintPluginAPIManager.addSonarlintPythonIndexer(context, new PythonExtensions.SonarLintPluginAPIVersion()); - } + PythonExtensions.addCommonExtensions(context); } }