• Stars
    star
    1,263
  • Rank 35,661 (Top 0.8 %)
  • Language
    Scala
  • License
    Apache License 2.0
  • Created over 5 years ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Declarative, type-safe web endpoints library

tapir

Welcome!

Ideas, suggestions, problems, questions CI Maven Central

Intro

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 client, which is a function from input parameters to output parameters. Currently supported:
  • documentation. Currently supported:

Depending on how you prefer to explore the library, take a look at one of the examples or head over to the docs for a more detailed description of how tapir works! Or, use adopt-tapir to generate a tapir-based project in a couple of clicks! You can also generate a stub of a tapir-based application directly from the command line with sbt new softwaremill/tapir.g8. Finally, ScalaDocs are available at javadoc.io.

Why tapir?

  • type-safety: compile-time guarantees, develop-time completions, read-time information
  • declarative: separate the shape of the endpoint (the "what"), from the server logic (the "how")
  • OpenAPI / Swagger integration: generate documentation from endpoint descriptions
  • observability: leverage the metadata to report rich metrics and tracing information
  • abstraction: re-use common endpoint definitions, as well as individual inputs/outputs
  • library, not a framework: integrates with your stack

Adopters

Is your company already using tapir? We're continually expanding the "adopters" section in the documentation; the more the merrier! It would be great to feature your company's logo, but in order to do that, we'll need written permission to avoid any legal misunderstandings.

Please email us at [email protected] from your company's email with a link to your logo (if we can use it, of course!) or with details who to kindly ask for permission to feature the logo in tapir's documentation. We'll handle the rest.

Adobe Swisscom Swissborg
Kaizo Process Street Tranzzo
Kelkoo group SoftwareMill Carvana
Moneyfarm Ocado Technology Wegtam
Broad Kensu Colisweb
iceo dpg hunters
moia hootsuite

Teaser

import sttp.tapir._
import sttp.tapir.generic.auto._
import sttp.tapir.json.circe._
import io.circe.generic.auto._

type Limit = Int
type AuthToken = String
case class BooksQuery(genre: String, year: Int)
case class Book(title: String)


// Define an endpoint

val booksListing: PublicEndpoint[(BooksQuery, Limit, AuthToken), String, List[Book], Any] = 
  endpoint
    .get
    .in(("books" / path[String]("genre") / path[Int]("year")).mapTo[BooksQuery])
    .in(query[Limit]("limit").description("Maximum number of books to retrieve"))
    .in(header[AuthToken]("X-Auth-Token"))
    .errorOut(stringBody)
    .out(jsonBody[List[Book]])


// Generate OpenAPI documentation

import sttp.apispec.openapi.circe.yaml._
import sttp.tapir.docs.openapi.OpenAPIDocsInterpreter

val docs = OpenAPIDocsInterpreter().toOpenAPI(booksListing, "My Bookshop", "1.0")
println(docs.toYaml)


// Convert to akka-http Route

import sttp.tapir.server.akkahttp.AkkaHttpServerInterpreter
import akka.http.scaladsl.server.Route
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

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))


// Convert to sttp Request

import sttp.tapir.client.sttp.SttpClientInterpreter
import sttp.client3._

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"))

Documentation

tapir documentation is available at tapir.softwaremill.com.

Quickstart with sbt

Add the following dependency:

"com.softwaremill.sttp.tapir" %% "tapir-core" % "1.10.4"

Then, import:

import sttp.tapir._

And finally, type endpoint. and see where auto-complete gets you!

Scala 2.12

Partial unification is now enabled by default from Scala 2.13. However, if you're using Scala 2.12 or older, then you'll need partial unification enabled in the compiler (alternatively, you'll need to manually provide type arguments in some cases):

scalacOptions += "-Ypartial-unification"

Sidenote for scala 2.12.4 and higher: if you encounter an issue with compiling your project because of a StackOverflowException related to this scala bug, please increase your stack memory. Example:

sbt -J-Xss4M clean compile

Other sttp projects

sttp is a family of Scala HTTP-related projects, and currently includes:

  • sttp client: the Scala HTTP client you always wanted!
  • sttp tapir: this project
  • sttp model: simple HTTP model classes (used by client & tapir)
  • sttp shared: shared web socket, FP abstractions, capabilities and streaming code.
  • sttp apispec: OpenAPI, AsyncAPI and JSON Schema models.

Contributing

All suggestions welcome :)

See the list of issues and pick one! Or report your own.

If you are having doubts on the why or how something works, don't hesitate to ask a question on discourse or via github. This probably means that the documentation, scaladocs or code is unclear and be improved for the benefit of all. In order to develop the documentation, you can use the doc/watch.sh script, which runs Sphinx using Python. Use doc/requirements.txt to set up your Python environment with pip. If you're using Nix, you can just run nix develop in the doc directory to set up a working shell with all the dependencies.

