diff --git a/CHANGELOG b/CHANGELOG index 9723700..9e443ec 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -6,6 +6,13 @@ CHANGELOG * +4.0.1 +----- + +* Add sourceDirectories to avoid scanning generated sources +* Upgrade lombok to 1.16.20 +* Upgrade kemitix-maven-tiles to 0.3.0 + 4.0.0 ----- diff --git a/README.md b/README.md index 6e420fa..99c48f1 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ The simplest way to use the ruleset is with the maven-tile: true - net.kemitix.checkstyle:tile:4.0.0 + net.kemitix.checkstyle:tile:4.0.1 diff --git a/builder/pom.xml b/builder/pom.xml index a18c11a..5e4ee5d 100644 --- a/builder/pom.xml +++ b/builder/pom.xml @@ -20,11 +20,11 @@ true 1.8 2.10 - 0.2.0 + 0.3.0 8.6 1.26.0 - 1.16.18 + 1.16.20 Brussels-SR6 1.5.9.RELEASE 2.3.5 @@ -36,6 +36,7 @@ ${project.version} 5-complexity net/kemitix/checkstyle-${kemitix.checkstyle.ruleset.level}.xml + 1.2 @@ -55,6 +56,7 @@ org.projectlombok lombok ${lombok.version} + provided org.mockito @@ -76,6 +78,11 @@ + + javax.annotation + javax.annotation-api + ${javax.annotation-api.version} + org.springframework.boot spring-boot-starter-log4j2 diff --git a/builder/src/main/java/net/kemitix/checkstyle/ruleset/builder/BuilderConfiguration.java b/builder/src/main/java/net/kemitix/checkstyle/ruleset/builder/BuilderConfiguration.java index 197c38c..626c729 100644 --- a/builder/src/main/java/net/kemitix/checkstyle/ruleset/builder/BuilderConfiguration.java +++ b/builder/src/main/java/net/kemitix/checkstyle/ruleset/builder/BuilderConfiguration.java @@ -26,6 +26,12 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.io.IOException; +import java.util.AbstractMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Configuration for Builder. @@ -46,4 +52,35 @@ public class BuilderConfiguration { public ClassPath classPath() throws IOException { return ClassPath.from(getClass().getClassLoader()); } + + /** + * A Map of rules for each RuleSource. + * + * @param packageScanner the PackageScanner + * + * @return a Map with a list of check classes for each rule source + */ + @Bean + public Map> checkClasses(final PackageScanner packageScanner) { + return Stream.of(RuleSource.values()) + .map(toRuleSourceEntry(packageScanner)) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } + + private static Function>> toRuleSourceEntry( + final PackageScanner packageScanner + ) { + return source -> new AbstractMap.SimpleEntry<>( + source, + classesInSource(source, packageScanner) + ); + } + + private static List classesInSource( + final RuleSource source, + final PackageScanner packageScanner + ) { + return packageScanner.apply(source) + .collect(Collectors.toList()); + } } diff --git a/builder/src/main/java/net/kemitix/checkstyle/ruleset/builder/DefaultRuleClassLocator.java b/builder/src/main/java/net/kemitix/checkstyle/ruleset/builder/DefaultRuleClassLocator.java index 0df04a6..873de34 100644 --- a/builder/src/main/java/net/kemitix/checkstyle/ruleset/builder/DefaultRuleClassLocator.java +++ b/builder/src/main/java/net/kemitix/checkstyle/ruleset/builder/DefaultRuleClassLocator.java @@ -24,13 +24,9 @@ package net.kemitix.checkstyle.ruleset.builder; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import javax.annotation.PostConstruct; -import java.util.AbstractMap; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.stream.Collectors; -import java.util.stream.Stream; /** * Default implementation of {@link RuleClassLocator}. @@ -41,38 +37,30 @@ import java.util.stream.Stream; @RequiredArgsConstructor public class DefaultRuleClassLocator implements RuleClassLocator { - private final PackageScanner packageScanner; - - private Map> checkClasses; - - /** - * Initialise class lists for {@link RuleSource}s. - */ - @PostConstruct - public final void init() { - checkClasses = Stream.of(RuleSource.values()) - .map(source -> new AbstractMap.SimpleEntry<>( - source, packageScanner.apply(source) - .collect(Collectors.toList()))) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - } + private final Map> checkClasses; @Override public final String apply(final Rule rule) { return getCanonicalClassName(rule.getSource(), rule.getName()); } - private String getCanonicalClassName(final RuleSource source, final String name) { + private String getCanonicalClassName( + final RuleSource source, + final String name + ) { Objects.requireNonNull(checkClasses, "init() method not called"); return checkClasses.get(source) - .stream() - .sorted() - .filter(classname -> byRuleName(classname, name)) - .findFirst() - .orElseThrow(() -> new CheckstyleClassNotFoundException(name)); + .stream() + .sorted() + .filter(classname -> byRuleName(classname, name)) + .findFirst() + .orElseThrow(() -> new CheckstyleClassNotFoundException(name)); } - private boolean byRuleName(final String classname, final String name) { + private boolean byRuleName( + final String classname, + final String name + ) { final String classNameWithDelimiter = "." + name; return classname.endsWith(classNameWithDelimiter) || classname.endsWith(classNameWithDelimiter + "Check"); } diff --git a/builder/src/main/resources/README-template.md b/builder/src/main/resources/README-template.md index 98c3585..5aabff6 100644 --- a/builder/src/main/resources/README-template.md +++ b/builder/src/main/resources/README-template.md @@ -31,7 +31,7 @@ The simplest way to use the ruleset is with the maven-tile: true - net.kemitix.checkstyle:tile:4.0.0 + net.kemitix.checkstyle:tile:4.0.1 diff --git a/builder/src/test/java/net/kemitix/checkstyle/ruleset/builder/BuilderConfigurationTest.java b/builder/src/test/java/net/kemitix/checkstyle/ruleset/builder/BuilderConfigurationTest.java index 294cb87..9279196 100644 --- a/builder/src/test/java/net/kemitix/checkstyle/ruleset/builder/BuilderConfigurationTest.java +++ b/builder/src/test/java/net/kemitix/checkstyle/ruleset/builder/BuilderConfigurationTest.java @@ -4,8 +4,14 @@ import com.google.common.reflect.ClassPath; import org.junit.Test; import java.io.IOException; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.mock; /** * Tests for {@link BuilderConfiguration}. @@ -21,4 +27,21 @@ public class BuilderConfigurationTest { //then assertThat(classPath).isNotNull(); } + + @Test + public void canGetCheckClasses() { + //given + final PackageScanner packageScanner = mock(PackageScanner.class); + final String checkstyleClass = "checkstyle class"; + given(packageScanner.apply(RuleSource.CHECKSTYLE)).willReturn(Stream.of(checkstyleClass)); + final String sevntuClass = "sevntu class"; + given(packageScanner.apply(RuleSource.SEVNTU)).willReturn(Stream.of(sevntuClass)); + //when + final Map> checkClasses = new BuilderConfiguration().checkClasses(packageScanner); + //then + assertThat(checkClasses).containsOnlyKeys(RuleSource.values()); + assertThat(checkClasses) + .containsEntry(RuleSource.CHECKSTYLE, Collections.singletonList(checkstyleClass)) + .containsEntry(RuleSource.SEVNTU, Collections.singletonList(sevntuClass)); + } } diff --git a/builder/src/test/java/net/kemitix/checkstyle/ruleset/builder/DefaultPackageScannerTest.java b/builder/src/test/java/net/kemitix/checkstyle/ruleset/builder/DefaultPackageScannerTest.java index e0540f2..240d12c 100644 --- a/builder/src/test/java/net/kemitix/checkstyle/ruleset/builder/DefaultPackageScannerTest.java +++ b/builder/src/test/java/net/kemitix/checkstyle/ruleset/builder/DefaultPackageScannerTest.java @@ -16,7 +16,7 @@ import static org.assertj.core.api.Assertions.assertThat; */ public class DefaultPackageScannerTest { - private DefaultPackageScanner scanner; + private PackageScanner scanner; @Before public void setUp() throws Exception { diff --git a/builder/src/test/java/net/kemitix/checkstyle/ruleset/builder/DefaultRuleClassLocatorTest.java b/builder/src/test/java/net/kemitix/checkstyle/ruleset/builder/DefaultRuleClassLocatorTest.java index a342ae6..3e9dd11 100644 --- a/builder/src/test/java/net/kemitix/checkstyle/ruleset/builder/DefaultRuleClassLocatorTest.java +++ b/builder/src/test/java/net/kemitix/checkstyle/ruleset/builder/DefaultRuleClassLocatorTest.java @@ -1,16 +1,14 @@ package net.kemitix.checkstyle.ruleset.builder; -import org.junit.Before; import org.junit.Test; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatNullPointerException; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.mock; /** * Tests for {@link DefaultRuleClassLocator}. @@ -19,14 +17,9 @@ import static org.mockito.Mockito.mock; */ public class DefaultRuleClassLocatorTest { - private DefaultRuleClassLocator subject; + private final Map> checkClasses = new HashMap<>(); - private PackageScanner packageScanner = mock(PackageScanner.class); - - @Before - public void setUp() { - subject = new DefaultRuleClassLocator(packageScanner); - } + private final DefaultRuleClassLocator subject = new DefaultRuleClassLocator(checkClasses); @Test public void canLookupRuleWithClassNameEndingInCheck() { @@ -35,9 +28,8 @@ public class DefaultRuleClassLocatorTest { final String expected = "com.puppycrawl.tools.checkstyle.checks.regexp.RegexpOnFilenameCheck"; final List checkstyleClasses = Collections.singletonList(expected); final List sevntuClasses = Collections.emptyList(); - given(packageScanner.apply(RuleSource.CHECKSTYLE)).willReturn(checkstyleClasses.stream()); - given(packageScanner.apply(RuleSource.SEVNTU)).willReturn(sevntuClasses.stream()); - subject.init(); + checkClasses.put(RuleSource.CHECKSTYLE, checkstyleClasses); + checkClasses.put(RuleSource.SEVNTU, sevntuClasses); final Rule rule = createCheckstyleRule(rulename); //when final String result = subject.apply(rule); @@ -52,9 +44,8 @@ public class DefaultRuleClassLocatorTest { final String expected = "com.puppycrawl.tools.checkstyle.checks.regexp.RegexpOnFilename"; final List checkstyleClasses = Collections.singletonList(expected); final List sevntuClasses = Collections.emptyList(); - given(packageScanner.apply(RuleSource.CHECKSTYLE)).willReturn(checkstyleClasses.stream()); - given(packageScanner.apply(RuleSource.SEVNTU)).willReturn(sevntuClasses.stream()); - subject.init(); + checkClasses.put(RuleSource.CHECKSTYLE, checkstyleClasses); + checkClasses.put(RuleSource.SEVNTU, sevntuClasses); final Rule rule = createCheckstyleRule(rulename); //when final String result = subject.apply(rule); @@ -69,9 +60,8 @@ public class DefaultRuleClassLocatorTest { final String expected = "com.puppycrawl.tools.checkstyle.checks.regexp.RegexpOnFilenameNoMatch"; final List checkstyleClasses = Collections.singletonList(expected); final List sevntuClasses = Collections.emptyList(); - given(packageScanner.apply(RuleSource.CHECKSTYLE)).willReturn(checkstyleClasses.stream()); - given(packageScanner.apply(RuleSource.SEVNTU)).willReturn(sevntuClasses.stream()); - subject.init(); + checkClasses.put(RuleSource.CHECKSTYLE, checkstyleClasses); + checkClasses.put(RuleSource.SEVNTU, sevntuClasses); final Rule rule = createCheckstyleRule(rulename); //then assertThatThrownBy(() -> subject.apply(rule)) @@ -79,13 +69,6 @@ public class DefaultRuleClassLocatorTest { .hasMessage("No class found to implement RegexpOnFilename"); } - @Test - public void throwsNullPointerExceptionWhenInitNotCalled() { - assertThatNullPointerException() - .isThrownBy(() -> subject.apply(new Rule())) - .withMessage("init() method not called"); - } - private Rule createCheckstyleRule(final String rulename) { final Rule rule = new Rule(); rule.setSource(RuleSource.CHECKSTYLE); diff --git a/set-version.sh b/set-version.sh new file mode 100644 index 0000000..717be2e --- /dev/null +++ b/set-version.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +if test $# != 2 +then + echo "current and next version missing" + exit +fi + +CURRENT=$1 +NEXT=$2 + +echo Updating version from $CURRENT to $NEXT + +./mvnw versions:set -DnewVersion=$NEXT +perl -p -i -e "s,$CURRENT3.0.0 8.6 1.26.0 - 4.0.0 + 4.0.1 5-complexity net/kemitix/checkstyle-${kemitix.checkstyle.ruleset.level}.xml @@ -32,6 +32,9 @@ ${kemitix.checkstyle.ruleset.location} + + ${build.sourceDirectory} +