From 6ef623671ab1968b365471d2b82722b2a1cf9d18 Mon Sep 17 00:00:00 2001 From: Chris Wright Date: Tue, 29 Oct 2019 16:06:39 +0000 Subject: [PATCH] Initial implementation of Play-JSON conversion --- build.sbt | 12 +++ .../playnunjucks/PlayJsonConverter.scala | 20 +++++ .../playnunjucks/PlayJsonConverterSpec.scala | 85 +++++++++++++++++++ 3 files changed, 117 insertions(+) create mode 100644 play-nunjucks/src/main/scala/wolfendale/playnunjucks/PlayJsonConverter.scala create mode 100644 play-nunjucks/src/test/scala/wolfendale/playnunjucks/PlayJsonConverterSpec.scala diff --git a/build.sbt b/build.sbt index 5a3f340..600c5f1 100644 --- a/build.sbt +++ b/build.sbt @@ -39,3 +39,15 @@ lazy val playTest = (project in file("play-test")) uglifyCompressOptions := Seq("unused=false", "dead_code=false"), pipelineStages in Assets := Seq(concat,uglify) ) + +lazy val playNunjucks = (project in file("play-nunjucks")) + .dependsOn(lib) + .settings( + name := "play-nunjucks", + version := "0.1.0", + scalaVersion := "2.11.12", + libraryDependencies ++= Seq( + "org.scalatest" %% "scalatest" % "3.0.8" % Test, + "com.typesafe.play" %% "play" % PlayVersion.current + ) + ) diff --git a/play-nunjucks/src/main/scala/wolfendale/playnunjucks/PlayJsonConverter.scala b/play-nunjucks/src/main/scala/wolfendale/playnunjucks/PlayJsonConverter.scala new file mode 100644 index 0000000..4d7d3b5 --- /dev/null +++ b/play-nunjucks/src/main/scala/wolfendale/playnunjucks/PlayJsonConverter.scala @@ -0,0 +1,20 @@ +package wolfendale.playnunjucks + +import play.api.libs.json.{JsArray, JsBoolean, JsNull, JsNumber, JsObject, JsString, JsValue} +import wolfendale.nunjucks.expression.runtime.Value +import wolfendale.nunjucks.expression.runtime.Value._ + +class PlayJsonConverter { + + def convert(js: JsValue): Value = js match { + case JsNull => Null + case boolean: JsBoolean => Bool(boolean.value) + case JsNumber(value) => Number(value.doubleValue()) + case JsString(value) => Str(value) + case JsArray(value) => Arr(value.map(convert)) + case JsObject(underlying) => + val map = underlying.map({case (key, value) => (key, convert(value))}) + Obj(map.toArray:_*) + } + +} diff --git a/play-nunjucks/src/test/scala/wolfendale/playnunjucks/PlayJsonConverterSpec.scala b/play-nunjucks/src/test/scala/wolfendale/playnunjucks/PlayJsonConverterSpec.scala new file mode 100644 index 0000000..199f8eb --- /dev/null +++ b/play-nunjucks/src/test/scala/wolfendale/playnunjucks/PlayJsonConverterSpec.scala @@ -0,0 +1,85 @@ +package wolfendale.playnunjucks + +import org.scalatest.{FreeSpec, MustMatchers} +import play.api.libs.json.{JsArray, JsBoolean, JsNull, JsNumber, JsObject, JsString} +import wolfendale.nunjucks.expression.runtime.Value +import wolfendale.nunjucks.expression.runtime.Value._ + +class PlayJsonConverterSpec extends FreeSpec with MustMatchers { + + val converter: PlayJsonConverter = new PlayJsonConverter + + "PlayJsonConverter" - { + + "should convert null" in { + converter.convert(JsNull) mustEqual Null + } + + "should convert boolean true" in { + converter.convert(JsBoolean(true)) mustEqual Bool(true) + } + + "should convert boolean false" in { + converter.convert(JsBoolean(false)) mustEqual Bool(false) + } + + "should convert zero" in { + converter.convert(JsNumber(0)) mustEqual Number(0) + } + + "should convert positive integers" in { + converter.convert(JsNumber(1)) mustEqual Number(1) + } + + "should convert negative integers" in { + converter.convert(JsNumber(-1)) mustEqual Number(-1) + } + + "should convert positive doubles" in { + converter.convert(JsNumber(1.5)) mustEqual Number(1.5) + } + + "should convert negative doubles" in { + converter.convert(JsNumber(-1.5)) mustEqual Number(-1.5) + } + + "should convert empty strings" in { + converter.convert(JsString("")) mustEqual Str("") + } + + "should convert non-empty strings" in { + converter.convert(JsString("hello")) mustEqual Str("hello") + } + + "should convert empty arrays" in { + converter.convert(JsArray()) mustEqual Arr(Seq.empty) + } + + "should convert non-empty arrays" in { + converter.convert(JsArray(Seq(JsString("hello"), JsString("world")))) mustEqual Arr(Seq(Str("hello"), Str("world"))) + } + + "should convert simple objects" in { + converter.convert(JsObject(Seq( + ("string", JsString("string")), + ("number", JsNumber(1)), + ("null", JsNull) + ))) + } + + "should convert nested objects" in { + converter.convert(JsObject(Seq( + ("string", JsString("string")), + ("number", JsNumber(1)), + ("null", JsNull), + ("nested", JsObject(Seq( + ("string", JsString("string")), + ("number", JsNumber(1)), + ("null", JsNull) + ))) + ))) + } + + } + +}