Skip to content

Commit b5ef49b

Browse files
committed
Building with scala 3 (backport)
Backport of spray#342 to the release-1.3.x branch
1 parent d0008f5 commit b5ef49b

16 files changed

+64
-54
lines changed

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ scala:
55
- 2.11.12
66
- 2.12.12
77
- 2.13.3
8+
- 3.1.0
89

910
before_install:
1011
# make comparing to origin/master work

build.sbt

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ scalacOptions ++= Seq("-feature", "-language:_", "-unchecked", "-deprecation", "
2121
resolvers += Opts.resolver.sonatypeReleases
2222

2323
libraryDependencies ++= (CrossVersion.partialVersion(scalaVersion.value) match {
24+
case Some((3, n)) => Seq(
25+
("org.specs2" %% "specs2-core" % "4.5.1" % "test").cross(CrossVersion.for3Use2_13),
26+
("org.specs2" %% "specs2-scalacheck" % "4.5.1" % "test").cross(CrossVersion.for3Use2_13),
27+
("org.scalacheck" %% "scalacheck" % "1.15.4" % "test").cross(CrossVersion.for3Use2_13)
28+
)
2429
case Some((2, 10)) => Seq(
2530
"org.specs2" %% "specs2-core" % "3.8.9" % "test",
2631
"org.specs2" %% "specs2-scalacheck" % "3.8.9" % "test",
@@ -51,10 +56,13 @@ OsgiKeys.importPackage ++= Seq("""spray.json;version="${Bundle-Version}"""", "*"
5156
OsgiKeys.additionalHeaders := Map("-removeheaders" -> "Include-Resource,Private-Package")
5257

5358
// Migration Manager
59+
ThisBuild / mimaReportSignatureProblems := true
5460
mimaPreviousArtifacts := (CrossVersion.partialVersion(scalaVersion.value) match {
55-
case Some((2, 13)) => Set.empty
61+
case Some((3, _)) => Set.empty
62+
case Some((2, 13)) => Set("io.spray" %% "spray-json" % "1.3.5")
63+
case Some((2, 10)) => Set.empty
5664
case _ =>
57-
Set("1.3.2", "1.3.3", "1.3.4").map { v =>
65+
Set("1.3.2", "1.3.3", "1.3.4", "1.3.5").map { v =>
5866
"io.spray" %% "spray-json" % v
5967
}
6068
})
@@ -67,7 +75,7 @@ mimaBinaryIssueFilters := Seq(
6775
// publishing
6876
///////////////
6977

70-
crossScalaVersions := Seq("2.12.12", "2.10.7", "2.11.12", "2.13.3")
78+
crossScalaVersions := Seq("2.12.12", "2.10.7", "2.11.12", "2.13.3", "3.1.0")
7179

7280
publishMavenStyle := true
7381

@@ -92,3 +100,4 @@ pomExtra :=
92100
<developer><id>sirthias</id><name>Mathias Doenitz</name></developer>
93101
<developer><id>jrudolph</id><name>Johannes Rudolph</name></developer>
94102
</developers>
103+

project/build.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
sbt.version=1.2.7
1+
sbt.version=1.5.4

project/plugins.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ addSbtPlugin("com.typesafe.sbt" % "sbt-osgi" % "0.9.4")
44

55
addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.1.2")
66

7-
addSbtPlugin("com.typesafe" % "sbt-mima-plugin" % "0.3.0")
7+
addSbtPlugin("com.typesafe" % "sbt-mima-plugin" % "1.0.1")

src/main/boilerplate/spray/json/ProductFormatsInstances.scala.template

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ package spray.json
1818

1919
import scala.reflect.{ classTag, ClassTag }
2020

21-
trait ProductFormatsInstances { self: ProductFormats with StandardFormats =>
21+
trait ProductFormatsInstances { self: ProductFormats with StandardFormats with AdditionalFormats =>
2222
[# // Case classes with 1 parameters
2323

2424
def jsonFormat1[[#P1 :JF#], T <: Product :ClassTag](construct: ([#P1#]) => T): RootJsonFormat[T] = {

src/main/scala/spray/json/CollectionFormats.scala

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ trait CollectionFormats {
2424
/**
2525
* Supplies the JsonFormat for Lists.
2626
*/
27-
implicit def listFormat[T :JsonFormat] = new RootJsonFormat[List[T]] {
27+
implicit def listFormat[T :JsonFormat]: RootJsonFormat[List[T]] = new RootJsonFormat[List[T]] {
2828
def write(list: List[T]) = JsArray(list.map(_.toJson).toVector)
2929
def read(value: JsValue): List[T] = value match {
3030
case JsArray(elements) => elements.toIterator.map(_.convertTo[T]).toList
@@ -35,7 +35,7 @@ trait CollectionFormats {
3535
/**
3636
* Supplies the JsonFormat for Arrays.
3737
*/
38-
implicit def arrayFormat[T :JsonFormat :ClassTag] = new RootJsonFormat[Array[T]] {
38+
implicit def arrayFormat[T :JsonFormat :ClassTag]: RootJsonFormat[Array[T]] = new RootJsonFormat[Array[T]] {
3939
def write(array: Array[T]) = JsArray(array.map(_.toJson).toVector)
4040
def read(value: JsValue) = value match {
4141
case JsArray(elements) => elements.map(_.convertTo[T]).toArray[T]
@@ -47,7 +47,7 @@ trait CollectionFormats {
4747
* Supplies the JsonFormat for Maps. The implicitly available JsonFormat for the key type K must
4848
* always write JsStrings, otherwise a [[spray.json.SerializationException]] will be thrown.
4949
*/
50-
implicit def mapFormat[K :JsonFormat, V :JsonFormat] = new RootJsonFormat[Map[K, V]] {
50+
implicit def mapFormat[K :JsonFormat, V :JsonFormat]: RootJsonFormat[Map[K, V]] = new RootJsonFormat[Map[K, V]] {
5151
def write(m: Map[K, V]) = JsObject {
5252
m.map { field =>
5353
field._1.toJson match {
@@ -66,20 +66,20 @@ trait CollectionFormats {
6666

6767
import collection.{immutable => imm}
6868

69-
implicit def immIterableFormat[T :JsonFormat] = viaSeq[imm.Iterable[T], T](seq => imm.Iterable(seq :_*))
70-
implicit def immSeqFormat[T :JsonFormat] = viaSeq[imm.Seq[T], T](seq => imm.Seq(seq :_*))
71-
implicit def immIndexedSeqFormat[T :JsonFormat] = viaSeq[imm.IndexedSeq[T], T](seq => imm.IndexedSeq(seq :_*))
72-
implicit def immLinearSeqFormat[T :JsonFormat] = viaSeq[imm.LinearSeq[T], T](seq => imm.LinearSeq(seq :_*))
73-
implicit def immSetFormat[T :JsonFormat] = viaSeq[imm.Set[T], T](seq => imm.Set(seq :_*))
74-
implicit def vectorFormat[T :JsonFormat] = viaSeq[Vector[T], T](seq => Vector(seq :_*))
69+
implicit def immIterableFormat[T :JsonFormat]: RootJsonFormat[imm.Iterable[T]] = viaSeq[imm.Iterable[T], T](seq => imm.Iterable(seq :_*))
70+
implicit def immSeqFormat[T :JsonFormat]: RootJsonFormat[imm.Seq[T]] = viaSeq[imm.Seq[T], T](seq => imm.Seq(seq :_*))
71+
implicit def immIndexedSeqFormat[T :JsonFormat]: RootJsonFormat[imm.IndexedSeq[T]] = viaSeq[imm.IndexedSeq[T], T](seq => imm.IndexedSeq(seq :_*))
72+
implicit def immLinearSeqFormat[T :JsonFormat]: RootJsonFormat[imm.LinearSeq[T]] = viaSeq[imm.LinearSeq[T], T](seq => imm.LinearSeq(seq :_*))
73+
implicit def immSetFormat[T :JsonFormat]: RootJsonFormat[imm.Set[T]] = viaSeq[imm.Set[T], T](seq => imm.Set(seq :_*))
74+
implicit def vectorFormat[T :JsonFormat]: RootJsonFormat[Vector[T]] = viaSeq[Vector[T], T](seq => Vector(seq :_*))
7575

7676
import collection._
7777

78-
implicit def iterableFormat[T :JsonFormat] = viaSeq[Iterable[T], T](seq => Iterable(seq :_*))
79-
implicit def seqFormat[T :JsonFormat] = viaSeq[Seq[T], T](seq => Seq(seq :_*))
80-
implicit def indexedSeqFormat[T :JsonFormat] = viaSeq[IndexedSeq[T], T](seq => IndexedSeq(seq :_*))
81-
implicit def linearSeqFormat[T :JsonFormat] = viaSeq[LinearSeq[T], T](seq => LinearSeq(seq :_*))
82-
implicit def setFormat[T :JsonFormat] = viaSeq[Set[T], T](seq => Set(seq :_*))
78+
implicit def iterableFormat[T :JsonFormat]: RootJsonFormat[Iterable[T]] = viaSeq[Iterable[T], T](seq => Iterable(seq :_*))
79+
implicit def seqFormat[T :JsonFormat]: RootJsonFormat[Seq[T]] = viaSeq[Seq[T], T](seq => Seq(seq :_*))
80+
implicit def indexedSeqFormat[T :JsonFormat]: RootJsonFormat[IndexedSeq[T]] = viaSeq[IndexedSeq[T], T](seq => IndexedSeq(seq :_*))
81+
implicit def linearSeqFormat[T :JsonFormat]: RootJsonFormat[LinearSeq[T]] = viaSeq[LinearSeq[T], T](seq => LinearSeq(seq :_*))
82+
implicit def setFormat[T :JsonFormat]: RootJsonFormat[Set[T]] = viaSeq[Set[T], T](seq => Set(seq :_*))
8383

8484
/**
8585
* A JsonFormat construction helper that creates a JsonFormat for an Iterable type I from a builder function

src/main/scala/spray/json/ProductFormats.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import scala.reflect.ClassTag
2626
* (especially case classes)
2727
*/
2828
trait ProductFormats extends ProductFormatsInstances {
29-
this: StandardFormats =>
29+
this: StandardFormats with AdditionalFormats =>
3030

3131
def jsonFormat0[T](construct: () => T): RootJsonFormat[T] =
3232
new RootJsonFormat[T] {
@@ -74,7 +74,7 @@ trait ProductFormats extends ProductFormatsInstances {
7474
_.getName.drop("copy$default$".length).takeWhile(_ != '(').toInt)
7575
val fields = clazz.getDeclaredFields.filterNot { f =>
7676
import Modifier._
77-
(f.getModifiers & (TRANSIENT | STATIC | 0x1000 /* SYNTHETIC*/)) > 0
77+
(f.getModifiers & (TRANSIENT | STATIC | 0x1000 /* SYNTHETIC*/)) > 0 || f.getName.endsWith("$outer")
7878
}
7979
if (copyDefaultMethods.length != fields.length)
8080
sys.error("Case class " + clazz.getName + " declares additional fields")
@@ -145,7 +145,7 @@ object ProductFormats {
145145
* optional members as `None`.)
146146
*/
147147
trait NullOptions extends ProductFormats {
148-
this: StandardFormats =>
148+
this: StandardFormats with AdditionalFormats =>
149149

150150
override protected def productElement2Field[T](fieldName: String, p: Product, ix: Int, rest: List[JsField])
151151
(implicit writer: JsonWriter[T]) = {

src/main/scala/spray/json/StandardFormats.scala

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ trait StandardFormats {
4242
def readSome(value: JsValue) = Some(value.convertTo[T])
4343
}
4444

45-
implicit def eitherFormat[A :JF, B :JF] = new JF[Either[A, B]] {
45+
implicit def eitherFormat[A :JF, B :JF]: JF[Either[A, B]] = new JF[Either[A, B]] {
4646
def write(either: Either[A, B]) = either match {
4747
case Right(a) => a.toJson
4848
case Left(b) => b.toJson
@@ -55,36 +55,36 @@ trait StandardFormats {
5555
}
5656
}
5757

58-
implicit def tuple1Format[A :JF] = new JF[Tuple1[A]] {
58+
implicit def tuple1Format[A :JF]: JF[Tuple1[A]] = new JF[Tuple1[A]] {
5959
def write(t: Tuple1[A]) = t._1.toJson
6060
def read(value: JsValue) = Tuple1(value.convertTo[A])
6161
}
6262

63-
implicit def tuple2Format[A :JF, B :JF] = new RootJsonFormat[(A, B)] {
63+
implicit def tuple2Format[A :JF, B :JF]: RootJsonFormat[(A, B)] = new RootJsonFormat[(A, B)] {
6464
def write(t: (A, B)) = JsArray(t._1.toJson, t._2.toJson)
6565
def read(value: JsValue) = value match {
6666
case JsArray(Seq(a, b)) => (a.convertTo[A], b.convertTo[B])
6767
case x => deserializationError("Expected Tuple2 as JsArray, but got " + x)
6868
}
6969
}
7070

71-
implicit def tuple3Format[A :JF, B :JF, C :JF] = new RootJsonFormat[(A, B, C)] {
71+
implicit def tuple3Format[A :JF, B :JF, C :JF]: RootJsonFormat[(A, B, C)] = new RootJsonFormat[(A, B, C)] {
7272
def write(t: (A, B, C)) = JsArray(t._1.toJson, t._2.toJson, t._3.toJson)
7373
def read(value: JsValue) = value match {
7474
case JsArray(Seq(a, b, c)) => (a.convertTo[A], b.convertTo[B], c.convertTo[C])
7575
case x => deserializationError("Expected Tuple3 as JsArray, but got " + x)
7676
}
7777
}
7878

79-
implicit def tuple4Format[A :JF, B :JF, C :JF, D :JF] = new RootJsonFormat[(A, B, C, D)] {
79+
implicit def tuple4Format[A :JF, B :JF, C :JF, D :JF]: RootJsonFormat[(A, B, C, D)] = new RootJsonFormat[(A, B, C, D)] {
8080
def write(t: (A, B, C, D)) = JsArray(t._1.toJson, t._2.toJson, t._3.toJson, t._4.toJson)
8181
def read(value: JsValue) = value match {
8282
case JsArray(Seq(a, b, c, d)) => (a.convertTo[A], b.convertTo[B], c.convertTo[C], d.convertTo[D])
8383
case x => deserializationError("Expected Tuple4 as JsArray, but got " + x)
8484
}
8585
}
8686

87-
implicit def tuple5Format[A :JF, B :JF, C :JF, D :JF, E :JF] = {
87+
implicit def tuple5Format[A :JF, B :JF, C :JF, D :JF, E :JF]: RootJsonFormat[(A, B, C, D, E)] = {
8888
new RootJsonFormat[(A, B, C, D, E)] {
8989
def write(t: (A, B, C, D, E)) = JsArray(t._1.toJson, t._2.toJson, t._3.toJson, t._4.toJson, t._5.toJson)
9090
def read(value: JsValue) = value match {
@@ -95,7 +95,7 @@ trait StandardFormats {
9595
}
9696
}
9797

98-
implicit def tuple6Format[A :JF, B :JF, C :JF, D :JF, E :JF, F: JF] = {
98+
implicit def tuple6Format[A :JF, B :JF, C :JF, D :JF, E :JF, F: JF]: RootJsonFormat[(A, B, C, D, E, F)] = {
9999
new RootJsonFormat[(A, B, C, D, E, F)] {
100100
def write(t: (A, B, C, D, E, F)) = JsArray(t._1.toJson, t._2.toJson, t._3.toJson, t._4.toJson, t._5.toJson, t._6.toJson)
101101
def read(value: JsValue) = value match {
@@ -106,7 +106,7 @@ trait StandardFormats {
106106
}
107107
}
108108

109-
implicit def tuple7Format[A :JF, B :JF, C :JF, D :JF, E :JF, F: JF, G: JF] = {
109+
implicit def tuple7Format[A :JF, B :JF, C :JF, D :JF, E :JF, F: JF, G: JF]: RootJsonFormat[(A, B, C, D, E, F, G)] = {
110110
new RootJsonFormat[(A, B, C, D, E, F, G)] {
111111
def write(t: (A, B, C, D, E, F, G)) = JsArray(t._1.toJson, t._2.toJson, t._3.toJson, t._4.toJson, t._5.toJson, t._6.toJson, t._7.toJson)
112112
def read(value: JsValue) = value match {

src/main/scala/spray/json/package.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ package object json {
2626
def jsonReader[T](implicit reader: JsonReader[T]) = reader
2727
def jsonWriter[T](implicit writer: JsonWriter[T]) = writer
2828

29-
implicit def enrichAny[T](any: T) = new RichAny(any)
30-
implicit def enrichString(string: String) = new RichString(string)
29+
implicit def enrichAny[T](any: T): RichAny[T] = new RichAny(any)
30+
implicit def enrichString(string: String): RichString = new RichString(string)
3131

3232
@deprecated("use enrichAny", "1.3.4")
3333
def pimpAny[T](any: T) = new PimpedAny(any)

src/test/scala/spray/json/AdditionalFormatsSpec.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class AdditionalFormatsSpec extends Specification {
2323
case class Container[A](inner: Option[A])
2424

2525
object ReaderProtocol extends DefaultJsonProtocol {
26-
implicit def containerReader[T :JsonFormat] = lift {
26+
implicit def containerReader[T :JsonFormat]: JsonFormat[Container[T]] = lift {
2727
new JsonReader[Container[T]] {
2828
def read(value: JsValue) = value match {
2929
case JsObject(fields) if fields.contains("content") => Container(Some(jsonReader[T].read(fields("content"))))
@@ -34,7 +34,7 @@ class AdditionalFormatsSpec extends Specification {
3434
}
3535

3636
object WriterProtocol extends DefaultJsonProtocol {
37-
implicit def containerWriter[T :JsonFormat] = lift {
37+
implicit def containerWriter[T :JsonFormat]: JsonFormat[Container[T]] = lift {
3838
new JsonWriter[Container[T]] {
3939
def write(obj: Container[T]) = JsObject("content" -> obj.inner.toJson)
4040
}
@@ -58,7 +58,7 @@ class AdditionalFormatsSpec extends Specification {
5858
case class Foo(id: Long, name: String, foos: Option[List[Foo]] = None)
5959

6060
object FooProtocol extends DefaultJsonProtocol {
61-
implicit val fooProtocol: JsonFormat[Foo] = lazyFormat(jsonFormat(Foo, "id", "name", "foos"))
61+
implicit val fooProtocol: JsonFormat[Foo] = lazyFormat(jsonFormat(Foo.apply, "id", "name", "foos"))
6262
}
6363

6464
"The lazyFormat wrapper" should {
@@ -70,4 +70,4 @@ class AdditionalFormatsSpec extends Specification {
7070
"""{"id":1,"name":"a","foos":[{"id":2,"name":"b","foos":[{"id":3,"name":"c"}]},{"id":4,"name":"d"}]}""".parseJson
7171
}
7272
}
73-
}
73+
}

0 commit comments

Comments
 (0)