From a43556851bf986b81351fc9f1ae5ba51bf21dc47 Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Thu, 11 Oct 2018 14:19:28 -0700 Subject: Add an example to the README and a standalone application template --- README.md | 26 +++++++++++++++++++++- .../xyz/driver/core/init/BuildInfoReflection.scala | 2 +- .../main/scala/xyz/driver/core/init/HttpApi.scala | 2 +- documentation/example/.gitignore | 1 + documentation/example/build.sbt | 6 +++++ documentation/example/project/build.properties | 1 + documentation/example/project/plugins.sbt | 1 + .../example/src/main/scala/example/Main.scala | 21 +++++++++++++++++ 8 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 documentation/example/.gitignore create mode 100644 documentation/example/build.sbt create mode 100644 documentation/example/project/build.properties create mode 100644 documentation/example/project/plugins.sbt create mode 100644 documentation/example/src/main/scala/example/Main.scala diff --git a/README.md b/README.md index ec0050a..9edbfe1 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,31 @@ libraries used are: ## Example Usage -*TODO* +The following implements a simple key-value store that uses object +storage ("buckets") when running in the cloud and a local filesystem +when running on a development machine. +```scala +import xyz.driver.core.init + +object Main extends init.SimpleHttpApp { + + lazy val fs = storage("data") + + override def applicationRoute = path("data" / Segment) { key => + post { + entity(as[Array[Byte]]) { value => + complete(fs.uploadContent(key, value)) + } + } ~ get { + rejectEmptyResponse{ + complete(fs.content(key)) + } + } + } + +} +``` +See [this example project](documentation/example) for a more details. ## Building diff --git a/core-init/src/main/scala/xyz/driver/core/init/BuildInfoReflection.scala b/core-init/src/main/scala/xyz/driver/core/init/BuildInfoReflection.scala index 0e53085..a8bee9b 100644 --- a/core-init/src/main/scala/xyz/driver/core/init/BuildInfoReflection.scala +++ b/core-init/src/main/scala/xyz/driver/core/init/BuildInfoReflection.scala @@ -10,7 +10,7 @@ private[init] object BuildInfoReflection { final val BuildInfoName = "xyz.driver.BuildInfo" - lazy val name: String = get[String]("name") + lazy val name: String = find[String]("name").getOrElse("unknown") lazy val version: Option[String] = find[String]("version") /** Lookup a given field in the build configuration. This field is required to exist. */ diff --git a/core-init/src/main/scala/xyz/driver/core/init/HttpApi.scala b/core-init/src/main/scala/xyz/driver/core/init/HttpApi.scala index 81428bf..2570cb3 100644 --- a/core-init/src/main/scala/xyz/driver/core/init/HttpApi.scala +++ b/core-init/src/main/scala/xyz/driver/core/init/HttpApi.scala @@ -27,7 +27,7 @@ trait HttpApi extends CloudServices with Directives with SprayJsonSupport { self /** Classes with Swagger annotations. * @group hooks */ - def swaggerRouteClasses: Set[Class[_]] + def swaggerRouteClasses: Set[Class[_]] = Set(self.getClass) private val healthRoute = path("health") { complete(Map("status" -> "good").toJson) diff --git a/documentation/example/.gitignore b/documentation/example/.gitignore new file mode 100644 index 0000000..2157ef4 --- /dev/null +++ b/documentation/example/.gitignore @@ -0,0 +1 @@ +.data-* diff --git a/documentation/example/build.sbt b/documentation/example/build.sbt new file mode 100644 index 0000000..d2bd592 --- /dev/null +++ b/documentation/example/build.sbt @@ -0,0 +1,6 @@ +lazy val `example-app` = project + .in(file(".")) + .enablePlugins(ServicePlugin) + .settings( + libraryDependencies += "xyz.driver" %% "core-init" % "2.0.0-M5" + ) diff --git a/documentation/example/project/build.properties b/documentation/example/project/build.properties new file mode 100644 index 0000000..0cd8b07 --- /dev/null +++ b/documentation/example/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.2.3 diff --git a/documentation/example/project/plugins.sbt b/documentation/example/project/plugins.sbt new file mode 100644 index 0000000..53be881 --- /dev/null +++ b/documentation/example/project/plugins.sbt @@ -0,0 +1 @@ +addSbtPlugin("xyz.driver" % "sbt-settings" % "2.0.12") diff --git a/documentation/example/src/main/scala/example/Main.scala b/documentation/example/src/main/scala/example/Main.scala new file mode 100644 index 0000000..2548f79 --- /dev/null +++ b/documentation/example/src/main/scala/example/Main.scala @@ -0,0 +1,21 @@ +package example + +import xyz.driver.core.init + +object Main extends init.SimpleHttpApp { + + lazy val fs = this.storage("data") + + override def applicationRoute = path("data" / Segment) { key => + post { + entity(as[Array[Byte]]) { value => + complete(fs.uploadContent(key, value)) + } + } ~ get { + rejectEmptyResponse{ + complete(fs.content(key)) + } + } + } + +} -- cgit v1.2.3