diff --git a/README.md b/README.md index 6d1a02f07..517ad5dca 100644 --- a/README.md +++ b/README.md @@ -113,7 +113,7 @@ The template files are: The Template build isn't quite finished. There will most likely be a build.sbt DSL variant that does not require a project scala file. -## Simple task DSL +## Simple SBT DSL SBT extras defines a simplified task DSL for those who are defining simple tasks that do not need to be relied upon, or you are unsure and can refactor later. Once including the sbt-extra-plugin, all you have to do is place the following in your build.sbt to create tasks: @@ -123,4 +123,16 @@ or if you need to depend on other keys: simple_task("zomg2") on (name, version) is { (n,v) => println("ZOMG " + n + " = " + v + " !!!!!") } -The DSL currently supports between 2 and 9 dependencies. The DSL does not allow defining tasks on different configurations, although this will be added shortly. +The DSL currently supports between 0 and 9 dependencies. The DSL does not allow defining tasks on different configurations, although this will be added shortly. + +### Simple Setttings + +SBT distinguishes between defining Setting and Tasks through the `apply` and `map` methods. The Simple DSL has no such distinction. Defining a setting is as easy as: + + simple_setting("name") is "project-name" + +Settings can also depend on other settings. + + simple_setting("name") on (version) is { v => "project-name" + v } + +Since a Setting can *only* be defined using other settings, attempting to use a non-setting in the on calls results in a type error. diff --git a/build.sbt b/build.sbt index e227a442a..fe69fa2f8 100644 --- a/build.sbt +++ b/build.sbt @@ -4,5 +4,5 @@ name := "sbt-extras-plugin" organization := "org.improving" -version <<= (sbtVersion)("0.1.0-%s".format(_)) +version := "0.1.0" diff --git a/src/main/scala/Main.scala b/src/main/scala/Main.scala index 22c649b04..5a4742427 100644 --- a/src/main/scala/Main.scala +++ b/src/main/scala/Main.scala @@ -7,6 +7,7 @@ import scala.collection.{ mutable, immutable } object SbtExtrasPlugin extends Plugin { def simple_task(name: String) = sbt.extra.dsl.SimpleTasks.task(name) + def simple_setting(name: String) = sbt.extra.dsl.SimpleTasks.setting(name) } trait SbtCreateConfig { diff --git a/src/main/scala/SimpleDsl.scala b/src/main/scala/SimpleDsl.scala new file mode 100644 index 000000000..273b38042 --- /dev/null +++ b/src/main/scala/SimpleDsl.scala @@ -0,0 +1,10 @@ +package sbt.extra.dsl + +import sbt._ +import Scoped._ +import Project.{richInitializeTask,richInitialize} + +object SimpleTasks { + final def task(name: String) = new TaskId(name) + final def setting(name: String) = new SettingId(name) +} diff --git a/src/main/scala/SimpleSetting.scala b/src/main/scala/SimpleSetting.scala new file mode 100644 index 000000000..3b924f6d5 --- /dev/null +++ b/src/main/scala/SimpleSetting.scala @@ -0,0 +1,169 @@ +package sbt.extra.dsl + +import sbt._ +import Scoped._ +import Project._ +import Project.Setting + +/** Represents the new 'id' of a setting to define on a project. */ +final class SettingId(name: String) { + /** Creates a Task that has no dependencies. */ + final def is[R: Manifest](f: => R) = + SettingKey[R](name) := f + final def on[A1](a: Initialize[A1]): SettingDepend1[A1] = + new SettingDepend1[A1](name, a) + final def on[A1, A2](a1: Initialize[A1], a2: Initialize[A2]): SettingDepend2[A1, A2] = + new SettingDepend2[A1, A2](name, a1, a2) + final def on[A1, A2, A3](a1: Initialize[A1], + a2: Initialize[A2], + a3: Initialize[A3]) = + new SettingDepend3[A1, A2, A3](name, a1, a2, a3) + final def on[A1, A2, A3, A4](a1: Initialize[A1], + a2: Initialize[A2], + a3: Initialize[A3], + a4: Initialize[A4]) = + new SettingDepend4[A1, A2, A3, A4](name, a1, a2, a3, a4) + final def on[A1, A2, A3, A4, A5](a1: Initialize[A1], + a2: Initialize[A2], + a3: Initialize[A3], + a4: Initialize[A4], + a5: Initialize[A5]) = + new SettingDepend5[A1, A2, A3, A4, A5](name, a1, a2, a3, a4, a5) + final def on[A1, A2, A3, A4, A5, A6](a1: Initialize[A1], + a2: Initialize[A2], + a3: Initialize[A3], + a4: Initialize[A4], + a5: Initialize[A5], + a6: Initialize[A6]) = + new SettingDepend6[A1, A2, A3, A4, A5, A6](name, a1, a2, a3, a4, a5, a6) + final def on[A1, A2, A3, A4, A5, A6, A7](a1: Initialize[A1], + a2: Initialize[A2], + a3: Initialize[A3], + a4: Initialize[A4], + a5: Initialize[A5], + a6: Initialize[A6], + a7: Initialize[A7]) = + new SettingDepend7[A1, A2, A3, A4, A5, A6, A7](name, a1, a2, a3, a4, a5, a6, a7) + final def on[A1, A2, A3, A4, A5, A6, A7, A8](a1: Initialize[A1], + a2: Initialize[A2], + a3: Initialize[A3], + a4: Initialize[A4], + a5: Initialize[A5], + a6: Initialize[A6], + a7: Initialize[A7], + a8: Initialize[A8]) = + new SettingDepend8[A1, A2, A3, A4, A5, A6, A7, A8](name, a1, a2, a3, a4, a5, a6, a7, a8) + final def on[A1, A2, A3, A4, A5, A6, A7, A8, A9](a1: Initialize[A1], + a2: Initialize[A2], + a3: Initialize[A3], + a4: Initialize[A4], + a5: Initialize[A5], + a6: Initialize[A6], + a7: Initialize[A7], + a8: Initialize[A8], + a9: Initialize[A9]) = + new SettingDepend9[A1, A2, A3, A4, A5, A6, A7, A8, A9](name, a1, a2, a3, a4, a5, a6, a7, a8, a9) +} + +/** Represents a not-yet-defined Setting that has one dependency */ +final class SettingDepend1[A1](name: String, a1: Initialize[A1]) { + final def is[R: Manifest](f: A1 => R): Setting[R] = { + SettingKey[R](name) <<= a1 apply f + } +} + +/** Represents a not-yet-defined Setting that has two dependencies */ +final class SettingDepend2[A1, A2](name: String, + a1: Initialize[A1], + a2: Initialize[A2]) { + final def is[R: Manifest](f: (A1, A2) => R): Setting[R] = { + SettingKey[R](name) <<= (a1, a2) apply f + } +} +/** Represents a not-yet-defined Setting that has two dependencies */ +final class SettingDepend3[A1, A2, A3](name: String, + a1: Initialize[A1], + a2: Initialize[A2], + a3: Initialize[A3]) { + final def is[R: Manifest](f: (A1, A2, A3) => R): Setting[R] = { + SettingKey[R](name) <<= (a1, a2, a3) apply f + } +} +/** Represents a not-yet-defined Setting that has two dependencies */ +final class SettingDepend4[A1, A2, A3, A4](name: String, + a1: Initialize[A1], + a2: Initialize[A2], + a3: Initialize[A3], + a4: Initialize[A4]) { + final def is[R: Manifest](f: (A1, A2, A3, A4) => R): Setting[R] = { + SettingKey[R](name) <<= (a1, a2, a3, a4) apply f + } +} +/** Represents a not-yet-defined Setting that has two dependencies */ +final class SettingDepend5[A1, A2, A3, A4, A5](name: String, + a1: Initialize[A1], + a2: Initialize[A2], + a3: Initialize[A3], + a4: Initialize[A4], + a5: Initialize[A5]) { + final def is[R: Manifest](f: (A1, A2, A3, A4, A5) => R): Setting[R] = { + SettingKey[R](name) <<= (a1, a2, a3, a4, a5) apply f + } +} +/** Represents a not-yet-defined Setting that has two dependencies */ +final class SettingDepend6[A1, A2, A3, A4, A5, A6](name: String, + a1: Initialize[A1], + a2: Initialize[A2], + a3: Initialize[A3], + a4: Initialize[A4], + a5: Initialize[A5], + a6: Initialize[A6]) { + final def is[R: Manifest](f: (A1, A2, A3, A4, A5, A6) => R): Setting[R] = { + SettingKey[R](name) <<= (a1, a2, a3, a4, a5, a6) apply f + } +} +/** Represents a not-yet-defined Setting that has two dependencies */ +final class SettingDepend7[A1, A2, A3, A4, A5, A6, A7](name: String, + a1: Initialize[A1], + a2: Initialize[A2], + a3: Initialize[A3], + a4: Initialize[A4], + a5: Initialize[A5], + a6: Initialize[A6], + a7: Initialize[A7]) { + final def is[R: Manifest](f: (A1, A2, A3, A4, A5, A6, A7) => R): Setting[R] = { + SettingKey[R](name) <<= (a1, a2, a3, a4, a5, a6, a7) apply f + } +} +/** Represents a not-yet-defined Setting that has two dependencies */ +final class SettingDepend8[A1, A2, A3, A4, A5, A6, A7, A8](name: String, + a1: Initialize[A1], + a2: Initialize[A2], + a3: Initialize[A3], + a4: Initialize[A4], + a5: Initialize[A5], + a6: Initialize[A6], + a7: Initialize[A7], + a8: Initialize[A8]) { + final def is[R: Manifest](f: (A1, A2, A3, A4, A5, A6, A7, A8) => R): Setting[R] = { + SettingKey[R](name) <<= (a1, a2, a3, a4, a5, a6, a7, a8) apply f + } +} +/** Represents a not-yet-defined Setting that has two dependencies */ +final class SettingDepend9[A1, A2, A3, A4, A5, A6, A7, A8, A9](name: String, + a1: Initialize[A1], + a2: Initialize[A2], + a3: Initialize[A3], + a4: Initialize[A4], + a5: Initialize[A5], + a6: Initialize[A6], + a7: Initialize[A7], + a8: Initialize[A8], + a9: Initialize[A9]) { + final def is[R: Manifest](f: (A1, A2, A3, A4, A5, A6, A7, A8, A9) => R): Setting[R] = { + SettingKey[R](name) <<= (a1, a2, a3, a4, a5, a6, a7, a8, a9) apply f + } +} + + + diff --git a/src/main/scala/SimpleTask.scala b/src/main/scala/SimpleTask.scala index ea05eaf18..a48e404de 100644 --- a/src/main/scala/SimpleTask.scala +++ b/src/main/scala/SimpleTask.scala @@ -2,19 +2,18 @@ package sbt.extra.dsl import sbt._ import Scoped._ -import Project.{richInitializeTask,richInitialize} - -object SimpleTasks { - final def task(name: String) = new TaskId(name) -} +import Project._ +import Project.Setting /** Represents the new 'id' of a task to define on a project. */ final class TaskId(name: String) { /** Creates a Task that has no dependencies. */ final def is[R: Manifest](f: => R) = TaskKey[R](name) := f - /*final def on[A1](a: ScopedTaskable[A1]): TaskDepend1[A1] = - new TaskDepend1[A1](name, a)*/ + final def on[A1](a: Initialize[Task[A1]]): TaskDepend1Task[A1] = + new TaskDepend1Task[A1](name, a) + final def on[A1](a: Initialize[A1]): TaskDepend1Setting[A1] = + new TaskDepend1Setting[A1](name, a) final def on[A1, A2](a1: ScopedTaskable[A1], a2: ScopedTaskable[A2]): TaskDepend2[A1, A2] = new TaskDepend2[A1, A2](name, a1, a2) final def on[A1, A2, A3](a1: ScopedTaskable[A1], @@ -68,12 +67,17 @@ final class TaskId(name: String) { new TaskDepend9[A1, A2, A3, A4, A5, A6, A7, A8, A9](name, a1, a2, a3, a4, a5, a6, a7, a8, a9) } -/** Represents a not-yet-defined task that has one dependency */ -/*final class TaskDepend1[A1](name: String, a1: ScopedTaskable[A1]) { +final class TaskDepend1Setting[A1](name: String, a1: Initialize[A1]) { final def is[R: Manifest](f: A1 => R): Setting[Task[R]] = { TaskKey[R](name) <<= a1 map f } -}*/ +} +/** Represents a not-yet-defined task that has one dependency */ +final class TaskDepend1Task[A1](name: String, a1: Initialize[Task[A1]]) { + final def is[R: Manifest](f: A1 => R): Setting[Task[R]] = { + TaskKey[R](name) <<= a1 map f + } +} /** Represents a not-yet-defined task that has two dependencies */ final class TaskDepend2[A1, A2](name: String, diff --git a/template-project/build.sbt b/template-project/build.sbt index 38cf37011..bb948043e 100644 --- a/template-project/build.sbt +++ b/template-project/build.sbt @@ -1,3 +1,7 @@ +simple_setting("name") is "test-project" + simple_task("zomg") is { println("ZOMG") } simple_task("zomg2") on (name, version) is { (n,v) => println("ZOMG " + n + " = " + v + " !!!!!") } + +