From 7e41a11a57392aa34b37256912f275ede6fcc93a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20L=2E=20F=2E=20Pinto?= Date: Sun, 9 Oct 2016 01:34:30 -0300 Subject: [PATCH 1/4] ScalastyleConfiguration without XML Configuring `ScalastyleConfiguration` by hand in Scala instead of parsing the XML configuration file is "type-safer". This renames `scalastyleConfig` `settingKey[File]` to `scalastyleConfigFile` and creates a `scalastyleConfig` `settingKey[Option[ScalastyleConfiguration]]` that can be used in the `build.sbt` file. --- .../scala/org/scalastyle/sbt/Plugin.scala | 49 +++++++++++-------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/src/main/scala/org/scalastyle/sbt/Plugin.scala b/src/main/scala/org/scalastyle/sbt/Plugin.scala index ba93d37..cf3f5c1 100644 --- a/src/main/scala/org/scalastyle/sbt/Plugin.scala +++ b/src/main/scala/org/scalastyle/sbt/Plugin.scala @@ -65,7 +65,8 @@ object ScalastylePlugin extends Plugin { val scalastyleGenerateConfig = taskKey[Unit]("Generate a default configuration files for scalastyle") val scalastyleTarget = settingKey[File]("XML output file from scalastyle") - val scalastyleConfig = settingKey[File]("Scalastyle configuration file") + val scalastyleConfig = settingKey[Option[ScalastyleConfiguration]]("Scalastyle configuration object") + val scalastyleConfigFile = settingKey[File]("Scalastyle configuration file") val scalastyleConfigUrl = settingKey[Option[URL]]("Scalastyle configuration file as a URL") val scalastyleFailOnError = settingKey[Boolean]("If true, Scalastyle will fail the task when an error level rule is violated") val scalastyleConfigRefreshHours = settingKey[Integer]("How many hours until next run will fetch the scalastyle-config.xml again if location is a URI.") @@ -78,6 +79,7 @@ object ScalastylePlugin extends Plugin { val args: Seq[String] = spaceDelimited("").parsed val scalastyleSourcesV = scalastyleSources.value val configV = scalastyleConfig.value + val configFileV = scalastyleConfigFile.value val configUrlV = scalastyleConfigUrl.value val streamsV = streams.value val failOnErrorV = scalastyleFailOnError.value @@ -86,19 +88,21 @@ object ScalastylePlugin extends Plugin { val targetV = target.value val configCacheFileV = scalastyleConfigUrlCacheFile.value - Tasks.doScalastyle(args, configV, configUrlV, failOnErrorV, scalastyleSourcesV, scalastyleTargetV, streamsV, configRefreshHoursV, targetV, configCacheFileV) + Tasks.doScalastyle(args, configV, configFileV, configUrlV, failOnErrorV, scalastyleSourcesV, scalastyleTargetV, streamsV, configRefreshHoursV, targetV, configCacheFileV) }, scalastyleGenerateConfig := { val streamsValue = streams.value - val configValue = scalastyleConfig.value - Tasks.doGenerateConfig(configValue, streamsValue) + val configFileValue = scalastyleConfigFile.value + Tasks.doGenerateConfig(configFileValue, streamsValue) } ) override def projectSettings = Seq( - scalastyleConfig := file("scalastyle-config.xml"), - (scalastyleConfig in Test) := (scalastyleConfig in scalastyle).value, + scalastyleConfig := None, + (scalastyleConfig in Test) := None, + scalastyleConfigFile := file("scalastyle-config.xml"), + (scalastyleConfigFile in Test) := (scalastyleConfigFile in scalastyle).value, scalastyleConfigUrl := None, (scalastyleConfigUrl in Test) := None, scalastyleConfigUrlCacheFile := "scalastyle-config.xml", @@ -117,7 +121,7 @@ object ScalastylePlugin extends Plugin { } object Tasks { - def doScalastyle(args: Seq[String], config: File, configUrl: Option[URL], failOnError: Boolean, scalastyleSources: Seq[File], scalastyleTarget: File, + def doScalastyle(args: Seq[String], config: Option[ScalastyleConfiguration], configFile: File, configUrl: Option[URL], failOnError: Boolean, scalastyleSources: Seq[File], scalastyleTarget: File, streams: TaskStreams[ScopedKey[_]], refreshHours: Integer, target: File, urlCacheFile: String): Unit = { val logger = streams.log val quietArg = "q" @@ -135,7 +139,7 @@ object Tasks { } } - def getConfigFile(targetDirectory: File, configUrl: Option[URL], config: File, outputFile: String): File = { + def getConfigFile(targetDirectory: File, configUrl: Option[URL], configFile: File, outputFile: String): File = { val f = configUrl match { case Some(url) => { val targetConfigFile = target / outputFile @@ -149,7 +153,7 @@ object Tasks { } targetConfigFile } - case None => config + case None => configFile } if (!quiet) { @@ -165,7 +169,7 @@ object Tasks { validFile } - def doScalastyleWithConfig(config: File): Unit = { + def doScalastyleWithConfig(config: ScalastyleConfiguration): Unit = { val messageConfig = ConfigFactory.load(new ScalastyleChecker().getClass().getClassLoader()) //streams.log.error("messageConfig=" + messageConfig.root().render()) @@ -190,21 +194,26 @@ object Tasks { } } - val configFileToUse = getConfigFile(target, configUrl, config, urlCacheFile) - if (configFileToUse.exists) { - doScalastyleWithConfig(configFileToUse) - } else { - sys.error("config does not exist: %s".format(configFileToUse)) + val c = config match { + case Some(config) => config + case None => { + val configFileToUse = getConfigFile(target, configUrl, configFile, urlCacheFile) + if (configFileToUse.exists) { + ScalastyleConfiguration.readFromXml(configFileToUse.absolutePath) + } else { + sys.error("config does not exist: %s".format(configFileToUse)) + } + } } + doScalastyleWithConfig(c) } - def doGenerateConfig(config: File, streams: TaskStreams[ScopedKey[_]]): Unit = { - getFileFromJar(getClass.getResource("/scalastyle-config.xml"), config.absolutePath, streams.log) + def doGenerateConfig(configFile: File, streams: TaskStreams[ScopedKey[_]]): Unit = { + getFileFromJar(getClass.getResource("/scalastyle-config.xml"), configFile.absolutePath, streams.log) } - private[this] def runScalastyle(config: File, filesToProcess: Seq[File]) = { - val configuration = ScalastyleConfiguration.readFromXml(config.absolutePath) - new ScalastyleChecker().checkFiles(configuration, Directory.getFiles(None, filesToProcess, Nil)) + private[this] def runScalastyle(config: ScalastyleConfiguration, filesToProcess: Seq[File]) = { + new ScalastyleChecker().checkFiles(config, Directory.getFiles(None, filesToProcess, Nil)) } private[this] def printResults(config: Config, logger: Logger, messages: List[Message[FileSpec]], quiet: Boolean = false, warnError: Boolean = false): OutputResult = { From 30dec710f7c19be6c845723b88cf859b9ac5b5dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20L=2E=20F=2E=20Pinto?= Date: Sun, 9 Oct 2016 23:23:12 -0300 Subject: [PATCH 2/4] Change to scalastyleConfigFile in tests This changes the sbt setting `scalastyleConfig` to `scalastyleConfigFile` in the tests. --- src/sbt-test/config/scalastyle-config/build.sbt | 2 +- src/sbt-test/generate/generate-directory/build.sbt | 2 +- src/sbt-test/generate/test-generate/build.sbt | 4 ++-- src/sbt-test/test-config/scalastyle-config/build.sbt | 2 +- src/sbt-test/test-scalastyle/config/build.sbt | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/sbt-test/config/scalastyle-config/build.sbt b/src/sbt-test/config/scalastyle-config/build.sbt index 050812f..b3664b4 100644 --- a/src/sbt-test/config/scalastyle-config/build.sbt +++ b/src/sbt-test/config/scalastyle-config/build.sbt @@ -1,4 +1,4 @@ -scalastyleConfig := file("alternative-config.xml") +scalastyleConfigFile := file("alternative-config.xml") version := "0.1" diff --git a/src/sbt-test/generate/generate-directory/build.sbt b/src/sbt-test/generate/generate-directory/build.sbt index 4830d72..11d3b50 100644 --- a/src/sbt-test/generate/generate-directory/build.sbt +++ b/src/sbt-test/generate/generate-directory/build.sbt @@ -1,4 +1,4 @@ -scalastyleConfig := file("foo/scalastyle-config.xml") +scalastyleConfigFile := file("foo/scalastyle-config.xml") version := "0.1" diff --git a/src/sbt-test/generate/test-generate/build.sbt b/src/sbt-test/generate/test-generate/build.sbt index faab82e..7ddac73 100644 --- a/src/sbt-test/generate/test-generate/build.sbt +++ b/src/sbt-test/generate/test-generate/build.sbt @@ -1,6 +1,6 @@ -scalastyleConfig := file("scalastyle-config.xml") +scalastyleConfigFile := file("scalastyle-config.xml") -(scalastyleConfig in Test) := file("test-scalastyle-config.xml") +(scalastyleConfigFile in Test) := file("test-scalastyle-config.xml") version := "0.1" diff --git a/src/sbt-test/test-config/scalastyle-config/build.sbt b/src/sbt-test/test-config/scalastyle-config/build.sbt index 7ca23da..7b5c894 100644 --- a/src/sbt-test/test-config/scalastyle-config/build.sbt +++ b/src/sbt-test/test-config/scalastyle-config/build.sbt @@ -1,4 +1,4 @@ -(scalastyleConfig in Test) := file("gggalternative-config.xml") +(scalastyleConfigFile in Test) := file("gggalternative-config.xml") version := "0.1" diff --git a/src/sbt-test/test-scalastyle/config/build.sbt b/src/sbt-test/test-scalastyle/config/build.sbt index 7c76456..908e3c4 100644 --- a/src/sbt-test/test-scalastyle/config/build.sbt +++ b/src/sbt-test/test-scalastyle/config/build.sbt @@ -2,7 +2,7 @@ version := "0.1" scalaVersion := "2.10.0" -scalastyleConfig in Test := file("scalastyle-test-config.xml") +scalastyleConfigFile in Test := file("scalastyle-test-config.xml") val containsMessage = taskKey[Boolean]("contains message") From 957bade90f176fe76220168fb1a1237fd5e1235a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20L=2E=20F=2E=20Pinto?= Date: Sun, 9 Oct 2016 23:50:19 -0300 Subject: [PATCH 3/4] Rename scalastyle-config tests This renames `scalastyle-config` tests to `scalastyle-config-file`. --- .../alternative-config.xml | 0 .../{scalastyle-config => scalastyle-config-file}/build.sbt | 0 .../project/build.properties | 0 .../project/plugins.sbt | 0 .../src/main/scala/hello.scala | 0 .../config/{scalastyle-config => scalastyle-config-file}/test | 0 .../alternative-config.xml | 0 .../{scalastyle-config => scalastyle-config-file}/build.sbt | 0 .../project/build.properties | 0 .../project/plugins.sbt | 0 .../src/test/scala/hello.scala | 0 .../{scalastyle-config => scalastyle-config-file}/test | 0 12 files changed, 0 insertions(+), 0 deletions(-) rename src/sbt-test/config/{scalastyle-config => scalastyle-config-file}/alternative-config.xml (100%) rename src/sbt-test/config/{scalastyle-config => scalastyle-config-file}/build.sbt (100%) rename src/sbt-test/config/{scalastyle-config => scalastyle-config-file}/project/build.properties (100%) rename src/sbt-test/config/{scalastyle-config => scalastyle-config-file}/project/plugins.sbt (100%) rename src/sbt-test/config/{scalastyle-config => scalastyle-config-file}/src/main/scala/hello.scala (100%) rename src/sbt-test/config/{scalastyle-config => scalastyle-config-file}/test (100%) rename src/sbt-test/test-config/{scalastyle-config => scalastyle-config-file}/alternative-config.xml (100%) rename src/sbt-test/test-config/{scalastyle-config => scalastyle-config-file}/build.sbt (100%) rename src/sbt-test/test-config/{scalastyle-config => scalastyle-config-file}/project/build.properties (100%) rename src/sbt-test/test-config/{scalastyle-config => scalastyle-config-file}/project/plugins.sbt (100%) rename src/sbt-test/test-config/{scalastyle-config => scalastyle-config-file}/src/test/scala/hello.scala (100%) rename src/sbt-test/test-config/{scalastyle-config => scalastyle-config-file}/test (100%) diff --git a/src/sbt-test/config/scalastyle-config/alternative-config.xml b/src/sbt-test/config/scalastyle-config-file/alternative-config.xml similarity index 100% rename from src/sbt-test/config/scalastyle-config/alternative-config.xml rename to src/sbt-test/config/scalastyle-config-file/alternative-config.xml diff --git a/src/sbt-test/config/scalastyle-config/build.sbt b/src/sbt-test/config/scalastyle-config-file/build.sbt similarity index 100% rename from src/sbt-test/config/scalastyle-config/build.sbt rename to src/sbt-test/config/scalastyle-config-file/build.sbt diff --git a/src/sbt-test/config/scalastyle-config/project/build.properties b/src/sbt-test/config/scalastyle-config-file/project/build.properties similarity index 100% rename from src/sbt-test/config/scalastyle-config/project/build.properties rename to src/sbt-test/config/scalastyle-config-file/project/build.properties diff --git a/src/sbt-test/config/scalastyle-config/project/plugins.sbt b/src/sbt-test/config/scalastyle-config-file/project/plugins.sbt similarity index 100% rename from src/sbt-test/config/scalastyle-config/project/plugins.sbt rename to src/sbt-test/config/scalastyle-config-file/project/plugins.sbt diff --git a/src/sbt-test/config/scalastyle-config/src/main/scala/hello.scala b/src/sbt-test/config/scalastyle-config-file/src/main/scala/hello.scala similarity index 100% rename from src/sbt-test/config/scalastyle-config/src/main/scala/hello.scala rename to src/sbt-test/config/scalastyle-config-file/src/main/scala/hello.scala diff --git a/src/sbt-test/config/scalastyle-config/test b/src/sbt-test/config/scalastyle-config-file/test similarity index 100% rename from src/sbt-test/config/scalastyle-config/test rename to src/sbt-test/config/scalastyle-config-file/test diff --git a/src/sbt-test/test-config/scalastyle-config/alternative-config.xml b/src/sbt-test/test-config/scalastyle-config-file/alternative-config.xml similarity index 100% rename from src/sbt-test/test-config/scalastyle-config/alternative-config.xml rename to src/sbt-test/test-config/scalastyle-config-file/alternative-config.xml diff --git a/src/sbt-test/test-config/scalastyle-config/build.sbt b/src/sbt-test/test-config/scalastyle-config-file/build.sbt similarity index 100% rename from src/sbt-test/test-config/scalastyle-config/build.sbt rename to src/sbt-test/test-config/scalastyle-config-file/build.sbt diff --git a/src/sbt-test/test-config/scalastyle-config/project/build.properties b/src/sbt-test/test-config/scalastyle-config-file/project/build.properties similarity index 100% rename from src/sbt-test/test-config/scalastyle-config/project/build.properties rename to src/sbt-test/test-config/scalastyle-config-file/project/build.properties diff --git a/src/sbt-test/test-config/scalastyle-config/project/plugins.sbt b/src/sbt-test/test-config/scalastyle-config-file/project/plugins.sbt similarity index 100% rename from src/sbt-test/test-config/scalastyle-config/project/plugins.sbt rename to src/sbt-test/test-config/scalastyle-config-file/project/plugins.sbt diff --git a/src/sbt-test/test-config/scalastyle-config/src/test/scala/hello.scala b/src/sbt-test/test-config/scalastyle-config-file/src/test/scala/hello.scala similarity index 100% rename from src/sbt-test/test-config/scalastyle-config/src/test/scala/hello.scala rename to src/sbt-test/test-config/scalastyle-config-file/src/test/scala/hello.scala diff --git a/src/sbt-test/test-config/scalastyle-config/test b/src/sbt-test/test-config/scalastyle-config-file/test similarity index 100% rename from src/sbt-test/test-config/scalastyle-config/test rename to src/sbt-test/test-config/scalastyle-config-file/test From aad4927b922abc662855ca28751d35a2ac21bf01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20L=2E=20F=2E=20Pinto?= Date: Mon, 10 Oct 2016 00:34:30 -0300 Subject: [PATCH 4/4] Add tests to scalastyleConfig This adds tests to `scalastyleConfig` (which now do not use XML config file). --- .../config/scalastyle-config/build.sbt | 20 +++++++++++++++++++ .../project/build.properties | 1 + .../scalastyle-config/project/plugins.sbt | 9 +++++++++ .../src/main/scala/hello.scala | 9 +++++++++ src/sbt-test/config/scalastyle-config/test | 3 +++ .../test-config/scalastyle-config/build.sbt | 20 +++++++++++++++++++ .../project/build.properties | 1 + .../scalastyle-config/project/plugins.sbt | 9 +++++++++ .../src/test/scala/hello.scala | 9 +++++++++ .../test-config/scalastyle-config/test | 3 +++ 10 files changed, 84 insertions(+) create mode 100644 src/sbt-test/config/scalastyle-config/build.sbt create mode 100644 src/sbt-test/config/scalastyle-config/project/build.properties create mode 100644 src/sbt-test/config/scalastyle-config/project/plugins.sbt create mode 100644 src/sbt-test/config/scalastyle-config/src/main/scala/hello.scala create mode 100644 src/sbt-test/config/scalastyle-config/test create mode 100644 src/sbt-test/test-config/scalastyle-config/build.sbt create mode 100644 src/sbt-test/test-config/scalastyle-config/project/build.properties create mode 100644 src/sbt-test/test-config/scalastyle-config/project/plugins.sbt create mode 100644 src/sbt-test/test-config/scalastyle-config/src/test/scala/hello.scala create mode 100644 src/sbt-test/test-config/scalastyle-config/test diff --git a/src/sbt-test/config/scalastyle-config/build.sbt b/src/sbt-test/config/scalastyle-config/build.sbt new file mode 100644 index 0000000..1613fa9 --- /dev/null +++ b/src/sbt-test/config/scalastyle-config/build.sbt @@ -0,0 +1,20 @@ +import org.scalastyle.{ScalastyleConfiguration, ConfigurationChecker} + +scalastyleConfig := Some(ScalastyleConfiguration( + name = "Scalastyle standard configuration", + checks = List( + ConfigurationChecker[org.scalastyle.file.FileLengthChecker]( + enabled = true, + parameters = Map("maxFileLength" -> "5") + ), + ConfigurationChecker[org.scalastyle.scalariform.ObjectNamesChecker]( + enabled = true, + parameters = Map("regex" -> """[A-Z][A-Za-z]*""") + ) + ) +)) + +version := "0.1" + +scalaVersion := "2.10.0" + diff --git a/src/sbt-test/config/scalastyle-config/project/build.properties b/src/sbt-test/config/scalastyle-config/project/build.properties new file mode 100644 index 0000000..0974fce --- /dev/null +++ b/src/sbt-test/config/scalastyle-config/project/build.properties @@ -0,0 +1 @@ +sbt.version=0.13.0 diff --git a/src/sbt-test/config/scalastyle-config/project/plugins.sbt b/src/sbt-test/config/scalastyle-config/project/plugins.sbt new file mode 100644 index 0000000..2c582ca --- /dev/null +++ b/src/sbt-test/config/scalastyle-config/project/plugins.sbt @@ -0,0 +1,9 @@ +resolvers += "sonatype-snapshots" at "https://oss.sonatype.org/content/repositories/snapshots/" + +{ + val pluginVersion = System.getProperty("plugin.version") + if(pluginVersion == null) + throw new RuntimeException("""|The system property 'plugin.version' is not defined. + |Specify this property using the scriptedLaunchOpts -D.""".stripMargin) + else addSbtPlugin("org.scalastyle" % "scalastyle-sbt-plugin" % pluginVersion) +} \ No newline at end of file diff --git a/src/sbt-test/config/scalastyle-config/src/main/scala/hello.scala b/src/sbt-test/config/scalastyle-config/src/main/scala/hello.scala new file mode 100644 index 0000000..3cb4df3 --- /dev/null +++ b/src/sbt-test/config/scalastyle-config/src/main/scala/hello.scala @@ -0,0 +1,9 @@ + +object Main extends App { + println("hello") +} + +object foo { + println("hello") +} + diff --git a/src/sbt-test/config/scalastyle-config/test b/src/sbt-test/config/scalastyle-config/test new file mode 100644 index 0000000..b16436a --- /dev/null +++ b/src/sbt-test/config/scalastyle-config/test @@ -0,0 +1,3 @@ +# scalastyle alternative config file +> clean +-> scalastyle w diff --git a/src/sbt-test/test-config/scalastyle-config/build.sbt b/src/sbt-test/test-config/scalastyle-config/build.sbt new file mode 100644 index 0000000..990dc4d --- /dev/null +++ b/src/sbt-test/test-config/scalastyle-config/build.sbt @@ -0,0 +1,20 @@ +import org.scalastyle.{ScalastyleConfiguration, ConfigurationChecker} + +(scalastyleConfig in Test) := Some(ScalastyleConfiguration( + name = "Scalastyle standard configuration", + checks = List( + ConfigurationChecker[org.scalastyle.file.FileLengthChecker]( + enabled = true, + parameters = Map("maxFileLength" -> "5") + ), + ConfigurationChecker[org.scalastyle.scalariform.ObjectNamesChecker]( + enabled = true, + parameters = Map("regex" -> """[A-Z][A-Za-z]*""") + ) + ) +)) + +version := "0.1" + +scalaVersion := "2.10.0" + diff --git a/src/sbt-test/test-config/scalastyle-config/project/build.properties b/src/sbt-test/test-config/scalastyle-config/project/build.properties new file mode 100644 index 0000000..0974fce --- /dev/null +++ b/src/sbt-test/test-config/scalastyle-config/project/build.properties @@ -0,0 +1 @@ +sbt.version=0.13.0 diff --git a/src/sbt-test/test-config/scalastyle-config/project/plugins.sbt b/src/sbt-test/test-config/scalastyle-config/project/plugins.sbt new file mode 100644 index 0000000..2c582ca --- /dev/null +++ b/src/sbt-test/test-config/scalastyle-config/project/plugins.sbt @@ -0,0 +1,9 @@ +resolvers += "sonatype-snapshots" at "https://oss.sonatype.org/content/repositories/snapshots/" + +{ + val pluginVersion = System.getProperty("plugin.version") + if(pluginVersion == null) + throw new RuntimeException("""|The system property 'plugin.version' is not defined. + |Specify this property using the scriptedLaunchOpts -D.""".stripMargin) + else addSbtPlugin("org.scalastyle" % "scalastyle-sbt-plugin" % pluginVersion) +} \ No newline at end of file diff --git a/src/sbt-test/test-config/scalastyle-config/src/test/scala/hello.scala b/src/sbt-test/test-config/scalastyle-config/src/test/scala/hello.scala new file mode 100644 index 0000000..3cb4df3 --- /dev/null +++ b/src/sbt-test/test-config/scalastyle-config/src/test/scala/hello.scala @@ -0,0 +1,9 @@ + +object Main extends App { + println("hello") +} + +object foo { + println("hello") +} + diff --git a/src/sbt-test/test-config/scalastyle-config/test b/src/sbt-test/test-config/scalastyle-config/test new file mode 100644 index 0000000..224314e --- /dev/null +++ b/src/sbt-test/test-config/scalastyle-config/test @@ -0,0 +1,3 @@ +# scalastyle alternative config file +> clean +-> test:scalastyle w