Disable sevntu (#284)

* Add details from 5.3.6

* Add dependencies for 5.4.0 so-far

* Update CI to use install target

Using package was missing some lifecycle steps.

* Rollback checkstyle to 8.20 - to fix build

* Convert RuleSource from enum to configuration file

* Split out sevntu plugin version - has own lifecycle

* Upgrade sevntu from 1.35.0 to 1.37.1

* Tweak to use java version where ide can see it

* Upgrade checkstyle back to 8.29 and disable sevntu rules

The sevntu rules are incompatible with checkstyle 8.21+
This commit is contained in:
Paul Campbell 2020-03-18 12:32:30 +00:00 committed by GitHub
parent d475fecb88
commit a1e6202d97
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
36 changed files with 938 additions and 468 deletions

View file

@ -24,4 +24,4 @@ jobs:
with: with:
java-version: ${{ matrix.java }} java-version: ${{ matrix.java }}
- name: Build with Maven - name: Build with Maven
run: mvn -B package --file pom.xml run: mvn -B install

View file

@ -14,7 +14,7 @@ jobs:
with: with:
java-version: 1.8 java-version: 1.8
- name: Build with Maven - name: Build with Maven
run: mvn -B package run: mvn -B install
- name: Nexus Repo Publish - name: Nexus Repo Publish
run: sh .github/deploy.sh run: sh .github/deploy.sh
env: env:

View file

@ -5,6 +5,79 @@ 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/), 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). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
* [5.4.0] - 2020-03-17
** Changed
- Replace Jenkins with Github Actions for CI (#282)
** Dependencies
* Bump checkstyle from 8.20 to 8.29 (#268)
* Bump tiles-maven-plugin from 2.15 to 2.16 (#256)
* Bump maven-checkstyle-plugin from 3.1.0 to 3.1.1 (#274)
* Bump kemitix-parent from 5.2.0 to 5.3.0 (#281)
* Bump classgraph from 4.8.48 to 4.8.65 (#276)
* Bump assertj-core from 3.13.2 to 3.15.0 (#269)
* Bump mockito-core from 3.1.0 to 3.3.3 (#280)
* fix: builder/pom.xml to reduce vulnerabilities (#234)
* Bump classgraph from 4.8.47 to 4.8.48 (#242)
* Bump spring-boot.version from 2.1.8.RELEASE to 2.1.9.RELEASE (#241)
* Bump mockito-core from 3.0.0 to 3.1.0 (#240)
* Bump spring-boot.version from 2.1.7.RELEASE to 2.1.8.RELEASE (#236)
* Bump lombok from 1.18.8 to 1.18.10 (#238)
* Bump mapstream from 3.1.17 to 3.1.18 (#237)
* Bump mapstream from 3.1.16 to 3.1.17 (#229)
* Bump classgraph from 4.8.43 to 4.8.47 (#233)
* Bump spring-boot.version from 2.1.6.RELEASE to 2.1.7.RELEASE (#228)
* Bump assertj-core from 3.12.2 to 3.13.2 (#227)
* Bump sevntu.version from 1.34.1 to 1.35.0 (#223)
* Bump mockito-core from 2.27.0 to 3.0.0 (#222)
* Bump classgraph from 4.8.41 to 4.8.43 (#221)
* Bump sevntu.version from 1.34.0 to 1.34.1 (#218)
* Bump tiles-maven-plugin from 2.14 to 2.15 (#217)
* Bump sevntu.version from 1.33.0 to 1.34.0 (#216)
* Bump spring-boot.version from 2.1.5.RELEASE to 2.1.6.RELEASE (#215)
* Bump classgraph from 4.8.38 to 4.8.41 (#214)
* Bump classgraph from 4.8.37 to 4.8.38 (#212)
* Bump maven-checkstyle-plugin from 3.0.0 to 3.1.0 (#208)
* Bump classgraph from 4.8.36 to 4.8.37 (#209)
* Bump lombok from 1.18.6 to 1.18.8 (#201)
* Bump classgraph from 4.8.35 to 4.8.36 (#207)
* Bump spring-boot.version from 2.1.4.RELEASE to 2.1.5.RELEASE (#206)
* Bump classgraph from 4.8.34 to 4.8.35 (#205)
* Bump classgraph from 4.8.31 to 4.8.34 (#204)
* Bump classgraph from 4.8.30 to 4.8.31 (#203)
* Bump classgraph from 4.8.29 to 4.8.30 (#202)
* Bump classgraph from 4.8.26 to 4.8.29 (#199)
* Bump checkstyle from 8.19 to 8.20 (#196)
* Bump tiles-maven-plugin from 2.13 to 2.14 (#200)
* Bump classgraph from 4.8.25 to 4.8.26 (#195)
* Bump classgraph from 4.8.24 to 4.8.25 (#194)
* Bump mockito-core from 2.26.0 to 2.27.0 (#193)
* Bump spring-boot.version from 2.1.3.RELEASE to 2.1.4.RELEASE (#192)
* Bump mapstream from 3.1.15 to 3.1.16 (#191)
* Bump classgraph from 4.8.22 to 4.8.24 (#190)
* Bump mockito-core from 2.25.1 to 2.26.0 (#189)
* [5.3.6] - 2019-04-05
** Dependencies
- Bump checkstyle from 8.18 to 8.19 (#188)
- Bump classgraph from 4.8.21 to 4.8.22 (#187)
- Bump sevntu.version from 1.32.0 to 1.33.0 (#186)
- Bump mapstream from 3.1.13 to 3.1.15 (#185)
- Bump classgraph from 4.8.17 to 4.8.21 (#184)
- Bump classgraph from 4.8.16 to 4.8.17 (#183)
- Bump classgraph from 4.8.15 to 4.8.16 (#182)
- Bump classgraph from 4.8.14 to 4.8.15 (#181)
- Bump mockito-core from 2.25.0 to 2.25.1 (#180)
- Bump assertj-core from 3.12.1 to 3.12.2 (#179)
- Bump mapstream from 3.1.12 to 3.1.13 (#178)
- Bump classgraph from 4.8.12 to 4.8.14 (#177)
- Bump mockito-core from 2.24.5 to 2.25.0 (#176)
* [5.3.5] - 2019-03-04 * [5.3.5] - 2019-03-04
** Removed ** Removed

293
README.md
View file

@ -2072,6 +2072,119 @@ Checks that tokens are surrounded by whitespace.
### Sevntu ### Sevntu
## Disabled Checks
These checks are not enabled. Notes are included for each explaining why.
### Checkstyle
#### [AbstractClassName](http://checkstyle.sourceforge.net/config_naming.html#AbstractClassName)
Prevents some more meaningful abstract class names
#### [ArrayTrailingComma](http://checkstyle.sourceforge.net/config_coding.html#ArrayTrailingComma)
Couldn't get my IDE's (IntelliJ) code style to match.
#### [AvoidStarImport](http://checkstyle.sourceforge.net/config_imports.html#AvoidStarImport)
Ref: Clean Code, Robert C. Martin, J1: Avoid Long Import Lists by Using Wildcards
#### [AvoidStaticImport](http://checkstyle.sourceforge.net/config_imports.html#AvoidStaticImport)
Ref: Clean Code, Robert C. Martin, J2: Don't Inherit Constants
Recommends using a static import to access constants from another class over inheriting them.
#### [EmptyLineSeparator](http://checkstyle.sourceforge.net/config_whitespace.html#EmptyLineSeparator)
#### [FinalLocalVariable](http://checkstyle.sourceforge.net/config_coding.html#FinalLocalVariable)
Doesn't recognise Lombok's `val` as being `final`.
#### [Header](http://checkstyle.sourceforge.net/config_header.html#Header)
Shouldn't need to list in every file, simply listing in project root should be enough.
#### [IllegalInstantiation](http://checkstyle.sourceforge.net/config_coding.html#IllegalInstantiation)
Not really suitable for a template ruleset as it requires an explicit list of classes to apply to.
#### [IllegalTokenText](http://checkstyle.sourceforge.net/config_coding.html#IllegalTokenText)
Generic rule; doesn't embody a 'quality' check.
#### [ImportControl](http://checkstyle.sourceforge.net/config_imports.html#ImportControl)
Generic rule; doesn't embody a 'quality' check.
#### [ImportOrder](http://checkstyle.sourceforge.net/config_imports.html#ImportOrder)
Generic rule; doesn't embody a 'quality' check.
#### [Indentation](http://checkstyle.sourceforge.net/config_misc.html#Indentation)
Couldn't get my IDE's (IntelliJ) code style to match.
#### [JavadocMethod](http://checkstyle.sourceforge.net/config_javadoc.html#JavadocMethod)
Only exceptional cases should need to be documented.
#### [JavadocTagContinuationIndentation](http://checkstyle.sourceforge.net/config_javadoc.html#JavadocTagContinuationIndentation)
Couldn't get my IDE's (IntelliJ) code style to match.
#### [JavadocVariable](http://checkstyle.sourceforge.net/config_javadoc.html#JavadocVariable)
Member variables should usually be named such that it is clear what they are. Comments for clarification should be the exception.
#### [MissingCtor](http://checkstyle.sourceforge.net/config_coding.html#MissingCtor)
Would not see constructors created using Lombok's `@NoArgsConstructor`.
#### [MissingOverride](http://checkstyle.sourceforge.net/config_annotation.html#MissingOverride)
The javadoc compiler automatically inherits the javadoc from the overridden method, it doesn't need to be told to do so.
#### [OuterTypeNumber](http://checkstyle.sourceforge.net/config_sizes.html#OuterTypeNumber)
Already covered by the [OneTopLevelClass](#onetoplevelclass) check.
#### [ParameterAssignment](http://checkstyle.sourceforge.net/config_coding.html#ParameterAssignment)
[FinalParameters](#finalparameters) already protects against assigning values to parameters.
#### [RedundantImport](http://checkstyle.sourceforge.net/config_imports.html#RedundantImport)
[UnusedImports](#unusedimports) performs all the same checks and more.
#### [RedundantModifier](http://checkstyle.sourceforge.net/config_modifier.html#RedundantModifier)
conflicts with InterfaceMemberImpliedModifier which is now prefered given changes to interfaces in Java 9
#### [Regexp](http://checkstyle.sourceforge.net/config_regexp.html#Regexp)
Generic rule; doesn't embody a 'quality' check.
#### [RegexpHeader](http://checkstyle.sourceforge.net/config_header.html#RegexpHeader)
Generic rule; doesn't embody a 'quality' check.
#### [RegexpMultiline](http://checkstyle.sourceforge.net/config_regexp.html#RegexpMultiline)
Generic rule; doesn't embody a 'quality' check.
#### [RegexpOnFilename](http://checkstyle.sourceforge.net/config_regexp.html#RegexpOnFilename)
Generic rule; doesn't embody a 'quality' check.
#### [RegexpSingleline](http://checkstyle.sourceforge.net/config_regexp.html#RegexpSingleline)
Generic rule; doesn't embody a 'quality' check.
#### [RegexpSinglelineJava](http://checkstyle.sourceforge.net/config_regexp.html#RegexpSinglelineJava)
Generic rule; doesn't embody a 'quality' check.
#### [SingleLineJavadoc](http://checkstyle.sourceforge.net/config_javadoc.html#SingleLineJavadoc)
I don't use single line javadoc blocks.
#### [SummaryJavadoc](http://checkstyle.sourceforge.net/config_javadoc.html#SummaryJavadoc)
Generic rule; doesn't embody a 'quality' check.
#### [SuperClone](http://checkstyle.sourceforge.net/config_coding.html#SuperClone)
Overridding the `clone()` method is not allowed by the [NoClone](#noclone) check.
#### [SuperFinalize](http://checkstyle.sourceforge.net/config_coding.html#SuperFinalize)
[NoFinalizer](#nofinalizer) prevents use of `finalize()`.
#### [WriteTag](http://checkstyle.sourceforge.net/config_javadoc.html#WriteTag)
Generic rule; doesn't embody a 'quality' check.
### Sevntu
As the sevntu check are considered experimental not all those that are not enabled are listed here. Only where they are disabled due to a conflict with my 'style' or there is another irreconcilable difference that prevents them from being enabled, will they be documented to prevent repeated investigations.
#### [AvoidConditionInversion](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/design/AvoidConditionInversionCheck.html)
Should already be covered by [SimplifyBooleanExpression](simplifybooleanexpression).
#### [AvoidConstantAsFirstOperandInCondition](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/AvoidConstantAsFirstOperandInConditionCheck.html) #### [AvoidConstantAsFirstOperandInCondition](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/AvoidConstantAsFirstOperandInConditionCheck.html)
Checks that condition expressions don't become less readable by attempting to use a constant on the left-hand-side of a comparison. Checks that condition expressions don't become less readable by attempting to use a constant on the left-hand-side of a comparison.
@ -2109,6 +2222,9 @@ try {
throw new MyOtherException(); throw new MyOtherException();
} }
```` ````
#### [AvoidModifiersForTypes](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/AvoidModifiersForTypesCheck.html)
Generic rule; doesn't embody a 'quality' check.
#### [AvoidNotShortCircuitOperatorsForBoolean](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/AvoidNotShortCircuitOperatorsForBooleanCheck.html) #### [AvoidNotShortCircuitOperatorsForBoolean](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/AvoidNotShortCircuitOperatorsForBooleanCheck.html)
Prevents the use of boolean operators that don't allow short-circuiting the expression. (e.g. '|', '&', '|=' and '&=') Prevents the use of boolean operators that don't allow short-circuiting the expression. (e.g. '|', '&', '|=' and '&=')
@ -2122,6 +2238,12 @@ Invalid:
```` ````
if ((a < b) | (b > getExpensiveValue())) {} if ((a < b) | (b > getExpensiveValue())) {}
```` ````
#### [CauseParameterInException](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/design/CauseParameterInExceptionCheck.html)
Should already be covered by [AvoidHidingCauseException](#avoidhidingcauseexception).
#### [ChildBlockLength](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/design/ChildBlockLengthCheck.html)
Appears to be broken as of `1.21.0`.
#### [ConfusingCondition](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/ConfusingConditionCheck.html) #### [ConfusingCondition](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/ConfusingConditionCheck.html)
Checks that the expression with the `if` condition in an `if-then-else` statement is not negated. Checks that the expression with the `if` condition in an `if-then-else` statement is not negated.
@ -2146,6 +2268,9 @@ if (!isValid()) {
#### [ConstructorWithoutParams](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/design/ConstructorWithoutParamsCheck.html) #### [ConstructorWithoutParams](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/design/ConstructorWithoutParamsCheck.html)
Exception class constructors must accept parameters for message and/or cause. This check is applied to classes whose name ends with `Exception`. Exception class constructors must accept parameters for message and/or cause. This check is applied to classes whose name ends with `Exception`.
#### [CustomDeclarationOrder](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/CustomDeclarationOrderCheck.html)
The [DeclarationOrder](#declarationorder) check already imposes an order for class elements.
#### [DiamondOperatorForVariableDefinition](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/DiamondOperatorForVariableDefinitionCheck.html) #### [DiamondOperatorForVariableDefinition](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/DiamondOperatorForVariableDefinitionCheck.html)
Checks that the diamond operator is used where possible. Checks that the diamond operator is used where possible.
@ -2252,6 +2377,9 @@ class InvalidPublic {
} }
} }
``` ```
#### [ForbidAnnotation](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/annotation/ForbidAnnotationCheck.html)
Generic rule; doesn't embody a 'quality' check.
#### [ForbidCCommentsInMethods](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/ForbidCCommentsInMethodsCheck.html) #### [ForbidCCommentsInMethods](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/ForbidCCommentsInMethodsCheck.html)
Prevents the use of `/* C-style */` comments inside methods. Prevents the use of `/* C-style */` comments inside methods.
@ -2269,6 +2397,12 @@ void doSomething() {
/* invalid */ /* invalid */
} }
```` ````
#### [ForbidCertainImports](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/ForbidCertainImportsCheck.html)
Generic rule; doesn't embody a 'quality' check.
#### [ForbidInstantiation](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/ForbidInstantiationCheck.html)
Generic rule; doesn't embody a 'quality' check.
#### [ForbidReturnInFinallyBlock](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/ForbidReturnInFinallyBlockCheck.html) #### [ForbidReturnInFinallyBlock](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/ForbidReturnInFinallyBlockCheck.html)
Prevent the use of a `return` statement in the `finally` block. Prevent the use of a `return` statement in the `finally` block.
@ -2283,6 +2417,9 @@ try {
return true; // invalid return true; // invalid
} }
```` ````
#### [ForbidThrowAnonymousExceptions](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/ForbidThrowAnonymousExceptionsCheck.html)
[IllegalThrows](#illegalthrows) performs a similar check.
#### [ForbidWildcardAsReturnType](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/design/ForbidWildcardAsReturnTypeCheck.html) #### [ForbidWildcardAsReturnType](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/design/ForbidWildcardAsReturnTypeCheck.html)
Prevents declaring a method from returning a wildcard type as its return value. Prevents declaring a method from returning a wildcard type as its return value.
@ -2459,6 +2596,9 @@ void doStuff() {
return; return;
} }
```` ````
#### [RequiredParameterForAnnotation](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/annotation/RequiredParameterForAnnotationCheck.html)
Generic rule; doesn't embody a 'quality' check.
#### [ReturnBooleanFromTernary](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/ReturnBooleanFromTernaryCheck.html) #### [ReturnBooleanFromTernary](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/ReturnBooleanFromTernaryCheck.html)
Ternary statements shouldn't have `Boolean` values as results. Ternary statements shouldn't have `Boolean` values as results.
@ -2490,9 +2630,15 @@ Boolean isEnabled() {
return null; return null;
} }
```` ````
#### [SimpleAccessorNameNotation](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/SimpleAccessorNameNotationCheck.html)
allow use of non-bean property-like naming
#### [SingleBreakOrContinue](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/SingleBreakOrContinueCheck.html) #### [SingleBreakOrContinue](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/SingleBreakOrContinueCheck.html)
Checks that there is at most one `continue` or `break` statement within a looping block (e.g. `for`, `while`, ...) Checks that there is at most one `continue` or `break` statement within a looping block (e.g. `for`, `while`, ...)
#### [StaticMethodCandidate](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/design/StaticMethodCandidateCheck.html)
Can't handle private methods called by reflection, which may cause issues with Spring and other DI frameworks.
#### [TernaryPerExpressionCount](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/TernaryPerExpressionCountCheck.html) #### [TernaryPerExpressionCount](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/TernaryPerExpressionCountCheck.html)
Checks that there is at most one ternary statments (`?:`) within an expression. Checks that there is at most one ternary statments (`?:`) within an expression.
@ -2570,149 +2716,4 @@ Invalid:
int[] ints = new int[]{0, 1, 2, 3}; int[] ints = new int[]{0, 1, 2, 3};
```` ````
## Disabled Checks [Effective Java]: http://amzn.to/2aSz6GE
These checks are not enabled. Notes are included for each explaining why.
### Checkstyle
#### [AbstractClassName](http://checkstyle.sourceforge.net/config_naming.html#AbstractClassName)
Prevents some more meaningful abstract class names
#### [ArrayTrailingComma](http://checkstyle.sourceforge.net/config_coding.html#ArrayTrailingComma)
Couldn't get my IDE's (IntelliJ) code style to match.
#### [AvoidStarImport](http://checkstyle.sourceforge.net/config_imports.html#AvoidStarImport)
Ref: Clean Code, Robert C. Martin, J1: Avoid Long Import Lists by Using Wildcards
#### [AvoidStaticImport](http://checkstyle.sourceforge.net/config_imports.html#AvoidStaticImport)
Ref: Clean Code, Robert C. Martin, J2: Don't Inherit Constants
Recommends using a static import to access constants from another class over inheriting them.
#### [EmptyLineSeparator](http://checkstyle.sourceforge.net/config_whitespace.html#EmptyLineSeparator)
#### [FinalLocalVariable](http://checkstyle.sourceforge.net/config_coding.html#FinalLocalVariable)
Doesn't recognise Lombok's `val` as being `final`.
#### [Header](http://checkstyle.sourceforge.net/config_header.html#Header)
Shouldn't need to list in every file, simply listing in project root should be enough.
#### [IllegalInstantiation](http://checkstyle.sourceforge.net/config_coding.html#IllegalInstantiation)
Not really suitable for a template ruleset as it requires an explicit list of classes to apply to.
#### [IllegalTokenText](http://checkstyle.sourceforge.net/config_coding.html#IllegalTokenText)
Generic rule; doesn't embody a 'quality' check.
#### [ImportControl](http://checkstyle.sourceforge.net/config_imports.html#ImportControl)
Generic rule; doesn't embody a 'quality' check.
#### [ImportOrder](http://checkstyle.sourceforge.net/config_imports.html#ImportOrder)
Generic rule; doesn't embody a 'quality' check.
#### [Indentation](http://checkstyle.sourceforge.net/config_misc.html#Indentation)
Couldn't get my IDE's (IntelliJ) code style to match.
#### [JavadocMethod](http://checkstyle.sourceforge.net/config_javadoc.html#JavadocMethod)
Only exceptional cases should need to be documented.
#### [JavadocTagContinuationIndentation](http://checkstyle.sourceforge.net/config_javadoc.html#JavadocTagContinuationIndentation)
Couldn't get my IDE's (IntelliJ) code style to match.
#### [JavadocVariable](http://checkstyle.sourceforge.net/config_javadoc.html#JavadocVariable)
Member variables should usually be named such that it is clear what they are. Comments for clarification should be the exception.
#### [MissingCtor](http://checkstyle.sourceforge.net/config_coding.html#MissingCtor)
Would not see constructors created using Lombok's `@NoArgsConstructor`.
#### [MissingOverride](http://checkstyle.sourceforge.net/config_annotation.html#MissingOverride)
The javadoc compiler automatically inherits the javadoc from the overridden method, it doesn't need to be told to do so.
#### [OuterTypeNumber](http://checkstyle.sourceforge.net/config_sizes.html#OuterTypeNumber)
Already covered by the [OneTopLevelClass](#onetoplevelclass) check.
#### [ParameterAssignment](http://checkstyle.sourceforge.net/config_coding.html#ParameterAssignment)
[FinalParameters](#finalparameters) already protects against assigning values to parameters.
#### [RedundantImport](http://checkstyle.sourceforge.net/config_imports.html#RedundantImport)
[UnusedImports](#unusedimports) performs all the same checks and more.
#### [RedundantModifier](http://checkstyle.sourceforge.net/config_modifier.html#RedundantModifier)
conflicts with InterfaceMemberImpliedModifier which is now prefered given changes to interfaces in Java 9
#### [Regexp](http://checkstyle.sourceforge.net/config_regexp.html#Regexp)
Generic rule; doesn't embody a 'quality' check.
#### [RegexpHeader](http://checkstyle.sourceforge.net/config_header.html#RegexpHeader)
Generic rule; doesn't embody a 'quality' check.
#### [RegexpMultiline](http://checkstyle.sourceforge.net/config_regexp.html#RegexpMultiline)
Generic rule; doesn't embody a 'quality' check.
#### [RegexpOnFilename](http://checkstyle.sourceforge.net/config_regexp.html#RegexpOnFilename)
Generic rule; doesn't embody a 'quality' check.
#### [RegexpSingleline](http://checkstyle.sourceforge.net/config_regexp.html#RegexpSingleline)
Generic rule; doesn't embody a 'quality' check.
#### [RegexpSinglelineJava](http://checkstyle.sourceforge.net/config_regexp.html#RegexpSinglelineJava)
Generic rule; doesn't embody a 'quality' check.
#### [SingleLineJavadoc](http://checkstyle.sourceforge.net/config_javadoc.html#SingleLineJavadoc)
I don't use single line javadoc blocks.
#### [SummaryJavadoc](http://checkstyle.sourceforge.net/config_javadoc.html#SummaryJavadoc)
Generic rule; doesn't embody a 'quality' check.
#### [SuperClone](http://checkstyle.sourceforge.net/config_coding.html#SuperClone)
Overridding the `clone()` method is not allowed by the [NoClone](#noclone) check.
#### [SuperFinalize](http://checkstyle.sourceforge.net/config_coding.html#SuperFinalize)
[NoFinalizer](#nofinalizer) prevents use of `finalize()`.
#### [WriteTag](http://checkstyle.sourceforge.net/config_javadoc.html#WriteTag)
Generic rule; doesn't embody a 'quality' check.
### Sevntu
As the sevntu check are considered experimental not all those that are not enabled are listed here. Only where they are disabled due to a conflict with my 'style' or there is another irreconcilable difference that prevents them from being enabled, will they be documented to prevent repeated investigations.
#### [AvoidConditionInversion](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/design/AvoidConditionInversionCheck.html)
Should already be covered by [SimplifyBooleanExpression](simplifybooleanexpression).
#### [AvoidModifiersForTypes](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/AvoidModifiersForTypesCheck.html)
Generic rule; doesn't embody a 'quality' check.
#### [CauseParameterInException](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/design/CauseParameterInExceptionCheck.html)
Should already be covered by [AvoidHidingCauseException](#avoidhidingcauseexception).
#### [ChildBlockLength](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/design/ChildBlockLengthCheck.html)
Appears to be broken as of `1.21.0`.
#### [CustomDeclarationOrder](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/CustomDeclarationOrderCheck.html)
The [DeclarationOrder](#declarationorder) check already imposes an order for class elements.
#### [ForbidAnnotation](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/annotation/ForbidAnnotationCheck.html)
Generic rule; doesn't embody a 'quality' check.
#### [ForbidCertainImports](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/ForbidCertainImportsCheck.html)
Generic rule; doesn't embody a 'quality' check.
#### [ForbidInstantiation](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/ForbidInstantiationCheck.html)
Generic rule; doesn't embody a 'quality' check.
#### [ForbidThrowAnonymousExceptions](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/ForbidThrowAnonymousExceptionsCheck.html)
[IllegalThrows](#illegalthrows) performs a similar check.
#### [RequiredParameterForAnnotation](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/annotation/RequiredParameterForAnnotationCheck.html)
Generic rule; doesn't embody a 'quality' check.
#### [SimpleAccessorNameNotation](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/coding/SimpleAccessorNameNotationCheck.html)
allow use of non-bean property-like naming
#### [StaticMethodCandidate](http://sevntu-checkstyle.github.io/sevntu.checkstyle/apidocs/com/github/sevntu/checkstyle/checks/design/StaticMethodCandidateCheck.html)
Can't handle private methods called by reflection, which may cause issues with Spring and other DI frameworks.
[Effective Java]: http://amzn.to/2aSz6GE

View file

@ -19,11 +19,14 @@
<properties> <properties>
<maven.install.skip>true</maven.install.skip> <maven.install.skip>true</maven.install.skip>
<java.version>1.8</java.version> <java.version>1.8</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<tiles-maven-plugin.version>2.16</tiles-maven-plugin.version> <tiles-maven-plugin.version>2.16</tiles-maven-plugin.version>
<kemitix-tiles.version>1.1.0</kemitix-tiles.version> <kemitix-tiles.version>1.1.0</kemitix-tiles.version>
<checkstyle.version>8.30</checkstyle.version> <checkstyle.version>8.30</checkstyle.version>
<sevntu.version>1.35.0</sevntu.version> <sevntu.version>1.37.1</sevntu.version>
<sevntu-plugin.version>1.35.0</sevntu-plugin.version>
<lombok.version>1.18.10</lombok.version> <lombok.version>1.18.10</lombok.version>
<spring-platform.version>Brussels-SR6</spring-platform.version> <spring-platform.version>Brussels-SR6</spring-platform.version>
<spring-boot.version>2.1.9.RELEASE</spring-boot.version> <spring-boot.version>2.1.9.RELEASE</spring-boot.version>
@ -176,7 +179,7 @@
<dependency> <dependency>
<groupId>com.github.sevntu-checkstyle</groupId> <groupId>com.github.sevntu-checkstyle</groupId>
<artifactId>sevntu-checkstyle-maven-plugin</artifactId> <artifactId>sevntu-checkstyle-maven-plugin</artifactId>
<version>${sevntu.version}</version> <version>${sevntu-plugin.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.kemitix.checkstyle</groupId> <groupId>net.kemitix.checkstyle</groupId>

View file

@ -1,5 +1,6 @@
package net.kemitix.checkstyle.ruleset.builder; package net.kemitix.checkstyle.ruleset.builder;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
@ -7,7 +8,6 @@ import java.util.AbstractMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream;
/** /**
* Configuration for Builder. * Configuration for Builder.
@ -15,8 +15,11 @@ import java.util.stream.Stream;
* @author Paul Campbell (pcampbell@kemitix.net). * @author Paul Campbell (pcampbell@kemitix.net).
*/ */
@Configuration @Configuration
@RequiredArgsConstructor
public class BuilderConfiguration { public class BuilderConfiguration {
private final SourcesProperties sourcesProperties;
/** /**
* A Map of rules for each RuleSource. * A Map of rules for each RuleSource.
* *
@ -26,7 +29,7 @@ public class BuilderConfiguration {
*/ */
@Bean @Bean
public Map<RuleSource, List<String>> checkClasses(final PackageScanner packageScanner) { public Map<RuleSource, List<String>> checkClasses(final PackageScanner packageScanner) {
return Stream.of(RuleSource.values()) return sourcesProperties.getSources().stream()
.map(source -> entry(source, packageScanner.apply(source))) .map(source -> entry(source, packageScanner.apply(source)))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
} }

View file

@ -5,11 +5,14 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner; import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.HashSet;
import java.util.Set;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
@ -34,6 +37,19 @@ class CheckstyleWriter implements CommandLineRunner {
private final RuleClassLocator ruleClassLocator; private final RuleClassLocator ruleClassLocator;
private final SourcesProperties sourcesProperties;
private final Set<String> enabledSourceNames = new HashSet<>();
@PostConstruct
public void init() {
enabledSourceNames.addAll(
sourcesProperties.getSources()
.stream()
.filter(RuleSource::isEnabled)
.map(RuleSource::getName)
.collect(Collectors.toSet()));
}
private static Predicate<RuleLevel> excludeUnspecifiedRuleLevel() { private static Predicate<RuleLevel> excludeUnspecifiedRuleLevel() {
return level -> !level.equals(RuleLevel.UNSPECIFIED); return level -> !level.equals(RuleLevel.UNSPECIFIED);
} }
@ -41,7 +57,7 @@ class CheckstyleWriter implements CommandLineRunner {
private static void writeRuleset( private static void writeRuleset(
final Path filePath, final Path filePath,
final String content final String content
) throws IOException { ) throws IOException {
Files.write(filePath, asList(content.split(System.lineSeparator())), StandardCharsets.UTF_8); Files.write(filePath, asList(content.split(System.lineSeparator())), StandardCharsets.UTF_8);
} }
@ -49,7 +65,7 @@ class CheckstyleWriter implements CommandLineRunner {
final String checkerRules, final String checkerRules,
final String treeWalkerRules, final String treeWalkerRules,
final String template final String template
) { ) {
return String.format(template, checkerRules, treeWalkerRules); return String.format(template, checkerRules, treeWalkerRules);
} }
@ -62,7 +78,7 @@ class CheckstyleWriter implements CommandLineRunner {
final String checkerRules, final String checkerRules,
final String treeWalkerRules, final String treeWalkerRules,
final Path template final Path template
) throws IOException { ) throws IOException {
if (fileExists(template.toFile())) { if (fileExists(template.toFile())) {
log.info("Writing ruleset: {}", outputPath); log.info("Writing ruleset: {}", outputPath);
final String xmlTemplate = new String(Files.readAllBytes(template), StandardCharsets.UTF_8); final String xmlTemplate = new String(Files.readAllBytes(template), StandardCharsets.UTF_8);
@ -94,19 +110,21 @@ class CheckstyleWriter implements CommandLineRunner {
private Path outputPath(final RuleLevel ruleLevel) { private Path outputPath(final RuleLevel ruleLevel) {
return outputProperties.getDirectory() return outputProperties.getDirectory()
.resolve(outputProperties.getRulesetFiles() .resolve(outputProperties.getRulesetFiles()
.get(ruleLevel)); .get(ruleLevel));
} }
private String enabledRules( private String enabledRules(
final RuleLevel ruleLevel, final RuleLevel ruleLevel,
final RuleParent ruleParent final RuleParent ruleParent
) { ) {
return rulesProperties.getRules() return rulesProperties.getRules()
.stream() .stream()
.filter(Rule::isEnabled) .filter(Rule::isEnabled)
.filter(rule -> enabledSourceNames.contains(rule.getSource()))
.filter(Rule.hasParent(ruleParent)) .filter(Rule.hasParent(ruleParent))
.filter(Rule.isIncludedInLevel(ruleLevel)) .filter(Rule.isIncludedInLevel(ruleLevel))
.map(rule -> Rule.asModule(ruleClassLocator.apply(rule), rule)) .map(rule -> Rule.asModule(ruleClassLocator.apply(rule), rule))
.collect(Collectors.joining(System.lineSeparator())); .collect(Collectors.joining(System.lineSeparator()));
} }
} }

View file

@ -1,9 +1,9 @@
package net.kemitix.checkstyle.ruleset.builder; package net.kemitix.checkstyle.ruleset.builder;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
@ -13,10 +13,18 @@ import java.util.Objects;
* @author Paul Campbell (pcampbell@kemitix.net). * @author Paul Campbell (pcampbell@kemitix.net).
*/ */
@Service @Service
@RequiredArgsConstructor //@RequiredArgsConstructor
public class DefaultRuleClassLocator implements RuleClassLocator { public class DefaultRuleClassLocator implements RuleClassLocator {
private final Map<RuleSource, List<String>> checkClasses; private final Map<RuleSource, List<String>> checkClasses;
private final SourcesProperties sourcesProperties;
public DefaultRuleClassLocator(
final Map<RuleSource, List<String>> checkClasses,
final SourcesProperties sourcesProperties) {
this.checkClasses = checkClasses;
this.sourcesProperties = sourcesProperties;
}
@Override @Override
public final String apply(final Rule rule) { public final String apply(final Rule rule) {
@ -24,23 +32,26 @@ public class DefaultRuleClassLocator implements RuleClassLocator {
} }
private String getCanonicalClassName( private String getCanonicalClassName(
final RuleSource source, final String sourceName,
final String name final String name
) { ) {
Objects.requireNonNull(checkClasses, "init() method not called"); Objects.requireNonNull(checkClasses, "init() method not called");
return checkClasses.get(source) return sourcesProperties.findSource(sourceName.toLowerCase(Locale.ENGLISH))
.stream() .map(checkClasses::get)
.sorted() .flatMap(classes ->
.filter(classname -> byRuleName(classname, name)) classes.stream()
.findFirst() .sorted()
.filter(className -> byRuleName(className, name))
.findFirst())
.orElseThrow(() -> new CheckstyleClassNotFoundException(name)); .orElseThrow(() -> new CheckstyleClassNotFoundException(name));
} }
private boolean byRuleName( private boolean byRuleName(
final String classname, final String classname,
final String name final String name
) { ) {
final String classNameWithDelimiter = "." + name; final String classNameWithDelimiter = "." + name;
return classname.endsWith(classNameWithDelimiter) || classname.endsWith(classNameWithDelimiter + "Check"); return classname.endsWith(classNameWithDelimiter)
|| classname.endsWith(classNameWithDelimiter + "Check");
} }
} }

View file

@ -24,8 +24,9 @@ class DefaultRuleReadmeLoader implements RuleReadmeLoader {
@Override @Override
public Stream<String> load(final Rule rule) { public Stream<String> load(final Rule rule) {
if (rule.isEnabled()) { if (rule.isEnabled()) {
final Path resolve = templateProperties.getReadmeFragments() final Path resolve =
.resolve(rule.getName() + ".md"); templateProperties.getReadmeFragments()
.resolve(rule.getName() + ".md");
log.info("Loading fragment: {}", resolve); log.info("Loading fragment: {}", resolve);
try { try {
return Stream.concat(Stream.of(formatRuleHeader(rule)), Files.lines(resolve)); return Stream.concat(Stream.of(formatRuleHeader(rule)), Files.lines(resolve));

View file

@ -0,0 +1,27 @@
package net.kemitix.checkstyle.ruleset.builder;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
@Component
public class FileReader {
private static final String NEWLINE = "\n";
/**
* Reads the content from the file path.
*
* <p>File content will be read using UTF-8 encoding and line endings will
* be replaced with a newline (\n).</p>
*
* @param path the file to read
* @throws IOException if there is an error.
*/
public String read(final Path path) throws IOException {
return String.join(NEWLINE,
Files.readAllLines(path, StandardCharsets.UTF_8));
}
}

View file

@ -0,0 +1,31 @@
package net.kemitix.checkstyle.ruleset.builder;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
@Component
public class FileWriter {
/**
* Writes the content to the file path, replacing any existing file.
*
* <p>File content will be written using UTF-8 encoding.</p>
*
* @param path the file to write
* @param content the content to write
* @throws IOException if there is an error.
*/
public void write(
final Path path,
final String content
) throws IOException {
Files.write(path,
content.getBytes(StandardCharsets.UTF_8),
StandardOpenOption.TRUNCATE_EXISTING);
}
}

View file

@ -0,0 +1,36 @@
package net.kemitix.checkstyle.ruleset.builder;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
public class ReadmeBuilder {
public static final String CHECKSTYLE = "checkstyle";
public static final String SEVNTU = "sevntu";
private final ReadmeIndexBuilder indexBuilder;
private final RuleLoader ruleLoader;
/**
* Creates a readme based on the template, inserting lists of the enabled
* and disabled checkstyle and sevntu rules.
*
* @param readmeTemplate the String.format compatible template
* @return the formatted readme document.
*/
public String build(final String readmeTemplate) {
String enabledCheckstyle = ruleLoader.loadEnabled(CHECKSTYLE);
String enabledSevntu = ruleLoader.loadEnabled(SEVNTU);
String disabledCheckstyle = ruleLoader.loadDisabled(CHECKSTYLE);
String disabledSevntu = ruleLoader.loadDisabled(SEVNTU);
return String.format(readmeTemplate,
indexBuilder.build(),
enabledCheckstyle,
enabledSevntu,
disabledCheckstyle,
disabledSevntu);
}
}

View file

@ -4,13 +4,7 @@ import lombok.RequiredArgsConstructor;
import org.springframework.boot.CommandLineRunner; import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.function.Predicate;
import java.util.stream.Collectors;
/** /**
* Writes the README file. * Writes the README file.
@ -21,59 +15,19 @@ import java.util.stream.Collectors;
@RequiredArgsConstructor @RequiredArgsConstructor
class ReadmeWriter implements CommandLineRunner { class ReadmeWriter implements CommandLineRunner {
private static final String NEWLINE = "\n";
private final TemplateProperties templateProperties; private final TemplateProperties templateProperties;
private final OutputProperties outputProperties; private final OutputProperties outputProperties;
private final ReadmeBuilder readmeBuilder;
private final RulesProperties rulesProperties; private final FileReader fileReader;
private final FileWriter fileWriter;
private final RuleReadmeLoader ruleReadmeLoader;
private final ReadmeIndexBuilder indexBuilder;
@Override @Override
public void run(final String... args) throws Exception { public void run(final String... args) throws Exception {
final String readmeTemplate = readFile(templateProperties.getReadmeTemplate()); Path templatePath = templateProperties.getReadmeTemplate();
final String enabledCheckstyle = readmeRules(this::isEnabledCheckstyleRule); String templateBody = fileReader.read(templatePath);
final String enabledSevntu = readmeRules(this::isEnabledSevntuRule); Path outputPath = outputProperties.getReadme();
final String disabledCheckstyle = readmeRules(this::isDisabledCheckstyleRule); String outputBody = readmeBuilder.build(templateBody);
final String disabledSevntu = readmeRules(this::isDisabledSevntuRule); fileWriter.write(outputPath, outputBody);
final byte[] readme = String.format(readmeTemplate, indexBuilder.build(), enabledCheckstyle, enabledSevntu,
disabledCheckstyle, disabledSevntu
)
.getBytes(StandardCharsets.UTF_8);
Files.write(outputProperties.getReadme(), readme, StandardOpenOption.TRUNCATE_EXISTING);
}
private boolean isEnabledSevntuRule(final Rule rule) {
return rule.isEnabled() && RuleSource.SEVNTU.equals(rule.getSource());
}
private boolean isEnabledCheckstyleRule(final Rule rule) {
return rule.isEnabled() && RuleSource.CHECKSTYLE.equals(rule.getSource());
}
private boolean isDisabledSevntuRule(final Rule rule) {
return !rule.isEnabled() && RuleSource.SEVNTU.equals(rule.getSource());
}
private boolean isDisabledCheckstyleRule(final Rule rule) {
return !rule.isEnabled() && RuleSource.CHECKSTYLE.equals(rule.getSource());
}
private String readmeRules(final Predicate<Rule> predicate) {
return rulesProperties.getRules()
.stream()
.filter(predicate)
.sorted(Rule::sortByName)
.flatMap(ruleReadmeLoader::load)
.collect(Collectors.joining(NEWLINE));
}
private String readFile(final Path file) throws IOException {
return String.join(NEWLINE, Files.readAllLines(file, StandardCharsets.UTF_8));
} }
} }

View file

@ -55,7 +55,7 @@ public class Rule {
/** /**
* The source of the rule. * The source of the rule.
*/ */
private RuleSource source; private String source;
/** /**
* URI for full official documentation. * URI for full official documentation.
@ -83,8 +83,8 @@ public class Rule {
* string. * string.
*/ */
protected static int sortByName(final Rule left, final Rule right) { protected static int sortByName(final Rule left, final Rule right) {
return left.getLowerCaseRuleName() return left.getName().toLowerCase(LOCALE)
.compareTo(right.getLowerCaseRuleName()); .compareTo(right.getName().toLowerCase(LOCALE));
} }
/** /**
@ -132,7 +132,7 @@ public class Rule {
static String asModule( static String asModule(
final String ruleClassname, final String ruleClassname,
final Rule rule final Rule rule
) { ) {
if (hasProperties(rule)) { if (hasProperties(rule)) {
return moduleWithParameters(rule, ruleClassname); return moduleWithParameters(rule, ruleClassname);
} else { } else {
@ -142,18 +142,34 @@ public class Rule {
private static String moduleNoParameters( private static String moduleNoParameters(
final String ruleClassname final String ruleClassname
) { ) {
return String.format(MODULE_NO_PROPERTIES, ruleClassname); return String.format(MODULE_NO_PROPERTIES, ruleClassname);
} }
private static String moduleWithParameters( private static String moduleWithParameters(
final Rule rule, final Rule rule,
final String ruleClassname final String ruleClassname
) { ) {
return String.format(MODULE_WITH_PROPERTIES, ruleClassname, formatProperties(rule.getProperties())); return String.format(MODULE_WITH_PROPERTIES, ruleClassname, formatProperties(rule.getProperties()));
} }
private String getLowerCaseRuleName() { /**
return getName().toLowerCase(LOCALE); * Checks that this rule comes from the source named.
*
* @param sourceName the name of the source to check against
* @return true if this rule comes from the source
*/
public boolean isFromSource(final String sourceName) {
return getSource()
.equals(sourceName);
}
/**
* The name of the source for the rule.
*
* @return the source name, in lowercase.
*/
public String getSource() {
return source.toLowerCase(Locale.ENGLISH);
} }
} }

View file

@ -0,0 +1,63 @@
package net.kemitix.checkstyle.ruleset.builder;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@Component
@RequiredArgsConstructor
public class RuleLoader {
private static final String NEWLINE = "\n";
private final RulesProperties rulesProperties;
private final RuleReadmeLoader ruleReadmeLoader;
private final SourcesProperties sourcesProperties;
/**
* Loads from the source, where the source is enabled, all rules that are
* themselves enabled.
*
* @param sourceName the source to load from
* @return a formatted string containing the enabled rules.
*/
public String loadEnabled(final String sourceName) {
if (!isEnabledRuleSource(sourceName)) {
return "";
}
return readmeRules(rule ->
rule.isFromSource(sourceName)
&& rule.isEnabled());
}
/**
* Loads from the source, where either the source is disabled or the rule
* is itself disabled.
*
* @param sourceName the source to load from
* @return a formatted string containing the disabled rules.
*/
public String loadDisabled(final String sourceName) {
boolean enabledRuleSource = isEnabledRuleSource(sourceName);
return readmeRules(rule ->
rule.isFromSource(sourceName)
&& (!enabledRuleSource || !rule.isEnabled()));
}
private boolean isEnabledRuleSource(final String sourceName) {
return sourcesProperties.getSources().stream()
.filter(RuleSource::isEnabled)
.map(RuleSource::getName)
.anyMatch(sourceName::equals);
}
private String readmeRules(final Predicate<Rule> predicate) {
return rulesProperties.getRules().stream()
.filter(predicate)
.sorted(Rule::sortByName)
.flatMap(ruleReadmeLoader::load)
.collect(Collectors.joining(NEWLINE));
}
}

View file

@ -1,27 +1,21 @@
package net.kemitix.checkstyle.ruleset.builder; package net.kemitix.checkstyle.ruleset.builder;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/** /**
* The origin of the rule. * The origin of the rule.
* *
* @author Paul Campbell (pcampbell@kemitix.net) * @author Paul Campbell (pcampbell@kemitix.net)
*/ */
public enum RuleSource { @Setter
@Getter
@NoArgsConstructor
public class RuleSource {
CHECKSTYLE("com.puppycrawl.tools.checkstyle"), private String name;
SEVNTU("com.github.sevntu.checkstyle.checks"); private boolean enabled;
private String basePackage;
@Getter
private final String basePackage;
/**
* Constructor.
*
* @param basePackage the base package that contains all checks from this source
*/
RuleSource(final String basePackage) {
this.basePackage = basePackage;
}
} }

View file

@ -0,0 +1,30 @@
package net.kemitix.checkstyle.ruleset.builder;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
/**
* Properties defining the sources.
*
* @author Paul Campbell (pcampbell@kemitix.net)
*/
@Setter
@Getter
@Configuration
@ConfigurationProperties
class SourcesProperties {
private List<RuleSource> sources = new ArrayList<>();
public Optional<RuleSource> findSource(final String sourceName) {
return sources.stream()
.filter(ruleSource -> ruleSource.getName().equals(sourceName))
.findFirst();
}
}

View file

@ -12,6 +12,15 @@ template:
checkstyle-xml: builder/src/main/resources/checkstyle-template.xml checkstyle-xml: builder/src/main/resources/checkstyle-template.xml
readme-template: builder/src/main/resources/README-template.md readme-template: builder/src/main/resources/README-template.md
readme-fragments: builder/src/main/resources/rules readme-fragments: builder/src/main/resources/rules
sources:
-
name: checkstyle
enabled: true
base-package: com.puppycrawl.tools.checkstyle
-
name: sevntu
enabled: false
base-package: com.github.sevntu.checkstyle.checks
rules: rules:
- -
name: RegexpOnFilename name: RegexpOnFilename
@ -495,7 +504,7 @@ rules:
uri: http://checkstyle.sourceforge.net/config_blocks.html#LeftCurly uri: http://checkstyle.sourceforge.net/config_blocks.html#LeftCurly
- -
name: LineLength name: LineLength
parent: TREEWALKER parent: CHECKER
level: LAYOUT level: LAYOUT
enabled: true enabled: true
source: CHECKSTYLE source: CHECKSTYLE

View file

@ -4,6 +4,7 @@ import com.google.common.reflect.ClassPath;
import org.junit.Test; import org.junit.Test;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -21,20 +22,26 @@ import static org.mockito.Mockito.mock;
*/ */
public class BuilderConfigurationTest { public class BuilderConfigurationTest {
private SourcesProperties sourceProperties = new SourcesProperties();
@Test @Test
public void canGetCheckClasses() { public void canGetCheckClasses() {
//given //given
final PackageScanner packageScanner = mock(PackageScanner.class); final PackageScanner packageScanner = mock(PackageScanner.class);
final String checkstyleClass = "checkstyle class"; final String checkstyleClass = "checkstyle class";
given(packageScanner.apply(RuleSource.CHECKSTYLE)).willReturn(singletonList(checkstyleClass)); final RuleSource checkstyleRuleSource = RuleSourceMother.checkstyle.get();
final RuleSource sevntuRuleSource = RuleSourceMother.sevntu.get();
given(packageScanner.apply(checkstyleRuleSource)).willReturn(singletonList(checkstyleClass));
final String sevntuClass = "sevntu class"; final String sevntuClass = "sevntu class";
given(packageScanner.apply(RuleSource.SEVNTU)).willReturn(singletonList(sevntuClass)); given(packageScanner.apply(sevntuRuleSource)).willReturn(singletonList(sevntuClass));
sourceProperties.setSources(Arrays.asList(checkstyleRuleSource, sevntuRuleSource));
BuilderConfiguration subject = new BuilderConfiguration(sourceProperties);
//when //when
final Map<RuleSource, List<String>> checkClasses = new BuilderConfiguration().checkClasses(packageScanner); final Map<RuleSource, List<String>> checkClasses = subject.checkClasses(packageScanner);
//then //then
assertThat(checkClasses).containsOnlyKeys(RuleSource.values()); assertThat(checkClasses).containsOnlyKeys(Arrays.asList(checkstyleRuleSource, sevntuRuleSource));
assertThat(checkClasses) assertThat(checkClasses)
.containsEntry(RuleSource.CHECKSTYLE, singletonList(checkstyleClass)) .containsEntry(checkstyleRuleSource, singletonList(checkstyleClass))
.containsEntry(RuleSource.SEVNTU, singletonList(sevntuClass)); .containsEntry(sevntuRuleSource, singletonList(sevntuClass));
} }
} }

View file

@ -15,6 +15,7 @@ import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.nio.file.StandardOpenOption; import java.nio.file.StandardOpenOption;
import java.util.AbstractMap; import java.util.AbstractMap;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -58,6 +59,7 @@ public class CheckstyleWriterTest {
private Path outputDirectory; private Path outputDirectory;
private RuleClassLocator ruleClassLocator = mock(RuleClassLocator.class); private RuleClassLocator ruleClassLocator = mock(RuleClassLocator.class);
private SourcesProperties sourceProperties = new SourcesProperties();
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
@ -82,8 +84,18 @@ public class CheckstyleWriterTest {
checkstyleTemplate, TEMPLATE.getBytes(StandardCharsets.UTF_8), StandardOpenOption.TRUNCATE_EXISTING); checkstyleTemplate, TEMPLATE.getBytes(StandardCharsets.UTF_8), StandardOpenOption.TRUNCATE_EXISTING);
templateProperties.setCheckstyleXml(checkstyleTemplate); templateProperties.setCheckstyleXml(checkstyleTemplate);
rulesProperties = new RulesProperties(); rulesProperties = new RulesProperties();
sourceProperties.setSources(Arrays.asList(
RuleSourceMother.checkstyle.get(),
RuleSourceMother.sevntu.get()
));
checkstyleWriter = checkstyleWriter =
new CheckstyleWriter(outputProperties, templateProperties, rulesProperties, ruleClassLocator); new CheckstyleWriter(
outputProperties,
templateProperties,
rulesProperties,
ruleClassLocator,
sourceProperties);
checkstyleWriter.init();
given(ruleClassLocator.apply(any())).willReturn(ruleClassname); given(ruleClassLocator.apply(any())).willReturn(ruleClassname);
} }
@ -116,7 +128,7 @@ public class CheckstyleWriterTest {
private Rule enabledRule(final RuleLevel level, final RuleParent parent) { private Rule enabledRule(final RuleLevel level, final RuleParent parent) {
val rule = new Rule(); val rule = new Rule();
rule.setName(ruleName); rule.setName(ruleName);
rule.setSource(RuleSource.CHECKSTYLE); rule.setSource(RuleSourceMother.checkstyle.get().getName());
rule.setEnabled(true); rule.setEnabled(true);
rule.setLevel(level); rule.setLevel(level);
rule.setParent(parent); rule.setParent(parent);

View file

@ -15,21 +15,25 @@ public class ClassGraphPackageScannerTest {
private PackageScanner scanner = new ClassGraphPackageScanner(); private PackageScanner scanner = new ClassGraphPackageScanner();
private final RuleSource checkstyleRuleSource = RuleSourceMother.checkstyle.get();
private final RuleSource sevntuRuleSource = RuleSourceMother.sevntu.get();
@Test @Test
public void canScanCheckstylePackage() { public void canScanCheckstylePackage() {
//when //when
final List<String> result = scanner.apply(RuleSource.CHECKSTYLE); final List<String> result = scanner.apply(checkstyleRuleSource);
//then //then
assertThat(result).allMatch(cn -> cn.startsWith(RuleSource.CHECKSTYLE.getBasePackage())) assertThat(result).allMatch(cn -> cn.startsWith(checkstyleRuleSource.getBasePackage()))
.contains("com.puppycrawl.tools.checkstyle.checks.sizes.FileLengthCheck"); .contains("com.puppycrawl.tools.checkstyle.checks.sizes.FileLengthCheck");
} }
@Test @Test
public void canScanSevntuPackage() { public void canScanSevntuPackage() {
//when //when
final List<String> result = scanner.apply(RuleSource.SEVNTU); final List<String> result = scanner.apply(sevntuRuleSource);
//then //then
assertThat(result).allMatch(cn -> cn.startsWith(RuleSource.SEVNTU.getBasePackage())) assertThat(result).allMatch(cn -> cn.startsWith(sevntuRuleSource.getBasePackage()))
.contains("com.github.sevntu.checkstyle.checks.design.NestedSwitchCheck"); .contains("com.github.sevntu.checkstyle.checks.design.NestedSwitchCheck");
} }
} }

View file

@ -37,12 +37,14 @@ public class DefaultReadmeIndexBuilderTest {
expectedIndexItems.add("[e](#e)|complexity|checkstyle|Yes|"); expectedIndexItems.add("[e](#e)|complexity|checkstyle|Yes|");
expectedIndexItems.add("[f](#f)|unspecified|checkstyle|Yes|"); expectedIndexItems.add("[f](#f)|unspecified|checkstyle|Yes|");
val rules = rulesProperties.getRules(); val rules = rulesProperties.getRules();
rules.add(rule("a", RuleLevel.LAYOUT, RuleSource.CHECKSTYLE, true, true)); RuleSource checkStyleRuleSource = RuleSourceMother.checkstyle.get();
rules.add(rule("b", RuleLevel.NAMING, RuleSource.SEVNTU, false, false)); RuleSource sevntuRuleSource = RuleSourceMother.sevntu.get();
rules.add(rule("c", RuleLevel.JAVADOC, RuleSource.CHECKSTYLE, true, true)); rules.add(rule("a", RuleLevel.LAYOUT, checkStyleRuleSource, true, true));
rules.add(rule("d", RuleLevel.TWEAKS, RuleSource.CHECKSTYLE, true, true)); rules.add(rule("b", RuleLevel.NAMING, sevntuRuleSource, false, false));
rules.add(rule("e", RuleLevel.COMPLEXITY, RuleSource.CHECKSTYLE, true, true)); rules.add(rule("c", RuleLevel.JAVADOC, checkStyleRuleSource, true, true));
rules.add(rule("f", RuleLevel.UNSPECIFIED, RuleSource.CHECKSTYLE, true, true)); rules.add(rule("d", RuleLevel.TWEAKS, checkStyleRuleSource, true, true));
rules.add(rule("e", RuleLevel.COMPLEXITY, checkStyleRuleSource, true, true));
rules.add(rule("f", RuleLevel.UNSPECIFIED, checkStyleRuleSource, true, true));
//when //when
val index = indexBuilder.build() val index = indexBuilder.build()
.split("\n"); .split("\n");
@ -57,7 +59,7 @@ public class DefaultReadmeIndexBuilderTest {
val rule = new Rule(); val rule = new Rule();
rule.setName(name); rule.setName(name);
rule.setLevel(level); rule.setLevel(level);
rule.setSource(source); rule.setSource(source.getName());
rule.setEnabled(enabled); rule.setEnabled(enabled);
rule.setInsuppressible(!supressible); rule.setInsuppressible(!supressible);
return rule; return rule;

View file

@ -1,11 +1,9 @@
package net.kemitix.checkstyle.ruleset.builder; package net.kemitix.checkstyle.ruleset.builder;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import java.util.Collections; import java.util.*;
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.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assertions.assertThatThrownBy;
@ -19,7 +17,22 @@ public class DefaultRuleClassLocatorTest {
private final Map<RuleSource, List<String>> checkClasses = new HashMap<>(); private final Map<RuleSource, List<String>> checkClasses = new HashMap<>();
private final DefaultRuleClassLocator subject = new DefaultRuleClassLocator(checkClasses); private SourcesProperties sourceProperties = new SourcesProperties();
private final DefaultRuleClassLocator subject =
new DefaultRuleClassLocator(
checkClasses,
sourceProperties);
private final RuleSource checkstyleRuleSource = RuleSourceMother.checkstyle.get();
private final RuleSource sevntuRuleSource = RuleSourceMother.sevntu.get();
@Before
public void setUp() {
sourceProperties.setSources(Arrays.asList(
checkstyleRuleSource, sevntuRuleSource
));
}
@Test @Test
public void canLookupRuleWithClassNameEndingInCheck() { public void canLookupRuleWithClassNameEndingInCheck() {
@ -28,8 +41,8 @@ public class DefaultRuleClassLocatorTest {
final String expected = "com.puppycrawl.tools.checkstyle.checks.regexp.RegexpOnFilenameCheck"; final String expected = "com.puppycrawl.tools.checkstyle.checks.regexp.RegexpOnFilenameCheck";
final List<String> checkstyleClasses = Collections.singletonList(expected); final List<String> checkstyleClasses = Collections.singletonList(expected);
final List<String> sevntuClasses = Collections.emptyList(); final List<String> sevntuClasses = Collections.emptyList();
checkClasses.put(RuleSource.CHECKSTYLE, checkstyleClasses); checkClasses.put(checkstyleRuleSource, checkstyleClasses);
checkClasses.put(RuleSource.SEVNTU, sevntuClasses); checkClasses.put(sevntuRuleSource, sevntuClasses);
final Rule rule = createCheckstyleRule(rulename); final Rule rule = createCheckstyleRule(rulename);
//when //when
final String result = subject.apply(rule); final String result = subject.apply(rule);
@ -44,8 +57,8 @@ public class DefaultRuleClassLocatorTest {
final String expected = "com.puppycrawl.tools.checkstyle.checks.regexp.RegexpOnFilename"; final String expected = "com.puppycrawl.tools.checkstyle.checks.regexp.RegexpOnFilename";
final List<String> checkstyleClasses = Collections.singletonList(expected); final List<String> checkstyleClasses = Collections.singletonList(expected);
final List<String> sevntuClasses = Collections.emptyList(); final List<String> sevntuClasses = Collections.emptyList();
checkClasses.put(RuleSource.CHECKSTYLE, checkstyleClasses); checkClasses.put(checkstyleRuleSource, checkstyleClasses);
checkClasses.put(RuleSource.SEVNTU, sevntuClasses); checkClasses.put(sevntuRuleSource, sevntuClasses);
final Rule rule = createCheckstyleRule(rulename); final Rule rule = createCheckstyleRule(rulename);
//when //when
final String result = subject.apply(rule); final String result = subject.apply(rule);
@ -60,8 +73,8 @@ public class DefaultRuleClassLocatorTest {
final String expected = "com.puppycrawl.tools.checkstyle.checks.regexp.RegexpOnFilenameNoMatch"; final String expected = "com.puppycrawl.tools.checkstyle.checks.regexp.RegexpOnFilenameNoMatch";
final List<String> checkstyleClasses = Collections.singletonList(expected); final List<String> checkstyleClasses = Collections.singletonList(expected);
final List<String> sevntuClasses = Collections.emptyList(); final List<String> sevntuClasses = Collections.emptyList();
checkClasses.put(RuleSource.CHECKSTYLE, checkstyleClasses); checkClasses.put(checkstyleRuleSource, checkstyleClasses);
checkClasses.put(RuleSource.SEVNTU, sevntuClasses); checkClasses.put(sevntuRuleSource, sevntuClasses);
final Rule rule = createCheckstyleRule(rulename); final Rule rule = createCheckstyleRule(rulename);
//then //then
assertThatThrownBy(() -> subject.apply(rule)) assertThatThrownBy(() -> subject.apply(rule))
@ -71,7 +84,7 @@ public class DefaultRuleClassLocatorTest {
private Rule createCheckstyleRule(final String rulename) { private Rule createCheckstyleRule(final String rulename) {
final Rule rule = new Rule(); final Rule rule = new Rule();
rule.setSource(RuleSource.CHECKSTYLE); rule.setSource(checkstyleRuleSource.getName());
rule.setName(rulename); rule.setName(rulename);
return rule; return rule;
} }

View file

@ -0,0 +1,41 @@
package net.kemitix.checkstyle.ruleset.builder;
import org.junit.Before;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import java.io.IOException;
import java.nio.file.Path;
import java.util.UUID;
import static org.assertj.core.api.Assertions.assertThat;
public class FileWriterReaderTest {
private String line1 = UUID.randomUUID().toString();
private String line2 = UUID.randomUUID().toString();
private String body = line1 + "\n" + line2;
@org.junit.Rule
public TemporaryFolder folder = new TemporaryFolder();
private Path path;
private FileWriter writer = new FileWriter();
private FileReader reader = new FileReader();
@Before
public void setUp() throws IOException {
path = folder.newFile().toPath();
}
@Test
public void writeTheReadFile() throws IOException {
//when
writer.write(path, body);
String read = reader.read(path);
//then
assertThat(read).isEqualTo(body);
}
}

View file

@ -0,0 +1,48 @@
package net.kemitix.checkstyle.ruleset.builder;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.UUID;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
public class ReadmeBuilderTest {
@Mock
private ReadmeIndexBuilder indexBuilder;
@Mock
private RuleLoader ruleLoader;
private ReadmeBuilder readmeBuilder;
private String template = "i:%s,ec:%s,es:%s,dc:%s,ds:%s";
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
readmeBuilder = new ReadmeBuilder(indexBuilder, ruleLoader);
}
@Test
public void canBuild() {
//given
given(indexBuilder.build()).willReturn("index");
given(ruleLoader.loadEnabled("checkstyle")).willReturn("enabled-checkstyle");
given(ruleLoader.loadEnabled("sevntu")).willReturn("enabled-sevntu");
given(ruleLoader.loadDisabled("checkstyle")).willReturn("disabled-checkstyle");
given(ruleLoader.loadDisabled("sevntu")).willReturn("disabled-sevntu");
//when
String result = readmeBuilder.build(template);
//then
assertThat(result).isEqualTo(
"i:index," +
"ec:enabled-checkstyle," +
"es:enabled-sevntu," +
"dc:disabled-checkstyle," +
"ds:disabled-sevntu");
}
}

View file

@ -2,19 +2,26 @@ package net.kemitix.checkstyle.ruleset.builder;
import lombok.val; import lombok.val;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import org.junit.rules.TemporaryFolder; import org.junit.rules.TemporaryFolder;
import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.Arrays; import java.util.Arrays;
import java.util.UUID;
import java.util.function.Supplier;
import java.util.stream.Stream; import java.util.stream.Stream;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.verify;
/** /**
* Tests for {@link ReadmeWriter}. * Tests for {@link ReadmeWriter}.
@ -23,95 +30,50 @@ import static org.mockito.BDDMockito.given;
*/ */
public class ReadmeWriterTest { public class ReadmeWriterTest {
@Mock
private ReadmeBuilder readmeBuilder;
private TemplateProperties templateProperties = new TemplateProperties();
private OutputProperties outputProperties = new OutputProperties();
@Mock
private FileReader fileReader;
@Mock
private FileWriter fileWriter;
@InjectMocks
private ReadmeWriter readmeWriter; private ReadmeWriter readmeWriter;
private RulesProperties rulesProperties;
@Mock @Mock
private RuleReadmeLoader ruleReadmeLoader; private Path templatePath;
@Mock @Mock
private ReadmeIndexBuilder indexBuilder; private Path outputPath;
private String templateBody = UUID.randomUUID().toString();
private Path readme; private String formattedOutput = UUID.randomUUID().toString();
@org.junit.Rule
public TemporaryFolder folder = new TemporaryFolder();
@Before @Before
public void setUp() throws Exception { public void setUp() throws IOException {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
final Path template = folder.newFile("README-template.md")
.toPath();
Files.write(template, Arrays.asList("i:%s", "ce:%s", "se:%s", "cd:%s", "sd:%s"));
final TemplateProperties templateProperties = new TemplateProperties();
templateProperties.setReadmeTemplate(template);
final Path fragments = folder.newFolder("fragments")
.toPath();
templateProperties.setReadmeFragments(fragments);
final OutputProperties outputProperties = new OutputProperties();
readme = folder.newFile("README.md")
.toPath();
outputProperties.setReadme(readme);
rulesProperties = new RulesProperties();
readmeWriter = readmeWriter =
new ReadmeWriter(templateProperties, outputProperties, rulesProperties, ruleReadmeLoader, indexBuilder); new ReadmeWriter(templateProperties, outputProperties,
readmeBuilder, fileReader, fileWriter);
templateProperties.setReadmeTemplate(templatePath);
outputProperties.setReadme(outputPath);
given(fileReader.read(templatePath))
.willReturn(templateBody);
given(readmeBuilder.build(templateBody))
.willReturn(formattedOutput);
} }
@Test @Test
public void createReadme() throws Exception { public void readAndWrite() throws Exception {
//given
val expected = Arrays.asList("i:index", "ce:checkstyle-enabled", "se:sevntu-enabled", "cd:checkstyle-disabled",
"sd:sevntu-disabled"
);
val rules = rulesProperties.getRules();
final Rule checkstyleEnabled = rule(RuleSource.CHECKSTYLE, true, "checkstyle enabled");
final Rule checkstyleDisabled = rule(RuleSource.CHECKSTYLE, false, "checkstyle disabled");
final Rule sevntuEnabled = rule(RuleSource.SEVNTU, true, "sevntu enabled");
final Rule sevntuDisabled = rule(RuleSource.SEVNTU, false, "sevntu disabled");
rules.add(checkstyleEnabled);
rules.add(checkstyleDisabled);
rules.add(sevntuEnabled);
rules.add(sevntuDisabled);
given(indexBuilder.build()).willReturn("index");
given(ruleReadmeLoader.load(checkstyleEnabled)).willReturn(Stream.of("checkstyle-enabled"));
given(ruleReadmeLoader.load(checkstyleDisabled)).willReturn(Stream.of("checkstyle-disabled"));
given(ruleReadmeLoader.load(sevntuEnabled)).willReturn(Stream.of("sevntu-enabled"));
given(ruleReadmeLoader.load(sevntuDisabled)).willReturn(Stream.of("sevntu-disabled"));
//when //when
readmeWriter.run(); readmeWriter.run();
//then //then
final Stream<String> lines = Files.lines(readme, StandardCharsets.UTF_8); verify(fileWriter).write(outputPath, formattedOutput);
assertThat(lines).containsExactlyElementsOf(expected);
} }
private Rule rule(final RuleSource source, final boolean enabled, final String name) {
val rule = new Rule();
rule.setName(name);
rule.setSource(source);
rule.setEnabled(enabled);
return rule;
}
@Test
public void rulesAreAlphabetical() throws Exception {
//given
val expected = Arrays.asList("ce:alpha", "beta", "delta");
val rules = rulesProperties.getRules();
final Rule alpha = rule(RuleSource.CHECKSTYLE, true, "alpha");
final Rule beta = rule(RuleSource.CHECKSTYLE, true, "beta");
final Rule delta = rule(RuleSource.CHECKSTYLE, true, "delta");
rules.add(alpha);
rules.add(delta);
rules.add(beta);
given(indexBuilder.build()).willReturn("index");
given(ruleReadmeLoader.load(alpha)).willReturn(Stream.of(alpha.getName()));
given(ruleReadmeLoader.load(beta)).willReturn(Stream.of(beta.getName()));
given(ruleReadmeLoader.load(delta)).willReturn(Stream.of(delta.getName()));
//when
readmeWriter.run();
//then
final Stream<String> lines = Files.lines(readme, StandardCharsets.UTF_8);
assertThat(lines).containsSequence(expected);
}
} }

View file

@ -0,0 +1,130 @@
package net.kemitix.checkstyle.ruleset.builder;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
public class RuleLoaderTest {
private RulesProperties ruleProperties = new RulesProperties();
@Mock
private RuleReadmeLoader ruleReadmeLoader;
private SourcesProperties sourcesProperties = new SourcesProperties();
private RuleLoader ruleLoader;
List<RuleSource> ruleSources = sourcesProperties.getSources();
private List<Rule> rules = ruleProperties.getRules();
private RuleSource enabledRuleSource;
private String enabledRuleSourceName = "enabled-" + UUID.randomUUID().toString();
private String enabledRuleSourcePackage = "enabled-" + UUID.randomUUID().toString();
private RuleSource disabledRuleSource;
private String disabledRuleSourceName = "disabled-" + UUID.randomUUID().toString();
private String disabledRuleSourcePackage = "disabled-" + UUID.randomUUID().toString();
private Rule enabledRule = new Rule();
private List<String> enabledRuleLines = new ArrayList<>();
private String enabledRuleLineOne = "enabled-1-" + UUID.randomUUID().toString();
private String enabledRuleLineTwo = "enabled-2-" + UUID.randomUUID().toString();
private String enabledRuleFormatted =
enabledRuleLineOne + "\n" +
enabledRuleLineTwo;
private Rule disabledRule = new Rule();
private List<String> disabledRuleLines = new ArrayList<>();
private String disabledRuleLineOne = "disabled-1-" + UUID.randomUUID().toString();
private String disabledRuleLineTwo = "disabled-2-" + UUID.randomUUID().toString();
private String disabledRuleFormatted =
disabledRuleLineOne + "\n" +
disabledRuleLineTwo;
private String enabledRuleName = "enabled-" + UUID.randomUUID().toString();
private String disabledRuleName = "disabled-" + UUID.randomUUID().toString();
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
ruleLoader =
new RuleLoader(
ruleProperties,
ruleReadmeLoader,
sourcesProperties);
enabledRule.setEnabled(true);
enabledRule.setName(enabledRuleName);
disabledRule.setEnabled(false);
disabledRule.setName(disabledRuleName);
enabledRuleSource = RuleSourceMother.create(
enabledRuleSourceName,
true,
enabledRuleSourcePackage);
ruleSources.add(enabledRuleSource);
rules.add(enabledRule);
enabledRuleLines.add(enabledRuleLineOne);
enabledRuleLines.add(enabledRuleLineTwo);
given(ruleReadmeLoader.load(enabledRule))
.willReturn(enabledRuleLines.stream());
disabledRuleSource = RuleSourceMother.create(
disabledRuleSourceName,
false,
disabledRuleSourcePackage);
ruleSources.add(disabledRuleSource);
rules.add(disabledRule);
disabledRuleLines.add(disabledRuleLineOne);
disabledRuleLines.add(disabledRuleLineTwo);
given(ruleReadmeLoader.load(disabledRule))
.willReturn(disabledRuleLines.stream());
}
@Test
public void enabledForEnabledSource() {
//given
enabledRule.setSource(enabledRuleSourceName);
disabledRule.setSource(enabledRuleSourceName);
//when
String result = ruleLoader.loadEnabled(enabledRuleSourceName);
//then
assertThat(result).contains(enabledRuleFormatted);
}
@Test
public void enabledForDisabledSource() {
//given
enabledRule.setSource(disabledRuleSourceName);
disabledRule.setSource(disabledRuleSourceName);
//when
String result = ruleLoader.loadEnabled(disabledRuleSourceName);
//then
assertThat(result).isEmpty();
}
@Test
public void disabledForEnabledSource() {
//given
enabledRule.setSource(enabledRuleSourceName);
disabledRule.setSource(enabledRuleSourceName);
//when
String result = ruleLoader.loadDisabled(enabledRuleSourceName);
//then
assertThat(result).contains(disabledRuleFormatted);
}
@Test
public void disabledForDisabledSource() {
//given
enabledRule.setSource(disabledRuleSourceName);
disabledRule.setSource(disabledRuleSourceName);
//when
String result = ruleLoader.loadDisabled(disabledRuleSourceName);
//then
assertThat(result)
.contains(enabledRuleFormatted)
.contains(disabledRuleFormatted);
}
}

View file

@ -0,0 +1,34 @@
package net.kemitix.checkstyle.ruleset.builder;
import java.util.Arrays;
import java.util.List;
import java.util.function.Supplier;
public class RuleSourceMother {
public static Supplier<RuleSource> checkstyle = () ->
RuleSourceMother.create(
"checkstyle",
true,
"com.puppycrawl.tools.checkstyle");
public static Supplier<RuleSource> sevntu = () ->
RuleSourceMother.create(
"sevntu",
true,
"com.github.sevntu.checkstyle.checks");
public static Supplier<List<RuleSource>> list = () ->
Arrays.asList(
checkstyle.get(),
sevntu.get()
);
public static RuleSource create(String name, boolean enabled, String basePackage) {
RuleSource ruleSource = new RuleSource();
ruleSource.setName(name);
ruleSource.setEnabled(enabled);
ruleSource.setBasePackage(basePackage);
return ruleSource;
}
}

View file

@ -1,9 +1,9 @@
package net.kemitix.checkstyle.ruleset.builder; package net.kemitix.checkstyle.ruleset.builder;
import lombok.val;
import org.junit.Test; import org.junit.Test;
import java.util.Arrays; import java.util.Random;
import java.util.UUID;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
@ -14,32 +14,18 @@ import static org.assertj.core.api.Assertions.assertThat;
*/ */
public class RuleSourceTest { public class RuleSourceTest {
@Test private String name = UUID.randomUUID().toString();
public void valueOf() throws Exception { private String basePackage = UUID.randomUUID().toString();
assertThat(RuleSource.valueOf("CHECKSTYLE")).isEqualTo(RuleSource.CHECKSTYLE); private boolean enabled = new Random().nextBoolean();
assertThat(RuleSource.valueOf("SEVNTU")).isEqualTo(RuleSource.SEVNTU);
}
@Test @Test
public void values() throws Exception { public void create() {
//given //given
val expected = Arrays.asList("CHECKSTYLE", "SEVNTU"); RuleSource ruleSource = RuleSourceMother.create(name, enabled, basePackage);
//when
val values = Arrays.stream(RuleSource.values())
.map(RuleSource::toString);
//then //then
assertThat(values).containsExactlyElementsOf(expected); assertThat(ruleSource.getName()).isEqualTo(name);
assertThat(ruleSource.getBasePackage()).isEqualTo(basePackage);
assertThat(ruleSource.isEnabled()).isEqualTo(enabled);
} }
@Test
public void basePackages() {
//given
final String puppycrawl = "puppycrawl";
final String sevntu = "sevntu";
//then
assertThat(RuleSource.CHECKSTYLE.getBasePackage()).contains(puppycrawl)
.doesNotContain(sevntu);
assertThat(RuleSource.SEVNTU.getBasePackage()).contains(sevntu)
.doesNotContain(puppycrawl);
}
} }

View file

@ -4,6 +4,7 @@ import lombok.val;
import org.assertj.core.api.SoftAssertions; import org.assertj.core.api.SoftAssertions;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.Mock;
import java.net.URI; import java.net.URI;
@ -16,6 +17,8 @@ public class RuleTest {
private Rule rule; private Rule rule;
private RuleSource ruleSource = RuleSourceMother.checkstyle.get();
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
rule = new Rule(); rule = new Rule();
@ -27,7 +30,6 @@ public class RuleTest {
val name = "name"; val name = "name";
val parent = RuleParent.TREEWALKER; val parent = RuleParent.TREEWALKER;
val level = RuleLevel.LAYOUT; val level = RuleLevel.LAYOUT;
val source = RuleSource.CHECKSTYLE;
val enabled = true; val enabled = true;
val insuppressible = true; val insuppressible = true;
val uri = URI.create("rule://name.md"); val uri = URI.create("rule://name.md");
@ -38,7 +40,7 @@ public class RuleTest {
rule.setName(name); rule.setName(name);
rule.setParent(parent); rule.setParent(parent);
rule.setLevel(level); rule.setLevel(level);
rule.setSource(source); rule.setSource(ruleSource.getName());
rule.setEnabled(enabled); rule.setEnabled(enabled);
rule.setInsuppressible(insuppressible); rule.setInsuppressible(insuppressible);
rule.setUri(uri); rule.setUri(uri);
@ -58,7 +60,7 @@ public class RuleTest {
.isEqualTo(level); .isEqualTo(level);
softly.assertThat(rule.getSource()) softly.assertThat(rule.getSource())
.as("set/getSource()") .as("set/getSource()")
.isEqualTo(source); .isEqualTo(ruleSource.getName());
softly.assertThat(rule.isEnabled()) softly.assertThat(rule.isEnabled())
.as("set/isEnabled()") .as("set/isEnabled()")
.isEqualTo(enabled); .isEqualTo(enabled);

View file

@ -0,0 +1,31 @@
package net.kemitix.checkstyle.ruleset.builder;
import org.junit.Before;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
public class SourcesPropertiesTest {
private SourcesProperties sourcesProperties;
@Before
public void setUp() {
sourcesProperties = new SourcesProperties();
}
@Test
public void getEmpty() {
assertThat(sourcesProperties.getSources()).isEmpty();
}
@Test
public void getContent() {
//given
final RuleSource source =
RuleSourceMother.create("name", true, "package");
//when
sourcesProperties.getSources().add(source);
//then
assertThat(sourcesProperties.getSources()).containsExactly(source);
}
}

View file

@ -9,6 +9,9 @@
<property name="match" value="true"/> <property name="match" value="true"/>
</module> </module>
<module name="com.puppycrawl.tools.checkstyle.checks.whitespace.FileTabCharacterCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.FileTabCharacterCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.sizes.LineLengthCheck">
<property name="max" value="120"/>
</module>
<module name="com.puppycrawl.tools.checkstyle.checks.NewlineAtEndOfFileCheck"> <module name="com.puppycrawl.tools.checkstyle.checks.NewlineAtEndOfFileCheck">
<property name="lineSeparator" value="lf"/> <property name="lineSeparator" value="lf"/>
</module> </module>
@ -25,9 +28,6 @@
<module name="com.puppycrawl.tools.checkstyle.checks.coding.EmptyStatementCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.coding.EmptyStatementCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.whitespace.GenericWhitespaceCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.GenericWhitespaceCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.blocks.LeftCurlyCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.blocks.LeftCurlyCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.sizes.LineLengthCheck">
<property name="max" value="120"/>
</module>
<module name="com.puppycrawl.tools.checkstyle.checks.whitespace.MethodParamPadCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.MethodParamPadCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.whitespace.NoLineWrapCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.NoLineWrapCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.whitespace.NoWhitespaceAfterCheck"> <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.NoWhitespaceAfterCheck">
@ -52,8 +52,6 @@
<module name="com.puppycrawl.tools.checkstyle.checks.UpperEllCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.UpperEllCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.whitespace.WhitespaceAfterCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.WhitespaceAfterCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.whitespace.WhitespaceAroundCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.WhitespaceAroundCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.ForbidCCommentsInMethodsCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.WhitespaceBeforeArrayInitializerCheck"/>
</module><!-- /TreeWalker --> </module><!-- /TreeWalker -->

View file

@ -9,6 +9,9 @@
<property name="match" value="true"/> <property name="match" value="true"/>
</module> </module>
<module name="com.puppycrawl.tools.checkstyle.checks.whitespace.FileTabCharacterCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.FileTabCharacterCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.sizes.LineLengthCheck">
<property name="max" value="120"/>
</module>
<module name="com.puppycrawl.tools.checkstyle.checks.NewlineAtEndOfFileCheck"> <module name="com.puppycrawl.tools.checkstyle.checks.NewlineAtEndOfFileCheck">
<property name="lineSeparator" value="lf"/> <property name="lineSeparator" value="lf"/>
</module> </module>
@ -32,9 +35,6 @@
<module name="com.puppycrawl.tools.checkstyle.checks.naming.InterfaceTypeParameterNameCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.naming.InterfaceTypeParameterNameCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.naming.LambdaParameterNameCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.naming.LambdaParameterNameCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.blocks.LeftCurlyCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.blocks.LeftCurlyCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.sizes.LineLengthCheck">
<property name="max" value="120"/>
</module>
<module name="com.puppycrawl.tools.checkstyle.checks.naming.LocalFinalVariableNameCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.naming.LocalFinalVariableNameCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.naming.LocalVariableNameCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.naming.LocalVariableNameCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.coding.MagicNumberCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.coding.MagicNumberCheck"/>
@ -79,12 +79,6 @@
<module name="com.puppycrawl.tools.checkstyle.checks.UpperEllCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.UpperEllCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.whitespace.WhitespaceAfterCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.WhitespaceAfterCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.whitespace.WhitespaceAroundCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.WhitespaceAroundCheck"/>
<module name="com.github.sevntu.checkstyle.checks.naming.EnumValueNameCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.ForbidCCommentsInMethodsCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.NameConventionForJunit4TestClassesCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.NumericLiteralNeedsUnderscoreCheck"/>
<module name="com.github.sevntu.checkstyle.checks.naming.UniformEnumConstantNameCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.WhitespaceBeforeArrayInitializerCheck"/>
</module><!-- /TreeWalker --> </module><!-- /TreeWalker -->

View file

@ -10,6 +10,9 @@
</module> </module>
<module name="com.puppycrawl.tools.checkstyle.checks.whitespace.FileTabCharacterCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.FileTabCharacterCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocPackageCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocPackageCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.sizes.LineLengthCheck">
<property name="max" value="120"/>
</module>
<module name="com.puppycrawl.tools.checkstyle.checks.NewlineAtEndOfFileCheck"> <module name="com.puppycrawl.tools.checkstyle.checks.NewlineAtEndOfFileCheck">
<property name="lineSeparator" value="lf"/> <property name="lineSeparator" value="lf"/>
</module> </module>
@ -42,9 +45,6 @@
<module name="com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocTypeCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocTypeCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.naming.LambdaParameterNameCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.naming.LambdaParameterNameCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.blocks.LeftCurlyCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.blocks.LeftCurlyCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.sizes.LineLengthCheck">
<property name="max" value="120"/>
</module>
<module name="com.puppycrawl.tools.checkstyle.checks.naming.LocalFinalVariableNameCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.naming.LocalFinalVariableNameCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.naming.LocalVariableNameCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.naming.LocalVariableNameCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.coding.MagicNumberCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.coding.MagicNumberCheck"/>
@ -98,12 +98,6 @@
<module name="com.puppycrawl.tools.checkstyle.checks.UpperEllCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.UpperEllCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.whitespace.WhitespaceAfterCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.WhitespaceAfterCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.whitespace.WhitespaceAroundCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.WhitespaceAroundCheck"/>
<module name="com.github.sevntu.checkstyle.checks.naming.EnumValueNameCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.ForbidCCommentsInMethodsCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.NameConventionForJunit4TestClassesCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.NumericLiteralNeedsUnderscoreCheck"/>
<module name="com.github.sevntu.checkstyle.checks.naming.UniformEnumConstantNameCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.WhitespaceBeforeArrayInitializerCheck"/>
</module><!-- /TreeWalker --> </module><!-- /TreeWalker -->

View file

@ -10,6 +10,9 @@
</module> </module>
<module name="com.puppycrawl.tools.checkstyle.checks.whitespace.FileTabCharacterCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.FileTabCharacterCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocPackageCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocPackageCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.sizes.LineLengthCheck">
<property name="max" value="120"/>
</module>
<module name="com.puppycrawl.tools.checkstyle.checks.NewlineAtEndOfFileCheck"> <module name="com.puppycrawl.tools.checkstyle.checks.NewlineAtEndOfFileCheck">
<property name="lineSeparator" value="lf"/> <property name="lineSeparator" value="lf"/>
</module> </module>
@ -70,9 +73,6 @@
<module name="com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocTypeCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocTypeCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.naming.LambdaParameterNameCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.naming.LambdaParameterNameCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.blocks.LeftCurlyCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.blocks.LeftCurlyCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.sizes.LineLengthCheck">
<property name="max" value="120"/>
</module>
<module name="com.puppycrawl.tools.checkstyle.checks.naming.LocalFinalVariableNameCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.naming.LocalFinalVariableNameCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.naming.LocalVariableNameCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.naming.LocalVariableNameCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.coding.MagicNumberCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.coding.MagicNumberCheck"/>
@ -142,32 +142,6 @@
<module name="com.puppycrawl.tools.checkstyle.checks.design.VisibilityModifierCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.design.VisibilityModifierCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.whitespace.WhitespaceAfterCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.WhitespaceAfterCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.whitespace.WhitespaceAroundCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.WhitespaceAroundCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.AvoidConstantAsFirstOperandInConditionCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.AvoidHidingCauseExceptionCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.AvoidNotShortCircuitOperatorsForBooleanCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.DiamondOperatorForVariableDefinitionCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.EitherLogOrThrowCheck"/>
<module name="com.github.sevntu.checkstyle.checks.naming.EnumValueNameCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.ForbidCCommentsInMethodsCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.LogicConditionNeedOptimizationCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.NameConventionForJunit4TestClassesCheck"/>
<module name="com.github.sevntu.checkstyle.checks.design.NoMainMethodInAbstractClassCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.NumericLiteralNeedsUnderscoreCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.OverridableMethodInConstructorCheck"/>
<module name="com.github.sevntu.checkstyle.checks.design.PublicReferenceToPrivateTypeCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.RedundantReturnCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.ReturnBooleanFromTernaryCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.ReturnNullInsteadOfBooleanCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.SingleBreakOrContinueCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.TernaryPerExpressionCountCheck"/>
<module name="com.github.sevntu.checkstyle.checks.naming.UniformEnumConstantNameCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.UselessSingleCatchCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.UselessSuperCtorCallCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.AvoidDefaultSerializableInInnerClassesCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.EmptyPublicCtorInClassCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.FinalizeImplementationCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.WhitespaceBeforeArrayInitializerCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.MoveVariableInsideIfCheck"/>
</module><!-- /TreeWalker --> </module><!-- /TreeWalker -->

View file

@ -13,6 +13,9 @@
</module> </module>
<module name="com.puppycrawl.tools.checkstyle.checks.whitespace.FileTabCharacterCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.FileTabCharacterCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocPackageCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocPackageCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.sizes.LineLengthCheck">
<property name="max" value="120"/>
</module>
<module name="com.puppycrawl.tools.checkstyle.checks.NewlineAtEndOfFileCheck"> <module name="com.puppycrawl.tools.checkstyle.checks.NewlineAtEndOfFileCheck">
<property name="lineSeparator" value="lf"/> <property name="lineSeparator" value="lf"/>
</module> </module>
@ -95,9 +98,6 @@
</module> </module>
<module name="com.puppycrawl.tools.checkstyle.checks.naming.LambdaParameterNameCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.naming.LambdaParameterNameCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.blocks.LeftCurlyCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.blocks.LeftCurlyCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.sizes.LineLengthCheck">
<property name="max" value="120"/>
</module>
<module name="com.puppycrawl.tools.checkstyle.checks.naming.LocalFinalVariableNameCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.naming.LocalFinalVariableNameCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.naming.LocalVariableNameCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.naming.LocalVariableNameCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.coding.MagicNumberCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.coding.MagicNumberCheck"/>
@ -188,38 +188,6 @@
<module name="com.puppycrawl.tools.checkstyle.checks.design.VisibilityModifierCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.design.VisibilityModifierCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.whitespace.WhitespaceAfterCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.WhitespaceAfterCheck"/>
<module name="com.puppycrawl.tools.checkstyle.checks.whitespace.WhitespaceAroundCheck"/> <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.WhitespaceAroundCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.AvoidConstantAsFirstOperandInConditionCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.AvoidHidingCauseExceptionCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.AvoidNotShortCircuitOperatorsForBooleanCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.ConfusingConditionCheck"/>
<module name="com.github.sevntu.checkstyle.checks.design.ConstructorWithoutParamsCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.DiamondOperatorForVariableDefinitionCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.EitherLogOrThrowCheck"/>
<module name="com.github.sevntu.checkstyle.checks.naming.EnumValueNameCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.ForbidCCommentsInMethodsCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.ForbidReturnInFinallyBlockCheck"/>
<module name="com.github.sevntu.checkstyle.checks.design.ForbidWildcardAsReturnTypeCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.LogicConditionNeedOptimizationCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.MapIterationInForEachLoopCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.NameConventionForJunit4TestClassesCheck"/>
<module name="com.github.sevntu.checkstyle.checks.design.NestedSwitchCheck"/>
<module name="com.github.sevntu.checkstyle.checks.design.NoMainMethodInAbstractClassCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.NumericLiteralNeedsUnderscoreCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.OverridableMethodInConstructorCheck"/>
<module name="com.github.sevntu.checkstyle.checks.design.PublicReferenceToPrivateTypeCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.RedundantReturnCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.ReturnBooleanFromTernaryCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.ReturnNullInsteadOfBooleanCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.SingleBreakOrContinueCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.TernaryPerExpressionCountCheck"/>
<module name="com.github.sevntu.checkstyle.checks.naming.UniformEnumConstantNameCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.UselessSingleCatchCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.UselessSuperCtorCallCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.AvoidDefaultSerializableInInnerClassesCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.EmptyPublicCtorInClassCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.FinalizeImplementationCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.WhitespaceBeforeArrayInitializerCheck"/>
<module name="com.github.sevntu.checkstyle.checks.coding.MoveVariableInsideIfCheck"/>
</module><!-- /TreeWalker --> </module><!-- /TreeWalker -->