Skip to content

Commit

Permalink
SONARPY-2506 Move extension registration to PythonExtensions
Browse files Browse the repository at this point in the history
  • Loading branch information
ghislainpiot committed Jan 21, 2025
1 parent 4a42db6 commit af2f019
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 71 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
Expand All @@ -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)
Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

}

0 comments on commit af2f019

Please sign in to comment.