From 3dc171e41676e9043fe0c6d935b97a944c143dad Mon Sep 17 00:00:00 2001 From: Johannes Rudolph Date: Tue, 16 Oct 2012 14:24:54 +0200 Subject: move from "cc.spray" to "io.spray" --- .../spray/boilerplate/BoilerplatePlugin.scala | 68 ++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 src/main/scala/spray/boilerplate/BoilerplatePlugin.scala (limited to 'src/main/scala/spray/boilerplate/BoilerplatePlugin.scala') diff --git a/src/main/scala/spray/boilerplate/BoilerplatePlugin.scala b/src/main/scala/spray/boilerplate/BoilerplatePlugin.scala new file mode 100644 index 0000000..6049c98 --- /dev/null +++ b/src/main/scala/spray/boilerplate/BoilerplatePlugin.scala @@ -0,0 +1,68 @@ +/* + * sbt-boilerplate is distributed under the 2-Clause BSD license. See the LICENSE file in the root + * of the repository. + * + * Copyright (c) 2012 Johannes Rudolph + */ +package spray.boilerplate + +import sbt._ +import Keys._ + +object BoilerplatePlugin extends Plugin { + object Boilerplate { + val boilerplateGenerate = TaskKey[Seq[File]]("boilerplate-generate", "Generates boilerplate from template files") + + val settings = seq( + sourceDirectory in boilerplateGenerate <<= (sourceDirectory in Compile) / "boilerplate", + + target in boilerplateGenerate <<= (sourceManaged in Compile), + + boilerplateGenerate <<= (streams, sourceDirectory in boilerplateGenerate, target in boilerplateGenerate) map generateFromTemplates, + + (sourceGenerators in Compile) <+= boilerplateGenerate, + (managedSourceDirectories in Compile) <+= target in boilerplateGenerate, + + // watch sources support + includeFilter in boilerplateGenerate := "*.template", + excludeFilter in boilerplateGenerate <<= excludeFilter in Global, + watch(sourceDirectory in boilerplateGenerate, includeFilter in boilerplateGenerate, excludeFilter in boilerplateGenerate), + + // add managed sources to the packaged sources + mappings in (Compile, packageSrc) <++= + (sourceManaged in Compile, managedSources in Compile) map { (base, srcs) => + (srcs x (Path.relativeTo(base) | Path.flat)) + } + ) + + def watch(sourceDirKey: SettingKey[File], filterKey: SettingKey[FileFilter], excludeKey: SettingKey[FileFilter]) = + watchSources <++= (sourceDirKey, filterKey, excludeKey) map descendents + def descendents(sourceDir: File, filt: FileFilter, excl: FileFilter) = + sourceDir.descendentsExcept(filt, excl).get + + def generateFromTemplates(streams: TaskStreams, sourceDir: File, targetDir: File): Seq[File] = { + val files = sourceDir ** "*.template" + + def changeExtension(f: File): File = { + val (ext, name) = f.getName.reverse.span(_ != '.') + new File(f.getParent, name.drop(1).reverse.toString) + } + + 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) + } + } +} -- cgit v1.2.3