Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: playframework/play-json
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 3.0.1
Choose a base ref
...
head repository: playframework/play-json
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: main
Choose a head ref
Loading
Showing with 306 additions and 128 deletions.
  1. +9 −0 .git-blame-ignore-revs
  2. +20 −0 .github/dependabot.yml
  3. +5 −2 .github/scala-steward.conf
  4. +6 −6 .github/workflows/build-test.yml
  5. +3 −2 .github/workflows/dependency-graph.yml
  6. +1 −3 .github/workflows/publish.yml
  7. +1 −1 .github/workflows/release-drafter.yml
  8. +10 −2 .scalafmt.conf
  9. +27 −13 build.sbt
  10. +18 −12 play-functional/src/main/scala/play/api/libs/functional/Products.scala
  11. +1 −1 play-json/js/src/main/scala/StaticBinding.scala
  12. +1 −1 play-json/jvm/src/main/scala/play/api/libs/json/jackson/JacksonJson.scala
  13. +25 −11 play-json/jvm/src/test/scala-3/play/api/libs/json/JsonMemoryFootprintSpec.scala
  14. +2 −2 play-json/shared/src/main/scala-2.13+/play/api/libs/json/MapWrites.scala
  15. +2 −1 play-json/shared/src/main/scala-2.13-/play/api/libs/json/ImmutableLinkedHashMap.scala
  16. +20 −18 play-json/shared/src/main/scala-2/play/api/libs/json/JsMacroImpl.scala
  17. +2 −2 play-json/shared/src/main/scala-3/play/api/libs/json/ImplicitResolver.scala
  18. +7 −2 play-json/shared/src/main/scala-3/play/api/libs/json/JsMacroImpl.scala
  19. +8 −9 play-json/shared/src/main/scala-3/play/api/libs/json/QuotesHelper.scala
  20. +3 −3 play-json/shared/src/main/scala/play/api/libs/json/JsConstraints.scala
  21. +5 −5 play-json/shared/src/main/scala/play/api/libs/json/JsResult.scala
  22. +47 −13 play-json/shared/src/main/scala/play/api/libs/json/Json.scala
  23. +3 −3 play-json/shared/src/main/scala/play/api/libs/json/Reads.scala
  24. +1 −1 play-json/shared/src/main/scala/play/api/libs/json/Writes.scala
  25. +17 −4 play-json/shared/src/test/scala/play/api/libs/json/JsonSharedSpec.scala
  26. +47 −0 play-json/shared/src/test/scala/play/api/libs/json/MacroSpec.scala
  27. +4 −0 play-json/shared/src/test/scala/play/api/libs/json/WritesSharedSpec.scala
  28. +3 −3 project/Dependencies.scala
  29. +1 −1 project/build.properties
  30. +7 −7 project/plugins.sbt
9 changes: 9 additions & 0 deletions .git-blame-ignore-revs
Original file line number Diff line number Diff line change
@@ -6,3 +6,12 @@

# Scala Steward: Reformat with scalafmt 3.7.5
d284d98d04e21841acd9c5cd4640279c877459c6

# Scala Steward: Reformat with scalafmt 3.7.17
07656d26503cb1f6037231eef6fb742961e23d95

# Scala Steward: Reformat with scalafmt 3.8.2
aea577073fb21a3abae14915dc7c556e13592c16

