diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2019-09-16 12:21:10 +0800 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2019-09-16 12:21:33 +0800 |
commit | b83eec01c8db8a8aa499d6c498ff85987005fe83 (patch) | |
tree | 6ec439541ac8636f9a138253f413e26b35c2c194 | |
parent | 84ea971b1261919aca7b31635ddc7d0dca830fea (diff) | |
download | cask-b83eec01c8db8a8aa499d6c498ff85987005fe83.tar.gz cask-b83eec01c8db8a8aa499d6c498ff85987005fe83.tar.bz2 cask-b83eec01c8db8a8aa499d6c498ff85987005fe83.zip |
0.2.80.2.8
-rw-r--r-- | build.sc | 3 | ||||
-rw-r--r-- | cask/src/cask/main/Routes.scala | 2 | ||||
-rw-r--r-- | cask/src/cask/router/Decorators.scala | 1 | ||||
-rw-r--r-- | cask/util/src/cask/util/BatchActor.scala | 2 | ||||
-rw-r--r-- | docs/pages/1 - Cask: a Scala HTTP micro-framework.md | 4 | ||||
-rw-r--r-- | example/compress2/app/src/Compress2.scala | 4 | ||||
-rw-r--r-- | example/compress3/app/src/Compress3.scala | 4 | ||||
-rw-r--r-- | example/minimalApplication2/app/src/MinimalApplication2.scala | 4 | ||||
-rw-r--r-- | example/websockets3/app/src/Websockets3.scala | 21 | ||||
-rw-r--r-- | example/websockets3/app/test/src/ExampleTests.scala | 75 | ||||
-rw-r--r-- | example/websockets3/build.sc | 17 | ||||
-rw-r--r-- | readme.md | 4 |
12 files changed, 126 insertions, 15 deletions
@@ -22,6 +22,7 @@ import $file.example.twirl.build import $file.example.variableRoutes.build import $file.example.websockets.build import $file.example.websockets2.build +import $file.example.websockets3.build trait CaskModule extends ScalaModule with PublishModule{ def scalaVersion = "2.13.0" @@ -115,6 +116,7 @@ object example extends Module{ object variableRoutes extends $file.example.variableRoutes.build.AppModule with LocalModule object websockets extends $file.example.websockets.build.AppModule with LocalModule object websockets2 extends $file.example.websockets2.build.AppModule with LocalModule + object websockets3 extends $file.example.websockets2.build.AppModule with LocalModule } def publishVersion = T.input($file.ci.version.publishVersion) @@ -158,6 +160,7 @@ def uploadToGithub(authKey: String) = T.command{ $file.example.variableRoutes.build.millSourcePath, $file.example.websockets.build.millSourcePath, $file.example.websockets2.build.millSourcePath, + $file.example.websockets3.build.millSourcePath, ) for(example <- examples){ val f = T.ctx().dest diff --git a/cask/src/cask/main/Routes.scala b/cask/src/cask/main/Routes.scala index 98c5b78..f93e641 100644 --- a/cask/src/cask/main/Routes.scala +++ b/cask/src/cask/main/Routes.scala @@ -17,5 +17,5 @@ trait Routes{ metadata0 = routes } - def log: cask.util.Logger + implicit def log: cask.util.Logger } diff --git a/cask/src/cask/router/Decorators.scala b/cask/src/cask/router/Decorators.scala index cd2c1a3..14b4ab4 100644 --- a/cask/src/cask/router/Decorators.scala +++ b/cask/src/cask/router/Decorators.scala @@ -2,7 +2,6 @@ package cask.router import cask.internal.Conversion import cask.model.{Request, Response} -import cask.router.{ArgReader, EntryPoint, Result} /** * A [[Decorator]] allows you to annotate a function to wrap it, via diff --git a/cask/util/src/cask/util/BatchActor.scala b/cask/util/src/cask/util/BatchActor.scala index 137b852..bee4386 100644 --- a/cask/util/src/cask/util/BatchActor.scala +++ b/cask/util/src/cask/util/BatchActor.scala @@ -1,7 +1,5 @@ package cask.util -import cask.util.Logger - import scala.collection.mutable import scala.concurrent.ExecutionContext diff --git a/docs/pages/1 - Cask: a Scala HTTP micro-framework.md b/docs/pages/1 - Cask: a Scala HTTP micro-framework.md index 4a68c2a..3c0f4ef 100644 --- a/docs/pages/1 - Cask: a Scala HTTP micro-framework.md +++ b/docs/pages/1 - Cask: a Scala HTTP micro-framework.md @@ -81,10 +81,10 @@ via the following coordinates: ```scala // Mill -ivy"com.lihaoyi::cask:0.2.7" +ivy"com.lihaoyi::cask:0.2.8" // SBT -"com.lihaoyi" %% "cask" % "0.2.7" +"com.lihaoyi" %% "cask" % "0.2.8" ``` The `./mill` command is just a wrapper around the diff --git a/example/compress2/app/src/Compress2.scala b/example/compress2/app/src/Compress2.scala index b0deaa0..e6c4cc9 100644 --- a/example/compress2/app/src/Compress2.scala +++ b/example/compress2/app/src/Compress2.scala @@ -1,8 +1,6 @@ package app -import cask.util.Logger - -case class Compress2()(implicit val log: Logger) extends cask.Routes{ +case class Compress2()(implicit val log: cask.Logger) extends cask.Routes{ override def decorators = Seq(new cask.decorators.compress()) @cask.get("/") diff --git a/example/compress3/app/src/Compress3.scala b/example/compress3/app/src/Compress3.scala index 95bd851..49062a9 100644 --- a/example/compress3/app/src/Compress3.scala +++ b/example/compress3/app/src/Compress3.scala @@ -1,8 +1,6 @@ package app -import cask.util.Logger - -case class Compress3()(implicit val log: Logger) extends cask.Routes{ +case class Compress3()(implicit val log: cask.Logger) extends cask.Routes{ @cask.get("/") def hello() = { diff --git a/example/minimalApplication2/app/src/MinimalApplication2.scala b/example/minimalApplication2/app/src/MinimalApplication2.scala index 41ca55f..efe9204 100644 --- a/example/minimalApplication2/app/src/MinimalApplication2.scala +++ b/example/minimalApplication2/app/src/MinimalApplication2.scala @@ -1,8 +1,6 @@ package app -import cask.util.Logger - -case class MinimalRoutes()(implicit val log: Logger) extends cask.Routes{ +case class MinimalRoutes()(implicit val log: cask.Logger) extends cask.Routes{ @cask.get("/") def hello() = { "Hello World!" diff --git a/example/websockets3/app/src/Websockets3.scala b/example/websockets3/app/src/Websockets3.scala new file mode 100644 index 0000000..8368e0d --- /dev/null +++ b/example/websockets3/app/src/Websockets3.scala @@ -0,0 +1,21 @@ +package app + +case class Websockets3()(implicit val log: cask.Logger) extends cask.Routes{ + @cask.websocket("/connect/:userName") + def showUserProfile(userName: String): cask.WebsocketResult = { + if (userName != "haoyi") cask.Response("", statusCode = 403) + else cask.WsHandler { channel => + cask.WsActor { + case cask.WsActor.Text("") => channel.send(cask.WsActor.Close()) + case cask.WsActor.Text(data) => + channel.send(cask.WsActor.Text(userName + " " + data)) + } + } + } + + initialize() +} + +object Websockets3Main extends cask.Main{ + val allRoutes = Seq(Websockets3()) +} diff --git a/example/websockets3/app/test/src/ExampleTests.scala b/example/websockets3/app/test/src/ExampleTests.scala new file mode 100644 index 0000000..a595c4c --- /dev/null +++ b/example/websockets3/app/test/src/ExampleTests.scala @@ -0,0 +1,75 @@ +package app + +import java.util.concurrent.atomic.AtomicInteger + +import org.asynchttpclient.ws.{WebSocket, WebSocketListener, WebSocketUpgradeHandler} +import utest._ + +object ExampleTests extends TestSuite{ + + + def withServer[T](example: cask.main.Main)(f: String => T): T = { + val server = io.undertow.Undertow.builder + .addHttpListener(8080, "localhost") + .setHandler(example.defaultHandler) + .build + server.start() + val res = + try f("http://localhost:8080") + finally server.stop() + res + } + + val tests = Tests{ + test("Websockets") - withServer(Websockets3Main){ host => + @volatile var out = List.empty[String] + val client = org.asynchttpclient.Dsl.asyncHttpClient(); + try{ + + // 4. open websocket + val ws: WebSocket = client.prepareGet("ws://localhost:8080/connect/haoyi") + .execute(new WebSocketUpgradeHandler.Builder().addWebSocketListener( + new WebSocketListener() { + + override def onTextFrame(payload: String, finalFragment: Boolean, rsv: Int) { + out = payload :: out + } + + def onOpen(websocket: WebSocket) = () + + def onClose(websocket: WebSocket, code: Int, reason: String) = () + + def onError(t: Throwable) = () + }).build() + ).get() + + // 5. send messages + ws.sendTextFrame("hello") + ws.sendTextFrame("world") + ws.sendTextFrame("") + Thread.sleep(100) + out ==> List("haoyi world", "haoyi hello") + + var error: String = "" + val cli2 = client.prepareGet("ws://localhost:8080/connect/nobody") + .execute(new WebSocketUpgradeHandler.Builder().addWebSocketListener( + new WebSocketListener() { + + def onOpen(websocket: WebSocket) = () + + def onClose(websocket: WebSocket, code: Int, reason: String) = () + + def onError(t: Throwable) = { + error = t.toString + } + }).build() + ).get() + + assert(error.contains("403")) + + } finally{ + client.close() + } + } + } +} diff --git a/example/websockets3/build.sc b/example/websockets3/build.sc new file mode 100644 index 0000000..197e285 --- /dev/null +++ b/example/websockets3/build.sc @@ -0,0 +1,17 @@ +import mill._, scalalib._ + + +trait AppModule extends ScalaModule{ + def scalaVersion = "2.13.0" + def ivyDeps = Agg[Dep]( + ) + object test extends Tests{ + def testFrameworks = Seq("utest.runner.Framework") + + def ivyDeps = Agg( + ivy"com.lihaoyi::utest::0.7.1", + ivy"com.lihaoyi::requests::0.2.0", + ivy"org.asynchttpclient:async-http-client:2.5.2" + ) + } +}
\ No newline at end of file @@ -38,6 +38,10 @@ courtesy of EJ Technologies ## Changelog +### 0.2.8 + +- Make `Routes#log` implicit + ### 0.2.7 - Cross-publish `cask.util` for Scala.js |