summaryrefslogtreecommitdiffstats
path: root/Scala/patmat/project/StyleChecker.scala
diff options
context:
space:
mode:
Diffstat (limited to 'Scala/patmat/project/StyleChecker.scala')
-rw-r--r--Scala/patmat/project/StyleChecker.scala77
1 files changed, 77 insertions, 0 deletions
diff --git a/Scala/patmat/project/StyleChecker.scala b/Scala/patmat/project/StyleChecker.scala
new file mode 100644
index 0000000..fbc1cdf
--- /dev/null
+++ b/Scala/patmat/project/StyleChecker.scala
@@ -0,0 +1,77 @@
+import sbt.File
+import java.io.ByteArrayOutputStream
+import java.io.PrintStream
+import org.scalastyle._
+
+object StyleChecker {
+ val maxResult = 100
+
+ class CustomTextOutput[T <: FileSpec]() extends Output[T] {
+ private val messageHelper = new MessageHelper(this.getClass().getClassLoader())
+
+ var fileCount: Int = _
+ override def message(m: Message[T]): Unit = m match {
+ case StartWork() =>
+ case EndWork() =>
+ case StartFile(file) =>
+ print("Checking file " + file + "...")
+ fileCount = 0
+ case EndFile(file) =>
+ if (fileCount == 0) println(" OK!")
+ case StyleError(file, clazz, key, level, args, line, column, customMessage) =>
+ report(line, column, messageHelper.text(level.name),
+ findMessage(messageHelper, clazz, key, args, customMessage))
+ case StyleException(file, clazz, message, stacktrace, line, column) =>
+ report(line, column, "error", message)
+ }
+
+ private def report(line: Option[Int], column: Option[Int], level: String, message: String) {
+ if (fileCount == 0) println("")
+ fileCount += 1
+ println(" " + fileCount + ". " + level + pos(line, column) + ":")
+ println(" " + message)
+ }
+
+ private def pos(line: Option[Int], column: Option[Int]): String = line match {
+ case Some(line) => " at line " + line + (column match {
+ case Some(column) => " character " + column
+ case None => ""
+ })
+ case None => ""
+ }
+ }
+
+ def score(outputResult: OutputResult) = {
+ val penalties = outputResult.errors + outputResult.warnings
+ scala.math.max(maxResult - penalties, 0)
+ }
+
+ def assess(allSources: Seq[File]): (String, Int) = {
+ val configFile = new File("project/scalastyle_config.xml").getAbsolutePath
+
+ val sources = allSources.filterNot{ f =>
+ val path = f.getAbsolutePath
+ path.contains("interpreter") ||
+ path.contains("simulations") ||
+ path.contains("fetchtweets")
+ }
+
+ val messages = new ScalastyleChecker().checkFiles(
+ ScalastyleConfiguration.readFromXml(configFile),
+ Directory.getFiles(sources : _*))
+
+ val output = new ByteArrayOutputStream()
+ val outputResult = Console.withOut(new PrintStream(output)) {
+ new CustomTextOutput().output(messages)
+ }
+
+ val msg =
+ output.toString +
+ "Processed " + outputResult.files + " file(s)\n" +
+ "Found " + outputResult.errors + " errors\n" +
+ "Found " + outputResult.warnings + " warnings\n" +
+ (if (outputResult.errors+outputResult.warnings > 0) "Consult the style guide at https://class.coursera.org/progfun-002/wiki/view?page=GradingPolicy" else "")
+
+ (msg, score(outputResult))
+ }
+}