From 11b21a1042dd4bb5007ff3e7eaf18b5e7dbdf8dd Mon Sep 17 00:00:00 2001 From: Johannes Rudolph Date: Tue, 1 Mar 2016 14:29:56 +0100 Subject: make this an AutoPlugin, fixes #19 --- README.md | 13 ++-- .../spray/boilerplate/BoilerplatePlugin.scala | 85 ++++++++++++---------- 2 files changed, 51 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index 481144b..3e37902 100644 --- a/README.md +++ b/README.md @@ -78,13 +78,13 @@ This now expands correctly to Put - addSbtPlugin("io.spray" % "sbt-boilerplate" % "0.5.9") + addSbtPlugin("io.spray" % "sbt-boilerplate" % "0.6.0") -into your `plugins.sbt` and add +into your `plugins.sbt`. sbt-boilerplate is an `AutoPlugin` which needs to be enabled using - Boilerplate.settings - -to your `build.sbt`. +```scala +enablePlugins(spray.boilerplate.BoilerplatePlugin) +``` The templates have to be put into the `src/main/boilerplate` directory and the file name must end with `.template`. The generated files will be put into the same hierarchy as they @@ -93,8 +93,7 @@ filename has no extension ".scala" is added automatically. ## Known issues - * The maximum number of arguments, 22, is hard-coded. - * Instances for 0 arguments have to be supplied manually. + * Instances for zero arguments have to be supplied manually. ## Projects using sbt-boilerplate diff --git a/src/main/scala/spray/boilerplate/BoilerplatePlugin.scala b/src/main/scala/spray/boilerplate/BoilerplatePlugin.scala index 0e63014..9394be8 100644 --- a/src/main/scala/spray/boilerplate/BoilerplatePlugin.scala +++ b/src/main/scala/spray/boilerplate/BoilerplatePlugin.scala @@ -9,51 +9,56 @@ package spray.boilerplate import sbt._ import Keys._ -object BoilerplatePlugin extends Plugin { - object Boilerplate { +object BoilerplatePlugin extends AutoPlugin { + override def trigger: PluginTrigger = noTrigger + override def `requires`: Plugins = empty + + object autoImport { val boilerplateGenerate = taskKey[Seq[File]]("Generates boilerplate from template files") val boilerplateSource = settingKey[File]("Default directory containing boilerplate template sources.") + } + + import autoImport._ + + override def projectSettings: Seq[Def.Setting[_]] = + inConfig(Compile)(rawBoilerplateSettings) ++ inConfig(Test)(rawBoilerplateSettings) + + private def rawBoilerplateSettings: Seq[Setting[_]] = { + val inputFilter = "*.template" + Seq( + boilerplateSource := sourceDirectory.value / "boilerplate", + watchSources in Defaults.ConfigGlobal ++= ((boilerplateSource.value ** inputFilter) --- (boilerplateSource.value ** excludeFilter.value ** inputFilter)).get, + boilerplateGenerate := generateFromTemplates(streams.value, boilerplateSource.value, sourceManaged.value), + mappings in packageSrc ++= managedSources.value pair (Path.relativeTo(sourceManaged.value) | Path.flat), + sourceGenerators <+= boilerplateGenerate) + } + + def generateFromTemplates(streams: TaskStreams, sourceDir: File, targetDir: File): Seq[File] = { + val files = sourceDir ** "*.template" - private def rawBoilerplateSettings: Seq[Setting[_]] = { - val inputFilter = "*.template" - Seq( - boilerplateSource := sourceDirectory.value / "boilerplate", - watchSources in Defaults.ConfigGlobal ++= ((boilerplateSource.value ** inputFilter) --- (boilerplateSource.value ** excludeFilter.value ** inputFilter)).get, - boilerplateGenerate := generateFromTemplates(streams.value, boilerplateSource.value, sourceManaged.value), - mappings in packageSrc ++= managedSources.value x (Path.relativeTo(sourceManaged.value) | Path.flat), - sourceGenerators <+= boilerplateGenerate) + def changeExtension(f: File): File = { + val (_, name) = f.getName.reverse.span(_ != '.') + val strippedName = name.drop(1).reverse.toString + val newName = + if (!strippedName.contains(".")) s"$strippedName.scala" + else strippedName + new File(f.getParent, newName) } - val settings = - inConfig(Compile)(rawBoilerplateSettings) ++ inConfig(Test)(rawBoilerplateSettings) - - def generateFromTemplates(streams: TaskStreams, sourceDir: File, targetDir: File): Seq[File] = { - val files = sourceDir ** "*.template" - - def changeExtension(f: File): File = { - val (_, name) = f.getName.reverse.span(_ != '.') - val strippedName = name.drop(1).reverse.toString - val newName = - if (!strippedName.contains(".")) s"$strippedName.scala" - else strippedName - new File(f.getParent, newName) - } - - val mapping = (files x rebase(sourceDir, targetDir)).map { - case (orig, target) ⇒ (orig, changeExtension(target)) - } - - mapping foreach { - case (templateFile, target) ⇒ - if (templateFile.lastModified > target.lastModified) { - streams.log.info("Generating '%s'" format target.getName) - val template = IO.read(templateFile) - IO.write(target, Generator.generateFromTemplate(template, 22)) - } else - streams.log.debug("Template '%s' older than target. Ignoring." format templateFile.getName) - } - - mapping.map(_._2) + val mapping = (files pair rebase(sourceDir, targetDir)).map { + case (orig, target) ⇒ (orig, changeExtension(target)) } + + mapping foreach { + case (templateFile, target) ⇒ + if (templateFile.lastModified > target.lastModified) { + streams.log.info("Generating '%s'" format target.getName) + val template = IO.read(templateFile) + IO.write(target, Generator.generateFromTemplate(template, 22)) + } else + streams.log.debug("Template '%s' older than target. Ignoring." format templateFile.getName) + } + + mapping.map(_._2) } } -- cgit v1.2.3