Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 9 additions & 10 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,8 @@ lazy val pluginSettings = Seq(
"org.scalactic" %% "scalactic" % "3.0.0",
"org.scalatest" %% "scalatest" % "3.0.0" % "test",
"org.scalacheck" %% "scalacheck" % "1.13.2" % "test"
),
scalafmtConfig in ThisBuild := Some(file(".scalafmt"))
) ++ reformatOnCompileSettings
)
)

lazy val micrositeSettings = Seq(
micrositeName := "sbt-microsites",
Expand All @@ -41,18 +40,18 @@ lazy val micrositeSettings = Seq(
val circeVersion = "0.5.2"

lazy val jsSettings = Seq(
scalaVersion := "2.11.8",
scalaJSStage in Global := FastOptStage,
parallelExecution := false,
scalaJSUseRhino := false,
requiresDOM := false,
jsEnv := NodeJSEnv().value,
libraryDependencies ++= Seq(
"org.scala-js" %%% "scalajs-dom" % "0.9.0",
"be.doeraene" %%% "scalajs-jquery" % "0.9.0",
"com.lihaoyi" %%% "upickle" % "0.4.1"
"com.lihaoyi" %%% "upickle" % "0.4.1",
"org.typelevel" %%% "cats" % "0.6.1",
"org.scala-exercises" %%% "evaluator-client" % "0.0.4-SNAPSHOT" changing()
),
jsDependencies +=
"org.webjars" % "jquery" % "2.1.3" / "2.1.3/jquery.js",
resolvers += Resolver.url(
"bintray-sbt-plugin-releases",
url("https://dl.bintray.com/content/sbt/sbt-plugin-releases"))(Resolver.ivyStylePatterns)
Expand Down Expand Up @@ -96,16 +95,16 @@ lazy val miscSettings = Seq(
val projectName = Project.extract(s).currentProject.id

s"$blue$projectName$white>${c.RESET}"
}
)
},
scalafmtConfig in ThisBuild := Some(file(".scalafmt"))
) ++ reformatOnCompileSettings

lazy val commonSettings = artifactSettings ++ miscSettings
lazy val allSettings = pluginSettings ++ commonSettings ++ tutSettings ++ testSettings