# Scala Steward: Reformat with scalafmt 3.8.6
59f48891eca2bd9682aa3bcddedbeae290270ba0
20 changes: 20 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
target-branch: "3.0.x"
commit-message:
prefix: "[3.0.x] "
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
target-branch: "2.10.x"
commit-message:
prefix: "[2.10.x] "
7 changes: 5 additions & 2 deletions .github/scala-steward.conf
Original file line number Diff line number Diff line change
@@ -8,7 +8,10 @@ pullRequests.grouping = [

updates.ignore = [
// these will get updated along with jackson-core, so no need to update them separately
{ groupId = "com.fasterxml.jackson.core", artifactId = "jackson-annotations" }
{ groupId = "com.fasterxml.jackson.datatype", artifactId = "jackson-datatype-jdk8" }
{ groupId = "com.fasterxml.jackson.core", artifactId = "jackson-annotations" },
{ groupId = "com.fasterxml.jackson.datatype", artifactId = "jackson-datatype-jdk8" },
{ groupId = "com.fasterxml.jackson.datatype", artifactId = "jackson-datatype-jsr310" }
]

updates.pin = [
]
12 changes: 6 additions & 6 deletions .github/workflows/build-test.yml
Original file line number Diff line number Diff line change
@@ -15,17 +15,17 @@ concurrency:
jobs:
check-code-style:
name: Code Style
uses: playframework/.github/.github/workflows/cmd.yml@v3
uses: playframework/.github/.github/workflows/cmd.yml@v4
with:
cmd: sbt validateCode

check-binary-compatibility:
name: Binary Compatibility
uses: playframework/.github/.github/workflows/binary-check.yml@v3
uses: playframework/.github/.github/workflows/binary-check.yml@v4

check-docs:
name: Docs
uses: playframework/.github/.github/workflows/cmd.yml@v3
uses: playframework/.github/.github/workflows/cmd.yml@v4
with:
cmd: sbt docs/validateDocs

@@ -35,9 +35,9 @@ jobs:
- "check-code-style"
- "check-binary-compatibility"
- "check-docs"
uses: playframework/.github/.github/workflows/cmd.yml@v3
uses: playframework/.github/.github/workflows/cmd.yml@v4
with:
java: 17, 11
java: 21, 17
scala: 2.12.x, 2.13.x, 3.x
cmd: scripts/test-code.sh

@@ -46,4 +46,4 @@ jobs:
if: github.event_name == 'pull_request'
needs: # Should be last
- "tests"
uses: playframework/.github/.github/workflows/rtm.yml@v3
uses: playframework/.github/.github/workflows/rtm.yml@v4
5 changes: 3 additions & 2 deletions .github/workflows/dependency-graph.yml
Original file line number Diff line number Diff line change
@@ -17,10 +17,11 @@ jobs:
name: Submit dependencies to GitHub
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ inputs.ref }}
- uses: scalacenter/sbt-dependency-submission@v2
- uses: sbt/setup-sbt@v1
- uses: scalacenter/sbt-dependency-submission@v3
with:
modules-ignore: docs_2.12 play-functional_2.12 play-json-joda_2.12 play-json_2.12 play-functional_sjs1_2.12 play-json_sjs1_2.12
4 changes: 1 addition & 3 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
@@ -5,11 +5,9 @@ on:
branches: # Snapshots
- main
tags: ["**"] # Releases
release:
types: [published]

jobs:
publish-artifacts:
name: Publish / Artifacts
uses: playframework/.github/.github/workflows/publish.yml@v3
uses: playframework/.github/.github/workflows/publish.yml@v4
secrets: inherit
2 changes: 1 addition & 1 deletion .github/workflows/release-drafter.yml
Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@ jobs:
update_release_draft:
runs-on: ubuntu-latest
steps:
- uses: release-drafter/release-drafter@v5
- uses: release-drafter/release-drafter@v6
with:
name: "Play JSON $RESOLVED_VERSION"
config-name: release-drafts/increasing-minor-version.yml # located in .github/ in the default branch within this or the .github repo
12 changes: 10 additions & 2 deletions .scalafmt.conf
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
version = 3.7.15
version = 3.9.1
runner.dialect = Scala213Source3

align.preset = true
@@ -51,4 +51,12 @@ fileOverride {

project.excludePaths = [
"glob:**/docs/**/code*/*.scala"
]
]