The core module needs to remain binary-compatible with earlier versions. To check if your changes meet this requirement, you can run core/mimaReportBinaryIssues from the sbt console. However, be aware that tags from the repository aren’t automatically fetched during forking; hence, the command will not operate without first fetching the tags.

After forking and cloning the repository, add the original repository as a remote:

git remote add upstream [email protected]:softwaremill/tapir.git

Fetch the tags from the upstream:

git fetch --tags upstream

Scoping which projects are included by sbt

  • when STTP_NATIVE is set, Scala native projects are included in the build (when running sbt)
  • when ALSO_LOOM is set, projects using virtual threads and requiring Java 21 are included in the build
  • when ONLY_LOOM is set, only projects using virtual threads are included in the build

Testing locally

The JS tests use Gecko instead of Chrome, although this causes another problem: out of memory when running JS tests for multiple modules. Work-arounds:

  • run only tests for a specific Scala version and platform using testScoped 2.13 JS (supported versions: 2.12, 2.13, 3; supported platforms: JVM, JS, Native)
  • test single JS projects
  • use CI (GitHub Actions) to test all projects - the .github/workflows/ci.yml enumerates them one by one

You can test only server/client/doc/other projects using testServers, testClients, testDocs and testOther.

To verify that the code snippet in docs compile, run compileDocumentation. A full mdoc run is done during a release (when the documentation is generated).

Importing into IntelliJ

By default, when importing to IntelliJ, only the Scala 3/JVM subprojects will be imported. This is controlled by the ideSkipProject setting in build.sbt (inside commonSettings).

If you'd like to work on a different platform or Scala version, simply change this setting temporarily so that the correct subprojects are imported. For example:

// import only Scala 2.13, JS projects
ideSkipProject := (scalaVersion.value != scala2_13) || !thisProjectRef.value.project.contains("JS")

// import only Scala 3, JVM projects
ideSkipProject := (scalaVersion.value != scala3) || thisProjectRef.value.project.contains("JS") || thisProjectRef.value.project.contains("Native"),

// import only Scala 2.13, Native projects
ideSkipProject := (scalaVersion.value != scala2_13) || !thisProjectRef.value.project.contains("Native")

Commercial Support

We offer commercial support for tapir and related technologies, as well as development services. Contact us to learn more about our offer!

Copyright

Copyright (C) 2018-2024 SoftwareMill https://softwaremill.com.

More Repositories

1

elasticmq

In-memory message queue with an Amazon SQS-compatible interface. Runs stand-alone or embedded.
Scala
2,379
star
2

sttp

The Scala HTTP client you always wanted!
Scala
1,401
star
3

macwire

Lightweight and Nonintrusive Scala Dependency Injection Library
Scala
1,252
star
4

quicklens

Modify deeply nested case class fields
Scala
810
star
5

magnolia

Easy, fast, transparent generic derivation of typeclass instances
Scala
738
star
6

bootzooka

Simple project to quickly start developing a Scala-based microservice or web application, without the need to write login, user registration etc.
Scala
695
star
7

codebrag

Your daily code review tool
Scala
651
star
8

akka-http-session

Web & mobile client-side akka-http sessions, with optional JWT support
Scala
440
star
9

it-cfp-list

List of Call For Papers for IT conferences
374
star
10

retry

because you should never give up, at least not on the first try
Scala
347
star
11

diffx

Pretty diffs for scala case classes
Scala
341
star
12

kmq

Kafka-based message queue
Scala
317
star
13

scala-clippy

Good advice for Scala compiler errors
Scala
315
star
14

supler

Rapid Form Development library. Use your favourite JS frontend & Scala backend frameworks.
Scala
286
star
15

ox

Safe direct-style concurrency and resiliency for Scala on the JVM
Scala
266
star
16

mqperf

Scala
143
star
17

scala-common

Tiny independent libraries with a single purpose, often a single class
Scala
120
star
18

slick-eventsourcing

Example for "Entry level event-sourcing" blog
Scala
118
star
19

lemon-dataset

Lemons quality control dataset
97
star
20

jox

Fast and Scalable Channels in Java
Java
87
star
21

maven-badges

A node.js implementation of https://github.com/jirutka/maven-badges, originally created in ruby.
TypeScript
84
star
22

sbt-softwaremill

A sane set of default build settings
Scala
72
star
23

akka-vs-scalaz

Scala
63
star
24

recursion-training

Recursion schemes training examples and exercises
HTML
59
star
25

scala-sql-compare

Scala
51
star
26

livestub

The HTTP server stub you always wanted!
Scala
50
star
27

stringmask

A micro-library for macro-based case class field masking in .toString
Scala
48
star
28

scala-id-generator

Scala
48
star
29

confluent-playground

Java
44
star
30

odelay

delayed reactions
Scala
42
star
31

sttp-model

Simple Scala HTTP model
Scala
42
star
32

saft

Scala
41
star
33

akka-simple-cluster-k8s

Scala
39
star
34

softwaremill-common

SoftwareMill Common library
Java
37
star
35