lazy val `sbt-microsites` = (project in file("."))
.settings(moduleName := "sbt-microsites")
.settings(allSettings: _*)
.settings(addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.0.3"))
.settings(addSbtPlugin("org.tpolecat" % "tut-plugin" % "0.4.4"))
.settings(addSbtPlugin("com.typesafe.sbt" % "sbt-site" % "1.0.0"))
.settings(addSbtPlugin("com.typesafe.sbt" % "sbt-ghpages" % "0.5.4"))
Expand Down
89 changes: 47 additions & 42 deletions js/src/main/scala/kazari/KazariPlugin.scala
Original file line number Diff line number Diff line change
Expand Up @@ -7,77 +7,82 @@ import scala.scalajs.js.JSApp
import scala.scalajs.js.annotation.JSExport
import dom.ext.PimpedNodeList
import kazari.model.{EvaluatorConfig, EvaluatorDependency, EvaluatorRequest}
import org.scalajs.jquery.{JQueryAjaxSettings, JQueryXHR, jQuery}

import scala.scalajs.js
import org.scalaexercises.evaluator.{EvalResponse, EvaluatorClient}
import upickle.default._
import cats.Eval
import cats.data.Xor
import org.scalaexercises.evaluator.EvaluatorClient._
import org.scalaexercises.evaluator.EvaluatorResponses.{EvaluationResponse, EvaluationResult}
import org.scalaexercises.evaluator.implicits._

import scala.concurrent.Future

object KazariPlugin extends JSApp with DOMHelper {
val codeExcludeClass = "code-exclude"
val codeExcludeClass = "code-exclude"
lazy val codeSnippets = document.querySelectorAll(s"code.language-scala:not(.$codeExcludeClass)")

@JSExport
def main(): Unit = { }
def main(): Unit = {}

@JSExport
def decorateCode(config: EvaluatorConfig): Unit = {
val textSnippets = generateCodeTextSnippets()

codeSnippets.zipWithIndex foreach { case (node, i) =>
appendButton(node, "Evaluate", onClickFunction = (e: dom.MouseEvent) => {
val snippet = textSnippets.lift(i + 1)
val request = generateEvalRequest(snippet.getOrElse(""), Seq[String](), Seq[EvaluatorDependency]())
codeSnippets.zipWithIndex foreach {
case (node, i) =>
appendButton(node, "Evaluate", onClickFunction = (e: dom.MouseEvent) => {
val snippet = textSnippets.lift(i + 1)
val request =
generateEvalRequest(snippet.getOrElse(""), Seq[String](), Seq[EvaluatorDependency]())

requestEvaluationOfSnippet(request,
config.url,
config.authToken,
(data: js.Any, textStatus: String, jqHXR: JQueryXHR) => {
println(s"Connection to evaluator established: $textStatus")
},
(jqHXR: JQueryXHR, status: String, error: String) => {
println(s"Error while connecting with remote evaluator: $error")
}
)
});
requestEvaluationOfSnippet(request, config.url, config.authToken)
});
}
}

def generateCodeTextSnippets() = {
codeSnippets.map(_.textContent)
.scanLeft("")((currentItem, result) => currentItem + result)
codeSnippets.map(_.textContent).scanLeft("")((currentItem, result) => currentItem + result)
}

def requestEvaluationOfSnippet(snippet: String,
url: String,
token: String,
success: (js.Any, String, JQueryXHR) => Unit,
failure: (JQueryXHR, String, String) => Unit) = {
val settings = js.Dynamic.literal(
`type` = "POST",
url = url,
beforeSend = (xhrObj: JQueryXHR) => {
xhrObj.setRequestHeader("X-Scala-Eval-Api-Token", token)
xhrObj.setRequestHeader("Content-Type", "application/json")
},
data = snippet,
success = success,
error = failure
).asInstanceOf[JQueryAjaxSettings]
def requestEvaluationOfSnippet(snippet: String, url: String, token: String) = {
import cats.implicits._
import scala.concurrent.ExecutionContext.Implicits.global
val response: EvaluationResponse[EvalResponse] = {
EvaluatorClient(url, token).api.evaluates(Nil, Nil, snippet).exec[Future]
???
}

jQuery.ajax(settings)
response match {
case Xor.Left(msg) ⇒
case Xor.Right(
EvaluationResult(EvalResponse(EvalResponse.messages.ok, _, _, _),
statusCode,
headers)) =>
println(s"Connection to evaluator established")
case Xor.Right(
EvaluationResult(EvalResponse(msg, value, valueType, compilationInfos),
statusCode,
headers)) =>
println(s"Error while connecting with remote evaluator: $msg")
}
}

def generateEvalRequest(snippet: String, resolvers: Seq[String], dependencies: Seq[EvaluatorDependency]): String =
def generateEvalRequest(snippet: String,
resolvers: Seq[String],
dependencies: Seq[EvaluatorDependency]): String =
write(EvaluatorRequest(resolvers, dependencies, snippet))
}

trait DOMHelper {
def appendButton[T](targetNode: dom.Node, title: String, onClickFunction: Function[_, T], id: Option[String] = None): dom.Node = {
def appendButton[T](targetNode: dom.Node,
title: String,
onClickFunction: Function[_, T],
id: Option[String] = None): dom.Node = {
val btnNode = document.createElement("button")
btnNode.appendChild(document.createTextNode(title))
btnNode.setAttribute("type", "button")
btnNode.setAttribute("id", id.getOrElse(""))
btnNode.addEventListener("click", onClickFunction)
targetNode.appendChild(btnNode)
}
}
}
2 changes: 1 addition & 1 deletion js/src/main/scala/kazari/model/EvaluatorConfig.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ package kazari.model
import scala.scalajs.js.annotation.JSExport

@JSExport
case class EvaluatorConfig(url: String, authToken: String)
case class EvaluatorConfig(url: String, authToken: String)
6 changes: 4 additions & 2 deletions js/src/main/scala/kazari/model/EvaluatorRequest.scala
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
package kazari.model

case class EvaluatorRequest(resolvers: Seq[String], dependencies: Seq[EvaluatorDependency], code: String)
case class EvaluatorDependency(groupId: String, artifactId: String, version: String)
case class EvaluatorRequest(resolvers: Seq[String],
dependencies: Seq[EvaluatorDependency],
code: String)
case class EvaluatorDependency(groupId: String, artifactId: String, version: String)