From 94d481b2c6c053b18a5d090a5efb253ced446242 Mon Sep 17 00:00:00 2001 From: Nikolay Kushin Date: Sun, 8 Jul 2018 14:33:45 +0200 Subject: [PATCH 1/2] - update scala to 2.12.6 - update scalajs to 0.6.24 - update sbt to 1.1.6 --- build.sbt | 4 ++-- example/build.sbt | 2 +- example/project/build.sbt | 2 +- project/Dependencies.scala | 1 + project/build.properties | 2 +- project/build.sbt | 2 +- 6 files changed, 7 insertions(+), 6 deletions(-) diff --git a/build.sbt b/build.sbt index 18afff1..ed39583 100644 --- a/build.sbt +++ b/build.sbt @@ -10,7 +10,7 @@ lazy val root = project.in(file(".")).settings(defaultSettings:_*).settings( name := "workbench", version := "0.4.1", organization := "com.lihaoyi", - scalaVersion := "2.12.4", + scalaVersion := "2.12.6", sbtPlugin := true, publishArtifact in Test := false, publishTo := Some("releases" at "https://oss.sonatype.org/service/local/staging/deploy/maven2"), @@ -38,7 +38,7 @@ lazy val root = project.in(file(".")).settings(defaultSettings:_*).settings( (fullOptJS in (client, Compile)).value (artifactPath in (client, Compile, fullOptJS)).value }, - addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.21"), + addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.24"), libraryDependencies ++= Seq( Dependencies.akkaHttp, Dependencies.akka, diff --git a/example/build.sbt b/example/build.sbt index 04678aa..e51cda4 100644 --- a/example/build.sbt +++ b/example/build.sbt @@ -8,7 +8,7 @@ enablePlugins(WorkbenchPlugin) name := "Example" -scalaVersion := "2.12.3" +scalaVersion := "2.12.6" version := "0.1-SNAPSHOT" diff --git a/example/project/build.sbt b/example/project/build.sbt index f354c57..2b52827 100644 --- a/example/project/build.sbt +++ b/example/project/build.sbt @@ -1,4 +1,4 @@ -addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.19") +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.24") lazy val workbench = RootProject(file("../..")) lazy val root = project.in(file(".")).dependsOn(workbench) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index d670a01..fafb48c 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -1,5 +1,6 @@ import sbt._ import org.scalajs.sbtplugin.ScalaJSPlugin.autoImport._ +import org.portablescala.sbtplatformdeps.PlatformDepsPlugin.autoImport._ object Dependencies { diff --git a/project/build.properties b/project/build.properties index 9abea12..d6e3507 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.0.3 +sbt.version=1.1.6 diff --git a/project/build.sbt b/project/build.sbt index 061d088..1239852 100644 --- a/project/build.sbt +++ b/project/build.sbt @@ -1 +1 @@ -addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.21") \ No newline at end of file +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.24") From e2058c2f12f0cfdb263f7933781fda97f39ab824 Mon Sep 17 00:00:00 2001 From: Nikolay Kushin Date: Sun, 8 Jul 2018 20:34:02 +0200 Subject: [PATCH 2/2] Updated dependencies (akka), fixed package folder --- .gitignore | 1 + build.sbt | 1 + .../lihaoyi}/workbench/WorkbenchClient.scala | 6 +-- example/src/main/resources/index-dev.html | 2 +- .../main/scala/example/ScalaJSExample.scala | 26 +++++++----- project/Dependencies.scala | 7 ++-- shared/main/scala/com/lihaoyi/package.scala | 42 +++++++++++++++++++ shared/main/scala/workbench/Shared.scala | 39 ----------------- .../lihaoyi}/workbench/CustomDirectives.scala | 1 - .../{ => com/lihaoyi}/workbench/Server.scala | 14 +++---- .../workbench/WorkbenchBasePlugin.scala | 36 +++++++--------- .../lihaoyi}/workbench/WorkbenchPlugin.scala | 3 +- .../workbench/WorkbenchSplicePlugin.scala | 2 +- 13 files changed, 91 insertions(+), 89 deletions(-) rename client/src/main/scala/{ => com/lihaoyi}/workbench/WorkbenchClient.scala (93%) create mode 100644 shared/main/scala/com/lihaoyi/package.scala delete mode 100644 shared/main/scala/workbench/Shared.scala rename src/main/scala/{ => com/lihaoyi}/workbench/CustomDirectives.scala (99%) rename src/main/scala/{ => com/lihaoyi}/workbench/Server.scala (93%) rename src/main/scala/{ => com/lihaoyi}/workbench/WorkbenchBasePlugin.scala (79%) rename src/main/scala/{ => com/lihaoyi}/workbench/WorkbenchPlugin.scala (93%) rename src/main/scala/{ => com/lihaoyi}/workbench/WorkbenchSplicePlugin.scala (97%) diff --git a/.gitignore b/.gitignore index aeea8ed..80d6a65 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ target/ .settings/ .idea .idea_modules +.vscode \ No newline at end of file diff --git a/build.sbt b/build.sbt index ed39583..20151e8 100644 --- a/build.sbt +++ b/build.sbt @@ -42,6 +42,7 @@ lazy val root = project.in(file(".")).settings(defaultSettings:_*).settings( libraryDependencies ++= Seq( Dependencies.akkaHttp, Dependencies.akka, + Dependencies.akkaStream, Dependencies.autowire.value, Dependencies.upickle.value ) diff --git a/client/src/main/scala/workbench/WorkbenchClient.scala b/client/src/main/scala/com/lihaoyi/workbench/WorkbenchClient.scala similarity index 93% rename from client/src/main/scala/workbench/WorkbenchClient.scala rename to client/src/main/scala/com/lihaoyi/workbench/WorkbenchClient.scala index 4336854..31911bb 100644 --- a/client/src/main/scala/workbench/WorkbenchClient.scala +++ b/client/src/main/scala/com/lihaoyi/workbench/WorkbenchClient.scala @@ -19,14 +19,14 @@ object Wire extends autowire.Server[Js.Value, Reader, Writer] with ReadWrite { def wire(parsed: Js.Arr): Unit = { val Js.Arr(path, args: Js.Obj) = parsed val req = new Request(default.readJs[Seq[String]](path), args.value.toMap) - Wire.route[Api](WorkbenchClient).apply(req) + Wire.route[WorkbenchApi](WorkbenchClient).apply(req) } } @JSExportTopLevel("WorkbenchClient") -object WorkbenchClient extends Api { +object WorkbenchClient extends WorkbenchApi { @JSExport - lazy val shadowBody = dom.document.body.cloneNode(deep = true) + lazy val shadowBody: Node = dom.document.body.cloneNode(deep = true) @JSExport var interval = 1000 diff --git a/example/src/main/resources/index-dev.html b/example/src/main/resources/index-dev.html index 6f27812..27cc779 100644 --- a/example/src/main/resources/index-dev.html +++ b/example/src/main/resources/index-dev.html @@ -14,7 +14,7 @@ diff --git a/example/src/main/scala/example/ScalaJSExample.scala b/example/src/main/scala/example/ScalaJSExample.scala index 3298e4f..75e5581 100644 --- a/example/src/main/scala/example/ScalaJSExample.scala +++ b/example/src/main/scala/example/ScalaJSExample.scala @@ -1,33 +1,35 @@ package example -import scala.scalajs.js.annotation.JSExport -import org.scalajs.dom -import org.scalajs.dom.html +import scala.scalajs.js.annotation.{JSExportTopLevel, JSExport} +import org.scalajs.dom.{html, document, window, CanvasRenderingContext2D} import scala.util.Random -case class Point(x: Int, y: Int){ +case class Point(x: Int = Random.nextInt(255), + y: Int = Random.nextInt(255), + dx: Int = Random.nextInt(3) - 1, + dy: Int = Random.nextInt(3) - 1){ def +(p: Point) = Point(x + p.x, y + p.y) def /(d: Int) = Point(x / d, y / d) } -@JSExport +@JSExportTopLevel("example.ScalaJSExample") object ScalaJSExample { val ctx = - dom.document + document .getElementById("canvas") .asInstanceOf[html.Canvas] .getContext("2d") - .asInstanceOf[dom.CanvasRenderingContext2D] + .asInstanceOf[CanvasRenderingContext2D] var p = Point(128, 128) var color = "black" - var enemiess = List.fill(10)(Point(util.Random.nextInt(255), util.Random.nextInt(255))) + var enemiess = List.fill(10)(Point()) def clear() = { ctx.fillStyle = color ctx.fillRect(0, 0, 255, 255) } - def run = { + def run(time: Double): Unit = { clear() ctx.fillStyle = "yellow" p = Point(p.x, (p.y + 2) % 255) @@ -35,11 +37,13 @@ object ScalaJSExample { enemiess = for (enemy <- enemiess) yield { ctx.fillStyle = "red" ctx.fillRect(enemy.x, enemy.y, 10, 10) - Point((enemy.x + 1) % 255, (enemy.y + 1) % 255) + enemy.copy(x = (enemy.x + enemy.dx + 255) % 255, y = (enemy.y + enemy.dy + 255) % 255) } + window.requestAnimationFrame(this.run) } + @JSExport def main(): Unit = { - dom.window.setInterval(() => run, 10) + run(0) } } diff --git a/project/Dependencies.scala b/project/Dependencies.scala index fafb48c..51ec5a4 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -1,16 +1,15 @@ import sbt._ -import org.scalajs.sbtplugin.ScalaJSPlugin.autoImport._ import org.portablescala.sbtplatformdeps.PlatformDepsPlugin.autoImport._ object Dependencies { // jvm dependencies - val akkaHttp = "com.typesafe.akka" %% "akka-http" % "10.0.10" - val akka = "com.typesafe.akka" %% "akka-actor" % "2.4.19" + val akkaHttp = "com.typesafe.akka" %% "akka-http" % "10.1.3" + val akka = "com.typesafe.akka" %% "akka-actor" % "2.5.13" + val akkaStream = "com.typesafe.akka" %% "akka-stream" % "2.5.13" // js and shared dependencies val autowire = Def.setting("com.lihaoyi" %%% "autowire" % "0.2.6") val dom = Def.setting("org.scala-js" %%% "scalajs-dom" % "0.9.3") val upickle = Def.setting("com.lihaoyi" %%% "upickle" % "0.4.4") - } diff --git a/shared/main/scala/com/lihaoyi/package.scala b/shared/main/scala/com/lihaoyi/package.scala new file mode 100644 index 0000000..5f93021 --- /dev/null +++ b/shared/main/scala/com/lihaoyi/package.scala @@ -0,0 +1,42 @@ +package com.lihaoyi + +package object workbench { + + import upickle.default.{Reader, Writer} + import upickle.Js + + /** + * A standard way to read and write `Js.Value`s with autowire/upickle + */ + trait ReadWrite { + def write[Result: Writer](r: Result) = upickle.default.writeJs(r) + def read[Result: Reader](p: Js.Value) = upickle.default.readJs[Result](p) + } + + /** + * Shared API between the workbench server and the workbench client, + * comprising methods the server can call on the client to make it do + * things + */ + trait WorkbenchApi { + /** + * Reset the HTML page to its initial state + */ + def clear(): Unit + /** + * Reload the entire webpage + */ + def reload(): Unit + + /** + * Print a `msg` with the given logging `level` + */ + def print(level: String, msg: String): Unit + + /** + * Execute the javascript file available at the given `path`. + */ + def run(path: String): Unit + } + +} diff --git a/shared/main/scala/workbench/Shared.scala b/shared/main/scala/workbench/Shared.scala deleted file mode 100644 index 9521a86..0000000 --- a/shared/main/scala/workbench/Shared.scala +++ /dev/null @@ -1,39 +0,0 @@ -package com.lihaoyi.workbench - -import upickle.default.{Reader, Writer} -import upickle.Js - - -/** - * A standard way to read and write `Js.Value`s with autowire/upickle - */ -trait ReadWrite { - def write[Result: Writer](r: Result) = upickle.default.writeJs(r) - def read[Result: Reader](p: Js.Value) = upickle.default.readJs[Result](p) -} - -/** - * Shared API between the workbench server and the workbench client, - * comprising methods the server can call on the client to make it do - * things - */ -trait Api { - /** - * Reset the HTML page to its initial state - */ - def clear(): Unit - /** - * Reload the entire webpage - */ - def reload(): Unit - - /** - * Print a `msg` with the given logging `level` - */ - def print(level: String, msg: String): Unit - - /** - * Execute the javascript file available at the given `path`. - */ - def run(path: String): Unit -} diff --git a/src/main/scala/workbench/CustomDirectives.scala b/src/main/scala/com/lihaoyi/workbench/CustomDirectives.scala similarity index 99% rename from src/main/scala/workbench/CustomDirectives.scala rename to src/main/scala/com/lihaoyi/workbench/CustomDirectives.scala index 128775c..6f4dd7d 100644 --- a/src/main/scala/workbench/CustomDirectives.scala +++ b/src/main/scala/com/lihaoyi/workbench/CustomDirectives.scala @@ -1,6 +1,5 @@ package com.lihaoyi.workbench - import java.io.File import akka.event.LoggingAdapter diff --git a/src/main/scala/workbench/Server.scala b/src/main/scala/com/lihaoyi/workbench/Server.scala similarity index 93% rename from src/main/scala/workbench/Server.scala rename to src/main/scala/com/lihaoyi/workbench/Server.scala index 4f70e91..a61156d 100644 --- a/src/main/scala/workbench/Server.scala +++ b/src/main/scala/com/lihaoyi/workbench/Server.scala @@ -2,7 +2,7 @@ package com.lihaoyi.workbench import java.util.concurrent.atomic.AtomicReference -import akka.actor.{Actor, ActorSystem, Props} +import akka.actor.{Actor, ActorSystem, Props, Terminated} import akka.http.scaladsl.Http import akka.http.scaladsl.coding.{Encoder, Gzip, NoCoding} import akka.http.scaladsl.model.HttpMethods._ @@ -49,7 +49,7 @@ class WorkbenchActor extends Actor { queuedMessages = Nil } - override def receive = { + override def receive: Receive = { case a: PromiseMessage => // Even if there's someone already waiting, // a new actor waiting replaces the old one @@ -81,10 +81,10 @@ class Server( `Access-Control-Allow-Headers`("Origin, X-Requested-With, Content-Type, Accept, Accept-Encoding, Accept-Language, Host, Referer, User-Agent"), `Access-Control-Max-Age`(1728000) ) - val cl = getClass.getClassLoader + val cl: ClassLoader = getClass.getClassLoader - implicit val system = ActorSystem( + implicit val system: ActorSystem = ActorSystem( "Workbench-System", config = ConfigFactory.load(cl), classLoader = cl @@ -115,9 +115,9 @@ class Server( */ - implicit val materializer = ActorMaterializer() + implicit val materializer: ActorMaterializer = ActorMaterializer() // needed for the future map/flatmap in the end - implicit val executionContext = system.dispatcher + implicit val executionContext: ExecutionContext = system.dispatcher private val serverBinding = new AtomicReference[Http.ServerBinding]() private val encoder: Encoder = if (useCompression) Gzip else NoCoding @@ -176,7 +176,7 @@ class Server( } } - def kill() = { + def kill(): Future[Terminated] = { system.terminate() } } diff --git a/src/main/scala/workbench/WorkbenchBasePlugin.scala b/src/main/scala/com/lihaoyi/workbench/WorkbenchBasePlugin.scala similarity index 79% rename from src/main/scala/workbench/WorkbenchBasePlugin.scala rename to src/main/scala/com/lihaoyi/workbench/WorkbenchBasePlugin.scala index 2ec0d68..146151a 100644 --- a/src/main/scala/workbench/WorkbenchBasePlugin.scala +++ b/src/main/scala/com/lihaoyi/workbench/WorkbenchBasePlugin.scala @@ -1,21 +1,18 @@ package com.lihaoyi.workbench -import sbt._ -import sbt.Keys._ import autowire._ -import org.scalajs.sbtplugin.ScalaJSPlugin - -import org.apache.logging.log4j.message._ - -import org.apache.logging.log4j.core.{LogEvent => Log4JLogEvent, _} import org.apache.logging.log4j.core.appender.AbstractAppender import org.apache.logging.log4j.core.layout.PatternLayout - -import scala.concurrent.ExecutionContext.Implicits.global +import org.apache.logging.log4j.core.{LogEvent => Log4JLogEvent} +import org.apache.logging.log4j.message._ +import org.scalajs.sbtplugin.ScalaJSPlugin +import sbt.Keys._ +import sbt._ object WorkbenchBasePlugin extends AutoPlugin { + import scala.concurrent.ExecutionContext.Implicits.global - override def requires = ScalaJSPlugin + override def requires: AutoPlugin = ScalaJSPlugin object autoImport { @@ -58,20 +55,19 @@ object WorkbenchBasePlugin extends AutoPlugin { val message = event.getMessage message match { - case o: ObjectMessage => { + case o: ObjectMessage => o.getParameter match { - case e: sbt.internal.util.StringEvent => server.value.Wire[Api].print(level.toString, e.message).call() - case e: sbt.internal.util.ObjectEvent[_] => server.value.Wire[Api].print(level.toString, e.message.toString).call() - case _ => server.value.Wire[Api].print(level.toString, message.getFormattedMessage).call() + case e: sbt.internal.util.StringEvent => server.value.Wire[WorkbenchApi].print(level.toString, e.message).call() + case e: sbt.internal.util.ObjectEvent[_] => server.value.Wire[WorkbenchApi].print(level.toString, e.message.toString).call() + case _ => server.value.Wire[WorkbenchApi].print(level.toString, message.getFormattedMessage).call() } - } - case _ => server.value.Wire[Api].print(level.toString, message.getFormattedMessage).call() + case _ => server.value.Wire[WorkbenchApi].print(level.toString, message.getFormattedMessage).call() } } } clientLogger.start() val currentFunction = extraLoggers.value - (key: ScopedKey[_]) => clientLogger +: currentFunction(key) + key: ScopedKey[_] => clientLogger +: currentFunction(key) }, server := { val server = new Server(localUrl.value._1, localUrl.value._2, @@ -95,8 +91,6 @@ object WorkbenchBasePlugin extends AutoPlugin { } ) - private def getScopeId(scope: ScopeAxis[sbt.Reference]): String = { - "" + scope.hashCode() - } - override def projectSettings = workbenchSettings + private def getScopeId(scope: ScopeAxis[sbt.Reference]): String = s"${scope.hashCode()}" + override def projectSettings: Seq[Setting[_]] = workbenchSettings } diff --git a/src/main/scala/workbench/WorkbenchPlugin.scala b/src/main/scala/com/lihaoyi/workbench/WorkbenchPlugin.scala similarity index 93% rename from src/main/scala/workbench/WorkbenchPlugin.scala rename to src/main/scala/com/lihaoyi/workbench/WorkbenchPlugin.scala index b411b67..e68a72b 100644 --- a/src/main/scala/workbench/WorkbenchPlugin.scala +++ b/src/main/scala/com/lihaoyi/workbench/WorkbenchPlugin.scala @@ -1,4 +1,5 @@ package com.lihaoyi.workbench + import sbt._ import sbt.Keys._ import autowire._ @@ -20,7 +21,7 @@ object WorkbenchPlugin extends AutoPlugin { val workbenchSettings = Seq( refreshBrowsers := { streams.value.log.info("workbench: Reloading Pages...") - server.value.Wire[Api].reload().call() + server.value.Wire[WorkbenchApi].reload().call() }, refreshBrowsers := refreshBrowsers.triggeredBy(fastOptJS in Compile).value diff --git a/src/main/scala/workbench/WorkbenchSplicePlugin.scala b/src/main/scala/com/lihaoyi/workbench/WorkbenchSplicePlugin.scala similarity index 97% rename from src/main/scala/workbench/WorkbenchSplicePlugin.scala rename to src/main/scala/com/lihaoyi/workbench/WorkbenchSplicePlugin.scala index caf6e77..4554bf3 100644 --- a/src/main/scala/workbench/WorkbenchSplicePlugin.scala +++ b/src/main/scala/com/lihaoyi/workbench/WorkbenchSplicePlugin.scala @@ -60,7 +60,7 @@ object WorkbenchSplicePlugin extends AutoPlugin { val s = munge(sbt.IO.read(new sbt.File(path.drop(prefix.length)))) sbt.IO.write(new sbt.File(path.drop(prefix.length) + ".js"), s.getBytes) - server.value.Wire[Api].run(path + ".js").call() + server.value.Wire[WorkbenchApi].run(path + ".js").call() } } },