Merge pull request #9 from jsuereth/master

Simple Setting DSL
This commit is contained in:
Paul Phillips 2011-10-28 17:22:34 -07:00
commit 7fd0cc8097
7 changed files with 213 additions and 13 deletions

View File

@ -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.

View File

@ -4,5 +4,5 @@ name := "sbt-extras-plugin"
organization := "org.improving"
version <<= (sbtVersion)("0.1.0-%s".format(_))
version := "0.1.0"

View File

@ -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 {

View File

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

View File

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

View File

@ -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,

View File

@ -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 + " !!!!!") }