walk-that-type

A tool for evaluating TypeScript types step by step.
TypeScript
31
star
36

sttp-openai

Scala
30
star
37

neme-plugin

Scala compiler plugin for turning non exhaustive match warnings into errors
Scala
29
star
38

FoXAI

The open-source library for explainable AI. Generic and easy to integrate with PyTorch.
Python
29
star
39

scala-pre-commit-hooks

Pre-commit/Pre-push hooks for Scala
Python
27
star
40

zio2-structure

Scala
26
star
41

helisa

Scala API for jenetics
Scala
26
star
42

streams-tests

Scala
25
star
43

tapir-loom

Scala
24
star
44

reactive-event-sourcing-java

Java
24
star
45

free-tagless-compare

Free monads compared to tagless final
Scala
22
star
46

node-typescript-starter

A basic boilerplate for node + TypeScript development with debugger source maps support.
TypeScript
22
star
47

akka-http-session-faq

Java
21
star
48

activator-reactive-kafka-scala

Activator template for Reactive Kafka
Scala
20
star
49

sttp-apispec

OpenAPI, AsyncAPI and JSON Schema Scala models.
Scala
20
star
50

scala3-macro-debug

Scala
17
star
51

reactive-streams-for-java-developers

Java
17
star
52

resilience4s

Scala
16
star
53

react-use-promise-matcher

React hooks allowing you to handle promises in a stateful way
TypeScript
16
star
54

simple-http-server

Simple JVM based HTTP server with no dependencies
Scala
15
star
55

correlator

Scala
15
star
56

adopt-tapir

A quickstart generator for Tapir projects
Scala
14
star
57

detectnet-tests

Python scripts and other resources for tesing DetectNet on Nvidia DIGITS
Python
14
star
58

blockchain-schedule

An experimental collaborative planning app based on Ethereum ("Decentralized Doodle")
TypeScript
14
star
59

blog-scala-structure-lifecycle

Scala
12
star
60

akka-sandbox

Training ground for experiments with Akka framework.
Scala
12
star
61

undelay

Satisfy Scala Futures quickly
Scala
11
star
62

broadway-pipelines-blog

Constructing effective data processing workflows using Elixir and Broadway
Elixir
11
star
63

monix-correlation-id

Scala
10
star
64

cassandra-monitoring

Scripts for the Cassandra Monitoring blog miniseries
10
star
65

reason-companies-example

Reason example application
OCaml
10
star
66

jvmbot

Scala
9
star
67

asamal

POC for a CDI-based web lightweight framework
Java
8
star
68

botarium

A simple starter kit for building bots using Node + TypeScript + BotKit.
TypeScript
8
star
69

sbt-template

Scala
8
star
70

boot-scala-microservice

Bootstrap microservice template that uses micro-deps library https://github.com/4finance/micro-deps
Scala
8
star
71

sttp-shared

Scala
7
star
72

modem-connector

Modulator and Demodulator for HAM Radio AX.25 audio signals
Scala
7
star
73

gatling-zeromq

A Gatling stress test plugin for ZeroMQ protocol
Scala
5
star
74

trqbox-demo

Ruby
5
star
75

idea-pastie-plugin

Plugin to post pastie.org pasties from IntelliJ Idea
Java
5
star
76

sentinel-cgan

Sentinel generative conditional adversarial network implementation
Python
5
star
77

scala-compiler-plugin-template

Scala
5
star
78

tapir-serverless

Scala
5
star
79

scalar-conf-website

Scalar - Scala Conference in Central Europe
Python
4
star
80

try-them-off

Showcase service presenting possible usage of the Try monad from Vavr.
Java
4
star
81

slack-alphabet

Scala
4
star
82

sttp-openapi-example

Scala
4
star
83

cache-get-or-create

Java
4
star
84

bootzooka-react

Simple project to quickly start developing a web application using React and Akka HTTP, without the need to write login, user registration etc. https://softwaremill.com/open-source/
Scala
4
star
85

fabrica

Shell
3
star
86

akka-typed-workshop

Scala
3
star
87

scalatimes

Pug
3
star
88

kuberenetes-fundamentals

Training projects to explore k8s features
Scala
3
star
89

play-scala-slick-example-part2

Scala
3
star
90

ansible-bigbluebutton

Shell
3
star
91

kleisli-example

Scala
3
star
92

loom-protect

Java
3
star
93

vehicle-routing-problem-java

Java
3
star
94

supler-example

Example project for Supler http://supler.io
JavaScript
2
star
95

sttp-native-cli

Scala Native with scala-cli and sttp example
Scala
2
star
96

jekyll-softwaremill

SoftwareMill.com website written in Jekyll
PHP
2
star
97

terraform-gke-bootstrap

HCL
2
star
98

functional-pancakes

Scala
2
star
99

aws-demo

Java
2
star
100

gcp-goodies

Source code and other materials for the blog post series - GCP Goodies
Scala
2
star