Skip to content

Commit

Permalink
staging
Browse files Browse the repository at this point in the history
  • Loading branch information
Andrapyre committed May 20, 2024
1 parent 0fc75ae commit 29ea229
Show file tree
Hide file tree
Showing 5 changed files with 171 additions and 169 deletions.
112 changes: 46 additions & 66 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -55,26 +55,6 @@ addCommandAlias(
"zioJsonNative/test; zioJsonInteropScalaz7xNative/test"
)

val versions = new {
val catsEffect = "3.4.9"
val circe = "0.14.3"
val http4s = "0.23.26"
val jawnAST = "1.5.1"
val jsoniterScala = "2.23.3"
val magnolia2 = "1.1.9+1-bbf5f37f-SNAPSHOT"
val magnolia3 = "1.3.6+1-3bd4ead2+20240516-0424-SNAPSHOT"
val playJson = "2.9.4"
val playJsonExtensions = "0.43.1"
val playJsonExtensions2_12 = "0.42.0"
val refined = "0.10.2"
val scalaCollectionCompat = "2.9.0"
val scalaJavaTime = "2.5.0"
val scalaz = "7.3.7"
val snakeYaml = "2.2"
val zio = "2.1.0"
val zioInteropCats = "23.1.0.2"
}

lazy val zioJsonRoot = project
.in(file("."))
.settings(
Expand Down Expand Up @@ -119,30 +99,30 @@ lazy val zioJson = crossProject(JSPlatform, JVMPlatform, NativePlatform)
Vector.empty
},
libraryDependencies ++= Seq(
"dev.zio" %%% "zio" % versions.zio,
"dev.zio" %%% "zio-streams" % versions.zio,
"org.scala-lang.modules" %%% "scala-collection-compat" % versions.scalaCollectionCompat,
"dev.zio" %%% "zio-test" % versions.zio % "test",
"dev.zio" %%% "zio-test-sbt" % versions.zio % "test",
"io.circe" %%% "circe-core" % versions.circe % "test",
"io.circe" %%% "circe-generic" % versions.circe % "test",
"io.circe" %%% "circe-parser" % versions.circe % "test"
"dev.zio" %%% "zio" % Dependencies.zio,
"dev.zio" %%% "zio-streams" % Dependencies.zio,
"org.scala-lang.modules" %%% "scala-collection-compat" % Dependencies.scalaCollectionCompat,
"dev.zio" %%% "zio-test" % Dependencies.zio % "test",
"dev.zio" %%% "zio-test-sbt" % Dependencies.zio % "test",
"io.circe" %%% "circe-core" % Dependencies.circe % "test",
"io.circe" %%% "circe-generic" % Dependencies.circe % "test",
"io.circe" %%% "circe-parser" % Dependencies.circe % "test"
),
// scala version specific dependencies
libraryDependencies ++= {
CrossVersion.partialVersion(scalaVersion.value) match {
case Some((3, _)) =>
Vector(
"com.softwaremill.magnolia1_3" %%% "magnolia" % versions.magnolia3
"com.softwaremill.magnolia1_3" %%% "magnolia" % Dependencies.magnolia3
)

case _ =>
Vector(
"org.scala-lang" % "scala-reflect" % scalaVersion.value % Provided,
"com.softwaremill.magnolia1_2" %%% "magnolia" % versions.magnolia2,
"io.circe" %%% "circe-generic-extras" % versions.circe % "test",
"com.github.plokhotnyuk.jsoniter-scala" %%% "jsoniter-scala-core" % versions.jsoniterScala % "test",
"com.github.plokhotnyuk.jsoniter-scala" %%% "jsoniter-scala-macros" % versions.jsoniterScala % "test"
"org.scala-lang" % "scala-reflect" % scalaVersion.value % Provided,
"com.softwaremill.magnolia1_2" %%% "magnolia" % Dependencies.magnolia2,
"io.circe" %%% "circe-generic-extras" % Dependencies.circe % "test",
"com.github.plokhotnyuk.jsoniter-scala" %%% "jsoniter-scala-core" % Dependencies.jsoniterScala % "test",
"com.github.plokhotnyuk.jsoniter-scala" %%% "jsoniter-scala-macros" % Dependencies.jsoniterScala % "test"
)
}
},
Expand Down Expand Up @@ -234,30 +214,30 @@ lazy val zioJson = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.settings(testFrameworks += new TestFramework("zio.test.sbt.ZTestFramework"))
.jsSettings(
libraryDependencies ++= Seq(
"io.github.cquiroz" %%% "scala-java-time" % versions.scalaJavaTime,
"io.github.cquiroz" %%% "scala-java-time-tzdb" % versions.scalaJavaTime
"io.github.cquiroz" %%% "scala-java-time" % Dependencies.scalaJavaTime,
"io.github.cquiroz" %%% "scala-java-time-tzdb" % Dependencies.scalaJavaTime
)
)
.jvmSettings(
libraryDependencies ++= {
CrossVersion.partialVersion(scalaVersion.value) match {
case Some((3, _)) =>
Vector(
"org.typelevel" %% "jawn-ast" % versions.jawnAST % "test"
"org.typelevel" %% "jawn-ast" % Dependencies.jawnAST % "test"
)

case Some((2, n)) =>
if (n >= 13) {
Seq(
"com.particeep" %% "play-json-extensions" % versions.playJsonExtensions % "test",
"com.typesafe.play" %%% "play-json" % versions.playJson % "test",
"org.typelevel" %% "jawn-ast" % versions.jawnAST % "test"
"com.particeep" %% "play-json-extensions" % Dependencies.playJsonExtensions % "test",
"com.typesafe.play" %%% "play-json" % Dependencies.playJson % "test",
"org.typelevel" %% "jawn-ast" % Dependencies.jawnAST % "test"
)
} else {
Seq(
"ai.x" %% "play-json-extensions" % versions.playJsonExtensions2_12 % "test",
"com.typesafe.play" %%% "play-json" % versions.playJson % "test",
"org.typelevel" %% "jawn-ast" % versions.jawnAST % "test"
"ai.x" %% "play-json-extensions" % Dependencies.playJsonExtensions2_12 % "test",
"com.typesafe.play" %%% "play-json" % Dependencies.playJson % "test",
"org.typelevel" %% "jawn-ast" % Dependencies.jawnAST % "test"
)
}

Expand All @@ -269,7 +249,7 @@ lazy val zioJson = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.nativeSettings(Test / fork := false)
.nativeSettings(
libraryDependencies ++= Seq(
"io.github.cquiroz" %%% "scala-java-time" % versions.scalaJavaTime
"io.github.cquiroz" %%% "scala-java-time" % Dependencies.scalaJavaTime
)
)
.enablePlugins(BuildInfoPlugin)
Expand All @@ -289,10 +269,10 @@ lazy val zioJsonGolden = project
.settings(buildInfoSettings("zio.json.golden"))
.settings(
libraryDependencies ++= Seq(
"dev.zio" %% "zio" % versions.zio,
"dev.zio" %% "zio-test" % versions.zio,
"dev.zio" %% "zio-test-sbt" % versions.zio,
"dev.zio" %% "zio-test-magnolia" % versions.zio
"dev.zio" %% "zio" % Dependencies.zio,
"dev.zio" %% "zio-test" % Dependencies.zio,
"dev.zio" %% "zio-test-sbt" % Dependencies.zio,
"dev.zio" %% "zio-test-magnolia" % Dependencies.zio
),
testFrameworks += new TestFramework("zio.test.sbt.ZTestFramework")
)
Expand All @@ -305,10 +285,10 @@ lazy val zioJsonYaml = project
.settings(buildInfoSettings("zio.json.yaml"))
.settings(
libraryDependencies ++= Seq(
"org.yaml" % "snakeyaml" % versions.snakeYaml,
"dev.zio" %% "zio" % versions.zio,
"dev.zio" %% "zio-test" % versions.zio % "test",
"dev.zio" %% "zio-test-sbt" % versions.zio % "test"
"org.yaml" % "snakeyaml" % Dependencies.snakeYaml,
"dev.zio" %% "zio" % Dependencies.zio,
"dev.zio" %% "zio-test" % Dependencies.zio % "test",
"dev.zio" %% "zio-test-sbt" % Dependencies.zio % "test"
),
testFrameworks += new TestFramework("zio.test.sbt.ZTestFramework")
)
Expand All @@ -326,8 +306,8 @@ lazy val zioJsonMacros = crossProject(JSPlatform, JVMPlatform, NativePlatform)
scalacOptions -= "-Xfatal-warnings", // not quite ready.
libraryDependencies ++= Seq(
"org.scala-lang" % "scala-reflect" % scalaVersion.value % Provided,
"dev.zio" %%% "zio-test" % versions.zio % "test",
"dev.zio" %%% "zio-test-sbt" % versions.zio % "test"
"dev.zio" %%% "zio-test" % Dependencies.zio % "test",
"dev.zio" %%% "zio-test-sbt" % Dependencies.zio % "test"
),
testFrameworks += new TestFramework("zio.test.sbt.ZTestFramework")
)
Expand All @@ -346,12 +326,12 @@ lazy val zioJsonInteropHttp4s = project
.settings(
crossScalaVersions -= ScalaDotty,
libraryDependencies ++= Seq(
"org.http4s" %% "http4s-dsl" % versions.http4s,
"dev.zio" %% "zio" % versions.zio,
"org.typelevel" %% "cats-effect" % versions.catsEffect,
"dev.zio" %% "zio-interop-cats" % versions.zioInteropCats % "test",
"dev.zio" %% "zio-test" % versions.zio % "test",
"dev.zio" %% "zio-test-sbt" % versions.zio % "test"
"org.http4s" %% "http4s-dsl" % Dependencies.http4s,
"dev.zio" %% "zio" % Dependencies.zio,
"org.typelevel" %% "cats-effect" % Dependencies.catsEffect,
"dev.zio" %% "zio-interop-cats" % Dependencies.zioInteropCats % "test",
"dev.zio" %% "zio-test" % Dependencies.zio % "test",
"dev.zio" %% "zio-test-sbt" % Dependencies.zio % "test"
),
testFrameworks += new TestFramework("zio.test.sbt.ZTestFramework")
)
Expand All @@ -365,9 +345,9 @@ lazy val zioJsonInteropRefined = crossProject(JSPlatform, JVMPlatform, NativePla
.settings(buildInfoSettings("zio.json.interop.refined"))
.settings(
libraryDependencies ++= Seq(
"eu.timepit" %%% "refined" % versions.refined,
"dev.zio" %%% "zio-test" % versions.zio % "test",
"dev.zio" %%% "zio-test-sbt" % versions.zio % "test"
"eu.timepit" %%% "refined" % Dependencies.refined,
"dev.zio" %%% "zio-test" % Dependencies.zio % "test",
"dev.zio" %%% "zio-test-sbt" % Dependencies.zio % "test"
),
testFrameworks += new TestFramework("zio.test.sbt.ZTestFramework")
)
Expand All @@ -381,9 +361,9 @@ lazy val zioJsonInteropScalaz7x = crossProject(JSPlatform, JVMPlatform, NativePl
.settings(
crossScalaVersions -= ScalaDotty,
libraryDependencies ++= Seq(
"org.scalaz" %%% "scalaz-core" % versions.scalaz,
"dev.zio" %%% "zio-test" % versions.zio % "test",
"dev.zio" %%% "zio-test-sbt" % versions.zio % "test"
"org.scalaz" %%% "scalaz-core" % Dependencies.scalaz,
"dev.zio" %%% "zio-test" % Dependencies.zio % "test",
"dev.zio" %%% "zio-test-sbt" % Dependencies.zio % "test"
),
testFrameworks += new TestFramework("zio.test.sbt.ZTestFramework")
)
Expand Down
24 changes: 22 additions & 2 deletions project/BuildHelper.scala
Original file line number Diff line number Diff line change
Expand Up @@ -265,8 +265,8 @@ object BuildHelper {
)

def jsSettings = Seq(
libraryDependencies += "io.github.cquiroz" %%% "scala-java-time" % "2.2.2",
libraryDependencies += "io.github.cquiroz" %%% "scala-java-time-tzdb" % "2.2.2"
libraryDependencies += "io.github.cquiroz" %%% "scala-java-time" % Dependencies.scalaJavaTime,
libraryDependencies += "io.github.cquiroz" %%% "scala-java-time-tzdb" % Dependencies.scalaJavaTime
)

def nativeSettings = Seq(
Expand Down Expand Up @@ -314,4 +314,24 @@ object BuildHelper {
implicit class ModuleHelper(p: Project) {
def module: Project = p.in(file(p.id)).settings(stdSettings(p.id))
}

object Dependencies {
val catsEffect = "3.4.9"
val circe = "0.14.3"
val http4s = "0.23.26"
val jawnAST = "1.5.1"
val jsoniterScala = "2.23.3"
val magnolia2 = "1.1.9+3-96133f8f-SNAPSHOT"
val magnolia3 = "1.3.6+3-f33c4308-SNAPSHOT"
val playJson = "2.9.4"
val playJsonExtensions = "0.43.1"
val playJsonExtensions2_12 = "0.42.0"
val refined = "0.10.2"
val scalaCollectionCompat = "2.9.0"
val scalaJavaTime = "2.5.0"
val scalaz = "7.3.7"
val snakeYaml = "2.2"
val zio = "2.1.0"
val zioInteropCats = "23.1.0.2"
}
}
96 changes: 39 additions & 57 deletions zio-json/shared/src/main/scala-2.x/zio/json/macros.scala
Original file line number Diff line number Diff line change
Expand Up @@ -322,19 +322,27 @@ object DeriveJsonDecoder {
val spans: Array[JsonError] = names.map(JsonError.ObjectAccess)
lazy val tcs: Array[JsonDecoder[Any]] =
ctx.parameters.map(_.typeclass).toArray.asInstanceOf[Array[JsonDecoder[Any]]]
lazy val defaults: Array[Option[Any]] =
ctx.parameters.map(_.default).toArray
lazy val dynamicDefaults: Array[Option[() => Any]] =
ctx.parameters.map { param =>
param.dynamicDefault.flatMap { dynamicDefault =>
val firstVal = dynamicDefault()
val secondVal = dynamicDefault()

if (firstVal != secondVal) {
Some(dynamicDefault)
} else None
}
}.toArray

lazy val defaults: Array[Option[Either[Any, () => Any]]] = ctx.parameters.map { param =>
param.evaluateDefault.flatMap { defaultEvaluator =>
val firstVal = defaultEvaluator()
Thread.sleep(
0,
1
) //Sleeping for one nanosecond ensures that random generators based on clocks, such as Instant.now, will always be different, and therefore recorded as dynamic here.
val secondVal = defaultEvaluator()

if (firstVal != secondVal) {
Some(Right(defaultEvaluator))
} else None
}.orElse(param.default.map(Left(_)))
}.toArray

def getDefaultFromFieldIndex(index: Int): Option[Any] =
defaults(index).map { defaultEither =>
defaultEither.fold(normalDefault => normalDefault, dynamicDefault => dynamicDefault())
}

lazy val namesMap: Map[String, Int] =
(names.zipWithIndex ++ aliases).toMap

Expand All @@ -358,21 +366,13 @@ object DeriveJsonDecoder {
trace_ = spans(field) :: trace
if (ps(field) != null)
throw UnsafeJson(JsonError.Message("duplicate") :: trace)
ps(field) = dynamicDefaults(field).map { dynamicDefault =>
JsonDecoder
.option(tcs(field))
.unsafeDecode(trace_, in)
.getOrElse(dynamicDefault())
}.orElse {
defaults(field).map { default =>
JsonDecoder
.option(tcs(field))
.unsafeDecode(trace_, in)
.getOrElse(default)
ps(field) = JsonDecoder
.option(tcs(field))
.unsafeDecode(trace_, in)
.orElse(getDefaultFromFieldIndex(field))
.getOrElse {
tcs(field).unsafeDecode(trace_, in)
}
}.getOrElse {
tcs(field).unsafeDecode(trace_, in)
}
} else if (no_extra) {
throw UnsafeJson(
JsonError.Message(s"invalid extra field") :: trace
Expand All @@ -384,14 +384,9 @@ object DeriveJsonDecoder {
var i = 0
while (i < len) {
if (ps(i) == null) {
ps(i) = dynamicDefaults(i)
.map(dynamicDefault => dynamicDefault())
.orElse {
defaults(i)
}
.getOrElse {
tcs(i).unsafeDecodeMissing(spans(i) :: trace)
}
ps(i) = getDefaultFromFieldIndex(i).getOrElse {
tcs(i).unsafeDecodeMissing(spans(i) :: trace)
}
}
i += 1
}
Expand All @@ -417,21 +412,13 @@ object DeriveJsonDecoder {
namesMap.get(key) match {
case Some(field) =>
val trace_ = JsonError.ObjectAccess(key) :: trace
ps(field) = dynamicDefaults(field).map { dynamicDefault =>
JsonDecoder
.option(tcs(field))
.unsafeFromJsonAST(trace_, value)
.getOrElse(dynamicDefault())
}.orElse {
defaults(field).map { default =>
JsonDecoder
.option(tcs(field))
.unsafeFromJsonAST(trace_, value)
.getOrElse(default)
ps(field) = JsonDecoder
.option(tcs(field))
.unsafeFromJsonAST(trace_, value)
.orElse(getDefaultFromFieldIndex(field))
.getOrElse {
tcs(field).unsafeFromJsonAST(trace_, value)
}
}.getOrElse {
tcs(field).unsafeFromJsonAST(trace_, value)
}
case None =>
if (no_extra) {
throw UnsafeJson(
Expand All @@ -444,14 +431,9 @@ object DeriveJsonDecoder {
var i = 0
while (i < len) {
if (ps(i) == null) {
ps(i) = dynamicDefaults(i)
.map(dynamic => dynamic())
.orElse(
defaults(i)
)
.getOrElse(
tcs(i).unsafeDecodeMissing(JsonError.ObjectAccess(names(i)) :: trace)
)
ps(i) = getDefaultFromFieldIndex(i).getOrElse(
tcs(i).unsafeDecodeMissing(JsonError.ObjectAccess(names(i)) :: trace)
)
}
i += 1
}
Expand Down
Loading

0 comments on commit 29ea229

Please sign in to comment.