Skip to content

Commit

Permalink
Add support for multiple boilerplate source directories
Browse files Browse the repository at this point in the history
  • Loading branch information
jodersky authored and mkurz committed Jan 18, 2024
1 parent b718678 commit e875c9c
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 20 deletions.
4 changes: 2 additions & 2 deletions src/main/scala-sbt-0.13/Compat.scala
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ import sbt._
import Keys._

object Compat {
private val boilerplateSource = settingKey[File]("Default directory containing boilerplate template sources.")
private val boilerplateSourceDirectories = settingKey[Seq[File]]("Directories containing boilerplate template sources.")
private val inputFilter = "*.template"

def allPaths(f: File) = f.***

def watchSourceSettings = Def.settings {
Seq(watchSources in Defaults.ConfigGlobal ++= ((boilerplateSource.value ** inputFilter) --- (boilerplateSource.value ** excludeFilter.value ** inputFilter)).get)
Seq(watchSources in Defaults.ConfigGlobal ++= ((boilerplateSourceDirectories.value ** inputFilter) --- (boilerplateSourceDirectories.value ** excludeFilter.value ** inputFilter)).get)
}
}
7 changes: 4 additions & 3 deletions src/main/scala-sbt-1.0/Compat.scala
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,21 @@ import Keys._
import sbt.internal.io.Source

object Compat {
private val boilerplateSource = settingKey[File]("Default directory containing boilerplate template sources.")
private val boilerplateSourceDirectories = settingKey[Seq[File]]("Directories containing boilerplate template sources.")
private val inputFilter = """.*\.template""".r

def allPaths(f: File) = f.allPaths

def watchSourceSettings = Def.settings {
Seq(
watchSources in Defaults.ConfigGlobal +=
watchSources in Defaults.ConfigGlobal ++= boilerplateSourceDirectories.value map { dir =>
new Source(
boilerplateSource.value,
dir,
new NameFilter {
override def accept(name: String): Boolean = inputFilter.pattern.matcher(name).matches()
},
NothingFilter)
}
)
}
}
38 changes: 23 additions & 15 deletions src/main/scala/spray/boilerplate/BoilerplatePlugin.scala
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ object BoilerplatePlugin extends AutoPlugin {

object autoImport {
val boilerplateGenerate = taskKey[Seq[File]]("Generates boilerplate from template files")
val boilerplateSourceDirectories = settingKey[Seq[File]]("Directories containing boilerplate template sources.")
@deprecated("Use boilerplateSourceDirectories instead.", "0.7.0")
val boilerplateSource = settingKey[File]("Default directory containing boilerplate template sources.")
val boilerplateSignature = settingKey[String](
"Function that creates signature string to prepend to the generated file (given an input file name). " +
Expand All @@ -34,27 +36,33 @@ object BoilerplatePlugin extends AutoPlugin {
Compat.watchSourceSettings ++
Seq(
boilerplateSource := sourceDirectory.value / "boilerplate",
boilerplateGenerate := generateFromTemplates(streams.value, boilerplateSignature.value, boilerplateSource.value, sourceManaged.value),
boilerplateSourceDirectories := Seq(boilerplateSource.value),
boilerplateGenerate :=
generateFromTemplates(streams.value, boilerplateSignature.value, boilerplateSourceDirectories.value, sourceManaged.value),
mappings in packageSrc ++= managedSources.value pair (Path.relativeTo(sourceManaged.value) | Path.flat),
sourceGenerators += boilerplateGenerate)
}

def generateFromTemplates(streams: TaskStreams, signature: String, sourceDir: File, targetDir: File): Seq[File] = {
val files = sourceDir ** "*.template"
streams.log.debug(s"Found ${files.get.size} template files in $sourceDir.")

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)
def generateFromTemplates(streams: TaskStreams, signature: String, sourceDirs: Seq[File], targetDir: File): Seq[File] = {
def generate(sourceDir: File): Seq[(File, File)] = {
val files = sourceDir ** "*.template"
streams.log.debug(s"Found ${files.get.size} template files in $sourceDir.")

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)
}

(files pair Path.rebase(sourceDir, targetDir)).map {
case (orig, target) (orig, changeExtension(target))
}
}

val mapping = (files pair Path.rebase(sourceDir, targetDir)).map {
case (orig, target) (orig, changeExtension(target))
}
val mapping = sourceDirs.flatMap(generate)

val newFiles = mapping.map(_._2)
clearTargetDir(streams, targetDir, signature, newFiles)
Expand Down

0 comments on commit e875c9c

Please sign in to comment.