diff options
author | Jan Christopher Vogt <oss.nsp@cvogt.org> | 2017-04-04 19:31:10 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-04 19:31:10 -0400 |
commit | 965095f8cf68707b6d164633baa858eb7ac33b4c (patch) | |
tree | 0b93fc663824a04ab360cbc61a52a3c414145fd4 | |
parent | 439190b6bf46ccb971c0ec708da38d437f2e331d (diff) | |
parent | fced15a610eaee443ae83be0cdb78975b1f19bbb (diff) | |
download | cbt-965095f8cf68707b6d164633baa858eb7ac33b4c.tar.gz cbt-965095f8cf68707b6d164633baa858eb7ac33b4c.tar.bz2 cbt-965095f8cf68707b6d164633baa858eb7ac33b4c.zip |
Merge pull request #479 from cvogt/scalastyle
Add Scalastyle plugin
-rw-r--r-- | examples/scalastyle/build/build.scala | 7 | ||||
-rw-r--r-- | examples/scalastyle/build/build/build.scala | 5 | ||||
-rw-r--r-- | examples/scalastyle/scalastyle-config.xml | 4 | ||||
-rw-r--r-- | examples/scalastyle/src/Main.scala | 5 | ||||
-rw-r--r-- | plugins/scalastyle/Scalastyle.scala | 80 | ||||
-rw-r--r-- | plugins/scalastyle/build/build.scala | 12 | ||||
-rw-r--r-- | plugins/scalastyle/resources/scalastyle-config.xml | 141 | ||||
-rw-r--r-- | stage2/plugins.scala | 1 | ||||
-rw-r--r-- | test/test.scala | 9 |
9 files changed, 263 insertions, 1 deletions
diff --git a/examples/scalastyle/build/build.scala b/examples/scalastyle/build/build.scala new file mode 100644 index 0000000..95567bd --- /dev/null +++ b/examples/scalastyle/build/build.scala @@ -0,0 +1,7 @@ +import cbt._ + +class Build(val context: Context) extends BaseBuild with Scalastyle{ + override def scalastyle = super.scalastyle.copy( + Scalastyle.readConfigFromXml( projectDirectory / "scalastyle-config.xml" ) + ) +} diff --git a/examples/scalastyle/build/build/build.scala b/examples/scalastyle/build/build/build.scala new file mode 100644 index 0000000..f766502 --- /dev/null +++ b/examples/scalastyle/build/build/build.scala @@ -0,0 +1,5 @@ +import cbt._ + +class Build(val context: Context) extends BuildBuild { + override def dependencies = super.dependencies :+ plugins.scalastyle +} diff --git a/examples/scalastyle/scalastyle-config.xml b/examples/scalastyle/scalastyle-config.xml new file mode 100644 index 0000000..4b53ad2 --- /dev/null +++ b/examples/scalastyle/scalastyle-config.xml @@ -0,0 +1,4 @@ +<scalastyle commentFilter="enabled"> + <name>CBT Scalastyle example configuration</name> + <check enabled="true" class="org.scalastyle.file.FileTabChecker" level="warning"/> +</scalastyle> diff --git a/examples/scalastyle/src/Main.scala b/examples/scalastyle/src/Main.scala new file mode 100644 index 0000000..774ec2a --- /dev/null +++ b/examples/scalastyle/src/Main.scala @@ -0,0 +1,5 @@ +object Main { + def main(args: Array[String]): Unit = { + // <- tab here + } +} diff --git a/plugins/scalastyle/Scalastyle.scala b/plugins/scalastyle/Scalastyle.scala new file mode 100644 index 0000000..112d45f --- /dev/null +++ b/plugins/scalastyle/Scalastyle.scala @@ -0,0 +1,80 @@ +package cbt + +import java.io.File +import java.util.Date +import scala.io.Codec +import com.typesafe.config.ConfigFactory + +import org.scalastyle._ + +trait Scalastyle extends Plugin { + def scalastyle = Scalastyle.apply( lib ).config( Scalastyle.defaultConfig, sourceFiles, getClass.getClassLoader ) +} + +object Scalastyle { + def readConfigFromXml( file: File ) = ScalastyleConfiguration.readFromXml( file.string ) + def defaultConfig = + ScalastyleConfiguration.readFromXml( + Option( getClass.getClassLoader.getResource("scalastyle-config.xml") ) + .getOrElse( throw new Exception("scalastyle-config.xml not found in resources") + ).getPath + ) + + case class apply( lib: Lib ){ + /** @param classLoader able to load the Checker classes */ + case class config( + scalastyleConfig: ScalastyleConfiguration, + files: Seq[File], + classLoader: ClassLoader/*, + xmlOutput: Option[File] = None, + logLevel: Option[Level] = Some( InfoLevel )*/ + ){ + def apply: ExitCode = output( messages ) + + + def messages = + new ScalastyleChecker( Some( classLoader ) ) + .checkFiles( scalastyleConfig, Directory.getFiles( None, files ) ) + + def output( messages: List[Message[_]] ) = { + val messageHelper = new MessageHelper( ConfigFactory.load( classLoader ) ) + + def fileLineColumn( file: FileSpec, line: Option[Int], column: Option[Int] ) = + file.name ~ line.map( ":" ~ _.toString ~ column.map( ":" ~ _.toString ).getOrElse( "" ) ).getOrElse("") + + val errors = messages.map(x => x:AnyRef).collect{ + case s@StyleError( + file, cls, key, level, args, line, column, customMessage + ) => ( + fileLineColumn( file, line, column ) ~ ": [" ~ cls.getSimpleName ~ "] " + ~ Output.findMessage( messageHelper, key, args, customMessage ) + ) + case s@StyleException(file, cls, message, stacktrace, line, column) => + fileLineColumn( file, line, column ) ~ ": " ~ cls.map( "[" ~ _.getSimpleName ~ "] " ).getOrElse( "" ) ~ message ~ "\n" ~ stacktrace + } + + if( errors.nonEmpty ){ + System.err.println( + lib.red( "Scalastyle linting errors found\n" ) + errors.mkString("\n") + ) + ExitCode.Failure + } else { + ExitCode.Success + } + + /* + xmlOutput.foreach( + XmlOutput.save(config, _, encoding, messages) + ) + + if (!mc.quiet) println("Processed " + outputResult.files + " file(s)") + if (!mc.quiet) println("Found " + outputResult.errors + " errors") + if (!mc.quiet) println("Found " + outputResult.warnings + " warnings") + if (!mc.quiet) println("Finished in " + (now - start) + " ms") + + outputResult.errors > 0 || (mc.warningsaserrors && outputResult.warnings > 0) + */ + } + } + } +}
\ No newline at end of file diff --git a/plugins/scalastyle/build/build.scala b/plugins/scalastyle/build/build.scala new file mode 100644 index 0000000..1922942 --- /dev/null +++ b/plugins/scalastyle/build/build.scala @@ -0,0 +1,12 @@ +import cbt._ + +class Build(val context: Context) extends Plugin { + private val scalaStyleVersion = "0.8.0" + + override def dependencies = ( + super.dependencies ++ + Resolver( mavenCentral ).bind( + ScalaDependency( "org.scalastyle", "scalastyle", scalaStyleVersion ) + ) + ) +} diff --git a/plugins/scalastyle/resources/scalastyle-config.xml b/plugins/scalastyle/resources/scalastyle-config.xml new file mode 100644 index 0000000..e0c56fd --- /dev/null +++ b/plugins/scalastyle/resources/scalastyle-config.xml @@ -0,0 +1,141 @@ +<scalastyle commentFilter="enabled"> + <name>Scalastyle standard configuration</name> + <check level="warning" class="org.scalastyle.file.FileTabChecker" enabled="true"></check> + <check level="warning" class="org.scalastyle.file.FileLengthChecker" enabled="true"> + <parameters> + <parameter name="maxFileLength"><![CDATA[800]]></parameter> + </parameters> + </check> + <check level="warning" class="org.scalastyle.file.HeaderMatchesChecker" enabled="true"> + <parameters> + <parameter name="header"><![CDATA[// Copyright (C) 2011-2012 the original author or authors. +// See the LICENCE.txt file distributed with this work for additional +// information regarding copyright ownership. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License.]]></parameter> + </parameters> + </check> + <check level="warning" class="org.scalastyle.scalariform.SpacesAfterPlusChecker" enabled="true"></check> + <check level="warning" class="org.scalastyle.file.WhitespaceEndOfLineChecker" enabled="true"> + <parameters> + <parameter name="ignoreWhitespaceLines"><![CDATA[false]]></parameter> + </parameters> + </check> + <check level="warning" class="org.scalastyle.scalariform.SpacesBeforePlusChecker" enabled="true"></check> + <check level="warning" class="org.scalastyle.file.FileLineLengthChecker" enabled="true"> + <parameters> + <parameter name="maxLineLength"><![CDATA[160]]></parameter> + <parameter name="tabSize"><![CDATA[4]]></parameter> + </parameters> + </check> + <check level="warning" class="org.scalastyle.scalariform.ClassNamesChecker" enabled="true"> + <parameters> + <parameter name="regex"><![CDATA[[A-Z][A-Za-z]*]]></parameter> + </parameters> + </check> + <check level="warning" class="org.scalastyle.scalariform.ObjectNamesChecker" enabled="true"> + <parameters> + <parameter name="regex"><![CDATA[[A-Z][A-Za-z]*]]></parameter> + </parameters> + </check> + <check level="warning" class="org.scalastyle.scalariform.PackageNamesChecker" enabled="true"> + <parameters> + <parameter name="regex"><![CDATA[^[a-z][A-Za-z]*$]]></parameter> + </parameters> + </check> + <check level="warning" class="org.scalastyle.scalariform.PackageObjectNamesChecker" enabled="true"> + <parameters> + <parameter name="regex"><![CDATA[^[a-z][A-Za-z]*$]]></parameter> + </parameters> + </check> + <check level="warning" class="org.scalastyle.scalariform.EqualsHashCodeChecker" enabled="true"></check> + <check level="warning" class="org.scalastyle.scalariform.IllegalImportsChecker" enabled="true"> + <parameters> + <parameter name="illegalImports"><![CDATA[sun._,java.awt._]]></parameter> + </parameters> + </check> + <check level="warning" class="org.scalastyle.scalariform.ParameterNumberChecker" enabled="true"> + <parameters> + <parameter name="maxParameters"><![CDATA[8]]></parameter> + </parameters> + </check> + <check level="warning" class="org.scalastyle.scalariform.MagicNumberChecker" enabled="true"> + <parameters> + <parameter name="ignore"><![CDATA[-1,0,1,2,3]]></parameter> + </parameters> + </check> + <check level="warning" class="org.scalastyle.scalariform.NoWhitespaceBeforeLeftBracketChecker" enabled="true"></check> + <check level="warning" class="org.scalastyle.scalariform.NoWhitespaceAfterLeftBracketChecker" enabled="true"></check> + <check level="warning" class="org.scalastyle.scalariform.ReturnChecker" enabled="true"></check> + <check level="warning" class="org.scalastyle.scalariform.NullChecker" enabled="true"></check> + <check level="warning" class="org.scalastyle.scalariform.NoCloneChecker" enabled="true"></check> + <check level="warning" class="org.scalastyle.scalariform.NoFinalizeChecker" enabled="true"></check> + <check level="warning" class="org.scalastyle.scalariform.CovariantEqualsChecker" enabled="true"></check> + <check level="warning" class="org.scalastyle.scalariform.StructuralTypeChecker" enabled="true"></check> + <check level="warning" class="org.scalastyle.file.RegexChecker" enabled="true"> + <parameters> + <parameter name="regex"><![CDATA[println]]></parameter> + <parameter name="line"><![CDATA[false]]></parameter> + </parameters> + </check> + <check level="warning" class="org.scalastyle.scalariform.NumberOfTypesChecker" enabled="true"> + <parameters> + <parameter name="maxTypes"><![CDATA[30]]></parameter> + </parameters> + </check> + <check level="warning" class="org.scalastyle.scalariform.CyclomaticComplexityChecker" enabled="true"> + <parameters> + <parameter name="maximum"><![CDATA[10]]></parameter> + </parameters> + </check> + <check level="warning" class="org.scalastyle.scalariform.UppercaseLChecker" enabled="true"></check> + <check level="warning" class="org.scalastyle.scalariform.SimplifyBooleanExpressionChecker" enabled="true"></check> + <check level="warning" class="org.scalastyle.scalariform.IfBraceChecker" enabled="true"> + <parameters> + <parameter name="singleLineAllowed"><![CDATA[true]]></parameter> + <parameter name="doubleLineAllowed"><![CDATA[false]]></parameter> + </parameters> + </check> + <check level="warning" class="org.scalastyle.scalariform.MethodLengthChecker" enabled="true"> + <parameters> + <parameter name="maxLength"><![CDATA[50]]></parameter> + </parameters> + </check> + <check level="warning" class="org.scalastyle.scalariform.MethodNamesChecker" enabled="true"> + <parameters> + <parameter name="regex"><![CDATA[^[a-z][A-Za-z0-9]*(_=)?$]]></parameter> + </parameters> + </check> + <check level="warning" class="org.scalastyle.scalariform.NumberOfMethodsInTypeChecker" enabled="true"> + <parameters> + <parameter name="maxMethods"><![CDATA[30]]></parameter> + </parameters> + </check> + <check level="warning" class="org.scalastyle.scalariform.PublicMethodsHaveTypeChecker" enabled="true"/> + <check level="warning" class="org.scalastyle.file.NewLineAtEofChecker" enabled="true"/> + <check level="warning" class="org.scalastyle.scalariform.NotImplementedErrorUsage" enabled="true" /> + <check level="warning" class="org.scalastyle.scalariform.BlockImportChecker" enabled="false"/> + <check level="warning" class="org.scalastyle.scalariform.ProcedureDefinitionChecker" enabled="true"/> + <check level="warning" class="org.scalastyle.scalariform.ForBraceChecker" enabled="true"/> + <check level="warning" class="org.scalastyle.scalariform.SpaceAfterCommentStartChecker" enabled="true"/> + <check level="warning" class="org.scalastyle.scalariform.FieldNamesChecker" enabled="true"> + <parameters> + <parameter name="regex"><![CDATA[^[a-z][A-Za-z]*$]]></parameter> + </parameters> + </check> + <check level="warning" class="org.scalastyle.scalariform.TodoCommentChecker" enabled="true"> + <parameters> + <parameter name="words"><![CDATA[TODO|FIXME]]></parameter> + </parameters> + </check> +</scalastyle> diff --git a/stage2/plugins.scala b/stage2/plugins.scala index d82740f..ea1aa74 100644 --- a/stage2/plugins.scala +++ b/stage2/plugins.scala @@ -16,6 +16,7 @@ class plugins( context: Context, scalaVersion: String ) { final lazy val scalaJs = plugin( "scalajs" ) final lazy val scalapb = plugin( "scalapb" ) final lazy val scalariform = plugin( "scalariform" ) + final lazy val scalastyle = plugin( "scalastyle" ) final lazy val sonatypeRelease = plugin( "sonatype-release" ) final lazy val uberJar = plugin( "uber-jar" ) final lazy val wartremover = plugin( "wartremover" ) diff --git a/test/test.scala b/test/test.scala index 0208637..74177c5 100644 --- a/test/test.scala +++ b/test/test.scala @@ -261,7 +261,7 @@ object Main{ compile("../examples/scalafmt-example") compile("../examples/scalariform-example") compile("../examples/scalatest-example") - compile("../examples/akka-example") + compile("../plugins/scalastyle") if(slow){ compile("../examples/scalajs-react-example/js") compile("../examples/scalajs-react-example/jvm") @@ -305,6 +305,13 @@ object Main{ } { + val res = runCbt("../examples/scalastyle", Seq("scalastyle")) + assert(!res.exit0) + assert(res.err contains "Line contains a tab", res.out ++ "\n" ++ res.err) + assert(res.out.isEmpty, res.out ++ "\n" ++ res.err) + } + + { val res = runCbt("../examples/scalapb-example", Seq("run")) assert(res.exit0) assert(res.out contains "age: 123", res.out ++ "\n--\n" ++ res.err) |