aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Christopher Vogt <oss.nsp@cvogt.org>2017-04-04 19:31:10 -0400
committerGitHub <noreply@github.com>2017-04-04 19:31:10 -0400
commit965095f8cf68707b6d164633baa858eb7ac33b4c (patch)
tree0b93fc663824a04ab360cbc61a52a3c414145fd4
parent439190b6bf46ccb971c0ec708da38d437f2e331d (diff)
parentfced15a610eaee443ae83be0cdb78975b1f19bbb (diff)
downloadcbt-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.scala7
-rw-r--r--examples/scalastyle/build/build/build.scala5
-rw-r--r--examples/scalastyle/scalastyle-config.xml4
-rw-r--r--examples/scalastyle/src/Main.scala5
-rw-r--r--plugins/scalastyle/Scalastyle.scala80
-rw-r--r--plugins/scalastyle/build/build.scala12
-rw-r--r--plugins/scalastyle/resources/scalastyle-config.xml141
-rw-r--r--stage2/plugins.scala1
-rw-r--r--test/test.scala9
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)