diff --git a/README.md b/README.md index 29ff13a0c3..d6ed18f851 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-core" % "1.8.0" ``` Then, import: diff --git a/generated-doc/out/.DS_Store b/generated-doc/out/.DS_Store new file mode 100644 index 0000000000..d3ef822070 Binary files /dev/null and b/generated-doc/out/.DS_Store differ diff --git a/generated-doc/out/client/http4s.md b/generated-doc/out/client/http4s.md index eb3c1dcc05..abab67a51b 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-http4s-client" % "1.8.0" ``` 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 022b701585..7cf8fa73d2 100644 --- a/generated-doc/out/client/play.md +++ b/generated-doc/out/client/play.md @@ -3,7 +3,7 @@ Add the dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-play-client" % "1.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-play-client" % "1.8.0" ``` To make requests using an endpoint definition using the [play client](https://github.com/playframework/play-ws), import: diff --git a/generated-doc/out/client/sttp.md b/generated-doc/out/client/sttp.md index 86e359b2c3..957fbe4057 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-sttp-client" % "1.8.0" ``` 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.7.6" +"com.softwaremill.sttp.tapir" %%% "tapir-sttp-client" % "1.8.0" "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 f58cf37c67..aa1a56ed07 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-asyncapi-docs" % "1.8.0" "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 0415faa966..263183f569 100644 --- a/generated-doc/out/docs/json-schema.md +++ b/generated-doc/out/docs/json-schema.md @@ -3,13 +3,13 @@ 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-apispec-docs" % "1.8.0" ``` Schema generation can now be performed like in the following example: ```scala -import sttp.apispec.{ReferenceOr, Schema => ASchema} +import sttp.apispec.{Schema => ASchema} import sttp.tapir._ import sttp.tapir.docs.apispec.schema._ import sttp.tapir.generic.auto._ @@ -21,7 +21,7 @@ import sttp.tapir.generic.auto._ case class Child(childName: String) // to illustrate unique name generation // to illustrate unique name generation val tSchema = implicitly[Schema[Parent]] - val jsonSchema: ReferenceOr[ASchema] = TapirSchemaToJsonSchema( + val jsonSchema: ASchema = TapirSchemaToJsonSchema( tSchema, markOptionsAsNullable = true, metaSchema = MetaSchemaDraft04 // default @@ -44,7 +44,7 @@ you will get a codec for `sttp.apispec.Schema`: import io.circe.Printer import io.circe.syntax._ import sttp.apispec.circe._ -import sttp.apispec.{ReferenceOr, Schema => ASchema, SchemaType => ASchemaType} +import sttp.apispec.{Schema => ASchema, SchemaType => ASchemaType} import sttp.tapir._ import sttp.tapir.docs.apispec.schema._ import sttp.tapir.generic.auto._ @@ -57,12 +57,12 @@ import sttp.tapir.Schema.annotations.title case class Child(childName: String) val tSchema = implicitly[Schema[Parent]] - val jsonSchema: ReferenceOr[ASchema] = TapirSchemaToJsonSchema( + val jsonSchema: ASchema = TapirSchemaToJsonSchema( tSchema, markOptionsAsNullable = true) // JSON serialization - val schemaAsJson = jsonSchema.getOrElse(ASchema(ASchemaType.Null)).asJson + val schemaAsJson = jsonSchema.asJson val schemaStr: String = Printer.spaces2.print(schemaAsJson.deepDropNullValues) ``` diff --git a/generated-doc/out/docs/openapi.md b/generated-doc/out/docs/openapi.md index 8583ca5a8f..5027ebc82e 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-swagger-ui-bundle" % "1.8.0" ``` 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-redoc-bundle" % "1.8.0" ``` 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-openapi-docs" % "1.8.0" "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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-openapi-docs" % "1.8.0" "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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-swagger-ui" % "1.8.0" ``` or `tapir-redoc`: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-redoc" % "1.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-redoc" % "1.8.0" ``` 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/integrations.md b/generated-doc/out/endpoint/integrations.md index 255d124943..59ee29f2d5 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-cats" % "1.8.0" ``` - `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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-cats-effect" % "1.8.0" ``` ## 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-refined" % "1.8.0" ``` 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-iron" % "1.8.0" ``` 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-enumeratum" % "1.8.0" ``` 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-newtype" % "1.8.0" ``` 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-monix-newtype" % "1.8.0" ``` 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-zio-prelude" % "1.8.0" ``` 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-derevo" % "1.8.0" ``` 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 5a23bfb40f..72714e6e7f 100644 --- a/generated-doc/out/endpoint/json.md +++ b/generated-doc/out/endpoint/json.md @@ -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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-json-circe" % "1.8.0" ``` Next, import the package (or extend the `TapirJsonCirce` trait, see [MyTapir](../mytapir.md)): @@ -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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-json-upickle" % "1.8.0" ``` Next, import the package (or extend the `TapirJsonuPickle` trait, see [MyTapir](../mytapir.md) and add `TapirJsonuPickle` not `TapirCirceJson`): @@ -160,7 +160,7 @@ For more examples, including making a custom encoder/decoder, see [TapirJsonuPic To use [Play JSON](https://github.com/playframework/play-json) add the following dependency to your project: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-json-play" % "1.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-json-play" % "1.8.0" ``` Next, import the package (or extend the `TapirJsonPlay` trait, see [MyTapir](../mytapir.md) and add `TapirJsonPlay` not `TapirCirceJson`): @@ -176,7 +176,7 @@ Play JSON requires `Reads` and `Writes` implicit values in scope for each type y 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-json-spray" % "1.8.0" ``` Next, import the package (or extend the `TapirJsonSpray` trait, see [MyTapir](../mytapir.md) and add `TapirJsonSpray` not `TapirCirceJson`): @@ -192,7 +192,7 @@ Spray JSON requires a `JsonFormat` implicit value in scope for each type you wan 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-json-tethys" % "1.8.0" ``` Next, import the package (or extend the `TapirJsonTethys` trait, see [MyTapir](../mytapir.md) and add `TapirJsonTethys` not `TapirCirceJson`): @@ -208,7 +208,7 @@ Tethys JSON requires `JsonReader` and `JsonWriter` implicit values in scope for 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-jsoniter-scala" % "1.8.0" ``` Next, import the package (or extend the `TapirJsonJsoniter` trait, see [MyTapir](../mytapir.md) and add `TapirJsonJsoniter` not `TapirCirceJson`): @@ -224,7 +224,7 @@ Jsoniter Scala requires `JsonValueCodec` implicit value in scope for each type y To use [json4s](https://github.com/json4s/json4s) add the following dependencies to your project: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-json-json4s" % "1.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-json-json4s" % "1.8.0" ``` And one of the implementations: @@ -255,7 +255,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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-json-zio" % "1.8.0" ``` Next, import the package (or extend the `TapirJsonZio` trait, see [MyTapir](../mytapir.md) and add `TapirJsonZio` instead of `TapirCirceJson`): diff --git a/generated-doc/out/endpoint/pickler.md b/generated-doc/out/endpoint/pickler.md index 08fe4bc600..80a3b92aed 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-json-pickler" % "1.8.0" ``` Please note that it is available only for Scala 3 and Scala.JS 3. @@ -79,25 +79,42 @@ However, this can negatively impact compilation performance, as the same pickler ## Configuring pickler derivation -It is possible to configure schema and codec derivation by providing an implicit `sttp.tapir.generic.Configuration`, just as for standalone [schema derivation](schemas.md). This configuration allows switching field naming policy to `snake_case`, `kebab_case`, or an arbitrary transformation function, as well as setting the field name for the coproduct (sealed hierarchy) type discriminator, which is discussed in details in further sections. +It is possible to configure schema and codec derivation by providing an implicit `sttp.tapir.pickler.PicklerConfiguration`. This configuration allows switching field naming policy to `snake_case`, `kebab_case`, or an arbitrary transformation function, as well as setting the field name/value for the coproduct (sealed hierarchy) type discriminator, which is discussed in details in further sections. ```scala -import sttp.tapir.generic.Configuration +import sttp.tapir.pickler.PicklerConfiguration -given customConfiguration: Configuration = Configuration.default.withSnakeCaseMemberNames +given customConfiguration: PicklerConfiguration = + PicklerConfiguration + .default + .withSnakeCaseMemberNames ``` ## Enums / sealed traits / coproducts -Pickler derivation for coproduct types (enums / sealed hierarchies) works automatically, by adding an `$type` discriminator field with the full class name. This is the default behavior of uPickle, but it can be overridden either by changing the discriminator field name, or by using custom logic to get field value from base trait. +Pickler derivation for coproduct types (enums with parameters / sealed hierarchies) works automatically, by adding a `$type` discriminator field with the short class name. + +```scala +import sttp.tapir.pickler.PicklerConfiguration + +// encodes a case object as { "$type": "MyType" } +given PicklerConfiguration = PicklerConfiguration.default +``` + +This behavior can be overridden either by changing the discriminator field name, or by using custom logic to get field value from base trait. +Selaed hierarchies with all cases being objects are treated differently, considered as [enumerations](#enumerations). A discriminator field can be specified for coproducts by providing it in the configuration; this will be only used during automatic and semi-automatic derivation: ```scala -import sttp.tapir.generic.Configuration - -given customConfiguration: Configuration = - Configuration.default.withDiscriminator("who_am_i") +import sttp.tapir.pickler.PicklerConfiguration + +// encodes a case object as { "who_am_i": "full.pkg.path.MyType" } +given customConfiguration: PicklerConfiguration = + PicklerConfiguration + .default + .withDiscriminator("who_am_i") + .withFullDiscriminatorValues ``` The discriminator will be added as a field to all coproduct child codecs and schemas, if it’s not yet present. The schema of the added field will always be a Schema.string. Finally, the mapping between the discriminator field values and the child schemas will be generated using `Configuration.toDiscriminatorValue(childSchemaName)`. @@ -136,7 +153,11 @@ Schemas generated by picklers can be customized using annotations, just like wit ## Enumerations -Scala 3 `enums`, where all cases are parameterless, are treated as an enumeration (not as a coproduct / sealed hierarchy). They are also automatically handled by `Pickler.derived[T]`: enum values are encoded as simple strings representing the type name. For example: +Tapir schemas and JSON codecs treats following cases as "enumerations": +1. Scala 3 `enums`, where all cases are parameterless +2. Sealed hierarchies (coproducts), where all cases are case objects + +Such types are handled by `Pickler.derived[T]`: possible values are encoded as simple strings representing the case objects. For example: ```scala import sttp.tapir.json.pickler.* @@ -144,6 +165,11 @@ import sttp.tapir.json.pickler.* enum ColorEnum: case Green, Pink +// or: +// sealed trait ColorEnum +// case object Green extends ColorEnum +// case object Pink extends ColorEnum + case class ColorResponse(color: ColorEnum, description: String) given Pickler[ColorEnum] = Pickler.derived @@ -157,7 +183,27 @@ pResponse.toCodec.encode( pResponse.schema ``` -If you need to customize enum value encoding, use `Pickler.derivedEnumeration[T]`: +If sealed hierarchy or enum contain case classes with parameters, they are no longer an "enumeration", and will be treated as standard sealed hierarchies (coproducts): + +```scala +import sttp.tapir.json.pickler.* + +sealed trait ColorEnum +case object Green extends ColorEnum +case class Pink(intensity: Int) extends ColorEnum + +case class ColorResponse(color1: ColorEnum, color2: ColorEnum) + +given Pickler[ColorEnum] = Pickler.derived +val pResponse = Pickler.derived[ColorResponse] + +// {"color1":{"$type":"Pink","intensity":85},"color2":{"$type":"Green"}} +pResponse.toCodec.encode( + ColorResponse(Pink(85), Green) +) +``` + +If you need to customize enumeration value encoding, use `Pickler.derivedEnumeration[T]`: ```scala import sttp.tapir.json.pickler.* @@ -191,4 +237,5 @@ you can proceed with `Pickler.derived[T]`. * Tapir pickler serialises None values as `null`, instead of wrapping the value in an array * Value classes (case classes extending AnyVal) will be serialised as simple values +* Discriminator field value is a short class name, instead of full package with class name diff --git a/generated-doc/out/endpoint/static.md b/generated-doc/out/endpoint/static.md index 2a8e3a80f3..16dde2be27 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-files" % "1.8.0" ``` ## Files diff --git a/generated-doc/out/generator/sbt-openapi-codegen.md b/generated-doc/out/generator/sbt-openapi-codegen.md index 8224461d8f..9eb3de712f 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.7.6") +addSbtPlugin("com.softwaremill.sttp.tapir" % "sbt-openapi-codegen" % "1.8.0") ``` Enable the plugin for your project in the `build.sbt`: diff --git a/generated-doc/out/quickstart.md b/generated-doc/out/quickstart.md index 830fa9c7ea..4006782b06 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-core" % "1.8.0" ``` 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 9017bc3d6b..b71af2de92 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-akka-http-server" % "1.8.0" ``` 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.7.6" exclude("com.typesafe.akka", "akka-stream_2.12") +"com.softwaremill.sttp.tapir" %% "tapir-akka-http-server" % "1.8.0" 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 4b713cddca..dabeae9d8a 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-armeria-server" % "1.8.0" ``` 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-armeria-server-cats" % "1.8.0" ``` 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-armeria-server-zio" % "1.8.0" // for zio 1: -"com.softwaremill.sttp.tapir" %% "tapir-armeria-server-zio1" % "1.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-armeria-server-zio1" % "1.8.0" ``` to use this interpreter with ZIO. diff --git a/generated-doc/out/server/aws.md b/generated-doc/out/server/aws.md index a019a5b65b..859c364ed2 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-aws-lambda" % "1.8.0" ``` ## 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.7.6" -"com.softwaremill.sttp.tapir" %% "tapir-aws-terraform" % "1.7.6" -"com.softwaremill.sttp.tapir" %% "tapir-aws-cdk" % "1.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-aws-sam" % "1.8.0" +"com.softwaremill.sttp.tapir" %% "tapir-aws-terraform" % "1.8.0" +"com.softwaremill.sttp.tapir" %% "tapir-aws-cdk" % "1.8.0" ``` ### Examples diff --git a/generated-doc/out/server/finatra.md b/generated-doc/out/server/finatra.md index 76de76131d..3cb50c4ab0 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-finatra-server" % "1.8.0" ``` 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-finatra-server-cats" % "1.8.0" ``` and import the object: diff --git a/generated-doc/out/server/http4s.md b/generated-doc/out/server/http4s.md index 406c56483f..7dcddeb599 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-http4s-server" % "1.8.0" ``` and import the object: diff --git a/generated-doc/out/server/jdkhttp.md b/generated-doc/out/server/jdkhttp.md index 0756c2f52e..687f0ccddb 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-jdkhttp-server" % "1.8.0" ``` Then, import the package: diff --git a/generated-doc/out/server/netty.md b/generated-doc/out/server/netty.md index ccd49f505d..bf0500b461 100644 --- a/generated-doc/out/server/netty.md +++ b/generated-doc/out/server/netty.md @@ -4,13 +4,13 @@ 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-netty-server" % "1.8.0" // if you are using cats-effect: -"com.softwaremill.sttp.tapir" %% "tapir-netty-server-cats" % "1.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-netty-server-cats" % "1.8.0" // if you are using zio: -"com.softwaremill.sttp.tapir" %% "tapir-netty-server-zio" % "1.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-netty-server-zio" % "1.8.0" ``` Then, use: diff --git a/generated-doc/out/server/observability.md b/generated-doc/out/server/observability.md index 5d141d5303..163f66acfa 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-prometheus-metrics" % "1.8.0" ``` `PrometheusMetrics` encapsulates `CollectorReqistry` and `Metric` instances. It provides several ready to use metrics as @@ -128,7 +128,7 @@ val prometheusMetrics = PrometheusMetrics[Future]("tapir", CollectorRegistry.def Add the following dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-opentelemetry-metrics" % "1.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-opentelemetry-metrics" % "1.8.0" ``` 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-datadog-metrics" % "1.8.0" ``` 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-zio-metrics" % "1.8.0" ``` 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 eee8c3ce1a..bb7f3f6857 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-pekko-http-server" % "1.8.0" ``` 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.7.6" exclude("org.apache.pekko", "pekko-stream_2.12") +"com.softwaremill.sttp.tapir" %% "tapir-pekko-http-server" % "1.8.0" 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 139a65529e..6dc98faa6b 100644 --- a/generated-doc/out/server/play.md +++ b/generated-doc/out/server/play.md @@ -3,7 +3,7 @@ To expose endpoint as a [play-server](https://www.playframework.com/) first add the following dependencies: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-play-server" % "1.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-play-server" % "1.8.0" ``` and (if you don't already depend on Play) diff --git a/generated-doc/out/server/vertx.md b/generated-doc/out/server/vertx.md index ea4c8af4a5..665b7ec77f 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-vertx-server" % "1.8.0" ``` 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-vertx-server-cats" % "1.8.0" ``` 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-vertx-server-zio" % "1.8.0" // for zio1: -"com.softwaremill.sttp.tapir" %% "tapir-vertx-server-zio1" % "1.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-vertx-server-zio1" % "1.8.0" ``` 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 cbe9972787..9a4baca0e0 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-zio" % "1.8.0" ``` 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-http4s-server-zio" % "1.8.0" // for zio 1: -"com.softwaremill.sttp.tapir" %% "tapir-http4s-server-zio1" % "1.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-http4s-server-zio1" % "1.8.0" ``` 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 46752940e9..a0447cabf9 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-zio" % "1.8.0" ``` or just add the zio-http integration which already depends on `tapir-zio`: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-zio-http-server" % "1.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-zio-http-server" % "1.8.0" ``` 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 77fdc6087e..f58f2e827b 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-sttp-stub-server" % "1.8.0" ``` 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.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-sttp-stub-server" % "1.8.0" ``` 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.7.6" +"com.softwaremill.sttp.tapir" %% "sttp-mock-server" % "1.8.0" ``` Imports: @@ -268,7 +268,7 @@ result == out To use, add the following dependency: ```scala -"com.softwaremill.sttp.tapir" %% "tapir-testing" % "1.7.6" +"com.softwaremill.sttp.tapir" %% "tapir-testing" % "1.8.0" ``` ### Shadowed endpoints