rewrite.scala3.convertToNewSyntax = true
runner.dialectOverride {
allowSignificantIndentation = false
allowAsForImportRename = false
allowStarWildcardImport = false
allowPostfixStarVarargSplices = false
}
40 changes: 27 additions & 13 deletions build.sbt
Original file line number Diff line number Diff line change
@@ -18,7 +18,7 @@ val isScala3 = Def.setting {

def specs2(scalaVersion: String) =
Seq("core", "junit").map { n =>
("org.specs2" %% s"specs2-$n" % "4.20.2") % Test
("org.specs2" %% s"specs2-$n" % "4.20.9") % Test
}

val jacksonDatabindVersion = "2.14.3"
@@ -35,31 +35,45 @@ val jacksons = Seq(
).map(_ % jacksonVersion) ++ jacksonDatabind

val joda = Seq(
"joda-time" % "joda-time" % "2.12.5"
"joda-time" % "joda-time" % "2.13.1"
)

// Common settings

val previousVersion: Option[String] = Some("3.0.0")
val previousVersion: Option[String] = Some("3.1.0-M1")

// Do not check for previous JS artifacts for upgrade to Scala.js 1.0 because no sjs1 artifacts exist
def playJsonMimaSettings = Seq(
mimaPreviousArtifacts := previousVersion.map(organization.value %%% moduleName.value % _).toSet,
mimaBinaryIssueFilters ++= Seq(
),
mimaBinaryIssueFilters ++= {
val missingMethodInOld: ProblemFilter = {
case ReversedAbstractMethodProblem(_) | ReversedMissingMethodProblem(_) =>
false

case DirectMissingMethodProblem(old) => old.nonAccessible
case InheritedNewAbstractMethodProblem(_, _) => false
case IncompatibleResultTypeProblem(old, _) => old.nonAccessible
case IncompatibleMethTypeProblem(old, _) => old.nonAccessible
case MissingClassProblem(old) => !old.isPublic
case AbstractClassProblem(old) => !old.isPublic
case _ => true
}

Seq(missingMethodInOld)
}
)

val javacSettings = Seq(
"-source",
"11",
"17",
"-Xlint:deprecation",
"-Xlint:unchecked",
)

val scalacOpts = Seq(
"-language:higherKinds",
"-release",
"11",
"17",
"-Ywarn-unused:imports",
"-Xlint:nullary-unit",
"-Xlint",
@@ -96,7 +110,7 @@ lazy val commonSettings = Def.settings(
crossScalaVersions := Seq(Dependencies.Scala212, Dependencies.Scala213, Dependencies.Scala3),
Compile / javacOptions ++= javacSettings,
Test / javacOptions ++= javacSettings,
Compile / compile / javacOptions ++= Seq("--release", "11"), // sbt #1785, avoids passing to javadoc
Compile / compile / javacOptions ++= Seq("--release", "17"), // sbt #1785, avoids passing to javadoc
scalacOptions ++= (if (isScala3.value) Nil else scalacOpts),
Compile / doc / scalacOptions ++= Seq(
// Work around 2.12 bug which prevents javadoc in nested java classes from compiling.
@@ -133,7 +147,7 @@ lazy val `play-json` = crossProject(JVMPlatform, JSPlatform, NativePlatform)
)
.nativeSettings(
libraryDependencies ++= Seq(
"org.typelevel" %%% "jawn-parser" % "1.5.1"
"org.typelevel" %%% "jawn-parser" % "1.6.0"
)
)
.settings(
@@ -144,9 +158,9 @@ lazy val `play-json` = crossProject(JVMPlatform, JSPlatform, NativePlatform)
Seq("org.scala-lang" % "scala-reflect" % scalaVersion.value)
),
libraryDependencies ++= Seq(
"org.scalatest" %%% "scalatest" % "3.2.17" % Test,
"org.scalatestplus" %%% "scalacheck-1-16" % "3.2.14.0" % Test,
"org.scalacheck" %%% "scalacheck" % "1.17.0" % Test,
"org.scalatest" %%% "scalatest" % "3.2.19" % Test,
"org.scalatestplus" %%% "scalacheck-1-18" % "3.2.19.0" % Test,
"org.scalacheck" %%% "scalacheck" % "1.18.1" % Test,
),
libraryDependencies += {
if (isScala3.value) {
@@ -237,7 +251,7 @@ lazy val `play-jsonJVM` = `play-json`.jvm
else
specs2(scalaVersion.value)
} :+ (
"ch.qos.logback" % "logback-classic" % "1.4.11" % Test
"ch.qos.logback" % "logback-classic" % "1.5.17" % Test
),
Test / unmanagedSourceDirectories ++= (docsP / PlayDocsKeys.scalaManualSourceDirectories).value,
)
Original file line number Diff line number Diff line change
@@ -3000,8 +3000,9 @@ class FunctionalBuilder[M[_]](canBuild: FunctionalCanBuild[M]) {
B
](
canBuild(m1, m2),
{ case a1 ~ a2 ~ a3 ~ a4 ~ a5 ~ a6 ~ a7 ~ a8 ~ a9 ~ a10 ~ a11 ~ a12 ~ a13 ~ a14 ~ a15 ~ a16 ~ a17 ~ a18 ~ a19 ~ a20 =>
f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
{
case a1 ~ a2 ~ a3 ~ a4 ~ a5 ~ a6 ~ a7 ~ a8 ~ a9 ~ a10 ~ a11 ~ a12 ~ a13 ~ a14 ~ a15 ~ a16 ~ a17 ~ a18 ~ a19 ~ a20 =>
f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
}
)

@@ -3061,8 +3062,9 @@ class FunctionalBuilder[M[_]](canBuild: FunctionalCanBuild[M]) {
B
](
canBuild(m1, m2),
{ case a1 ~ a2 ~ a3 ~ a4 ~ a5 ~ a6 ~ a7 ~ a8 ~ a9 ~ a10 ~ a11 ~ a12 ~ a13 ~ a14 ~ a15 ~ a16 ~ a17 ~ a18 ~ a19 ~ a20 =>
f1(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
{
case a1 ~ a2 ~ a3 ~ a4 ~ a5 ~ a6 ~ a7 ~ a8 ~ a9 ~ a10 ~ a11 ~ a12 ~ a13 ~ a14 ~ a15 ~ a16 ~ a17 ~ a18 ~ a19 ~ a20 =>
f1(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
},
(b: B) => {
val (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) = f2(b);
@@ -3408,8 +3410,9 @@ class FunctionalBuilder[M[_]](canBuild: FunctionalCanBuild[M]) {
B
](
canBuild(m1, m2),
{ case a1 ~ a2 ~ a3 ~ a4 ~ a5 ~ a6 ~ a7 ~ a8 ~ a9 ~ a10 ~ a11 ~ a12 ~ a13 ~ a14 ~ a15 ~ a16 ~ a17 ~ a18 ~ a19 ~ a20 ~ a21 =>
f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21)
{
case a1 ~ a2 ~ a3 ~ a4 ~ a5 ~ a6 ~ a7 ~ a8 ~ a9 ~ a10 ~ a11 ~ a12 ~ a13 ~ a14 ~ a15 ~ a16 ~ a17 ~ a18 ~ a19 ~ a20 ~ a21 =>
f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21)
}
)

@@ -3472,8 +3475,9 @@ class FunctionalBuilder[M[_]](canBuild: FunctionalCanBuild[M]) {
B
](
canBuild(m1, m2),
{ case a1 ~ a2 ~ a3 ~ a4 ~ a5 ~ a6 ~ a7 ~ a8 ~ a9 ~ a10 ~ a11 ~ a12 ~ a13 ~ a14 ~ a15 ~ a16 ~ a17 ~ a18 ~ a19 ~ a20 ~ a21 =>
f1(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21)
{
case a1 ~ a2 ~ a3 ~ a4 ~ a5 ~ a6 ~ a7 ~ a8 ~ a9 ~ a10 ~ a11 ~ a12 ~ a13 ~ a14 ~ a15 ~ a16 ~ a17 ~ a18 ~ a19 ~ a20 ~ a21 =>
f1(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21)
},
(b: B) => {
val (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21) = f2(b);
@@ -3805,8 +3809,9 @@ class FunctionalBuilder[M[_]](canBuild: FunctionalCanBuild[M]) {
B
](
canBuild(m1, m2),
{ case a1 ~ a2 ~ a3 ~ a4 ~ a5 ~ a6 ~ a7 ~ a8 ~ a9 ~ a10 ~ a11 ~ a12 ~ a13 ~ a14 ~ a15 ~ a16 ~ a17 ~ a18 ~ a19 ~ a20 ~ a21 ~ a22 =>
f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22)
{
case a1 ~ a2 ~ a3 ~ a4 ~ a5 ~ a6 ~ a7 ~ a8 ~ a9 ~ a10 ~ a11 ~ a12 ~ a13 ~ a14 ~ a15 ~ a16 ~ a17 ~ a18 ~ a19 ~ a20 ~ a21 ~ a22 =>
f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22)
}
)

@@ -3873,8 +3878,9 @@ class FunctionalBuilder[M[_]](canBuild: FunctionalCanBuild[M]) {
B
](
canBuild(m1, m2),
{ case a1 ~ a2 ~ a3 ~ a4 ~ a5 ~ a6 ~ a7 ~ a8 ~ a9 ~ a10 ~ a11 ~ a12 ~ a13 ~ a14 ~ a15 ~ a16 ~ a17 ~ a18 ~ a19 ~ a20 ~ a21 ~ a22 =>
f1(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22)
{
case a1 ~ a2 ~ a3 ~ a4 ~ a5 ~ a6 ~ a7 ~ a8 ~ a9 ~ a10 ~ a11 ~ a12 ~ a13 ~ a14 ~ a15 ~ a16 ~ a17 ~ a18 ~ a19 ~ a20 ~ a21 ~ a22 =>
f1(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22)
},
(b: B) => {
val (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22) =
2 changes: 1 addition & 1 deletion play-json/js/src/main/scala/StaticBinding.scala
Original file line number Diff line number Diff line change
@@ -40,7 +40,7 @@ object StaticBinding {
case l: Long => JsNumber(l)
case true => JsTrue
case false => JsFalse
case a: js.Array[_] => JsArray(a.map(anyToJsValue).toArray[JsValue])
case a: js.Array[?] => JsArray(a.map(anyToJsValue).toArray[JsValue])

case o: js.Object => {
JsObject((for {
Original file line number Diff line number Diff line change
@@ -150,7 +150,7 @@ private[jackson] case class ReadingMap(content: ListBuffer[(String, JsValue)]) e
throw new Exception("Cannot add a value on an object without a key, malformed JSON object!")
}

private[jackson] class JsValueDeserializer(factory: TypeFactory, klass: Class[_], jsonConfig: JsonConfig)
private[jackson] class JsValueDeserializer(factory: TypeFactory, klass: Class[?], jsonConfig: JsonConfig)
extends JsonDeserializer[Object] {
override def isCachable: Boolean = true

Loading