diff --git a/README.md b/README.md index 562f4d014e..2881144dbb 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,7 @@ tapir documentation is available at [tapir.softwaremill.com](http://tapir.softwa Add the following dependency: ```sbt -"com.softwaremill.sttp.tapir" %% "tapir-core" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-core" % "1.9.3" ``` Then, import: diff --git a/generated-doc/out/client/http4s.md b/generated-doc/out/client/http4s.md index c4a8c6d8c8..8dfb581a40 100644 --- a/generated-doc/out/client/http4s.md +++ b/generated-doc/out/client/http4s.md @@ -3,7 +3,7 @@ Add the dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-http4s-client" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-http4s-client" % "1.9.3" ``` To interpret an endpoint definition as an `org.http4s.Request[F]`, import: diff --git a/generated-doc/out/client/play.md b/generated-doc/out/client/play.md index 7b1d8401ef..8747de678c 100644 --- a/generated-doc/out/client/play.md +++ b/generated-doc/out/client/play.md @@ -1,11 +1,22 @@ # Using as a Play client -Add the dependency: +Tapir supports both Play 2.9, which still ships with Akka, and Play 3.0, which replaces Akka with Pekko. +See the [Play framework documentation](https://www.playframework.com/documentation/2.9.x/General#How-Play-Deals-with-Akkas-License-Change) for differences between these versions. + +For **Play 3.0**, add the dependency: + +```scala +"com.softwaremill.sttp.tapir" %% "tapir-play-client" % "1.9.3" +``` + +For **Play 2.9**, add ```scala -"com.softwaremill.sttp.tapir" %% "tapir-play-client" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-play29-client" % "1.9.3" ``` +instead. Furthermore, replace all uses of `sttp.capabilities.pekko.PekkoStreams` in the following code snippets with `sttp.capabilities.akka.AkkaStreams`. + To make requests using an endpoint definition using the [play client](https://github.com/playframework/play-ws), import: ```scala @@ -13,7 +24,7 @@ import sttp.tapir.client.play.PlayClientInterpreter ``` This objects contains four methods: - - `toRequestThrowDecodeFailures(PublicEndpoint, String)` and `toSecureRequestThrowDecodeErrors(Endpoint, String)`: given + - `toRequestThrowDecodeFailures(PublicEndpoint, String)` and `toSecureRequestThrowDecodeErrors(Endpoint, String)`: given the base URI returns a function, which will generate a request and a response parser which might throw an exception when decoding of the result fails ```scala @@ -26,8 +37,8 @@ This objects contains four methods: I => (StandaloneWSRequest, StandaloneWSResponse => DecodeResult[Either[E, O]]) ``` -Note that the returned functions have one argument each: first the security inputs (if any), and regular input values of the endpoint. This might be a -single type, a tuple, or a case class, depending on the endpoint description. +Note that the returned functions have one argument each: first the security inputs (if any), and regular input values of the endpoint. This might be a +single type, a tuple, or a case class, depending on the endpoint description. After providing the input parameters, the two following are returned: - a description of the request to be made, with the input value @@ -52,11 +63,11 @@ import play.api.libs.ws.StandaloneWSClient def example[I, E, O, R >: PekkoStreams](implicit wsClient: StandaloneWSClient) { val e: PublicEndpoint[I, E, O, R] = ??? val inputArgs: I = ??? - + val (req, responseParser) = PlayClientInterpreter() .toRequestThrowDecodeFailures(e, s"http://localhost:9000") .apply(inputArgs) - + val result: Future[Either[E, O]] = req .execute() .map(responseParser) @@ -68,4 +79,4 @@ def example[I, E, O, R >: PekkoStreams](implicit wsClient: StandaloneWSClient) { Multipart requests are not supported. Streaming capabilities: -- only `PekkoStreams` is supported +- only `PekkoStreams` is supported (resp. `AkkaStreams` for Play 2.9) diff --git a/generated-doc/out/client/sttp.md b/generated-doc/out/client/sttp.md index 521e7432c0..0e12264d14 100644 --- a/generated-doc/out/client/sttp.md +++ b/generated-doc/out/client/sttp.md @@ -3,7 +3,7 @@ Add the dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-sttp-client" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-sttp-client" % "1.9.3" ``` To make requests using an endpoint definition using the [sttp client](https://github.com/softwaremill/sttp), import: @@ -102,7 +102,7 @@ In this case add the following dependencies (note the [`%%%`](https://www.scala- instead of the usual `%%`): ```scala -"com.softwaremill.sttp.tapir" %%% "tapir-sttp-client" % "1.9.2" +"com.softwaremill.sttp.tapir" %%% "tapir-sttp-client" % "1.9.3" "io.github.cquiroz" %%% "scala-java-time" % "2.2.0" // implementations of java.time classes for Scala.JS ``` diff --git a/generated-doc/out/docs/asyncapi.md b/generated-doc/out/docs/asyncapi.md index f00633257f..6d97351569 100644 --- a/generated-doc/out/docs/asyncapi.md +++ b/generated-doc/out/docs/asyncapi.md @@ -3,7 +3,7 @@ To use, add the following dependencies: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-asyncapi-docs" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-asyncapi-docs" % "1.9.3" "com.softwaremill.sttp.apispec" %% "asyncapi-circe-yaml" % "..." // see https://github.com/softwaremill/sttp-apispec ``` diff --git a/generated-doc/out/docs/json-schema.md b/generated-doc/out/docs/json-schema.md index 1c32da5a94..d2f5b8156c 100644 --- a/generated-doc/out/docs/json-schema.md +++ b/generated-doc/out/docs/json-schema.md @@ -3,7 +3,7 @@ You can conveniently generate JSON schema from Tapir schema, which can be derived from your Scala types. Use `TapirSchemaToJsonSchema`: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-apispec-docs" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-apispec-docs" % "1.9.3" ``` Schema generation can now be performed like in the following example: diff --git a/generated-doc/out/docs/openapi.md b/generated-doc/out/docs/openapi.md index 5fef463de6..88e898b731 100644 --- a/generated-doc/out/docs/openapi.md +++ b/generated-doc/out/docs/openapi.md @@ -13,7 +13,7 @@ these steps can be done separately, giving you complete control over the process To generate OpenAPI documentation and expose it using the Swagger UI in a single step, first add the dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-swagger-ui-bundle" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-swagger-ui-bundle" % "1.9.3" ``` Then, you can interpret a list of endpoints using `SwaggerInterpreter`. The result will be a list of file-serving @@ -55,7 +55,7 @@ for details. Similarly as above, you'll need the following dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-redoc-bundle" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-redoc-bundle" % "1.9.3" ``` And the server endpoints can be generated using the `sttp.tapir.redoc.bundle.RedocInterpreter` class. @@ -65,7 +65,7 @@ And the server endpoints can be generated using the `sttp.tapir.redoc.bundle.Red To generate the docs in the OpenAPI yaml format, add the following dependencies: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-openapi-docs" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-openapi-docs" % "1.9.3" "com.softwaremill.sttp.apispec" %% "openapi-circe-yaml" % "..." // see https://github.com/softwaremill/sttp-apispec ``` @@ -133,7 +133,7 @@ For example, generating the OpenAPI 3.0.3 YAML string can be achieved by perform Firstly add dependencies: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-openapi-docs" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-openapi-docs" % "1.9.3" "com.softwaremill.sttp.apispec" %% "openapi-circe-yaml" % "..." // see https://github.com/softwaremill/sttp-apispec ``` @@ -163,12 +163,12 @@ The modules `tapir-swagger-ui` and `tapir-redoc` contain server endpoint definit yaml format, will expose it using the given context path. To use, add as a dependency either `tapir-swagger-ui`: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-swagger-ui" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-swagger-ui" % "1.9.3" ``` or `tapir-redoc`: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-redoc" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-redoc" % "1.9.3" ``` Then, you'll need to pass the server endpoints to your server interpreter. For example, using akka-http: diff --git a/generated-doc/out/endpoint/enumerations.md b/generated-doc/out/endpoint/enumerations.md index f783adfcdc..46c5e4402b 100644 --- a/generated-doc/out/endpoint/enumerations.md +++ b/generated-doc/out/endpoint/enumerations.md @@ -148,6 +148,16 @@ query[CommaSeparated[Features.Feature]]("features") Additionally, the schema for such an input/output will have the `explode` parameter set to `false`, so that it is properly represented in [OpenAPI](../docs/openapi.md) documentation. +You can take a look at a runnable example [here](https://github.com/softwaremill/tapir/tree/master/examples/src/main/scala/sttp/tapir/examples/custom_types). + +```eval_rst +.. warning:: + + ``Delimited`` and ``CommaSeparated`` rely on literal types, which are only available in Scala 2.13+. + + If you're using an older version of Scala, a workaround is creating a comma-separated codec locally. +``` + ## Using enumerations as part of bodies When an enumeration is used as part of a body, on the tapir side you'll have to provide a [schema](schemas.md) for diff --git a/generated-doc/out/endpoint/integrations.md b/generated-doc/out/endpoint/integrations.md index 5714c14311..e7eecacf56 100644 --- a/generated-doc/out/endpoint/integrations.md +++ b/generated-doc/out/endpoint/integrations.md @@ -14,7 +14,7 @@ The `tapir-cats` module contains additional instances for some [cats](https://ty datatypes as well as additional syntax: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-cats" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-cats" % "1.9.3" ``` - `import sttp.tapir.integ.cats.codec._` - brings schema, validator and codec instances @@ -24,7 +24,7 @@ Additionally, the `tapir-cats-effect` module contains an implementation of the ` between the sttp-internal `MonadError` and the cats-effect `Sync` typeclass: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-cats-effect" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-cats-effect" % "1.9.3" ``` ## Refined integration @@ -33,7 +33,7 @@ If you use [refined](https://github.com/fthomas/refined), the `tapir-refined` mo validators for `T Refined P` as long as a codec for `T` already exists: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-refined" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-refined" % "1.9.3" ``` You'll need to extend the `sttp.tapir.codec.refined.TapirCodecRefined` @@ -54,7 +54,7 @@ If you use [iron](https://github.com/Iltotore/iron), the `tapir-iron` module wil validators for `T :| P` as long as a codec for `T` already exists: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-iron" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-iron" % "1.9.3" ``` The module is only available for Scala 3 since iron is not designed to work with Scala 2. @@ -72,7 +72,7 @@ The `tapir-enumeratum` module provides schemas, validators and codecs for [Enume enumerations. To use, add the following dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-enumeratum" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-enumeratum" % "1.9.3" ``` Then, `import sttp.tapir.codec.enumeratum._`, or extends the `sttp.tapir.codec.enumeratum.TapirCodecEnumeratum` trait. @@ -85,7 +85,7 @@ If you use [scala-newtype](https://github.com/estatico/scala-newtype), the `tapi schemas for types with a `@newtype` and `@newsubtype` annotations as long as a codec and schema for its underlying value already exists: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-newtype" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-newtype" % "1.9.3" ``` Then, `import sttp.tapir.codec.newtype._`, or extend the `sttp.tapir.codec.newtype.TapirCodecNewType` trait to bring the implicit values into scope. @@ -96,7 +96,7 @@ If you use [monix newtypes](https://github.com/monix/newtypes), the `tapir-monix schemas for types which extend `NewtypeWrapped` and `NewsubtypeWrapped` annotations as long as a codec and schema for its underlying value already exists: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-monix-newtype" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-monix-newtype" % "1.9.3" ``` Then, `import sttp.tapir.codec.monix.newtype._`, or extend the `sttp.tapir.codec.monix.newtype.TapirCodecMonixNewType` trait to bring the implicit values into scope. @@ -107,7 +107,7 @@ If you use [ZIO Prelude Newtypes](https://zio.github.io/zio-prelude/docs/newtype schemas for types defined using `Newtype` and `Subtype` as long as a codec and a schema for the underlying type already exists: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-zio-prelude" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-zio-prelude" % "1.9.3" ``` Then, mix in `sttp.tapir.codec.zio.prelude.newtype.TapirNewtypeSupport` into your newtype to bring the implicit values into scope: @@ -146,7 +146,7 @@ For details refer to [derevo documentation](https://github.com/tofu-tf/derevo#in To use, add the following dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-derevo" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-derevo" % "1.9.3" ``` Then you can derive schema for your ADT along with other typeclasses besides ADT declaration itself: diff --git a/generated-doc/out/endpoint/json.md b/generated-doc/out/endpoint/json.md index 21e3c7b627..82aef5d42b 100644 --- a/generated-doc/out/endpoint/json.md +++ b/generated-doc/out/endpoint/json.md @@ -1,41 +1,41 @@ # Working with JSON Json values are supported through codecs, which encode/decode values to json strings. Most often, you'll be using a -third-party library to perform the actual json parsing/printing. See below for the list of supported libraries. +third-party library to perform the actual json parsing/printing. See below for the list of supported libraries. -All the integrations, when imported into scope, define `jsonBody[T]` and `jsonQuery[T]` methods. +All the integrations, when imported into scope, define `jsonBody[T]` and `jsonQuery[T]` methods. -Instead of providing the json codec as an implicit value, this method depends on library-specific implicits being in -scope, and basing on these values creates a json codec. The derivation also requires -an implicit `Schema[T]` instance, which can be automatically derived. For more details see sections on -[schema derivation](schemas.md) and on supporting [custom types](customtypes.md) in general. Such a design provides +Instead of providing the json codec as an implicit value, this method depends on library-specific implicits being in +scope, and basing on these values creates a json codec. The derivation also requires +an implicit `Schema[T]` instance, which can be automatically derived. For more details see sections on +[schema derivation](schemas.md) and on supporting [custom types](customtypes.md) in general. Such a design provides better error reporting, in case one of the components required to create the json codec is missing. ```eval_rst .. note:: Note that the process of deriving schemas, and deriving library-specific json encoders and decoders is entirely - separate (unless you're using the pickler module - see below). The first is controlled by tapir, the second - by the - json library. Any customisation, e.g. for field naming or inheritance strategies, must be done separately for both + separate (unless you're using the pickler module - see below). The first is controlled by tapir, the second - by the + json library. Any customisation, e.g. for field naming or inheritance strategies, must be done separately for both derivations. ``` ## Pickler -Alternatively, instead of deriving schemas and library-specific json encoders and decoders separately, you can use -the experimental [pickler](pickler.md) module, which takes care of both derivation in a consistent way, which allows +Alternatively, instead of deriving schemas and library-specific json encoders and decoders separately, you can use +the experimental [pickler](pickler.md) module, which takes care of both derivation in a consistent way, which allows customization with a single, common configuration API. ## Implicit json codecs -If you have a custom, implicit `Codec[String, T, Json]` instance, you should use the `customCodecJsonBody[T]` method instead. -This description of endpoint input/output, instead of deriving a codec basing on other library-specific implicits, uses +If you have a custom, implicit `Codec[String, T, Json]` instance, you should use the `customCodecJsonBody[T]` method instead. +This description of endpoint input/output, instead of deriving a codec basing on other library-specific implicits, uses the json codec that is in scope. ## JSON as string If you'd like to work with JSON bodies in a serialised `String` form, instead of integrating on a higher level using -one of the libraries mentioned below, you should use the `stringJsonBody` input/output. Note that in this case, the +one of the libraries mentioned below, you should use the `stringJsonBody` input/output. Note that in this case, the serialising/deserialising of the body must be part of the [server logic](../server/logic.md). A schema can be provided in this case as well: @@ -52,7 +52,7 @@ stringJsonBody.schema(implicitly[Schema[MyBody]].as[String]) To use [Circe](https://github.com/circe/circe), add the following dependency to your project: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-json-circe" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-json-circe" % "1.9.3" ``` Next, import the package (or extend the `TapirJsonCirce` trait, see [MyTapir](../mytapir.md)): @@ -61,8 +61,8 @@ Next, import the package (or extend the `TapirJsonCirce` trait, see [MyTapir](.. import sttp.tapir.json.circe._ ``` -The above import brings into scope the `jsonBody[T]` body input/output description, which creates a codec, given an -in-scope circe `Encoder`/`Decoder` and a `Schema`. Circe includes a couple of approaches to generating encoders/decoders +The above import brings into scope the `jsonBody[T]` body input/output description, which creates a codec, given an +in-scope circe `Encoder`/`Decoder` and a `Schema`. Circe includes a couple of approaches to generating encoders/decoders (manual, semi-auto and auto), so you may choose whatever suits you. Note that when using Circe's auto derivation, any encoders/decoders for custom types must be in scope as well. @@ -82,7 +82,7 @@ val bookInput: EndpointIO[Book] = jsonBody[Book] ### Configuring the circe printer -Circe lets you select an instance of `io.circe.Printer` to configure the way JSON objects are rendered. By default +Circe lets you select an instance of `io.circe.Printer` to configure the way JSON objects are rendered. By default Tapir uses `Printer.nospaces`, which would render: ```scala @@ -100,7 +100,7 @@ as {"key1":"present","key2":null} ``` -Suppose we would instead want to omit `null`-values from the object and pretty-print it. You can configure this by +Suppose we would instead want to omit `null`-values from the object and pretty-print it. You can configure this by overriding the `jsonPrinter` in `tapir.circe.json.TapirJsonCirce`: ```scala @@ -125,7 +125,7 @@ Now the above JSON object will render as To use [µPickle](http://www.lihaoyi.com/upickle/) add the following dependency to your project: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-json-upickle" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-json-upickle" % "1.9.3" ``` Next, import the package (or extend the `TapirJsonuPickle` trait, see [MyTapir](../mytapir.md) and add `TapirJsonuPickle` not `TapirCirceJson`): @@ -157,10 +157,16 @@ For more examples, including making a custom encoder/decoder, see [TapirJsonuPic ## Play JSON -To use [Play JSON](https://github.com/playframework/play-json) add the following dependency to your project: +To use [Play JSON](https://github.com/playframework/play-json) for **Play 3.0**, add the following dependency to your project: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-json-play" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-json-play" % "1.9.3" +``` + +For **Play 2.9** use: + +```scala +"com.softwaremill.sttp.tapir" %% "tapir-json-play29" % "1.9.3" ``` Next, import the package (or extend the `TapirJsonPlay` trait, see [MyTapir](../mytapir.md) and add `TapirJsonPlay` not `TapirCirceJson`): @@ -169,14 +175,14 @@ Next, import the package (or extend the `TapirJsonPlay` trait, see [MyTapir](../ import sttp.tapir.json.play._ ``` -Play JSON requires `Reads` and `Writes` implicit values in scope for each type you want to serialize. +Play JSON requires `Reads` and `Writes` implicit values in scope for each type you want to serialize. ## Spray JSON To use [Spray JSON](https://github.com/spray/spray-json) add the following dependency to your project: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-json-spray" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-json-spray" % "1.9.3" ``` Next, import the package (or extend the `TapirJsonSpray` trait, see [MyTapir](../mytapir.md) and add `TapirJsonSpray` not `TapirCirceJson`): @@ -185,14 +191,14 @@ Next, import the package (or extend the `TapirJsonSpray` trait, see [MyTapir](.. import sttp.tapir.json.spray._ ``` -Spray JSON requires a `JsonFormat` implicit value in scope for each type you want to serialize. +Spray JSON requires a `JsonFormat` implicit value in scope for each type you want to serialize. ## Tethys JSON To use [Tethys JSON](https://github.com/tethys-json/tethys) add the following dependency to your project: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-json-tethys" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-json-tethys" % "1.9.3" ``` Next, import the package (or extend the `TapirJsonTethys` trait, see [MyTapir](../mytapir.md) and add `TapirJsonTethys` not `TapirCirceJson`): @@ -201,14 +207,14 @@ Next, import the package (or extend the `TapirJsonTethys` trait, see [MyTapir](. import sttp.tapir.json.tethysjson._ ``` -Tethys JSON requires `JsonReader` and `JsonWriter` implicit values in scope for each type you want to serialize. +Tethys JSON requires `JsonReader` and `JsonWriter` implicit values in scope for each type you want to serialize. ## Jsoniter Scala To use [Jsoniter-scala](https://github.com/plokhotnyuk/jsoniter-scala) add the following dependency to your project: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-jsoniter-scala" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-jsoniter-scala" % "1.9.3" ``` Next, import the package (or extend the `TapirJsonJsoniter` trait, see [MyTapir](../mytapir.md) and add `TapirJsonJsoniter` not `TapirCirceJson`): @@ -217,14 +223,14 @@ Next, import the package (or extend the `TapirJsonJsoniter` trait, see [MyTapir] import sttp.tapir.json.jsoniter._ ``` -Jsoniter Scala requires `JsonValueCodec` implicit value in scope for each type you want to serialize. +Jsoniter Scala requires `JsonValueCodec` implicit value in scope for each type you want to serialize. ## Json4s To use [json4s](https://github.com/json4s/json4s) add the following dependencies to your project: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-json-json4s" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-json-json4s" % "1.9.3" ``` And one of the implementations: @@ -255,7 +261,7 @@ implicit val formats: Formats = org.json4s.jackson.Serialization.formats(NoTypeH To use [zio-json](https://github.com/zio/zio-json), add the following dependency to your project: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-json-zio" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-json-zio" % "1.9.3" ``` Next, import the package (or extend the `TapirJsonZio` trait, see [MyTapir](../mytapir.md) and add `TapirJsonZio` instead of `TapirCirceJson`): @@ -298,9 +304,9 @@ when these methods are called. ## Optional json bodies -When the body is specified as an option, e.g. `jsonBody[Option[Book]]`, an empty body will be decoded as `None`. +When the body is specified as an option, e.g. `jsonBody[Option[Book]]`, an empty body will be decoded as `None`. -This is implemented by passing `null` to the json-library-specific decoder, when the schema specifies that the value is +This is implemented by passing `null` to the json-library-specific decoder, when the schema specifies that the value is optional, and the body is empty. ## Next diff --git a/generated-doc/out/endpoint/pickler.md b/generated-doc/out/endpoint/pickler.md index ae0ed75c82..09206048e0 100644 --- a/generated-doc/out/endpoint/pickler.md +++ b/generated-doc/out/endpoint/pickler.md @@ -9,7 +9,7 @@ In [other](json.md) tapir-JSON integrations, you have to keep the `Schema` (whic To use pickler, add the following dependency to your project: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-json-pickler" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-json-pickler" % "1.9.3" ``` Please note that it is available only for Scala 3 and Scala.JS 3. diff --git a/generated-doc/out/endpoint/static.md b/generated-doc/out/endpoint/static.md index 962263d3d8..5eb48030f6 100644 --- a/generated-doc/out/endpoint/static.md +++ b/generated-doc/out/endpoint/static.md @@ -12,7 +12,7 @@ from local files or application resources. These endpoints respect etags, byte r In order to use static content endpoints, add the module to your dependencies: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-files" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-files" % "1.9.3" ``` ## Files diff --git a/generated-doc/out/generator/sbt-openapi-codegen.md b/generated-doc/out/generator/sbt-openapi-codegen.md index bd947377a8..0569c02e96 100644 --- a/generated-doc/out/generator/sbt-openapi-codegen.md +++ b/generated-doc/out/generator/sbt-openapi-codegen.md @@ -11,7 +11,7 @@ Add the sbt plugin to the `project/plugins.sbt`: ```scala -addSbtPlugin("com.softwaremill.sttp.tapir" % "sbt-openapi-codegen" % "1.9.2") +addSbtPlugin("com.softwaremill.sttp.tapir" % "sbt-openapi-codegen" % "1.9.3") ``` Enable the plugin for your project in the `build.sbt`: diff --git a/generated-doc/out/index.md b/generated-doc/out/index.md index ef4b5f5323..119e1163aa 100644 --- a/generated-doc/out/index.md +++ b/generated-doc/out/index.md @@ -7,11 +7,11 @@ ## Intro -With tapir, you can describe HTTP API endpoints as immutable Scala values. Each endpoint can contain a number of +With tapir, you can describe HTTP API endpoints as immutable Scala values. Each endpoint can contain a number of input and output parameters. An endpoint specification can be interpreted as: -* a server, given the "business logic": a function, which computes output parameters based on input parameters. - Currently supported: +* a server, given the "business logic": a function, which computes output parameters based on input parameters. + Currently supported: * [Akka HTTP](server/akkahttp.md) `Route`s/`Directive`s * [Http4s](server/http4s.md) `HttpRoutes[F]` (using cats-effect or [ZIO](server/zio-http4s.md)) * [Netty](server/netty.md) (using `Future`s, cats-effect or ZIO) @@ -132,7 +132,7 @@ case class Book(title: String) // Define an endpoint -val booksListing: PublicEndpoint[(BooksQuery, Limit, AuthToken), String, List[Book], Any] = +val booksListing: PublicEndpoint[(BooksQuery, Limit, AuthToken), String, List[Book], Any] = endpoint .get .in(("books" / path[String]("genre") / path[Int]("year")).mapTo[BooksQuery]) @@ -162,7 +162,7 @@ def bookListingLogic(bfy: BooksQuery, limit: Limit, at: AuthToken): Future[Either[String, List[Book]]] = Future.successful(Right(List(Book("The Sorrows of Young Werther")))) - + val booksListingRoute: Route = AkkaHttpServerInterpreter() .toRoute(booksListing.serverLogic((bookListingLogic _).tupled)) @@ -172,7 +172,7 @@ val booksListingRoute: Route = AkkaHttpServerInterpreter() import sttp.tapir.client.sttp.SttpClientInterpreter import sttp.client3._ -val booksListingRequest: Request[DecodeResult[Either[String, List[Book]]], Any] = +val booksListingRequest: Request[DecodeResult[Either[String, List[Book]]], Any] = SttpClientInterpreter() .toRequest(booksListing, Some(uri"http://localhost:8080")) .apply((BooksQuery("SF", 2016), 20, "xyz-abc-123")) @@ -260,7 +260,7 @@ We offer commercial support for sttp and related technologies, as well as develo .. toctree:: :maxdepth: 2 :caption: Client interpreters - + client/sttp client/play client/http4s @@ -282,9 +282,9 @@ We offer commercial support for sttp and related technologies, as well as develo .. toctree:: :maxdepth: 2 :caption: Generators - + generator/sbt-openapi-codegen - + .. toctree:: :maxdepth: 2 :caption: Other subjects diff --git a/generated-doc/out/quickstart.md b/generated-doc/out/quickstart.md index 64f5c88171..01d6717a08 100644 --- a/generated-doc/out/quickstart.md +++ b/generated-doc/out/quickstart.md @@ -3,7 +3,7 @@ To use tapir, add the following dependency to your project: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-core" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-core" % "1.9.3" ``` This will import only the core classes needed to create endpoint descriptions. To generate a server or a client, you diff --git a/generated-doc/out/server/akkahttp.md b/generated-doc/out/server/akkahttp.md index 23faafd9fe..c1a1832015 100644 --- a/generated-doc/out/server/akkahttp.md +++ b/generated-doc/out/server/akkahttp.md @@ -4,14 +4,14 @@ To expose an endpoint as an [akka-http](https://doc.akka.io/docs/akka-http/curre dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-akka-http-server" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-akka-http-server" % "1.9.3" ``` This will transitively pull some Akka modules in version 2.6. If you want to force your own Akka version (for example 2.5), use sbt exclusion. Mind the Scala version in artifact name: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-akka-http-server" % "1.9.2" exclude("com.typesafe.akka", "akka-stream_2.12") +"com.softwaremill.sttp.tapir" %% "tapir-akka-http-server" % "1.9.3" exclude("com.typesafe.akka", "akka-stream_2.12") ``` Now import the object: diff --git a/generated-doc/out/server/armeria.md b/generated-doc/out/server/armeria.md index 78aa9f46ed..f824fbd486 100644 --- a/generated-doc/out/server/armeria.md +++ b/generated-doc/out/server/armeria.md @@ -8,7 +8,7 @@ Armeria interpreter can be used with different effect systems (cats-effect, ZIO) Add the following dependency ```scala -"com.softwaremill.sttp.tapir" %% "tapir-armeria-server" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-armeria-server" % "1.9.3" ``` and import the object: @@ -75,7 +75,7 @@ Note that Armeria automatically injects an `ExecutionContext` on top of Armeria' Add the following dependency ```scala -"com.softwaremill.sttp.tapir" %% "tapir-armeria-server-cats" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-armeria-server-cats" % "1.9.3" ``` to use this interpreter with Cats Effect typeclasses. @@ -155,9 +155,9 @@ Add the following dependency ```scala // for zio 2: -"com.softwaremill.sttp.tapir" %% "tapir-armeria-server-zio" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-armeria-server-zio" % "1.9.3" // for zio 1: -"com.softwaremill.sttp.tapir" %% "tapir-armeria-server-zio1" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-armeria-server-zio1" % "1.9.3" ``` to use this interpreter with ZIO. diff --git a/generated-doc/out/server/aws.md b/generated-doc/out/server/aws.md index 2fe80250ab..5e03778d4e 100644 --- a/generated-doc/out/server/aws.md +++ b/generated-doc/out/server/aws.md @@ -33,7 +33,7 @@ These are corresponding classes for each of the supported runtime: To start using any of the above add the following dependency: ```sbt -"com.softwaremill.sttp.tapir" %% "tapir-aws-lambda" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-aws-lambda" % "1.9.3" ``` ## Deployment @@ -44,9 +44,9 @@ Tapir leverages ways of doing it provided by AWS, you can choose from: AWS SAM t You can start by adding one of the following dependencies to your project, and then follow examples: ```sbt -"com.softwaremill.sttp.tapir" %% "tapir-aws-sam" % "1.9.2" -"com.softwaremill.sttp.tapir" %% "tapir-aws-terraform" % "1.9.2" -"com.softwaremill.sttp.tapir" %% "tapir-aws-cdk" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-aws-sam" % "1.9.3" +"com.softwaremill.sttp.tapir" %% "tapir-aws-terraform" % "1.9.3" +"com.softwaremill.sttp.tapir" %% "tapir-aws-cdk" % "1.9.3" ``` ### Examples diff --git a/generated-doc/out/server/finatra.md b/generated-doc/out/server/finatra.md index 0336a925df..24895f28ff 100644 --- a/generated-doc/out/server/finatra.md +++ b/generated-doc/out/server/finatra.md @@ -4,7 +4,7 @@ To expose an endpoint as an [finatra](https://twitter.github.io/finatra/) server dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-finatra-server" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-finatra-server" % "1.9.3" ``` and import the object: @@ -17,7 +17,7 @@ This interpreter supports the twitter `Future`. Or, if you would like to use cats-effect project, you can add the following dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-finatra-server-cats" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-finatra-server-cats" % "1.9.3" ``` and import the object: diff --git a/generated-doc/out/server/http4s.md b/generated-doc/out/server/http4s.md index 87ba083f8a..63aa9d41d4 100644 --- a/generated-doc/out/server/http4s.md +++ b/generated-doc/out/server/http4s.md @@ -4,7 +4,7 @@ To expose an endpoint as an [http4s](https://http4s.org) server, first add the f dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-http4s-server" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-http4s-server" % "1.9.3" ``` and import the object: diff --git a/generated-doc/out/server/jdkhttp.md b/generated-doc/out/server/jdkhttp.md index 92081fdd65..2902e54c88 100644 --- a/generated-doc/out/server/jdkhttp.md +++ b/generated-doc/out/server/jdkhttp.md @@ -5,7 +5,7 @@ To expose endpoints using the (`com.sun.net.httpserver`), first add the following dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-jdkhttp-server" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-jdkhttp-server" % "1.9.3" ``` Then, import the package: diff --git a/generated-doc/out/server/netty.md b/generated-doc/out/server/netty.md index 1d5d1b2bcb..89ff016370 100644 --- a/generated-doc/out/server/netty.md +++ b/generated-doc/out/server/netty.md @@ -4,16 +4,16 @@ To expose an endpoint using a [Netty](https://netty.io)-based server, first add ```scala // if you are using Future or just exploring: -"com.softwaremill.sttp.tapir" %% "tapir-netty-server" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-netty-server" % "1.9.3" // if you want to use Java 21 Loom virtual threads in direct style: -"com.softwaremill.sttp.tapir" %% "tapir-netty-server-loom" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-netty-server-loom" % "1.9.3" // if you are using cats-effect: -"com.softwaremill.sttp.tapir" %% "tapir-netty-server-cats" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-netty-server-cats" % "1.9.3" // if you are using zio: -"com.softwaremill.sttp.tapir" %% "tapir-netty-server-zio" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-netty-server-zio" % "1.9.3" ``` Then, use: diff --git a/generated-doc/out/server/nima.md b/generated-doc/out/server/nima.md index f32734b1ef..109d68bc3f 100644 --- a/generated-doc/out/server/nima.md +++ b/generated-doc/out/server/nima.md @@ -9,7 +9,7 @@ To expose an endpoint as a [Helidon Níma](https://helidon.io/nima) server, firs dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-nima-server" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-nima-server" % "1.9.3" ``` Loom-managed concurrency uses direct style instead of effect wrappers like `Future[T]` or `IO[T]`. Because of this, diff --git a/generated-doc/out/server/observability.md b/generated-doc/out/server/observability.md index 83518f9df0..000e796239 100644 --- a/generated-doc/out/server/observability.md +++ b/generated-doc/out/server/observability.md @@ -49,7 +49,7 @@ val labels = MetricLabels( Add the following dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-prometheus-metrics" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-prometheus-metrics" % "1.9.3" ``` `PrometheusMetrics` encapsulates `PrometheusReqistry` and `Metric` instances. It provides several ready to use metrics as @@ -128,7 +128,7 @@ val prometheusMetrics = PrometheusMetrics[Future]("tapir", PrometheusRegistry.de Add the following dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-opentelemetry-metrics" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-opentelemetry-metrics" % "1.9.3" ``` OpenTelemetry metrics are vendor-agnostic and can be exported using one @@ -155,7 +155,7 @@ val metricsInterceptor = metrics.metricsInterceptor() // add to your server opti Add the following dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-datadog-metrics" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-datadog-metrics" % "1.9.3" ``` Datadog metrics are sent as Datadog custom metrics through @@ -222,7 +222,7 @@ val datadogMetrics = DatadogMetrics.default[Future](statsdClient) Add the following dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-zio-metrics" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-zio-metrics" % "1.9.3" ``` Metrics have been integrated into ZIO core in ZIO2. diff --git a/generated-doc/out/server/pekkohttp.md b/generated-doc/out/server/pekkohttp.md index 3d06ac9bb2..57279e29ec 100644 --- a/generated-doc/out/server/pekkohttp.md +++ b/generated-doc/out/server/pekkohttp.md @@ -4,14 +4,14 @@ To expose an endpoint as a [pekko-http](https://pekko.apache.org/docs/pekko-http dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-pekko-http-server" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-pekko-http-server" % "1.9.3" ``` This will transitively pull some Pekko modules. If you want to force your own Pekko version, use sbt exclusion. Mind the Scala version in artifact name: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-pekko-http-server" % "1.9.2" exclude("org.apache.pekko", "pekko-stream_2.12") +"com.softwaremill.sttp.tapir" %% "tapir-pekko-http-server" % "1.9.3" exclude("org.apache.pekko", "pekko-stream_2.12") ``` Now import the object: diff --git a/generated-doc/out/server/play.md b/generated-doc/out/server/play.md index 0c98c5f096..c7a01b0068 100644 --- a/generated-doc/out/server/play.md +++ b/generated-doc/out/server/play.md @@ -1,12 +1,35 @@ # Running as a Play server -To expose endpoint as a [play-server](https://www.playframework.com/) first add the following dependencies: +Tapir supports both Play 2.9, which still ships with Akka, and Play 3.0, which replaces Akka with Pekko. +See the [Play framework documentation](https://www.playframework.com/documentation/2.9.x/General#How-Play-Deals-with-Akkas-License-Change) for differences between these versions. + +To expose an endpoint as a [play-server](https://www.playframework.com/), using **Play 2.9 with Akka**, add the following dependencies: + +```scala +"com.softwaremill.sttp.tapir" %% "tapir-play29-server" % "1.9.3" +``` + +and (if you don't already depend on Play) + +```scala +"org.playframework" %% "play-akka-http-server" % "2.9.0" +``` + +or + +```scala +"org.playframework" %% "play-netty-server" % "2.9.0" +``` + +depending on whether you want to use netty or Akka based http-server under the hood. Please note that Play 2.9 server is available only for Scala 2.13. + +To expose an endpoint as a [play-server](https://www.playframework.com/), using **Play 3.0 with Pekko**, add the following dependencies: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-play-server" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-play-server" % "1.9.3" ``` -and (if you don't already depend on Play) +and (if you don't already depend on Play) ```scala "org.playframework" %% "play-pekko-http-server" % "3.0.0" @@ -20,6 +43,9 @@ or depending on whether you want to use netty or Pekko based http-server under the hood. +The following code samples use **Play 3.0 with Pekko**. If you are using Play 2.9 with Akka, +simply replace the import of `org.apache.pekko.stream.Materializer` with `import akka.stream.Materializer`. + Then import the object: ```scala @@ -40,22 +66,22 @@ import scala.concurrent.Future implicit val materializer: Materializer = ??? -def countCharacters(s: String): Future[Either[Unit, Int]] = +def countCharacters(s: String): Future[Either[Unit, Int]] = Future(Right[Unit, Int](s.length)) -val countCharactersEndpoint: PublicEndpoint[String, Unit, Int, Any] = +val countCharactersEndpoint: PublicEndpoint[String, Unit, Int, Any] = endpoint.in(stringBody).out(plainBody[Int]) -val countCharactersRoutes: Routes = +val countCharactersRoutes: Routes = PlayServerInterpreter().toRoutes(countCharactersEndpoint.serverLogic(countCharacters _)) ``` ```eval_rst .. note:: - A single Play application can contain both tapir-managed and Play-managed routes. However, because of the - routing implementation in Play, the shape of the paths that tapir and other Play handlers serve should not - overlap. The shape of the path includes exact path segments, single- and multi-wildcards. Otherwise, request handling - will throw an exception. We don't expect users to encounter this as a problem, however the implementation here + A single Play application can contain both tapir-managed and Play-managed routes. However, because of the + routing implementation in Play, the shape of the paths that tapir and other Play handlers serve should not + overlap. The shape of the path includes exact path segments, single- and multi-wildcards. Otherwise, request handling + will throw an exception. We don't expect users to encounter this as a problem, however the implementation here diverges a bit comparing to other interpreters. ``` diff --git a/generated-doc/out/server/vertx.md b/generated-doc/out/server/vertx.md index 05976ad9ad..1a4098eeae 100644 --- a/generated-doc/out/server/vertx.md +++ b/generated-doc/out/server/vertx.md @@ -8,7 +8,7 @@ Vert.x interpreter can be used with different effect systems (cats-effect, ZIO) Add the following dependency ```scala -"com.softwaremill.sttp.tapir" %% "tapir-vertx-server" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-vertx-server" % "1.9.3" ``` to use this interpreter with `Future`. @@ -63,7 +63,7 @@ It's also possible to define an endpoint together with the server logic in a sin Add the following dependency ```scala -"com.softwaremill.sttp.tapir" %% "tapir-vertx-server-cats" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-vertx-server-cats" % "1.9.3" ``` to use this interpreter with Cats Effect typeclasses. @@ -146,9 +146,9 @@ Add the following dependency ```scala // for zio2: -"com.softwaremill.sttp.tapir" %% "tapir-vertx-server-zio" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-vertx-server-zio" % "1.9.3" // for zio1: -"com.softwaremill.sttp.tapir" %% "tapir-vertx-server-zio1" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-vertx-server-zio1" % "1.9.3" ``` to use this interpreter with ZIO. diff --git a/generated-doc/out/server/zio-http4s.md b/generated-doc/out/server/zio-http4s.md index 11db453cee..6a74aba32e 100644 --- a/generated-doc/out/server/zio-http4s.md +++ b/generated-doc/out/server/zio-http4s.md @@ -9,16 +9,16 @@ The `*-zio` modules depend on ZIO 2.x. For ZIO 1.x support, use modules with the You'll need the following dependency for the `ZServerEndpoint` type alias and helper classes: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-zio" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-zio" % "1.9.3" ``` or just add the zio-http4s integration which already depends on `tapir-zio`: ```scala // for zio 2: -"com.softwaremill.sttp.tapir" %% "tapir-http4s-server-zio" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-http4s-server-zio" % "1.9.3" // for zio 1: -"com.softwaremill.sttp.tapir" %% "tapir-http4s-server-zio1" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-http4s-server-zio1" % "1.9.3" ``` Next, instead of the usual `import sttp.tapir._`, you should import (or extend the `ZTapir` trait, see [MyTapir](../mytapir.md)): diff --git a/generated-doc/out/server/ziohttp.md b/generated-doc/out/server/ziohttp.md index 81474139c0..9f3ab6588d 100644 --- a/generated-doc/out/server/ziohttp.md +++ b/generated-doc/out/server/ziohttp.md @@ -9,13 +9,13 @@ The `*-zio` modules depend on ZIO 2.x. For ZIO 1.x support, use modules with the You'll need the following dependency for the `ZServerEndpoint` type alias and helper classes: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-zio" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-zio" % "1.9.3" ``` or just add the zio-http integration which already depends on `tapir-zio`: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-zio-http-server" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-zio-http-server" % "1.9.3" ``` Next, instead of the usual `import sttp.tapir._`, you should import (or extend the `ZTapir` trait, see [MyTapir](../mytapir.md)): diff --git a/generated-doc/out/testing.md b/generated-doc/out/testing.md index f55f641bd7..37057a280b 100644 --- a/generated-doc/out/testing.md +++ b/generated-doc/out/testing.md @@ -23,7 +23,7 @@ Tapir builds upon the `SttpBackendStub` to enable stubbing using `Endpoint`s or dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-sttp-stub-server" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-sttp-stub-server" % "1.9.3" ``` Let's assume you are using the [akka http](server/akkahttp.md) interpreter. Given the following server endpoint: @@ -142,7 +142,7 @@ requests matching an endpoint, you can use the tapir `SttpBackendStub` extension Similarly as when testing server interpreters, add the dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-sttp-stub-server" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-sttp-stub-server" % "1.9.3" ``` And the following imports: @@ -197,7 +197,7 @@ with [mock-server](https://www.mock-server.com/) Add the following dependency: ```scala -"com.softwaremill.sttp.tapir" %% "sttp-mock-server" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "sttp-mock-server" % "1.9.3" ``` Imports: @@ -268,7 +268,7 @@ result == out To use, add the following dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-testing" % "1.9.2" +"com.softwaremill.sttp.tapir" %% "tapir-testing" % "1.9.3" ``` ### Shadowed endpoints @@ -294,7 +294,7 @@ Results in: ```scala res.toString -// res2: String = "Set(GET /x, is shadowed by: GET /x/*, GET /x/y/x, is shadowed by: GET /x/*)" +// res2: String = "Set(GET /x/y/x, is shadowed by: GET /x/*, GET /x, is shadowed by: GET /x/*)" ``` Example 2: