Skip to content

Commit

Permalink
Release 1.0.0
Browse files Browse the repository at this point in the history
  • Loading branch information
adamw committed Jun 14, 2022
1 parent 0c1209f commit d541eba
Show file tree
Hide file tree
Showing 28 changed files with 112 additions and 70 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ tapir documentation is available at [tapir.softwaremill.com](http://tapir.softwa
Add the following dependency:

```sbt
"com.softwaremill.sttp.tapir" %% "tapir-core" % "1.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-core" % "1.0.0"
```

Then, import:
Expand Down
4 changes: 2 additions & 2 deletions doc/docs/openapi.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-swagger-ui-bundle" % "1.0.0"
```

Then, you can interpret a list of endpoints using `SwaggerInterpreter`. The result will be a list of file-serving
Expand Down Expand Up @@ -55,7 +55,7 @@ for details.
Similarly as above, you'll need the following dependency:

```scala
"com.softwaremill.sttp.tapir" %% "tapir-redoc-bundle" % "1.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-redoc-bundle" % "1.0.0"
```

And the server endpoints can be generated using the `sttp.tapir.redoc.bundle.RedocInterpreter` class.
Expand Down
2 changes: 1 addition & 1 deletion generated-doc/out/client/http4s.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
Add the dependency:

```scala
"com.softwaremill.sttp.tapir" %% "tapir-http4s-client" % "1.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-http4s-client" % "1.0.0"
```

To interpret an endpoint definition as an `org.http4s.Request[F]`, import:
Expand Down
2 changes: 1 addition & 1 deletion generated-doc/out/client/play.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
Add the dependency:

```scala
"com.softwaremill.sttp.tapir" %% "tapir-play-client" % "1.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-play-client" % "1.0.0"
```

To make requests using an endpoint definition using the [play client](https://github.com/playframework/play-ws), import:
Expand Down
4 changes: 2 additions & 2 deletions generated-doc/out/client/sttp.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
Add the dependency:

```scala
"com.softwaremill.sttp.tapir" %% "tapir-sttp-client" % "1.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-sttp-client" % "1.0.0"
```

To make requests using an endpoint definition using the [sttp client](https://github.com/softwaremill/sttp), import:
Expand Down Expand Up @@ -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.0.0-RC3"
"com.softwaremill.sttp.tapir" %%% "tapir-sttp-client" % "1.0.0"
"io.github.cquiroz" %%% "scala-java-time" % "2.2.0" // implementations of java.time classes for Scala.JS
```

Expand Down
2 changes: 2 additions & 0 deletions generated-doc/out/contributing.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,5 @@ code is unclear and can be improved for the benefit of all.
Tuple-concatenating code is copied from [akka-http](https://github.com/akka/akka-http/blob/master/akka-http/src/main/scala/akka/http/scaladsl/server/util/TupleOps.scala)

Parts of generic derivation configuration is copied from [circe](https://github.com/circe/circe/blob/master/modules/generic-extras/src/main/scala/io/circe/generic/extras/Configuration.scala)

Tapir logo & stickers have been drawn by [impurepics](https://twitter.com/impurepics).
2 changes: 1 addition & 1 deletion generated-doc/out/docs/asyncapi.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
To use, add the following dependencies:

```scala
"com.softwaremill.sttp.tapir" %% "tapir-asyncapi-docs" % "1.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-asyncapi-docs" % "1.0.0"
"com.softwaremill.sttp.apispec" %% "asyncapi-circe-yaml" % "..." // see https://github.com/softwaremill/sttp-apispec
```

Expand Down
10 changes: 5 additions & 5 deletions generated-doc/out/docs/openapi.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-swagger-ui-bundle" % "1.0.0"
```

Then, you can interpret a list of endpoints using `SwaggerInterpreter`. The result will be a list of file-serving
Expand Down Expand Up @@ -55,7 +55,7 @@ for details.
Similarly as above, you'll need the following dependency:

```scala
"com.softwaremill.sttp.tapir" %% "tapir-redoc-bundle" % "1.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-redoc-bundle" % "1.0.0"
```

And the server endpoints can be generated using the `sttp.tapir.redoc.bundle.RedocInterpreter` class.
Expand All @@ -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.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-openapi-docs" % "1.0.0"
"com.softwaremill.sttp.apispec" %% "openapi-circe-yaml" % "..." // see https://github.com/softwaremill/sttp-apispec
```

Expand Down Expand Up @@ -136,12 +136,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.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-swagger-ui" % "1.0.0"
```

or `tapir-redoc`:
```scala
"com.softwaremill.sttp.tapir" %% "tapir-redoc" % "1.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-redoc" % "1.0.0"
```

Then, you'll need to pass the server endpoints to your server interpreter. For example, using akka-http:
Expand Down
10 changes: 5 additions & 5 deletions generated-doc/out/endpoint/integrations.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-cats" % "1.0.0"
```

- `import sttp.tapir.integ.cats.codec._` - brings schema, validator and codec instances
Expand All @@ -26,7 +26,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.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-refined" % "1.0.0"
```

You'll need to extend the `sttp.tapir.codec.refined.TapirCodecRefined`
Expand All @@ -47,7 +47,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.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-enumeratum" % "1.0.0"
```

Then, `import sttp.tapir.codec.enumeratum`, or extends the `sttp.tapir.codec.enumeratum.TapirCodecEnumeratum` trait.
Expand Down Expand Up @@ -87,7 +87,7 @@ If you use [scala-newtype](https://github.com/estatico/scala-newtype), the `tapi
schemas for a 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.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-newtype" % "1.0.0"
```

Then, `import sttp.tapir.codec.newtype._`, or extend the `sttp.tapir.codec.enumeratum.TapirCodecNewType` trait to bring the implicit values into scope.
Expand All @@ -99,7 +99,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.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-derevo" % "1.0.0"
```

Then you can derive schema for your ADT along with other typeclasses besides ADT declaration itself:
Expand Down
16 changes: 8 additions & 8 deletions generated-doc/out/endpoint/json.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ the json codec that is in scope.
To use [Circe](https://github.com/circe/circe), add the following dependency to your project:

```scala
"com.softwaremill.sttp.tapir" %% "tapir-json-circe" % "1.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-json-circe" % "1.0.0"
```

Next, import the package (or extend the `TapirJsonCirce` trait, see [MyTapir](../mytapir.md)):
Expand Down Expand Up @@ -103,7 +103,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.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-json-upickle" % "1.0.0"
```

Next, import the package (or extend the `TapirJsonuPickle` trait, see [MyTapir](../mytapir.md) and add `TapirJsonuPickle` not `TapirCirceJson`):
Expand Down Expand Up @@ -138,7 +138,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.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-json-play" % "1.0.0"
```

Next, import the package (or extend the `TapirJsonPlay` trait, see [MyTapir](../mytapir.md) and add `TapirJsonPlay` not `TapirCirceJson`):
Expand All @@ -154,7 +154,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.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-json-spray" % "1.0.0"
```

Next, import the package (or extend the `TapirJsonSpray` trait, see [MyTapir](../mytapir.md) and add `TapirJsonSpray` not `TapirCirceJson`):
Expand All @@ -170,7 +170,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.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-json-tethys" % "1.0.0"
```

Next, import the package (or extend the `TapirJsonTethys` trait, see [MyTapir](../mytapir.md) and add `TapirJsonTethys` not `TapirCirceJson`):
Expand All @@ -186,7 +186,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.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-jsoniter-scala" % "1.0.0"
```

Next, import the package (or extend the `TapirJsonJsoniter` trait, see [MyTapir](../mytapir.md) and add `TapirJsonJsoniter` not `TapirCirceJson`):
Expand All @@ -202,7 +202,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.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-json-json4s" % "1.0.0"
```

And one of the implementations:
Expand Down Expand Up @@ -233,7 +233,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.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-json-zio" % "1.0.0"
```
Next, import the package (or extend the `TapirJsonZio` trait, see [MyTapir](../mytapir.md) and add `TapirJsonZio` instead of `TapirCirceJson`):

Expand Down
46 changes: 43 additions & 3 deletions generated-doc/out/endpoint/schemas.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,12 +124,43 @@ implicit val customConfiguration: Configuration =
Configuration.default.withDiscriminator("who_am_i")
```

The discriminator will be added as a field to all coproduct child 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)`.

Alternatively, derived schemas can be customised (see below), and a discriminator can be added by calling
the `SchemaType.SCoproduct.addDiscriminatorField(name, schema, maping)` method.
the `SchemaType.SCoproduct.addDiscriminatorField(name, schema, maping)` method. This method is useful when using
semi-automatic or automatic derivation; in both cases a custom implicit has to be defined, basing on the derived
one:

```scala
import sttp.tapir._
import sttp.tapir.generic.Derived
import sttp.tapir.generic.auto._

sealed trait MyCoproduct
case class Child1(s: String) extends MyCoproduct
// ... implementations of MyCoproduct ...

implicit val myCoproductSchema: Schema[MyCoproduct] = {
val derived = implicitly[Derived[Schema[MyCoproduct]]].value
derived.schemaType match {
case s: SchemaType.SCoproduct[_] => derived.copy(schemaType = s.addDiscriminatorField(
FieldName("myField"),
Schema.string,
Map(
"value1" -> SchemaType.SRef(Schema.SName("com.myproject.Child1")),
// ... other mappings ...
)
))
case _ => ???
}
}
```

Finally, if the discriminator is a field that's defined on the base trait (and hence in each implementation), the
schemas can be specified using `Schema.oneOfUsingField`, for example (this will also generate the appropriate
mappings):
schemas can be specified as a custom implicit value using the `Schema.oneOfUsingField` macro,
for example (this will also generate the appropriate mappings):

```scala
sealed trait Entity {
Expand All @@ -150,6 +181,15 @@ implicit val sEntity: Schema[Entity] =
Schema.oneOfUsingField[Entity, String](_.kind, _.toString)("person" -> sPerson, "org" -> sOrganization)
```

```eval_rst
.. note::
Note that whichever approach you choose to define the coproduct schema, it has to match the way the value is
encoded and decoded by the codec. E.g. when the schema is for a json body, the discriminator must be separately
configured in the json library, matching the configuration of the schema.
```


## Customising derived schemas

### Using annotations
Expand Down
4 changes: 2 additions & 2 deletions generated-doc/out/endpoint/security.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ Currently, the following authentication inputs are available (assuming `import s
cookie or a query parameter
* `auth.basic[T]`: reads data from the `Authorization` header, removing the `Basic ` prefix. To parse the data as a
base64-encoded username/password combination, use: `basic[UsernamePassword]`.
* `auth.bearer[T]`: reads data from the `Authorization` header, removing the `Bearer ` prefix. To get the string
as a token, use: `bearer[String]`.
* `auth.bearer[T]`: reads data from the `Authorization` header, removing the `Bearer ` prefix. To get the token
as a string, use: `bearer[String]`.
* `auth.oauth2.authorizationCode(authorizationUrl, tokenUrl, scopes, refreshUrl): EndpointInput[String]`: creates an
OAuth2 authorization using authorization code - sign in using an auth service (for documentation, requires defining also
the `oauth2-redirect.html`, see [Generating OpenAPI documentation](../openapi.md))
Expand Down
2 changes: 1 addition & 1 deletion generated-doc/out/generator/sbt-openapi-codegen.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
Add the sbt plugin to the `project/plugins.sbt`:

```scala
addSbtPlugin("com.softwaremill.sttp.tapir" % "sbt-openapi-codegen" % "1.0.0-RC3")
addSbtPlugin("com.softwaremill.sttp.tapir" % "sbt-openapi-codegen" % "1.0.0")
```

Enable the plugin for your project in the `build.sbt`:
Expand Down
4 changes: 2 additions & 2 deletions generated-doc/out/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ for a more detailed description of how tapir works!

Tapir is available:

* all modules - Scala 2.12 and 2.13 on the JVM
* selected modules - Scala 3 on the JVM
* all modules - Scala 2.12 and 2.13 on the JVM (Java 11+)
* selected modules - Scala 3 on the JVM (Java 11+)
* selected modules - Scala 2.12, 2.13 and 3 using Scala.JS
* selected modules - Scala 2.12, 2.13 and 3 using Scala Native

Expand Down
2 changes: 1 addition & 1 deletion generated-doc/out/quickstart.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
To use tapir, add the following dependency to your project:

```scala
"com.softwaremill.sttp.tapir" %% "tapir-core" % "1.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-core" % "1.0.0"
```

This will import only the core classes needed to create endpoint descriptions. To generate a server or a client, you
Expand Down
4 changes: 2 additions & 2 deletions generated-doc/out/server/akkahttp.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-akka-http-server" % "1.0.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.0.0-RC3" exclude("com.typesafe.akka", "akka-stream_2.12")
"com.softwaremill.sttp.tapir" %% "tapir-akka-http-server" % "1.0.0" exclude("com.typesafe.akka", "akka-stream_2.12")
```

Now import the object:
Expand Down
8 changes: 4 additions & 4 deletions generated-doc/out/server/armeria.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-armeria-server" % "1.0.0"
```

and import the object:
Expand Down Expand Up @@ -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.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-armeria-server-cats" % "1.0.0"
```
to use this interpreter with Cats Effect typeclasses.

Expand Down Expand Up @@ -155,9 +155,9 @@ Add the following dependency

```scala
// for zio 2:
"com.softwaremill.sttp.tapir" %% "tapir-armeria-server-zio" % "1.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-armeria-server-zio" % "1.0.0"
// for zio 1:
"com.softwaremill.sttp.tapir" %% "tapir-armeria-server-zio1" % "1.0.0-RC3"
"com.softwaremill.sttp.tapir" %% "tapir-armeria-server-zio1" % "1.0.0"
```

to use this interpreter with ZIO.
Expand Down
Loading

0 comments on commit d541eba

Please sign in to comment.