You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pekko.apache.org by jr...@apache.org on 2022/11/03 11:24:17 UTC

[incubator-pekko-http] 47/47: scala 3: compile and test marshalling, JMH and docs subprojects (#4126)

This is an automated email from the ASF dual-hosted git repository.

jrudolph pushed a commit to branch scala-3
in repository https://gitbox.apache.org/repos/asf/incubator-pekko-http.git

commit 63b34370483aab3e10716e031d98c75c1bfc2e40
Author: Arnout Engelen <ar...@bzzt.net>
AuthorDate: Tue Aug 23 14:51:10 2022 +0200

    scala 3: compile and test marshalling, JMH and docs subprojects (#4126)
    
    * scala 3: compile JMH and docs subprojects
    
    Three errors around parameters remaining
    
    * some more fixes
    
    * more projects now build on scala3
    
    * Use short ask syntax
---
 .../src/main/scala/akka/BenchRunner.scala          |  2 +-
 .../scaladsl/server/util/ConstructFromTuple.scala  |  1 +
 build.sbt                                          | 19 +++++++-----
 .../scala/docs/http/scaladsl/Http2ClientApp.scala  |  5 +--
 .../docs/http/scaladsl/HttpClientExampleSpec.scala | 36 +++++++++++++---------
 .../docs/http/scaladsl/HttpServerExampleSpec.scala | 25 ++++++++-------
 .../scaladsl/HttpServerWithActorInteraction.scala  |  7 +++--
 .../http/scaladsl/HttpServerWithActorsSample.scala |  3 +-
 .../docs/http/scaladsl/SprayJsonExample.scala      | 15 +++++----
 .../docs/http/scaladsl/SprayJsonExampleSpec.scala  |  4 +--
 .../http/scaladsl/SprayJsonPrettyMarshalSpec.scala |  4 +--
 .../server/CaseClassExtractionExamplesSpec.scala   |  2 +-
 .../server/ExceptionHandlerExamplesSpec.scala      |  6 ++--
 .../server/RejectionHandlerExamplesSpec.scala      | 10 +++---
 .../http/scaladsl/server/TestKitFragmentSpec.scala |  2 +-
 .../scaladsl/server/TestKitWithActorSpec.scala     | 11 ++++---
 .../directives/BasicDirectivesExamplesSpec.scala   |  4 +--
 .../directives/CodingDirectivesExamplesSpec.scala  |  6 ++--
 .../FileUploadDirectivesExamplesSpec.scala         |  2 +-
 .../directives/FutureDirectivesExamplesSpec.scala  |  4 +--
 .../directives/JsonStreamingExamplesSpec.scala     | 18 ++++++-----
 .../directives/JsonStreamingFullExamples.scala     | 11 ++++---
 .../MarshallingDirectivesExamplesSpec.scala        |  6 ++--
 .../directives/MiscDirectivesExamplesSpec.scala    | 11 ++++---
 .../directives/PathDirectivesExamplesSpec.scala    |  2 +-
 .../directives/RouteDirectivesExamplesSpec.scala   | 10 +++---
 project/Common.scala                               | 11 +++----
 27 files changed, 130 insertions(+), 107 deletions(-)

diff --git a/akka-http-bench-jmh/src/main/scala/akka/BenchRunner.scala b/akka-http-bench-jmh/src/main/scala/akka/BenchRunner.scala
index 29b6ba421..bfece46b1 100644
--- a/akka-http-bench-jmh/src/main/scala/akka/BenchRunner.scala
+++ b/akka-http-bench-jmh/src/main/scala/akka/BenchRunner.scala
@@ -25,7 +25,7 @@ object BenchRunner {
     val opts = new CommandLineOptions(args2: _*)
     val results = new Runner(opts).run()
 
-    val report = results.asScala.map { result: RunResult =>
+    val report = results.asScala.map { (result: RunResult) =>
       val bench = result.getParams.getBenchmark
       val params = result.getParams.getParamsKeys.asScala.map(key => s"$key=${result.getParams.getParam(key)}").mkString("_")
       val score = result.getAggregatedResult.getPrimaryResult.getScore.round
diff --git a/akka-http/src/main/scala/akka/http/scaladsl/server/util/ConstructFromTuple.scala b/akka-http/src/main/scala/akka/http/scaladsl/server/util/ConstructFromTuple.scala
index 383721136..a178afb0f 100644
--- a/akka-http/src/main/scala/akka/http/scaladsl/server/util/ConstructFromTuple.scala
+++ b/akka-http/src/main/scala/akka/http/scaladsl/server/util/ConstructFromTuple.scala
@@ -7,6 +7,7 @@ package akka.http.scaladsl.server.util
 /**
  * Constructor for instances of type `R` which can be created from a tuple of type `T`.
  */
+@FunctionalInterface
 trait ConstructFromTuple[T, R] extends (T => R)
 
 object ConstructFromTuple extends ConstructFromTupleInstances
diff --git a/build.sbt b/build.sbt
index 54d8736a8..e2da72bef 100644
--- a/build.sbt
+++ b/build.sbt
@@ -289,11 +289,10 @@ lazy val httpJmhBench = project("akka-http-bench-jmh")
   .enablePlugins(JmhPlugin)
   .enablePlugins(NoPublish) // don't release benchs
   .disablePlugins(MimaPlugin)
-  .enablePlugins(NoScala3) // FIXME
 
 lazy val httpMarshallersScala = project("akka-http-marshallers-scala")
   .settings(commonSettings)
-  .enablePlugins(NoPublish, NoScala3 /*FIXME */ /*, AggregatePRValidation*/)
+  .enablePlugins(NoPublish /*, AggregatePRValidation*/)
   .disablePlugins(MimaPlugin)
   .aggregate(httpSprayJson, httpXml)
 
@@ -311,7 +310,7 @@ lazy val httpSprayJson =
 
 lazy val httpMarshallersJava = project("akka-http-marshallers-java")
   .settings(commonSettings)
-  .enablePlugins(NoPublish, NoScala3 /*FIXME */ /*, AggregatePRValidation*/)
+  .enablePlugins(NoPublish /*, AggregatePRValidation*/)
   .disablePlugins(MimaPlugin)
   .aggregate(httpJackson)
 
@@ -412,7 +411,6 @@ lazy val httpScalafixTests =
 
 lazy val docs = project("docs")
   .enablePlugins(AkkaParadoxPlugin, NoPublish, PublishRsyncPlugin)
-  .enablePlugins(NoScala3) // FIXME
   .disablePlugins(MimaPlugin)
   .addAkkaModuleDependency("akka-stream", "provided", AkkaDependency.docs)
   .addAkkaModuleDependency("akka-actor-typed", "provided", AkkaDependency.docs)
@@ -430,12 +428,17 @@ lazy val docs = project("docs")
     scalacOptions ++= Seq(
       // Make sure we don't accidentally keep documenting deprecated calls
       "-Xfatal-warnings",
-      // In docs adding an unused variable can be helpful, for example
-      // to show its type
-      "-Xlint:-unused",
       // Does not appear to lead to problems
       "-Wconf:msg=The outer reference in this type test cannot be checked at run time:s",
     ),
+    scalacOptions ++= (
+      if (scalaVersion.value.startsWith("3")) Seq.empty
+      else Seq(
+        // In docs adding an unused variable can be helpful, for example
+        // to show its type
+        "-Xlint:-unused"
+      )
+    ),
     scalacOptions --= Seq(
       // Code after ??? can be considered 'dead',  but still useful for docs
       "-Ywarn-dead-code",
@@ -501,7 +504,7 @@ lazy val compatibilityTests = Project("akka-http-compatibility-tests", file("akk
   )
 
 lazy val billOfMaterials = Project("bill-of-materials", file("akka-http-bill-of-materials"))
-  .enablePlugins(BillOfMaterialsPlugin, NoScala3 /* FIXME */)
+  .enablePlugins(BillOfMaterialsPlugin)
   .disablePlugins(MimaPlugin)
   .settings(
     name := "akka-http-bom",
diff --git a/docs/src/test/scala/docs/http/scaladsl/Http2ClientApp.scala b/docs/src/test/scala/docs/http/scaladsl/Http2ClientApp.scala
index 3191e2a8b..6d2fc3ec1 100644
--- a/docs/src/test/scala/docs/http/scaladsl/Http2ClientApp.scala
+++ b/docs/src/test/scala/docs/http/scaladsl/Http2ClientApp.scala
@@ -19,6 +19,7 @@ import com.typesafe.config.ConfigFactory
 
 import scala.annotation.nowarn
 import scala.concurrent.duration._
+import scala.concurrent.ExecutionContext
 import scala.concurrent.Future
 import scala.concurrent.Promise
 
@@ -33,8 +34,8 @@ object Http2ClientApp extends App {
       """
     ).withFallback(ConfigFactory.defaultApplication())
 
-  implicit val system = ActorSystem("Http2ClientApp", config)
-  implicit val ec = system.dispatcher
+  implicit val system: ActorSystem = ActorSystem("Http2ClientApp", config)
+  implicit val ec: ExecutionContext = system.dispatcher
 
   // #response-future-association
   val dispatch = singleRequest(Http().connectionTo("doc.akka.io").http2())
diff --git a/docs/src/test/scala/docs/http/scaladsl/HttpClientExampleSpec.scala b/docs/src/test/scala/docs/http/scaladsl/HttpClientExampleSpec.scala
index eab588f72..ac6c89c33 100644
--- a/docs/src/test/scala/docs/http/scaladsl/HttpClientExampleSpec.scala
+++ b/docs/src/test/scala/docs/http/scaladsl/HttpClientExampleSpec.scala
@@ -27,7 +27,7 @@ class HttpClientExampleSpec extends AnyWordSpec with Matchers with CompileOnlySp
     import akka.stream.scaladsl.{ FileIO, Framing }
     import akka.util.ByteString
 
-    implicit val system = ActorSystem()
+    implicit val system: ActorSystem = ActorSystem()
 
     val response: HttpResponse = ???
 
@@ -43,6 +43,7 @@ class HttpClientExampleSpec extends AnyWordSpec with Matchers with CompileOnlySp
 
   "manual-entity-consume-example-2" in compileOnlySpec {
     //#manual-entity-consume-example-2
+    import scala.concurrent.ExecutionContext
     import scala.concurrent.Future
     import scala.concurrent.duration._
 
@@ -50,8 +51,8 @@ class HttpClientExampleSpec extends AnyWordSpec with Matchers with CompileOnlySp
     import akka.http.scaladsl.model._
     import akka.util.ByteString
 
-    implicit val system = ActorSystem()
-    implicit val dispatcher = system.dispatcher
+    implicit val system: ActorSystem = ActorSystem()
+    implicit val dispatcher: ExecutionContext = system.dispatcher
 
     case class ExamplePerson(name: String)
     def parse(line: ByteString): ExamplePerson = ???
@@ -78,6 +79,7 @@ class HttpClientExampleSpec extends AnyWordSpec with Matchers with CompileOnlySp
 
   "manual-entity-consume-example-3" in compileOnlySpec {
     //#manual-entity-consume-example-3
+    import scala.concurrent.ExecutionContext
     import scala.concurrent.Future
 
     import akka.NotUsed
@@ -87,13 +89,13 @@ class HttpClientExampleSpec extends AnyWordSpec with Matchers with CompileOnlySp
     import akka.util.ByteString
     import akka.stream.scaladsl.{ Flow, Sink, Source }
 
-    implicit val system = ActorSystem()
-    implicit val dispatcher = system.dispatcher
+    implicit val system: ActorSystem = ActorSystem()
+    implicit val dispatcher: ExecutionContext = system.dispatcher
 
     case class ExamplePerson(name: String)
 
     def parse(line: ByteString): Option[ExamplePerson] =
-      line.utf8String.split(" ").headOption.map(ExamplePerson)
+      line.utf8String.split(" ").headOption.map(ExamplePerson.apply)
 
     val requests: Source[HttpRequest, NotUsed] = Source
       .fromIterator(() =>
@@ -126,12 +128,14 @@ class HttpClientExampleSpec extends AnyWordSpec with Matchers with CompileOnlySp
 
   "manual-entity-discard-example-1" in compileOnlySpec {
     //#manual-entity-discard-example-1
+    import scala.concurrent.ExecutionContext
+
     import akka.actor.ActorSystem
     import akka.http.scaladsl.model.HttpMessage.DiscardedEntity
     import akka.http.scaladsl.model._
 
-    implicit val system = ActorSystem()
-    implicit val dispatcher = system.dispatcher
+    implicit val system: ActorSystem = ActorSystem()
+    implicit val dispatcher: ExecutionContext = system.dispatcher
 
     val response1: HttpResponse = ??? // obtained from an HTTP call (see examples below)
 
@@ -141,6 +145,7 @@ class HttpClientExampleSpec extends AnyWordSpec with Matchers with CompileOnlySp
     //#manual-entity-discard-example-1
   }
   "manual-entity-discard-example-2" in compileOnlySpec {
+    import scala.concurrent.ExecutionContext
     import scala.concurrent.Future
 
     import akka.Done
@@ -148,8 +153,8 @@ class HttpClientExampleSpec extends AnyWordSpec with Matchers with CompileOnlySp
     import akka.http.scaladsl.model._
     import akka.stream.scaladsl.Sink
 
-    implicit val system = ActorSystem()
-    implicit val dispatcher = system.dispatcher
+    implicit val system: ActorSystem = ActorSystem()
+    implicit val dispatcher: ExecutionContext = system.dispatcher
 
     //#manual-entity-discard-example-2
     val response1: HttpResponse = ??? // obtained from an HTTP call (see examples below)
@@ -171,7 +176,7 @@ class HttpClientExampleSpec extends AnyWordSpec with Matchers with CompileOnlySp
 
     import akka.stream.{ OverflowStrategy, QueueOfferResult }
 
-    implicit val system = ActorSystem()
+    implicit val system: ActorSystem = ActorSystem()
     import system.dispatcher // to get an implicit ExecutionContext into scope
 
     val QueueSize = 10
@@ -218,7 +223,7 @@ class HttpClientExampleSpec extends AnyWordSpec with Matchers with CompileOnlySp
     import akka.http.scaladsl.model.Multipart.FormData
     import akka.http.scaladsl.marshalling.Marshal
 
-    implicit val system = ActorSystem()
+    implicit val system: ActorSystem = ActorSystem()
     import system.dispatcher // to get an implicit ExecutionContext into scope
 
     case class FileToUpload(name: String, location: Path)
@@ -303,9 +308,10 @@ class HttpClientExampleSpec extends AnyWordSpec with Matchers with CompileOnlySp
     import akka.http.scaladsl.unmarshalling.Unmarshal
     import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
     import spray.json.DefaultJsonProtocol._
+    import spray.json.RootJsonFormat
 
     case class Pet(name: String)
-    implicit val petFormat = jsonFormat1(Pet)
+    implicit val petFormat: RootJsonFormat[Pet] = jsonFormat1(Pet.apply)
 
     val pet: Future[Pet] = Unmarshal(response).to[Pet]
     //#unmarshal-response-body
@@ -313,7 +319,7 @@ class HttpClientExampleSpec extends AnyWordSpec with Matchers with CompileOnlySp
 
   "single-request-in-actor-example" in compileOnlySpec {
     //#single-request-in-actor-example
-    import akka.actor.{ Actor, ActorLogging }
+    import akka.actor.{ Actor, ActorLogging, ActorSystem }
     import akka.http.scaladsl.Http
     import akka.http.scaladsl.model._
     import akka.util.ByteString
@@ -324,7 +330,7 @@ class HttpClientExampleSpec extends AnyWordSpec with Matchers with CompileOnlySp
       import akka.pattern.pipe
       import context.dispatcher
 
-      implicit val system = context.system
+      implicit val system: ActorSystem = context.system
       val http = Http(system)
 
       override def preStart() = {
diff --git a/docs/src/test/scala/docs/http/scaladsl/HttpServerExampleSpec.scala b/docs/src/test/scala/docs/http/scaladsl/HttpServerExampleSpec.scala
index cb999db9c..2be4b7635 100644
--- a/docs/src/test/scala/docs/http/scaladsl/HttpServerExampleSpec.scala
+++ b/docs/src/test/scala/docs/http/scaladsl/HttpServerExampleSpec.scala
@@ -7,8 +7,11 @@ package docs.http.scaladsl
 import akka.event.LoggingAdapter
 import akka.http.scaladsl.Http
 import akka.http.scaladsl.model.StatusCodes
-import akka.http.scaladsl.server.Route
+import akka.http.scaladsl.server.{ Directive, Route }
+import akka.http.scaladsl.server.directives.FormFieldDirectives.FieldSpec
+import akka.http.scaladsl.server.util.ConstructFromTuple
 import akka.testkit.TestActors
+
 import scala.annotation.nowarn
 import docs.CompileOnlySpec
 
@@ -262,8 +265,7 @@ class HttpServerExampleSpec extends AnyWordSpec with Matchers
         pathEnd {
           concat(
             put {
-              // form extraction from multipart or www-url-encoded forms
-              formFields("email", "total".as[Money]).as(Order) { order =>
+              formFields("email", "total".as[Money]).as(Order.apply _) { (order: Order) =>
                 complete {
                   // complete with serialized Future result
                   (myDbActor ? Update(order)).mapTo[TransactionResult]
@@ -285,7 +287,7 @@ class HttpServerExampleSpec extends AnyWordSpec with Matchers
           get {
             // parameters to case class extraction
             parameters("size".as[Int], "color".optional, "dangerous".withDefault("no"))
-              .as(OrderItem) { orderItem =>
+              .as(OrderItem.apply _) { (orderItem: OrderItem) =>
                 // ... route using case class instance created from
                 // required and optional query parameters
                 complete("") // #hide
@@ -309,20 +311,21 @@ class HttpServerExampleSpec extends AnyWordSpec with Matchers
     import akka.http.scaladsl.server.Directives._
     import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
     import spray.json.DefaultJsonProtocol._
+    import spray.json.RootJsonFormat
 
-    implicit val system = ActorSystem()
+    implicit val system: ActorSystem = ActorSystem()
     // needed for the future flatMap/onComplete in the end
-    implicit val executionContext = system.dispatcher
+    implicit val executionContext: ExecutionContext = system.dispatcher
 
     final case class Bid(userId: String, bid: Int)
 
     // these are from spray-json
-    implicit val bidFormat = jsonFormat2(Bid)
+    implicit val bidFormat: RootJsonFormat[Bid] = jsonFormat2(Bid.apply)
 
     val route =
       path("bid") {
         put {
-          entity(as[Bid]) { bid =>
+          entity(as[Bid]) { (bid: Bid) =>
             // incoming entity is fully consumed and converted into a Bid
             complete("The bid was: " + bid)
           }
@@ -371,7 +374,7 @@ class HttpServerExampleSpec extends AnyWordSpec with Matchers
     val route =
       (put & path("lines")) {
         withoutSizeLimit {
-          extractRequest { r: HttpRequest =>
+          extractRequest { (r: HttpRequest) =>
             val finishedWriting = r.discardEntityBytes().future
 
             // we only want to respond once the incoming data has been handled:
@@ -422,11 +425,11 @@ class HttpServerExampleSpec extends AnyWordSpec with Matchers
     import spray.json.DefaultJsonProtocol._
     import spray.json._
 
-    implicit val system = ActorSystem()
+    implicit val system: ActorSystem = ActorSystem()
 
     //#dynamic-routing-example
     case class MockDefinition(path: String, requests: Seq[JsValue], responses: Seq[JsValue])
-    implicit val format = jsonFormat3(MockDefinition)
+    implicit val format: RootJsonFormat[MockDefinition] = jsonFormat3(MockDefinition.apply)
 
     @volatile var state = Map.empty[String, Map[JsValue, JsValue]]
 
diff --git a/docs/src/test/scala/docs/http/scaladsl/HttpServerWithActorInteraction.scala b/docs/src/test/scala/docs/http/scaladsl/HttpServerWithActorInteraction.scala
index f0a677178..3b55f221f 100644
--- a/docs/src/test/scala/docs/http/scaladsl/HttpServerWithActorInteraction.scala
+++ b/docs/src/test/scala/docs/http/scaladsl/HttpServerWithActorInteraction.scala
@@ -13,6 +13,7 @@ import akka.http.scaladsl.model.StatusCodes
 import akka.http.scaladsl.server.Directives._
 import akka.util.Timeout
 import spray.json.DefaultJsonProtocol._
+import spray.json.RootJsonFormat
 
 import scala.concurrent.duration._
 import scala.concurrent.{ ExecutionContext, Future }
@@ -44,8 +45,8 @@ object HttpServerWithActorInteraction {
   }
 
   // these are from spray-json
-  implicit val bidFormat = jsonFormat2(Auction.Bid)
-  implicit val bidsFormat = jsonFormat1(Auction.Bids)
+  implicit val bidFormat: RootJsonFormat[Auction.Bid] = jsonFormat2(Auction.Bid.apply)
+  implicit val bidsFormat: RootJsonFormat[Auction.Bids] = jsonFormat1(Auction.Bids.apply)
 
   def main(args: Array[String]): Unit = {
     implicit val system: ActorSystem[Auction.Message] = ActorSystem(Auction.apply, "auction")
@@ -69,7 +70,7 @@ object HttpServerWithActorInteraction {
             implicit val timeout: Timeout = 5.seconds
 
             // query the actor for the current auction state
-            val bids: Future[Bids] = (auction ? GetBids).mapTo[Bids]
+            val bids: Future[Bids] = auction.ask(GetBids(_))
             complete(bids)
           }
         )
diff --git a/docs/src/test/scala/docs/http/scaladsl/HttpServerWithActorsSample.scala b/docs/src/test/scala/docs/http/scaladsl/HttpServerWithActorsSample.scala
index 780d1913d..d4b889663 100644
--- a/docs/src/test/scala/docs/http/scaladsl/HttpServerWithActorsSample.scala
+++ b/docs/src/test/scala/docs/http/scaladsl/HttpServerWithActorsSample.scala
@@ -53,6 +53,7 @@ object HttpServerWithActorsSample {
   import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport
   import spray.json.DefaultJsonProtocol
   import spray.json.DeserializationException
+  import spray.json.JsonFormat
   import spray.json.JsString
   import spray.json.JsValue
   import spray.json.RootJsonFormat
@@ -75,7 +76,7 @@ object HttpServerWithActorsSample {
       }
     }
 
-    implicit val jobFormat = jsonFormat4(Job)
+    implicit val jobFormat: RootJsonFormat[Job] = jsonFormat4(Job.apply)
   }
   //#akka-typed-json
 
diff --git a/docs/src/test/scala/docs/http/scaladsl/SprayJsonExample.scala b/docs/src/test/scala/docs/http/scaladsl/SprayJsonExample.scala
index 58f9ed6f6..9872dbbcd 100644
--- a/docs/src/test/scala/docs/http/scaladsl/SprayJsonExample.scala
+++ b/docs/src/test/scala/docs/http/scaladsl/SprayJsonExample.scala
@@ -15,17 +15,19 @@ import akka.http.scaladsl.model.StatusCodes
 // "com.typesafe.akka" %% "akka-http-spray-json" % "10.1.7"
 import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
 import spray.json.DefaultJsonProtocol._
+import spray.json.RootJsonFormat
 
 import scala.io.StdIn
 
+import scala.concurrent.ExecutionContext
 import scala.concurrent.Future
 
 object SprayJsonExample {
 
   // needed to run the route
-  implicit val system = ActorSystem(Behaviors.empty, "SprayExample")
+  implicit val system: ActorSystem[_] = ActorSystem(Behaviors.empty, "SprayExample")
   // needed for the future map/flatmap in the end and future in fetchItem and saveOrder
-  implicit val executionContext = system.executionContext
+  implicit val executionContext: ExecutionContext = system.executionContext
 
   var orders: List[Item] = Nil
 
@@ -34,18 +36,15 @@ object SprayJsonExample {
   final case class Order(items: List[Item])
 
   // formats for unmarshalling and marshalling
-  implicit val itemFormat = jsonFormat2(Item)
-  implicit val orderFormat = jsonFormat1(Order)
+  implicit val itemFormat: RootJsonFormat[Item] = jsonFormat2(Item.apply)
+  implicit val orderFormat: RootJsonFormat[Order] = jsonFormat1(Order.apply)
 
   // (fake) async database query api
   def fetchItem(itemId: Long): Future[Option[Item]] = Future {
     orders.find(o => o.id == itemId)
   }
   def saveOrder(order: Order): Future[Done] = {
-    orders = order match {
-      case Order(items) => items ::: orders
-      case _            => orders
-    }
+    orders = order.items ::: orders
     Future { Done }
   }
 
diff --git a/docs/src/test/scala/docs/http/scaladsl/SprayJsonExampleSpec.scala b/docs/src/test/scala/docs/http/scaladsl/SprayJsonExampleSpec.scala
index e9c36c83f..e4cc43b14 100644
--- a/docs/src/test/scala/docs/http/scaladsl/SprayJsonExampleSpec.scala
+++ b/docs/src/test/scala/docs/http/scaladsl/SprayJsonExampleSpec.scala
@@ -25,8 +25,8 @@ class SprayJsonExampleSpec extends AnyWordSpec with Matchers {
 
     // collect your json format instances into a support trait:
     trait JsonSupport extends SprayJsonSupport with DefaultJsonProtocol {
-      implicit val itemFormat = jsonFormat2(Item)
-      implicit val orderFormat = jsonFormat1(Order) // contains List[Item]
+      implicit val itemFormat: RootJsonFormat[Item] = jsonFormat2(Item.apply)
+      implicit val orderFormat: RootJsonFormat[Order] = jsonFormat1(Order.apply) // contains List[Item]
     }
 
     // use it wherever json (un)marshalling is needed
diff --git a/docs/src/test/scala/docs/http/scaladsl/SprayJsonPrettyMarshalSpec.scala b/docs/src/test/scala/docs/http/scaladsl/SprayJsonPrettyMarshalSpec.scala
index 32acfabd5..70bff1eb2 100644
--- a/docs/src/test/scala/docs/http/scaladsl/SprayJsonPrettyMarshalSpec.scala
+++ b/docs/src/test/scala/docs/http/scaladsl/SprayJsonPrettyMarshalSpec.scala
@@ -20,8 +20,8 @@ class SprayJsonPrettyMarshalSpec extends RoutingSpec with CompileOnlySpec {
 
     object PrettyJsonFormatSupport {
       import DefaultJsonProtocol._
-      implicit val printer = PrettyPrinter
-      implicit val prettyPrintedItemFormat = jsonFormat2(PrettyPrintedItem)
+      implicit val printer: JsonPrinter = PrettyPrinter
+      implicit val prettyPrintedItemFormat: RootJsonFormat[PrettyPrintedItem] = jsonFormat2(PrettyPrintedItem.apply)
     }
 
     // use it wherever json (un)marshalling is needed
diff --git a/docs/src/test/scala/docs/http/scaladsl/server/CaseClassExtractionExamplesSpec.scala b/docs/src/test/scala/docs/http/scaladsl/server/CaseClassExtractionExamplesSpec.scala
index 9261da478..b8bd9d828 100644
--- a/docs/src/test/scala/docs/http/scaladsl/server/CaseClassExtractionExamplesSpec.scala
+++ b/docs/src/test/scala/docs/http/scaladsl/server/CaseClassExtractionExamplesSpec.scala
@@ -68,7 +68,7 @@ class CaseClassExtractionExamplesSpec extends RoutingSpec with Inside {
   "example 4 test" in {
     val route =
       (path("color" / Segment) &
-        parameters("r".as[Int], "g".as[Int], "b".as[Int])).as(Color) { color =>
+        parameters("r".as[Int], "g".as[Int], "b".as[Int])).as(Color.apply _) { color =>
           // ... route working with the `color` instance
           doSomethingWith(color) // #hide
         }
diff --git a/docs/src/test/scala/docs/http/scaladsl/server/ExceptionHandlerExamplesSpec.scala b/docs/src/test/scala/docs/http/scaladsl/server/ExceptionHandlerExamplesSpec.scala
index eabdff8b6..20cc8ec5a 100644
--- a/docs/src/test/scala/docs/http/scaladsl/server/ExceptionHandlerExamplesSpec.scala
+++ b/docs/src/test/scala/docs/http/scaladsl/server/ExceptionHandlerExamplesSpec.scala
@@ -31,7 +31,7 @@ object MyExplicitExceptionHandler {
 
   object MyApp extends App {
 
-    implicit val system = ActorSystem()
+    implicit val system: ActorSystem = ActorSystem()
 
     val route: Route =
       handleExceptions(myExceptionHandler) {
@@ -66,7 +66,7 @@ object MyImplicitExceptionHandler {
 
   object MyApp extends App {
 
-    implicit val system = ActorSystem()
+    implicit val system: ActorSystem = ActorSystem()
 
     val route: Route =
     // ... some route structure
@@ -150,7 +150,7 @@ object RespondWithHeaderExceptionHandlerExample {
   }
 
   object MyApp extends App {
-    implicit val system = ActorSystem()
+    implicit val system: ActorSystem = ActorSystem()
 
     Http().newServerAt("localhost", 8080).bind(route)
   }
diff --git a/docs/src/test/scala/docs/http/scaladsl/server/RejectionHandlerExamplesSpec.scala b/docs/src/test/scala/docs/http/scaladsl/server/RejectionHandlerExamplesSpec.scala
index 28835b82f..a56ae4e9f 100644
--- a/docs/src/test/scala/docs/http/scaladsl/server/RejectionHandlerExamplesSpec.scala
+++ b/docs/src/test/scala/docs/http/scaladsl/server/RejectionHandlerExamplesSpec.scala
@@ -41,7 +41,7 @@ object MyRejectionHandler {
         .handleNotFound { complete((NotFound, "Not here!")) }
         .result()
 
-    implicit val system = ActorSystem()
+    implicit val system: ActorSystem = ActorSystem()
 
     val route: Route = handleRejections(myRejectionHandler) {
       // ... some route structure
@@ -60,7 +60,7 @@ object HandleNotFoundWithThePath {
   import akka.http.scaladsl.server._
   import Directives._
 
-  implicit def myRejectionHandler =
+  implicit def myRejectionHandler: RejectionHandler =
     RejectionHandler.newBuilder()
       .handleNotFound {
         extractUnmatchedPath { p =>
@@ -98,7 +98,7 @@ class RejectionHandlerExamplesSpec extends RoutingSpec with CompileOnlySpec {
     import akka.http.scaladsl.model._
     import akka.http.scaladsl.server.RejectionHandler
 
-    implicit def myRejectionHandler =
+    implicit def myRejectionHandler: RejectionHandler =
       RejectionHandler.default
         .mapRejectionResponse {
           case res @ HttpResponse(_, _, ent: HttpEntity.Strict, _) =>
@@ -132,7 +132,7 @@ class RejectionHandlerExamplesSpec extends RoutingSpec with CompileOnlySpec {
     import akka.http.scaladsl.model._
     import akka.http.scaladsl.server.RejectionHandler
 
-    implicit def myRejectionHandler =
+    implicit def myRejectionHandler: RejectionHandler =
       RejectionHandler.default
         .mapRejectionResponse {
           case res @ HttpResponse(_, _, ent: HttpEntity.Strict, _) =>
@@ -168,7 +168,7 @@ class RejectionHandlerExamplesSpec extends RoutingSpec with CompileOnlySpec {
     import akka.http.scaladsl.server._
     import akka.http.scaladsl.model.StatusCodes.BadRequest
 
-    implicit def myRejectionHandler = RejectionHandler.newBuilder().handle {
+    implicit def myRejectionHandler: RejectionHandler = RejectionHandler.newBuilder().handle {
       case MissingCookieRejection(_) => complete(HttpResponse(BadRequest, entity = "No cookies, no service!!!"))
     }.result()
 
diff --git a/docs/src/test/scala/docs/http/scaladsl/server/TestKitFragmentSpec.scala b/docs/src/test/scala/docs/http/scaladsl/server/TestKitFragmentSpec.scala
index bddd3dda1..d2e38a432 100644
--- a/docs/src/test/scala/docs/http/scaladsl/server/TestKitFragmentSpec.scala
+++ b/docs/src/test/scala/docs/http/scaladsl/server/TestKitFragmentSpec.scala
@@ -58,6 +58,6 @@ class TestKitTimeoutSpec extends AnyWordSpec with ScalatestRouteTest {
   import akka.http.scaladsl.testkit.RouteTestTimeout
   import akka.testkit.TestDuration
 
-  implicit val timeout = RouteTestTimeout(5.seconds.dilated)
+  implicit val timeout: RouteTestTimeout = RouteTestTimeout(5.seconds.dilated)
   //#timeout-setting
 }
diff --git a/docs/src/test/scala/docs/http/scaladsl/server/TestKitWithActorSpec.scala b/docs/src/test/scala/docs/http/scaladsl/server/TestKitWithActorSpec.scala
index 70186970c..41b2c6cca 100644
--- a/docs/src/test/scala/docs/http/scaladsl/server/TestKitWithActorSpec.scala
+++ b/docs/src/test/scala/docs/http/scaladsl/server/TestKitWithActorSpec.scala
@@ -8,8 +8,9 @@ package docs.http.scaladsl.server
 import scala.concurrent.duration._
 import scala.util.{ Failure, Success }
 
+import akka.{ actor => untyped }
 import akka.actor.testkit.typed.scaladsl.TestProbe
-import akka.actor.typed.{ ActorRef, Scheduler }
+import akka.actor.typed.{ ActorRef, ActorSystem, Scheduler }
 import akka.actor.typed.scaladsl.AskPattern._
 import akka.http.scaladsl.server.Directives._
 import akka.http.scaladsl.testkit.ScalatestRouteTest
@@ -24,7 +25,7 @@ object RouteUnderTest {
   // Your route under test, scheduler is only needed as ask is used
   def route(someActor: ActorRef[Ping])(implicit scheduler: Scheduler, timeout: Timeout) = get {
     path("ping") {
-      complete(someActor ? Ping)
+      complete(someActor ? Ping.apply)
     }
   }
 }
@@ -35,9 +36,9 @@ class TestKitWithActorSpec extends AnyWordSpec with Matchers with ScalatestRoute
   // This test does not use the classic APIs,
   // so it needs to adapt the system:
   import akka.actor.typed.scaladsl.adapter._
-  implicit val typedSystem = system.toTyped
-  implicit val timeout = Timeout(500.milliseconds)
-  implicit val scheduler = system.scheduler
+  implicit val typedSystem: ActorSystem[_] = system.toTyped
+  implicit val timeout: Timeout = Timeout(500.milliseconds)
+  implicit val scheduler: untyped.Scheduler = system.scheduler
 
   "The service" should {
     "return a 'PONG!' response for GET requests to /ping" in {
diff --git a/docs/src/test/scala/docs/http/scaladsl/server/directives/BasicDirectivesExamplesSpec.scala b/docs/src/test/scala/docs/http/scaladsl/server/directives/BasicDirectivesExamplesSpec.scala
index d472270f7..2b73aeaeb 100644
--- a/docs/src/test/scala/docs/http/scaladsl/server/directives/BasicDirectivesExamplesSpec.scala
+++ b/docs/src/test/scala/docs/http/scaladsl/server/directives/BasicDirectivesExamplesSpec.scala
@@ -681,7 +681,7 @@ class BasicDirectivesExamplesSpec extends RoutingSpec with CompileOnlySpec {
   "extractSettings-examples" in {
     //#extractSettings-examples
     val route =
-      extractSettings { settings: RoutingSettings =>
+      extractSettings { (settings: RoutingSettings) =>
         complete(s"RoutingSettings.renderVanityFooter = ${settings.renderVanityFooter}")
       }
 
@@ -699,7 +699,7 @@ class BasicDirectivesExamplesSpec extends RoutingSpec with CompileOnlySpec {
 
     val route =
       tunedSettings {
-        extractSettings { settings: RoutingSettings =>
+        extractSettings { (settings: RoutingSettings) =>
           complete(s"RoutingSettings.fileGetConditional = ${settings.fileGetConditional}")
         }
       }
diff --git a/docs/src/test/scala/docs/http/scaladsl/server/directives/CodingDirectivesExamplesSpec.scala b/docs/src/test/scala/docs/http/scaladsl/server/directives/CodingDirectivesExamplesSpec.scala
index 06cbc4804..810bc908d 100644
--- a/docs/src/test/scala/docs/http/scaladsl/server/directives/CodingDirectivesExamplesSpec.scala
+++ b/docs/src/test/scala/docs/http/scaladsl/server/directives/CodingDirectivesExamplesSpec.scala
@@ -79,7 +79,7 @@ class CodingDirectivesExamplesSpec extends RoutingSpec with CompileOnlySpec {
     //#decodeRequest
     val route =
       decodeRequest {
-        entity(as[String]) { content: String =>
+        entity(as[String]) { (content: String) =>
           complete(s"Request content: '$content'")
         }
       }
@@ -100,7 +100,7 @@ class CodingDirectivesExamplesSpec extends RoutingSpec with CompileOnlySpec {
     //#decodeRequestWith
     val route =
       decodeRequestWith(Coders.Gzip) {
-        entity(as[String]) { content: String =>
+        entity(as[String]) { (content: String) =>
           complete(s"Request content: '$content'")
         }
       }
@@ -121,7 +121,7 @@ class CodingDirectivesExamplesSpec extends RoutingSpec with CompileOnlySpec {
     //#decodeRequestWith
     val route =
       decodeRequestWith(Coders.Gzip, Coders.NoCoding) {
-        entity(as[String]) { content: String =>
+        entity(as[String]) { (content: String) =>
           complete(s"Request content: '$content'")
         }
       }
diff --git a/docs/src/test/scala/docs/http/scaladsl/server/directives/FileUploadDirectivesExamplesSpec.scala b/docs/src/test/scala/docs/http/scaladsl/server/directives/FileUploadDirectivesExamplesSpec.scala
index 387a574bb..22e47d45e 100644
--- a/docs/src/test/scala/docs/http/scaladsl/server/directives/FileUploadDirectivesExamplesSpec.scala
+++ b/docs/src/test/scala/docs/http/scaladsl/server/directives/FileUploadDirectivesExamplesSpec.scala
@@ -25,7 +25,7 @@ class FileUploadDirectivesExamplesSpec extends RoutingSpec with CompileOnlySpec
   """
 
   // test touches disk, so give it some time
-  implicit val routeTimeout = RouteTestTimeout(7.seconds.dilated)
+  implicit val routeTimeout: RouteTestTimeout = RouteTestTimeout(7.seconds.dilated)
 
   "storeUploadedFile" in {
     //#storeUploadedFile
diff --git a/docs/src/test/scala/docs/http/scaladsl/server/directives/FutureDirectivesExamplesSpec.scala b/docs/src/test/scala/docs/http/scaladsl/server/directives/FutureDirectivesExamplesSpec.scala
index 9dd19e3b7..0476b632f 100644
--- a/docs/src/test/scala/docs/http/scaladsl/server/directives/FutureDirectivesExamplesSpec.scala
+++ b/docs/src/test/scala/docs/http/scaladsl/server/directives/FutureDirectivesExamplesSpec.scala
@@ -20,12 +20,12 @@ import docs.CompileOnlySpec
 class FutureDirectivesExamplesSpec extends RoutingSpec with CompileOnlySpec {
   object TestException extends Throwable
 
-  implicit val myExceptionHandler =
+  implicit val myExceptionHandler: ExceptionHandler =
     ExceptionHandler {
       case TestException => complete(InternalServerError -> "Unsuccessful future!")
     }
 
-  implicit val responseTimeout = Timeout(2, TimeUnit.SECONDS)
+  implicit val responseTimeout: Timeout = Timeout(2, TimeUnit.SECONDS)
 
   "onComplete" in {
     //#onComplete
diff --git a/docs/src/test/scala/docs/http/scaladsl/server/directives/JsonStreamingExamplesSpec.scala b/docs/src/test/scala/docs/http/scaladsl/server/directives/JsonStreamingExamplesSpec.scala
index fec58f8cf..e273bcd0d 100644
--- a/docs/src/test/scala/docs/http/scaladsl/server/directives/JsonStreamingExamplesSpec.scala
+++ b/docs/src/test/scala/docs/http/scaladsl/server/directives/JsonStreamingExamplesSpec.scala
@@ -30,11 +30,13 @@ class JsonStreamingExamplesSpec extends RoutingSpec with CompileOnlySpec {
   def getTweets = Source(tweets)
 
   //#tweet-format
+  import spray.json.RootJsonFormat
+
   object MyTweetJsonProtocol
     extends akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport
     with spray.json.DefaultJsonProtocol {
 
-    implicit val tweetFormat = jsonFormat2(Tweet.apply)
+    implicit val tweetFormat: RootJsonFormat[Tweet] = jsonFormat2(Tweet.apply)
   }
   //#tweet-format
 
@@ -86,7 +88,7 @@ class JsonStreamingExamplesSpec extends RoutingSpec with CompileOnlySpec {
     // {"example":1000}
     val newline = ByteString("\n")
 
-    implicit val jsonStreamingSupport = EntityStreamingSupport.json()
+    implicit val jsonStreamingSupport: EntityStreamingSupport = EntityStreamingSupport.json()
       .withFramingRenderer(Flow[ByteString].map(bs => bs ++ newline))
 
     val route =
@@ -120,7 +122,7 @@ class JsonStreamingExamplesSpec extends RoutingSpec with CompileOnlySpec {
     }
 
     // [2] enable csv streaming:
-    implicit val csvStreaming = EntityStreamingSupport.csv()
+    implicit val csvStreaming: EntityStreamingSupport = EntityStreamingSupport.csv()
 
     val route =
       path("tweets") {
@@ -176,11 +178,13 @@ class JsonStreamingExamplesSpec extends RoutingSpec with CompileOnlySpec {
   //#measurement-model
 
   //#measurement-format
+  import spray.json.RootJsonFormat
+
   object MyMeasurementJsonProtocol
     extends akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport
     with spray.json.DefaultJsonProtocol {
 
-    implicit val measurementFormat = jsonFormat2(Measurement.apply)
+    implicit val measurementFormat: RootJsonFormat[Measurement] = jsonFormat2(Measurement.apply)
   }
   //#measurement-format
 
@@ -190,7 +194,7 @@ class JsonStreamingExamplesSpec extends RoutingSpec with CompileOnlySpec {
     import MyMeasurementJsonProtocol._
 
     // [2] enable Json Streaming
-    implicit val jsonStreamingSupport = EntityStreamingSupport.json()
+    implicit val jsonStreamingSupport: EntityStreamingSupport = EntityStreamingSupport.json()
 
     // prepare your persisting logic here
     val persistMetrics = Flow[Measurement]
@@ -207,7 +211,7 @@ class JsonStreamingExamplesSpec extends RoutingSpec with CompileOnlySpec {
               .runFold(0) { (cnt, _) => cnt + 1 }
 
           complete {
-            measurementsSubmitted.map(n => Map("msg" -> s"""Total metrics received: $n"""))
+            measurementsSubmitted.map(n => s"""Total metrics received: $n""")
           }
         }
       }
@@ -224,7 +228,7 @@ class JsonStreamingExamplesSpec extends RoutingSpec with CompileOnlySpec {
 
     Post("/metrics", entity = data) ~> route ~> check {
       status should ===(StatusCodes.OK)
-      responseAs[String] should ===("""{"msg":"Total metrics received: 2"}""")
+      responseAs[String] should ===("Total metrics received: 2")
     }
 
     // the FramingWithContentType will reject any content type that it does not understand:
diff --git a/docs/src/test/scala/docs/http/scaladsl/server/directives/JsonStreamingFullExamples.scala b/docs/src/test/scala/docs/http/scaladsl/server/directives/JsonStreamingFullExamples.scala
index abdd8964e..f8d1be776 100644
--- a/docs/src/test/scala/docs/http/scaladsl/server/directives/JsonStreamingFullExamples.scala
+++ b/docs/src/test/scala/docs/http/scaladsl/server/directives/JsonStreamingFullExamples.scala
@@ -22,6 +22,7 @@ class JsonStreamingFullExamples extends AnyWordSpec {
   import akka.stream.scaladsl.Source
   import spray.json.DefaultJsonProtocol
 
+  import scala.concurrent.ExecutionContext
   import scala.io.StdIn
   import scala.util.Random
 
@@ -31,21 +32,21 @@ class JsonStreamingFullExamples extends AnyWordSpec {
 
     import spray.json._
 
-    implicit val userFormat = jsonFormat2(User)
+    implicit val userFormat: JsonFormat[User] = jsonFormat2(User.apply)
 
     val `vnd.example.api.v1+json` =
       MediaType.applicationWithFixedCharset("vnd.example.api.v1+json", HttpCharsets.`UTF-8`)
     val ct = ContentType.apply(`vnd.example.api.v1+json`)
 
     implicit def userMarshaller: ToEntityMarshaller[User] = Marshaller.oneOf(
-      Marshaller.withFixedContentType(`vnd.example.api.v1+json`) { organisation =>
-        HttpEntity(`vnd.example.api.v1+json`, organisation.toJson.compactPrint)
+      Marshaller.withFixedContentType(`vnd.example.api.v1+json`) { (user: User) =>
+        HttpEntity(`vnd.example.api.v1+json`, user.toJson.compactPrint)
       })
   }
 
   object ApiServer extends App with UserProtocol {
-    implicit val system = ActorSystem("api")
-    implicit val executionContext = system.dispatcher
+    implicit val system: ActorSystem = ActorSystem("api")
+    implicit val executionContext: ExecutionContext = system.dispatcher
 
     implicit val jsonStreamingSupport: JsonEntityStreamingSupport = EntityStreamingSupport.json()
       .withContentType(ct)
diff --git a/docs/src/test/scala/docs/http/scaladsl/server/directives/MarshallingDirectivesExamplesSpec.scala b/docs/src/test/scala/docs/http/scaladsl/server/directives/MarshallingDirectivesExamplesSpec.scala
index 58b3a8cd6..d1b35abff 100644
--- a/docs/src/test/scala/docs/http/scaladsl/server/directives/MarshallingDirectivesExamplesSpec.scala
+++ b/docs/src/test/scala/docs/http/scaladsl/server/directives/MarshallingDirectivesExamplesSpec.scala
@@ -9,15 +9,16 @@ import akka.http.scaladsl.model.MediaTypes.`application/json`
 import akka.http.scaladsl.model._
 import akka.http.scaladsl.server.RoutingSpec
 import docs.CompileOnlySpec
-import spray.json.{ DefaultJsonProtocol, JsValue }
 
 //#person-case-class
 case class Person(name: String, favoriteNumber: Int)
 //#person-case-class
 
 //#person-json-support
+import spray.json.{ DefaultJsonProtocol, RootJsonFormat }
+
 object PersonJsonSupport extends DefaultJsonProtocol with SprayJsonSupport {
-  implicit val PortofolioFormats = jsonFormat2(Person)
+  implicit val personFormat: RootJsonFormat[Person] = jsonFormat2(Person.apply)
 }
 //#person-json-support
 
@@ -43,6 +44,7 @@ class MarshallingDirectivesExamplesSpec extends RoutingSpec with CompileOnlySpec
 
   "example-entity-with-raw-json" in {
     //#example-entity-with-raw-json
+    import spray.json.JsValue
     import PersonJsonSupport._
 
     val route = post {
diff --git a/docs/src/test/scala/docs/http/scaladsl/server/directives/MiscDirectivesExamplesSpec.scala b/docs/src/test/scala/docs/http/scaladsl/server/directives/MiscDirectivesExamplesSpec.scala
index 1a604ffad..b57703341 100644
--- a/docs/src/test/scala/docs/http/scaladsl/server/directives/MiscDirectivesExamplesSpec.scala
+++ b/docs/src/test/scala/docs/http/scaladsl/server/directives/MiscDirectivesExamplesSpec.scala
@@ -6,9 +6,10 @@ package docs.http.scaladsl.server.directives
 
 import akka.http.scaladsl.model._
 import akka.http.scaladsl.server._
+import akka.util.ByteString
 import headers._
-import java.net.InetAddress
 
+import java.net.InetAddress
 import docs.CompileOnlySpec
 
 class MiscDirectivesExamplesSpec extends RoutingSpec with CompileOnlySpec {
@@ -122,7 +123,7 @@ class MiscDirectivesExamplesSpec extends RoutingSpec with CompileOnlySpec {
 
     // tests:
     def entityOfSize(size: Int) =
-      HttpEntity(ContentTypes.`text/plain(UTF-8)`, "0" * size)
+      HttpEntity(ContentTypes.`text/plain(UTF-8)`, List.fill(size)('0').mkString)
 
     Post("/abc", entityOfSize(500)) ~> route ~> check {
       status shouldEqual StatusCodes.OK
@@ -143,7 +144,7 @@ class MiscDirectivesExamplesSpec extends RoutingSpec with CompileOnlySpec {
 
     // tests:
     def entityOfSize(size: Int) =
-      HttpEntity(ContentTypes.`text/plain(UTF-8)`, "0" * size)
+      HttpEntity(ContentTypes.`text/plain(UTF-8)`, List.fill(size)('0').mkString)
 
     Post("/abc", entityOfSize(500)) ~> route ~> check {
       status shouldEqual StatusCodes.OK
@@ -168,7 +169,7 @@ class MiscDirectivesExamplesSpec extends RoutingSpec with CompileOnlySpec {
 
     // tests:
     def entityOfSize(size: Int) =
-      HttpEntity(ContentTypes.`text/plain(UTF-8)`, "0" * size)
+      HttpEntity(ContentTypes.`text/plain(UTF-8)`, List.fill(size)('0').mkString)
     Post("/abc", entityOfSize(800)) ~> route ~> check {
       status shouldEqual StatusCodes.OK
     }
@@ -190,7 +191,7 @@ class MiscDirectivesExamplesSpec extends RoutingSpec with CompileOnlySpec {
 
     // tests:
     def entityOfSize(size: Int) =
-      HttpEntity(ContentTypes.`text/plain(UTF-8)`, "0" * size)
+      HttpEntity(ContentTypes.`text/plain(UTF-8)`, List.fill(size)('0').mkString)
 
     // will work even if you have configured akka.http.parsing.max-content-length = 500
     Post("/abc", entityOfSize(501)) ~> route ~> check {
diff --git a/docs/src/test/scala/docs/http/scaladsl/server/directives/PathDirectivesExamplesSpec.scala b/docs/src/test/scala/docs/http/scaladsl/server/directives/PathDirectivesExamplesSpec.scala
index 0552770f9..faa6f9cb2 100644
--- a/docs/src/test/scala/docs/http/scaladsl/server/directives/PathDirectivesExamplesSpec.scala
+++ b/docs/src/test/scala/docs/http/scaladsl/server/directives/PathDirectivesExamplesSpec.scala
@@ -15,7 +15,7 @@ class PathDirectivesExamplesSpec extends RoutingSpec with CompileOnlySpec {
     "foo" / "bar" / "X" ~ IntNumber.? / ("edit" | "create")
 
   val route: Route =
-    path(matcher) { i: Option[Int] =>
+    path(matcher) { (i: Option[Int]) =>
       complete(s"Matched X${i.getOrElse("")}")
     }
   //#path-matcher
diff --git a/docs/src/test/scala/docs/http/scaladsl/server/directives/RouteDirectivesExamplesSpec.scala b/docs/src/test/scala/docs/http/scaladsl/server/directives/RouteDirectivesExamplesSpec.scala
index 3324e0d91..3dd47a517 100644
--- a/docs/src/test/scala/docs/http/scaladsl/server/directives/RouteDirectivesExamplesSpec.scala
+++ b/docs/src/test/scala/docs/http/scaladsl/server/directives/RouteDirectivesExamplesSpec.scala
@@ -17,7 +17,7 @@ import akka.http.scaladsl.model._
 
 //#complete-examples
 import akka.http.scaladsl.model.ContentTypes._
-import akka.http.scaladsl.model.headers.`Content-Type`
+import akka.http.scaladsl.model.headers.`Access-Control-Allow-Origin`
 
 //#complete-examples
 
@@ -48,10 +48,10 @@ class RouteDirectivesExamplesSpec extends RoutingSpec with CompileOnlySpec {
           complete(201 -> "bar")
         },
         path("e") {
-          complete(StatusCodes.Created, List(`Content-Type`(`text/plain(UTF-8)`)), "bar")
+          complete(StatusCodes.Created, List(`Access-Control-Allow-Origin`.`*`), "bar")
         },
         path("f") {
-          complete(201, List(`Content-Type`(`text/plain(UTF-8)`)), "bar")
+          complete(201, List(`Access-Control-Allow-Origin`.`*`), "bar")
         },
         path("g") {
           complete(Future { StatusCodes.Created -> "bar" })
@@ -82,13 +82,13 @@ class RouteDirectivesExamplesSpec extends RoutingSpec with CompileOnlySpec {
 
     Get("/e") ~> route ~> check {
       status shouldEqual StatusCodes.Created
-      header[`Content-Type`] shouldEqual Some(`Content-Type`(`text/plain(UTF-8)`))
+      header[`Access-Control-Allow-Origin`] shouldEqual Some(`Access-Control-Allow-Origin`.`*`)
       responseAs[String] shouldEqual "bar"
     }
 
     Get("/f") ~> route ~> check {
       status shouldEqual StatusCodes.Created
-      header[`Content-Type`] shouldEqual Some(`Content-Type`(`text/plain(UTF-8)`))
+      header[`Access-Control-Allow-Origin`] shouldEqual Some(`Access-Control-Allow-Origin`.`*`)
       responseAs[String] shouldEqual "bar"
     }
 
diff --git a/project/Common.scala b/project/Common.scala
index 93cfee379..342c7eacb 100644
--- a/project/Common.scala
+++ b/project/Common.scala
@@ -16,19 +16,15 @@ object Common extends AutoPlugin {
     scalacOptions ++= Seq(
       "-deprecation",
       "-encoding", "UTF-8", // yes, this is 2 args
-      "-target:jvm-1.8",
+      "-release", "8",
       "-unchecked",
-      "-Xlint",
       "-Ywarn-dead-code",
       // Silence deprecation notices for changes introduced in Scala 2.12
       // Can be removed when we drop support for Scala 2.12:
       "-Wconf:msg=object JavaConverters in package collection is deprecated:s",
       "-Wconf:msg=is deprecated \\(since 2\\.13\\.:s",
     ),
-    // '-release' parameter is restricted to 'Compile, compile' scope because
-    // otherwise `sbt akka-http-xml/compile:doc` fails with it on Scala 2.12.9
-    Compile / compile / scalacOptions ++=
-      onlyAfterScala212(onlyAfterJdk8("-release", "8")).value,
+    scalacOptions ++= onlyOnScala2(Seq("-Xlint")).value,
     javacOptions ++=
       Seq("-encoding", "UTF-8") ++ onlyOnJdk8("-source", "1.8") ++ onlyAfterJdk8("--release", "8"),
     // restrict to 'compile' scope because otherwise it is also passed to
@@ -54,6 +50,9 @@ object Common extends AutoPlugin {
   def onlyAfterScala212[T](values: Seq[T]): Def.Initialize[Seq[T]] = Def.setting {
     if (scalaMinorVersion.value >= 12) values else Seq.empty[T]
   }
+  def onlyOnScala2[T](values: Seq[T]): Def.Initialize[Seq[T]] = Def.setting {
+    if (scalaVersion.value.startsWith("3")) Seq.empty[T] else values
+  }
 
   def scalaMinorVersion: Def.Initialize[Long] = Def.setting { CrossVersion.partialVersion(scalaVersion.value).get._2 }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pekko.apache.org
For additional commands, e-mail: commits-help@pekko.apache.org